VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/html/tech_preview/hr/absol/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/tech_preview/hr/absol/absol-full.js
!(function(global) {
const moduleFactories = {};
const modules = {};
const moduleLinks = {};
moduleLinks["node_modules/atob"] = "node_modules/atob/node-atob.js";
moduleLinks["node_modules/btoa"] = "node_modules/btoa/index.js";
moduleLinks["node_modules/intl"] = "node_modules/intl/index.js";
moduleLinks["node_modules/absol/src"] = "node_modules/absol/src/index.js";
moduleLinks["node_modules/absol"] = "node_modules/absol/src/index.js";
moduleLinks["node_modules/absol-acomp"] = "node_modules/absol-acomp/AComp.js";
moduleLinks["node_modules/absol-vchart/src"] = "node_modules/absol-vchart/src/index.js";
moduleLinks["node_modules/absol-colorpicker/style"] = "node_modules/absol-colorpicker/style/index.js";
moduleLinks["node_modules/absol-colorpicker"] = "node_modules/absol-colorpicker/index.js";
moduleLinks["node_modules/absol-svg"] = "node_modules/absol-svg/index.js";
moduleLinks["node_modules/showdown"] = "node_modules/showdown/dist/showdown.js";
moduleLinks["node_modules/absol-brace"] = "node_modules/absol-brace/index.js";
moduleLinks["node_modules/absol-form"] = "node_modules/absol-form/index.js";
moduleLinks["node_modules/absol-tutor"] = "node_modules/absol-tutor/js/index.js";
moduleLinks["node_modules/absol-sheet"] = "node_modules/absol-sheet/index.js";
moduleLinks["node_modules/absol-photoswipeviewer"] = "node_modules/absol-photoswipeviewer/PhotoSwipeViewer.js";
moduleLinks["node_modules/punycode"] = "node_modules/punycode/punycode.js";
moduleLinks["node_modules/querystring"] = "node_modules/querystring/index.js";
moduleLinks["node_modules/url"] = "node_modules/url/url.js";
moduleLinks["."] = "index.js";
moduleFactories["style/old.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["style/common.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["style/bootstrap.revert.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["style/bsc.white.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/default.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/debugtask.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/common.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/autocompleteinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/boardtable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/messagedialog.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/flexiconbutton.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/modal.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/hanger.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/bscroller.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/buttonarray.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/calendarinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/chromecalendar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/scroller.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/checkboxinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/checkbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/circlesectionlabel.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/contextmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/menu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/dateinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/datetimeinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/chrometimepicker.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/follower.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/draggablestack.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/droppanel.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/exptree.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/editabletext.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/emojipicker.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/flexiconinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/frame.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/frameview.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/tabview.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/singlepage.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/hexasectionlabel.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/vruler.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/hruler.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/linearcolorbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/mediainput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/messageinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/numberinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/onscreenwindow.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/pageselector.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/preinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/progressbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/quicklistbutton.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/selectlist.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/checkboxbutton.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/quickpath.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/radiobutton.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/radio.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/resizebox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/searcher.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/icons.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/selectbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/selectmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/selectlistbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/selecttable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/spaninput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/statictabbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/switch.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/tablescroller.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/tablevscroller.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/textarea2.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/textclipboard.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/timeinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/timepicker.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/tooltip.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/treelist.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/selecttreemenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/widthheightresizer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/trackbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/trackbarinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/buttonrange.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/dropzone.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/radioinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/onscreenwidget.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/ribbonsplitbutton.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/ribbonbutton.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/timeselectinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/snackbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/multiselectmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/countdownclock.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/toast.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/variantcolors.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/emojipickertooltip.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/pageindicator.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/emojicounter.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/emojiuserlisttooltip.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/rotatedtext.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/verticaltreediagram.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/tokenfield.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/dvexptree.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/checklistitem.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/checklistbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/chrometime24picker.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/timerange24input.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/checktreeitem.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/checktreebox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/cpuviewer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/fileinputbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/countdowntext.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/selecttreeleafmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/filelistinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/dateinyearinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/dualselectmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/toclist.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/ckplaceholder.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/videourldialog.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/verticaltimeline.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/placesearchautocomplete.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/locationinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/mknavigator.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/processlbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/kvcommentitem.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/dynamictable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/objectmergetool.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/tokenizeinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/dropdownbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/pathmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/selecttreeeleafbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/dualselectbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/treetable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/finder.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/mobileapp.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/treechart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/keeview.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/keeview/overviewwidget.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-acomp/css/keeview/owmodal.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mobileapp.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mleftnavigator.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mnavigatormenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mbottomtabbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mtinyprofileblock.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mmatmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mmdirect.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mheaderbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mconversation.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mmessageinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mmessagetool.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mselectlistitem.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mselectlist.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mselectmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mlistmodal.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mselecttreemenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mselectbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mblinkmodal.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mhsnapscroller.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mchecklist.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mmulticheckmenu.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mcabinetlist.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-mobile/css/mcabinettreelist.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-svg/css/svg.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/minicomp.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/basechart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/linechart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/tooltip.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/rangechart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/assessmentchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/columnchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/rangegroupchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/rankchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/sunburstchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/squarechart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/grouprankchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/mappingchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/imagechart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/horizontalbarchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/resizeablediv.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/scrollarrow.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/base.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/note.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/chartresizebox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/spiderchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/funnelchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/barstackchart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/piechart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-vchart/src/style/tinycirclechart.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-colorpicker/style/colorpicker.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-colorpicker/style/colorpickerbutton.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-colorpicker/style/swatchestable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-colorpicker/style/spectrumcolor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-colorpicker/style/solidcolorpicker.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/base.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/layouteditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/relativeanchor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/alignbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/component.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/anchoreditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/hline.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/vline.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/undohistory.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/componentpropertieseditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/selectlisteditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-sheet/css/tableeditable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-sheet/css/tabledata.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-sheet/css/dialogs.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/fonticonpicker.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/formpreview.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/cmdtool.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/blockeditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/circuitdiagram.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/includedblockmanager.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/selectcomponenttypedialog.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/formeditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/projectexplorer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-brace/BraceExternal/ace.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-brace/BraceDiff/diff.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/codeeditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-photoswipeviewer/photoswipefrag.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/statusbar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/flexformeditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/componentoutline.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/flexformoutline.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/componentpicker.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/linearanchor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/chainanchor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/imagefileinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/arrayoffragment.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/editablearrayoffragment.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/listeditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/propertyeditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/layoutsizeeditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/launcher.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/explorer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/clangblockly.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/remoteformpreview.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/tokenizeinput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-form/css/scexpressioninput.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/boardcard.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/boardmanager.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/boardgroup.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/tlcard.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/tl.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/tllist.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/tlboardtable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/listboard.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/monthtable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/htimetableitem.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/vtimetableitem.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/cactivitytooltip.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/cweekrow.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/cdaycell.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/cdayofweekrow.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/weektable.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/nowline.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/dbwidget.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/dbgridster.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-card/css/workcalendar.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/puncturedmodal.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/clickico.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/scrollbarico.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/blinkmask.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/explain.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/basecommand.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/spliteditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/ace.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/tutormaster.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/fragmanager.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-tutor/css/inspector.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-debug/css/dconsole.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-debug/css/dstring.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/config_format.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/common.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/question.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/textanswer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/linearscale.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/editableanswerctn.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/radioanswer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/section.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/posereditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/questiontreeeditor.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/print.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/poserviewer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-poser/css/poserevaluation.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/ModuleView.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/tablesort.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/FormatFunction.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/EditHelpContainer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/NewCategory.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/HelpContainer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/CardDone.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/form_create_edit.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/test_question.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/test.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/pizo/css/ModuleImage.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["node_modules/absol-photoswipeviewer/photoswipeviewer.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

moduleFactories["adapt/windowbox.css"] = function(module, exports, require, __dirname, __filename){
module.exports = {};
};

function _interopRequireDefault(obj) {
    return obj && obj.__esModule ? obj : { default: obj };
}

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }

function module_require(cr, rq) {
    var id;
    if (cr){
        if (rq.startsWith(".")) {
                id = path.join(cr, "..", rq) || ".";
            }
            else {
                id = "node_modules/" + rq;
            }
    }
    else {
        id = rq;
    }


    var dir = path.join(id, '..');
    id = moduleLinks[id] || id;
    var factory;
    if (moduleFactories[id]) {
        factory = moduleFactories[id];
    }
    else if (moduleFactories[id + '.js']) {
        factory = moduleFactories[id + '.js'];
        id += '.js';
    }
    var module = modules[id];
    if (module) {
        return module && module.exports;
    }
    else {
        module = { exports: {} };
        modules[id] = module;
        if (factory){
            /*module.exports = */factory(module, module.exports, module_require.bind(null, id), dir, id);
        }
        else {
            console.error("Could not file module "+ id + '. ', "Please update indexed module!" );
        }
        
        return  module.exports;
    }
}

const process = {};
process.cwd = function () {
    return "JSPureWriter";
}
process.env = {};
process.browser = true;


const path = (function () {
    'use strict';

    function assertPath(path) {
        if (typeof path !== 'string') {
            throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));
        }
    }

    // Resolves . and .. elements in a path with directory names
    function normalizeStringPosix(path, allowAboveRoot) {
        var res = '';
        var lastSegmentLength = 0;
        var lastSlash = -1;
        var dots = 0;
        var code;
        for (var i = 0; i <= path.length; ++i) {
            if (i < path.length)
                code = path.charCodeAt(i);
            else if (code === 47 /*/*/)
                break;
            else
                code = 47 /*/*/;
            if (code === 47 /*/*/) {
                if (lastSlash === i - 1 || dots === 1) {
                    // NOOP
                }
                else if (lastSlash !== i - 1 && dots === 2) {
                    if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {
                        if (res.length > 2) {
                            var lastSlashIndex = res.lastIndexOf('/');
                            if (lastSlashIndex !== res.length - 1) {
                                if (lastSlashIndex === -1) {
                                    res = '';
                                    lastSegmentLength = 0;
                                }
                                else {
                                    res = res.slice(0, lastSlashIndex);
                                    lastSegmentLength = res.length - 1 - res.lastIndexOf('/');
                                }
                                lastSlash = i;
                                dots = 0;
                                continue;
                            }
                        }
                        else if (res.length === 2 || res.length === 1) {
                            res = '';
                            lastSegmentLength = 0;
                            lastSlash = i;
                            dots = 0;
                            continue;
                        }
                    }
                    if (allowAboveRoot) {
                        if (res.length > 0)
                            res += '/..';
                        else
                            res = '..';
                        lastSegmentLength = 2;
                    }
                }
                else {
                    if (res.length > 0)
                        res += '/' + path.slice(lastSlash + 1, i);
                    else
                        res = path.slice(lastSlash + 1, i);
                    lastSegmentLength = i - lastSlash - 1;
                }
                lastSlash = i;
                dots = 0;
            }
            else if (code === 46 /*.*/ && dots !== -1) {
                ++dots;
            }
            else {
                dots = -1;
            }
        }
        return res;
    }

    function _format(sep, pathObject) {
        var dir = pathObject.dir || pathObject.root;
        var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');
        if (!dir) {
            return base;
        }
        if (dir === pathObject.root) {
            return dir + base;
        }
        return dir + sep + base;
    }

    var posix = {
        // path.resolve([from ...], to)
        resolve: function resolve() {
            var resolvedPath = '';
            var resolvedAbsolute = false;
            var cwd;

            for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
                var path;
                if (i >= 0)
                    path = arguments[i];
                else {
                    if (cwd === undefined)
                        cwd = process.cwd();
                    path = cwd;
                }

                assertPath(path);

                // Skip empty entries
                if (path.length === 0) {
                    continue;
                }

                resolvedPath = path + '/' + resolvedPath;
                resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;
            }

            // At this point the path should be resolved to a full absolute path, but
            // handle relative paths to be safe (might happen when process.cwd() fails)

            // Normalize the path
            resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);

            if (resolvedAbsolute) {
                if (resolvedPath.length > 0)
                    return '/' + resolvedPath;
                else
                    return '/';
            }
            else if (resolvedPath.length > 0) {
                return resolvedPath;
            }
            else {
                return '.';
            }
        },

        normalize: function normalize(path) {
            assertPath(path);

            if (path.length === 0) return '.';

            var isAbsolute = path.charCodeAt(0) === 47 /*/*/;
            var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;

            // Normalize the path
            path = normalizeStringPosix(path, !isAbsolute);

            if (path.length === 0 && !isAbsolute) path = '.';
            if (path.length > 0 && trailingSeparator) path += '/';

            if (isAbsolute) return '/' + path;
            return path;
        },

        isAbsolute: function isAbsolute(path) {
            assertPath(path);
            return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;
        },

        join: function join() {
            if (arguments.length === 0)
                return '.';
            var joined;
            for (var i = 0; i < arguments.length; ++i) {
                var arg = arguments[i];
                assertPath(arg);
                if (arg.length > 0) {
                    if (joined === undefined)
                        joined = arg;
                    else
                        joined += '/' + arg;
                }
            }
            if (joined === undefined)
                return '.';
            return posix.normalize(joined);
        },

        relative: function relative(from, to) {
            assertPath(from);
            assertPath(to);

            if (from === to) return '';

            from = posix.resolve(from);
            to = posix.resolve(to);

            if (from === to) return '';

            // Trim any leading backslashes
            var fromStart = 1;
            for (; fromStart < from.length; ++fromStart) {
                if (from.charCodeAt(fromStart) !== 47 /*/*/)
                    break;
            }
            var fromEnd = from.length;
            var fromLen = fromEnd - fromStart;

            // Trim any leading backslashes
            var toStart = 1;
            for (; toStart < to.length; ++toStart) {
                if (to.charCodeAt(toStart) !== 47 /*/*/)
                    break;
            }
            var toEnd = to.length;
            var toLen = toEnd - toStart;

            // Compare paths to find the longest common path from root
            var length = fromLen < toLen ? fromLen : toLen;
            var lastCommonSep = -1;
            var i = 0;
            for (; i <= length; ++i) {
                if (i === length) {
                    if (toLen > length) {
                        if (to.charCodeAt(toStart + i) === 47 /*/*/) {
                            // We get here if `from` is the exact base path for `to`.
                            // For example: from='/foo/bar'; to='/foo/bar/baz'
                            return to.slice(toStart + i + 1);
                        }
                        else if (i === 0) {
                            // We get here if `from` is the root
                            // For example: from='/'; to='/foo'
                            return to.slice(toStart + i);
                        }
                    }
                    else if (fromLen > length) {
                        if (from.charCodeAt(fromStart + i) === 47 /*/*/) {
                            // We get here if `to` is the exact base path for `from`.
                            // For example: from='/foo/bar/baz'; to='/foo/bar'
                            lastCommonSep = i;
                        }
                        else if (i === 0) {
                            // We get here if `to` is the root.
                            // For example: from='/foo'; to='/'
                            lastCommonSep = 0;
                        }
                    }
                    break;
                }
                var fromCode = from.charCodeAt(fromStart + i);
                var toCode = to.charCodeAt(toStart + i);
                if (fromCode !== toCode)
                    break;
                else if (fromCode === 47 /*/*/)
                    lastCommonSep = i;
            }

            var out = '';
            // Generate the relative path based on the path difference between `to`
            // and `from`
            for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
                if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {
                    if (out.length === 0)
                        out += '..';
                    else
                        out += '/..';
                }
            }

            // Lastly, append the rest of the destination (`to`) path that comes after
            // the common path parts
            if (out.length > 0)
                return out + to.slice(toStart + lastCommonSep);
            else {
                toStart += lastCommonSep;
                if (to.charCodeAt(toStart) === 47 /*/*/)
                    ++toStart;
                return to.slice(toStart);
            }
        },

        _makeLong: function _makeLong(path) {
            return path;
        },

        dirname: function dirname(path) {
            assertPath(path);
            if (path.length === 0) return '.';
            var code = path.charCodeAt(0);
            var hasRoot = code === 47 /*/*/;
            var end = -1;
            var matchedSlash = true;
            for (var i = path.length - 1; i >= 1; --i) {
                code = path.charCodeAt(i);
                if (code === 47 /*/*/) {
                    if (!matchedSlash) {
                        end = i;
                        break;
                    }
                }
                else {
                    // We saw the first non-path separator
                    matchedSlash = false;
                }
            }

            if (end === -1) return hasRoot ? '/' : '.';
            if (hasRoot && end === 1) return '//';
            return path.slice(0, end);
        },

        basename: function basename(path, ext) {
            if (ext !== undefined && typeof ext !== 'string') throw new TypeError('"ext" argument must be a string');
            assertPath(path);

            var start = 0;
            var end = -1;
            var matchedSlash = true;
            var i;

            if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {
                if (ext.length === path.length && ext === path) return '';
                var extIdx = ext.length - 1;
                var firstNonSlashEnd = -1;
                for (i = path.length - 1; i >= 0; --i) {
                    var code = path.charCodeAt(i);
                    if (code === 47 /*/*/) {
                        // If we reached a path separator that was not part of a set of path
                        // separators at the end of the string, stop now
                        if (!matchedSlash) {
                            start = i + 1;
                            break;
                        }
                    }
                    else {
                        if (firstNonSlashEnd === -1) {
                            // We saw the first non-path separator, remember this index in case
                            // we need it if the extension ends up not matching
                            matchedSlash = false;
                            firstNonSlashEnd = i + 1;
                        }
                        if (extIdx >= 0) {
                            // Try to match the explicit extension
                            if (code === ext.charCodeAt(extIdx)) {
                                if (--extIdx === -1) {
                                    // We matched the extension, so mark this as the end of our path
                                    // component
                                    end = i;
                                }
                            }
                            else {
                                // Extension does not match, so our result is the entire path
                                // component
                                extIdx = -1;
                                end = firstNonSlashEnd;
                            }
                        }
                    }
                }

                if (start === end) end = firstNonSlashEnd; else if (end === -1) end = path.length;
                return path.slice(start, end);
            }
            else {
                for (i = path.length - 1; i >= 0; --i) {
                    if (path.charCodeAt(i) === 47 /*/*/) {
                        // If we reached a path separator that was not part of a set of path
                        // separators at the end of the string, stop now
                        if (!matchedSlash) {
                            start = i + 1;
                            break;
                        }
                    }
                    else if (end === -1) {
                        // We saw the first non-path separator, mark this as the end of our
                        // path component
                        matchedSlash = false;
                        end = i + 1;
                    }
                }

                if (end === -1) return '';
                return path.slice(start, end);
            }
        },

        extname: function extname(path) {
            assertPath(path);
            var startDot = -1;
            var startPart = 0;
            var end = -1;
            var matchedSlash = true;
            // Track the state of characters (if any) we see before our first dot and
            // after any path separator we find
            var preDotState = 0;
            for (var i = path.length - 1; i >= 0; --i) {
                var code = path.charCodeAt(i);
                if (code === 47 /*/*/) {
                    // If we reached a path separator that was not part of a set of path
                    // separators at the end of the string, stop now
                    if (!matchedSlash) {
                        startPart = i + 1;
                        break;
                    }
                    continue;
                }
                if (end === -1) {
                    // We saw the first non-path separator, mark this as the end of our
                    // extension
                    matchedSlash = false;
                    end = i + 1;
                }
                if (code === 46 /*.*/) {
                    // If this is our first dot, mark it as the start of our extension
                    if (startDot === -1)
                        startDot = i;
                    else if (preDotState !== 1)
                        preDotState = 1;
                }
                else if (startDot !== -1) {
                    // We saw a non-dot and non-path separator before our dot, so we should
                    // have a good chance at having a non-empty extension
                    preDotState = -1;
                }
            }

            if (startDot === -1 || end === -1 ||
                // We saw a non-dot character immediately before the dot
                preDotState === 0 ||
                // The (right-most) trimmed path component is exactly '..'
                preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
                return '';
            }
            return path.slice(startDot, end);
        },

        format: function format(pathObject) {
            if (pathObject === null || typeof pathObject !== 'object') {
                throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
            }
            return _format('/', pathObject);
        },

        parse: function parse(path) {
            assertPath(path);

            var ret = { root: '', dir: '', base: '', ext: '', name: '' };
            if (path.length === 0) return ret;
            var code = path.charCodeAt(0);
            var isAbsolute = code === 47 /*/*/;
            var start;
            if (isAbsolute) {
                ret.root = '/';
                start = 1;
            }
            else {
                start = 0;
            }
            var startDot = -1;
            var startPart = 0;
            var end = -1;
            var matchedSlash = true;
            var i = path.length - 1;

            // Track the state of characters (if any) we see before our first dot and
            // after any path separator we find
            var preDotState = 0;

            // Get non-dir info
            for (; i >= start; --i) {
                code = path.charCodeAt(i);
                if (code === 47 /*/*/) {
                    // If we reached a path separator that was not part of a set of path
                    // separators at the end of the string, stop now
                    if (!matchedSlash) {
                        startPart = i + 1;
                        break;
                    }
                    continue;
                }
                if (end === -1) {
                    // We saw the first non-path separator, mark this as the end of our
                    // extension
                    matchedSlash = false;
                    end = i + 1;
                }
                if (code === 46 /*.*/) {
                    // If this is our first dot, mark it as the start of our extension
                    if (startDot === -1) startDot = i; else if (preDotState !== 1) preDotState = 1;
                }
                else if (startDot !== -1) {
                    // We saw a non-dot and non-path separator before our dot, so we should
                    // have a good chance at having a non-empty extension
                    preDotState = -1;
                }
            }

            if (startDot === -1 || end === -1 ||
                // We saw a non-dot character immediately before the dot
                preDotState === 0 ||
                // The (right-most) trimmed path component is exactly '..'
                preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
                if (end !== -1) {
                    if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end); else ret.base = ret.name = path.slice(startPart, end);
                }
            }
            else {
                if (startPart === 0 && isAbsolute) {
                    ret.name = path.slice(1, startDot);
                    ret.base = path.slice(1, end);
                }
                else {
                    ret.name = path.slice(startPart, startDot);
                    ret.base = path.slice(startPart, end);
                }
                ret.ext = path.slice(startDot, end);
            }

            if (startPart > 0) ret.dir = path.slice(0, startPart - 1); else if (isAbsolute) ret.dir = '/';

            return ret;
        },

        sep: '/',
        delimiter: ':',
        win32: null,
        posix: null
    };
    return posix;
})();
        moduleFactories["adapt/String.js"] = function(module, exports, require, __dirname, __filename){
/*** module: adapt/String.js ***/
"use strict";

String.nonAccentVietnamese = function (s) {
  return s.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a").replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, "A").replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, "e").replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, "E").replace(/ì|í|ị|ỉ|ĩ/g, "i").replace(/Ì|Í|Ị|Ỉ|Ĩ/g, "I").replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, "o").replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, "O").replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, "u").replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, "U").replace(/ỳ|ý|ỵ|ỷ|ỹ/g, "y").replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, "Y").replace(/đ/g, "d").replace(/Đ/g, "D").replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, "").replace(/\u02C6|\u0306|\u031B/g, "");
};
};

moduleFactories["adapt/Date.js"] = function(module, exports, require, __dirname, __filename){
/*** module: adapt/Date.js ***/
"use strict";

Date.MILLIS_PER_DAY = 24 * 3600000;
Date.MILLIS_PER_HOUR = 3600000;
Date.MILLIS_PER_MINUTE = 60000;

Date.prototype.ddmmyyyy = function () {
  var mm = this.getMonth() + 1; // getMonth() is zero-based

  var dd = this.getDate();
  return [(dd > 9 ? '' : '0') + dd, (mm > 9 ? '' : '0') + mm, this.getFullYear()].join('/');
};

Date.prototype.yyymmdd = function () {
  var mm = this.getMonth() + 1; // getMonth() is zero-based

  var dd = this.getDate();
  return [this.getFullYear(), (mm > 9 ? '' : '0') + mm, (dd > 9 ? '' : '0') + dd].join('/');
};

Date.prototype.ddmm = function () {
  var mm = this.getMonth() + 1; // getMonth() is zero-based

  var dd = this.getDate();
  return [(dd > 9 ? '' : '0') + dd, (mm > 9 ? '' : '0') + mm].join('/');
};

Date.prototype.localDateTime = function () {
  return this.toLocaleString() + ' ' + this.toLocaleTimeString();
};

Date.dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
Date.shortDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
Date.monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
Date.shortMonthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; //more https://www.myonlinetraininghub.com/excel-date-and-time-formatting

Date.formatTokenRegex = /([a-zA-Z]|[^\s\-$-/:-?{-~!"^_`\[\]])+/g; //more

Date.prototype.toFormartString = function (format) {
  format = format || 'dd/mm/yyyy';
  var date = this.getDate();
  var day = this.getDay();
  var month = this.getMonth();
  var year = this.getFullYear();
  return format.replace(Date.formatTokenRegex, function (x) {
    switch (x) {
      case "dddd":
        return Date.dayNames[day];

      case "ddd":
        return Date.shortDayNames[day];

      case "dd":
        return date < 10 ? '0' + date : '' + date;

      case "d":
        return '' + date;

      case "mmmm":
        return Date.monthNames[month];

      case "mmm":
        return Date.shortMonthNames[month];

      case "mm":
        return month + 1 < 10 ? '0' + (month + 1) : '' + (month + 1);

      case "m":
        return '' + (month + 1);

      case 'yy':
        return (year + '').match(/..$/)[0];

      case 'yyyy':
        return year + '';

      default:
        return x;
    }
  });
};
/**
 * @param {Date} date
 * @return {Date}  
 */


Date.prevDate = function (date) {
  return new Date(date.getTime() - 86400000);
};
/**
 * @param {Date} date
 * @return {Date}  
 */


Date.nextDate = function (date) {
  return new Date(date.getTime() + 86400000);
};
/**
 * @param {Date} date
 * @return {Date} date at 00:00 
 */


Date.beginOfHour = function (date) {
  var res = new Date(date.getTime());
  res.setMilliseconds(0);
  res.setSeconds(0);
  res.setMinutes(0);
  return res;
};
/**
 * @param {Date} date
 * @param {Boolean} gmt default:false
 * @return {Date} date at 00:00 
 */


Date.beginOfDay = function (date, gmt) {
  var res = new Date(date.getTime());
  res.setMilliseconds(0);
  res.setSeconds(0);
  res.setMinutes(0);
  if (gmt) res.setUTCHours(0);else res.setHours(0);
  return res;
};
/**
 * @param {Date} date
 * @param {Boolean} gmt default:false
 * @return {Date} date at 00:00 
 */


Date.beginOfWeek = function (date, gmt, begin) {
  begin = begin || 0;
  var res = Date.beginOfDay(date, gmt);

  while ((gmt ? res.getUTCDay() : res.getDay()) != begin) {
    res = Date.prevDate(res);
  }

  return res;
};
/**
 * @param {Date} date
 * @param {Boolean} gmt default:false
 * @return {Date} date at 00:00 AM 
 */


Date.beginOfMonth = function (date, gmt) {
  gmt = !!gmt;
  var d = gmt ? date.getUTCDate() : date.getDate();
  var m = gmt ? date.getUTCMonth() : date.getMonth();
  var y = gmt ? date.getUTCFullYear() : date.getFullYear();
  var res = new Date();
  if (gmt) res.setUTCFullYear(y, m, 1);else res.setFullYear(y, m, 1);
  return Date.beginOfDay(res, gmt);
};
/**
 * @param {Date} date
 * @param {Boolean} gmt default:false
 * @return {Date} date at 00:00 AM 
 */


Date.beginOfYear = function (date, gmt) {
  gmt = !!gmt;
  var d = gmt ? date.getUTCDate() : date.getDate();
  var m = gmt ? date.getUTCMonth() : date.getMonth();
  var y = gmt ? date.getUTCFullYear() : date.getFullYear();
  var res = new Date();
  if (gmt) res.setUTCFullYear(y, 0, 1);else res.setFullYear(y, 0, 1);
  return Date.beginOfDay(res, gmt);
};
/**
 * @param {Date} date0
 * @param {Date} date1
 * @param {Boolean} gmt default:false
 * @return {number} 
 */


Date.compareDate = function (date0, date1, gmt) {
  var date0 = Date.beginOfDay(date0, !!gmt);
  var date1 = Date.beginOfDay(date1, !!gmt);
  return (date0.getTime() - date1.getTime()) / 86400000;
};
/**
 * @param {Date} date0
 * @param {Date} date1
 * @param {Boolean} gmt default:false
 * @return {number} 
 */


Date.compareMonth = function (date0, date1, gmt) {
  gmt = !!gmt;
  var m0 = gmt ? date0.getUTCMonth() : date0.getMonth();
  var y0 = gmt ? date0.getUTCFullYear() : date0.getFullYear();
  var m1 = gmt ? date1.getUTCMonth() : date1.getMonth();
  var y1 = gmt ? date1.getUTCFullYear() : date1.getFullYear();
  return (y0 - y1) * 12 + (m0 - m1);
};

Date.compareYear = function (date0, date1, gmt) {
  gmt = !!gmt;
  var y0 = gmt ? date0.getUTCFullYear() : date0.getFullYear();
  var y1 = gmt ? date1.getUTCFullYear() : date1.getFullYear();
  return y0 - y1;
};
};

moduleFactories["adapt/Promise.js"] = function(module, exports, require, __dirname, __filename){
/*** module: adapt/Promise.js ***/
"use strict";

Promise.delay = function (t, v) {
  return new Promise(function (resolve) {
    setTimeout(resolve.bind(null, v), t);
  });
};

Promise.requestFrame = function (v) {
  return new Promise(function (resolve) {
    requestAnimationFrame(resolve.bind(null, v));
  });
};
};

moduleFactories["adapt/Math.js"] = function(module, exports, require, __dirname, __filename){
/*** module: adapt/Math.js ***/
"use strict";

/**
 * 
 * @param {number} x 
 * @param {number} l
 * @param {number} h
 * @param {number} L
 * @param {number} H
 * @returns {number}
 */
Math.map = function (x, l, h, L, H) {
  return (x - l) / (h - l) * (H - L) + L;
};
/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */


Math.randomArbitrary = function (min, max) {
  return Math.random() * (max - min) + min;
};
/**
 * Returns a random integer between min (inclusive) and max (inclusive)
 * Using Math.round() will give you a non-uniform distribution!
 */


Math.randomInt = function (min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
};

Math.randomPick = function (arr) {
  var id = Math.randomInt(0, arr.length - 1);
  return arr[id];
};

Math.sumArr = function (arr) {
  var res = 0;

  for (var i = 0; i < arr.length; ++i) res += arr[i];

  return res;
};

Math.Vec2 = function (x, y) {
  this.x = x;
  this.y = y;
};

Math.Vec2.prototype.copy = function () {
  return new Math.Vec2(this.x, this.y);
};

Math.Vec2.prototype.toString = function () {
  return "(" + this.x + ", " + this.y + ")";
};

Math.Vec2.prototype.abs = function () {
  return Math.sqrt(this.x * this.x + this.y * this.y);
};

Math.Vec2.prototype.normalized = function () {
  var l = this.abs();
  if (l == 0) l = 1;
  return this.div(l);
};

Math.Vec2.prototype.mult = function (h) {
  return new Math.Vec2(this.x * h, this.y * h);
};

Math.Vec2.prototype.div = function (h) {
  return new Math.Vec2(this.x / h, this.y / h);
};

Math.Vec2.prototype.dist = function (v) {
  var dx = v.x - this.x;
  var dy = v.y - this.y;
  return Math.sqrt(dx * dx + dy * dy);
};

Math.Vec2.prototype.sub = function (v) {
  return new Math.Vec2(this.x - v.x, this.y - v.y);
};

Math.Vec2.prototype.add = function (v) {
  return new Math.Vec2(this.x + v.x, this.y + v.y);
};

Math.Vec2.prototype.inv = function () {
  return new Math.Vec2(-this.x, -this.y);
};

Math.Vec2.prototype.linear = function (v, h) {
  return new Math.Vec2(this.x * (1 - h) + v.x * h, this.y * (1 - h) + v.y * h);
};

Math.Vec2.prototype.dot = function (v1) {
  return this.x * v1.x + this.y * v1.y;
};

Math.Vec2.prototype.direction = function () {
  return Math.atan2(this.y, this.x);
};

Math.Vec2.fromDirection = function (angle) {
  return new Math.Vec2(Math.cos(angle), Math.sin(angle));
};

Math.radianInRange = function (x, start, end) {
  if (start > end) return Math.radianInRange(x, end, start);
  if (x < start) x += Math.PI * 2 * Math.ceil((start - x) / 2 / Math.PI);
  if (x > end) x -= Math.PI * 2 * Math.ceil((x - end) / 2 / Math.PI);
  return x >= start && x <= end;
};

Math.makeVec2 = function (x, y) {
  if (x instanceof Array) {
    return new Math.Vec2(x[0], x[1]);
  } else if (x instanceof Math.Vec2) {
    return x.copy();
  } else return new Math.Vec2(x, y);
};

Math.Rectangle = function (x, y, width, height) {
  this.width = width;
  this.height = height;
  this.x = x;
  this.y = y;

  this.A = function () {
    return new Math.Vec2(this.x, this.y);
  };

  this.B = function () {
    return new Math.Vec2(this.x + this.width, this.y);
  };

  this.C = function () {
    return new Math.Vec2(this.x + this.width, this.y + this.height);
  };

  this.D = function () {
    return new Math.Vec2(this.x, this.y + this.height);
  };

  this.square = function () {
    return this.width * this.height;
  };

  this.nearestPoint = function (arg0, arg1) {
    if (arg1) arg0 = Math.makeVec2(arg0, arg1);
    var res = this.A();
    var mind = res.dist(arg0);
    var d = this.B().dist(arg0);

    if (d < mind) {
      mind = d;
      res = this.B();
    }

    d = this.C().dist(arg0);

    if (d < mind) {
      mind = d;
      res = this.C();
    }

    d = this.D().dist(arg0);

    if (d < mind) {
      mind = d;
      res = this.D();
    }

    return res;
  };

  this.centerPoint = function () {
    return new Math.Vec2(this.x + this.width / 2, this.y + this.height / 2);
  };

  this.isCollapse = function (r, margin) {
    if (!margin) margin = 0;
    if (this.x > r.x + r.width + margin) return false;
    if (this.y > r.y + r.height + margin) return false;
    if (r.x > this.x + this.width + margin) return false;
    if (r.y > this.y + this.height + margin) return false;
    return true;
  };

  this.collapsedSquare = function (r) {
    var margin = 0;
    var maxX, minX, maxY, minY;
    if (this.x > r.x + r.width + margin) return 0;
    if (this.y > r.y + r.height + margin) return 0;
    if (r.x > this.x + this.width + margin) return 0;
    if (r.y > this.y + this.height + margin) return 0;
    minX = this.x > r.x ? this.x : r.x;
    minY = this.y > r.y ? this.y : r.y;
    maxX = this.x + this.width < r.x + r.width ? this.x + this.width : r.x + r.width;
    maxY = this.y + this.height < r.x + r.height;
    return (maxX - minX) * (maxY - minY);
  };
};

Math.makeRectangle = function (x, y, width, height) {
  return new Math.Rectangle(x, y, width, height);
};

Math.makeCenterRectangle = function (x, y, width, height) {
  return new Math.Rectangle(x - width / 2, y - height / 2, width, height);
};

Math.dist = function (x0, y0, x1, y1) {
  var dx = x0 - x1;
  var dy = y0 - y1;
  return Math.sqrt(dx * dx + dy * dy);
};

Math.Arc = function (x, y, r, start, end) {
  this.x = x;
  this.y = y;
  this.r = r;
  this.start = start;
  this.end = end;

  this.isPointInBound = function (p) {
    if (Math.dist(this.x, this.y, p.x, p.y) > r) return false;
    return Math.radianInRange(Math.atan2(p.y - this.y, p.x - this.x), start, end);
  };

  this.isRectInBound = function (rect) {
    return this.isPointInBound(rect.A()) && this.isPointInBound(rect.B()) && this.isPointInBound(rect.C()) && this.isPointInBound(rect.D());
  };

  this.isRectOutBound = function (rect) {
    return !this.isPointInBound(rect.A()) && !this.isPointInBound(rect.B()) && !this.isPointInBound(rect.C()) && !this.isPointInBound(rect.D());
  };

  this.isRectCollapse = function (rect) {
    return this.isPointInBound(rect.A()) || this.isPointInBound(rect.B()) || this.isPointInBound(rect.C()) || this.isPointInBound(rect.D());
  };

  this.centerPoint = function () {
    var mid = (this.start + this.end) / 2;
    var x = this.x + Math.cos(mid) * this.r * 2 / 3;
    var y = this.y + Math.sin(mid) * this.r * 2 / 3;
    return new Math.Vec2(x, y);
  };

  this.centerRoundPoint = function () {
    var mid = (this.start + this.end) / 2;
    var x = this.x + Math.cos(mid) * this.r;
    var y = this.y + Math.sin(mid) * this.r;
    return new Math.Vec2(x, y);
  };
};

Math.Circle = function (x, y, r) {
  this.x = x;
  this.y = y;
  this.r = r;

  this.isPointInBound = function (p) {
    return Math.dist(this.x, this.y, p.x, p.y) > r;
  };

  this.isRectInBound = function (rect) {
    return this.isPointInBound(rect.A()) && this.isPointInBound(rect.B()) && this.isPointInBound(rect.C()) && this.isPointInBound(rect.D());
  };
};

Math.makeCircle = function (x, y, r) {
  return new Math.Circle(x, y, r);
};

Math.makeArc = function (x, y, r, start, end) {
  return new Math.Arc(x, y, r, start, end);
};
};

moduleFactories["adapt/DomClass.js"] = function(module, exports, require, __dirname, __filename){
/*** module: adapt/DomClass.js ***/
"use strict";

setTimeout(function () {
  if ('DOMClass' in window) {
    //fix some function if bug
    DOMClass.containClass = function (element, className) {
      //DOMClass.containClass failed some test-case, so fix it
      return element && element.classList && element.classList.contains(className);
    };
  }
}, 1);
};

moduleFactories["node_modules/atob/node-atob.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/atob/node-atob.js ***/
"use strict";

function atob(str) {
  return Buffer.from(str, 'base64').toString('binary');
}

module.exports = atob.atob = atob;
};

moduleFactories["node_modules/btoa/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/btoa/index.js ***/
"use strict";

(function () {
  "use strict";

  function btoa(str) {
    var buffer;

    if (str instanceof Buffer) {
      buffer = str;
    } else {
      buffer = Buffer.from(str.toString(), 'binary');
    }

    return buffer.toString('base64');
  }

  module.exports = btoa;
})();
};

moduleFactories["node_modules/intl/lib/core.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/intl/lib/core.js ***/
'use strict';

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
  return typeof obj;
} : function (obj) {
  return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj;
};

var jsx = function () {
  var REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol.for && Symbol.for("react.element") || 0xeac7;
  return function createRawReactElement(type, props, key, children) {
    var defaultProps = type && type.defaultProps;
    var childrenLength = arguments.length - 3;

    if (!props && childrenLength !== 0) {
      props = {};
    }

    if (props && defaultProps) {
      for (var propName in defaultProps) {
        if (props[propName] === void 0) {
          props[propName] = defaultProps[propName];
        }
      }
    } else if (!props) {
      props = defaultProps || {};
    }

    if (childrenLength === 1) {
      props.children = children;
    } else if (childrenLength > 1) {
      var childArray = Array(childrenLength);

      for (var i = 0; i < childrenLength; i++) {
        childArray[i] = arguments[i + 3];
      }

      props.children = childArray;
    }

    return {
      $$typeof: REACT_ELEMENT_TYPE,
      type: type,
      key: key === undefined ? null : '' + key,
      ref: null,
      props: props,
      _owner: null
    };
  };
}();

var asyncToGenerator = function (fn) {
  return function () {
    var gen = fn.apply(this, arguments);
    return new Promise(function (resolve, reject) {
      function step(key, arg) {
        try {
          var info = gen[key](arg);
          var value = info.value;
        } catch (error) {
          reject(error);
          return;
        }

        if (info.done) {
          resolve(value);
        } else {
          return Promise.resolve(value).then(function (value) {
            return step("next", value);
          }, function (err) {
            return step("throw", err);
          });
        }
      }

      return step("next");
    });
  };
};

var classCallCheck = function (instance, Constructor) {
  if (!(instance instanceof Constructor)) {
    throw new TypeError("Cannot call a class as a function");
  }
};

var createClass = function () {
  function defineProperties(target, props) {
    for (var i = 0; i < props.length; i++) {
      var descriptor = props[i];
      descriptor.enumerable = descriptor.enumerable || false;
      descriptor.configurable = true;
      if ("value" in descriptor) descriptor.writable = true;
      Object.defineProperty(target, descriptor.key, descriptor);
    }
  }

  return function (Constructor, protoProps, staticProps) {
    if (protoProps) defineProperties(Constructor.prototype, protoProps);
    if (staticProps) defineProperties(Constructor, staticProps);
    return Constructor;
  };
}();

var defineEnumerableProperties = function (obj, descs) {
  for (var key in descs) {
    var desc = descs[key];
    desc.configurable = desc.enumerable = true;
    if ("value" in desc) desc.writable = true;
    Object.defineProperty(obj, key, desc);
  }

  return obj;
};

var defaults = function (obj, defaults) {
  var keys = Object.getOwnPropertyNames(defaults);

  for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    var value = Object.getOwnPropertyDescriptor(defaults, key);

    if (value && value.configurable && obj[key] === undefined) {
      Object.defineProperty(obj, key, value);
    }
  }

  return obj;
};

var defineProperty$1 = function (obj, key, value) {
  if (key in obj) {
    Object.defineProperty(obj, key, {
      value: value,
      enumerable: true,
      configurable: true,
      writable: true
    });
  } else {
    obj[key] = value;
  }

  return obj;
};

var _extends = Object.assign || function (target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];

    for (var key in source) {
      if (Object.prototype.hasOwnProperty.call(source, key)) {
        target[key] = source[key];
      }
    }
  }

  return target;
};

var get = function get(object, property, receiver) {
  if (object === null) object = Function.prototype;
  var desc = Object.getOwnPropertyDescriptor(object, property);

  if (desc === undefined) {
    var parent = Object.getPrototypeOf(object);

    if (parent === null) {
      return undefined;
    } else {
      return get(parent, property, receiver);
    }
  } else if ("value" in desc) {
    return desc.value;
  } else {
    var getter = desc.get;

    if (getter === undefined) {
      return undefined;
    }

    return getter.call(receiver);
  }
};

var inherits = function (subClass, superClass) {
  if (typeof superClass !== "function" && superClass !== null) {
    throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
  }

  subClass.prototype = Object.create(superClass && superClass.prototype, {
    constructor: {
      value: subClass,
      enumerable: false,
      writable: true,
      configurable: true
    }
  });
  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
};

var _instanceof = function (left, right) {
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
    return right[Symbol.hasInstance](left);
  } else {
    return left instanceof right;
  }
};

var interopRequireDefault = function (obj) {
  return obj && obj.__esModule ? obj : {
    default: obj
  };
};

var interopRequireWildcard = function (obj) {
  if (obj && obj.__esModule) {
    return obj;
  } else {
    var newObj = {};

    if (obj != null) {
      for (var key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
      }
    }

    newObj.default = obj;
    return newObj;
  }
};

var newArrowCheck = function (innerThis, boundThis) {
  if (innerThis !== boundThis) {
    throw new TypeError("Cannot instantiate an arrow function");
  }
};

var objectDestructuringEmpty = function (obj) {
  if (obj == null) throw new TypeError("Cannot destructure undefined");
};

var objectWithoutProperties = function (obj, keys) {
  var target = {};

  for (var i in obj) {
    if (keys.indexOf(i) >= 0) continue;
    if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
    target[i] = obj[i];
  }

  return target;
};

var possibleConstructorReturn = function (self, call) {
  if (!self) {
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  }

  return call && (typeof call === "object" || typeof call === "function") ? call : self;
};

var selfGlobal = typeof global === "undefined" ? self : global;

var set = function set(object, property, value, receiver) {
  var desc = Object.getOwnPropertyDescriptor(object, property);

  if (desc === undefined) {
    var parent = Object.getPrototypeOf(object);

    if (parent !== null) {
      set(parent, property, value, receiver);
    }
  } else if ("value" in desc && desc.writable) {
    desc.value = value;
  } else {
    var setter = desc.set;

    if (setter !== undefined) {
      setter.call(receiver, value);
    }
  }

  return value;
};

var slicedToArray = function () {
  function sliceIterator(arr, i) {
    var _arr = [];
    var _n = true;
    var _d = false;
    var _e = undefined;

    try {
      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
        _arr.push(_s.value);

        if (i && _arr.length === i) break;
      }
    } catch (err) {
      _d = true;
      _e = err;
    } finally {
      try {
        if (!_n && _i["return"]) _i["return"]();
      } finally {
        if (_d) throw _e;
      }
    }

    return _arr;
  }

  return function (arr, i) {
    if (Array.isArray(arr)) {
      return arr;
    } else if (Symbol.iterator in Object(arr)) {
      return sliceIterator(arr, i);
    } else {
      throw new TypeError("Invalid attempt to destructure non-iterable instance");
    }
  };
}();

var slicedToArrayLoose = function (arr, i) {
  if (Array.isArray(arr)) {
    return arr;
  } else if (Symbol.iterator in Object(arr)) {
    var _arr = [];

    for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
      _arr.push(_step.value);

      if (i && _arr.length === i) break;
    }

    return _arr;
  } else {
    throw new TypeError("Invalid attempt to destructure non-iterable instance");
  }
};

var taggedTemplateLiteral = function (strings, raw) {
  return Object.freeze(Object.defineProperties(strings, {
    raw: {
      value: Object.freeze(raw)
    }
  }));
};

var taggedTemplateLiteralLoose = function (strings, raw) {
  strings.raw = raw;
  return strings;
};

var temporalRef = function (val, name, undef) {
  if (val === undef) {
    throw new ReferenceError(name + " is not defined - temporal dead zone");
  } else {
    return val;
  }
};

var temporalUndefined = {};

var toArray = function (arr) {
  return Array.isArray(arr) ? arr : Array.from(arr);
};

var toConsumableArray = function (arr) {
  if (Array.isArray(arr)) {
    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];

    return arr2;
  } else {
    return Array.from(arr);
  }
};

var babelHelpers$1 = Object.freeze({
  jsx: jsx,
  asyncToGenerator: asyncToGenerator,
  classCallCheck: classCallCheck,
  createClass: createClass,
  defineEnumerableProperties: defineEnumerableProperties,
  defaults: defaults,
  defineProperty: defineProperty$1,
  get: get,
  inherits: inherits,
  interopRequireDefault: interopRequireDefault,
  interopRequireWildcard: interopRequireWildcard,
  newArrowCheck: newArrowCheck,
  objectDestructuringEmpty: objectDestructuringEmpty,
  objectWithoutProperties: objectWithoutProperties,
  possibleConstructorReturn: possibleConstructorReturn,
  selfGlobal: selfGlobal,
  set: set,
  slicedToArray: slicedToArray,
  slicedToArrayLoose: slicedToArrayLoose,
  taggedTemplateLiteral: taggedTemplateLiteral,
  taggedTemplateLiteralLoose: taggedTemplateLiteralLoose,
  temporalRef: temporalRef,
  temporalUndefined: temporalUndefined,
  toArray: toArray,
  toConsumableArray: toConsumableArray,
  typeof: _typeof,
  extends: _extends,
  instanceof: _instanceof
});

var realDefineProp = function () {
  var sentinel = function sentinel() {};

  try {
    Object.defineProperty(sentinel, 'a', {
      get: function get() {
        return 1;
      }
    });
    Object.defineProperty(sentinel, 'prototype', {
      writable: false
    });
    return sentinel.a === 1 && sentinel.prototype instanceof Object;
  } catch (e) {
    return false;
  }
}(); // Need a workaround for getters in ES3


var es3 = !realDefineProp && !Object.prototype.__defineGetter__; // We use this a lot (and need it for proto-less objects)

var hop = Object.prototype.hasOwnProperty; // Naive defineProperty for compatibility

var defineProperty = realDefineProp ? Object.defineProperty : function (obj, name, desc) {
  if ('get' in desc && obj.__defineGetter__) obj.__defineGetter__(name, desc.get);else if (!hop.call(obj, name) || 'value' in desc) obj[name] = desc.value;
}; // Array.prototype.indexOf, as good as we need it to be

var arrIndexOf = Array.prototype.indexOf || function (search) {
  /*jshint validthis:true */
  var t = this;
  if (!t.length) return -1;

  for (var i = arguments[1] || 0, max = t.length; i < max; i++) {
    if (t[i] === search) return i;
  }

  return -1;
}; // Create an object with the specified prototype (2nd arg required for Record)


var objCreate = Object.create || function (proto, props) {
  var obj = void 0;

  function F() {}

  F.prototype = proto;
  obj = new F();

  for (var k in props) {
    if (hop.call(props, k)) defineProperty(obj, k, props[k]);
  }

  return obj;
}; // Snapshot some (hopefully still) native built-ins


var arrSlice = Array.prototype.slice;
var arrConcat = Array.prototype.concat;
var arrPush = Array.prototype.push;
var arrJoin = Array.prototype.join;
var arrShift = Array.prototype.shift; // Naive Function.prototype.bind for compatibility

var fnBind = Function.prototype.bind || function (thisObj) {
  var fn = this,
      args = arrSlice.call(arguments, 1); // All our (presently) bound functions have either 1 or 0 arguments. By returning
  // different function signatures, we can pass some tests in ES3 environments

  if (fn.length === 1) {
    return function () {
      return fn.apply(thisObj, arrConcat.call(args, arrSlice.call(arguments)));
    };
  }

  return function () {
    return fn.apply(thisObj, arrConcat.call(args, arrSlice.call(arguments)));
  };
}; // Object housing internal properties for constructors


var internals = objCreate(null); // Keep internal properties internal

var secret = Math.random(); // Helper functions
// ================

/**
 * A function to deal with the inaccuracy of calculating log10 in pre-ES6
 * JavaScript environments. Math.log(num) / Math.LN10 was responsible for
 * causing issue #62.
 */

function log10Floor(n) {
  // ES6 provides the more accurate Math.log10
  if (typeof Math.log10 === 'function') return Math.floor(Math.log10(n));
  var x = Math.round(Math.log(n) * Math.LOG10E);
  return x - (Number('1e' + x) > n);
}
/**
 * A map that doesn't contain Object in its prototype chain
 */


function Record(obj) {
  // Copy only own properties over unless this object is already a Record instance
  for (var k in obj) {
    if (obj instanceof Record || hop.call(obj, k)) defineProperty(this, k, {
      value: obj[k],
      enumerable: true,
      writable: true,
      configurable: true
    });
  }
}

Record.prototype = objCreate(null);
/**
 * An ordered list
 */

function List() {
  defineProperty(this, 'length', {
    writable: true,
    value: 0
  });
  if (arguments.length) arrPush.apply(this, arrSlice.call(arguments));
}

List.prototype = objCreate(null);
/**
 * Constructs a regular expression to restore tainted RegExp properties
 */

function createRegExpRestore() {
  if (internals.disableRegExpRestore) {
    return function () {
      /* no-op */
    };
  }

  var regExpCache = {
    lastMatch: RegExp.lastMatch || '',
    leftContext: RegExp.leftContext,
    multiline: RegExp.multiline,
    input: RegExp.input
  },
      has = false; // Create a snapshot of all the 'captured' properties

  for (var i = 1; i <= 9; i++) {
    has = (regExpCache['$' + i] = RegExp['$' + i]) || has;
  }

  return function () {
    // Now we've snapshotted some properties, escape the lastMatch string
    var esc = /[.?*+^$[\]\\(){}|-]/g,
        lm = regExpCache.lastMatch.replace(esc, '\\$&'),
        reg = new List(); // If any of the captured strings were non-empty, iterate over them all

    if (has) {
      for (var _i = 1; _i <= 9; _i++) {
        var m = regExpCache['$' + _i]; // If it's empty, add an empty capturing group

        if (!m) lm = '()' + lm; // Else find the string in lm and escape & wrap it to capture it
        else {
          m = m.replace(esc, '\\$&');
          lm = lm.replace(m, '(' + m + ')');
        } // Push it to the reg and chop lm to make sure further groups come after

        arrPush.call(reg, lm.slice(0, lm.indexOf('(') + 1));
        lm = lm.slice(lm.indexOf('(') + 1);
      }
    }

    var exprStr = arrJoin.call(reg, '') + lm; // Shorten the regex by replacing each part of the expression with a match
    // for a string of that exact length.  This is safe for the type of
    // expressions generated above, because the expression matches the whole
    // match string, so we know each group and each segment between capturing
    // groups can be matched by its length alone.

    exprStr = exprStr.replace(/(\\\(|\\\)|[^()])+/g, function (match) {
      return '[\\s\\S]{' + match.replace('\\', '').length + '}';
    }); // Create the regular expression that will reconstruct the RegExp properties

    var expr = new RegExp(exprStr, regExpCache.multiline ? 'gm' : 'g'); // Set the lastIndex of the generated expression to ensure that the match
    // is found in the correct index.

    expr.lastIndex = regExpCache.leftContext.length;
    expr.exec(regExpCache.input);
  };
}
/**
 * Mimics ES5's abstract ToObject() function
 */


function toObject(arg) {
  if (arg === null) throw new TypeError('Cannot convert null or undefined to object');
  if ((typeof arg === 'undefined' ? 'undefined' : babelHelpers$1['typeof'](arg)) === 'object') return arg;
  return Object(arg);
}

function toNumber(arg) {
  if (typeof arg === 'number') return arg;
  return Number(arg);
}

function toInteger(arg) {
  var number = toNumber(arg);
  if (isNaN(number)) return 0;
  if (number === +0 || number === -0 || number === +Infinity || number === -Infinity) return number;
  if (number < 0) return Math.floor(Math.abs(number)) * -1;
  return Math.floor(Math.abs(number));
}

function toLength(arg) {
  var len = toInteger(arg);
  if (len <= 0) return 0;
  if (len === Infinity) return Math.pow(2, 53) - 1;
  return Math.min(len, Math.pow(2, 53) - 1);
}
/**
 * Returns "internal" properties for an object
 */


function getInternalProperties(obj) {
  if (hop.call(obj, '__getInternalProperties')) return obj.__getInternalProperties(secret);
  return objCreate(null);
}
/**
* Defines regular expressions for various operations related to the BCP 47 syntax,
* as defined at http://tools.ietf.org/html/bcp47#section-2.1
*/
// extlang       = 3ALPHA              ; selected ISO 639 codes
//                 *2("-" 3ALPHA)      ; permanently reserved


var extlang = '[a-z]{3}(?:-[a-z]{3}){0,2}'; // language      = 2*3ALPHA            ; shortest ISO 639 code
//                 ["-" extlang]       ; sometimes followed by
//                                     ; extended language subtags
//               / 4ALPHA              ; or reserved for future use
//               / 5*8ALPHA            ; or registered language subtag

var language = '(?:[a-z]{2,3}(?:-' + extlang + ')?|[a-z]{4}|[a-z]{5,8})'; // script        = 4ALPHA              ; ISO 15924 code

var script = '[a-z]{4}'; // region        = 2ALPHA              ; ISO 3166-1 code
//               / 3DIGIT              ; UN M.49 code

var region = '(?:[a-z]{2}|\\d{3})'; // variant       = 5*8alphanum         ; registered variants
//               / (DIGIT 3alphanum)

var variant = '(?:[a-z0-9]{5,8}|\\d[a-z0-9]{3})'; //                                     ; Single alphanumerics
//                                     ; "x" reserved for private use
// singleton     = DIGIT               ; 0 - 9
//               / %x41-57             ; A - W
//               / %x59-5A             ; Y - Z
//               / %x61-77             ; a - w
//               / %x79-7A             ; y - z

var singleton = '[0-9a-wy-z]'; // extension     = singleton 1*("-" (2*8alphanum))

var extension = singleton + '(?:-[a-z0-9]{2,8})+'; // privateuse    = "x" 1*("-" (1*8alphanum))

var privateuse = 'x(?:-[a-z0-9]{1,8})+'; // irregular     = "en-GB-oed"         ; irregular tags do not match
//               / "i-ami"             ; the 'langtag' production and
//               / "i-bnn"             ; would not otherwise be
//               / "i-default"         ; considered 'well-formed'
//               / "i-enochian"        ; These tags are all valid,
//               / "i-hak"             ; but most are deprecated
//               / "i-klingon"         ; in favor of more modern
//               / "i-lux"             ; subtags or subtag
//               / "i-mingo"           ; combination
//               / "i-navajo"
//               / "i-pwn"
//               / "i-tao"
//               / "i-tay"
//               / "i-tsu"
//               / "sgn-BE-FR"
//               / "sgn-BE-NL"
//               / "sgn-CH-DE"

var irregular = '(?:en-GB-oed' + '|i-(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|tao|tay|tsu)' + '|sgn-(?:BE-FR|BE-NL|CH-DE))'; // regular       = "art-lojban"        ; these tags match the 'langtag'
//               / "cel-gaulish"       ; production, but their subtags
//               / "no-bok"            ; are not extended language
//               / "no-nyn"            ; or variant subtags: their meaning
//               / "zh-guoyu"          ; is defined by their registration
//               / "zh-hakka"          ; and all of these are deprecated
//               / "zh-min"            ; in favor of a more modern
//               / "zh-min-nan"        ; subtag or sequence of subtags
//               / "zh-xiang"

var regular = '(?:art-lojban|cel-gaulish|no-bok|no-nyn' + '|zh-(?:guoyu|hakka|min|min-nan|xiang))'; // grandfathered = irregular           ; non-redundant tags registered
//               / regular             ; during the RFC 3066 era

var grandfathered = '(?:' + irregular + '|' + regular + ')'; // langtag       = language
//                 ["-" script]
//                 ["-" region]
//                 *("-" variant)
//                 *("-" extension)
//                 ["-" privateuse]

var langtag = language + '(?:-' + script + ')?(?:-' + region + ')?(?:-' + variant + ')*(?:-' + extension + ')*(?:-' + privateuse + ')?'; // Language-Tag  = langtag             ; normal language tags
//               / privateuse          ; private use tag
//               / grandfathered       ; grandfathered tags

var expBCP47Syntax = RegExp('^(?:' + langtag + '|' + privateuse + '|' + grandfathered + ')$', 'i'); // Match duplicate variants in a language tag

var expVariantDupes = RegExp('^(?!x).*?-(' + variant + ')-(?:\\w{4,8}-(?!x-))*\\1\\b', 'i'); // Match duplicate singletons in a language tag (except in private use)

var expSingletonDupes = RegExp('^(?!x).*?-(' + singleton + ')-(?:\\w+-(?!x-))*\\1\\b', 'i'); // Match all extension sequences

var expExtSequences = RegExp('-' + extension, 'ig'); // Default locale is the first-added locale data for us

var defaultLocale = void 0;

function setDefaultLocale(locale) {
  defaultLocale = locale;
} // IANA Subtag Registry redundant tag and subtag maps


var redundantTags = {
  tags: {
    "art-lojban": "jbo",
    "i-ami": "ami",
    "i-bnn": "bnn",
    "i-hak": "hak",
    "i-klingon": "tlh",
    "i-lux": "lb",
    "i-navajo": "nv",
    "i-pwn": "pwn",
    "i-tao": "tao",
    "i-tay": "tay",
    "i-tsu": "tsu",
    "no-bok": "nb",
    "no-nyn": "nn",
    "sgn-BE-FR": "sfb",
    "sgn-BE-NL": "vgt",
    "sgn-CH-DE": "sgg",
    "zh-guoyu": "cmn",
    "zh-hakka": "hak",
    "zh-min-nan": "nan",
    "zh-xiang": "hsn",
    "sgn-BR": "bzs",
    "sgn-CO": "csn",
    "sgn-DE": "gsg",
    "sgn-DK": "dsl",
    "sgn-ES": "ssp",
    "sgn-FR": "fsl",
    "sgn-GB": "bfi",
    "sgn-GR": "gss",
    "sgn-IE": "isg",
    "sgn-IT": "ise",
    "sgn-JP": "jsl",
    "sgn-MX": "mfs",
    "sgn-NI": "ncs",
    "sgn-NL": "dse",
    "sgn-NO": "nsl",
    "sgn-PT": "psr",
    "sgn-SE": "swl",
    "sgn-US": "ase",
    "sgn-ZA": "sfs",
    "zh-cmn": "cmn",
    "zh-cmn-Hans": "cmn-Hans",
    "zh-cmn-Hant": "cmn-Hant",
    "zh-gan": "gan",
    "zh-wuu": "wuu",
    "zh-yue": "yue"
  },
  subtags: {
    BU: "MM",
    DD: "DE",
    FX: "FR",
    TP: "TL",
    YD: "YE",
    ZR: "CD",
    heploc: "alalc97",
    'in': "id",
    iw: "he",
    ji: "yi",
    jw: "jv",
    mo: "ro",
    ayx: "nun",
    bjd: "drl",
    ccq: "rki",
    cjr: "mom",
    cka: "cmr",
    cmk: "xch",
    drh: "khk",
    drw: "prs",
    gav: "dev",
    hrr: "jal",
    ibi: "opa",
    kgh: "kml",
    lcq: "ppr",
    mst: "mry",
    myt: "mry",
    sca: "hle",
    tie: "ras",
    tkk: "twm",
    tlw: "weo",
    tnf: "prs",
    ybd: "rki",
    yma: "lrr"
  },
  extLang: {
    aao: ["aao", "ar"],
    abh: ["abh", "ar"],
    abv: ["abv", "ar"],
    acm: ["acm", "ar"],
    acq: ["acq", "ar"],
    acw: ["acw", "ar"],
    acx: ["acx", "ar"],
    acy: ["acy", "ar"],
    adf: ["adf", "ar"],
    ads: ["ads", "sgn"],
    aeb: ["aeb", "ar"],
    aec: ["aec", "ar"],
    aed: ["aed", "sgn"],
    aen: ["aen", "sgn"],
    afb: ["afb", "ar"],
    afg: ["afg", "sgn"],
    ajp: ["ajp", "ar"],
    apc: ["apc", "ar"],
    apd: ["apd", "ar"],
    arb: ["arb", "ar"],
    arq: ["arq", "ar"],
    ars: ["ars", "ar"],
    ary: ["ary", "ar"],
    arz: ["arz", "ar"],
    ase: ["ase", "sgn"],
    asf: ["asf", "sgn"],
    asp: ["asp", "sgn"],
    asq: ["asq", "sgn"],
    asw: ["asw", "sgn"],
    auz: ["auz", "ar"],
    avl: ["avl", "ar"],
    ayh: ["ayh", "ar"],
    ayl: ["ayl", "ar"],
    ayn: ["ayn", "ar"],
    ayp: ["ayp", "ar"],
    bbz: ["bbz", "ar"],
    bfi: ["bfi", "sgn"],
    bfk: ["bfk", "sgn"],
    bjn: ["bjn", "ms"],
    bog: ["bog", "sgn"],
    bqn: ["bqn", "sgn"],
    bqy: ["bqy", "sgn"],
    btj: ["btj", "ms"],
    bve: ["bve", "ms"],
    bvl: ["bvl", "sgn"],
    bvu: ["bvu", "ms"],
    bzs: ["bzs", "sgn"],
    cdo: ["cdo", "zh"],
    cds: ["cds", "sgn"],
    cjy: ["cjy", "zh"],
    cmn: ["cmn", "zh"],
    coa: ["coa", "ms"],
    cpx: ["cpx", "zh"],
    csc: ["csc", "sgn"],
    csd: ["csd", "sgn"],
    cse: ["cse", "sgn"],
    csf: ["csf", "sgn"],
    csg: ["csg", "sgn"],
    csl: ["csl", "sgn"],
    csn: ["csn", "sgn"],
    csq: ["csq", "sgn"],
    csr: ["csr", "sgn"],
    czh: ["czh", "zh"],
    czo: ["czo", "zh"],
    doq: ["doq", "sgn"],
    dse: ["dse", "sgn"],
    dsl: ["dsl", "sgn"],
    dup: ["dup", "ms"],
    ecs: ["ecs", "sgn"],
    esl: ["esl", "sgn"],
    esn: ["esn", "sgn"],
    eso: ["eso", "sgn"],
    eth: ["eth", "sgn"],
    fcs: ["fcs", "sgn"],
    fse: ["fse", "sgn"],
    fsl: ["fsl", "sgn"],
    fss: ["fss", "sgn"],
    gan: ["gan", "zh"],
    gds: ["gds", "sgn"],
    gom: ["gom", "kok"],
    gse: ["gse", "sgn"],
    gsg: ["gsg", "sgn"],
    gsm: ["gsm", "sgn"],
    gss: ["gss", "sgn"],
    gus: ["gus", "sgn"],
    hab: ["hab", "sgn"],
    haf: ["haf", "sgn"],
    hak: ["hak", "zh"],
    hds: ["hds", "sgn"],
    hji: ["hji", "ms"],
    hks: ["hks", "sgn"],
    hos: ["hos", "sgn"],
    hps: ["hps", "sgn"],
    hsh: ["hsh", "sgn"],
    hsl: ["hsl", "sgn"],
    hsn: ["hsn", "zh"],
    icl: ["icl", "sgn"],
    ils: ["ils", "sgn"],
    inl: ["inl", "sgn"],
    ins: ["ins", "sgn"],
    ise: ["ise", "sgn"],
    isg: ["isg", "sgn"],
    isr: ["isr", "sgn"],
    jak: ["jak", "ms"],
    jax: ["jax", "ms"],
    jcs: ["jcs", "sgn"],
    jhs: ["jhs", "sgn"],
    jls: ["jls", "sgn"],
    jos: ["jos", "sgn"],
    jsl: ["jsl", "sgn"],
    jus: ["jus", "sgn"],
    kgi: ["kgi", "sgn"],
    knn: ["knn", "kok"],
    kvb: ["kvb", "ms"],
    kvk: ["kvk", "sgn"],
    kvr: ["kvr", "ms"],
    kxd: ["kxd", "ms"],
    lbs: ["lbs", "sgn"],
    lce: ["lce", "ms"],
    lcf: ["lcf", "ms"],
    liw: ["liw", "ms"],
    lls: ["lls", "sgn"],
    lsg: ["lsg", "sgn"],
    lsl: ["lsl", "sgn"],
    lso: ["lso", "sgn"],
    lsp: ["lsp", "sgn"],
    lst: ["lst", "sgn"],
    lsy: ["lsy", "sgn"],
    ltg: ["ltg", "lv"],
    lvs: ["lvs", "lv"],
    lzh: ["lzh", "zh"],
    max: ["max", "ms"],
    mdl: ["mdl", "sgn"],
    meo: ["meo", "ms"],
    mfa: ["mfa", "ms"],
    mfb: ["mfb", "ms"],
    mfs: ["mfs", "sgn"],
    min: ["min", "ms"],
    mnp: ["mnp", "zh"],
    mqg: ["mqg", "ms"],
    mre: ["mre", "sgn"],
    msd: ["msd", "sgn"],
    msi: ["msi", "ms"],
    msr: ["msr", "sgn"],
    mui: ["mui", "ms"],
    mzc: ["mzc", "sgn"],
    mzg: ["mzg", "sgn"],
    mzy: ["mzy", "sgn"],
    nan: ["nan", "zh"],
    nbs: ["nbs", "sgn"],
    ncs: ["ncs", "sgn"],
    nsi: ["nsi", "sgn"],
    nsl: ["nsl", "sgn"],
    nsp: ["nsp", "sgn"],
    nsr: ["nsr", "sgn"],
    nzs: ["nzs", "sgn"],
    okl: ["okl", "sgn"],
    orn: ["orn", "ms"],
    ors: ["ors", "ms"],
    pel: ["pel", "ms"],
    pga: ["pga", "ar"],
    pks: ["pks", "sgn"],
    prl: ["prl", "sgn"],
    prz: ["prz", "sgn"],
    psc: ["psc", "sgn"],
    psd: ["psd", "sgn"],
    pse: ["pse", "ms"],
    psg: ["psg", "sgn"],
    psl: ["psl", "sgn"],
    pso: ["pso", "sgn"],
    psp: ["psp", "sgn"],
    psr: ["psr", "sgn"],
    pys: ["pys", "sgn"],
    rms: ["rms", "sgn"],
    rsi: ["rsi", "sgn"],
    rsl: ["rsl", "sgn"],
    sdl: ["sdl", "sgn"],
    sfb: ["sfb", "sgn"],
    sfs: ["sfs", "sgn"],
    sgg: ["sgg", "sgn"],
    sgx: ["sgx", "sgn"],
    shu: ["shu", "ar"],
    slf: ["slf", "sgn"],
    sls: ["sls", "sgn"],
    sqk: ["sqk", "sgn"],
    sqs: ["sqs", "sgn"],
    ssh: ["ssh", "ar"],
    ssp: ["ssp", "sgn"],
    ssr: ["ssr", "sgn"],
    svk: ["svk", "sgn"],
    swc: ["swc", "sw"],
    swh: ["swh", "sw"],
    swl: ["swl", "sgn"],
    syy: ["syy", "sgn"],
    tmw: ["tmw", "ms"],
    tse: ["tse", "sgn"],
    tsm: ["tsm", "sgn"],
    tsq: ["tsq", "sgn"],
    tss: ["tss", "sgn"],
    tsy: ["tsy", "sgn"],
    tza: ["tza", "sgn"],
    ugn: ["ugn", "sgn"],
    ugy: ["ugy", "sgn"],
    ukl: ["ukl", "sgn"],
    uks: ["uks", "sgn"],
    urk: ["urk", "ms"],
    uzn: ["uzn", "uz"],
    uzs: ["uzs", "uz"],
    vgt: ["vgt", "sgn"],
    vkk: ["vkk", "ms"],
    vkt: ["vkt", "ms"],
    vsi: ["vsi", "sgn"],
    vsl: ["vsl", "sgn"],
    vsv: ["vsv", "sgn"],
    wuu: ["wuu", "zh"],
    xki: ["xki", "sgn"],
    xml: ["xml", "sgn"],
    xmm: ["xmm", "ms"],
    xms: ["xms", "sgn"],
    yds: ["yds", "sgn"],
    ysl: ["ysl", "sgn"],
    yue: ["yue", "zh"],
    zib: ["zib", "sgn"],
    zlm: ["zlm", "ms"],
    zmi: ["zmi", "ms"],
    zsl: ["zsl", "sgn"],
    zsm: ["zsm", "ms"]
  }
};
/**
 * Convert only a-z to uppercase as per section 6.1 of the spec
 */

function toLatinUpperCase(str) {
  var i = str.length;

  while (i--) {
    var ch = str.charAt(i);
    if (ch >= "a" && ch <= "z") str = str.slice(0, i) + ch.toUpperCase() + str.slice(i + 1);
  }

  return str;
}
/**
 * The IsStructurallyValidLanguageTag abstract operation verifies that the locale
 * argument (which must be a String value)
 *
 * - represents a well-formed BCP 47 language tag as specified in RFC 5646 section
 *   2.1, or successor,
 * - does not include duplicate variant subtags, and
 * - does not include duplicate singleton subtags.
 *
 * The abstract operation returns true if locale can be generated from the ABNF
 * grammar in section 2.1 of the RFC, starting with Language-Tag, and does not
 * contain duplicate variant or singleton subtags (other than as a private use
 * subtag). It returns false otherwise. Terminal value characters in the grammar are
 * interpreted as the Unicode equivalents of the ASCII octet values given.
 */


function
/* 6.2.2 */
IsStructurallyValidLanguageTag(locale) {
  // represents a well-formed BCP 47 language tag as specified in RFC 5646
  if (!expBCP47Syntax.test(locale)) return false; // does not include duplicate variant subtags, and

  if (expVariantDupes.test(locale)) return false; // does not include duplicate singleton subtags.

  if (expSingletonDupes.test(locale)) return false;
  return true;
}
/**
 * The CanonicalizeLanguageTag abstract operation returns the canonical and case-
 * regularized form of the locale argument (which must be a String value that is
 * a structurally valid BCP 47 language tag as verified by the
 * IsStructurallyValidLanguageTag abstract operation). It takes the steps
 * specified in RFC 5646 section 4.5, or successor, to bring the language tag
 * into canonical form, and to regularize the case of the subtags, but does not
 * take the steps to bring a language tag into “extlang form” and to reorder
 * variant subtags.

 * The specifications for extensions to BCP 47 language tags, such as RFC 6067,
 * may include canonicalization rules for the extension subtag sequences they
 * define that go beyond the canonicalization rules of RFC 5646 section 4.5.
 * Implementations are allowed, but not required, to apply these additional rules.
 */


function
/* 6.2.3 */
CanonicalizeLanguageTag(locale) {
  var match = void 0,
      parts = void 0; // A language tag is in 'canonical form' when the tag is well-formed
  // according to the rules in Sections 2.1 and 2.2
  // Section 2.1 says all subtags use lowercase...

  locale = locale.toLowerCase(); // ...with 2 exceptions: 'two-letter and four-letter subtags that neither
  // appear at the start of the tag nor occur after singletons.  Such two-letter
  // subtags are all uppercase (as in the tags "en-CA-x-ca" or "sgn-BE-FR") and
  // four-letter subtags are titlecase (as in the tag "az-Latn-x-latn").

  parts = locale.split('-');

  for (var i = 1, max = parts.length; i < max; i++) {
    // Two-letter subtags are all uppercase
    if (parts[i].length === 2) parts[i] = parts[i].toUpperCase(); // Four-letter subtags are titlecase
    else if (parts[i].length === 4) parts[i] = parts[i].charAt(0).toUpperCase() + parts[i].slice(1); // Is it a singleton?
    else if (parts[i].length === 1 && parts[i] !== 'x') break;
  }

  locale = arrJoin.call(parts, '-'); // The steps laid out in RFC 5646 section 4.5 are as follows:
  // 1.  Extension sequences are ordered into case-insensitive ASCII order
  //     by singleton subtag.

  if ((match = locale.match(expExtSequences)) && match.length > 1) {
    // The built-in sort() sorts by ASCII order, so use that
    match.sort(); // Replace all extensions with the joined, sorted array

    locale = locale.replace(RegExp('(?:' + expExtSequences.source + ')+', 'i'), arrJoin.call(match, ''));
  } // 2.  Redundant or grandfathered tags are replaced by their 'Preferred-
  //     Value', if there is one.


  if (hop.call(redundantTags.tags, locale)) locale = redundantTags.tags[locale]; // 3.  Subtags are replaced by their 'Preferred-Value', if there is one.
  //     For extlangs, the original primary language subtag is also
  //     replaced if there is a primary language subtag in the 'Preferred-
  //     Value'.

  parts = locale.split('-');

  for (var _i = 1, _max = parts.length; _i < _max; _i++) {
    if (hop.call(redundantTags.subtags, parts[_i])) parts[_i] = redundantTags.subtags[parts[_i]];else if (hop.call(redundantTags.extLang, parts[_i])) {
      parts[_i] = redundantTags.extLang[parts[_i]][0]; // For extlang tags, the prefix needs to be removed if it is redundant

      if (_i === 1 && redundantTags.extLang[parts[1]][1] === parts[0]) {
        parts = arrSlice.call(parts, _i++);
        _max -= 1;
      }
    }
  }

  return arrJoin.call(parts, '-');
}
/**
 * The DefaultLocale abstract operation returns a String value representing the
 * structurally valid (6.2.2) and canonicalized (6.2.3) BCP 47 language tag for the
 * host environment’s current locale.
 */


function
/* 6.2.4 */
DefaultLocale() {
  return defaultLocale;
} // Sect 6.3 Currency Codes
// =======================


var expCurrencyCode = /^[A-Z]{3}$/;
/**
 * The IsWellFormedCurrencyCode abstract operation verifies that the currency argument
 * (after conversion to a String value) represents a well-formed 3-letter ISO currency
 * code. The following steps are taken:
 */

function
/* 6.3.1 */
IsWellFormedCurrencyCode(currency) {
  // 1. Let `c` be ToString(currency)
  var c = String(currency); // 2. Let `normalized` be the result of mapping c to upper case as described
  //    in 6.1.

  var normalized = toLatinUpperCase(c); // 3. If the string length of normalized is not 3, return false.
  // 4. If normalized contains any character that is not in the range "A" to "Z"
  //    (U+0041 to U+005A), return false.

  if (expCurrencyCode.test(normalized) === false) return false; // 5. Return true

  return true;
}

var expUnicodeExSeq = /-u(?:-[0-9a-z]{2,8})+/gi; // See `extension` below

function
/* 9.2.1 */
CanonicalizeLocaleList(locales) {
  // The abstract operation CanonicalizeLocaleList takes the following steps:
  // 1. If locales is undefined, then a. Return a new empty List
  if (locales === undefined) return new List(); // 2. Let seen be a new empty List.

  var seen = new List(); // 3. If locales is a String value, then
  //    a. Let locales be a new array created as if by the expression new
  //    Array(locales) where Array is the standard built-in constructor with
  //    that name and locales is the value of locales.

  locales = typeof locales === 'string' ? [locales] : locales; // 4. Let O be ToObject(locales).

  var O = toObject(locales); // 5. Let lenValue be the result of calling the [[Get]] internal method of
  //    O with the argument "length".
  // 6. Let len be ToUint32(lenValue).

  var len = toLength(O.length); // 7. Let k be 0.

  var k = 0; // 8. Repeat, while k < len

  while (k < len) {
    // a. Let Pk be ToString(k).
    var Pk = String(k); // b. Let kPresent be the result of calling the [[HasProperty]] internal
    //    method of O with argument Pk.

    var kPresent = (Pk in O); // c. If kPresent is true, then

    if (kPresent) {
      // i. Let kValue be the result of calling the [[Get]] internal
      //     method of O with argument Pk.
      var kValue = O[Pk]; // ii. If the type of kValue is not String or Object, then throw a
      //     TypeError exception.

      if (kValue === null || typeof kValue !== 'string' && (typeof kValue === "undefined" ? "undefined" : babelHelpers$1["typeof"](kValue)) !== 'object') throw new TypeError('String or Object type expected'); // iii. Let tag be ToString(kValue).

      var tag = String(kValue); // iv. If the result of calling the abstract operation
      //     IsStructurallyValidLanguageTag (defined in 6.2.2), passing tag as
      //     the argument, is false, then throw a RangeError exception.

      if (!IsStructurallyValidLanguageTag(tag)) throw new RangeError("'" + tag + "' is not a structurally valid language tag"); // v. Let tag be the result of calling the abstract operation
      //    CanonicalizeLanguageTag (defined in 6.2.3), passing tag as the
      //    argument.

      tag = CanonicalizeLanguageTag(tag); // vi. If tag is not an element of seen, then append tag as the last
      //     element of seen.

      if (arrIndexOf.call(seen, tag) === -1) arrPush.call(seen, tag);
    } // d. Increase k by 1.


    k++;
  } // 9. Return seen.


  return seen;
}
/**
 * The BestAvailableLocale abstract operation compares the provided argument
 * locale, which must be a String value with a structurally valid and
 * canonicalized BCP 47 language tag, against the locales in availableLocales and
 * returns either the longest non-empty prefix of locale that is an element of
 * availableLocales, or undefined if there is no such element. It uses the
 * fallback mechanism of RFC 4647, section 3.4. The following steps are taken:
 */


function
/* 9.2.2 */
BestAvailableLocale(availableLocales, locale) {
  // 1. Let candidate be locale
  var candidate = locale; // 2. Repeat

  while (candidate) {
    // a. If availableLocales contains an element equal to candidate, then return
    // candidate.
    if (arrIndexOf.call(availableLocales, candidate) > -1) return candidate; // b. Let pos be the character index of the last occurrence of "-"
    // (U+002D) within candidate. If that character does not occur, return
    // undefined.

    var pos = candidate.lastIndexOf('-');
    if (pos < 0) return; // c. If pos ≥ 2 and the character "-" occurs at index pos-2 of candidate,
    //    then decrease pos by 2.

    if (pos >= 2 && candidate.charAt(pos - 2) === '-') pos -= 2; // d. Let candidate be the substring of candidate from position 0, inclusive,
    //    to position pos, exclusive.

    candidate = candidate.substring(0, pos);
  }
}
/**
 * The LookupMatcher abstract operation compares requestedLocales, which must be
 * a List as returned by CanonicalizeLocaleList, against the locales in
 * availableLocales and determines the best available language to meet the
 * request. The following steps are taken:
 */


function
/* 9.2.3 */
LookupMatcher(availableLocales, requestedLocales) {
  // 1. Let i be 0.
  var i = 0; // 2. Let len be the number of elements in requestedLocales.

  var len = requestedLocales.length; // 3. Let availableLocale be undefined.

  var availableLocale = void 0;
  var locale = void 0,
      noExtensionsLocale = void 0; // 4. Repeat while i < len and availableLocale is undefined:

  while (i < len && !availableLocale) {
    // a. Let locale be the element of requestedLocales at 0-origined list
    //    position i.
    locale = requestedLocales[i]; // b. Let noExtensionsLocale be the String value that is locale with all
    //    Unicode locale extension sequences removed.

    noExtensionsLocale = String(locale).replace(expUnicodeExSeq, ''); // c. Let availableLocale be the result of calling the
    //    BestAvailableLocale abstract operation (defined in 9.2.2) with
    //    arguments availableLocales and noExtensionsLocale.

    availableLocale = BestAvailableLocale(availableLocales, noExtensionsLocale); // d. Increase i by 1.

    i++;
  } // 5. Let result be a new Record.


  var result = new Record(); // 6. If availableLocale is not undefined, then

  if (availableLocale !== undefined) {
    // a. Set result.[[locale]] to availableLocale.
    result['[[locale]]'] = availableLocale; // b. If locale and noExtensionsLocale are not the same String value, then

    if (String(locale) !== String(noExtensionsLocale)) {
      // i. Let extension be the String value consisting of the first
      //    substring of locale that is a Unicode locale extension sequence.
      var extension = locale.match(expUnicodeExSeq)[0]; // ii. Let extensionIndex be the character position of the initial
      //     "-" of the first Unicode locale extension sequence within locale.

      var extensionIndex = locale.indexOf('-u-'); // iii. Set result.[[extension]] to extension.

      result['[[extension]]'] = extension; // iv. Set result.[[extensionIndex]] to extensionIndex.

      result['[[extensionIndex]]'] = extensionIndex;
    }
  } // 7. Else
  else // a. Set result.[[locale]] to the value returned by the DefaultLocale abstract
    //    operation (defined in 6.2.4).
    result['[[locale]]'] = DefaultLocale(); // 8. Return result


  return result;
}
/**
 * The BestFitMatcher abstract operation compares requestedLocales, which must be
 * a List as returned by CanonicalizeLocaleList, against the locales in
 * availableLocales and determines the best available language to meet the
 * request. The algorithm is implementation dependent, but should produce results
 * that a typical user of the requested locales would perceive as at least as
 * good as those produced by the LookupMatcher abstract operation. Options
 * specified through Unicode locale extension sequences must be ignored by the
 * algorithm. Information about such subsequences is returned separately.
 * The abstract operation returns a record with a [[locale]] field, whose value
 * is the language tag of the selected locale, which must be an element of
 * availableLocales. If the language tag of the request locale that led to the
 * selected locale contained a Unicode locale extension sequence, then the
 * returned record also contains an [[extension]] field whose value is the first
 * Unicode locale extension sequence, and an [[extensionIndex]] field whose value
 * is the index of the first Unicode locale extension sequence within the request
 * locale language tag.
 */


function
/* 9.2.4 */
BestFitMatcher(availableLocales, requestedLocales) {
  return LookupMatcher(availableLocales, requestedLocales);
}
/**
 * The ResolveLocale abstract operation compares a BCP 47 language priority list
 * requestedLocales against the locales in availableLocales and determines the
 * best available language to meet the request. availableLocales and
 * requestedLocales must be provided as List values, options as a Record.
 */


function
/* 9.2.5 */
ResolveLocale(availableLocales, requestedLocales, options, relevantExtensionKeys, localeData) {
  if (availableLocales.length === 0) {
    throw new ReferenceError('No locale data has been provided for this object yet.');
  } // The following steps are taken:
  // 1. Let matcher be the value of options.[[localeMatcher]].


  var matcher = options['[[localeMatcher]]'];
  var r = void 0; // 2. If matcher is "lookup", then

  if (matcher === 'lookup') // a. Let r be the result of calling the LookupMatcher abstract operation
    //    (defined in 9.2.3) with arguments availableLocales and
    //    requestedLocales.
    r = LookupMatcher(availableLocales, requestedLocales); // 3. Else
  else // a. Let r be the result of calling the BestFitMatcher abstract
    //    operation (defined in 9.2.4) with arguments availableLocales and
    //    requestedLocales.
    r = BestFitMatcher(availableLocales, requestedLocales); // 4. Let foundLocale be the value of r.[[locale]].

  var foundLocale = r['[[locale]]'];
  var extensionSubtags = void 0,
      extensionSubtagsLength = void 0; // 5. If r has an [[extension]] field, then

  if (hop.call(r, '[[extension]]')) {
    // a. Let extension be the value of r.[[extension]].
    var extension = r['[[extension]]']; // b. Let split be the standard built-in function object defined in ES5,
    //    15.5.4.14.

    var split = String.prototype.split; // c. Let extensionSubtags be the result of calling the [[Call]] internal
    //    method of split with extension as the this value and an argument
    //    list containing the single item "-".

    extensionSubtags = split.call(extension, '-'); // d. Let extensionSubtagsLength be the result of calling the [[Get]]
    //    internal method of extensionSubtags with argument "length".

    extensionSubtagsLength = extensionSubtags.length;
  } // 6. Let result be a new Record.


  var result = new Record(); // 7. Set result.[[dataLocale]] to foundLocale.

  result['[[dataLocale]]'] = foundLocale; // 8. Let supportedExtension be "-u".

  var supportedExtension = '-u'; // 9. Let i be 0.

  var i = 0; // 10. Let len be the result of calling the [[Get]] internal method of
  //     relevantExtensionKeys with argument "length".

  var len = relevantExtensionKeys.length; // 11 Repeat while i < len:

  while (i < len) {
    // a. Let key be the result of calling the [[Get]] internal method of
    //    relevantExtensionKeys with argument ToString(i).
    var key = relevantExtensionKeys[i]; // b. Let foundLocaleData be the result of calling the [[Get]] internal
    //    method of localeData with the argument foundLocale.

    var foundLocaleData = localeData[foundLocale]; // c. Let keyLocaleData be the result of calling the [[Get]] internal
    //    method of foundLocaleData with the argument key.

    var keyLocaleData = foundLocaleData[key]; // d. Let value be the result of calling the [[Get]] internal method of
    //    keyLocaleData with argument "0".

    var value = keyLocaleData['0']; // e. Let supportedExtensionAddition be "".

    var supportedExtensionAddition = ''; // f. Let indexOf be the standard built-in function object defined in
    //    ES5, 15.4.4.14.

    var indexOf = arrIndexOf; // g. If extensionSubtags is not undefined, then

    if (extensionSubtags !== undefined) {
      // i. Let keyPos be the result of calling the [[Call]] internal
      //    method of indexOf with extensionSubtags as the this value and
      // an argument list containing the single item key.
      var keyPos = indexOf.call(extensionSubtags, key); // ii. If keyPos ≠ -1, then

      if (keyPos !== -1) {
        // 1. If keyPos + 1 < extensionSubtagsLength and the length of the
        //    result of calling the [[Get]] internal method of
        //    extensionSubtags with argument ToString(keyPos +1) is greater
        //    than 2, then
        if (keyPos + 1 < extensionSubtagsLength && extensionSubtags[keyPos + 1].length > 2) {
          // a. Let requestedValue be the result of calling the [[Get]]
          //    internal method of extensionSubtags with argument
          //    ToString(keyPos + 1).
          var requestedValue = extensionSubtags[keyPos + 1]; // b. Let valuePos be the result of calling the [[Call]]
          //    internal method of indexOf with keyLocaleData as the
          //    this value and an argument list containing the single
          //    item requestedValue.

          var valuePos = indexOf.call(keyLocaleData, requestedValue); // c. If valuePos ≠ -1, then

          if (valuePos !== -1) {
            // i. Let value be requestedValue.
            value = requestedValue, // ii. Let supportedExtensionAddition be the
            //     concatenation of "-", key, "-", and value.
            supportedExtensionAddition = '-' + key + '-' + value;
          }
        } // 2. Else
        else {
          // a. Let valuePos be the result of calling the [[Call]]
          // internal method of indexOf with keyLocaleData as the this
          // value and an argument list containing the single item
          // "true".
          var _valuePos = indexOf(keyLocaleData, 'true'); // b. If valuePos ≠ -1, then


          if (_valuePos !== -1) // i. Let value be "true".
            value = 'true';
        }
      }
    } // h. If options has a field [[<key>]], then


    if (hop.call(options, '[[' + key + ']]')) {
      // i. Let optionsValue be the value of options.[[<key>]].
      var optionsValue = options['[[' + key + ']]']; // ii. If the result of calling the [[Call]] internal method of indexOf
      //     with keyLocaleData as the this value and an argument list
      //     containing the single item optionsValue is not -1, then

      if (indexOf.call(keyLocaleData, optionsValue) !== -1) {
        // 1. If optionsValue is not equal to value, then
        if (optionsValue !== value) {
          // a. Let value be optionsValue.
          value = optionsValue; // b. Let supportedExtensionAddition be "".

          supportedExtensionAddition = '';
        }
      }
    } // i. Set result.[[<key>]] to value.


    result['[[' + key + ']]'] = value; // j. Append supportedExtensionAddition to supportedExtension.

    supportedExtension += supportedExtensionAddition; // k. Increase i by 1.

    i++;
  } // 12. If the length of supportedExtension is greater than 2, then


  if (supportedExtension.length > 2) {
    // a.
    var privateIndex = foundLocale.indexOf("-x-"); // b.

    if (privateIndex === -1) {
      // i.
      foundLocale = foundLocale + supportedExtension;
    } // c.
    else {
      // i.
      var preExtension = foundLocale.substring(0, privateIndex); // ii.

      var postExtension = foundLocale.substring(privateIndex); // iii.

      foundLocale = preExtension + supportedExtension + postExtension;
    } // d. asserting - skipping
    // e.


    foundLocale = CanonicalizeLanguageTag(foundLocale);
  } // 13. Set result.[[locale]] to foundLocale.


  result['[[locale]]'] = foundLocale; // 14. Return result.

  return result;
}
/**
 * The LookupSupportedLocales abstract operation returns the subset of the
 * provided BCP 47 language priority list requestedLocales for which
 * availableLocales has a matching locale when using the BCP 47 Lookup algorithm.
 * Locales appear in the same order in the returned list as in requestedLocales.
 * The following steps are taken:
 */


function
/* 9.2.6 */
LookupSupportedLocales(availableLocales, requestedLocales) {
  // 1. Let len be the number of elements in requestedLocales.
  var len = requestedLocales.length; // 2. Let subset be a new empty List.

  var subset = new List(); // 3. Let k be 0.

  var k = 0; // 4. Repeat while k < len

  while (k < len) {
    // a. Let locale be the element of requestedLocales at 0-origined list
    //    position k.
    var locale = requestedLocales[k]; // b. Let noExtensionsLocale be the String value that is locale with all
    //    Unicode locale extension sequences removed.

    var noExtensionsLocale = String(locale).replace(expUnicodeExSeq, ''); // c. Let availableLocale be the result of calling the
    //    BestAvailableLocale abstract operation (defined in 9.2.2) with
    //    arguments availableLocales and noExtensionsLocale.

    var availableLocale = BestAvailableLocale(availableLocales, noExtensionsLocale); // d. If availableLocale is not undefined, then append locale to the end of
    //    subset.

    if (availableLocale !== undefined) arrPush.call(subset, locale); // e. Increment k by 1.

    k++;
  } // 5. Let subsetArray be a new Array object whose elements are the same
  //    values in the same order as the elements of subset.


  var subsetArray = arrSlice.call(subset); // 6. Return subsetArray.

  return subsetArray;
}
/**
 * The BestFitSupportedLocales abstract operation returns the subset of the
 * provided BCP 47 language priority list requestedLocales for which
 * availableLocales has a matching locale when using the Best Fit Matcher
 * algorithm. Locales appear in the same order in the returned list as in
 * requestedLocales. The steps taken are implementation dependent.
 */


function
/*9.2.7 */
BestFitSupportedLocales(availableLocales, requestedLocales) {
  // ###TODO: implement this function as described by the specification###
  return LookupSupportedLocales(availableLocales, requestedLocales);
}
/**
 * The SupportedLocales abstract operation returns the subset of the provided BCP
 * 47 language priority list requestedLocales for which availableLocales has a
 * matching locale. Two algorithms are available to match the locales: the Lookup
 * algorithm described in RFC 4647 section 3.4, and an implementation dependent
 * best-fit algorithm. Locales appear in the same order in the returned list as
 * in requestedLocales. The following steps are taken:
 */


function
/*9.2.8 */
SupportedLocales(availableLocales, requestedLocales, options) {
  var matcher = void 0,
      subset = void 0; // 1. If options is not undefined, then

  if (options !== undefined) {
    // a. Let options be ToObject(options).
    options = new Record(toObject(options)); // b. Let matcher be the result of calling the [[Get]] internal method of
    //    options with argument "localeMatcher".

    matcher = options.localeMatcher; // c. If matcher is not undefined, then

    if (matcher !== undefined) {
      // i. Let matcher be ToString(matcher).
      matcher = String(matcher); // ii. If matcher is not "lookup" or "best fit", then throw a RangeError
      //     exception.

      if (matcher !== 'lookup' && matcher !== 'best fit') throw new RangeError('matcher should be "lookup" or "best fit"');
    }
  } // 2. If matcher is undefined or "best fit", then


  if (matcher === undefined || matcher === 'best fit') // a. Let subset be the result of calling the BestFitSupportedLocales
    //    abstract operation (defined in 9.2.7) with arguments
    //    availableLocales and requestedLocales.
    subset = BestFitSupportedLocales(availableLocales, requestedLocales); // 3. Else
  else // a. Let subset be the result of calling the LookupSupportedLocales
    //    abstract operation (defined in 9.2.6) with arguments
    //    availableLocales and requestedLocales.
    subset = LookupSupportedLocales(availableLocales, requestedLocales); // 4. For each named own property name P of subset,

  for (var P in subset) {
    if (!hop.call(subset, P)) continue; // a. Let desc be the result of calling the [[GetOwnProperty]] internal
    //    method of subset with P.
    // b. Set desc.[[Writable]] to false.
    // c. Set desc.[[Configurable]] to false.
    // d. Call the [[DefineOwnProperty]] internal method of subset with P, desc,
    //    and true as arguments.

    defineProperty(subset, P, {
      writable: false,
      configurable: false,
      value: subset[P]
    });
  } // "Freeze" the array so no new elements can be added


  defineProperty(subset, 'length', {
    writable: false
  }); // 5. Return subset

  return subset;
}
/**
 * The GetOption abstract operation extracts the value of the property named
 * property from the provided options object, converts it to the required type,
 * checks whether it is one of a List of allowed values, and fills in a fallback
 * value if necessary.
 */


function
/*9.2.9 */
GetOption(options, property, type, values, fallback) {
  // 1. Let value be the result of calling the [[Get]] internal method of
  //    options with argument property.
  var value = options[property]; // 2. If value is not undefined, then

  if (value !== undefined) {
    // a. Assert: type is "boolean" or "string".
    // b. If type is "boolean", then let value be ToBoolean(value).
    // c. If type is "string", then let value be ToString(value).
    value = type === 'boolean' ? Boolean(value) : type === 'string' ? String(value) : value; // d. If values is not undefined, then

    if (values !== undefined) {
      // i. If values does not contain an element equal to value, then throw a
      //    RangeError exception.
      if (arrIndexOf.call(values, value) === -1) throw new RangeError("'" + value + "' is not an allowed value for `" + property + '`');
    } // e. Return value.


    return value;
  } // Else return fallback.


  return fallback;
}
/**
 * The GetNumberOption abstract operation extracts a property value from the
 * provided options object, converts it to a Number value, checks whether it is
 * in the allowed range, and fills in a fallback value if necessary.
 */


function
/* 9.2.10 */
GetNumberOption(options, property, minimum, maximum, fallback) {
  // 1. Let value be the result of calling the [[Get]] internal method of
  //    options with argument property.
  var value = options[property]; // 2. If value is not undefined, then

  if (value !== undefined) {
    // a. Let value be ToNumber(value).
    value = Number(value); // b. If value is NaN or less than minimum or greater than maximum, throw a
    //    RangeError exception.

    if (isNaN(value) || value < minimum || value > maximum) throw new RangeError('Value is not a number or outside accepted range'); // c. Return floor(value).

    return Math.floor(value);
  } // 3. Else return fallback.


  return fallback;
} // 8 The Intl Object


var Intl = {}; // 8.2 Function Properties of the Intl Object
// 8.2.1
// @spec[tc39/ecma402/master/spec/intl.html]
// @clause[sec-intl.getcanonicallocales]

function getCanonicalLocales(locales) {
  // 1. Let ll be ? CanonicalizeLocaleList(locales).
  var ll = CanonicalizeLocaleList(locales); // 2. Return CreateArrayFromList(ll).

  {
    var result = [];
    var len = ll.length;
    var k = 0;

    while (k < len) {
      result[k] = ll[k];
      k++;
    }

    return result;
  }
}

Object.defineProperty(Intl, 'getCanonicalLocales', {
  enumerable: false,
  configurable: true,
  writable: true,
  value: getCanonicalLocales
}); // Currency minor units output from get-4217 grunt task, formatted

var currencyMinorUnits = {
  BHD: 3,
  BYR: 0,
  XOF: 0,
  BIF: 0,
  XAF: 0,
  CLF: 4,
  CLP: 0,
  KMF: 0,
  DJF: 0,
  XPF: 0,
  GNF: 0,
  ISK: 0,
  IQD: 3,
  JPY: 0,
  JOD: 3,
  KRW: 0,
  KWD: 3,
  LYD: 3,
  OMR: 3,
  PYG: 0,
  RWF: 0,
  TND: 3,
  UGX: 0,
  UYI: 0,
  VUV: 0,
  VND: 0
}; // Define the NumberFormat constructor internally so it cannot be tainted

function NumberFormatConstructor() {
  var locales = arguments[0];
  var options = arguments[1];

  if (!this || this === Intl) {
    return new Intl.NumberFormat(locales, options);
  }

  return InitializeNumberFormat(toObject(this), locales, options);
}

defineProperty(Intl, 'NumberFormat', {
  configurable: true,
  writable: true,
  value: NumberFormatConstructor
}); // Must explicitly set prototypes as unwritable

defineProperty(Intl.NumberFormat, 'prototype', {
  writable: false
});
/**
 * The abstract operation InitializeNumberFormat accepts the arguments
 * numberFormat (which must be an object), locales, and options. It initializes
 * numberFormat as a NumberFormat object.
 */

function
/*11.1.1.1 */
InitializeNumberFormat(numberFormat, locales, options) {
  // This will be a internal properties object if we're not already initialized
  var internal = getInternalProperties(numberFormat); // Create an object whose props can be used to restore the values of RegExp props

  var regexpRestore = createRegExpRestore(); // 1. If numberFormat has an [[initializedIntlObject]] internal property with
  // value true, throw a TypeError exception.

  if (internal['[[initializedIntlObject]]'] === true) throw new TypeError('`this` object has already been initialized as an Intl object'); // Need this to access the `internal` object

  defineProperty(numberFormat, '__getInternalProperties', {
    value: function value() {
      // NOTE: Non-standard, for internal use only
      if (arguments[0] === secret) return internal;
    }
  }); // 2. Set the [[initializedIntlObject]] internal property of numberFormat to true.

  internal['[[initializedIntlObject]]'] = true; // 3. Let requestedLocales be the result of calling the CanonicalizeLocaleList
  //    abstract operation (defined in 9.2.1) with argument locales.

  var requestedLocales = CanonicalizeLocaleList(locales); // 4. If options is undefined, then

  if (options === undefined) // a. Let options be the result of creating a new object as if by the
    // expression new Object() where Object is the standard built-in constructor
    // with that name.
    options = {}; // 5. Else
  else // a. Let options be ToObject(options).
    options = toObject(options); // 6. Let opt be a new Record.

  var opt = new Record(),
      // 7. Let matcher be the result of calling the GetOption abstract operation
  //    (defined in 9.2.9) with the arguments options, "localeMatcher", "string",
  //    a List containing the two String values "lookup" and "best fit", and
  //    "best fit".
  matcher = GetOption(options, 'localeMatcher', 'string', new List('lookup', 'best fit'), 'best fit'); // 8. Set opt.[[localeMatcher]] to matcher.

  opt['[[localeMatcher]]'] = matcher; // 9. Let NumberFormat be the standard built-in object that is the initial value
  //    of Intl.NumberFormat.
  // 10. Let localeData be the value of the [[localeData]] internal property of
  //     NumberFormat.

  var localeData = internals.NumberFormat['[[localeData]]']; // 11. Let r be the result of calling the ResolveLocale abstract operation
  //     (defined in 9.2.5) with the [[availableLocales]] internal property of
  //     NumberFormat, requestedLocales, opt, the [[relevantExtensionKeys]]
  //     internal property of NumberFormat, and localeData.

  var r = ResolveLocale(internals.NumberFormat['[[availableLocales]]'], requestedLocales, opt, internals.NumberFormat['[[relevantExtensionKeys]]'], localeData); // 12. Set the [[locale]] internal property of numberFormat to the value of
  //     r.[[locale]].

  internal['[[locale]]'] = r['[[locale]]']; // 13. Set the [[numberingSystem]] internal property of numberFormat to the value
  //     of r.[[nu]].

  internal['[[numberingSystem]]'] = r['[[nu]]']; // The specification doesn't tell us to do this, but it's helpful later on

  internal['[[dataLocale]]'] = r['[[dataLocale]]']; // 14. Let dataLocale be the value of r.[[dataLocale]].

  var dataLocale = r['[[dataLocale]]']; // 15. Let s be the result of calling the GetOption abstract operation with the
  //     arguments options, "style", "string", a List containing the three String
  //     values "decimal", "percent", and "currency", and "decimal".

  var s = GetOption(options, 'style', 'string', new List('decimal', 'percent', 'currency'), 'decimal'); // 16. Set the [[style]] internal property of numberFormat to s.

  internal['[[style]]'] = s; // 17. Let c be the result of calling the GetOption abstract operation with the
  //     arguments options, "currency", "string", undefined, and undefined.

  var c = GetOption(options, 'currency', 'string'); // 18. If c is not undefined and the result of calling the
  //     IsWellFormedCurrencyCode abstract operation (defined in 6.3.1) with
  //     argument c is false, then throw a RangeError exception.

  if (c !== undefined && !IsWellFormedCurrencyCode(c)) throw new RangeError("'" + c + "' is not a valid currency code"); // 19. If s is "currency" and c is undefined, throw a TypeError exception.

  if (s === 'currency' && c === undefined) throw new TypeError('Currency code is required when style is currency');
  var cDigits = void 0; // 20. If s is "currency", then

  if (s === 'currency') {
    // a. Let c be the result of converting c to upper case as specified in 6.1.
    c = c.toUpperCase(); // b. Set the [[currency]] internal property of numberFormat to c.

    internal['[[currency]]'] = c; // c. Let cDigits be the result of calling the CurrencyDigits abstract
    //    operation (defined below) with argument c.

    cDigits = CurrencyDigits(c);
  } // 21. Let cd be the result of calling the GetOption abstract operation with the
  //     arguments options, "currencyDisplay", "string", a List containing the
  //     three String values "code", "symbol", and "name", and "symbol".


  var cd = GetOption(options, 'currencyDisplay', 'string', new List('code', 'symbol', 'name'), 'symbol'); // 22. If s is "currency", then set the [[currencyDisplay]] internal property of
  //     numberFormat to cd.

  if (s === 'currency') internal['[[currencyDisplay]]'] = cd; // 23. Let mnid be the result of calling the GetNumberOption abstract operation
  //     (defined in 9.2.10) with arguments options, "minimumIntegerDigits", 1, 21,
  //     and 1.

  var mnid = GetNumberOption(options, 'minimumIntegerDigits', 1, 21, 1); // 24. Set the [[minimumIntegerDigits]] internal property of numberFormat to mnid.

  internal['[[minimumIntegerDigits]]'] = mnid; // 25. If s is "currency", then let mnfdDefault be cDigits; else let mnfdDefault
  //     be 0.

  var mnfdDefault = s === 'currency' ? cDigits : 0; // 26. Let mnfd be the result of calling the GetNumberOption abstract operation
  //     with arguments options, "minimumFractionDigits", 0, 20, and mnfdDefault.

  var mnfd = GetNumberOption(options, 'minimumFractionDigits', 0, 20, mnfdDefault); // 27. Set the [[minimumFractionDigits]] internal property of numberFormat to mnfd.

  internal['[[minimumFractionDigits]]'] = mnfd; // 28. If s is "currency", then let mxfdDefault be max(mnfd, cDigits); else if s
  //     is "percent", then let mxfdDefault be max(mnfd, 0); else let mxfdDefault
  //     be max(mnfd, 3).

  var mxfdDefault = s === 'currency' ? Math.max(mnfd, cDigits) : s === 'percent' ? Math.max(mnfd, 0) : Math.max(mnfd, 3); // 29. Let mxfd be the result of calling the GetNumberOption abstract operation
  //     with arguments options, "maximumFractionDigits", mnfd, 20, and mxfdDefault.

  var mxfd = GetNumberOption(options, 'maximumFractionDigits', mnfd, 20, mxfdDefault); // 30. Set the [[maximumFractionDigits]] internal property of numberFormat to mxfd.

  internal['[[maximumFractionDigits]]'] = mxfd; // 31. Let mnsd be the result of calling the [[Get]] internal method of options
  //     with argument "minimumSignificantDigits".

  var mnsd = options.minimumSignificantDigits; // 32. Let mxsd be the result of calling the [[Get]] internal method of options
  //     with argument "maximumSignificantDigits".

  var mxsd = options.maximumSignificantDigits; // 33. If mnsd is not undefined or mxsd is not undefined, then:

  if (mnsd !== undefined || mxsd !== undefined) {
    // a. Let mnsd be the result of calling the GetNumberOption abstract
    //    operation with arguments options, "minimumSignificantDigits", 1, 21,
    //    and 1.
    mnsd = GetNumberOption(options, 'minimumSignificantDigits', 1, 21, 1); // b. Let mxsd be the result of calling the GetNumberOption abstract
    //     operation with arguments options, "maximumSignificantDigits", mnsd,
    //     21, and 21.

    mxsd = GetNumberOption(options, 'maximumSignificantDigits', mnsd, 21, 21); // c. Set the [[minimumSignificantDigits]] internal property of numberFormat
    //    to mnsd, and the [[maximumSignificantDigits]] internal property of
    //    numberFormat to mxsd.

    internal['[[minimumSignificantDigits]]'] = mnsd;
    internal['[[maximumSignificantDigits]]'] = mxsd;
  } // 34. Let g be the result of calling the GetOption abstract operation with the
  //     arguments options, "useGrouping", "boolean", undefined, and true.


  var g = GetOption(options, 'useGrouping', 'boolean', undefined, true); // 35. Set the [[useGrouping]] internal property of numberFormat to g.

  internal['[[useGrouping]]'] = g; // 36. Let dataLocaleData be the result of calling the [[Get]] internal method of
  //     localeData with argument dataLocale.

  var dataLocaleData = localeData[dataLocale]; // 37. Let patterns be the result of calling the [[Get]] internal method of
  //     dataLocaleData with argument "patterns".

  var patterns = dataLocaleData.patterns; // 38. Assert: patterns is an object (see 11.2.3)
  // 39. Let stylePatterns be the result of calling the [[Get]] internal method of
  //     patterns with argument s.

  var stylePatterns = patterns[s]; // 40. Set the [[positivePattern]] internal property of numberFormat to the
  //     result of calling the [[Get]] internal method of stylePatterns with the
  //     argument "positivePattern".

  internal['[[positivePattern]]'] = stylePatterns.positivePattern; // 41. Set the [[negativePattern]] internal property of numberFormat to the
  //     result of calling the [[Get]] internal method of stylePatterns with the
  //     argument "negativePattern".

  internal['[[negativePattern]]'] = stylePatterns.negativePattern; // 42. Set the [[boundFormat]] internal property of numberFormat to undefined.

  internal['[[boundFormat]]'] = undefined; // 43. Set the [[initializedNumberFormat]] internal property of numberFormat to
  //     true.

  internal['[[initializedNumberFormat]]'] = true; // In ES3, we need to pre-bind the format() function

  if (es3) numberFormat.format = GetFormatNumber.call(numberFormat); // Restore the RegExp properties

  regexpRestore(); // Return the newly initialised object

  return numberFormat;
}

function CurrencyDigits(currency) {
  // When the CurrencyDigits abstract operation is called with an argument currency
  // (which must be an upper case String value), the following steps are taken:
  // 1. If the ISO 4217 currency and funds code list contains currency as an
  // alphabetic code, then return the minor unit value corresponding to the
  // currency from the list; else return 2.
  return currencyMinorUnits[currency] !== undefined ? currencyMinorUnits[currency] : 2;
}
/* 11.2.3 */


internals.NumberFormat = {
  '[[availableLocales]]': [],
  '[[relevantExtensionKeys]]': ['nu'],
  '[[localeData]]': {}
};
/**
 * When the supportedLocalesOf method of Intl.NumberFormat is called, the
 * following steps are taken:
 */

/* 11.2.2 */

defineProperty(Intl.NumberFormat, 'supportedLocalesOf', {
  configurable: true,
  writable: true,
  value: fnBind.call(function (locales) {
    // Bound functions only have the `this` value altered if being used as a constructor,
    // this lets us imitate a native function that has no constructor
    if (!hop.call(this, '[[availableLocales]]')) throw new TypeError('supportedLocalesOf() is not a constructor'); // Create an object whose props can be used to restore the values of RegExp props

    var regexpRestore = createRegExpRestore(),
        // 1. If options is not provided, then let options be undefined.
    options = arguments[1],
        // 2. Let availableLocales be the value of the [[availableLocales]] internal
    //    property of the standard built-in object that is the initial value of
    //    Intl.NumberFormat.
    availableLocales = this['[[availableLocales]]'],
        // 3. Let requestedLocales be the result of calling the CanonicalizeLocaleList
    //    abstract operation (defined in 9.2.1) with argument locales.
    requestedLocales = CanonicalizeLocaleList(locales); // Restore the RegExp properties

    regexpRestore(); // 4. Return the result of calling the SupportedLocales abstract operation
    //    (defined in 9.2.8) with arguments availableLocales, requestedLocales,
    //    and options.

    return SupportedLocales(availableLocales, requestedLocales, options);
  }, internals.NumberFormat)
});
/**
 * This named accessor property returns a function that formats a number
 * according to the effective locale and the formatting options of this
 * NumberFormat object.
 */

/* 11.3.2 */

defineProperty(Intl.NumberFormat.prototype, 'format', {
  configurable: true,
  get: GetFormatNumber
});

function GetFormatNumber() {
  var internal = this !== null && babelHelpers$1["typeof"](this) === 'object' && getInternalProperties(this); // Satisfy test 11.3_b

  if (!internal || !internal['[[initializedNumberFormat]]']) throw new TypeError('`this` value for format() is not an initialized Intl.NumberFormat object.'); // The value of the [[Get]] attribute is a function that takes the following
  // steps:
  // 1. If the [[boundFormat]] internal property of this NumberFormat object
  //    is undefined, then:

  if (internal['[[boundFormat]]'] === undefined) {
    // a. Let F be a Function object, with internal properties set as
    //    specified for built-in functions in ES5, 15, or successor, and the
    //    length property set to 1, that takes the argument value and
    //    performs the following steps:
    var F = function F(value) {
      // i. If value is not provided, then let value be undefined.
      // ii. Let x be ToNumber(value).
      // iii. Return the result of calling the FormatNumber abstract
      //      operation (defined below) with arguments this and x.
      return FormatNumber(this,
      /* x = */
      Number(value));
    }; // b. Let bind be the standard built-in function object defined in ES5,
    //    15.3.4.5.
    // c. Let bf be the result of calling the [[Call]] internal method of
    //    bind with F as the this value and an argument list containing
    //    the single item this.


    var bf = fnBind.call(F, this); // d. Set the [[boundFormat]] internal property of this NumberFormat
    //    object to bf.

    internal['[[boundFormat]]'] = bf;
  } // Return the value of the [[boundFormat]] internal property of this
  // NumberFormat object.


  return internal['[[boundFormat]]'];
}

function formatToParts() {
  var value = arguments.length <= 0 || arguments[0] === undefined ? undefined : arguments[0];
  var internal = this !== null && babelHelpers$1["typeof"](this) === 'object' && getInternalProperties(this);
  if (!internal || !internal['[[initializedNumberFormat]]']) throw new TypeError('`this` value for formatToParts() is not an initialized Intl.NumberFormat object.');
  var x = Number(value);
  return FormatNumberToParts(this, x);
}

Object.defineProperty(Intl.NumberFormat.prototype, 'formatToParts', {
  configurable: true,
  enumerable: false,
  writable: true,
  value: formatToParts
});
/*
 * @spec[stasm/ecma402/number-format-to-parts/spec/numberformat.html]
 * @clause[sec-formatnumbertoparts]
 */

function FormatNumberToParts(numberFormat, x) {
  // 1. Let parts be ? PartitionNumberPattern(numberFormat, x).
  var parts = PartitionNumberPattern(numberFormat, x); // 2. Let result be ArrayCreate(0).

  var result = []; // 3. Let n be 0.

  var n = 0; // 4. For each part in parts, do:

  for (var i = 0; parts.length > i; i++) {
    var part = parts[i]; // a. Let O be ObjectCreate(%ObjectPrototype%).

    var O = {}; // a. Perform ? CreateDataPropertyOrThrow(O, "type", part.[[type]]).

    O.type = part['[[type]]']; // a. Perform ? CreateDataPropertyOrThrow(O, "value", part.[[value]]).

    O.value = part['[[value]]']; // a. Perform ? CreateDataPropertyOrThrow(result, ? ToString(n), O).

    result[n] = O; // a. Increment n by 1.

    n += 1;
  } // 5. Return result.


  return result;
}
/*
 * @spec[stasm/ecma402/number-format-to-parts/spec/numberformat.html]
 * @clause[sec-partitionnumberpattern]
 */


function PartitionNumberPattern(numberFormat, x) {
  var internal = getInternalProperties(numberFormat),
      locale = internal['[[dataLocale]]'],
      nums = internal['[[numberingSystem]]'],
      data = internals.NumberFormat['[[localeData]]'][locale],
      ild = data.symbols[nums] || data.symbols.latn,
      pattern = void 0; // 1. If x is not NaN and x < 0, then:

  if (!isNaN(x) && x < 0) {
    // a. Let x be -x.
    x = -x; // a. Let pattern be the value of numberFormat.[[negativePattern]].

    pattern = internal['[[negativePattern]]'];
  } // 2. Else,
  else {
    // a. Let pattern be the value of numberFormat.[[positivePattern]].
    pattern = internal['[[positivePattern]]'];
  } // 3. Let result be a new empty List.


  var result = new List(); // 4. Let beginIndex be Call(%StringProto_indexOf%, pattern, "{", 0).

  var beginIndex = pattern.indexOf('{', 0); // 5. Let endIndex be 0.

  var endIndex = 0; // 6. Let nextIndex be 0.

  var nextIndex = 0; // 7. Let length be the number of code units in pattern.

  var length = pattern.length; // 8. Repeat while beginIndex is an integer index into pattern:

  while (beginIndex > -1 && beginIndex < length) {
    // a. Set endIndex to Call(%StringProto_indexOf%, pattern, "}", beginIndex)
    endIndex = pattern.indexOf('}', beginIndex); // a. If endIndex = -1, throw new Error exception.

    if (endIndex === -1) throw new Error(); // a. If beginIndex is greater than nextIndex, then:

    if (beginIndex > nextIndex) {
      // i. Let literal be a substring of pattern from position nextIndex, inclusive, to position beginIndex, exclusive.
      var literal = pattern.substring(nextIndex, beginIndex); // ii. Add new part record { [[type]]: "literal", [[value]]: literal } as a new element of the list result.

      arrPush.call(result, {
        '[[type]]': 'literal',
        '[[value]]': literal
      });
    } // a. Let p be the substring of pattern from position beginIndex, exclusive, to position endIndex, exclusive.


    var p = pattern.substring(beginIndex + 1, endIndex); // a. If p is equal "number", then:

    if (p === "number") {
      // i. If x is NaN,
      if (isNaN(x)) {
        // 1. Let n be an ILD String value indicating the NaN value.
        var n = ild.nan; // 2. Add new part record { [[type]]: "nan", [[value]]: n } as a new element of the list result.

        arrPush.call(result, {
          '[[type]]': 'nan',
          '[[value]]': n
        });
      } // ii. Else if isFinite(x) is false,
      else if (!isFinite(x)) {
        // 1. Let n be an ILD String value indicating infinity.
        var _n = ild.infinity; // 2. Add new part record { [[type]]: "infinity", [[value]]: n } as a new element of the list result.

        arrPush.call(result, {
          '[[type]]': 'infinity',
          '[[value]]': _n
        });
      } // iii. Else,
      else {
        // 1. If the value of numberFormat.[[style]] is "percent" and isFinite(x), let x be 100 × x.
        if (internal['[[style]]'] === 'percent' && isFinite(x)) x *= 100;

        var _n2 = void 0; // 2. If the numberFormat.[[minimumSignificantDigits]] and numberFormat.[[maximumSignificantDigits]] are present, then


        if (hop.call(internal, '[[minimumSignificantDigits]]') && hop.call(internal, '[[maximumSignificantDigits]]')) {
          // a. Let n be ToRawPrecision(x, numberFormat.[[minimumSignificantDigits]], numberFormat.[[maximumSignificantDigits]]).
          _n2 = ToRawPrecision(x, internal['[[minimumSignificantDigits]]'], internal['[[maximumSignificantDigits]]']);
        } // 3. Else,
        else {
          // a. Let n be ToRawFixed(x, numberFormat.[[minimumIntegerDigits]], numberFormat.[[minimumFractionDigits]], numberFormat.[[maximumFractionDigits]]).
          _n2 = ToRawFixed(x, internal['[[minimumIntegerDigits]]'], internal['[[minimumFractionDigits]]'], internal['[[maximumFractionDigits]]']);
        } // 4. If the value of the numberFormat.[[numberingSystem]] matches one of the values in the "Numbering System" column of Table 2 below, then


        if (numSys[nums]) {
          (function () {
            // a. Let digits be an array whose 10 String valued elements are the UTF-16 string representations of the 10 digits specified in the "Digits" column of the matching row in Table 2.
            var digits = numSys[nums]; // a. Replace each digit in n with the value of digits[digit].

            _n2 = String(_n2).replace(/\d/g, function (digit) {
              return digits[digit];
            });
          })();
        } // 5. Else use an implementation dependent algorithm to map n to the appropriate representation of n in the given numbering system.
        else _n2 = String(_n2); // ###TODO###


        var integer = void 0;
        var fraction = void 0; // 6. Let decimalSepIndex be Call(%StringProto_indexOf%, n, ".", 0).

        var decimalSepIndex = _n2.indexOf('.', 0); // 7. If decimalSepIndex > 0, then:


        if (decimalSepIndex > 0) {
          // a. Let integer be the substring of n from position 0, inclusive, to position decimalSepIndex, exclusive.
          integer = _n2.substring(0, decimalSepIndex); // a. Let fraction be the substring of n from position decimalSepIndex, exclusive, to the end of n.

          fraction = _n2.substring(decimalSepIndex + 1, decimalSepIndex.length);
        } // 8. Else:
        else {
          // a. Let integer be n.
          integer = _n2; // a. Let fraction be undefined.

          fraction = undefined;
        } // 9. If the value of the numberFormat.[[useGrouping]] is true,


        if (internal['[[useGrouping]]'] === true) {
          // a. Let groupSepSymbol be the ILND String representing the grouping separator.
          var groupSepSymbol = ild.group; // a. Let groups be a List whose elements are, in left to right order, the substrings defined by ILND set of locations within the integer.

          var groups = []; // ----> implementation:
          // Primary group represents the group closest to the decimal

          var pgSize = data.patterns.primaryGroupSize || 3; // Secondary group is every other group

          var sgSize = data.patterns.secondaryGroupSize || pgSize; // Group only if necessary

          if (integer.length > pgSize) {
            // Index of the primary grouping separator
            var end = integer.length - pgSize; // Starting index for our loop

            var idx = end % sgSize;
            var start = integer.slice(0, idx);
            if (start.length) arrPush.call(groups, start); // Loop to separate into secondary grouping digits

            while (idx < end) {
              arrPush.call(groups, integer.slice(idx, idx + sgSize));
              idx += sgSize;
            } // Add the primary grouping digits


            arrPush.call(groups, integer.slice(end));
          } else {
            arrPush.call(groups, integer);
          } // a. Assert: The number of elements in groups List is greater than 0.


          if (groups.length === 0) throw new Error(); // a. Repeat, while groups List is not empty:

          while (groups.length) {
            // i. Remove the first element from groups and let integerGroup be the value of that element.
            var integerGroup = arrShift.call(groups); // ii. Add new part record { [[type]]: "integer", [[value]]: integerGroup } as a new element of the list result.

            arrPush.call(result, {
              '[[type]]': 'integer',
              '[[value]]': integerGroup
            }); // iii. If groups List is not empty, then:

            if (groups.length) {
              // 1. Add new part record { [[type]]: "group", [[value]]: groupSepSymbol } as a new element of the list result.
              arrPush.call(result, {
                '[[type]]': 'group',
                '[[value]]': groupSepSymbol
              });
            }
          }
        } // 10. Else,
        else {
          // a. Add new part record { [[type]]: "integer", [[value]]: integer } as a new element of the list result.
          arrPush.call(result, {
            '[[type]]': 'integer',
            '[[value]]': integer
          });
        } // 11. If fraction is not undefined, then:


        if (fraction !== undefined) {
          // a. Let decimalSepSymbol be the ILND String representing the decimal separator.
          var decimalSepSymbol = ild.decimal; // a. Add new part record { [[type]]: "decimal", [[value]]: decimalSepSymbol } as a new element of the list result.

          arrPush.call(result, {
            '[[type]]': 'decimal',
            '[[value]]': decimalSepSymbol
          }); // a. Add new part record { [[type]]: "fraction", [[value]]: fraction } as a new element of the list result.

          arrPush.call(result, {
            '[[type]]': 'fraction',
            '[[value]]': fraction
          });
        }
      }
    } // a. Else if p is equal "plusSign", then:
    else if (p === "plusSign") {
      // i. Let plusSignSymbol be the ILND String representing the plus sign.
      var plusSignSymbol = ild.plusSign; // ii. Add new part record { [[type]]: "plusSign", [[value]]: plusSignSymbol } as a new element of the list result.

      arrPush.call(result, {
        '[[type]]': 'plusSign',
        '[[value]]': plusSignSymbol
      });
    } // a. Else if p is equal "minusSign", then:
    else if (p === "minusSign") {
      // i. Let minusSignSymbol be the ILND String representing the minus sign.
      var minusSignSymbol = ild.minusSign; // ii. Add new part record { [[type]]: "minusSign", [[value]]: minusSignSymbol } as a new element of the list result.

      arrPush.call(result, {
        '[[type]]': 'minusSign',
        '[[value]]': minusSignSymbol
      });
    } // a. Else if p is equal "percentSign" and numberFormat.[[style]] is "percent", then:
    else if (p === "percentSign" && internal['[[style]]'] === "percent") {
      // i. Let percentSignSymbol be the ILND String representing the percent sign.
      var percentSignSymbol = ild.percentSign; // ii. Add new part record { [[type]]: "percentSign", [[value]]: percentSignSymbol } as a new element of the list result.

      arrPush.call(result, {
        '[[type]]': 'literal',
        '[[value]]': percentSignSymbol
      });
    } // a. Else if p is equal "currency" and numberFormat.[[style]] is "currency", then:
    else if (p === "currency" && internal['[[style]]'] === "currency") {
      // i. Let currency be the value of numberFormat.[[currency]].
      var currency = internal['[[currency]]'];
      var cd = void 0; // ii. If numberFormat.[[currencyDisplay]] is "code", then

      if (internal['[[currencyDisplay]]'] === "code") {
        // 1. Let cd be currency.
        cd = currency;
      } // iii. Else if numberFormat.[[currencyDisplay]] is "symbol", then
      else if (internal['[[currencyDisplay]]'] === "symbol") {
        // 1. Let cd be an ILD string representing currency in short form. If the implementation does not have such a representation of currency, use currency itself.
        cd = data.currencies[currency] || currency;
      } // iv. Else if numberFormat.[[currencyDisplay]] is "name", then
      else if (internal['[[currencyDisplay]]'] === "name") {
        // 1. Let cd be an ILD string representing currency in long form. If the implementation does not have such a representation of currency, then use currency itself.
        cd = currency;
      } // v. Add new part record { [[type]]: "currency", [[value]]: cd } as a new element of the list result.


      arrPush.call(result, {
        '[[type]]': 'currency',
        '[[value]]': cd
      });
    } // a. Else,
    else {
      // i. Let literal be the substring of pattern from position beginIndex, inclusive, to position endIndex, inclusive.
      var _literal = pattern.substring(beginIndex, endIndex); // ii. Add new part record { [[type]]: "literal", [[value]]: literal } as a new element of the list result.


      arrPush.call(result, {
        '[[type]]': 'literal',
        '[[value]]': _literal
      });
    } // a. Set nextIndex to endIndex + 1.


    nextIndex = endIndex + 1; // a. Set beginIndex to Call(%StringProto_indexOf%, pattern, "{", nextIndex)

    beginIndex = pattern.indexOf('{', nextIndex);
  } // 9. If nextIndex is less than length, then:


  if (nextIndex < length) {
    // a. Let literal be the substring of pattern from position nextIndex, inclusive, to position length, exclusive.
    var _literal2 = pattern.substring(nextIndex, length); // a. Add new part record { [[type]]: "literal", [[value]]: literal } as a new element of the list result.


    arrPush.call(result, {
      '[[type]]': 'literal',
      '[[value]]': _literal2
    });
  } // 10. Return result.


  return result;
}
/*
 * @spec[stasm/ecma402/number-format-to-parts/spec/numberformat.html]
 * @clause[sec-formatnumber]
 */


function FormatNumber(numberFormat, x) {
  // 1. Let parts be ? PartitionNumberPattern(numberFormat, x).
  var parts = PartitionNumberPattern(numberFormat, x); // 2. Let result be an empty String.

  var result = ''; // 3. For each part in parts, do:

  for (var i = 0; parts.length > i; i++) {
    var part = parts[i]; // a. Set result to a String value produced by concatenating result and part.[[value]].

    result += part['[[value]]'];
  } // 4. Return result.


  return result;
}
/**
 * When the ToRawPrecision abstract operation is called with arguments x (which
 * must be a finite non-negative number), minPrecision, and maxPrecision (both
 * must be integers between 1 and 21) the following steps are taken:
 */


function ToRawPrecision(x, minPrecision, maxPrecision) {
  // 1. Let p be maxPrecision.
  var p = maxPrecision;
  var m = void 0,
      e = void 0; // 2. If x = 0, then

  if (x === 0) {
    // a. Let m be the String consisting of p occurrences of the character "0".
    m = arrJoin.call(Array(p + 1), '0'); // b. Let e be 0.

    e = 0;
  } // 3. Else
  else {
    // a. Let e and n be integers such that 10ᵖ⁻¹ ≤ n < 10ᵖ and for which the
    //    exact mathematical value of n × 10ᵉ⁻ᵖ⁺¹ – x is as close to zero as
    //    possible. If there are two such sets of e and n, pick the e and n for
    //    which n × 10ᵉ⁻ᵖ⁺¹ is larger.
    e = log10Floor(Math.abs(x)); // Easier to get to m from here

    var f = Math.round(Math.exp(Math.abs(e - p + 1) * Math.LN10)); // b. Let m be the String consisting of the digits of the decimal
    //    representation of n (in order, with no leading zeroes)

    m = String(Math.round(e - p + 1 < 0 ? x * f : x / f));
  } // 4. If e ≥ p, then


  if (e >= p) // a. Return the concatenation of m and e-p+1 occurrences of the character "0".
    return m + arrJoin.call(Array(e - p + 1 + 1), '0'); // 5. If e = p-1, then
  else if (e === p - 1) // a. Return m.
    return m; // 6. If e ≥ 0, then
  else if (e >= 0) // a. Let m be the concatenation of the first e+1 characters of m, the character
    //    ".", and the remaining p–(e+1) characters of m.
    m = m.slice(0, e + 1) + '.' + m.slice(e + 1); // 7. If e < 0, then
  else if (e < 0) // a. Let m be the concatenation of the String "0.", –(e+1) occurrences of the
    //    character "0", and the string m.
    m = '0.' + arrJoin.call(Array(-(e + 1) + 1), '0') + m; // 8. If m contains the character ".", and maxPrecision > minPrecision, then

  if (m.indexOf(".") >= 0 && maxPrecision > minPrecision) {
    // a. Let cut be maxPrecision – minPrecision.
    var cut = maxPrecision - minPrecision; // b. Repeat while cut > 0 and the last character of m is "0":

    while (cut > 0 && m.charAt(m.length - 1) === '0') {
      //  i. Remove the last character from m.
      m = m.slice(0, -1); //  ii. Decrease cut by 1.

      cut--;
    } // c. If the last character of m is ".", then


    if (m.charAt(m.length - 1) === '.') //    i. Remove the last character from m.
      m = m.slice(0, -1);
  } // 9. Return m.


  return m;
}
/**
 * @spec[tc39/ecma402/master/spec/numberformat.html]
 * @clause[sec-torawfixed]
 * When the ToRawFixed abstract operation is called with arguments x (which must
 * be a finite non-negative number), minInteger (which must be an integer between
 * 1 and 21), minFraction, and maxFraction (which must be integers between 0 and
 * 20) the following steps are taken:
 */


function ToRawFixed(x, minInteger, minFraction, maxFraction) {
  // 1. Let f be maxFraction.
  var f = maxFraction; // 2. Let n be an integer for which the exact mathematical value of n ÷ 10f – x is as close to zero as possible. If there are two such n, pick the larger n.

  var n = Math.pow(10, f) * x; // diverging...
  // 3. If n = 0, let m be the String "0". Otherwise, let m be the String consisting of the digits of the decimal representation of n (in order, with no leading zeroes).

  var m = n === 0 ? "0" : n.toFixed(0); // divering...

  {
    // this diversion is needed to take into consideration big numbers, e.g.:
    // 1.2344501e+37 -> 12344501000000000000000000000000000000
    var idx = void 0;
    var exp = (idx = m.indexOf('e')) > -1 ? m.slice(idx + 1) : 0;

    if (exp) {
      m = m.slice(0, idx).replace('.', '');
      m += arrJoin.call(Array(exp - (m.length - 1) + 1), '0');
    }
  }
  var int = void 0; // 4. If f ≠ 0, then

  if (f !== 0) {
    // a. Let k be the number of characters in m.
    var k = m.length; // a. If k ≤ f, then

    if (k <= f) {
      // i. Let z be the String consisting of f+1–k occurrences of the character "0".
      var z = arrJoin.call(Array(f + 1 - k + 1), '0'); // ii. Let m be the concatenation of Strings z and m.

      m = z + m; // iii. Let k be f+1.

      k = f + 1;
    } // a. Let a be the first k–f characters of m, and let b be the remaining f characters of m.


    var a = m.substring(0, k - f),
        b = m.substring(k - f, m.length); // a. Let m be the concatenation of the three Strings a, ".", and b.

    m = a + "." + b; // a. Let int be the number of characters in a.

    int = a.length;
  } // 5. Else, let int be the number of characters in m.
  else int = m.length; // 6. Let cut be maxFraction – minFraction.


  var cut = maxFraction - minFraction; // 7. Repeat while cut > 0 and the last character of m is "0":

  while (cut > 0 && m.slice(-1) === "0") {
    // a. Remove the last character from m.
    m = m.slice(0, -1); // a. Decrease cut by 1.

    cut--;
  } // 8. If the last character of m is ".", then


  if (m.slice(-1) === ".") {
    // a. Remove the last character from m.
    m = m.slice(0, -1);
  } // 9. If int < minInteger, then


  if (int < minInteger) {
    // a. Let z be the String consisting of minInteger–int occurrences of the character "0".
    var _z = arrJoin.call(Array(minInteger - int + 1), '0'); // a. Let m be the concatenation of Strings z and m.


    m = _z + m;
  } // 10. Return m.


  return m;
} // Sect 11.3.2 Table 2, Numbering systems
// ======================================


var numSys = {
  arab: ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"],
  arabext: ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"],
  bali: ["᭐", "᭑", "᭒", "᭓", "᭔", "᭕", "᭖", "᭗", "᭘", "᭙"],
  beng: ["০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯"],
  deva: ["०", "१", "२", "३", "४", "५", "६", "७", "८", "९"],
  fullwide: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
  gujr: ["૦", "૧", "૨", "૩", "૪", "૫", "૬", "૭", "૮", "૯"],
  guru: ["੦", "੧", "੨", "੩", "੪", "੫", "੬", "੭", "੮", "੯"],
  hanidec: ["〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"],
  khmr: ["០", "១", "២", "៣", "៤", "៥", "៦", "៧", "៨", "៩"],
  knda: ["೦", "೧", "೨", "೩", "೪", "೫", "೬", "೭", "೮", "೯"],
  laoo: ["໐", "໑", "໒", "໓", "໔", "໕", "໖", "໗", "໘", "໙"],
  latn: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
  limb: ["᥆", "᥇", "᥈", "᥉", "᥊", "᥋", "᥌", "᥍", "᥎", "᥏"],
  mlym: ["൦", "൧", "൨", "൩", "൪", "൫", "൬", "൭", "൮", "൯"],
  mong: ["᠐", "᠑", "᠒", "᠓", "᠔", "᠕", "᠖", "᠗", "᠘", "᠙"],
  mymr: ["၀", "၁", "၂", "၃", "၄", "၅", "၆", "၇", "၈", "၉"],
  orya: ["୦", "୧", "୨", "୩", "୪", "୫", "୬", "୭", "୮", "୯"],
  tamldec: ["௦", "௧", "௨", "௩", "௪", "௫", "௬", "௭", "௮", "௯"],
  telu: ["౦", "౧", "౨", "౩", "౪", "౫", "౬", "౭", "౮", "౯"],
  thai: ["๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙"],
  tibt: ["༠", "༡", "༢", "༣", "༤", "༥", "༦", "༧", "༨", "༩"]
};
/**
 * This function provides access to the locale and formatting options computed
 * during initialization of the object.
 *
 * The function returns a new object whose properties and attributes are set as
 * if constructed by an object literal assigning to each of the following
 * properties the value of the corresponding internal property of this
 * NumberFormat object (see 11.4): locale, numberingSystem, style, currency,
 * currencyDisplay, minimumIntegerDigits, minimumFractionDigits,
 * maximumFractionDigits, minimumSignificantDigits, maximumSignificantDigits, and
 * useGrouping. Properties whose corresponding internal properties are not present
 * are not assigned.
 */

/* 11.3.3 */

defineProperty(Intl.NumberFormat.prototype, 'resolvedOptions', {
  configurable: true,
  writable: true,
  value: function value() {
    var prop = void 0,
        descs = new Record(),
        props = ['locale', 'numberingSystem', 'style', 'currency', 'currencyDisplay', 'minimumIntegerDigits', 'minimumFractionDigits', 'maximumFractionDigits', 'minimumSignificantDigits', 'maximumSignificantDigits', 'useGrouping'],
        internal = this !== null && babelHelpers$1["typeof"](this) === 'object' && getInternalProperties(this); // Satisfy test 11.3_b

    if (!internal || !internal['[[initializedNumberFormat]]']) throw new TypeError('`this` value for resolvedOptions() is not an initialized Intl.NumberFormat object.');

    for (var i = 0, max = props.length; i < max; i++) {
      if (hop.call(internal, prop = '[[' + props[i] + ']]')) descs[props[i]] = {
        value: internal[prop],
        writable: true,
        configurable: true,
        enumerable: true
      };
    }

    return objCreate({}, descs);
  }
});
/* jslint esnext: true */
// Match these datetime components in a CLDR pattern, except those in single quotes

var expDTComponents = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g; // trim patterns after transformations

var expPatternTrimmer = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; // Skip over patterns with these datetime components because we don't have data
// to back them up:
// timezone, weekday, amoung others

var unwantedDTCs = /[rqQASjJgwWIQq]/; // xXVO were removed from this list in favor of computing matches with timeZoneName values but printing as empty string

var dtKeys = ["era", "year", "month", "day", "weekday", "quarter"];
var tmKeys = ["hour", "minute", "second", "hour12", "timeZoneName"];

function isDateFormatOnly(obj) {
  for (var i = 0; i < tmKeys.length; i += 1) {
    if (obj.hasOwnProperty(tmKeys[i])) {
      return false;
    }
  }

  return true;
}

function isTimeFormatOnly(obj) {
  for (var i = 0; i < dtKeys.length; i += 1) {
    if (obj.hasOwnProperty(dtKeys[i])) {
      return false;
    }
  }

  return true;
}

function joinDateAndTimeFormats(dateFormatObj, timeFormatObj) {
  var o = {
    _: {}
  };

  for (var i = 0; i < dtKeys.length; i += 1) {
    if (dateFormatObj[dtKeys[i]]) {
      o[dtKeys[i]] = dateFormatObj[dtKeys[i]];
    }

    if (dateFormatObj._[dtKeys[i]]) {
      o._[dtKeys[i]] = dateFormatObj._[dtKeys[i]];
    }
  }

  for (var j = 0; j < tmKeys.length; j += 1) {
    if (timeFormatObj[tmKeys[j]]) {
      o[tmKeys[j]] = timeFormatObj[tmKeys[j]];
    }

    if (timeFormatObj._[tmKeys[j]]) {
      o._[tmKeys[j]] = timeFormatObj._[tmKeys[j]];
    }
  }

  return o;
}

function computeFinalPatterns(formatObj) {
  // From http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Format_Patterns:
  //  'In patterns, two single quotes represents a literal single quote, either
  //   inside or outside single quotes. Text within single quotes is not
  //   interpreted in any way (except for two adjacent single quotes).'
  formatObj.pattern12 = formatObj.extendedPattern.replace(/'([^']*)'/g, function ($0, literal) {
    return literal ? literal : "'";
  }); // pattern 12 is always the default. we can produce the 24 by removing {ampm}

  formatObj.pattern = formatObj.pattern12.replace('{ampm}', '').replace(expPatternTrimmer, '');
  return formatObj;
}

function expDTComponentsMeta($0, formatObj) {
  switch ($0.charAt(0)) {
    // --- Era
    case 'G':
      formatObj.era = ['short', 'short', 'short', 'long', 'narrow'][$0.length - 1];
      return '{era}';
    // --- Year

    case 'y':
    case 'Y':
    case 'u':
    case 'U':
    case 'r':
      formatObj.year = $0.length === 2 ? '2-digit' : 'numeric';
      return '{year}';
    // --- Quarter (not supported in this polyfill)

    case 'Q':
    case 'q':
      formatObj.quarter = ['numeric', '2-digit', 'short', 'long', 'narrow'][$0.length - 1];
      return '{quarter}';
    // --- Month

    case 'M':
    case 'L':
      formatObj.month = ['numeric', '2-digit', 'short', 'long', 'narrow'][$0.length - 1];
      return '{month}';
    // --- Week (not supported in this polyfill)

    case 'w':
      // week of the year
      formatObj.week = $0.length === 2 ? '2-digit' : 'numeric';
      return '{weekday}';

    case 'W':
      // week of the month
      formatObj.week = 'numeric';
      return '{weekday}';
    // --- Day

    case 'd':
      // day of the month
      formatObj.day = $0.length === 2 ? '2-digit' : 'numeric';
      return '{day}';

    case 'D': // day of the year

    case 'F': // day of the week

    case 'g':
      // 1..n: Modified Julian day
      formatObj.day = 'numeric';
      return '{day}';
    // --- Week Day

    case 'E':
      // day of the week
      formatObj.weekday = ['short', 'short', 'short', 'long', 'narrow', 'short'][$0.length - 1];
      return '{weekday}';

    case 'e':
      // local day of the week
      formatObj.weekday = ['numeric', '2-digit', 'short', 'long', 'narrow', 'short'][$0.length - 1];
      return '{weekday}';

    case 'c':
      // stand alone local day of the week
      formatObj.weekday = ['numeric', undefined, 'short', 'long', 'narrow', 'short'][$0.length - 1];
      return '{weekday}';
    // --- Period

    case 'a': // AM, PM

    case 'b': // am, pm, noon, midnight

    case 'B':
      // flexible day periods
      formatObj.hour12 = true;
      return '{ampm}';
    // --- Hour

    case 'h':
    case 'H':
      formatObj.hour = $0.length === 2 ? '2-digit' : 'numeric';
      return '{hour}';

    case 'k':
    case 'K':
      formatObj.hour12 = true; // 12-hour-cycle time formats (using h or K)

      formatObj.hour = $0.length === 2 ? '2-digit' : 'numeric';
      return '{hour}';
    // --- Minute

    case 'm':
      formatObj.minute = $0.length === 2 ? '2-digit' : 'numeric';
      return '{minute}';
    // --- Second

    case 's':
      formatObj.second = $0.length === 2 ? '2-digit' : 'numeric';
      return '{second}';

    case 'S':
    case 'A':
      formatObj.second = 'numeric';
      return '{second}';
    // --- Timezone

    case 'z': // 1..3, 4: specific non-location format

    case 'Z': // 1..3, 4, 5: The ISO8601 varios formats

    case 'O': // 1, 4: miliseconds in day short, long

    case 'v': // 1, 4: generic non-location format

    case 'V': // 1, 2, 3, 4: time zone ID or city

    case 'X': // 1, 2, 3, 4: The ISO8601 varios formats

    case 'x':
      // 1, 2, 3, 4: The ISO8601 varios formats
      // this polyfill only supports much, for now, we are just doing something dummy
      formatObj.timeZoneName = $0.length < 4 ? 'short' : 'long';
      return '{timeZoneName}';
  }
}
/**
 * Converts the CLDR availableFormats into the objects and patterns required by
 * the ECMAScript Internationalization API specification.
 */


function createDateTimeFormat(skeleton, pattern) {
  // we ignore certain patterns that are unsupported to avoid this expensive op.
  if (unwantedDTCs.test(pattern)) return undefined;
  var formatObj = {
    originalPattern: pattern,
    _: {}
  }; // Replace the pattern string with the one required by the specification, whilst
  // at the same time evaluating it for the subsets and formats

  formatObj.extendedPattern = pattern.replace(expDTComponents, function ($0) {
    // See which symbol we're dealing with
    return expDTComponentsMeta($0, formatObj._);
  }); // Match the skeleton string with the one required by the specification
  // this implementation is based on the Date Field Symbol Table:
  // http://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
  // Note: we are adding extra data to the formatObject even though this polyfill
  //       might not support it.

  skeleton.replace(expDTComponents, function ($0) {
    // See which symbol we're dealing with
    return expDTComponentsMeta($0, formatObj);
  });
  return computeFinalPatterns(formatObj);
}
/**
 * Processes DateTime formats from CLDR to an easier-to-parse format.
 * the result of this operation should be cached the first time a particular
 * calendar is analyzed.
 *
 * The specification requires we support at least the following subsets of
 * date/time components:
 *
 *   - 'weekday', 'year', 'month', 'day', 'hour', 'minute', 'second'
 *   - 'weekday', 'year', 'month', 'day'
 *   - 'year', 'month', 'day'
 *   - 'year', 'month'
 *   - 'month', 'day'
 *   - 'hour', 'minute', 'second'
 *   - 'hour', 'minute'
 *
 * We need to cherry pick at least these subsets from the CLDR data and convert
 * them into the pattern objects used in the ECMA-402 API.
 */


function createDateTimeFormats(formats) {
  var availableFormats = formats.availableFormats;
  var timeFormats = formats.timeFormats;
  var dateFormats = formats.dateFormats;
  var result = [];
  var skeleton = void 0,
      pattern = void 0,
      computed = void 0,
      i = void 0,
      j = void 0;
  var timeRelatedFormats = [];
  var dateRelatedFormats = []; // Map available (custom) formats into a pattern for createDateTimeFormats

  for (skeleton in availableFormats) {
    if (availableFormats.hasOwnProperty(skeleton)) {
      pattern = availableFormats[skeleton];
      computed = createDateTimeFormat(skeleton, pattern);

      if (computed) {
        result.push(computed); // in some cases, the format is only displaying date specific props
        // or time specific props, in which case we need to also produce the
        // combined formats.

        if (isDateFormatOnly(computed)) {
          dateRelatedFormats.push(computed);
        } else if (isTimeFormatOnly(computed)) {
          timeRelatedFormats.push(computed);
        }
      }
    }
  } // Map time formats into a pattern for createDateTimeFormats


  for (skeleton in timeFormats) {
    if (timeFormats.hasOwnProperty(skeleton)) {
      pattern = timeFormats[skeleton];
      computed = createDateTimeFormat(skeleton, pattern);

      if (computed) {
        result.push(computed);
        timeRelatedFormats.push(computed);
      }
    }
  } // Map date formats into a pattern for createDateTimeFormats


  for (skeleton in dateFormats) {
    if (dateFormats.hasOwnProperty(skeleton)) {
      pattern = dateFormats[skeleton];
      computed = createDateTimeFormat(skeleton, pattern);

      if (computed) {
        result.push(computed);
        dateRelatedFormats.push(computed);
      }
    }
  } // combine custom time and custom date formats when they are orthogonals to complete the
  // formats supported by CLDR.
  // This Algo is based on section "Missing Skeleton Fields" from:
  // http://unicode.org/reports/tr35/tr35-dates.html#availableFormats_appendItems


  for (i = 0; i < timeRelatedFormats.length; i += 1) {
    for (j = 0; j < dateRelatedFormats.length; j += 1) {
      if (dateRelatedFormats[j].month === 'long') {
        pattern = dateRelatedFormats[j].weekday ? formats.full : formats.long;
      } else if (dateRelatedFormats[j].month === 'short') {
        pattern = formats.medium;
      } else {
        pattern = formats.short;
      }

      computed = joinDateAndTimeFormats(dateRelatedFormats[j], timeRelatedFormats[i]);
      computed.originalPattern = pattern;
      computed.extendedPattern = pattern.replace('{0}', timeRelatedFormats[i].extendedPattern).replace('{1}', dateRelatedFormats[j].extendedPattern).replace(/^[,\s]+|[,\s]+$/gi, '');
      result.push(computeFinalPatterns(computed));
    }
  }

  return result;
} // this represents the exceptions of the rule that are not covered by CLDR availableFormats
// for single property configurations, they play no role when using multiple properties, and
// those that are not in this table, are not exceptions or are not covered by the data we
// provide.


var validSyntheticProps = {
  second: {
    numeric: 's',
    '2-digit': 'ss'
  },
  minute: {
    numeric: 'm',
    '2-digit': 'mm'
  },
  year: {
    numeric: 'y',
    '2-digit': 'yy'
  },
  day: {
    numeric: 'd',
    '2-digit': 'dd'
  },
  month: {
    numeric: 'L',
    '2-digit': 'LL',
    narrow: 'LLLLL',
    short: 'LLL',
    long: 'LLLL'
  },
  weekday: {
    narrow: 'ccccc',
    short: 'ccc',
    long: 'cccc'
  }
};

function generateSyntheticFormat(propName, propValue) {
  if (validSyntheticProps[propName] && validSyntheticProps[propName][propValue]) {
    var _ref2;

    return _ref2 = {
      originalPattern: validSyntheticProps[propName][propValue],
      _: defineProperty$1({}, propName, propValue),
      extendedPattern: "{" + propName + "}"
    }, defineProperty$1(_ref2, propName, propValue), defineProperty$1(_ref2, "pattern12", "{" + propName + "}"), defineProperty$1(_ref2, "pattern", "{" + propName + "}"), _ref2;
  }
} // An object map of date component keys, saves using a regex later


var dateWidths = objCreate(null, {
  narrow: {},
  short: {},
  long: {}
});
/**
 * Returns a string for a date component, resolved using multiple inheritance as specified
 * as specified in the Unicode Technical Standard 35.
 */

function resolveDateString(data, ca, component, width, key) {
  // From http://www.unicode.org/reports/tr35/tr35.html#Multiple_Inheritance:
  // 'In clearly specified instances, resources may inherit from within the same locale.
  //  For example, ... the Buddhist calendar inherits from the Gregorian calendar.'
  var obj = data[ca] && data[ca][component] ? data[ca][component] : data.gregory[component],
      // "sideways" inheritance resolves strings when a key doesn't exist
  alts = {
    narrow: ['short', 'long'],
    short: ['long', 'narrow'],
    long: ['short', 'narrow']
  },
      //
  resolved = hop.call(obj, width) ? obj[width] : hop.call(obj, alts[width][0]) ? obj[alts[width][0]] : obj[alts[width][1]]; // `key` wouldn't be specified for components 'dayPeriods'

  return key !== null ? resolved[key] : resolved;
} // Define the DateTimeFormat constructor internally so it cannot be tainted


function DateTimeFormatConstructor() {
  var locales = arguments[0];
  var options = arguments[1];

  if (!this || this === Intl) {
    return new Intl.DateTimeFormat(locales, options);
  }

  return InitializeDateTimeFormat(toObject(this), locales, options);
}

defineProperty(Intl, 'DateTimeFormat', {
  configurable: true,
  writable: true,
  value: DateTimeFormatConstructor
}); // Must explicitly set prototypes as unwritable

defineProperty(DateTimeFormatConstructor, 'prototype', {
  writable: false
});
/**
 * The abstract operation InitializeDateTimeFormat accepts the arguments dateTimeFormat
 * (which must be an object), locales, and options. It initializes dateTimeFormat as a
 * DateTimeFormat object.
 */

function
/* 12.1.1.1 */
InitializeDateTimeFormat(dateTimeFormat, locales, options) {
  // This will be a internal properties object if we're not already initialized
  var internal = getInternalProperties(dateTimeFormat); // Create an object whose props can be used to restore the values of RegExp props

  var regexpRestore = createRegExpRestore(); // 1. If dateTimeFormat has an [[initializedIntlObject]] internal property with
  //    value true, throw a TypeError exception.

  if (internal['[[initializedIntlObject]]'] === true) throw new TypeError('`this` object has already been initialized as an Intl object'); // Need this to access the `internal` object

  defineProperty(dateTimeFormat, '__getInternalProperties', {
    value: function value() {
      // NOTE: Non-standard, for internal use only
      if (arguments[0] === secret) return internal;
    }
  }); // 2. Set the [[initializedIntlObject]] internal property of numberFormat to true.

  internal['[[initializedIntlObject]]'] = true; // 3. Let requestedLocales be the result of calling the CanonicalizeLocaleList
  //    abstract operation (defined in 9.2.1) with argument locales.

  var requestedLocales = CanonicalizeLocaleList(locales); // 4. Let options be the result of calling the ToDateTimeOptions abstract
  //    operation (defined below) with arguments options, "any", and "date".

  options = ToDateTimeOptions(options, 'any', 'date'); // 5. Let opt be a new Record.

  var opt = new Record(); // 6. Let matcher be the result of calling the GetOption abstract operation
  //    (defined in 9.2.9) with arguments options, "localeMatcher", "string", a List
  //    containing the two String values "lookup" and "best fit", and "best fit".

  var matcher = GetOption(options, 'localeMatcher', 'string', new List('lookup', 'best fit'), 'best fit'); // 7. Set opt.[[localeMatcher]] to matcher.

  opt['[[localeMatcher]]'] = matcher; // 8. Let DateTimeFormat be the standard built-in object that is the initial
  //    value of Intl.DateTimeFormat.

  var DateTimeFormat = internals.DateTimeFormat; // This is what we *really* need
  // 9. Let localeData be the value of the [[localeData]] internal property of
  //    DateTimeFormat.

  var localeData = DateTimeFormat['[[localeData]]']; // 10. Let r be the result of calling the ResolveLocale abstract operation
  //     (defined in 9.2.5) with the [[availableLocales]] internal property of
  //      DateTimeFormat, requestedLocales, opt, the [[relevantExtensionKeys]]
  //      internal property of DateTimeFormat, and localeData.

  var r = ResolveLocale(DateTimeFormat['[[availableLocales]]'], requestedLocales, opt, DateTimeFormat['[[relevantExtensionKeys]]'], localeData); // 11. Set the [[locale]] internal property of dateTimeFormat to the value of
  //     r.[[locale]].

  internal['[[locale]]'] = r['[[locale]]']; // 12. Set the [[calendar]] internal property of dateTimeFormat to the value of
  //     r.[[ca]].

  internal['[[calendar]]'] = r['[[ca]]']; // 13. Set the [[numberingSystem]] internal property of dateTimeFormat to the value of
  //     r.[[nu]].

  internal['[[numberingSystem]]'] = r['[[nu]]']; // The specification doesn't tell us to do this, but it's helpful later on

  internal['[[dataLocale]]'] = r['[[dataLocale]]']; // 14. Let dataLocale be the value of r.[[dataLocale]].

  var dataLocale = r['[[dataLocale]]']; // 15. Let tz be the result of calling the [[Get]] internal method of options with
  //     argument "timeZone".

  var tz = options.timeZone; // 16. If tz is not undefined, then

  if (tz !== undefined) {
    // a. Let tz be ToString(tz).
    // b. Convert tz to upper case as described in 6.1.
    //    NOTE: If an implementation accepts additional time zone values, as permitted
    //          under certain conditions by the Conformance clause, different casing
    //          rules apply.
    tz = toLatinUpperCase(tz); // c. If tz is not "UTC", then throw a RangeError exception.
    // ###TODO: accept more time zones###

    if (tz !== 'UTC') throw new RangeError('timeZone is not supported.');
  } // 17. Set the [[timeZone]] internal property of dateTimeFormat to tz.


  internal['[[timeZone]]'] = tz; // 18. Let opt be a new Record.

  opt = new Record(); // 19. For each row of Table 3, except the header row, do:

  for (var prop in dateTimeComponents) {
    if (!hop.call(dateTimeComponents, prop)) continue; // 20. Let prop be the name given in the Property column of the row.
    // 21. Let value be the result of calling the GetOption abstract operation,
    //     passing as argument options, the name given in the Property column of the
    //     row, "string", a List containing the strings given in the Values column of
    //     the row, and undefined.

    var value = GetOption(options, prop, 'string', dateTimeComponents[prop]); // 22. Set opt.[[<prop>]] to value.

    opt['[[' + prop + ']]'] = value;
  } // Assigned a value below


  var bestFormat = void 0; // 23. Let dataLocaleData be the result of calling the [[Get]] internal method of
  //     localeData with argument dataLocale.

  var dataLocaleData = localeData[dataLocale]; // 24. Let formats be the result of calling the [[Get]] internal method of
  //     dataLocaleData with argument "formats".
  //     Note: we process the CLDR formats into the spec'd structure

  var formats = ToDateTimeFormats(dataLocaleData.formats); // 25. Let matcher be the result of calling the GetOption abstract operation with
  //     arguments options, "formatMatcher", "string", a List containing the two String
  //     values "basic" and "best fit", and "best fit".

  matcher = GetOption(options, 'formatMatcher', 'string', new List('basic', 'best fit'), 'best fit'); // Optimization: caching the processed formats as a one time operation by
  // replacing the initial structure from localeData

  dataLocaleData.formats = formats; // 26. If matcher is "basic", then

  if (matcher === 'basic') {
    // 27. Let bestFormat be the result of calling the BasicFormatMatcher abstract
    //     operation (defined below) with opt and formats.
    bestFormat = BasicFormatMatcher(opt, formats); // 28. Else
  } else {
    {
      // diverging
      var _hr = GetOption(options, 'hour12', 'boolean'
      /*, undefined, undefined*/
      );

      opt.hour12 = _hr === undefined ? dataLocaleData.hour12 : _hr;
    } // 29. Let bestFormat be the result of calling the BestFitFormatMatcher
    //     abstract operation (defined below) with opt and formats.

    bestFormat = BestFitFormatMatcher(opt, formats);
  } // 30. For each row in Table 3, except the header row, do


  for (var _prop in dateTimeComponents) {
    if (!hop.call(dateTimeComponents, _prop)) continue; // a. Let prop be the name given in the Property column of the row.
    // b. Let pDesc be the result of calling the [[GetOwnProperty]] internal method of
    //    bestFormat with argument prop.
    // c. If pDesc is not undefined, then

    if (hop.call(bestFormat, _prop)) {
      // i. Let p be the result of calling the [[Get]] internal method of bestFormat
      //    with argument prop.
      var p = bestFormat[_prop];
      {
        // diverging
        p = bestFormat._ && hop.call(bestFormat._, _prop) ? bestFormat._[_prop] : p;
      } // ii. Set the [[<prop>]] internal property of dateTimeFormat to p.

      internal['[[' + _prop + ']]'] = p;
    }
  }

  var pattern = void 0; // Assigned a value below
  // 31. Let hr12 be the result of calling the GetOption abstract operation with
  //     arguments options, "hour12", "boolean", undefined, and undefined.

  var hr12 = GetOption(options, 'hour12', 'boolean'
  /*, undefined, undefined*/
  ); // 32. If dateTimeFormat has an internal property [[hour]], then

  if (internal['[[hour]]']) {
    // a. If hr12 is undefined, then let hr12 be the result of calling the [[Get]]
    //    internal method of dataLocaleData with argument "hour12".
    hr12 = hr12 === undefined ? dataLocaleData.hour12 : hr12; // b. Set the [[hour12]] internal property of dateTimeFormat to hr12.

    internal['[[hour12]]'] = hr12; // c. If hr12 is true, then

    if (hr12 === true) {
      // i. Let hourNo0 be the result of calling the [[Get]] internal method of
      //    dataLocaleData with argument "hourNo0".
      var hourNo0 = dataLocaleData.hourNo0; // ii. Set the [[hourNo0]] internal property of dateTimeFormat to hourNo0.

      internal['[[hourNo0]]'] = hourNo0; // iii. Let pattern be the result of calling the [[Get]] internal method of
      //      bestFormat with argument "pattern12".

      pattern = bestFormat.pattern12;
    } // d. Else
    else // i. Let pattern be the result of calling the [[Get]] internal method of
      //    bestFormat with argument "pattern".
      pattern = bestFormat.pattern;
  } // 33. Else
  else // a. Let pattern be the result of calling the [[Get]] internal method of
    //    bestFormat with argument "pattern".
    pattern = bestFormat.pattern; // 34. Set the [[pattern]] internal property of dateTimeFormat to pattern.


  internal['[[pattern]]'] = pattern; // 35. Set the [[boundFormat]] internal property of dateTimeFormat to undefined.

  internal['[[boundFormat]]'] = undefined; // 36. Set the [[initializedDateTimeFormat]] internal property of dateTimeFormat to
  //     true.

  internal['[[initializedDateTimeFormat]]'] = true; // In ES3, we need to pre-bind the format() function

  if (es3) dateTimeFormat.format = GetFormatDateTime.call(dateTimeFormat); // Restore the RegExp properties

  regexpRestore(); // Return the newly initialised object

  return dateTimeFormat;
}
/**
 * Several DateTimeFormat algorithms use values from the following table, which provides
 * property names and allowable values for the components of date and time formats:
 */


var dateTimeComponents = {
  weekday: ["narrow", "short", "long"],
  era: ["narrow", "short", "long"],
  year: ["2-digit", "numeric"],
  month: ["2-digit", "numeric", "narrow", "short", "long"],
  day: ["2-digit", "numeric"],
  hour: ["2-digit", "numeric"],
  minute: ["2-digit", "numeric"],
  second: ["2-digit", "numeric"],
  timeZoneName: ["short", "long"]
};
/**
 * When the ToDateTimeOptions abstract operation is called with arguments options,
 * required, and defaults, the following steps are taken:
 */

function ToDateTimeFormats(formats) {
  if (Object.prototype.toString.call(formats) === '[object Array]') {
    return formats;
  }

  return createDateTimeFormats(formats);
}
/**
 * When the ToDateTimeOptions abstract operation is called with arguments options,
 * required, and defaults, the following steps are taken:
 */


function ToDateTimeOptions(options, required, defaults) {
  // 1. If options is undefined, then let options be null, else let options be
  //    ToObject(options).
  if (options === undefined) options = null;else {
    // (#12) options needs to be a Record, but it also needs to inherit properties
    var opt2 = toObject(options);
    options = new Record();

    for (var k in opt2) {
      options[k] = opt2[k];
    }
  } // 2. Let create be the standard built-in function object defined in ES5, 15.2.3.5.

  var create = objCreate; // 3. Let options be the result of calling the [[Call]] internal method of create with
  //    undefined as the this value and an argument list containing the single item
  //    options.

  options = create(options); // 4. Let needDefaults be true.

  var needDefaults = true; // 5. If required is "date" or "any", then

  if (required === 'date' || required === 'any') {
    // a. For each of the property names "weekday", "year", "month", "day":
    // i. If the result of calling the [[Get]] internal method of options with the
    //    property name is not undefined, then let needDefaults be false.
    if (options.weekday !== undefined || options.year !== undefined || options.month !== undefined || options.day !== undefined) needDefaults = false;
  } // 6. If required is "time" or "any", then


  if (required === 'time' || required === 'any') {
    // a. For each of the property names "hour", "minute", "second":
    // i. If the result of calling the [[Get]] internal method of options with the
    //    property name is not undefined, then let needDefaults be false.
    if (options.hour !== undefined || options.minute !== undefined || options.second !== undefined) needDefaults = false;
  } // 7. If needDefaults is true and defaults is either "date" or "all", then


  if (needDefaults && (defaults === 'date' || defaults === 'all')) // a. For each of the property names "year", "month", "day":
    // i. Call the [[DefineOwnProperty]] internal method of options with the
    //    property name, Property Descriptor {[[Value]]: "numeric", [[Writable]]:
    //    true, [[Enumerable]]: true, [[Configurable]]: true}, and false.
    options.year = options.month = options.day = 'numeric'; // 8. If needDefaults is true and defaults is either "time" or "all", then

  if (needDefaults && (defaults === 'time' || defaults === 'all')) // a. For each of the property names "hour", "minute", "second":
    // i. Call the [[DefineOwnProperty]] internal method of options with the
    //    property name, Property Descriptor {[[Value]]: "numeric", [[Writable]]:
    //    true, [[Enumerable]]: true, [[Configurable]]: true}, and false.
    options.hour = options.minute = options.second = 'numeric'; // 9. Return options.

  return options;
}
/**
 * When the BasicFormatMatcher abstract operation is called with two arguments options and
 * formats, the following steps are taken:
 */


function BasicFormatMatcher(options, formats) {
  // 1. Let removalPenalty be 120.
  var removalPenalty = 120; // 2. Let additionPenalty be 20.

  var additionPenalty = 20; // 3. Let longLessPenalty be 8.

  var longLessPenalty = 8; // 4. Let longMorePenalty be 6.

  var longMorePenalty = 6; // 5. Let shortLessPenalty be 6.

  var shortLessPenalty = 6; // 6. Let shortMorePenalty be 3.

  var shortMorePenalty = 3; // 7. Let bestScore be -Infinity.

  var bestScore = -Infinity; // 8. Let bestFormat be undefined.

  var bestFormat = void 0; // 9. Let i be 0.

  var i = 0; // 10. Assert: formats is an Array object.
  // 11. Let len be the result of calling the [[Get]] internal method of formats with argument "length".

  var len = formats.length; // 12. Repeat while i < len:

  while (i < len) {
    // a. Let format be the result of calling the [[Get]] internal method of formats with argument ToString(i).
    var format = formats[i]; // b. Let score be 0.

    var score = 0; // c. For each property shown in Table 3:

    for (var property in dateTimeComponents) {
      if (!hop.call(dateTimeComponents, property)) continue; // i. Let optionsProp be options.[[<property>]].

      var optionsProp = options['[[' + property + ']]']; // ii. Let formatPropDesc be the result of calling the [[GetOwnProperty]] internal method of format
      //     with argument property.
      // iii. If formatPropDesc is not undefined, then
      //     1. Let formatProp be the result of calling the [[Get]] internal method of format with argument property.

      var formatProp = hop.call(format, property) ? format[property] : undefined; // iv. If optionsProp is undefined and formatProp is not undefined, then decrease score by
      //     additionPenalty.

      if (optionsProp === undefined && formatProp !== undefined) score -= additionPenalty; // v. Else if optionsProp is not undefined and formatProp is undefined, then decrease score by
      //    removalPenalty.
      else if (optionsProp !== undefined && formatProp === undefined) score -= removalPenalty; // vi. Else
      else {
        // 1. Let values be the array ["2-digit", "numeric", "narrow", "short",
        //    "long"].
        var values = ['2-digit', 'numeric', 'narrow', 'short', 'long']; // 2. Let optionsPropIndex be the index of optionsProp within values.

        var optionsPropIndex = arrIndexOf.call(values, optionsProp); // 3. Let formatPropIndex be the index of formatProp within values.

        var formatPropIndex = arrIndexOf.call(values, formatProp); // 4. Let delta be max(min(formatPropIndex - optionsPropIndex, 2), -2).

        var delta = Math.max(Math.min(formatPropIndex - optionsPropIndex, 2), -2); // 5. If delta = 2, decrease score by longMorePenalty.

        if (delta === 2) score -= longMorePenalty; // 6. Else if delta = 1, decrease score by shortMorePenalty.
        else if (delta === 1) score -= shortMorePenalty; // 7. Else if delta = -1, decrease score by shortLessPenalty.
        else if (delta === -1) score -= shortLessPenalty; // 8. Else if delta = -2, decrease score by longLessPenalty.
        else if (delta === -2) score -= longLessPenalty;
      }
    } // d. If score > bestScore, then


    if (score > bestScore) {
      // i. Let bestScore be score.
      bestScore = score; // ii. Let bestFormat be format.

      bestFormat = format;
    } // e. Increase i by 1.


    i++;
  } // 13. Return bestFormat.


  return bestFormat;
}
/**
 * When the BestFitFormatMatcher abstract operation is called with two arguments options
 * and formats, it performs implementation dependent steps, which should return a set of
 * component representations that a typical user of the selected locale would perceive as
 * at least as good as the one returned by BasicFormatMatcher.
 *
 * This polyfill defines the algorithm to be the same as BasicFormatMatcher,
 * with the addition of bonus points awarded where the requested format is of
 * the same data type as the potentially matching format.
 *
 * This algo relies on the concept of closest distance matching described here:
 * http://unicode.org/reports/tr35/tr35-dates.html#Matching_Skeletons
 * Typically a “best match” is found using a closest distance match, such as:
 *
 * Symbols requesting a best choice for the locale are replaced.
 *      j → one of {H, k, h, K}; C → one of {a, b, B}
 * -> Covered by cldr.js matching process
 *
 * For fields with symbols representing the same type (year, month, day, etc):
 *     Most symbols have a small distance from each other.
 *         M ≅ L; E ≅ c; a ≅ b ≅ B; H ≅ k ≅ h ≅ K; ...
 *     -> Covered by cldr.js matching process
 *
 *     Width differences among fields, other than those marking text vs numeric, are given small distance from each other.
 *         MMM ≅ MMMM
 *         MM ≅ M
 *     Numeric and text fields are given a larger distance from each other.
 *         MMM ≈ MM
 *     Symbols representing substantial differences (week of year vs week of month) are given much larger a distances from each other.
 *         d ≋ D; ...
 *     Missing or extra fields cause a match to fail. (But see Missing Skeleton Fields).
 *
 *
 * For example,
 *
 *     { month: 'numeric', day: 'numeric' }
 *
 * should match
 *
 *     { month: '2-digit', day: '2-digit' }
 *
 * rather than
 *
 *     { month: 'short', day: 'numeric' }
 *
 * This makes sense because a user requesting a formatted date with numeric parts would
 * not expect to see the returned format containing narrow, short or long part names
 */


function BestFitFormatMatcher(options, formats) {
  /** Diverging: this block implements the hack for single property configuration, eg.:
   *
   *      `new Intl.DateTimeFormat('en', {day: 'numeric'})`
   *
   * should produce a single digit with the day of the month. This is needed because
   * CLDR `availableFormats` data structure doesn't cover these cases.
   */
  {
    var optionsPropNames = [];

    for (var property in dateTimeComponents) {
      if (!hop.call(dateTimeComponents, property)) continue;

      if (options['[[' + property + ']]'] !== undefined) {
        optionsPropNames.push(property);
      }
    }

    if (optionsPropNames.length === 1) {
      var _bestFormat = generateSyntheticFormat(optionsPropNames[0], options['[[' + optionsPropNames[0] + ']]']);

      if (_bestFormat) {
        return _bestFormat;
      }
    }
  } // 1. Let removalPenalty be 120.

  var removalPenalty = 120; // 2. Let additionPenalty be 20.

  var additionPenalty = 20; // 3. Let longLessPenalty be 8.

  var longLessPenalty = 8; // 4. Let longMorePenalty be 6.

  var longMorePenalty = 6; // 5. Let shortLessPenalty be 6.

  var shortLessPenalty = 6; // 6. Let shortMorePenalty be 3.

  var shortMorePenalty = 3;
  var patternPenalty = 2;
  var hour12Penalty = 1; // 7. Let bestScore be -Infinity.

  var bestScore = -Infinity; // 8. Let bestFormat be undefined.

  var bestFormat = void 0; // 9. Let i be 0.

  var i = 0; // 10. Assert: formats is an Array object.
  // 11. Let len be the result of calling the [[Get]] internal method of formats with argument "length".

  var len = formats.length; // 12. Repeat while i < len:

  while (i < len) {
    // a. Let format be the result of calling the [[Get]] internal method of formats with argument ToString(i).
    var format = formats[i]; // b. Let score be 0.

    var score = 0; // c. For each property shown in Table 3:

    for (var _property in dateTimeComponents) {
      if (!hop.call(dateTimeComponents, _property)) continue; // i. Let optionsProp be options.[[<property>]].

      var optionsProp = options['[[' + _property + ']]']; // ii. Let formatPropDesc be the result of calling the [[GetOwnProperty]] internal method of format
      //     with argument property.
      // iii. If formatPropDesc is not undefined, then
      //     1. Let formatProp be the result of calling the [[Get]] internal method of format with argument property.

      var formatProp = hop.call(format, _property) ? format[_property] : undefined; // Diverging: using the default properties produced by the pattern/skeleton
      // to match it with user options, and apply a penalty

      var patternProp = hop.call(format._, _property) ? format._[_property] : undefined;

      if (optionsProp !== patternProp) {
        score -= patternPenalty;
      } // iv. If optionsProp is undefined and formatProp is not undefined, then decrease score by
      //     additionPenalty.


      if (optionsProp === undefined && formatProp !== undefined) score -= additionPenalty; // v. Else if optionsProp is not undefined and formatProp is undefined, then decrease score by
      //    removalPenalty.
      else if (optionsProp !== undefined && formatProp === undefined) score -= removalPenalty; // vi. Else
      else {
        // 1. Let values be the array ["2-digit", "numeric", "narrow", "short",
        //    "long"].
        var values = ['2-digit', 'numeric', 'narrow', 'short', 'long']; // 2. Let optionsPropIndex be the index of optionsProp within values.

        var optionsPropIndex = arrIndexOf.call(values, optionsProp); // 3. Let formatPropIndex be the index of formatProp within values.

        var formatPropIndex = arrIndexOf.call(values, formatProp); // 4. Let delta be max(min(formatPropIndex - optionsPropIndex, 2), -2).

        var delta = Math.max(Math.min(formatPropIndex - optionsPropIndex, 2), -2);
        {
          // diverging from spec
          // When the bestFit argument is true, subtract additional penalty where data types are not the same
          if (formatPropIndex <= 1 && optionsPropIndex >= 2 || formatPropIndex >= 2 && optionsPropIndex <= 1) {
            // 5. If delta = 2, decrease score by longMorePenalty.
            if (delta > 0) score -= longMorePenalty;else if (delta < 0) score -= longLessPenalty;
          } else {
            // 5. If delta = 2, decrease score by longMorePenalty.
            if (delta > 1) score -= shortMorePenalty;else if (delta < -1) score -= shortLessPenalty;
          }
        }
      }
    }

    {
      // diverging to also take into consideration differences between 12 or 24 hours
      // which is special for the best fit only.
      if (format._.hour12 !== options.hour12) {
        score -= hour12Penalty;
      }
    } // d. If score > bestScore, then

    if (score > bestScore) {
      // i. Let bestScore be score.
      bestScore = score; // ii. Let bestFormat be format.

      bestFormat = format;
    } // e. Increase i by 1.


    i++;
  } // 13. Return bestFormat.


  return bestFormat;
}
/* 12.2.3 */


internals.DateTimeFormat = {
  '[[availableLocales]]': [],
  '[[relevantExtensionKeys]]': ['ca', 'nu'],
  '[[localeData]]': {}
};
/**
 * When the supportedLocalesOf method of Intl.DateTimeFormat is called, the
 * following steps are taken:
 */

/* 12.2.2 */

defineProperty(Intl.DateTimeFormat, 'supportedLocalesOf', {
  configurable: true,
  writable: true,
  value: fnBind.call(function (locales) {
    // Bound functions only have the `this` value altered if being used as a constructor,
    // this lets us imitate a native function that has no constructor
    if (!hop.call(this, '[[availableLocales]]')) throw new TypeError('supportedLocalesOf() is not a constructor'); // Create an object whose props can be used to restore the values of RegExp props

    var regexpRestore = createRegExpRestore(),
        // 1. If options is not provided, then let options be undefined.
    options = arguments[1],
        // 2. Let availableLocales be the value of the [[availableLocales]] internal
    //    property of the standard built-in object that is the initial value of
    //    Intl.NumberFormat.
    availableLocales = this['[[availableLocales]]'],
        // 3. Let requestedLocales be the result of calling the CanonicalizeLocaleList
    //    abstract operation (defined in 9.2.1) with argument locales.
    requestedLocales = CanonicalizeLocaleList(locales); // Restore the RegExp properties

    regexpRestore(); // 4. Return the result of calling the SupportedLocales abstract operation
    //    (defined in 9.2.8) with arguments availableLocales, requestedLocales,
    //    and options.

    return SupportedLocales(availableLocales, requestedLocales, options);
  }, internals.NumberFormat)
});
/**
 * This named accessor property returns a function that formats a number
 * according to the effective locale and the formatting options of this
 * DateTimeFormat object.
 */

/* 12.3.2 */

defineProperty(Intl.DateTimeFormat.prototype, 'format', {
  configurable: true,
  get: GetFormatDateTime
});

function GetFormatDateTime() {
  var internal = this !== null && babelHelpers$1["typeof"](this) === 'object' && getInternalProperties(this); // Satisfy test 12.3_b

  if (!internal || !internal['[[initializedDateTimeFormat]]']) throw new TypeError('`this` value for format() is not an initialized Intl.DateTimeFormat object.'); // The value of the [[Get]] attribute is a function that takes the following
  // steps:
  // 1. If the [[boundFormat]] internal property of this DateTimeFormat object
  //    is undefined, then:

  if (internal['[[boundFormat]]'] === undefined) {
    // a. Let F be a Function object, with internal properties set as
    //    specified for built-in functions in ES5, 15, or successor, and the
    //    length property set to 0, that takes the argument date and
    //    performs the following steps:
    var F = function F() {
      var date = arguments.length <= 0 || arguments[0] === undefined ? undefined : arguments[0]; //   i. If date is not provided or is undefined, then let x be the
      //      result as if by the expression Date.now() where Date.now is
      //      the standard built-in function defined in ES5, 15.9.4.4.
      //  ii. Else let x be ToNumber(date).
      // iii. Return the result of calling the FormatDateTime abstract
      //      operation (defined below) with arguments this and x.

      var x = date === undefined ? Date.now() : toNumber(date);
      return FormatDateTime(this, x);
    }; // b. Let bind be the standard built-in function object defined in ES5,
    //    15.3.4.5.
    // c. Let bf be the result of calling the [[Call]] internal method of
    //    bind with F as the this value and an argument list containing
    //    the single item this.


    var bf = fnBind.call(F, this); // d. Set the [[boundFormat]] internal property of this NumberFormat
    //    object to bf.

    internal['[[boundFormat]]'] = bf;
  } // Return the value of the [[boundFormat]] internal property of this
  // NumberFormat object.


  return internal['[[boundFormat]]'];
}

function formatToParts$1() {
  var date = arguments.length <= 0 || arguments[0] === undefined ? undefined : arguments[0];
  var internal = this !== null && babelHelpers$1["typeof"](this) === 'object' && getInternalProperties(this);
  if (!internal || !internal['[[initializedDateTimeFormat]]']) throw new TypeError('`this` value for formatToParts() is not an initialized Intl.DateTimeFormat object.');
  var x = date === undefined ? Date.now() : toNumber(date);
  return FormatToPartsDateTime(this, x);
}

Object.defineProperty(Intl.DateTimeFormat.prototype, 'formatToParts', {
  enumerable: false,
  writable: true,
  configurable: true,
  value: formatToParts$1
});

function CreateDateTimeParts(dateTimeFormat, x) {
  // 1. If x is not a finite Number, then throw a RangeError exception.
  if (!isFinite(x)) throw new RangeError('Invalid valid date passed to format');

  var internal = dateTimeFormat.__getInternalProperties(secret); // Creating restore point for properties on the RegExp object... please wait

  /* let regexpRestore = */


  createRegExpRestore(); // ###TODO: review this
  // 2. Let locale be the value of the [[locale]] internal property of dateTimeFormat.

  var locale = internal['[[locale]]']; // 3. Let nf be the result of creating a new NumberFormat object as if by the
  // expression new Intl.NumberFormat([locale], {useGrouping: false}) where
  // Intl.NumberFormat is the standard built-in constructor defined in 11.1.3.

  var nf = new Intl.NumberFormat([locale], {
    useGrouping: false
  }); // 4. Let nf2 be the result of creating a new NumberFormat object as if by the
  // expression new Intl.NumberFormat([locale], {minimumIntegerDigits: 2, useGrouping:
  // false}) where Intl.NumberFormat is the standard built-in constructor defined in
  // 11.1.3.

  var nf2 = new Intl.NumberFormat([locale], {
    minimumIntegerDigits: 2,
    useGrouping: false
  }); // 5. Let tm be the result of calling the ToLocalTime abstract operation (defined
  // below) with x, the value of the [[calendar]] internal property of dateTimeFormat,
  // and the value of the [[timeZone]] internal property of dateTimeFormat.

  var tm = ToLocalTime(x, internal['[[calendar]]'], internal['[[timeZone]]']); // 6. Let result be the value of the [[pattern]] internal property of dateTimeFormat.

  var pattern = internal['[[pattern]]']; // 7.

  var result = new List(); // 8.

  var index = 0; // 9.

  var beginIndex = pattern.indexOf('{'); // 10.

  var endIndex = 0; // Need the locale minus any extensions

  var dataLocale = internal['[[dataLocale]]']; // Need the calendar data from CLDR

  var localeData = internals.DateTimeFormat['[[localeData]]'][dataLocale].calendars;
  var ca = internal['[[calendar]]']; // 11.

  while (beginIndex !== -1) {
    var fv = void 0; // a.

    endIndex = pattern.indexOf('}', beginIndex); // b.

    if (endIndex === -1) {
      throw new Error('Unclosed pattern');
    } // c.


    if (beginIndex > index) {
      arrPush.call(result, {
        type: 'literal',
        value: pattern.substring(index, beginIndex)
      });
    } // d.


    var p = pattern.substring(beginIndex + 1, endIndex); // e.

    if (dateTimeComponents.hasOwnProperty(p)) {
      //   i. Let f be the value of the [[<p>]] internal property of dateTimeFormat.
      var f = internal['[[' + p + ']]']; //  ii. Let v be the value of tm.[[<p>]].

      var v = tm['[[' + p + ']]']; // iii. If p is "year" and v ≤ 0, then let v be 1 - v.

      if (p === 'year' && v <= 0) {
        v = 1 - v;
      } //  iv. If p is "month", then increase v by 1.
      else if (p === 'month') {
        v++;
      } //   v. If p is "hour" and the value of the [[hour12]] internal property of
      //      dateTimeFormat is true, then
      else if (p === 'hour' && internal['[[hour12]]'] === true) {
        // 1. Let v be v modulo 12.
        v = v % 12; // 2. If v is 0 and the value of the [[hourNo0]] internal property of
        //    dateTimeFormat is true, then let v be 12.

        if (v === 0 && internal['[[hourNo0]]'] === true) {
          v = 12;
        }
      } //  vi. If f is "numeric", then


      if (f === 'numeric') {
        // 1. Let fv be the result of calling the FormatNumber abstract operation
        //    (defined in 11.3.2) with arguments nf and v.
        fv = FormatNumber(nf, v);
      } // vii. Else if f is "2-digit", then
      else if (f === '2-digit') {
        // 1. Let fv be the result of calling the FormatNumber abstract operation
        //    with arguments nf2 and v.
        fv = FormatNumber(nf2, v); // 2. If the length of fv is greater than 2, let fv be the substring of fv
        //    containing the last two characters.

        if (fv.length > 2) {
          fv = fv.slice(-2);
        }
      } // viii. Else if f is "narrow", "short", or "long", then let fv be a String
      //     value representing f in the desired form; the String value depends upon
      //     the implementation and the effective locale and calendar of
      //     dateTimeFormat. If p is "month", then the String value may also depend
      //     on whether dateTimeFormat has a [[day]] internal property. If p is
      //     "timeZoneName", then the String value may also depend on the value of
      //     the [[inDST]] field of tm.
      else if (f in dateWidths) {
        switch (p) {
          case 'month':
            fv = resolveDateString(localeData, ca, 'months', f, tm['[[' + p + ']]']);
            break;

          case 'weekday':
            try {
              fv = resolveDateString(localeData, ca, 'days', f, tm['[[' + p + ']]']); // fv = resolveDateString(ca.days, f)[tm['[['+ p +']]']];
            } catch (e) {
              throw new Error('Could not find weekday data for locale ' + locale);
            }

            break;

          case 'timeZoneName':
            fv = ''; // ###TODO

            break;

          case 'era':
            try {
              fv = resolveDateString(localeData, ca, 'eras', f, tm['[[' + p + ']]']);
            } catch (e) {
              throw new Error('Could not find era data for locale ' + locale);
            }

            break;

          default:
            fv = tm['[[' + p + ']]'];
        }
      } // ix


      arrPush.call(result, {
        type: p,
        value: fv
      }); // f.
    } else if (p === 'ampm') {
      // i.
      var _v = tm['[[hour]]']; // ii./iii.

      fv = resolveDateString(localeData, ca, 'dayPeriods', _v > 11 ? 'pm' : 'am', null); // iv.

      arrPush.call(result, {
        type: 'dayPeriod',
        value: fv
      }); // g.
    } else {
      arrPush.call(result, {
        type: 'literal',
        value: pattern.substring(beginIndex, endIndex + 1)
      });
    } // h.


    index = endIndex + 1; // i.

    beginIndex = pattern.indexOf('{', index);
  } // 12.


  if (endIndex < pattern.length - 1) {
    arrPush.call(result, {
      type: 'literal',
      value: pattern.substr(endIndex + 1)
    });
  } // 13.


  return result;
}
/**
 * When the FormatDateTime abstract operation is called with arguments dateTimeFormat
 * (which must be an object initialized as a DateTimeFormat) and x (which must be a Number
 * value), it returns a String value representing x (interpreted as a time value as
 * specified in ES5, 15.9.1.1) according to the effective locale and the formatting
 * options of dateTimeFormat.
 */


function FormatDateTime(dateTimeFormat, x) {
  var parts = CreateDateTimeParts(dateTimeFormat, x);
  var result = '';

  for (var i = 0; parts.length > i; i++) {
    var part = parts[i];
    result += part.value;
  }

  return result;
}

function FormatToPartsDateTime(dateTimeFormat, x) {
  var parts = CreateDateTimeParts(dateTimeFormat, x);
  var result = [];

  for (var i = 0; parts.length > i; i++) {
    var part = parts[i];
    result.push({
      type: part.type,
      value: part.value
    });
  }

  return result;
}
/**
 * When the ToLocalTime abstract operation is called with arguments date, calendar, and
 * timeZone, the following steps are taken:
 */


function ToLocalTime(date, calendar, timeZone) {
  // 1. Apply calendrical calculations on date for the given calendar and time zone to
  //    produce weekday, era, year, month, day, hour, minute, second, and inDST values.
  //    The calculations should use best available information about the specified
  //    calendar and time zone. If the calendar is "gregory", then the calculations must
  //    match the algorithms specified in ES5, 15.9.1, except that calculations are not
  //    bound by the restrictions on the use of best available information on time zones
  //    for local time zone adjustment and daylight saving time adjustment imposed by
  //    ES5, 15.9.1.7 and 15.9.1.8.
  // ###TODO###
  var d = new Date(date),
      m = 'get' + (timeZone || ''); // 2. Return a Record with fields [[weekday]], [[era]], [[year]], [[month]], [[day]],
  //    [[hour]], [[minute]], [[second]], and [[inDST]], each with the corresponding
  //    calculated value.

  return new Record({
    '[[weekday]]': d[m + 'Day'](),
    '[[era]]': +(d[m + 'FullYear']() >= 0),
    '[[year]]': d[m + 'FullYear'](),
    '[[month]]': d[m + 'Month'](),
    '[[day]]': d[m + 'Date'](),
    '[[hour]]': d[m + 'Hours'](),
    '[[minute]]': d[m + 'Minutes'](),
    '[[second]]': d[m + 'Seconds'](),
    '[[inDST]]': false // ###TODO###

  });
}
/**
 * The function returns a new object whose properties and attributes are set as if
 * constructed by an object literal assigning to each of the following properties the
 * value of the corresponding internal property of this DateTimeFormat object (see 12.4):
 * locale, calendar, numberingSystem, timeZone, hour12, weekday, era, year, month, day,
 * hour, minute, second, and timeZoneName. Properties whose corresponding internal
 * properties are not present are not assigned.
 */

/* 12.3.3 */


defineProperty(Intl.DateTimeFormat.prototype, 'resolvedOptions', {
  writable: true,
  configurable: true,
  value: function value() {
    var prop = void 0,
        descs = new Record(),
        props = ['locale', 'calendar', 'numberingSystem', 'timeZone', 'hour12', 'weekday', 'era', 'year', 'month', 'day', 'hour', 'minute', 'second', 'timeZoneName'],
        internal = this !== null && babelHelpers$1["typeof"](this) === 'object' && getInternalProperties(this); // Satisfy test 12.3_b

    if (!internal || !internal['[[initializedDateTimeFormat]]']) throw new TypeError('`this` value for resolvedOptions() is not an initialized Intl.DateTimeFormat object.');

    for (var i = 0, max = props.length; i < max; i++) {
      if (hop.call(internal, prop = '[[' + props[i] + ']]')) descs[props[i]] = {
        value: internal[prop],
        writable: true,
        configurable: true,
        enumerable: true
      };
    }

    return objCreate({}, descs);
  }
});
var ls = Intl.__localeSensitiveProtos = {
  Number: {},
  Date: {}
};
/**
 * When the toLocaleString method is called with optional arguments locales and options,
 * the following steps are taken:
 */

/* 13.2.1 */

ls.Number.toLocaleString = function () {
  // Satisfy test 13.2.1_1
  if (Object.prototype.toString.call(this) !== '[object Number]') throw new TypeError('`this` value must be a number for Number.prototype.toLocaleString()'); // 1. Let x be this Number value (as defined in ES5, 15.7.4).
  // 2. If locales is not provided, then let locales be undefined.
  // 3. If options is not provided, then let options be undefined.
  // 4. Let numberFormat be the result of creating a new object as if by the
  //    expression new Intl.NumberFormat(locales, options) where
  //    Intl.NumberFormat is the standard built-in constructor defined in 11.1.3.
  // 5. Return the result of calling the FormatNumber abstract operation
  //    (defined in 11.3.2) with arguments numberFormat and x.

  return FormatNumber(new NumberFormatConstructor(arguments[0], arguments[1]), this);
};
/**
 * When the toLocaleString method is called with optional arguments locales and options,
 * the following steps are taken:
 */

/* 13.3.1 */


ls.Date.toLocaleString = function () {
  // Satisfy test 13.3.0_1
  if (Object.prototype.toString.call(this) !== '[object Date]') throw new TypeError('`this` value must be a Date instance for Date.prototype.toLocaleString()'); // 1. Let x be this time value (as defined in ES5, 15.9.5).

  var x = +this; // 2. If x is NaN, then return "Invalid Date".

  if (isNaN(x)) return 'Invalid Date'; // 3. If locales is not provided, then let locales be undefined.

  var locales = arguments[0]; // 4. If options is not provided, then let options be undefined.

  var options = arguments[1]; // 5. Let options be the result of calling the ToDateTimeOptions abstract
  //    operation (defined in 12.1.1) with arguments options, "any", and "all".

  options = ToDateTimeOptions(options, 'any', 'all'); // 6. Let dateTimeFormat be the result of creating a new object as if by the
  //    expression new Intl.DateTimeFormat(locales, options) where
  //    Intl.DateTimeFormat is the standard built-in constructor defined in 12.1.3.

  var dateTimeFormat = new DateTimeFormatConstructor(locales, options); // 7. Return the result of calling the FormatDateTime abstract operation (defined
  //    in 12.3.2) with arguments dateTimeFormat and x.

  return FormatDateTime(dateTimeFormat, x);
};
/**
 * When the toLocaleDateString method is called with optional arguments locales and
 * options, the following steps are taken:
 */

/* 13.3.2 */


ls.Date.toLocaleDateString = function () {
  // Satisfy test 13.3.0_1
  if (Object.prototype.toString.call(this) !== '[object Date]') throw new TypeError('`this` value must be a Date instance for Date.prototype.toLocaleDateString()'); // 1. Let x be this time value (as defined in ES5, 15.9.5).

  var x = +this; // 2. If x is NaN, then return "Invalid Date".

  if (isNaN(x)) return 'Invalid Date'; // 3. If locales is not provided, then let locales be undefined.

  var locales = arguments[0],
      // 4. If options is not provided, then let options be undefined.
  options = arguments[1]; // 5. Let options be the result of calling the ToDateTimeOptions abstract
  //    operation (defined in 12.1.1) with arguments options, "date", and "date".

  options = ToDateTimeOptions(options, 'date', 'date'); // 6. Let dateTimeFormat be the result of creating a new object as if by the
  //    expression new Intl.DateTimeFormat(locales, options) where
  //    Intl.DateTimeFormat is the standard built-in constructor defined in 12.1.3.

  var dateTimeFormat = new DateTimeFormatConstructor(locales, options); // 7. Return the result of calling the FormatDateTime abstract operation (defined
  //    in 12.3.2) with arguments dateTimeFormat and x.

  return FormatDateTime(dateTimeFormat, x);
};
/**
 * When the toLocaleTimeString method is called with optional arguments locales and
 * options, the following steps are taken:
 */

/* 13.3.3 */


ls.Date.toLocaleTimeString = function () {
  // Satisfy test 13.3.0_1
  if (Object.prototype.toString.call(this) !== '[object Date]') throw new TypeError('`this` value must be a Date instance for Date.prototype.toLocaleTimeString()'); // 1. Let x be this time value (as defined in ES5, 15.9.5).

  var x = +this; // 2. If x is NaN, then return "Invalid Date".

  if (isNaN(x)) return 'Invalid Date'; // 3. If locales is not provided, then let locales be undefined.

  var locales = arguments[0]; // 4. If options is not provided, then let options be undefined.

  var options = arguments[1]; // 5. Let options be the result of calling the ToDateTimeOptions abstract
  //    operation (defined in 12.1.1) with arguments options, "time", and "time".

  options = ToDateTimeOptions(options, 'time', 'time'); // 6. Let dateTimeFormat be the result of creating a new object as if by the
  //    expression new Intl.DateTimeFormat(locales, options) where
  //    Intl.DateTimeFormat is the standard built-in constructor defined in 12.1.3.

  var dateTimeFormat = new DateTimeFormatConstructor(locales, options); // 7. Return the result of calling the FormatDateTime abstract operation (defined
  //    in 12.3.2) with arguments dateTimeFormat and x.

  return FormatDateTime(dateTimeFormat, x);
};

defineProperty(Intl, '__applyLocaleSensitivePrototypes', {
  writable: true,
  configurable: true,
  value: function value() {
    defineProperty(Number.prototype, 'toLocaleString', {
      writable: true,
      configurable: true,
      value: ls.Number.toLocaleString
    }); // Need this here for IE 8, to avoid the _DontEnum_ bug

    defineProperty(Date.prototype, 'toLocaleString', {
      writable: true,
      configurable: true,
      value: ls.Date.toLocaleString
    });

    for (var k in ls.Date) {
      if (hop.call(ls.Date, k)) defineProperty(Date.prototype, k, {
        writable: true,
        configurable: true,
        value: ls.Date[k]
      });
    }
  }
});
/**
 * Can't really ship a single script with data for hundreds of locales, so we provide
 * this __addLocaleData method as a means for the developer to add the data on an
 * as-needed basis
 */

defineProperty(Intl, '__addLocaleData', {
  value: function value(data) {
    if (!IsStructurallyValidLanguageTag(data.locale)) throw new Error("Object passed doesn't identify itself with a valid language tag");
    addLocaleData(data, data.locale);
  }
});

function addLocaleData(data, tag) {
  // Both NumberFormat and DateTimeFormat require number data, so throw if it isn't present
  if (!data.number) throw new Error("Object passed doesn't contain locale data for Intl.NumberFormat");
  var locale = void 0,
      locales = [tag],
      parts = tag.split('-'); // Create fallbacks for locale data with scripts, e.g. Latn, Hans, Vaii, etc

  if (parts.length > 2 && parts[1].length === 4) arrPush.call(locales, parts[0] + '-' + parts[2]);

  while (locale = arrShift.call(locales)) {
    // Add to NumberFormat internal properties as per 11.2.3
    arrPush.call(internals.NumberFormat['[[availableLocales]]'], locale);
    internals.NumberFormat['[[localeData]]'][locale] = data.number; // ...and DateTimeFormat internal properties as per 12.2.3

    if (data.date) {
      data.date.nu = data.number.nu;
      arrPush.call(internals.DateTimeFormat['[[availableLocales]]'], locale);
      internals.DateTimeFormat['[[localeData]]'][locale] = data.date;
    }
  } // If this is the first set of locale data added, make it the default


  if (defaultLocale === undefined) setDefaultLocale(tag);
}

defineProperty(Intl, '__disableRegExpRestore', {
  value: function value() {
    internals.disableRegExpRestore = true;
  }
});
module.exports = Intl;
};

moduleFactories["node_modules/intl/locale-data/complete.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/intl/locale-data/complete.js ***/
"use strict";(function(addLocaleData){var a=["gregory","buddhist","chinese","coptic","dangi","ethioaa","ethiopic","generic","hebrew","indian","islamic","islamicc","japanese","persian","roc","{1}, {0}","{1} 'at' {0}","d","ccc","d E","E h:mm a","E HH:mm","E h:mm:ss a","E HH:mm:ss","y G","MMM y G","MMM d, y G","E, MMM d, y G","h a","HH","h:mm a","HH:mm","h:mm:ss a","HH:mm:ss","h:mm:ss a v","HH:mm:ss v","h:mm a v","HH:mm v","L","M/d","E, M/d","LLL","MMM d","E, MMM d","MMMM d","mm:ss","y","M/y","M/d/y","E, M/d/y","MMM y","MMM d, y","E, MMM d, y","MMMM y","QQQ y","QQQQ y","EEEE, MMMM d, y","MMMM d, y","M/d/yy","h:mm:ss a zzzz","h:mm:ss a z","J","F","M","A","S","O","N","D","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","June","July","August","September","October","November","December","T","W","Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","BE","AM","PM","1","2","3","4","5","6","7","8","9","10","11","12","Mo1","Mo2","Mo3","Mo4","Mo5","Mo6","Mo7","Mo8","Mo9","Mo10","Mo11","Mo12","Month1","Month2","Month3","Month4","Month5","Month6","Month7","Month8","Month9","Month10","Month11","Month12","13","Tout","Baba","Hator","Kiahk","Toba","Amshir","Baramhat","Baramouda","Bashans","Paona","Epep","Mesra","Nasie","ERA0","ERA1","Meskerem","Tekemt","Hedar","Tahsas","Ter","Yekatit","Megabit","Miazia","Genbot","Sene","Hamle","Nehasse","Pagumen","M01","M02","M03","M04","M05","M06","M07","M08","M09","M10","M11","M12","B","BCE","CE","BC","AD","Before Christ","Anno Domini","Before Common Era","Common Era","Tishri","Heshvan","Kislev","Tevet","Shevat","Adar I","Adar","Nisan","Iyar","Sivan","Tamuz","Av","Elul","Adar II","Chaitra","Vaisakha","Jyaistha","Asadha","Sravana","Bhadra","Asvina","Kartika","Agrahayana","Pausa","Magha","Phalguna","Saka","Muh.","Saf.","Rab. I","Rab. II","Jum. I","Jum. II","Raj.","Sha.","Ram.","Shaw.","Dhuʻl-Q.","Dhuʻl-H.","Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah","AH","Taika (645–650)","Hakuchi (650–671)","Hakuhō (672–686)","Shuchō (686–701)","Taihō (701–704)","Keiun (704–708)","Wadō (708–715)","Reiki (715–717)","Yōrō (717–724)","Jinki (724–729)","Tenpyō (729–749)","Tenpyō-kampō (749-749)","Tenpyō-shōhō (749-757)","Tenpyō-hōji (757-765)","Tenpyō-jingo (765-767)","Jingo-keiun (767-770)","Hōki (770–780)","Ten-ō (781-782)","Enryaku (782–806)","Daidō (806–810)","Kōnin (810–824)","Tenchō (824–834)","Jōwa (834–848)","Kajō (848–851)","Ninju (851–854)","Saikō (854–857)","Ten-an (857-859)","Jōgan (859–877)","Gangyō (877–885)","Ninna (885–889)","Kanpyō (889–898)","Shōtai (898–901)","Engi (901–923)","Enchō (923–931)","Jōhei (931–938)","Tengyō (938–947)","Tenryaku (947–957)","Tentoku (957–961)","Ōwa (961–964)","Kōhō (964–968)","Anna (968–970)","Tenroku (970–973)","Ten’en (973–976)","Jōgen (976–978)","Tengen (978–983)","Eikan (983–985)","Kanna (985–987)","Eien (987–989)","Eiso (989–990)","Shōryaku (990–995)","Chōtoku (995–999)","Chōhō (999–1004)","Kankō (1004–1012)","Chōwa (1012–1017)","Kannin (1017–1021)","Jian (1021–1024)","Manju (1024–1028)","Chōgen (1028–1037)","Chōryaku (1037–1040)","Chōkyū (1040–1044)","Kantoku (1044–1046)","Eishō (1046–1053)","Tengi (1053–1058)","Kōhei (1058–1065)","Jiryaku (1065–1069)","Enkyū (1069–1074)","Shōho (1074–1077)","Shōryaku (1077–1081)","Eihō (1081–1084)","Ōtoku (1084–1087)","Kanji (1087–1094)","Kahō (1094–1096)","Eichō (1096–1097)","Jōtoku (1097–1099)","Kōwa (1099–1104)","Chōji (1104–1106)","Kashō (1106–1108)","Tennin (1108–1110)","Ten-ei (1110-1113)","Eikyū (1113–1118)","Gen’ei (1118–1120)","Hōan (1120–1124)","Tenji (1124–1126)","Daiji (1126–1131)","Tenshō (1131–1132)","Chōshō (1132–1135)","Hōen (1135–1141)","Eiji (1141–1142)","Kōji (1142–1144)","Ten’yō (1144–1145)","Kyūan (1145–1151)","Ninpei (1151–1154)","Kyūju (1154–1156)","Hōgen (1156–1159)","Heiji (1159–1160)","Eiryaku (1160–1161)","Ōho (1161–1163)","Chōkan (1163–1165)","Eiman (1165–1166)","Nin’an (1166–1169)","Kaō (1169–1171)","Shōan (1171–1175)","Angen (1175–1177)","Jishō (1177–1181)","Yōwa (1181–1182)","Juei (1182–1184)","Genryaku (1184–1185)","Bunji (1185–1190)","Kenkyū (1190–1199)","Shōji (1199–1201)","Kennin (1201–1204)","Genkyū (1204–1206)","Ken’ei (1206–1207)","Jōgen (1207–1211)","Kenryaku (1211–1213)","Kenpō (1213–1219)","Jōkyū (1219–1222)","Jōō (1222–1224)","Gennin (1224–1225)","Karoku (1225–1227)","Antei (1227–1229)","Kanki (1229–1232)","Jōei (1232–1233)","Tenpuku (1233–1234)","Bunryaku (1234–1235)","Katei (1235–1238)","Ryakunin (1238–1239)","En’ō (1239–1240)","Ninji (1240–1243)","Kangen (1243–1247)","Hōji (1247–1249)","Kenchō (1249–1256)","Kōgen (1256–1257)","Shōka (1257–1259)","Shōgen (1259–1260)","Bun’ō (1260–1261)","Kōchō (1261–1264)","Bun’ei (1264–1275)","Kenji (1275–1278)","Kōan (1278–1288)","Shōō (1288–1293)","Einin (1293–1299)","Shōan (1299–1302)","Kengen (1302–1303)","Kagen (1303–1306)","Tokuji (1306–1308)","Enkyō (1308–1311)","Ōchō (1311–1312)","Shōwa (1312–1317)","Bunpō (1317–1319)","Genō (1319–1321)","Genkō (1321–1324)","Shōchū (1324–1326)","Karyaku (1326–1329)","Gentoku (1329–1331)","Genkō (1331–1334)","Kenmu (1334–1336)","Engen (1336–1340)","Kōkoku (1340–1346)","Shōhei (1346–1370)","Kentoku (1370–1372)","Bunchū (1372–1375)","Tenju (1375–1379)","Kōryaku (1379–1381)","Kōwa (1381–1384)","Genchū (1384–1392)","Meitoku (1384–1387)","Kakei (1387–1389)","Kōō (1389–1390)","Meitoku (1390–1394)","Ōei (1394–1428)","Shōchō (1428–1429)","Eikyō (1429–1441)","Kakitsu (1441–1444)","Bun’an (1444–1449)","Hōtoku (1449–1452)","Kyōtoku (1452–1455)","Kōshō (1455–1457)","Chōroku (1457–1460)","Kanshō (1460–1466)","Bunshō (1466–1467)","Ōnin (1467–1469)","Bunmei (1469–1487)","Chōkyō (1487–1489)","Entoku (1489–1492)","Meiō (1492–1501)","Bunki (1501–1504)","Eishō (1504–1521)","Taiei (1521–1528)","Kyōroku (1528–1532)","Tenbun (1532–1555)","Kōji (1555–1558)","Eiroku (1558–1570)","Genki (1570–1573)","Tenshō (1573–1592)","Bunroku (1592–1596)","Keichō (1596–1615)","Genna (1615–1624)","Kan’ei (1624–1644)","Shōho (1644–1648)","Keian (1648–1652)","Jōō (1652–1655)","Meireki (1655–1658)","Manji (1658–1661)","Kanbun (1661–1673)","Enpō (1673–1681)","Tenna (1681–1684)","Jōkyō (1684–1688)","Genroku (1688–1704)","Hōei (1704–1711)","Shōtoku (1711–1716)","Kyōhō (1716–1736)","Genbun (1736–1741)","Kanpō (1741–1744)","Enkyō (1744–1748)","Kan’en (1748–1751)","Hōreki (1751–1764)","Meiwa (1764–1772)","An’ei (1772–1781)","Tenmei (1781–1789)","Kansei (1789–1801)","Kyōwa (1801–1804)","Bunka (1804–1818)","Bunsei (1818–1830)","Tenpō (1830–1844)","Kōka (1844–1848)","Kaei (1848–1854)","Ansei (1854–1860)","Man’en (1860–1861)","Bunkyū (1861–1864)","Genji (1864–1865)","Keiō (1865–1868)","H","Meiji","Taishō","Shōwa","Heisei","Farvardin","Ordibehesht","Khordad","Tir","Mordad","Shahrivar","Mehr","Aban","Azar","Dey","Bahman","Esfand","AP","Before R.O.C.","Minguo","latn","{number}","{minusSign}{number}","{currency}{number}","{minusSign}{currency}{number}","{number}{percentSign}","{minusSign}{number}{percentSign}",".",",","NaN","+","-","%","∞","A$","R$","CA$","CN¥","€","£","HK$","₪","₹","¥","₩","MX$","NZ$","NT$","$","₫","FCFA","EC$","CFA","CFPF","{1} {0}","E d","E hh:mm a","E hh:mm:ss a","dd MMM y G","E, dd MMM y G","dd-MM","E, d/M","d MMM","E d MMM","E d MMMM","MM-y","y-MM-dd","E y-MM-dd","d MMM y","E, d MMM y","EEEE, dd MMMM y","dd MMMM y","dd MMM y","Jan.","Feb.","Mrt.","Apr.","Mei","Jun.","Jul.","Aug.","Sep.","Okt.","Nov.","Des.","Januarie","Februarie","Maart","Junie","Julie","Augustus","Oktober","Desember","V","So.","Ma.","Di.","Wo.","Do.","Vr.","Sa.","Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag","vm.","nm.","v.C.","n.C.","v.g.j.","g.j.","voor Christus","na Christus","voor die gewone jaartelling","R.O.C."," ","JP¥","฿","US$","R","G y","G y MMM","G y MMM d","G y MMM d, E","d/M","E d/M","m:ss","d/M/y","E d/M/y","E d MMM y","y MMMM","EEEE d MMMM y","d MMMM y","d MMM, y","HH:mm:ss zzzz","HH:mm:ss z","n","k","t","s","z","f","l","c","nùm","kɨz","tɨd","taa","see","nzu","dum","fɔe","dzu","lɔm","kaa","fwo","ndzɔ̀ŋɔ̀nùm","ndzɔ̀ŋɔ̀kƗ̀zùʔ","ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà","ndzɔ̀ŋɔ̀tǎafʉ̄ghā","ndzɔ̀ŋèsèe","ndzɔ̀ŋɔ̀nzùghò","ndzɔ̀ŋɔ̀dùmlo","ndzɔ̀ŋɔ̀kwîfɔ̀e","ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù","ndzɔ̀ŋɔ̀ghǔuwelɔ̀m","ndzɔ̀ŋɔ̀chwaʔàkaa wo","ndzɔ̀ŋèfwòo","g","u","nts","kpa","ghɔ","tɔm","ume","ghɨ","dzk","tsuʔntsɨ","tsuʔukpà","tsuʔughɔe","tsuʔutɔ̀mlò","tsuʔumè","tsuʔughɨ̂m","tsuʔndzɨkɔʔɔ","a.g","a.k","SK","BK","Sěe Kɨ̀lesto","Bǎa Kɨ̀lesto","{number}{currency}","{minusSign}{number}{currency}","d, E","E, MMMM d","y/M/d","y MMM d","EEEE, y MMMM dd","y MMMM d","yy/MM/dd","S-Ɔ","K-Ɔ","E-Ɔ","E-O","E-K","O-A","A-K","D-Ɔ","F-Ɛ","Ɔ-A","Ɔ-O","M-Ɔ","Sanda-Ɔpɛpɔn","Kwakwar-Ɔgyefuo","Ebɔw-Ɔbenem","Ebɔbira-Oforisuo","Esusow Aketseaba-Kɔtɔnimba","Obirade-Ayɛwohomumu","Ayɛwoho-Kitawonsa","Difuu-Ɔsandaa","Fankwa-Ɛbɔ","Ɔbɛsɛ-Ahinime","Ɔberɛfɛw-Obubuo","Mumu-Ɔpɛnimba","K","Y","Kwe","Dwo","Ben","Wuk","Yaw","Fia","Mem","Kwesida","Dwowda","Benada","Wukuda","Yawda","Fida","Memeneda","AN","EW","AK","KE","Ansa Kristo","Kristo Ekyiri","GH₵","MMM d፣ y G","E፣ MMM d፣ y G","E፣ M/d","E፣ MMM d","E፣ MMMM d","E፣ d/M/y","E፣ MMM d y","EEEE ፣d MMMM y","dd/MM/y","ጃ","ፌ","ማ","ኤ","ሜ","ጁ","ኦ","ሴ","ኖ","ዲ","ጃንዩ","ፌብሩ","ማርች","ኤፕሪ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክቶ","ኖቬም","ዲሴም","ጃንዩወሪ","ፌብሩወሪ","ኤፕሪል","ኦገስት","ሴፕቴምበር","ኦክቶበር","ኖቬምበር","ዲሴምበር","እ","ሰ","ረ","ሐ","ዓ","ቅ","እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ","ማክሰኞ","ጥዋት","ከሰዓት","መስከረም","ጥቅምት","ኅዳር","ታኅሣሥ","ጥር","የካቲት","መጋቢት","ሚያዝያ","ግንቦት","ሰኔ","ሐምሌ","ነሐሴ","ጳጉሜን","ዓ/ዓ","ዓ/ም","ዓመተ ዓለም","ዓመተ ምሕረት","AU$","ብር","E، d","d MMM، y G","E، d MMM، y G","d/‏M","E، d/M","dd‏/MM","E، d MMM","d MMMM","E، d MMMM","M‏/y","d‏/M‏/y","E، d/‏M/‏y","MM‏/y","d MMM، y","E، d MMM، y","EEEE، d MMMM، y","d MMMM، y","dd‏/MM‏/y","ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د","يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر","ح","ث","ر","خ","ج","الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت","التقويم البوذي","ص","١","٢","٣","٤","٥","٦","٧","٨","٩","١٠","١١","١٢","١٣","توت","بابه","هاتور","كيهك","طوبة","أمشير","برمهات","برمودة","بشنس","بؤونة","أبيب","مسرى","نسيئ","مسكريم","تكمت","هدار","تهساس","تر","يكتت","مجابيت","ميازيا","جنبت","سين","هامل","نهاس","باجمن","ق.م","ب.م","قبل الميلاد","ميلادي","بعد الميلاد","تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار","نيسان","أيار","سيفان","تموز","آب","أيلول","آذار الثاني","محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة","هـ","تيكا","هاكتشي","هاكهو","شتشو","تيهو","كيين","وادو","رييكي","يورو","جينكي","تمبيو","تمبيو-كامبو","تمبيو-شوهو","تمبيو-هوجي","تمفو-جينجو","جينجو-كيين","هوكي","تن-أو","إنرياكو","ديدو","كونين","تنتشو","شووا (٨٣٤–٨٤٨)‏","كاجو","نينجو","سيكو","تنان","جوجان","جينكيي","نينا","كامبيو","شوتاي","انجي","انتشو","شوهيي","تنجيو","تنرياكو","تنتوكو","أووا","كوهو","آنا","تينروكو","تن-نن","جوجن","تنجن","إيكان","كانا","اي-ان","ايسو","شورياكو (٩٩٠–٩٩٥)‏","تشوتوكو","تشوهو","كانكو","تشووا","كانين","جاين","مانجو","تشوجين","تشورياكو","تشوكيو (١٠٤٠–١٠٤٤)‏","كانتوكو","ايشو (١٠٤٦–١٠٥٣)‏","تينجي","كوهيي","جيرياكو","انكيو (١٠٦٩–١٠٧٤)‏","شوهو (١٠٧٤–١٠٧٧)‏","شورياكو (١٠٧٧–١٠٨١)‏","ايهو","أوتوكو","كانجي","كاهو","ايتشو","شوتوكو","كووا (١٠٩٩–١١٠٤)‏","تشوجي","كاشو","تنين","تن-اي","ايكيو (١١١٣–١١١٨)‏","جن-اي","هوان","تنجي","ديجي","تنشو (١١٣١–١١٣٢)‏","تشوشو","هوين","ايجي","كوجي (١١٤٢–١١٤٤)‏","تنيو","كيوان","نينبيي","كيوجو","هجين","هيجي","ايرياكو","أوهو","تشوكان","ايمان","نين-ان","كاو","شون","أنجين","جيشو","يووا","جيي","جنريوكو","بنجي","كنكيو","شوجي","كنين","جنكيو (١٢٠٤–١٢٠٦)‏","كن-اي","شوجن (١٢٠٧–١٢١١)‏","كنرياكو","كنبو (١٢١٣–١٢١٩)‏","شوكيو","جو","جيننين","كروكو","أنتيي","كنكي","جويي","تمبكو","بنرياكو","كاتيي","رياكنين","ان-أو","نينجي","كنجين","هوجي","كنتشو","كوجن","شوكا","شوجن (١٢٥٩–١٢٦٠)‏","بن-أو","كوتشو","بن-اي","كنجي","كوان","شوو (١٢٨٨–١٢٩٣)‏","اينين","شوان","كنجن","كجن","توكجي","انكي","أوتشو","شووا (١٣١٢–١٣١٧)‏","بنبو","جنو","جنكيو (١٣٢١–١٣٢٤)‏","شوتشو (١٣٢٤–١٣٢٦)‏","كريكي","جنتكو","جنكو","كمو","إنجن","كوككو","شوهي","كنتكو","بنتشو","تنجو","كورياكو","كووا (١٣٨١–١٣٨٤)‏","جنتشو","مييتكو (١٣٨٤–١٣٨٧)‏","كاكي","كو","مييتكو (١٣٩٠–١٣٩٤)‏","أويي","شوتشو (١٤٢٨–١٤٢٩)‏","ايكيو (١٤٢٩–١٤٤١)‏","ككيتسو","بن-أن","هوتكو","كيوتكو","كوشو","تشوركو","كنشو","بنشو","أونين","بنمي","تشوكيو (١٤٨٧–١٤٨٩)‏","انتكو","ميو","بنكي","ايشو (١٥٠٤–١٥٢١)‏","تييي","كيوركو","تنمن","كوجي (١٥٥٥–١٥٥٨)‏","ايركو","جنكي","تنشو (١٥٧٣–١٥٩٢)‏","بنركو","كيتشو","جنوا","كان-اي","شوهو (١٦٤٤–١٦٤٨)‏","كيان","شوو (١٦٥٢–١٦٥٥)‏","ميرياكو","منجي","كنبن","انبو","تنوا","جوكيو","جنركو","هويي","شوتكو","كيوهو","جنبن","كنبو (١٧٤١–١٧٤٤)‏","انكيو (١٧٤٤–١٧٤٨)‏","كان-ان","هورياكو","مييوا","ان-اي","تنمي","كنسي","كيووا","بنكا","بنسي","تنبو","كوكا","كاي","أنسي","من-ان","بنكيو","جنجي","كيو","ميجي","تيشو","شووا","هيسي","فرفردن","أذربيهشت","خرداد","تار","مرداد","شهرفار","مهر","آيان","آذر","دي","بهمن","اسفندار","ه‍.ش","جمهورية الصي","arab","{currency} {number}","{minusSign}{currency} {number}","٫","٬","ليس رقم","‏+","‏-","٪","ليس رقمًا","‎+","‎-","د.إ.‏","د.ب.‏","د.ج.‏","ج.م.‏","ر.إن.","د.ع.‏","ر.إ.","د.أ.‏","ف.ج.ق.‏","د.ك.‏","ل.ل.‏","د.ل.‏","د.م.‏","أ.م.‏","ر.ع.‏","ر.ب.","ر.ق.‏","ر.س.‏","د.س.‏","ج.س.","ج.ج.س.","ل.س.‏","د.ت.‏","ل.ت.","***","ر.ي.‏","Fdj","جانفي","فيفري","أفريل","ماي","جوان","جويلية","أوت","Nfk","H:mm:ss zzzz","H:mm:ss z","H:mm:ss","H:mm","ش","آ","ت","كانون الثاني","حزيران","تشرین الأول","تشرين الثاني","كانون الأول","تشرين الأول","يوليوز","غشت","شتنبر","نونبر","دجنبر","إ","إبريل","أغشت","شتمبر","دجمبر","GB£","MM-dd","MM-dd, E","MMM d, E","y-MM","y-MM-dd, E","y MMM","y MMM d, E","y QQQ","y QQQQ","y MMMM d, EEEE","জানু","ফেব্ৰু","মাৰ্চ","এপ্ৰিল","মে","জুন","জুলাই","আগ","সেপ্ট","অক্টো","নভে","ডিসে","জানুৱাৰী","ফেব্ৰুৱাৰী","আগষ্ট","ছেপ্তেম্বৰ","অক্টোবৰ","নৱেম্বৰ","ডিচেম্বৰ","ৰবি","সোম","মঙ্গল","বুধ","বৃহষ্পতি","শুক্ৰ","শনি","দেওবাৰ","সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহষ্পতিবাৰ","শুক্ৰবাৰ","শনিবাৰ","পূৰ্বাহ্ণ","অপৰাহ্ণ","beng","EEEE, d MMMM y","Mac","Ago","Okt","Januari","Februari","Machi","Aprili","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Desemba","I","Jpi","Jtt","Jnn","Jtn","Alh","Ijm","Jmo","Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi","icheheavo","ichamthi","KM","BM","Kabla yakwe Yethu","Baada yakwe Yethu","{number} {currency}","{minusSign}{number} {currency}","TSh","{1} 'a' 'les' {0}","d MMM y G","E, d MMM y G","E, d MMM","E, d/M/y","LLLL 'de' y","EEEE, d MMMM 'de' y","d MMMM 'de' y","d/M/yy","X","P","xin","feb","mar","abr","may","xun","xnt","ago","set","och","pay","avi","de xineru","de febreru","de marzu","d’abril","de mayu","de xunu","de xunetu","d’agostu","de setiembre","d’ochobre","de payares","d’avientu","dom","llu","mié","xue","vie","sáb","domingu","llunes","martes","miércoles","xueves","vienres","sábadu","EB","era budista","de la mañana","de la tardi","mes 1","mes 2","mes 3","mes 4","mes 5","mes 6","mes 7","mes 8","mes 9","mes 10","mes 11","mes 12","mes","tek","hed","tah","ter","yek","meg","mia","gen","sen","ham","neh","pag","de meskerem","de tekemt","d’hedar","de tahsas","de ter","de yekatit","de megabit","de miazia","de genbot","de sene","d’hamle","de nehasse","de pagumen","aE","dE","a. E.","d. E.","antes de la Encarnación","después de la Encarnación","aC","dC","anE","nE","a.C.","d.C.","edC","n.E.","después de Cristu","antes de nuestra Era","nuestra Era","Taika","Tenpyō","T. kampō","T. shōhō","T. hōji","T. jingo","Saikō","Ten-an","Jōgan","Gangyō","Kanpyō","Jōhei","Tenryaku","Eien","Eihō","Hakuchi","Hakuhō","Shuchō","Taihō","Keiun","Wadō","Reiki","Yōrō","Jinki","T.-kampō","T.-shōhō","T.-hōji","T.-jingo","J.-keiun","Hōki","Ten-ō","Enryaku","Daidō","Kōnin","Tenchō","Jōwa","Kajō","Ninju","Ninna","Shōtai","Engi","Enchō","Tengyō","Tentoku","Ōwa","Kōhō","Anna","Tenroku","Ten’en","Jōgen","Tengen","Eikan","Kanna","Eiso","Shōryaku","Chōtoku","Chōhō","Kankō","Chōwa","Kannin","Jian","Manju","Chōgen","Chōryaku","Chōkyū","Kantoku","Eishō","Tengi","Kōhei","Jiryaku","Enkyū","Shōho","Shōryaku II","Ōtoku","Kanji","Kahō","Eichō","Jōtoku","Kōwa","Chōji","Kashō","Tennin","Ten-ei","Eikyū","Gen’ei","Hōan","Tenji","Daiji","Tenshō","Chōshō","Hōen","Eiji","Kōji","Ten’yō","Kyūan","Ninpei","Kyūju","Hōgen","Heiji","Eiryaku","Ōho","Chōkan","Eiman","Nin’an","Kaō","Shōan","Angen","Jishō","Yōwa","Juei","Genryaku","Bunji","Kenkyū","Shōji","Kennin","Genkyū","Ken’ei","Jōgen II","Kenryaku","Kenpō","Jōkyū","Jōō","Gennin","Karoku","Antei","Kanki","Jōei","Tenpuku","Bunryaku","Katei","Ryakunin","En’ō","Ninji","Kangen","Hōji","Kenchō","Kōgen","Shōka","Shōgen","Bun’ō","Kōchō","Bun’ei","Kenji","Kōan","Shōō","Einin","Shōan II","Kengen","Kagen","Tokuji","Enkyō","Ōchō","Bunpō","Genō","Genkō","Shōchū","Karyaku","Gentoku","Genkō II","Kenmu","Engen","Kōkoku","Shōhei","Kentoku","Bunchū","Tenju","Kōryaku","Kōwa II","Genchū","Meitoku","Kakei","Kōō","Meitoku II","Ōei","Shōchō","Eikyō","Kakitsu","Bun’an","Hōtoku","Kyōtoku","Kōshō","Chōroku","Kanshō","Bunshō","Ōnin","Bunmei","Chōkyō","Entoku","Meiō","Bunki","Eishō II","Taiei","Kyōroku","Tenbun","Kōji II","Eiroku","Genki","Tenshō II","Bunroku","Keichō","Genna","Kan’ei","Shōho II","Keian","Jōō II","Meireki","Manji","Kanbun","Enpō","Tenna","Jōkyō","Genroku","Hōei","Shōtoku","Kyōhō","Genbun","Kanpō","Enkyō II","Kan’en","Hōreki","Meiwa","An’ei","Tenmei","Kansei","Kyōwa","Bunka","Bunsei","Tenpō","Kōka","Kaei","Ansei","Man’en","Bunkyū","Genji","Keiō","e. Shōwa","En-ō (1239-1240)","era Shōwa","A.R.D.C.","R.D.C.","antes de la R.D.C.","ND","G MMM y","G d MMM y","G d MMM y, E","dd.MM","dd.MM, E","d MMM, E","MM.y","dd.MM.y","dd.MM.y, E","d MMM y, E","d MMMM y, EEEE","dd.MM.yy","yan","fev","apr","iyn","iyl","avq","okt","noy","dek","yanvar","fevral","mart","aprel","iyun","iyul","avqust","sentyabr","oktyabr","noyabr","dekabr","B.","B.E.","Ç.A.","Ç.","C.A.","C.","Ş.","bazar","bazar ertəsi","çərşənbə axşamı","çərşənbə","cümə axşamı","cümə","şənbə","e.ə.","b.e.","ü.e.ö.","ü.e.","eramızdan əvvəl","eramız","ümumi eradan öncə","ümumi era","₼","E, dd.MM","E, d, MMM","E, dd.MM.y","MMM, y","E, d, MMM, y","EEEE, d, MMMM, y","d MMMM, y","јанвар","феврал","март","апрел","май","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр","базар","базар ертәси","чәршәнбә ахшамы","чәршәнбә","ҹүмә ахшамы","ҹүмә","шәнбә","m","h","b","kɔn","mac","mat","mto","mpu","hil","nje","hik","dip","bio","liɓ","Kɔndɔŋ","Màcɛ̂l","Màtùmb","Màtop","M̀puyɛ","Hìlòndɛ̀","Njèbà","Hìkaŋ","Dìpɔ̀s","Bìòôm","Màyɛsèp","Lìbuy li ńyèe","ŋ","j","nɔy","nja","uum","ŋge","mbɔ","kɔɔ","jon","ŋgwà nɔ̂y","ŋgwà njaŋgumba","ŋgwà ûm","ŋgwà ŋgê","ŋgwà mbɔk","ŋgwà kɔɔ","ŋgwà jôn","I bikɛ̂glà","I ɓugajɔp","b.Y.K","m.Y.K","bisū bi Yesù Krǐstò","i mbūs Yesù Krǐstò","{number} {percentSign}","{minusSign}{number} {percentSign}","{1} 'у' {0}","E hh.mm a","E HH.mm","E hh.mm.ss a","E HH.mm.ss","LLL y G","hh a","hh.mm a","HH.mm","hh.mm.ss a","HH.mm.ss","hh.mm.ss a v","HH.mm.ss v","hh.mm a v","HH.mm v","d.M","E, d.M","E, d MMMM","mm.ss","M.y","d.M.y","E, d.M.y","LLL y","LLLL y","d.M.yy","HH.mm.ss zzzz","HH.mm.ss z","с","л","к","м","ч","ж","в","сту","лют","сак","кра","мая","чэр","ліп","жні","вер","кас","ліс","сне","студзеня","лютага","сакавіка","красавіка","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня","н","п","а","нд","пн","аў","ср","чц","пт","сб","нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота","да паўдня","пасля паўдня","да н.э.","н.э.","да нашай эры","нашай эры","наша эра","р.","₽","E","Epr","Oga","Dis","Epreo","Ogasti","Disemba","Pa Mulungu","Palichimo","Palichibuli","Palichitatu","Palichine","Palichisano","Pachibelushi","uluchelo","akasuba","Before Yesu","After Yesu","Hut","Vil","Dat","Tai","Han","Sit","Sab","Nan","Tis","Kum","Kmj","Kmb","pa mwedzi gwa hutala","pa mwedzi gwa wuvili","pa mwedzi gwa wudatu","pa mwedzi gwa wutai","pa mwedzi gwa wuhanu","pa mwedzi gwa sita","pa mwedzi gwa saba","pa mwedzi gwa nane","pa mwedzi gwa tisa","pa mwedzi gwa kumi","pa mwedzi gwa kumi na moja","pa mwedzi gwa kumi na mbili","Mul","Hiv","Hid","Hit","Hih","Lem","pa mulungu","pa shahuviluha","pa hivili","pa hidatu","pa hitayi","pa hihanu","pa shahulembela","pamilau","pamunyi","Kabla ya Mtwaa","Baada ya Mtwaa","E, d","E, h:mm a","E, HH:mm","E, h:mm:ss a","E, H:mm:ss","y 'г'. G","MM.y 'г'. G","d.MM.y 'г'. G","E, d.MM.y 'г'. G","MMMM y 'г'. G","d MMMM y 'г'. G","E, d MMMM y 'г'. G","d.MM","E, d.MM","MM","LLLL","y 'г'.","M.y 'г'.","d.MM.y 'г'.","E, d.MM.y 'г'.","MM.y 'г'.","MMMM y 'г'.","d MMMM y 'г'.","E, d MMMM y 'г'.","QQQ y 'г'.","QQQQ y 'г'.","EEEE, d MMMM y 'г'.","d.MM.yy 'г'.","я","ф","ю","о","д","яну","фев","апр","юни","юли","авг","сеп","окт","ное","дек","януари","февруари","април","септември","октомври","ноември","декември","вт","чт","неделя","понеделник","вторник","сряда","четвъртък","петък","събота","пр.об.","сл.об.","пр.Хр.","сл.Хр.","пр.н.е.","сл.н.е.","преди Христа","след Христа","преди новата ера","след новата ера","тишри","хешван","кислев","тебет","шебат","адар I","адар","нисан","иар","сиван","тамуз","ав","елул","адар II","чайтра","вайсакха","джаинтха","асадха","сравана","бхада","азвина","картика","аграхайана","пауза","магха","пхалгуна","мухарам","сафар","раби-1","раби-2","джумада-1","джумада-2","раджаб","шабан","рамазан","Шавал","Дхул-Каада","Дхул-хиджа","лв.","щ.д.","d/MM","dd/MM","MMM","MM/y","Z","U","Ɔ","zan","awi","mɛ","zuw","zul","uti","sɛt","ɔku","now","des","zanwuye","feburuye","marisi","awirili","zuwɛn","zuluye","sɛtanburu","ɔkutɔburu","nowanburu","desanburu","kar","ntɛ","tar","ara","ala","jum","sib","kari","ntɛnɛ","tarata","araba","alamisa","juma","sibiri","J.-C. ɲɛ","ni J.-C.","jezu krisiti ɲɛ","jezu krisiti minkɛ","d MMM, y G","E, d MMM, y G","E, d-M","E, d MMM, y","EEEE, d MMMM, y","জা","ফে","মা","এ","জু","আ","সে","অ","ন","ডি","জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর","র","সো","ম","বু","বৃ","শু","শ","রবি","বৃহস্পতি","শুক্র","রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার","অপরাহ্ণ","খ্রিস্টপূর্ব","খৃষ্টাব্দ","খ্রিষ্টপূর্বাব্দ","খ্রিষ্টাব্দ","১","২","৩","৪","৫","৬","৭","৮","৯","১০","১১","১২","চৈত্র","বৈশাখ","জৈষ্ঠ্য","আষাঢ়","শ্রাবণ","ভাদ্র","আশ্বিন","কার্তিক","অগ্রহায়ণ","পৌষ","মাঘ","ফাল্গুন","সাল","মহররম","সফর","রবিউল আউয়াল","রবিউস সানি","জমাদিউল আউয়াল","জমাদিউস সানি","রজব","শা‘বান","রমজান","শাওয়াল","জ্বিলকদ","জ্বিলহজ্জ","যুগ","সংখ্যা না","৳","G y LLLL","MMMཚེས་d","MMMཚེས་d, E","MMMMའི་ཚེས་d","y LLL","y ལོའི་MMMཚེས་d","སྤྱི་ལོ་y MMMMའི་ཚེས་d","y MMMMའི་ཚེས་d, EEEE","ཟླ་༡","ཟླ་༢","ཟླ་༣","ཟླ་༤","ཟླ་༥","ཟླ་༦","ཟླ་༧","ཟླ་༨","ཟླ་༩","ཟླ་༡༠","ཟླ་༡༡","ཟླ་༡༢","ཟླ་བ་དང་པོ","ཟླ་བ་གཉིས་པ","ཟླ་བ་གསུམ་པ","ཟླ་བ་བཞི་པ","ཟླ་བ་ལྔ་པ","ཟླ་བ་དྲུག་པ","ཟླ་བ་བདུན་པ","ཟླ་བ་བརྒྱད་པ","ཟླ་བ་དགུ་པ","ཟླ་བ་བཅུ་པ","ཟླ་བ་བཅུ་གཅིག་པ","ཟླ་བ་བཅུ་གཉིས་པ","ཉི","ཟླ","མིག","ལྷག","ཕུར","སངས","སྤེན","ཉི་མ་","ཟླ་བ་","མིག་དམར་","ལྷག་པ་","ཕུར་བུ་","པ་སངས་","སྤེན་པ་","གཟའ་ཉི་མ་","གཟའ་ཟླ་བ་","གཟའ་མིག་དམར་","གཟའ་ལྷག་པ་","གཟའ་ཕུར་བུ་","གཟའ་པ་སངས་","གཟའ་སྤེན་པ་","སྔ་དྲོ་","ཕྱི་དྲོ་","སྤྱི་ལོ་སྔོན་","སྤྱི་ལོ་","ཨང་མེན་","{1} 'da' {0}","E d MMM y G","E dd/MM","E dd/MM/y","01","02","03","04","05","06","07","08","09","Gen.","Cʼhwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu.","Genver","Cʼhwevrer","Meurzh","Ebrel","Mezheven","Gouere","Gwengolo","Kerzu","Su","Mz","Mc","G","Sa","Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad.","Mercʼher","Gwener","Sadorn","A.M.","G.M.","a-raok J.K.","goude J.K.","a-raok Jezuz-Krist","goude Jezuz-Krist","a-raok R.S.","R.S.","a-raok Republik Sina","Republik Sina","$A","$CA","£ RU","$ HK","$ ZN","$ SU","MMM, y G","d-MMM","ज","फे","मा","ए","मे","जु","आ","से","अ","न","दि","जानुवारी","फेब्रुवारी","मार्स","एफ्रिल","जुन","जुलाइ","आगस्थ","सेबथेज्ब़र","अखथबर","नबेज्ब़र","दिसेज्ब़र","र","स","मं","बु","बि","सु","रबि","सम","मंगल","बुद","बिसथि","सुखुर","सुनि","रबिबार","समबार","मंगलबार","बुदबार","बिसथिबार","सुखुरबार","सुनिबार","फुं","बेलासे","ईसा.पूर्व","सन","बैसागो/बैसाग","जेथो","आसार","सावुन","भाद्र","आसिन","खाथि","आगाह्न","फुस","मागो","फागुन","सैथो","{1} 'u' {0}","E, dd.","y. G","MMM y. G","dd. MMM y. G","E, dd. MMM y. G","hh:mm a","hh:mm:ss a","dd.MM.","E, dd.MM.","dd. MM.","dd. MMM","E, dd. MMM","d. MMMM","E, d. MMMM","y.","MM.y.","dd.MM.y.","E, dd.MM.y.","MM. y.","MMM y.","dd. MMM y.","E, dd. MMM y.","LLLL y.","EEEE, dd. MMMM y.","dd. MMMM y.","dd. MMM. y.","dd.MM.yy.","a","o","jan","maj","jun","jul","aug","sep","nov","dec","januar","februar","april","juni","juli","august","septembar","oktobar","novembar","decembar","Č","ned","pon","uto","sri","čet","pet","sub","nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota","prije podne","popodne","p. n. e.","n. e.","pr.n.e.","n.e.","Prije nove ere","Nove ere","pr. n. e.","kn","din.","E, d.","d.M.yy.","ј","јан","феб","мар","мај","јун","јул","нов","дец","јануар","фебруар","јуни","јули","септембар","октобар","новембар","децембар","у","нед","пон","уто","сри","чет","пет","суб","недеља","понедељак","уторак","сриједа","четвртак","петак","БЕ","пре подне","поподне","Таут","Баба","Хатор","Киахк","Тоба","Амшир","Барамхат","Барамуда","Башанс","Паона","Епеп","Месра","Наси","Мескерем","Текемт","Хедар","Тахсас","Тер","Јекатит","Мегабит","Миазиа","Генбот","Сене","Хамле","Нехасе","Пагумен","п.н.е.","н.е.","п. н. е.","н. е.","Пре нове ере","Нове ере","Тишри","Хешван","Кислев","Тевет","Шеват","Адар I","Адар","Нисан","Ијар","Сиван","Тамуз","Ав","Елул","Адар II","Чаитра","Ваисака","Јиаиста","Асада","Сравана","Бадра","Асвина","Картика","Аргајана","Пауза","Мага","Фалгуна","САКА","Мурахам","Сафар","Рабиʻ I","Рабиʻ II","Јумада I","Јумада II","Рађаб","Шаʻбан","Рамадан","Дуʻл-Киʻда","Дуʻл-хиђа","АХ","Таика (645–650)","Хакучи (650–671)","Хакухо (672–686)","Шучо (686–701)","Таихо (701–704)","Кеиун (704–708)","Вадо (708–715)","Реики (715–717)","Јоро (717–724)","Јинки (724–729)","Темпио (729–749)","Темпио-кампо (749-749)","Темпио-шохо (749-757)","Темпио-хођи (757-765)","Темпо-ђинго (765-767)","Ђинго-кеиун (767-770)","Хоки (770–780)","Тен-о (781-782)","Енрјаку (782–806)","Даидо (806–810)","Конин (810–824)","Тенчо (824–834)","Шова (834–848)","Кајо (848–851)","Нињу (851–854)","Саико (854–857)","Тенан (857–859)","Јоган (859–877)","Генкеи (877–885)","Ниња (885–889)","Кампјо (889–898)","Шотаи (898–901)","Енђи (901–923)","Енчо (923–931)","Шохеи (931–938)","Тенгјо (938–947)","Тенриаку (947–957)","Тентоку (957–961)","Ова (961–964)","Кохо (964–968)","Ана (968–970)","Тенроку (970–973)","Тен-ен (973-976)","Јоген (976–978)","Тенген (978–983)","Еикан (983–985)","Кана (985–987)","Еи-ен (987-989)","Еисо (989–990)","Шорјаку (990–995)","Чотоку (995–999)","Чохо (999–1004)","Канко (1004–1012)","Чова (1012–1017)","Канин (1017–1021)","Ђиан (1021–1024)","Мању (1024–1028)","Чоген (1028–1037)","Чорјаку (1037–1040)","Чокју (1040–1044)","Кантоку (1044–1046)","Еишо (1046–1053)","Тенђи (1053–1058)","Кохеи (1058–1065)","Ђирјаку (1065–1069)","Енкју (1069–1074)","Шохо (1074–1077)","Шорјаку (1077–1081)","Еишо (1081–1084)","Отоку (1084–1087)","Канђи (1087–1094)","Кахо (1094–1096)","Еичо (1096–1097)","Шотоку (1097–1099)","Кова (1099–1104)","Чођи (1104–1106)","Кашо (1106–1108)","Тенин (1108–1110)","Тен-еи (1110-1113)","Еикју (1113–1118)","Ђен-еи (1118-1120)","Хоан (1120–1124)","Тенђи (1124–1126)","Даиђи (1126–1131)","Теншо (1131–1132)","Чошао (1132–1135)","Хоен (1135–1141)","Еиђи (1141–1142)","Кођи (1142–1144)","Тењо (1144–1145)","Кјуан (1145–1151)","Нинпеи (1151–1154)","Кјују (1154–1156)","Хоген (1156–1159)","Хеиђи (1159–1160)","Еирјаку (1160–1161)","Охо (1161–1163)","Чокан (1163–1165)","Еиман (1165–1166)","Нин-ан (1166-1169)","Као (1169–1171)","Шоан (1171–1175)","Анген (1175–1177)","Ђишо (1177–1181)","Јова (1181–1182)","Ђуеи (1182–1184)","Генрјуку (1184–1185)","Бунђи (1185–1190)","Кенкју (1190–1199)","Шођи (1199–1201)","Кенин (1201–1204)","Генкју (1204–1206)","Кен-еи (1206-1207)","Шоген (1207–1211)","Кенрјаку (1211–1213)","Кенпо (1213–1219)","Шокју (1219–1222)","Ђу (1222–1224)","Ђенин (1224–1225)","Кароку (1225–1227)","Антеи (1227–1229)","Канки (1229–1232)","Ђоеи (1232–1233)","Темпуку (1233–1234)","Бунрјаку (1234–1235)","Катеи (1235–1238)","Рјакунин (1238–1239)","Ен-о (1239-1240)","Нињи (1240–1243)","Канген (1243–1247)","Хођи (1247–1249)","Кенчо (1249–1256)","Коген (1256–1257)","Шока (1257–1259)","Шоген (1259–1260)","Бун-о (1260-1261)","Кочо (1261–1264)","Бун-еи (1264-1275)","Кенђи (1275–1278)","Коан (1278–1288)","Шу (1288–1293)","Еинин (1293–1299)","Шоан (1299–1302)","Кенген (1302–1303)","Каген (1303–1306)","Токуђи (1306–1308)","Енкеи (1308–1311)","Очо (1311–1312)","Шова (1312–1317)","Бунпо (1317–1319)","Ђено (1319–1321)","Ђенкјо (1321–1324)","Шочу (1324–1326)","Кареки (1326–1329)","Гентоку (1329–1331)","Генко (1331–1334)","Кему (1334–1336)","Енген (1336–1340)","Кококу (1340–1346)","Шохеи (1346–1370)","Кентоку (1370–1372)","Бучу (1372–1375)","Тењу (1375–1379)","Корјаку (1379–1381)","Кова (1381–1384)","Генчу (1384–1392)","Меитоку (1384–1387)","Какеи (1387–1389)","Ку (1389–1390)","Меитоку (1390–1394)","Оеи (1394–1428)","Шочо (1428–1429)","Еикјо (1429–1441)","Какитсу (1441–1444)","Бун-ан (1444-1449)","Хотоку (1449–1452)","Кјотоку (1452–1455)","Кошо (1455–1457)","Чороку (1457–1460)","Каншо (1460–1466)","Буншо (1466–1467)","Онин (1467–1469)","Бунмеи (1469–1487)","Чокјо (1487–1489)","Ентоку (1489–1492)","Меио (1492–1501)","Бунки (1501–1504)","Еишо (1504–1521)","Таиеи (1521–1528)","Кјороку (1528–1532)","Тенмон (1532–1555)","Кођи (1555–1558)","Еироку (1558–1570)","Генки (1570–1573)","Теншо (1573–1592)","Бунроку (1592–1596)","Кеичо (1596–1615)","Генва (1615–1624)","Кан-еи (1624-1644)","Шохо (1644–1648)","Кеиан (1648–1652)","Шу (1652–1655)","Меирјаку (1655–1658)","Мањи (1658–1661)","Канбун (1661–1673)","Енпо (1673–1681)","Тенва (1681–1684)","Јокјо (1684–1688)","Генроку (1688–1704)","Хоеи (1704–1711)","Шотоку (1711–1716)","Кјохо (1716–1736)","Генбун (1736–1741)","Канпо (1741–1744)","Енкјо (1744–1748)","Кан-ен (1748-1751)","Хорјаку (1751–1764)","Меива (1764–1772)","Ан-еи (1772-1781)","Тенмеи (1781–1789)","Кансеи (1789–1801)","Кјова (1801–1804)","Бунка (1804–1818)","Бунсеи (1818–1830)","Тенпо (1830–1844)","Кока (1844–1848)","Каеи (1848–1854)","Ансеи (1854–1860)","Ман-ен (1860-1861)","Бункју (1861–1864)","Генђи (1864–1865)","Кеико (1865–1868)","Меиђи","Таишо","Шова","Хаисеи","Фаравадин","Ордибехешт","Кордад","Тир","Мордад","Шахривар","Мехр","Абан","Азар","Деј","Бахман","Есфанд","Пре РК","РК","КМ","Кч","зл","дин.","Тл","E H:mm","E H:mm:ss","LLLL 'de' y G","d MMMM 'de' y G","E, d MMMM 'de' y G","LLL 'de' y","E, d MMMM 'de' y","GN","FB","MÇ","AB","MG","JN","JL","AG","ST","OC","NV","DS","gen.","febr.","març","abr.","maig","juny","jul.","ag.","set.","oct.","nov.","des.","de gener","de febrer","de març","de maig","de juny","de juliol","d’agost","de setembre","d’octubre","de novembre","de desembre","dg","dl","dt","dc","dj","dv","ds","dg.","dl.","dt.","dc.","dj.","dv.","ds.","diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte","eB","a. m.","p. m.","AEC","EC","abans de Crist","després de Crist","abans de l’Era Comuna","Era Comuna","₧","янв","июн","июл","сен","ноя","январь","февраль","апрель","июнь","июль","сентябрь","октябрь","ноябрь","декабрь","кӀиранан де","оршотан де","шинарин де","кхаарин де","еарин де","пӀераскан де","шот де","Терхьаш дац","KBZ","KBR","KST","KKN","KTN","KMK","KMS","KMN","KMW","KKM","KNK","KNB","Okwokubanza","Okwakabiri","Okwakashatu","Okwakana","Okwakataana","Okwamukaaga","Okwamushanju","Okwamunaana","Okwamwenda","Okwaikumi","Okwaikumi na kumwe","Okwaikumi na ibiri","SAN","ORK","OKB","OKS","OKN","OKT","OMK","Sande","Orwokubanza","Orwakabiri","Orwakashatu","Orwakana","Orwakataano","Orwamukaaga","Kurisito Atakaijire","Kurisito Yaijire","USh","Ꭴ","Ꭷ","Ꭰ","Ꮥ","Ꭻ","Ꭶ","Ꮪ","Ꮕ","Ꭵ","ᎤᏃ","ᎧᎦ","ᎠᏅ","ᎧᏬ","ᎠᏂ","ᏕᎭ","ᎫᏰ","ᎦᎶ","ᏚᎵ","ᏚᏂ","ᏅᏓ","ᎥᏍ","ᎤᏃᎸᏔᏅ","ᎧᎦᎵ","ᎠᏅᏱ","ᎧᏬᏂ","ᎠᏂᏍᎬᏘ","ᏕᎭᎷᏱ","ᎫᏰᏉᏂ","ᎦᎶᏂ","ᏚᎵᏍᏗ","ᏚᏂᏅᏗ","ᏅᏓᏕᏆ","ᎥᏍᎩᏱ","Ꮖ","Ꮙ","Ꮤ","Ꮶ","Ꮷ","ᏆᏍᎬ","ᏉᏅᎯ","ᏔᎵᏁ","ᏦᎢᏁ","ᏅᎩᏁ","ᏧᎾᎩ","ᏈᏕᎾ","ᎤᎾᏙᏓᏆᏍᎬ","ᎤᎾᏙᏓᏉᏅᎯ","ᏔᎵᏁᎢᎦ","ᏦᎢᏁᎢᎦ","ᏅᎩᏁᎢᎦ","ᏧᎾᎩᎶᏍᏗ","ᎤᎾᏙᏓᏈᏕᎾ","ᏌᎾᎴ","ᏒᎯᏱᎢᏗᏢ","ᎤᏓᎷᎸ","ᎤᎶᏐᏅ","Ꮟ ᏥᏌ ᎾᏕᎲᏍᎬᎾ","ᎠᎩᏃᎮᎵᏓᏍᏗᏱ ᎠᏕᏘᏱᏍᎬ ᏱᎰᏩ ᏧᏓᏂᎸᎢᏍᏗ","d.","E d.","LLLL y G","d. M. y G","E d. M. y G","d. MMMM y G","E d. MMMM y G","H:mm:ss v","H:mm v","d. M.","E d. M.","E d. MMMM","d. M. y","E d. M. y","d. MMMM y","E d. MMMM y","EEEE d. MMMM y","led","úno","bře","dub","kvě","čvn","čvc","srp","zář","říj","lis","pro","ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince","Ú","ne","po","út","st","čt","pá","so","neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota","dop.","odp.","př.n.l.","n.l.","př. n. l.","n. l.","Před R. O. C.","Kčs","Kč","ECU","{1} 'am' {0}","E, HH:mm:ss","Q y","dd/MM/yy","Ch","Rh","Ion","Chwef","Maw","Ebrill","Mai","Meh","Gorff","Awst","Medi","Hyd","Tach","Rhag","Ionawr","Chwefror","Mawrth","Mehefin","Gorffennaf","Hydref","Tachwedd","Rhagfyr","Ll","Llun","Mer","Iau","Gwen","Sad","Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn","C","CC","Cyn Crist","Oed Crist","Cyn Cyfnod Cyffredin","Cyfnod Cyffredin","{1} 'kl'. {0}","E 'den' d.","E h.mm a","E h.mm.ss a","d. MMM y G","E d. MMM y G","h.mm a","h.mm.ss a","h.mm.ss a v","h.mm a v","d. MMM","E d. MMM","d. MMM y","E d. MMM y","EEEE 'den' d. MMMM y","jan.","feb.","mar.","apr.","jun.","aug.","sep.","okt.","dec.","marts","september","oktober","november","december","søn.","man.","tir.","ons.","tor.","fre.","lør.","søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag","fKr","eKr","fvt","vt","f.Kr.","e.Kr.","f.v.t.","v.t.","før vesterlandsk tidsregning","vesterlandsk tidsregning","kr.","h.mm.ss a zzzz","h.mm.ss a z","Imb","Kaw","Kad","Kan","Kas","Kar","Mfu","Wun","Ike","Iku","Imw","Iwi","Mori ghwa imbiri","Mori ghwa kawi","Mori ghwa kadadu","Mori ghwa kana","Mori ghwa kasanu","Mori ghwa karandadu","Mori ghwa mfungade","Mori ghwa wunyanya","Mori ghwa ikenda","Mori ghwa ikumi","Mori ghwa ikumi na imweri","Mori ghwa ikumi na iwi","Jum","Jim","Ngu","Ituku ja jumwa","Kuramuka jimweri","Kuramuka kawi","Kuramuka kadadu","Kuramuka kana","Kuramuka kasanu","Kifula nguwo","Luma lwa K","luma lwa p","KK","Kabla ya Kristo","Baada ya Kristo","Ksh","{1} 'um' {0}","E, d. MMM y G","HH 'Uhr'","d.M.","E, d.M.","d.MM.","E, d. MMM","E, d. MMM y","EEEE, d. MMMM y","März","Juli","Dez.","Januar","Februar","Dezember","Mo.","Mi.","Fr.","Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","vorm.","nachm.","v. Chr.","n. Chr.","v. u. Z.","u. Z.","vor unserer Zeitrechnung","unserer Zeitrechnung","öS","BGK","BGJ","DM","Jän.","Jänner","{currency}{minusSign}{number}","'","Ž","Žan","Fee","Awi","Me","Žuw","Žuy","Ut","Sek","Noo","Dee","Žanwiye","Feewiriye","Marsi","Awiril","Žuweŋ","Žuyye","Sektanbur","Oktoobur","Noowanbur","Deesanbur","Ati","Ata","Ala","Alm","Alz","Asi","Alhadi","Atinni","Atalaata","Alarba","Alzuma","Asibti","Subbaahi","Zaarikay b","IJ","IZ","Isaa jine","Isaa zamanoo","E, 'zeg'. H:mm","'zeg'. H","'zeg'. H:mm","měr.","maj.","awg.","now.","januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra","p","w","pón","wał","srj","stw","pět","sob","njeźela","pónjeźele","wałtora","srjoda","stwórtk","pětk","dopołdnja","wótpołdnja","pś.Chr.n.","pó Chr.n.","pś.n.l.c.","n.l.c.","pśed Kristusowym naroźenim","pó Kristusowem naroźenju","pśed našym licenim casa","našogo licenja casa","zł","e","di","ŋgɔn","sɔŋ","diɓ","emi","esɔ","mad","diŋ","nyɛt","tin","elá","dimɔ́di","ŋgɔndɛ","sɔŋɛ","diɓáɓá","emiasele","esɔpɛsɔpɛ","madiɓɛ́díɓɛ́","diŋgindi","nyɛtɛki","mayésɛ́","tiníní","eláŋgɛ́","ɗ","ét","mɔ́s","kwa","muk","ŋgi","ɗón","esa","éti","mɔ́sú","kwasú","mukɔ́sú","ŋgisú","ɗónɛsú","esaɓasú","idiɓa","ebyámu","ɓ.Ys","mb.Ys","ɓoso ɓwá yáɓe lá","mbúsa kwédi a Yés","Fe","Ma","Ab","Sú","Se","Ok","No","De","Sanvie","Fébirie","Mars","Aburil","Mee","Sueŋ","Súuyee","Settembar","Oktobar","Novembar","Disambar","Dim","Ten","Tal","Ara","Arj","Sib","Dimas","Teneŋ","Talata","Alarbay","Aramisay","Arjuma","Sibiti","ArY","AtY","Ariŋuu Yeesu","Atooŋe Yeesu","G y སྤྱི་ཟླ་MMM","གཟའ་E, G ལོy ཟླ་MMM ཚེ་d","ཆུ་ཚོད་h a","ཆུ་ཚོད་HH","M-d","E, M-d","སྤྱི་LLL","སྤྱི་LLL ཚེ་d","E, སྤྱི་LLL ཚེ་d","y-M","y-M-d","E, y-M-d","y སྤྱི་ཟླ་MMM","གཟའ་E, ལོy ཟླ་MMM ཚེ་d","EEEE, སྤྱི་ལོ་y MMMM ཚེས་dd","སྤྱི་ལོ་y MMMM ཚེས་ dd","སྤྱི་ལོ་y ཟླ་MMM ཚེས་dd","ཆུ་ཚོད་ h སྐར་མ་ mm:ss a zzzz","ཆུ་ཚོད་ h སྐར་མ་ mm:ss a z","ཆུ་ཚོད་h:mm:ss a","ཆུ་ཚོད་ h སྐར་མ་ mm a","༡","༢","༣","༥","༦","༧","༨","༡༠","༡༡","༡༢","༤","༩","ཟླ་དངཔ་","ཟླ་གཉིས་པ་","ཟླ་གསུམ་པ་","ཟླ་བཞི་པ་","ཟླ་ལྔ་པ་","ཟླ་དྲུག་པ","ཟླ་བདུན་པ་","ཟླ་བརྒྱད་པ་","ཟླ་དགུ་པ་","ཟླ་བཅུ་པ་","ཟླ་བཅུ་གཅིག་པ་","ཟླ་བཅུ་གཉིས་པ་","མིར","སངྶ","ཟླ་","མིར་","ལྷག་","ཕུར་","སངས་","སྤེན་","ཉི་","སྔ་ཆ་","ཕྱི་ཆ་","tibt","ཨང་མད","གྲངས་མེད","Nu.","KR₩","TH฿","Mbe","Kai","Kat","Gat","Gan","Mug","Knn","Ken","Igi","Mweri wa mbere","Mweri wa kaĩri","Mweri wa kathatũ","Mweri wa kana","Mweri wa gatano","Mweri wa gatantatũ","Mweri wa mũgwanja","Mweri wa kanana","Mweri wa kenda","Mweri wa ikũmi","Mweri wa ikũmi na ũmwe","Mweri wa ikũmi na Kaĩrĩ","Kma","Tat","Ine","Tan","Arm","Maa","NMM","Kiumia","Njumatatu","Njumaine","Njumatano","Aramithi","Njumaa","NJumamothii","KI","UT","MK","TK","Mbere ya Kristo","Thutha wa Kristo","{0} {1}","E a 'ga' h:mm","E a 'ga' h:mm:ss","MMM d 'lia', y G","E, MMM d 'lia' y G","a 'ga' h","a 'ga' h:mm","a 'ga' h:mm:ss","MMM d 'lia'","E, MMM d 'lia'","MMMM d 'lia'","E, MMMM d 'lia'","'aɖabaƒoƒo' mm:ss","MMM d 'lia', y","EEEE, MMMM d 'lia' y","MMMM d 'lia' y","a 'ga' h:mm:ss zzzz","a 'ga' h:mm:ss z","dzv","dzd","ted","afɔ","dam","mas","sia","dea","any","kel","ade","dzm","dzove","dzodze","tedoxe","afɔfĩe","dama","masa","siamlɔm","deasiamime","anyɔnyɔ","kele","adeɛmekpɔxe","dzome","kɔs","dzo","bla","kuɖ","yaw","fiɖ","mem","kɔsiɖa","dzoɖa","blaɖa","kuɖa","yawoɖa","fiɖa","memleɖa","ŋdi","ɣetrɔ","hY","Yŋ","Bŋ","Eŋ","Hafi Yesu Va Do ŋgɔ","Yesu Ŋɔli","mnn","{1} - {0}","Ι","Φ","Μ","Α","Σ","Ο","Ν","Δ","Ιαν","Φεβ","Μαρ","Απρ","Μαΐ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ","Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου","Κ","Τ","Π","Κυρ","Δευ","Τρί","Τετ","Πέμ","Παρ","Σάβ","Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο","π.μ.","μ.μ.","π.Χ.","μ.Χ.","π.Κ.Χ.","ΚΧ","προ Χριστού","μετά Χριστόν","πριν από την Κοινή Χρονολογία","Κοινή Χρονολογία","Πριν R.O.C.","Δρχ","E, dd/MM","E, dd/MM/y","LL","E, d MMM,y","dMMMM,y","dMMM,y","Mar.","Oct.","Dec.","Su.","M.","Tu.","W.","Th.","F.","Sun.","Mon.","Tue.","Wed.","Thu.","Fri.","Sat.","am","pm","Rs","CFP","FBu","dd MMM","E, dd MMM","E, dd MMM y","dd-MMM-y","E, MM-dd","E, y-MM-dd","E H.mm","E H.mm.ss","H.mm","H.mm.ss","H.mm.ss v","H.mm v","H.mm.ss zzzz","H.mm.ss z","a.m.","p.m.","E d MMM, y","Ar","MOP$","RM","₦","{currency} {minusSign}{number}","d/MM/y","d/MM/yy","₱","RF","SR","kr","Le","NAf.","T$","VT","WS$","MM/dd","E, MM/dd","y/MM/dd","E, y/MM/dd","dd MMM, y","E, dd MMM, y","dd MMM,y","EEEE, d-'a' 'de' MMMM y","y-MMMM-dd","y-MMM-dd","yy-MM-dd","H-'a' 'horo' 'kaj' m:ss zzzz","aŭg","januaro","februaro","marto","aprilo","majo","junio","julio","aŭgusto","septembro","oktobro","novembro","decembro","lu","ma","me","ĵa","ve","sa","dimanĉo","lundo","mardo","merkredo","ĵaŭdo","vendredo","sabato","atm","ptm","aK","pK","E, H:mm","MMMM 'de' y G","d 'de' MMMM 'de' y G","E, d 'de' MMMM 'de' y G","h:mm:ss a (vvvv)","H:mm:ss (vvvv)","d 'de' MMMM","E, d 'de' MMMM","EEE, d/M/y","EEE, d MMM y","MMMM 'de' y","d 'de' MMMM 'de' y","EEE, d 'de' MMMM 'de' y","QQQQ 'de' y","EEEE, d 'de' MMMM 'de' y","H:mm:ss (zzzz)","ene.","may.","ago.","sept.","dic.","enero","febrero","marzo","abril","mayo","agosto","septiembre","octubre","noviembre","diciembre","dom.","lun.","mié.","jue.","vie.","sáb.","domingo","lunes","jueves","viernes","sábado","a. C.","d. C.","a. e. c.","e. c.","antes de Cristo","después de Cristo","antes de la era común","era común","antes de R.O.C.","d 'de' MMM 'de' y G","dd-MMM","E, d 'de' MMM 'de' y","QQQ 'de' y","v","E, d 'de' MMM 'de' y G","hh:mm:ss","E d-M","M-y","d 'de' MMM 'de' y","Bs","E, dd-MM","dd-MM-y","E dd-MM-y","dd-MM-yy","MMM 'de' y G","E, d MMM 'de' y G","d 'de' MMM","E, d 'de' MMM","MMM 'de' y","₡","d MMM 'de' y","antes de la Era Común","Era Común","RD$","Q","EEEE dd 'de' MMMM 'de' y","dd 'de' MMMM 'de' y","E d 'de' MMM","ene","oct","dic","Af","Naf","Kz","$a","Afl.","C$","MM/dd/y","E MM/dd/y","MM/dd/yy","B/.","setiembre","S/.","Gs.","Bs.","E h:mm.ss a","E HH:mm.ss","E, d. MMMM y G","h:mm.ss a","H:mm.ss","h:mm.ss a v","HH:mm.ss v","MMMM","E, d. MMMM y","H:mm.ss zzzz","H:mm.ss z","jaan","veebr","märts","mai","juuni","juuli","sept","dets","jaanuar","veebruar","aprill","oktoober","detsember","pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev","pKr","e.m.a","m.a.j","enne Kristust","pärast Kristust","enne meie ajaarvamist","meie ajaarvamise järgi","−","G y. 'urteko' MMM","G y. 'urteko' MMM d","G y. 'urteko' MMM d, E","M/d, E","y/M","y/M/d, E","y('e')'ko' MMMM","y('e')'ko' MMMM d","y('e')'ko' MMMM d, E","y('e')'ko' QQQ","y('e')'ko' QQQQ","y('e')'ko' MMMM d, EEEE","HH:mm:ss (zzzz)","HH:mm:ss (z)","urt.","ots.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.","urtarrilak","otsailak","martxoak","apirilak","maiatzak","ekainak","uztailak","abuztuak","irailak","urriak","azaroak","abenduak","ig.","al.","ar.","az.","og.","or.","lr.","igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata","BG","K.a.","K.o.","R.O.C. aurretik","{percentSign} {number}","{minusSign}{percentSign} {number}","ngo","ngb","ngl","ngn","ngt","ngs","ngz","ngm","nge","nga","ngad","ngab","ngɔn osú","ngɔn bɛ̌","ngɔn lála","ngɔn nyina","ngɔn tána","ngɔn saməna","ngɔn zamgbála","ngɔn mwom","ngɔn ebulú","ngɔn awóm","ngɔn awóm ai dziá","ngɔn awóm ai bɛ̌","sɔ́n","mɔ́n","smb","sml","smn","fúl","sér","sɔ́ndɔ","mɔ́ndi","sɔ́ndɔ məlú mə́bɛ̌","sɔ́ndɔ məlú mə́lɛ́","sɔ́ndɔ məlú mə́nyi","fúladé","séradé","kíkíríg","ngəgógəle","oyk","ayk","osúsúa Yésus kiri","ámvus Yésus Kirís","{1}،‏ {0}","{1}، ساعت {0}","HH:mm (Z)","E M/d","d LLL","E d LLL","d LLLL","E d LLLL","E y/M/d","H:mm:ss (z)","ژ","ا","ژانویهٔ","فوریهٔ","آوریل","مهٔ","ژوئن","ژوئیهٔ","اوت","سپتامبر","اکتبر","نوامبر","دسامبر","ی","چ","پ","یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه","قبل‌ازظهر","بعدازظهر","ق","ق.د.م","د.م.","ق.م.","م.","قبل از میلاد","میلادی","قبل از دوران مشترک","دوران مشترک","ک","ط","تشری","حشوان","کسلو","طوت","واذار","نیسان","ایار","سیوان","ایلول","واذار الثانی","ربیع الاول","ربیع الثانی","جمادی الاول","جمادی الثانی","ذیقعدهٔ","ذیحجهٔ","ه‍.ق.","هجری قمری","فروردین","اردیبهشت","تیر","شهریور","آبان","دی","اسفند","ه‍.ش.","هجری شمسی","arabext","‎{currency}{number}","{minusSign}‎{currency}{number}","ناعدد","‎+‎","‎−","؋","¥CN","$HK","ریال","$MX","$NZ","$EC","می","جول","دسم","جنوری","فبروری","مارچ","اپریل","جون","جولای","اگست","سپتمبر","اکتوبر","نومبر","دسمبر","حمل","ثور","جوزا","سرطان","اسد","سنبلهٔ","میزان","عقرب","قوس","جدی","دلو","حوت","sii","col","mbo","duu","kor","mor","juk","slt","yar","jol","bow","siilo","colte","mbooy","seeɗto","duujal","korse","morso","juko","siilto","yarkomaa","jolal","bowte","dew","aaɓ","maw","naa","mwd","hbi","dewo","aaɓnde","mawbaare","njeslaare","naasaande","mawnde","hoore-biir","subaka","kikiiɗe","H-I","C-I","Hade Iisa","Caggal Iisa","FG","UM","{1} 'klo' {0}","E d.M.","ccc d. MMM","m.ss","L.y","E d.M.y","cccc d. MMMM y","tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta","su","ti","ke","to","pe","la","sunnuntaina","maanantaina","tiistaina","keskiviikkona","torstaina","perjantaina","lauantaina","ap.","ip.","eK","jK","eaa","jaa","eKr.","jKr.","eaa.","jaa.","ennen Kristuksen syntymää","jälkeen Kristuksen syntymän","ennen ajanlaskun alkua","jälkeen ajanlaskun alun","tišríkuuta","hešvánkuuta","kislévkuuta","tevétkuuta","ševátkuuta","adárkuuta I","adárkuuta","nisánkuuta","ijjárkuuta","sivánkuuta","tammúzkuuta","abkuuta","elúlkuuta","adárkuuta II","muharram","safar","rabi’ al-awwal","rabi’ al-akhir","džumada-l-ula","džumada-l-akhira","radžab","ša’ban","ramadan","šawwal","dhu-l-qa’da","dhu-l-hiddža","epäluku","mk","{1} 'nang' {0}","Ene","Peb","Abr","Hun","Hul","Set","Nob","Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Setyembre","Oktubre","Nobyembre","Disyembre","Lin","Miy","Huw","Biy","Linggo","Lunes","Martes","Miyerkules","Huwebes","Biyernes","Sabado","E dd.MM","E dd.MM.y","QQQ 'í' y","QQQQ 'í' y","mars","apríl","desember","sun.","mán.","týs.","mik.","hós.","frí.","ley.","sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur","flt","lt","f.o.tíðr.","o.tíðr.","fyri Krist","eftir Krist","fyri okkara tíðarrokning","okkara tíðarrokning","{1} 'à' {0}","HH 'h'","janv.","févr.","avr.","juin","juil.","août","déc.","janvier","février","avril","juillet","septembre","octobre","novembre","décembre","dim.","mer.","jeu.","ven.","sam.","dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi","E.B.","ère b.","ère bouddhiste","1yuè","2yuè","3yuè","4yuè","5yuè","6yuè","7yuè","8yuè","9yuè","10yuè","11yuè","12yuè","zhēngyuè","èryuè","sānyuè","sìyuè","wǔyuè","liùyuè","qīyuè","bāyuè","jiǔyuè","shíyuè","shíyīyuè","shí’èryuè","av. J.-C.","ap. J.-C.","avant Jésus-Christ","après Jésus-Christ","avant l’ère commune","de l’ère commune","Tisseri","Hesvan","Tébeth","Schébat","Nissan","Tamouz","Elloul","mouh.","saf.","rab. aw.","rab. th.","joum. oul.","joum. tha.","raj.","chaa.","ram.","chaw.","dhou. q.","dhou. h.","mouharram","rabia al awal","rabia ath-thani","joumada al oula","joumada ath-thania","rajab","chaabane","chawwal","dhou al qi`da","dhou al-hijja","avant RdC","RdC","$AR","$AU","$BM","$BN","$BS","$BZ","$CL","$CO","£CY","$FJ","£FK","£GB","£GI","£IE","£IL","₤IT","£LB","£MT","$NA","$RH","$SB","$SG","$SR","$TT","$US","$UY","FCFP","H 'h' mm 'min' ss 's' zzzz","E M-d","MM-d","$ AU","$ HK","$ NZ","$ SG","$ US","FC","HH.mm:ss 'h' zzzz","DA","CF","fév.","jui.","LS","DT","d 'di' MMMM","LLLL 'dal' y","EEEE d 'di' MMMM 'dal' y","d 'di' MMMM 'dal' y","Zen","Fev","Avr","Jug","Lui","Avo","Otu","Dic","Zenâr","Fevrâr","Març","Avrîl","Jugn","Avost","Setembar","Otubar","Dicembar","lun","mie","joi","vin","sab","domenie","lunis","martars","miercus","joibe","vinars","sabide","a.","p.","pdC","ddC","d-M","d-M-y","E d-M-y","mrt.","jannewaris","febrewaris","maart","maaie","july","augustus","septimber","novimber","desimber","si","mo","wo","fr","snein","moandei","tiisdei","woansdei","tongersdei","freed","sneon","Tut","Babah","Hatur","Kiyahk","Tubah","Baramundah","Ba’unah","Abib","Misra","Nasi","Mäskäräm","Teqemt","T’er","Yäkatit","Mägabit","Miyazya","Säne","Nähase","Pagumän","f.K.","n.K.","fgj","gj","n.Kr.","f.g.j.","Foar Kristus","nei Kristus","foar gewoane jiertelling","gewoane jiertelling","Tisjrie","Chesjwan","Sjevat","Adar A","Ijar","Tammoez","Elloel","Adar B","Vaishakha","Jyeshtha","Aashaadha","Shraavana","Bhaadrapada","Ashvina","Kaartika","Pausha","Maagha","Phaalguna","SAKA","Moeh.","Joem. I","Joem. II","Sja.","Sjaw.","Doe al k.","Doe al h.","Moeharram","Rabiʻa al awal","Rabiʻa al thani","Joemadʻal awal","Joemadʻal thani","Sjaʻaban","Sjawal","Doe al kaʻaba","Doe al hizja","Saʻna Hizjria","{currency} {number}{minusSign}","FJ$","SI$","Ean","Feabh","Márta","Aib","Beal","Meith","Iúil","Lún","MFómh","DFómh","Samh","Noll","Eanáir","Feabhra","Aibreán","Bealtaine","Meitheamh","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig","Domh","Luan","Máirt","Céad","Déar","Aoine","Sath","Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn","RC","RCR","CR","Roimh Chríost","Roimh Chomh-Ré","Comh-Ré","E h:mma","ha","h:mma","h:mma v","d'mh' MMMM","EEEE, d'mh' MMMM y","d'mh' MMMM y","Ò","Faoi","Gearr","Màrt","Gibl","Cèit","Ògmh","Iuch","Lùna","Sult","Dàmh","Dùbh","dhen Fhaoilleach","dhen Ghearran","dhen Mhàrt","dhen Ghiblean","dhen Chèitean","dhen Ògmhios","dhen Iuchar","dhen Lùnastal","dhen t-Sultain","dhen Dàmhair","dhen t-Samhain","dhen Dùbhlachd","DiD","DiL","DiM","DiC","Dia","Dih","DiS","DiDòmhnaich","DiLuain","DiMàirt","DiCiadain","DiarDaoin","DihAoine","DiSathairne","Ro Chrìosta","An dèidh Chrìosta","Ro PnS","Mínguó","Ro Ph. na Sìne","EEEE dd MMMM y","xan","xuñ","xul","out","xaneiro","febreiro","maio","xuño","xullo","setembro","outubro","luns","mér","xov","ven","mércores","xoves","venres","despois de Cristo","$R","¥JP","$NT","Mär","Dez","Auguscht","Septämber","Oktoober","Novämber","Dezämber","Mä.","Zi.","Du.","Sunntig","Määntig","Ziischtig","Mittwuch","Dunschtig","Friitig","Samschtig","nam.","’","MMM, G y","d MMM, G y","E, d MMM, G y","hh:mm:ss a zzzz","hh:mm:ss a z","જા","ફે","મા","એ","મે","જૂ","જુ","ઑ","સ","ન","ડિ","જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે","જાન્યુઆરી","ફેબ્રુઆરી","સપ્ટેમ્બર","ઑક્ટોબર","નવેમ્બર","ડિસેમ્બર","ર","સો","મં","બુ","ગુ","શુ","શ","રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ","રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર","ઇ સ પુ","ઇસ","સા.યુ.પ.","સા.યુ.","ઈ.સ.પૂર્વે","ઈ.સ.","ઈસવીસન પૂર્વે","ઇસવીસન","સામાન્ય યુગ પહેલા","સામાન્ય યુગ","Can","Cul","Agt","Chanuari","Feburari","Apiriri","Chulai","Okitoba","Nobemba","Cpr","Ctt","Cmn","Cmt","Ars","Icm","Est","Chumapiri","Chumatato","Chumaine","Chumatano","Aramisi","Ichuma","Esabato","Ma/Mo","Mambia/Mog","YA","YK","Yeso ataiborwa","Yeso kaiboirwe","J-guer","T-arree","Mayrnt","Avrril","Boaldyn","M-souree","J-souree","Luanistyn","M-fouyir","J-fouyir","M-Houney","M-Nollick","Jerrey-geuree","Toshiaght-arree","Averil","Mean-souree","Jerrey-souree","Mean-fouyir","Jerrey-fouyir","Mee Houney","Mee ny Nollick","Jed","Jel","Jem","Jerc","Jerd","Jeh","Jes","Jedoonee","Jelhein","Jemayrt","Jercean","Jerdein","Jeheiney","Jesarn","Fab","Afi","Yun","Yul","Agu","Nuw","Janairu","Faburairu","Maris","Afirilu","Mayu","Yuni","Yuli","Agusta","Satumba","Nuwamba","Disamba","Lh","Li","Ta","Lr","Al","Ju","As","Lahadi","Litinin","Laraba","Alhamis","Jummaʼa","Asabar","KHAI","BHAI","Kafin haihuwar annab","Bayan haihuwar annab","M=romanlow","Ian.","Pep.","Mal.","ʻAp.","Iun.","Iul.","ʻAu.","Kep.","ʻOk.","Now.","Kek.","Ianuali","Pepeluali","Malaki","ʻApelila","Iune","Iulai","ʻAukake","Kepakemapa","ʻOkakopa","Nowemapa","Kekemapa","LP","P1","P2","P3","P4","P5","P6","Lāpule","Poʻakahi","Poʻalua","Poʻakolu","Poʻahā","Poʻalima","Poʻaono","{1} בשעה {0}","E ה-d","d בMMM y G","E, d בMMM y G","‏h a","d בMMM","E, d בMMM","d בMMM y","E, d בMMM y","EEEE, d בMMMM y","d בMMMM y","ינו׳","פבר׳","מרץ","אפר׳","מאי","יוני","יולי","אוג׳","ספט׳","אוק׳","נוב׳","דצמ׳","ינואר","פברואר","אפריל","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר","א׳","ב׳","ג׳","ד׳","ה׳","ו׳","ש׳","יום א׳","יום ב׳","יום ג׳","יום ד׳","יום ה׳","יום ו׳","שבת","יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","יום שבת","לפנה״צ","אחה״צ","לפנה״ס","לספירה","לפני הספירה","תש׳","חש׳","כס׳","טב׳","שב׳","א״א","אד׳","ני׳","אי׳","סי׳","תמ׳","אב","אל׳","א״ב","תשרי","חשון","כסלו","טבת","שבט","אדר א׳","אדר","ניסן","אייר","סיון","תמוז","אלול","אדר ב׳","לבה״ע","מוחרם","צפר","רביע א׳","רביע ב׳","ג׳ומאדא א׳","ג׳ומאדא ב׳","רג׳ב","שעבאן","רמדאן","שוואל","ד׳ו אל־קעדה","ד׳ו אל־חיג׳ה","רביע אל-אוול","רביע א-ת׳אני","ג׳ומאדא אל-אולא","ג׳ומאדא א-ת׳אניה","שנת היג׳רה","טאיקה","נינג׳ו","שוטוקו","ל״י","{1} को {0}","MMM G y","फ़","म","जू","सि","जन॰","फ़र॰","मार्च","अप्रैल","मई","जून","जुल॰","अग॰","सित॰","अक्तू॰","नव॰","दिस॰","जनवरी","फ़रवरी","जुलाई","अगस्त","सितंबर","अक्तूबर","नवंबर","दिसंबर","सो","गु","शु","श","रवि","सोम","बुध","गुरु","शुक्र","शनि","रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार","पूर्वाह्न","अपराह्न","मस्केरेम","टेकेम्ट","हेदर","तहसास","टर","येकाटिट","मेगाबिट","मियाज़िया","गनबोट","सेन","हम्ले","नेहासे","पागूमन","ईसा-पूर्व","ईस्वी","ईसवी पूर्व","ईसवी","ईसवी सन","चैत्र","वैशाख","ज्येष्ठ","आषाढ़","श्रावण","भाद्रपद","अश्विन","कार्तिक","अग्रहायण","पौष","माघ","फाल्गुन","शक","मुहर्रम","सफर","राबी प्रथम","राबी द्वितीय","जुम्डा प्रथम","जुम्डा द्वितीय","रजब","शावन","रमजान","शव्व्ल","जिल-क्दाह","जिल्-हिज्जाह","ताएका (645–650)","हाकूची (650–671)","हाकूहो (672–686)","शूचो (686–701)","ताहिओ (701–704)","केउन (704–708)","वाडू (708–715)","रैकी (715–717)","योरो (717–724)","जिंकी (724–729)","टेम्प्यो (729–749)","टेम्प्यो-काम्पो (749–749)","टेम्प्यो-शोहो (749–757)","टेम्प्यो-होजी (757–765)","टेम्प्यो-जिंगो (765–767)","टेम्प्यो-किउन (767–770)","होकी (770–780)","टेनो (781–782)","इंर्याकू (782–806)","डाईडू (806–810)","क़ोनिन (810–824)","टेंचो (824–834)","शोवा (834–848)","काज्यो (848–851)","निंजू (851–854)","शाईकू (854–857)","टेनन (857–859)","जोगन् (859–877)","गेंकेई (877–885)","निन्ना (885–889)","केम्प्यो (889–898)","शूताई (898–901)","ईंगी (901–923)","ईंचो (923–931)","शोहेई (931–938)","टेंग्यो (938–947)","टेंर्याकू (947–957)","टेंटूकू (957–961)","ओवा (961–964)","कोहो (964–968)","अन्ना (968–970)","टेंरोकू (970–973)","टेन-एन (973–976)","जोगन् (976–978)","टेंगेन (978–983)","ईकान (983–985)","कन्ना (985–987)","ई-एन (987–989)","एइसो (989–990)","शोर्याकू (990–995)","चोटूकु (995–999)","चोहो (999–1004)","कंको (1004–1012)","च्योवा (1012–1017)","कन्निन (1017–1021)","ज़ियान (1021–1024)","मंजू (1024–1028)","चोगन (1028–1037)","चोर्याकू (1037–1040)","चोक्यु (1040–1044)","कांटूको (1044–1046)","ईशो (1046–1053)","टेंगी (1053–1058)","कोहैइ (1058–1065)","जिर्याकू (1065–1069)","ईंक्यू (1069–1074)","सोहो (1074–1077)","शोर्याकू (1077–1081)","ईहो (1081–1084)","ओटूको (1084–1087)","कांजि (1087–1094)","कोहो (1094–1096)","ईचो (1096–1097)","शोटूको (1097–1099)","कोवा (1099–1104)","चोजी (1104–1106)","काशो (1106–1108)","टेन्निन (1108–1110)","टेन-ई (1110–1113)","ईक्यू (1113–1118)","जेन-ई (1118–1120)","होआन (1120–1124)","तेंजी (1124–1126)","दाईजी (1126–1131)","टेंशो (1131–1132)","चोशो (1132–1135)","होएन (1135–1141)","ईजी (1141–1142)","कोजी (1142–1144)","टेन्यो (1144–1145)","क्यूआन (1145–1151)","निंपैई (1151–1154)","क्योजो (1154–1156)","होगेन (1156–1159)","हैजी (1159–1160)","ईर्याकू (1160–1161)","ओहो (1161–1163)","चोकान (1163–1165)","ईमान (1165–1166)","निन-आन (1166–1169)","काओ (1169–1171)","शोअन (1171–1175)","अंजन (1175–1177)","जिशो (1177–1181)","योवा (1181–1182)","जूऐई (1182–1184)","जेंर्याकू (1184–1185)","बूंजी (1185–1190)","केंक्यू (1190–1199)","शोजी (1199–1201)","केन्निन (1201–1204)","जेंक्यू (1204–1206)","केन-ई (1206–1207)","शोगेन (1207–1211)","केंर्याकू (1211–1213)","केंपो (1213–1219)","शोक्यू (1219–1222)","जू (1222–1224)","जेन्निन (1224–1225)","कोरोकू (1225–1227)","अंटैइ (1227–1229)","कांकी (1229–1232)","जोएई (1232–1233)","टेम्पूकू (1233–1234)","बुंर्याकू (1234–1235)","काटेई (1235–1238)","र्याकूनिन (1238–1239)","ईन-ओ (1239–1240)","निंजी (1240–1243)","कांजेन (1243–1247)","होजी (1247–1249)","केंचो (1249–1256)","कोगेन (1256–1257)","शोका (1257–1259)","शोगेन (1259–1260)","बुन-ओ (1260–1261)","कोचो (1261–1264)","बुन-ई (1264–1275)","केंजी (1275–1278)","कोअन (1278–1288)","शो (1288–1293)","ईनिन (1293–1299)","शोअन (1299–1302)","केंजेन (1302–1303)","काजेन (1303–1306)","टोकूजी (1306–1308)","ईंकेई (1308–1311)","ओचो (1311–1312)","शोवा (1312–1317)","बुंपो (1317–1319)","जेनो (1319–1321)","जेंक्यो (1321–1324)","शोचू (1324–1326)","कारेकी (1326–1329)","जेंटोकू (1329–1331)","गेंको (1331–1334)","केम्मू (1334–1336)","ईंजेन (1336–1340)","कोकोकू (1340–1346)","शोहेई (1346–1370)","केंटोकू (1370–1372)","बूंचो (1372–1375)","टेंजो (1375–1379)","कोर्याकू (1379–1381)","कोवा (1381–1384)","जेंचू (1384–1392)","मेटोकू (1384–1387)","काकेई (1387–1389)","कू (1389–1390)","मेटोकू (1390–1394)","ओई (1394–1428)","शोचो (1428–1429)","ईक्यो (1429–1441)","काकीत्सू (1441–1444)","बुन-अन (1444–1449)","होटोकू (1449–1452)","क्योटोकू (1452–1455)","कोशो (1455–1457)","चोरोकू (1457–1460)","कांशो (1460–1466)","बुंशो (1466–1467)","ओनिन (1467–1469)","बुन्मेई (1469–1487)","चोक्यो (1487–1489)","ईंटोकू (1489–1492)","मेईओ (1492–1501)","बुंकी (1501–1504)","ईशो (1504–1521)","ताईएई (1521–1528)","क्योरोकू (1528–1532)","टेन्मन (1532–1555)","कोजी (1555–1558)","ईरोकू (1558–1570)","जेंकी (1570–1573)","टेंशो (1573–1592)","बुंरोकू (1592–1596)","केईचो (1596–1615)","जेनवा (1615–1624)","कान-एई (1624–1644)","शोहो (1644–1648)","केईआन (1648–1652)","शो (1652–1655)","मेईर्याकू (1655–1658)","मानजी (1658–1661)","कनबुन (1661–1673)","ईंपो (1673–1681)","टेंवा (1681–1684)","जोक्यो (1684–1688)","जेंरोकू (1688–1704)","होएई (1704–1711)","शोटूको (1711–1716)","क्योहो (1716–1736)","जेंबुन (1736–1741)","कांपो (1741–1744)","इंक्यो (1744–1748)","कान-एन (1748–1751)","होर्याकू (1751–1764)","मेईवा (1764–1772)","अन-एई (1772–1781)","टेनमेई (1781–1789)","कांसेई (1789–1801)","क्योवा (1801–1804)","बुंका (1804–1818)","बुंसेई (1818–1830)","टेंपो (1830–1844)","कोका (1844–1848)","काईए (1848–1854)","अंसेई (1854–1860)","मान-ईन (1860–1861)","बुंक्यौ (1861–1864)","जेंजी (1864–1865)","केईओ (1865–1868)","मेजी","ताईशो","शोवा","हेईसेई","फर्वादिन","ओर्दिवेहेस्ट","खोरर्दाद","टिर","मोरदाद","शाहरीवर्","मेहर","अवन","अज़र","डे","बहमन","ईस्फन्द्","LLL y. G","d. MMM y. G","E, d. MMM y. G","L.","LLL y.","d. MMM y.","E, d. MMM y.","QQQ y.","QQQQ y.","EEEE, d. MMMM y.","d. MMMM y.","1.","2.","3.","4.","5.","6.","7.","8.","9.","10.","11.","12.","sij","velj","ožu","tra","svi","lip","kol","ruj","stu","siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenoga","prosinca","pr. Kr.","p. Kr.","prije Krista","poslije Krista","Taika (645.-650.)","Hakuchi (650.-671.)","Hakuhō (672.-686.)","Shuchō (686.-701.)","Taihō (701.-704.)","Keiun (704.-708.)","Wadō (708.-715.)","Reiki (715.-717.)","Yōrō (717.-724.)","Jinki (724.-729.)","Tempyō (729.-749.)","Tempyō-kampō (749.-749.)","Tempyō-shōhō (749.-757.)","Tempyō-hōji (757.-765.)","Temphō-jingo (765.-767.)","Jingo-keiun (767.-770.)","Hōki (770.-780.)","Ten-ō (781.-782.)","Enryaku (782.-806.)","Daidō (806.-810.)","Kōnin (810.-824.)","Tenchō (824.-834.)","Jōwa (834.-848.)","Kajō (848.-851.)","Ninju (851.-854.)","Saiko (854.-857.)","Tennan (857.-859.)","Jōgan (859.-877.)","Genkei (877.-885.)","Ninna (885.-889.)","Kampyō (889.-898.)","Shōtai (898.-901.)","Engi (901.-923.)","Enchō (923.-931.)","Shōhei (931.-938.)","Tengyō (938.-947.)","Tenryaku (947.-957.)","Tentoku (957.-961.)","Ōwa (961.-964.)","Kōhō (964.-968.)","Anna (968.-970.)","Tenroku (970.-973.)","Ten-en (973.-976.)","Jōgen (976.-978.)","Tengen (978.-983.)","Eikan (983.-985.)","Kanna (985.-987.)","Ei-en (987.-989.)","Eiso (989.-990.)","Shōryaku (990.-995.)","Chōtoku (995.-999.)","Chōhō (999.-1004.)","Kankō (1004.-1012.)","Chōwa (1012.-1017.)","Kannin (1017.-1021.)","Jian (1021.-1024.)","Manju (1024.-1028.)","Chōgen (1028.-1037.)","Chōryaku (1037.-1040.)","Chōkyū (1040.-1044.)","Kantoku (1044.-1046.)","Eishō (1046.-1053.)","Tengi (1053.-1058.)","Kōhei (1058.-1065.)","Jiryaku (1065.-1069.)","Enkyū (1069.-1074.)","Shōho (1074.-1077.)","Shōryaku (1077.-1081.)","Eiho (1081.-1084.)","Ōtoku (1084.-1087.)","Kanji (1087.-1094.)","Kaho (1094.-1096.)","Eichō (1096.-1097.)","Shōtoku (1097.-1099.)","Kōwa (1099.-1104.)","Chōji (1104.-1106.)","Kashō (1106.-1108.)","Tennin (1108.-1110.)","Ten-ei (1110.-1113.)","Eikyū (1113.-1118.)","Gen-ei (1118.-1120.)","Hoan (1120.-1124.)","Tenji (1124.-1126.)","Daiji (1126.-1131.)","Tenshō (1131.-1132.)","Chōshō (1132.-1135.)","Hoen (1135.-1141.)","Eiji (1141.-1142.)","Kōji (1142.-1144.)","Tenyō (1144.-1145.)","Kyūan (1145.-1151.)","Ninpei (1151.-1154.)","Kyūju (1154.-1156.)","Hogen (1156.-1159.)","Heiji (1159.-1160.)","Eiryaku (1160.-1161.)","Ōho (1161.-1163.)","Chōkan (1163.-1165.)","Eiman (1165.-1166.)","Nin-an (1166.-1169.)","Kaō (1169.-1171.)","Shōan (1171.-1175.)","Angen (1175.-1177.)","Jishō (1177.-1181.)","Yōwa (1181.-1182.)","Juei (1182.-1184.)","Genryuku (1184.-1185.)","Bunji (1185.-1190.)","Kenkyū (1190.-1199.)","Shōji (1199.-1201.)","Kennin (1201.-1204.)","Genkyū (1204.-1206.)","Ken-ei (1206.-1207.)","Shōgen (1207.-1211.)","Kenryaku (1211.-1213.)","Kenpō (1213.-1219.)","Shōkyū (1219.-1222.)","Jōō (1222.-1224.)","Gennin (1224.-1225.)","Karoku (1225.-1227.)","Antei (1227.-1229.)","Kanki (1229.-1232.)","Jōei (1232.-1233.)","Tempuku (1233.-1234.)","Bunryaku (1234.-1235.)","Katei (1235.-1238.)","Ryakunin (1238.-1239.)","En-ō (1239.-1240.)","Ninji (1240.-1243.)","Kangen (1243.-1247.)","Hōji (1247.-1249.)","Kenchō (1249.-1256.)","Kōgen (1256.-1257.)","Shōka (1257.-1259.)","Shōgen (1259.-1260.)","Bun-ō (1260.-1261.)","Kōchō (1261.-1264.)","Bun-ei (1264.-1275.)","Kenji (1275.-1278.)","Kōan (1278.-1288.)","Shōō (1288.-1293.)","Einin (1293.-1299.)","Shōan (1299.-1302.)","Kengen (1302.-1303.)","Kagen (1303.-1306.)","Tokuji (1306.-1308.)","Enkei (1308.-1311.)","Ōchō (1311.-1312.)","Shōwa (1312.-1317.)","Bunpō (1317.-1319.)","Genō (1319.-1321.)","Genkyō (1321.-1324.)","Shōchū (1324.-1326.)","Kareki (1326.-1329.)","Gentoku (1329.-1331.)","Genkō (1331.-1334.)","Kemmu (1334.-1336.)","Engen (1336.-1340.)","Kōkoku (1340.-1346.)","Shōhei (1346.-1370.)","Kentoku (1370.-1372.)","Bunchū (1372.-1375.)","Tenju (1375.-1379.)","Kōryaku (1379.-1381.)","Kōwa (1381.-1384.)","Genchū (1384.-1392.)","Meitoku (1384.-1387.)","Kakei (1387.-1389.)","Kōō (1389.-1390.)","Meitoku (1390.-1394.)","Ōei (1394.-1428.)","Shōchō (1428.-1429.)","Eikyō (1429.-1441.)","Kakitsu (1441.-1444.)","Bun-an (1444.-1449.)","Hōtoku (1449.-1452.)","Kyōtoku (1452.-1455.)","Kōshō (1455.-1457.)","Chōroku (1457.-1460.)","Kanshō (1460.-1466.)","Bunshō (1466.-1467.)","Ōnin (1467.-1469.)","Bunmei (1469.-1487.)","Chōkyō (1487.-1489.)","Entoku (1489.-1492.)","Meiō (1492.-1501.)","Bunki (1501.-1504.)","Eishō (1504.-1521.)","Taiei (1521.-1528.)","Kyōroku (1528.-1532.)","Tenmon (1532.-1555.)","Kōji (1555.-1558.)","Eiroku (1558.-1570.)","Genki (1570.-1573.)","Tenshō (1573.-1592.)","Bunroku (1592.-1596.)","Keichō (1596.-1615.)","Genwa (1615.-1624.)","Kan-ei (1624.-1644.)","Shōho (1644.-1648.)","Keian (1648.-1652.)","Shōō (1652.-1655.)","Meiryaku (1655.-1658.)","Manji (1658.-1661.)","Kanbun (1661.-1673.)","Enpō (1673.-1681.)","Tenwa (1681.-1684.)","Jōkyō (1684.-1688.)","Genroku (1688.-1704.)","Hōei (1704.-1711.)","Shōtoku (1711.-1716.)","Kyōhō (1716.-1736.)","Genbun (1736.-1741.)","Kanpō (1741.-1744.)","Enkyō (1744.-1748.)","Kan-en (1748.-1751.)","Hōryaku (1751.-1764.)","Meiwa (1764.-1772.)","An-ei (1772.-1781.)","Tenmei (1781.-1789.)","Kansei (1789.-1801.)","Kyōwa (1801.-1804.)","Bunka (1804.-1818.)","Bunsei (1818.-1830.)","Tenpō (1830.-1844.)","Kōka (1844.-1848.)","Kaei (1848.-1854.)","Ansei (1854.-1860.)","Man-en (1860.-1861.)","Bunkyū (1861.-1864.)","Genji (1864.-1865.)","Keiō (1865.-1868.)","prije R.O.C.","E, H:mm 'hodź'.","H 'hodź'.","H:mm 'hodź'.","mej.","meje","š","wut","štw","pja","njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","popołdnju","př.Chr.n.","po Chr.n.","př.n.l.č.","n.l.č.","před Chrystowym narodźenjom","po Chrystowym narodźenju","před našim ličenjom časa","našeho ličenja časa","d., E","G y.","G y. MMM","G y. MMM d.","G y. MMM d., E","a h","a h:mm","a h:mm:ss","M. d.","M. d., E","MMM d.","MMM d., E","MMMM d.","y. M.","y. MM. dd.","y. MM. dd., E","y. MMM","y. MMM d.","y. MMM d., E","y. MMMM","y. QQQ","y. QQQQ","y. MMMM d., EEEE","y. MMMM d.","Á","Sz","márc.","ápr.","máj.","jún.","júl.","szept.","január","február","március","április","május","június","július","augusztus","szeptember","október","Cs","Sze","Szo","vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat","de.","du.","ie.","isz.","i. e.","i. sz.","időszámításunk előtt","időszámításunk szerint","Tisri","Hesván","Kiszlév","Tévész","Svát","Ádár I","Ádár","Niszán","Ijár","Sziván","Áv","Ádár II","TÉ","Moh.","Réb. 1","Réb. 2","Dsem. I","Dsem. II","Red.","Sab.","Sev.","Dsül k.","Dsül h.","Moharrem","Rébi el avvel","Rébi el accher","Dsemádi el avvel","Dsemádi el accher","Redseb","Sabán","Ramadán","Sevvál","Dsül kade","Dsül hedse","MF","R.O.C. előtt","Ft","d, ccc","G yթ.","G yթ. LLL","d MMM, yթ.,","G yթ. MMM d, E","d.MM.yթ., E","yթ. LLL","d MMM, yթ.","yթ. MMM d, E","yթ․ MMMM","y թ, QQQ","y թ, QQQQ","yթ. MMMM d, EEEE","dd MMMM, yթ.","dd MMM, yթ.","H:mm:ss, zzzz","H:mm:ss, z","Հ","Փ","Մ","Ա","Օ","Ս","Ն","Դ","հնվ","փտվ","մրտ","ապր","մյս","հնս","հլս","օգս","սեպ","հոկ","նոյ","դեկ","հունվարի","փետրվարի","մարտի","ապրիլի","մայիսի","հունիսի","հուլիսի","օգոստոսի","սեպտեմբերի","հոկտեմբերի","նոյեմբերի","դեկտեմբերի","Կ","Ե","Չ","Ու","Շ","կիր","երկ","երք","չրք","հնգ","ուր","շբթ","կիրակի","երկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ","մ.թ.ա.","մ.թ.","մ.թ.ա","մեր թվարկությունից առաջ","մեր թվարկության","֏","h.mm.ss. a v","Des","Maret","Agustus","Min","Sen","Sel","Rab","Kam","Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu","SM","SEU","EU","Sebelum Masehi","Sebelum Era Umum","Era Umum","Syaw.","Sya’ban","Ramadhan","Syawal","Tempyō (729–749)","Tempyō-kampō (749-749)","Tempyō-shōhō (749-757)","Tempyō-hōji (757-765)","Temphō-jingo (765-767)","Saiko (854–857)","Tennan (857–859)","Genkei (877–885)","Kampyō (889–898)","Shōhei (931–938)","Ten-en (973-976)","Ei-en (987-989)","Eiho (1081–1084)","Kaho (1094–1096)","Shōtoku (1097–1099)","Gen-ei (1118-1120)","Hoan (1120–1124)","Hoen (1135–1141)","Tenyō (1144–1145)","Hogen (1156–1159)","Nin-an (1166-1169)","Genryuku (1184–1185)","Ken-ei (1206-1207)","Shōgen (1207–1211)","Shōkyū (1219–1222)","Tempuku (1233–1234)","Bun-ō (1260-1261)","Bun-ei (1264-1275)","Enkei (1308–1311)","Genkyō (1321–1324)","Kareki (1326–1329)","Kemmu (1334–1336)","Bun-an (1444-1449)","Tenmon (1532–1555)","Genwa (1615–1624)","Kan-ei (1624-1644)","Shōō (1652–1655)","Meiryaku (1655–1658)","Tenwa (1681–1684)","Kan-en (1748-1751)","Hōryaku (1751–1764)","An-ei (1772-1781)","Man-en (1860-1861)","Sebelum R.O.C.","Rp","Jen","Juu","Ọgọ","Ọkt","Jenụwarị","Febrụwarị","Maachị","Eprel","Juun","Julaị","Ọgọọst","Ọktoba","Ụka","Mọn","Tiu","Wen","Tọọ","Fraị","Mbọsị Ụka","Mọnde","Tiuzdee","Wenezdee","Tọọzdee","Fraịdee","Satọdee","P.M.","T.K.","A.K.","Tupu Kristi","Afọ Kristi","ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊰꊪꆪ","ꊰꑋꆪ","ꆏ","ꋍ","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ","ꑭꆏ","ꆏꋍ","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ","ꑭꆏꑍ","ꆏꊂꋍ","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ","ꎸꄑ","ꁯꋒ","ꃅꋊꂿ","ꃅꋊꊂ","M. y","maí","ágú.","nóv.","janúar","febrúar","júní","júlí","ágúst","nóvember","Þ","þri.","mið.","fim.","fös.","lau.","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur","f.h.","e.h.","f.k.","e.k.","f.l.t.","l.t.","fyrir Krist","fyrir kristið tímatal","kristið tímatal","mag","giu","lug","ott","gennaio","febbraio","aprile","maggio","giugno","luglio","settembre","ottobre","dicembre","mer","gio","domenica","lunedì","martedì","mercoledì","giovedì","venerdì","a.E.V.","E.V.","avanti Era Volgare","Era Volgare","Prima di R.O.C.","d-MMM-y","d日","d日(E)","d日EEEE","aK:mm (E)","H:mm (E)","aK:mm:ss (E)","H:mm:ss (E)","Gy年","Gy年M月","Gy年M月d日","Gy年M月d日(E)","Gy年M月d日EEEE","aK時","H時","aK:mm","aK:mm:ss","aK:mm:ss v","aK:mm v","M月","M/d(E)","M/dEEEE","M月d日","M月d日(E)","M月d日EEEE","y年","y/M/d(E)","y/M/dEEEE","y/MM","y年M月","y年M月d日","y年M月d日(E)","y年M月d日EEEE","y/QQQ","yQQQQ","H時mm分ss秒 zzzz","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月","日","月","火","水","木","金","土","日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","仏暦","午前","午後","正","二","三","四","五","六","七","八","九","十","十一","十二","正月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月","トウト","ババ","ハトール","キアック","トーバ","アムシール","バラムハート","バラモウダ","バシャンス","パオーナ","エペープ","メスラ","ナシエ","メスケレム","テケムト","ヘダル","ターサス","テル","イェカティト","メガビト","ミアジア","ゲンボト","セネ","ハムレ","ネハッセ","パグメン","紀元前","西暦","西暦紀元前","西暦紀元","ティスレ","へシボン","キスレブ","テベット","シバット","アダル I","アダル","ニサン","イヤル","シバン","タムズ","アヴ","エルル","アダル II","カイトラ","ヴァイサカ","ジャイスタ","アーサダ","スラバナ","バードラ","アスビナ","カルディカ","アヴラハヤナ","パウサ","マーガ","パルグナ","サカ","ムハッラム","サフアル","ラビー・ウル・アウワル","ラビー・ウッ・サーニー","ジュマーダル・アウワル","ジュマーダッサーニー","ラジャブ","シャアバーン","ラマダーン","シャウワール","ズル・カイダ","ズル・ヒッジャ","大化","白雉","白鳯","朱鳥","大宝","慶雲","和銅","霊亀","養老","神亀","天平","天平感宝","天平勝宝","天平宝字","天平神護","神護景雲","宝亀","天応","延暦","大同","弘仁","天長","承和","嘉祥","仁寿","斉衡","天安","貞観","元慶","仁和","寛平","昌泰","延喜","延長","承平","天慶","天暦","天徳","応和","康保","安和","天禄","天延","貞元","天元","永観","寛和","永延","永祚","正暦","長徳","長保","寛弘","長和","寛仁","治安","万寿","長元","長暦","長久","寛徳","永承","天喜","康平","治暦","延久","承保","承暦","永保","応徳","寛治","嘉保","永長","承徳","康和","長治","嘉承","天仁","天永","永久","元永","保安","天治","大治","天承","長承","保延","永治","康治","天養","久安","仁平","久寿","保元","平治","永暦","応保","長寛","永万","仁安","嘉応","承安","安元","治承","養和","寿永","元暦","文治","建久","正治","建仁","元久","建永","承元","建暦","建保","承久","貞応","元仁","嘉禄","安貞","寛喜","貞永","天福","文暦","嘉禎","暦仁","延応","仁治","寛元","宝治","建長","康元","正嘉","正元","文応","弘長","文永","建治","弘安","正応","永仁","正安","乾元","嘉元","徳治","延慶","応長","正和","文保","元応","元亨","正中","嘉暦","元徳","元弘","建武","延元","興国","正平","建徳","文中","天授","康暦","弘和","元中","至徳","嘉慶","康応","明徳","応永","正長","永享","嘉吉","文安","宝徳","享徳","康正","長禄","寛正","文正","応仁","文明","長享","延徳","明応","文亀","永正","大永","享禄","天文","弘治","永禄","元亀","天正","文禄","慶長","元和","寛永","正保","慶安","承応","明暦","万治","寛文","延宝","天和","貞享","元禄","宝永","正徳","享保","元文","寛保","延享","寛延","宝暦","明和","安永","天明","寛政","享和","文化","文政","天保","弘化","嘉永","安政","万延","文久","元治","慶応","明治","大正","昭和","平成","ファルヴァルディーン","オルディーベヘシュト","ホルダード","ティール","モルダード","シャハリーヴァル","メフル","アーバーン","アーザル","デイ","バフマン","エスファンド","民国前","民国","元","¥","M.d.y","Nduŋmbi Saŋ","Pɛsaŋ Pɛ́pá","Pɛsaŋ Pɛ́tát","Pɛsaŋ Pɛ́nɛ́kwa","Pɛsaŋ Pataa","Pɛsaŋ Pɛ́nɛ́ntúkú","Pɛsaŋ Saambá","Pɛsaŋ Pɛ́nɛ́fɔm","Pɛsaŋ Pɛ́nɛ́pfúꞋú","Pɛsaŋ Nɛgɛ́m","Pɛsaŋ Ntsɔ̌pmɔ́","Pɛsaŋ Ntsɔ̌ppá","Sɔ́","Mɔ́","ÁM","Wɛ́","Tɔ́","Fɛ","Sá","Sɔ́ndi","Mɔ́ndi","Ápta Mɔ́ndi","Wɛ́nɛsɛdɛ","Tɔ́sɛdɛ","Fɛlâyɛdɛ","Sásidɛ","mbaꞌmbaꞌ","ŋka mbɔ́t nji","tsɛttsɛt mɛŋguꞌ mi ɛ́ lɛɛnɛ Kɛlísɛtɔ gɔ ńɔ́","tsɛttsɛt mɛŋguꞌ mi ɛ́ fúnɛ Kɛlísɛtɔ tɔ́ mɔ́","Aprilyi","Junyi","Julyai","Agusti","Iju","Jumapilyi","Jumatatuu","Jumatanu","utuko","kyiukonyi","Kabla ya Kristu","Baada ya Kristu","MMM. y G","d MMM. y G","E, d MMM. y G","MMM. y","d MMM. y","E, d MMM. y","MMMM, y","QQQ, y","QQQQ, y","EEEE, dd MMMM, y","ი","თ","მ","ა","ს","ო","ნ","დ","იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ","იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი","კ","ხ","პ","შ","კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ","კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი","ძვ. წ.","ახ. წ.","ჩვ. ერამდე","ჩვ. ერა","ძველი წელთაღრიცხვით","ახალი წელთაღრიცხვით","ჩვენს ერამდე","ჩვენი ერა","არ არის რიცხვი","Ɣ","Yen","Fur","Meɣ","Yeb","Ɣuc","Cte","Tub","Nun","Duǧ","Yennayer","Fuṛar","Meɣres","Yebrir","Mayyu","Yunyu","Yulyu","Ɣuct","Ctembeṛ","Tubeṛ","Nunembeṛ","Duǧembeṛ","Yan","San","Kraḍ","Kuẓ","Sam","Sḍis","Say","Yanass","Sanass","Kraḍass","Kuẓass","Samass","Sḍisass","Sayass","n tufat","n tmeddit","snd. T.Ɛ","sld. T.Ɛ","send talalit n Ɛisa","seld talalit n Ɛisa","Ĩ","Kel","Ktũ","Ktn","Tha","Moo","Nya","Knd","Ĩku","Ĩkm","Ĩkl","Mwai wa mbee","Mwai wa kelĩ","Mwai wa katatũ","Mwai wa kana","Mwai wa katano","Mwai wa thanthatũ","Mwai wa muonza","Mwai wa nyaanya","Mwai wa kenda","Mwai wa ĩkumi","Mwai wa ĩkumi na ĩmwe","Mwai wa ĩkumi na ilĩ","Wky","Wkw","Wkl","Wtũ","Wkn","Wtn","Wth","Wa kyumwa","Wa kwambĩlĩlya","Wa kelĩ","Wa katatũ","Wa kana","Wa katano","Wa thanthatũ","Ĩyakwakya","Ĩyawĩoo","MY","IY","Mbee wa Yesũ","Ĩtina wa Yesũ","Mwedi Ntandi","Mwedi wa Pili","Mwedi wa Tatu","Mwedi wa Nchechi","Mwedi wa Nnyano","Mwedi wa Nnyano na Umo","Mwedi wa Nnyano na Mivili","Mwedi wa Nnyano na Mitatu","Mwedi wa Nnyano na Nchechi","Mwedi wa Nnyano na Nnyano","Mwedi wa Nnyano na Nnyano na U","Mwedi wa Nnyano na Nnyano na M","Ll2","Ll3","Ll4","Ll5","Ll6","Ll7","Ll1","Liduva lyapili","Liduva lyatatu","Liduva lyanchechi","Liduva lyannyano","Liduva lyannyano na linji","Liduva lyannyano na mavili","Liduva litandi","Muhi","Chilo","AY","NY","Akanapawa Yesu","Nankuida Yesu","MMM 'di' y G","d 'di' MMM 'di' y G","E, d 'di' MMM 'di' y G","E, d 'di' MMMM","MMM 'di' y","MMMM 'di' y","QQQQ 'di' y","EEEE, d 'di' MMMM 'di' y","d 'di' MMMM 'di' y","Nuv","Diz","Janeru","Febreru","Marsu","Maiu","Junhu","Julhu","Agostu","Setenbru","Otubru","Nuvenbru","Dizenbru","sig","kua","kin","ses","dumingu","sigunda-fera","tersa-fera","kuarta-fera","kinta-fera","sesta-fera","sabadu","DK","AEK","EK","Antis di Kristu","Dispos di Kristu","Antis di Era Kumun","Era Kumun","​","Alj","Ass","Atini","Atalata","Alhamiisa","Aljuma","Assabdu","Adduha","Aluula","Isaa jamanoo","JEN","WKR","WGT","WKN","WTN","WTD","WMJ","WNN","WKD","WIK","WMW","DIT","Njenuarĩ","Mwere wa kerĩ","Mwere wa gatatũ","Mwere wa kana","Mwere wa gatano","Mwere wa gatandatũ","Mwere wa mũgwanja","Mwere wa kanana","Mwere wa kenda","Mwere wa ikũmi","Mwere wa ikũmi na ũmwe","Ndithemba","KMA","NTT","NMN","NMT","ART","NMA","Njumatatũ","Njumatana","Njumamothi","Kiroko","Hwaĩ-inĩ","E, a h:mm","E, a h:mm:ss","G y 'ж'.","G y 'ж'. MMM","G y 'ж'. d MMM","G y 'ж'. d MMM, E","a h:mm:ss v","a h:mm v","y 'ж'. MMM","y 'ж'. d MMM","y 'ж'. d MMM, E","y 'ж'. MMMM","y 'ж'. QQQ","y 'ж'. QQQQ","y 'ж'. d MMMM, EEEE","y 'ж'. d MMMM","y 'ж'. dd MMM","Қ","А","Н","С","М","Ш","Т","Ж","қаң.","ақп.","нау.","сәу.","мам.","мау.","шіл.","там.","қыр.","қаз.","қар.","жел.","қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан","Д","Б","Жс","Дс","Сс","Ср","Бс","Жм","Сб","жексенбі","дүйсенбі","сейсенбі","сәрсенбі","бейсенбі","жұма","сенбі","таңғы","түскі/кешкі","б.з.д.","б.з.","Біздің заманымызға дейін","Біздің заманымыз","БД","КД$","₸","MM y","dd/MM y","E dd/MM y","pamba","wanja","mbiyɔ mɛndoŋgɔ","Nyɔlɔmbɔŋgɔ","Mɔnɔ ŋgbanja","Nyaŋgwɛ ŋgbanja","kuŋgwɛ","fɛ","njapi","nyukul","ɓulɓusɛ","ye","va","ms","sɔndi","mɛrkɛrɛdi","yedi","vaŋdɛrɛdi","mɔnɔ sɔndi","januari","februari","martsi","aprili","maji","augustusi","septemberi","oktoberi","novemberi","decemberi","ata","pin","sis","tal","arf","sabaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq","Ngat","Taa","Iwo","Mam","Paa","Nge","Roo","Bur","Epe","Kpt","Kpa","Mulgul","Ng’atyaato","Kiptaamo","Iwootkuut","Mamuut","Paagi","Ng’eiyeet","Rooptui","Bureet","Epeeso","Kipsuunde ne taai","Kipsuunde nebo aeng’","Kts","Kot","Koo","Kos","Koa","Kom","Kol","Kotisap","Kotaai","Koaeng’","Kosomok","Koang’wan","Komuut","Kolo","karoon","kooskoliny","KO","Amait kesich Jesu","Kokakesich Jesu","{1} នៅ {0}","y នៃ G","MMM y នៃ G","d MMM y នៃ G","E d MMM y នៃ G","មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ","អា","ច","អ","ពុ","ព្រ","សុ","ស","អាទិត្យ","ច័ន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍","ព្រឹក","ល្ងាច","មុន គ.ស.","គ.ស.","មុន​គ្រិស្តសករាជ","គ្រិស្តសករាជ","៛","d/M, E","MMM d,y","ಜ","ಫೆ","ಮಾ","ಏ","ಮೇ","ಜೂ","ಜು","ಆ","ಸೆ","ಅ","ನ","ಡಿ","ಜನ","ಫೆಬ್ರ","ಮಾರ್ಚ್","ಏಪ್ರಿ","ಜೂನ್","ಜುಲೈ","ಆಗ","ಸೆಪ್ಟೆಂ","ಅಕ್ಟೋ","ನವೆಂ","ಡಿಸೆಂ","ಜನವರಿ","ಫೆಬ್ರವರಿ","ಏಪ್ರಿಲ್","ಆಗಸ್ಟ್","ಸೆಪ್ಟೆಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್","ಭಾ","ಸೋ","ಮಂ","ಬು","ಗು","ಶು","ಶ","ಭಾನು","ಸೋಮ","ಮಂಗಳ","ಬುಧ","ಗುರು","ಶುಕ್ರ","ಶನಿ","ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ","ಪೂರ್ವಾಹ್ನ","ಅಪರಾಹ್ನ","ಕ್ರಿ.ಪೂ","ಕ್ರಿ.ಶ","ಕ್ರಿ.ಪೂ.ಕಾಲ","ಪ್ರಸಕ್ತ ಶಕ","ಕ್ರಿಸ್ತ ಪೂರ್ವ","ಕ್ರಿಸ್ತ ಶಕ","d일","d일 (E)","d일 EEEE","(E) a h:mm","(E) HH:mm","(E) a h:mm:ss","(E) HH:mm:ss","G y년","G y년 MMM","G y년 MMM d일","G y년 MMM d일 (E)","G y년 MMM d일 EEEE","a h시","H시","H시 m분 s초","H시 m분 s초 v","M월","M. d. (E)","M. d. EEEE","MMM d일","MMM d일 (E)","MMM d일 EEEE","MMMM d일","y년","y. M. d.","y. M. d. (E)","y. M. d. EEEE","y년 MMM","y년 MMM d일","y년 MMM d일 (E)","y년 MMM d일 EEEE","y년 MMMM","y년 QQQ","y년 QQQQ","y년 M월 d일 EEEE","y년 M월 d일","yy. M. d.","a h시 m분 s초 zzzz","a h시 m분 s초 z","1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월","일","월","화","수","목","금","토","일요일","월요일","화요일","수요일","목요일","금요일","토요일","불기","오전","오후","투트","바바흐","하투르","키야흐크","투바흐","암쉬르","바라마트","바라문다흐","바샨스","바우나흐","아비브","미스라","나시","매스캐램","테켐트","헤다르","타흐사스","테르","얘카티트","매가비트","미야지야","겐보트","새네","함레","내하세","파구맨","기원전","서기","디스리월","말케스월","기슬르월","데벳월","스밧월","아달월 1","아달월","닛산월","이야르월","시완월","담무르월","압월","엘룰월","아달월 2","무하람","사파르","라비 알 아왈","라비 알 쎄니","주마다 알 아왈","주마다 알 쎄니","라잡","쉐아반","라마단","쉐왈","듀 알 까다","듀 알 히자","다이카 (645 ~ 650)","하쿠치 (650 ~ 671)","하쿠호 (672 ~ 686)","슈초 (686 ~ 701)","다이호 (701 ~ 704)","게이운 (704 ~ 708)","와도 (708 ~ 715)","레이키 (715 ~ 717)","요로 (717 ~ 724)","진키 (724 ~ 729)","덴표 (729 ~ 749)","덴표칸포 (749 ~ 749)","덴표쇼호 (749 ~ 757)","덴표호지 (757 ~ 765)","덴표진고 (765 ~ 767)","진고케이운 (767 ~ 770)","호키 (770 ~ 780)","덴오 (781 ~ 782)","엔랴쿠 (782 ~ 806)","다이도 (806 ~ 810)","고닌 (810 ~ 824)","덴초 (824 ~ 834)","조와 (834 ~ 848)","가쇼 (848 ~ 851)","닌주 (851 ~ 854)","사이코 (854 ~ 857)","덴난 (857 ~ 859)","조간 (859 ~ 877)","간교 (877 ~ 885)","닌나 (885 ~ 889)","간표 (889 ~ 898)","쇼타이 (898 ~ 901)","엔기 (901 ~ 923)","엔초 (923 ~ 931)","조헤이 (931 ~ 938)","덴교 (938 ~ 947)","덴랴쿠 (947 ~ 957)","덴토쿠 (957 ~ 961)","오와 (961 ~ 964)","고호 (964 ~ 968)","안나 (968 ~ 970)","덴로쿠 (970 ~ 973)","덴엔 (973 ~ 976)","조겐 (976 ~ 978)","덴겐 (978 ~ 983)","에이간 (983 ~ 985)","간나 (985 ~ 987)","에이엔 (987 ~ 989)","에이소 (989 ~ 990)","쇼랴쿠 (990 ~ 995)","조토쿠 (995 ~ 999)","조호 (999 ~ 1004)","간코 (1004 ~ 1012)","조와 (1012 ~ 1017)","간닌 (1017 ~ 1021)","지안 (1021 ~ 1024)","만주 (1024 ~ 1028)","조겐 (1028 ~ 1037)","조랴쿠 (1037 ~ 1040)","조큐 (1040 ~ 1044)","간토쿠 (1044 ~ 1046)","에이쇼 (1046 ~ 1053)","덴기 (1053 ~ 1058)","고헤이 (1058 ~ 1065)","지랴쿠 (1065 ~ 1069)","엔큐 (1069 ~ 1074)","조호 (1074 ~ 1077)","쇼랴쿠 (1077 ~ 1081)","에이호 (1081 ~ 1084)","오토쿠 (1084 ~ 1087)","간지 (1087 ~ 1094)","가호 (1094 ~ 1096)","에이초 (1096 ~ 1097)","조토쿠 (1097 ~ 1099)","고와 (1099 ~ 1104)","조지 (1104 ~ 1106)","가쇼 (1106 ~ 1108)","덴닌 (1108 ~ 1110)","덴에이 (1110 ~ 1113)","에이큐 (1113 ~ 1118)","겐에이 (1118 ~ 1120)","호안 (1120 ~ 1124)","덴지 (1124 ~ 1126)","다이지 (1126 ~ 1131)","덴쇼 (1131 ~ 1132)","조쇼 (1132 ~ 1135)","호엔 (1135 ~ 1141)","에이지 (1141 ~ 1142)","고지 (1142 ~ 1144)","덴요 (1144 ~ 1145)","규안 (1145 ~ 1151)","닌페이 (1151 ~ 1154)","규주 (1154 ~ 1156)","호겐 (1156 ~ 1159)","헤이지 (1159 ~ 1160)","에이랴쿠 (1160 ~ 1161)","오호 (1161 ~ 1163)","조칸 (1163 ~ 1165)","에이만 (1165 ~ 1166)","닌난 (1166 ~ 1169)","가오 (1169 ~ 1171)","조안 (1171 ~ 1175)","안겐 (1175 ~ 1177)","지쇼 (1177 ~ 1181)","요와 (1181 ~ 1182)","주에이 (1182 ~ 1184)","겐랴쿠 (1184 ~ 1185)","분지 (1185 ~ 1190)","겐큐 (1190 ~ 1199)","쇼지 (1199 ~ 1201)","겐닌 (1201 ~ 1204)","겐큐 (1204 ~ 1206)","겐에이 (1206 ~ 1207)","조겐 (1207 ~ 1211)","겐랴쿠 (1211 ~ 1213)","겐포 (1213 ~ 1219)","조큐 (1219 ~ 1222)","조오 (1222 ~ 1224)","겐닌 (1224 ~ 1225)","가로쿠 (1225 ~ 1227)","안테이 (1227 ~ 1229)","간키 (1229 ~ 1232)","조에이 (1232 ~ 1233)","덴푸쿠 (1233 ~ 1234)","분랴쿠 (1234 ~ 1235)","가테이 (1235 ~ 1238)","랴쿠닌 (1238 ~ 1239)","엔오 (1239 ~ 1240)","닌지 (1240 ~ 1243)","간겐 (1243 ~ 1247)","호지 (1247 ~ 1249)","겐초 (1249 ~ 1256)","고겐 (1256 ~ 1257)","쇼카 (1257 ~ 1259)","쇼겐 (1259 ~ 1260)","분오 (1260 ~ 1261)","고초 (1261 ~ 1264)","분에이 (1264 ~ 1275)","겐지 (1275 ~ 1278)","고안 (1278 ~ 1288)","쇼오 (1288 ~ 1293)","에이닌 (1293 ~ 1299)","쇼안 (1299 ~ 1302)","겐겐 (1302 ~ 1303)","가겐 (1303 ~ 1306)","도쿠지 (1306 ~ 1308)","엔쿄 (1308 ~ 1311)","오초 (1311 ~ 1312)","쇼와 (1312 ~ 1317)","분포 (1317 ~ 1319)","겐오 (1319 ~ 1321)","겐코 (1321 ~ 1324)","쇼추 (1324 ~ 1326)","가랴쿠 (1326 ~ 1329)","겐토쿠 (1329 ~ 1331)","겐코 (1331 ~ 1334)","겐무 (1334 ~ 1336)","엔겐 (1336 ~ 1340)","고코쿠 (1340 ~ 1346)","쇼헤이 (1346 ~ 1370)","겐토쿠 (1370 ~ 1372)","분추 (1372 ~ 1375)","덴주 (1375 ~ 1379)","고랴쿠 (1379 ~ 1381)","고와 (1381 ~ 1384)","겐추 (1384 ~ 1392)","메이토쿠 (1384 ~ 1387)","가쿄 (1387 ~ 1389)","고오 (1389 ~ 1390)","메이토쿠 (1390 ~ 1394)","오에이 (1394 ~ 1428)","쇼초 (1428 ~ 1429)","에이쿄 (1429 ~ 1441)","가키쓰 (1441 ~ 1444)","분안 (1444 ~ 1449)","호토쿠 (1449 ~ 1452)","교토쿠 (1452 ~ 1455)","고쇼 (1455 ~ 1457)","조로쿠 (1457 ~ 1460)","간쇼 (1460 ~ 1466)","분쇼 (1466 ~ 1467)","오닌 (1467 ~ 1469)","분메이 (1469 ~ 1487)","조쿄 (1487 ~ 1489)<","엔토쿠 (1489 ~ 1492)","메이오 (1492 ~ 1501)","분키 (1501 ~ 1504)","에이쇼 (1504 ~ 1521)","다이에이 (1521 ~ 1528)","교로쿠 (1528 ~ 1532)","덴분 (1532 ~ 1555)","고지 (1555 ~ 1558)","에이로쿠 (1558 ~ 1570)","겐키 (1570 ~ 1573)","덴쇼 (1573 ~ 1592)","분로쿠 (1592 ~ 1596)","게이초 (1596 ~ 1615)","겐나 (1615 ~ 1624)","간에이 (1624 ~ 1644)","쇼호 (1644 ~ 1648)","게이안 (1648 ~ 1652)","조오 (1652 ~ 1655)","메이레키 (1655 ~ 1658)","만지 (1658 ~ 1661)","간분 (1661 ~ 1673)","엔포 (1673 ~ 1681)","덴나 (1681 ~ 1684)","조쿄 (1684 ~ 1688)","겐로쿠 (1688 ~ 1704)","호에이 (1704 ~ 1711)","쇼토쿠 (1711 ~ 1716)","교호 (1716 ~ 1736)","겐분 (1736 ~ 1741)","간포 (1741 ~ 1744)","엔쿄 (1744 ~ 1748)","간엔 (1748 ~ 1751)","호레키 (1751 ~ 1764)","메이와 (1764 ~ 1772)","안에이 (1772 ~ 1781)","덴메이 (1781 ~ 1789)","간세이 (1789 ~ 1801)","교와 (1801 ~ 1804)","분카 (1804 ~ 1818)","분세이 (1818 ~ 1830)","덴포 (1830 ~ 1844)","고카 (1844 ~ 1848)","가에이 (1848 ~ 1854)","안세이 (1854 ~ 1860)","만엔 (1860 ~ 1861)","분큐 (1861 ~ 1864)","겐지 (1864 ~ 1865)","게이오 (1865 ~ 1868)","메이지","다이쇼","쇼와","헤이세이","화르바딘","오르디베헤쉬트","호르다드","티르","모르다드","샤흐리바르","메흐르","아반","아자르","다이","바흐만","에스판드","중화민국전","중화민국","जानेवारी","एप्रिल","जुलै","ओगस्ट","सेप्टेंबर","ओक्टोबर","नोव्हेंबर","डिसेंबर","मंगळ","आदित्यवार","मंगळार","म.पू.","म.नं.","क्रिस्तपूर्व","क्रिस्तशखा","Gy","MMM Gy","MMM d, Gy","EEE, MMM d, Gy","EEE, M/d/y","EEE, MMM d, y","جنؤری","فرؤری","مارٕچ","میٔ","جوٗن","جوٗلایی","ستمبر","اکتوٗبر","آتھوار","ژٔنٛدٕروار","بوٚموار","بودوار","برٛٮ۪سوار","جُمہ","بٹوار","اَتھوار","ژٔنٛدرٕروار","بی سی","اے ڈی","قبٕل مسیٖح","عیٖسوی سنہٕ","ربیٖع الاول","ربیٖع الثانی","ذِی القد","ذِی الحج","‎-‎","?","Januali","Febluali","Aplili","Jmn","Jumaapii","Jumaatatu","Jumaane","Jumaatano","Jumaamosi","makeo","nyiaghuo","Kabla ya Klisto","Baada ya Klisto","ŋ1","ŋ2","ŋ3","ŋ4","ŋ5","ŋ6","ŋ7","ŋ8","ŋ9","ŋ10","ŋ11","ŋ12","ŋwíí a ntɔ́ntɔ","ŋwíí akǝ bɛ́ɛ","ŋwíí akǝ ráá","ŋwíí akǝ nin","ŋwíí akǝ táan","ŋwíí akǝ táafɔk","ŋwíí akǝ táabɛɛ","ŋwíí akǝ táaraa","ŋwíí akǝ táanin","ŋwíí akǝ ntɛk","ŋwíí akǝ ntɛk di bɔ́k","ŋwíí akǝ ntɛk di bɛ́ɛ","lǝn","maa","mɛk","jǝǝ","júm","sam","sɔ́ndǝ","lǝndí","maadí","mɛkrɛdí","jǝǝdí","júmbá","samdí","sárúwá","cɛɛ́nko","d.Y.","k.Y.","di Yɛ́sus aká yálɛ","cámɛɛn kǝ kǝbɔpka Y","E 'dä' d.","Y-MM","d. MMM. y","E d. MMM. y","QQQy","EEEE, 'dä' d. MMMM y","Fäb","Mäz","Mäi","Ouj","Säp","Jannewa","Fäbrowa","Määz","Aprell","Juuni","Juuli","Oujoß","Me.","Sunndaach","Moondaach","Dinnsdaach","Metwoch","Dunnersdaach","Friidaach","Samsdaach","Uhr vörmiddaachs","Uhr nommendaachs","vC","nC","vdZ","dZ","v. d. Z.","d. Z.","vür Chrestus","noh Chrestus","vür der gewöhnlichen Zeitrechnung","der gewöhnlichen Zeitrechnung","¤¤¤","Gen","Hwe","Meu","Ebr","Met","Gor","Gwn","Hed","Kev","mis Genver","mis Hwevrer","mis Meurth","mis Ebrel","mis Me","mis Metheven","mis Gortheren","mis Est","mis Gwynngala","mis Hedra","mis Du","mis Kevardhu","Mth","Mhr","Yow","Gwe","dy Sul","dy Lun","dy Meurth","dy Merher","dy Yow","dy Gwener","dy Sadorn","G y-'ж'.","G y-'ж'. MMM","G y-'ж'. d-MMM","G y-'ж'. d-MMM, E","dd-MM, E","d-MMM, E","y-'ж'. MMM","y-'ж'. d-MMM","y-'ж'. d-MMM, E","y-'ж'., QQQ","y-'ж'., QQQQ","EEEE, d-MMMM, y-'ж'.","Я","Ф","И","О","янв.","фев.","мар.","апр.","июн.","июл.","авг.","сен.","окт.","ноя.","дек.","жек.","дүй.","шейш.","шарш.","бейш.","жума","ишм.","жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","ишемби","таңкы","түштөн кийинки","б.з.ч.","биздин заманга чейин","биздин заман","сан эмес","сом","Fúngatɨ","Naanɨ","Keenda","Ikúmi","Inyambala","Idwaata","Mʉʉnchɨ","Vɨɨrɨ","Saatʉ","Inyi","Saano","Sasatʉ","Kʉfúngatɨ","Kʉnaanɨ","Kʉkeenda","Kwiikumi","Kwiinyambála","Kwiidwaata","Kʉmʉʉnchɨ","Kʉvɨɨrɨ","Kʉsaatʉ","Kwiinyi","Kʉsaano","Kʉsasatʉ","Píili","Táatu","Íne","Táano","Móosi","Jumapíiri","Jumatátu","Jumaíne","Jumatáano","Alamíisi","Ijumáa","Jumamóosi","TOO","MUU","KSA","KA","Kɨrɨsitʉ sɨ anavyaal","Kɨrɨsitʉ akavyaalwe","HH 'Auer'","Mäe.","Abr.","Mäerz","Abrëll","Son.","Méi.","Dën.","Mët.","Don.","Fre.","Sam.","Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg","moies","nomëttes","v. e. Z.","n. e. Z.","Apu","Seb","Oki","Janwaliyo","Febwaliyo","Marisi","Apuli","Maayi","Julaayi","Agusito","Sebuttemba","Okitobba","Bal","Lw2","Lw3","Lw4","Lw5","Lw6","Sabbiiti","Balaza","Lwakubiri","Lwakusatu","Lwakuna","Lwakutaano","Lwamukaaga","Kulisito nga tannaza","Bukya Kulisito Azaal","Wiótheȟika Wí","Thiyóȟeyuŋka Wí","Ištáwičhayazaŋ Wí","Pȟežítȟo Wí","Čhaŋwápetȟo Wí","Wípazukȟa-wašté Wí","Čhaŋpȟásapa Wí","Wasútȟuŋ Wí","Čhaŋwápeǧi Wí","Čhaŋwápe-kasná Wí","Waníyetu Wí","Tȟahékapšuŋ Wí","Aŋpétuwakȟaŋ","Aŋpétuwaŋži","Aŋpétunuŋpa","Aŋpétuyamni","Aŋpétutopa","Aŋpétuzaptaŋ","Owáŋgyužažapi","ɔ","fbl","msi","apl","yun","yul","agt","stb","ɔtb","nvb","dsb","sánzá ya yambo","sánzá ya míbalé","sánzá ya mísáto","sánzá ya mínei","sánzá ya mítáno","sánzá ya motóbá","sánzá ya nsambo","sánzá ya mwambe","sánzá ya libwa","sánzá ya zómi","sánzá ya zómi na mɔ̌kɔ́","sánzá ya zómi na míbalé","eye","ybo","mbl","mst","min","mtn","mps","eyenga","mokɔlɔ mwa yambo","mokɔlɔ mwa míbalé","mokɔlɔ mwa mísáto","mokɔlɔ ya mínéi","mokɔlɔ ya mítáno","mpɔ́sɔ","ntɔ́ngɔ́","mpókwa","libóso ya","nsima ya Y","Yambo ya Yézu Krís","Nsima ya Yézu Krís","d MMMM, G y","E d MMMM, G y","h ໂມງa","EEEE ທີ d MMMM G y","H ໂມງ m ນາທີ ss ວິນາທີ zzzz","H ໂມງ m ນາທີ ss ວິນາທີ z","ມ.ກ.","ກ.ພ.","ມ.ນ.","ມ.ສ.","ພ.ພ.","ມິ.ຖ.","ກ.ລ.","ສ.ຫ.","ກ.ຍ.","ຕ.ລ.","ພ.ຈ.","ທ.ວ.","ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ","ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ","ກ່ອນທ່ຽງ","ຫຼັງທ່ຽງ","ເທົາ","ບາບາ","ຮາໂຕ","ເຄຍ","ໂທບາ","ອຳເຊີ","ບາລຳຮາດ","ບາລາມູດາ","ບາສຮານ","ເປົານາ","ອີແປບ","ມາສລາ","ນາຊິວ","ອາເຊີ","ນາຊີວ","ແມສເຄີແຣມ","ເຕເກມ","ເຮດາ","ທາຊັສ","ເທີ","ເຍຄາທິດ","ເມກາບິດ","ເມຍເຊຍ","ເຈນບອດ","ເຊເນ","ຮຳເລ","ເນແຮສ໌","ພາກູເມນ","ກ່ອນ ຄ.ສ.","ຄ.ສ.","ກ່ອນຍຸກ ຄ.ສ","ຍຸກ ຄ.ສ","ກ່ອນຄຣິດສັກກະລາດ","ຄຣິດສັກກະລາດ","ກ່ອນສາກົນສັກກະລາດ","ສາກົນສັກກະລາດ","ທຣິດຣີ","ເຮວານ","ກິດເລບ","ເຕເວດ","ຊີວັດ","ອາດາ I","ອາດາ","ນິດຊານ","ອີຍາຣ","ສີວານ","ຕາມູ","ເອບ","ອີລູ","ອາດາ II","ຈິຕຣາ","ວິສາຂະ","ເຊດຖາ","ອັດສາ","ສາຣາວານາ","ພະຕຣາ","ອັສວິຊາ","ການຕິກາ","ອັກຣາຮາຢານາ","ປຸສາ","ມາຄະ","ຜາລກຸນີ","ປຸສະຍາ","ມຸຮັດ","ເຄາະ","ຮອດບີ 1","ຮອກບີ 2","ນຸມາ 1","ນຸມາ 2","ເຮາະ","ຊະອ໌","ເຮາະມະ","ເຊົາ","ຊຸລກິອຸ","ຊຸລຫິຈ","ມຸຣະຮອມ","ຊາຟາຣ","ຮອດບີ 2","ຈຸມາດາ 1","ຈຸມາດາ 2","ຮາຈັບ","ຊະບານ","ຮາມາດອນ","ເຊົາວັດ","ດຸອັດກິດະ","ດຸອັດກິຈະ","ທະອິກະ (645–650)","ຮາກູຊິ (650–671)","ຮາກູໂຮ (672–686)","ຊູໂຊ (686–701)","ທາອິໂຮ (701–704)","ເຄອຸງ (704–708)","ວະໂດ (708–715)","ເຣອິກິ (715–717)","ໂຢໂຣ (717–724)","ຈິງກິ (724–729)","ເທັມປຽວ (729–749)","ເທັມປຽວ-ຄໍາໂປ (749–749)","ເທັມປຽວ-ໂຊໂຮ (749–757)","ເທັມປຽວ-ໂຮຈິ (757–765)","ເທັມປຽວ-ຈິງໂງະ (765–767)","ຈິງໂງະ-ເຄອຸງ (767–770)","ໂຮກິ (770–780)","ເທັນ-ໂອ (781–782)","ເອັນຣຢາກຸ (782–806)","ດາອິໂດ (806–810)","ໂກນິນ (810–824)","ເທັນໂຊ (824–834)","ໂຊວະ (834–848)","ກະໂຈ (848–851)","ນິນຈູ (851–854)","ສະອິໂກະ (854–857)","ເທັນນານ (857–859)","ໂຈງານ (859–877)","ເກັນເກ (877–885)","ນິນນາ (885–889)","ກໍາປຽວ (889–898)","ໂຊຕາອິ (898–901)","ເອັນງິ (901–923)","ເອັນໂຊ (923–931)","ໂຊເຮ (931–938)","ເທັນງຽວ (938–947)","ເທັນຣຢາກູ (947–957)","ເທັນໂຕະກຸ (957–961)","ໂອວະ (961–964)","ໂກໂຮ (964–968)","ອານະ (968–970)","ເທັນໂຣະກຸ (970–973)","ເທັນ-ເອັນ (973–976)","ໂຈເງັນ (976–978)","ເທັນເງັນ (978–983)","ເອການ (983–985)","ການນະ (985–987)","ເອ-ເອັນ (987–989)","ເອໂຊ (989–990)","ໂຊຣຢະກຸ (990–995)","ໂຊໂຕະກຸ (995–999)","ໂຊໂຮ (999–1004)","ການໂກ (1004–1012)","ໂຊຫວະ (1012–1017)","ການນິງ (1017–1021)","ຈິອານ (1021–1024)","ມານຈຸ (1024–1028)","ໂຊເງັນ (1028–1037)","ໂຊເຣຢະກຸ (1037–1040)","ໂຊຄິວ (1040–1044)","ການໂຕະກຸ (1044–1046)","ເອະໂຊ (1046–1053)","ເທັນງິ (1053–1058)","ໂກເຮ (1058–1065)","ຈິເຣຢະກຸ (1065–1069)","ເອັນຄິວ (1069–1074)","ໂຊະໂຮ (1074–1077)","ໂຊະເຣຢະກຸ (1077–1081)","ເອໂຊະ (1081–1084)","ໂອໂຕະກຸ (1084–1087)","ການຈິ (1087–1094)","ກາໂຊ (1094–1096)","ເອະໂຊະ (1096–1097)","ໂຊະໂຕະກຸ (1097–1099)","ໂກະວະ (1099–1104)","ໂຊະຈິ (1104–1106)","ກາໂຊະ (1106–1108)","ເທັນນິນ (1108–1110)","ເທັນ-ອິ (1110–1113)","ເອກິວ (1113–1118)","ເຄັນ-ເອ (1118–1120)","ໂຮະອານ (1120–1124)","ເທັນຈິ (1124–1126)","ດາອິຈິ (1126–1131)","ເທັນໂຊະ (1131–1132)","ໂຊະໂຊະ (1132–1135)","ໂຮເອັນ (1135–1141)","ເອຈິ (1141–1142)","ໂກະຈິ (1142–1144)","ເທັນໂຢະ (1144–1145)","ຄິວອານ (1145–1151)","ນິນເປ (1151–1154)","ຄິວຈຸ (1154–1156)","ໂຮເຄັນ (1156–1159)","ເຮຈິ (1159–1160)","ເອເຣຢະກຸ (1160–1161)","ໂອໂຊ (1161–1163)","ໂຊະການ (1163–1165)","ເອມານ (1165–1166)","ນິນ-ອານ (1166–1169)","ກະໂອ (1169–1171)","ໂຊະອານ (1171–1175)","ອານເຄັນ (1175–1177)","ຈິໂຊະ (1177–1181)","ໂຢະວະ (1181–1182)","ຈຸເອະ (1182–1184)","ເຄັນເຣຢຸກິ (1184–1185)","ບັນຈິ (1185–1190)","ເກັນຄິວ (1190–1199)","ໂຊຈິ (1199–1201)","ເກັນນິນ (1201–1204)","ເຄັນກິວ (1204–1206)","ເກັນ-ເອະ (1206–1207)","ໂຊະເຄັນ (1207–1211)","ເກັນເຣຢະກຸ (1211–1213)","ເກັນໂປະ (1213–1219)","ໂຊະກິວ (1219–1222)","ໂຈະໂອະ (1222–1224)","ເຄັນນິນ (1224–1225)","ກາໂຮກຸ (1225–1227)","ອານເຕະ (1227–1229)","ການກິ (1229–1232)","ໂຈະເອະ (1232–1233)","ເທັມປຸກຸ (1233–1234)","ບັນເຣຢະກຸ (1234–1235)","ກາເຕະ (1235–1238)","ເຣຢະກຸນິນ (1238–1239)","ເອັນ-ໂອ (1239–1240)","ນິນຈີ (1240–1243)","ຄານເຈນ (1243–1247)","ໂຫຈີ (1247–1249)","ເຄນໂຊ (1249–1256)","ໂຄເຈນ (1256–1257)","ໂຊກາ (1257–1259)","ໂຊເກນ (1259–1260)","ບຸນ-ໂອ (1260–1261)","ໂຄໂຊ (1261–1264)","ບຸນ-ອີ (1264–1275)","ເຄນຈີ (1275–1278)","ເຄິນ (1278–1288)","ໂຊ (1288–1293)","ອິນນິນ (1293–1299)","ເຊີນ (1299–1302)","ເຄນເຈນ (1302–1303)","ຄາເຈນ (1303–1306)","ໂຕກູຈິ (1306–1308)","ອິນກິ (1308–1311)","ໂອໂຊ (1300–1312)","ໂຊວາ (1312–1317)","ບຸນໂປ (1317–1319)","ຈີໂນ (1319–1321)","ເຈນກຽວ (1321–1324)","ໂຊຊິ (1324–1326)","ຄາຣາກິ (1326–1329)","ເຈນໂຕກູ (1329–1331)","ເຈນໂກ (1331–1334)","ເກັມມຸ (1334–1336)","ເອັນເຈັນ (1336–1340)","ໂກໂກກຸ (1340–1346)","ໂຊຊິ (1346–1370)","ເຄນໂຕກຸ (1370–1372)","ບຸນຊຸ (1372–1375)","ເທັນຈຸ (1375–1379)","ຄໍຢາກຸ (1379–1381)","ໂກວາ (1381–1384)","ເຈັນຊຸ (1384–1392)","ມີໂຕກຸ (1384–1387)","ກາກິ (1387–1389)","ຄູ (1389–1390)","ມິໂຕກຸ (1390–1394)","ໂອອິ (1394–1428)","ໂຊໂຊ (1428–1429)","ອິກຽວ (1429–1441)","ກາກິຊຸ (1441–1444)","ບຸນ-ອານ (1444–1449)","ໂຫໂຕກຸ (1449–1452)","ກຽວໂຕກຸ (1452–1455)","ເກໂຊ (1455–1457)","ໂຊໂຣກຸ (1457–1460)","ຄານໂຊ (1460–1466)","ບຸນໂຊ (1466–1467)","ໂອນິນ (1467–1469)","ບຸນມິ (1469–1487)","ໂຊກຽວ (1487–1489)","ເອັນໂຕກຸ (1489–1492)","ມິໂອ (1492–1501)","ບຸນກິ (1501–1504)","ອິໂຊ (1504–1521)","ໄຕອິ (1521–1528)","ກຽວໂຣກຸ (1528–1532)","ເທັນມອນ (1532–1555)","ໂກຈິ (1555–1558)","ອິໂຣກຸ (1558–1570)","ເຈັນກິ (1570–1573)","ເທັນໂຊ (1573–1592)","ບຸນໂຣກຸ (1592–1596)","ຄິໂຊ (1596–1615)","ເກັນວາ (1615–1624)","ຄານ-ອິ (1624–1644)","ໂຊໂຊ (1644–1648)","ຄຽນ (1648–1652)","ຊຸ (1652–1655)","ເມຍຢາກຸ (1655–1658)","ແມນຈິ (1658–1661)","ການບຸນ (1661–1673)","ເອັນໂປ (1673–1681)","ເທັນວາ (1681–1684)","ໂຈກຽວ (1684–1688)","ເຈັນໂຣກຸ (1688–1704)","ໂຫອິ (1704–1711)","ຊຸຕຸກຸ (1711–1716)","ກຽວຫຸ (1716–1736)","ເຈັນບຸນ (1736–1741)","ຄານໂປ (1741–1744)","ເອັນກຽວ (1744–1748)","ຄານ-ອິນ (1748–1751)","ໂຫຢາກຸ (1751–1764)","ເມຍວາ (1764–1772)","ເອັນ-ອິ (1772–1781)","ເທັນມິ (1781–1789)","ຄານຊິ (1789–1801)","ກຽວວາ (1801–1804)","ບຸນກາ (1804–1818)","ບຸນຊິ (1818–1830)","ເທັນໂປ (1830–1844)","ກຸກາ (1844–1848)","ກາອິ (1848–1854)","ແອັນຊິ (1854–1860)","ແມັນ-ເອັນ (1860–1861)","ບຸນກຸ (1861–1864)","ເຈນຈີ (1864–1865)","ຄີໂອ (1865–1868)","ມີຈີ","ໄຕໂຊ","ໂຊວາ","ຮີຊີ","ຟາຣວາດິນ","ອໍຣດີບີເຫຣດ","ຄໍຣເດດ","ແຕຣ","ມໍຣເດດ","ຊາຣຫິວາ","ເມີ","ອາບານ","ອາຊາ","ດີຣ","ບຣາມານ","ເອສຟານ","ຟຣາວາດິນ","ອາຊາຣ","ບຣາແມນ","ປີເປີເຊຍ","ກ່ອນ R.O.C.","ບໍ່​ແມ່ນ​ໂຕ​ເລກ","₭","جانڤیە","فئڤریە","آڤریل","مئی","جوٙأن","جوٙلا","آگوست","سئپتامر","ئوکتوڤر","نوڤامر","دئسامر","dd","hh:mm a, E","HH:mm, E","hh:mm:ss a, E","HH:mm:ss, E","y 'm'. G","y-MM G","y-MM-dd G","y-MM-dd G, E","y 'm'. G, LLLL","y 'm'. G MMMM d 'd'.","y 'm'. G MMMM d 'd'., E","hh:mm:ss a; v","HH:mm:ss; v","hh:mm a; v","HH:mm; v","MMMM d 'd'.","MMMM d 'd'., E","y 'm'. LLLL","y 'm'. MMMM d 'd'.","y 'm'. MMMM d 'd'., E","y 'm'. MMMM d 'd'., EEEE","saus.","vas.","kov.","bal.","geg.","birž.","liep.","rugp.","rugs.","spal.","lapkr.","gruod.","sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio","Š","sk","pr","an","tr","kt","pn","št","sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis","priešpiet","popiet","po Kr.","pr. m. e.","mūsų eroje","prieš Kristų","po Kristaus","prieš mūsų erą","Hakuči (650–671)","Hakuho (672–686)","Šučo (686–701)","Taiho (701–704)","Vado (708–715)","Joro (717–724)","Tempio (729–749)","Tempio-kampo (749–749)","Tempio-šoho (749–757)","Tempio-hodzi (757–765)","Tempo-dzingo (765–767)","Dzingo-keiun (767–770)","Hoki (770–780)","Ten-o (781–782)","Enrjaku (782–806)","Daido (806–810)","Konin (810–824)","Tenčo (824–834)","Šova (834–848)","Kajo (848–851)","Tenan (857–859)","Jogan (859–877)","Ninja (885–889)","Kampjo (889–898)","Šotai (898–901)","Enčo (923–931)","Šohei (931–938)","Tengjo (938–947)","Tenriaku (947–957)","Ova (961–964)","Koho (964–968)","Ana (968–970)","Ten-en (973–976)","Jogen (976–978)","Kana (985–987)","Ei-en (987–989)","Šorjaku (990–995)","Čotoku (995–999)","Čoho (999–1004)","Kanko (1004–1012)","Čova (1012–1017)","Kanin (1017–1021)","Džian (1021–1024)","Mandžiu (1024–1028)","Čogen (1028–1037)","Čorjaku (1037–1040)","Čokju (1040–1044)","Eišo (1046–1053)","Kohei (1058–1065)","Džirjaku (1065–1069)","Enkju (1069–1074)","Šoho (1074–1077)","Šorjaku (1077–1081)","Eiho (1081–084)","Otoku (1084–1087)","Kandži (1087–1094)","Eičo (1096–1097)","Šotoku (1097–1099)","Kova (1099–1104)","Čodži (1104–1106)","Kašo (1106–1108)","Tenin (1108–1110)","Ten-ei (1110–1113)","Eikju (1113–1118)","Gen-ei (1118–1120)","Tendži (1124–1126)","Daidži (1126–1131)","Tenšo (1131–1132)","Čošo (1132–1135)","Eidži (1141–1142)","Kodži (1142–1144)","Tenjo (1144–1145)","Kjuan (1145–1151)","Kjuju (1154–1156)","Heidži (1159–1160)","Eirjaku (1160–1161)","Oho (1161–1163)","Čokan (1163–1165)","Nin-an (1166–1169)","Kao (1169–1171)","Šoan (1171–1175)","Džišo (1177–1181)","Jova (1181–1182)","Džuei (1182–1184)","Genrjuku (1184–1185)","Bundži (1185–1190)","Kenkju (1190–1199)","Šodži (1199–1201)","Kenin (1201–1204)","Genkju (1204–1206)","Ken-ei (1206–1207)","Šogen (1207–1211)","Kenrjaku (1211–1213)","Kenpo (1213–1219)","Šokju (1219–1222)","Džu (1222–1224)","Genin (1224–1225)","Džoei (1232–1233)","Bunrjaku (1234–1235)","Rjakunin (1238–1239)","En-o (1239–1240)","Nindži (1240–1243)","Hodži (1247–1249)","Kenčo (1249–1256)","Kogen (1256–1257)","Šoka (1257–1259)","Šogen (1259–1260)","Bun-o (1260–1261)","Kočo (1261–1264)","Bun-ei (1264–1275)","Kendži (1275–1278)","Koan (1278–1288)","Šu (1288–1293)","Šoan (1299–1302)","Tokudži (1306–1308)","Očo (1311–1312)","Šova (1312–1317)","Bunpo (1317–1319)","Dženo (1319–1321)","Dženkjo (1321–1324)","Šoču (1324–1326)","Genko (1331–1334)","Kemu (1334–1336)","Kokoku (1340–1346)","Šohei (1346–1370)","Bunču (1372–1375)","Tendžu (1375–1379)","Korjaku (1379–1381)","Kova (1381–1384)","Genču (1384–1392)","Ku (1389–1390)","Oei (1394–1428)","Šočo (1428–1429)","Eikjo (1429–1441)","Bun-an (1444–1449)","Hotoku (1449–1452)","Kjotoku (1452–1455)","Košo (1455–1457)","Čoroku (1457–1460)","Kanšo (1460–1466)","Bunšo (1466–1467)","Onin (1467–1469)","Čokjo (1487–1489)","Meio (1492–1501)","Eišo (1504–1521)","Kjoroku (1528–1532)","Kodži (1555–1558)","Tenšo (1573–1592)","Keičo (1596–1615)","Genva (1615–1624)","Kan-ei (1624–1644)","Šoho (1644–1648)","Šu (1652–1655)","Meirjaku (1655–1658)","Mandži (1658–1661)","Enpo (1673–1681)","Tenva (1681–1684)","Džokjo (1684–1688)","Hoei (1704–1711)","Šotoku (1711–1716)","Kjoho (1716–1736)","Kanpo (1741–1744)","Enkjo (1744–1748)","Kan-en (1748–1751)","Horjaku (1751–1764)","Meiva (1764–1772)","An-ei (1772–1781)","Kjova (1801–1804)","Tenpo (1830–1844)","Koka (1844–1848)","Man-en (1860–1861)","Bunkju (1861–1864)","Gendži (1864–1865)","Keiko (1865–1868)","Meidži","Taišo","Šova","Prieš R.O.C.","Cio","Lus","Muu","Lum","Luf","Kab","Lush","Lut","Cis","Ciongo","Lùishi","Lusòlo","Mùuyà","Lumùngùlù","Lufuimi","Kabàlàshìpù","Lùshìkà","Lutongolo","Lungùdi","Kaswèkèsè","Ciswà","Nko","Ndy","Ndg","Njw","Ngv","Lub","Lumingu","Nkodya","Ndàayà","Ndangù","Njòwa","Ngòvya","Lubingu","Dinda","Dilolo","kmp. Y.K.","kny. Y. K.","Kumpala kwa Yezu Kli","Kunyima kwa Yezu Kli","DAC","DAR","DAD","DAN","DAH","DAU","DAO","DAB","DOC","DAP","DGI","DAG","Dwe mar Achiel","Dwe mar Ariyo","Dwe mar Adek","Dwe mar Ang’wen","Dwe mar Abich","Dwe mar Auchiel","Dwe mar Abiriyo","Dwe mar Aboro","Dwe mar Ochiko","Dwe mar Apar","Dwe mar gi achiel","Dwe mar Apar gi ariyo","JMP","WUT","TAR","TAD","TAN","TAB","NGS","Jumapil","Wuok Tich","Tich Ariyo","Tich Adek","Tich Ang’wen","Tich Abich","Ngeso","OD","OT","Kapok Kristo obiro","Ka Kristo osebiro","J2","J3","J4","J5","Ij","J1","Jumapiri","Murwa wa Kanne","Murwa wa Katano","Imberi ya Kuuza Kwa","Muhiga Kuvita Kuuza","{currency}{minusSign} {number}","G y. 'g'.","G y. 'g'. MMM","G y. 'g'. d. MMM","E, G y. 'g'. d. MMM","y. 'g'.","d.M.y.","E, d.M.y.","y. 'g'. MMM","y. 'g'. d. MMM","E, y. 'g'. d. MMM","y. 'g'. MMMM","y. 'g'. QQQ","y. 'g'. QQQQ","EEEE, y. 'gada' d. MMMM","y. 'gada' d. MMMM","y. 'gada' d. MMM","maijs","jūn.","jūl.","janvāris","februāris","aprīlis","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris","Sv","Pr","Ot","Tr","Ce","Pk","svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena","priekšpusdienā","pēcpusdienā","p.m.ē.","m.ē.","pirms mūsu ēras","mūsu ērā","tišri","hešvans","kisļevs","tevets","ševats","1. adars","adars","nisans","ijars","sivans","tamuzs","avs","eluls","2. adars","muharams","safars","1. rabī","2. rabī","1. džumādā","2. džumādā","radžabs","šabans","ramadāns","šauvals","du al-kidā","du al-hidžā","nav skaitlis","Ls","Dal","Ará","Ɔɛn","Doy","Lép","Rok","Sás","Bɔ́r","Kús","Gís","Shʉ́","Ntʉ́","Oladalʉ́","Arát","Ɔɛnɨ́ɔɨŋɔk","Olodoyíóríê inkókúâ","Oloilépūnyīē inkókúâ","Kújúɔrɔk","Mórusásin","Ɔlɔ́ɨ́bɔ́rárɛ","Kúshîn","Olgísan","Pʉshʉ́ka","Ntʉ́ŋʉ́s","Jumapílí","Jumane","Jumatánɔ","Alaámisi","Jumáa","Jumamósi","Ɛnkakɛnyá","Ɛndámâ","EY","Meínō Yɛ́sʉ","Eínō Yɛ́sʉ","JAN","FEB","MAC","ĨPU","MĨĨ","NJU","NJR","AGA","SPT","NOV","DEC","Januarĩ","Feburuarĩ","Ĩpurũ","Mĩĩ","Njuni","Njuraĩ","Agasti","Oktũba","Dicemba","KIU","MRA","WAI","WET","WEN","JUM","Muramuko","Wairi","Wethatu","Wena","Wetano","RŨ","ŨG","NK","Mbere ya Kristũ","Nyuma ya Kristũ","avr","zin","zil","zanvie","fevriye","zilye","septam","oktob","novam","desam","dim","lin","ze","van","dimans","lindi","merkredi","zedi","vandredi","samdi","av. Z-K","ap. Z-K","avan Zezi-Krist","apre Zezi-Krist","Mey","Jon","Jol","Aog","Janoary","Febroary","Martsa","Aprily","Jona","Jolay","Aogositra","Septambra","Oktobra","Novambra","Desambra","Alah","Alats","Alar","Alak","Zom","Asab","Alahady","Alatsinainy","Alarobia","Alakamisy","Zoma","Asabotsy","Alohan’i JK","Aorian’i JK","Kwa","Una","Rar","Che","Moc","Moj","Yel","Mweri wo kwanza","Mweri wo unayeli","Mweri wo uneraru","Mweri wo unecheshe","Mweri wo unethanu","Mweri wo thanu na mocha","Mweri wo saba","Mweri wo nane","Mweri wo tisa","Mweri wo kumi","Mweri wo kumi na moja","Mweri wo kumi na yel’li","Sabato","Arahamisi","wichishu","mchochil’l","HY","YY","Hinapiya yesu","Yopia yesu","MTn","M1","A2","M3","N4","F5","I6","A7","I8","K9","mbegtug","imeg àbùbì","imeg mbəŋchubi","iməg ngwə̀t","iməg fog","iməg ichiibɔd","iməg àdùmbə̀ŋ","iməg ichika","iməg kud","iməg tèsiʼe","iməg zò","iməg krizmed","iməg mbegtug","A1","A3","A4","A5","A6","Aneg 1","Aneg 2","Aneg 3","Aneg 4","Aneg 5","Aneg 6","Aneg 7","dd.M","MMM y 'г'.","d MMM y 'г'.","E, d MMM y 'г'.","dd.M.y","dd.M.yy","јан.","јун.","јул.","септ.","ноем.","јануари","нед.","пон.","вт.","сре.","чет.","пет.","саб.","недела","среда","четврток","петок","сабота","претпладне","попладне","пр. н.е.","пред нашата ера","од нашата ера","ден","MMMM d, E","d-M-y, E","y, MMMM d, EEEE","y, MMMM d","y, MMM d","ജ","ഫ","മാ","ഏ","മെ","ജൂ","ഓ","സ","ഒ","ന","ഡി","ജനു","ഫെബ്രു","മാർ","ഏപ്രി","മേയ്","ജൂൺ","ജൂലൈ","ഓഗ","സെപ്റ്റം","ഒക്ടോ","നവം","ഡിസം","ജനുവരി","ഫെബ്രുവരി","മാർച്ച്","ഏപ്രിൽ","ഓഗസ്റ്റ്","സെപ്റ്റംബർ","ഒക്‌ടോബർ","നവംബർ","ഡിസംബർ","ഞ","തി","ചൊ","ബു","വ്യാ","വെ","ശ","ഞായർ","തിങ്കൾ","ചൊവ്വ","ബുധൻ","വ്യാഴം","വെള്ളി","ശനി","ഞായറാഴ്‌ച","തിങ്കളാഴ്‌ച","ചൊവ്വാഴ്ച","ബുധനാഴ്‌ച","വ്യാഴാഴ്‌ച","വെള്ളിയാഴ്‌ച","ശനിയാഴ്‌ച","ക്രി.മു.","എഡി","ബിസിഇ","സിഇ","ക്രിസ്‌തുവിന് മുമ്പ്","ആന്നോ ഡൊമിനി","ബി.സി.ഇ.","സി.ഇ.","ചൈ","വൈ","ജ്യേ","ആ","ശ്രാ","ഭാ","കാ","പൗ","ചൈത്രം","വൈശാഖം","ജ്യേഷ്ഠം","ആഷാഢം","ശ്രാവണം","ഭാദ്രപാദം","ആശ്വിനം","കാർത്തികം","മാർഗശീർഷം","പൗഷം","മാഘം","ഫൽഗുനം","ശക","മു","റ","ദു","മുഹറം","സഫർ","റബീഹുൽ അവ്വൽ","റബീഹുൽ ആഖിർ","ജമാദുൽ അവ്വൽ","ജമാദുൽ ആഖിർ","റജബ്","ശഹബാൻ","റമളാൻ","ശവ്വാൽ","ദുൽ ഖഹദ്","ദുൽ ഹിജ്ജ","ഹിജറ","സംഖ്യയല്ല","dd E","E, G y MMM d","E MMM d","E, y MMM d","y 'оны' QQQQ","EEEE, y 'оны' MM 'сарын' d","y 'оны' MM 'сарын' d","1-р сар","2-р сар","3-р сар","4-р сар","5-р сар","6-р сар","7-р сар","8-р сар","9-р сар","10-р сар","11-р сар","12-р сар","Нэгдүгээр сар","Хоёрдугаар сар","Гуравдугаар сар","Дөрөвдүгээр сар","Тавдугаар сар","Зургадугаар сар","Долдугаар сар","Наймдугаар сар","Есдүгээр сар","Аравдугаар сар","Арван нэгдүгээр сар","Арван хоёрдугаар сар","Ня","Да","Мя","Лх","Пү","Ба","Бя","ням","даваа","мягмар","лхагва","пүрэв","баасан","бямба","ҮӨ","ҮХ","МЭӨ","МЭ","НТӨ","НТ","м.э.ө","м.э.","манай эриний өмнөх","манай эриний","₮","{1} रोजी {0}","E, d, MMM y","जा","ऑ","नो","डि","जाने","फेब्रु","एप्रि","ऑग","सप्टें","ऑक्टो","नोव्हें","डिसें","ऑगस्ट","सप्टेंबर","ऑक्टोबर","मंगळवार","म.उ.","इ. स. पू.","इ. स.","ईसापूर्व युग","ख्रि. यु.","ईसवीसनपूर्व","ईसवीसन","ख्रिस्तयुग","deva","Ogo","Ogos","Disember","Ahd","Isn","Kha","Ahad","Isnin","Khamis","Jumaat","PG","PTG","Jn","Fb","Ap","Jl","Og","Sp","Nv","Ds","S.M.","TM","EEEE, d 'ta'’ MMMM y","d 'ta'’ MMMM y","Ġ","Fra","Mej","Ġun","Lul","Aww","Ott","Diċ","Jannar","Frar","Marzu","Mejju","Ġunju","Lulju","Awwissu","Settembru","Ottubru","Novembru","Diċembru","Ħ","Ħad","Tne","Tli","Erb","Ħam","Ġim","Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt","QK","WK","QEK","Qabel Kristu","Wara Kristu","FLO","CLA","CKI","FMF","MAD","MBI","MLI","MAM","FDE","FMU","FGW","FYU","Fĩi Loo","Cokcwaklaŋne","Cokcwaklii","Fĩi Marfoo","Madǝǝuutǝbijaŋ","Mamǝŋgwãafahbii","Mamǝŋgwãalii","Madǝmbii","Fĩi Dǝɓlii","Fĩi Mundaŋ","Fĩi Gwahlle","Fĩi Yuru","Cya","Cla","Czi","Cko","Cka","Cga","Cze","Com’yakke","Comlaaɗii","Comzyiiɗii","Comkolle","Comkaldǝɓlii","Comgaisuu","Comzyeɓsuu","comme","lilli","PK","KǝPel Kristu","Pel Kristu","{1}မှာ {0}","E၊ d","E၊ G d MMM y","E၊ d/M","E၊ d MMM","E၊ d MMMM","E၊ d-M-y","E၊ d MMM y","EEEE၊ dd MMMM y","ဇ","ဖ","မ","ဧ","ဩ","စ","အ","န","ဒ","ဇန်","ဖေ","မတ်","ဧပြီ","မေ","ဇွန်","ဇူ","စက်","အောက်","နို","ဒီ","ဇန်နဝါရီ","ဖေဖော်ဝါရီ","ဇူလိုင်","ဩဂုတ်","စက်တင်ဘာ","အောက်တိုဘာ","နိုဝင်ဘာ","ဒီဇင်ဘာ","တ","ဗ","က","သ","တနင်္ဂနွေ","တနင်္လာ","အင်္ဂါ","ဗုဒ္ဓဟူး","ကြာသပတေး","သောကြာ","စနေ","နံနက်","ညနေ","ဘီစီ","အေဒီ","ဘီစီအီး","စီအီး","ခရစ်တော် မပေါ်မီကာလ","ခရစ်တော် ပေါ်ထွန်းပြီးကာလ","mymr","ဂဏန်းမဟုတ်သော","စီအာစီ","ژانویه","فوریه","مه","ژوئیه","پ.م","پ.م.","قبل میلاد","بعد میلاد","قبل میلادی تقویم","ǃKhanni","ǃKhanǀgôab","ǀKhuuǁkhâb","ǃHôaǂkhaib","ǃKhaitsâb","Gamaǀaeb","ǂKhoesaob","Aoǁkhuumûǁkhâb","Taraǀkhuumûǁkhâb","ǂNûǁnâiseb","ǀHooǂgaeb","Hôasoreǁkhâb","Son","Wu","Do","Fr","Sontaxtsees","Mantaxtsees","Denstaxtsees","Wunstaxtsees","Dondertaxtsees","Fraitaxtsees","Satertaxtsees","ǁgoagas","ǃuias","Xristub aiǃâ","Xristub khaoǃgâ","E d.M","E d.MM.y","tout","baba","hator","kiahk","toba","amshir","baramhat","baramouda","bashans","paona","epep","mesra","nasie","TA0","TA1","0. t.a.","1. t.a.","0. tidsalder","1. tidsalder","meskerem","tekemt","hedar","tahsas","yekatit","megabit","miazia","genbot","sene","hamle","nehasse","pagumen","fvt.","vt.","evt.","før Kristus","etter Kristus","før vår tidsregning","etter vår tidsregning","tishri","heshvan","kislev","tevet","shevat","adar I","adar","nisan","iyar","sivan","tamuz","av","elul","adar II","chaitra","vaisakha","jyaistha","asadha","sravana","bhadra","asvina","kartika","agrahayana","pausa","magha","phalguna","saka","muh.","rab. I","rab. II","jum. I","jum. II","sha.","shaw.","dhuʻl-q.","dhuʻl-h.","rabiʻ I","rabiʻ II","jumada I","jumada II","shaʻban","shawwal","dhuʻl-qiʻdah","dhuʻl-hijjah","farvardin","ordibehesht","khordad","tir","mordad","shahrivar","mehr","aban","azar","dey","bahman","esfand","Zib","Nhlo","Mbi","Mab","Nkw","Nhla","Ntu","Ncw","Mpan","Lwe","Mpal","Zibandlela","Nhlolanja","Mbimbitho","Mabasa","Nkwenkwezi","Nhlangula","Ntulikazi","Ncwabakazi","Mpandula","Mfumfu","Lwezi","Mpalakazi","Mvu","Sin","Sih","Mgq","Sonto","Mvulo","Sibili","Sithathu","Sine","Sihlanu","Mgqibelo","UKristo angakabuyi","Ukristo ebuyile","१","२","३","४","५","६","७","८","९","१०","११","१२","फेब्रुअरी","अप्रिल","अगस्ट","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर","आइत","मङ्गल","बिही","आइतबार","सोमबार","मङ्गलबार","बुधबार","बिहिबार","शुक्रबार","शनिबार","ईसा पूर्व","सन्","इस्वीपूर्व","सिइ","जेठ","असार","साउन","भदौ","असोज","कात्तिक","मङसिर","पुस","चैत","नेरू","mei","zo","do","vr","za","zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag","mnd 1","mnd 2","mnd 3","mnd 4","mnd 5","mnd 6","mnd 7","mnd 8","mnd 9","mnd 10","mnd 11","mnd 12","maand 1","maand 2","maand 3","maand 4","maand 5","maand 6","maand 7","maand 8","maand 9","maand 10","maand 11","maand 12","vgj","v.Chr.","n.Chr.","vóór gewone jaartelling","gewone jaartelling","voor R.O.C.","ng1","ng2","ng3","ng4","ng5","ng6","ng7","ng8","ng9","ng10","ng11","kris","ngwɛn matáhra","ngwɛn ńmba","ngwɛn ńlal","ngwɛn ńna","ngwɛn ńtan","ngwɛn ńtuó","ngwɛn hɛmbuɛrí","ngwɛn lɔmbi","ngwɛn rɛbvuâ","ngwɛn wum","ngwɛn wum navǔr","krísimin","mbs","sas","mɔ́ndɔ","sɔ́ndɔ mafú mába","sɔ́ndɔ mafú málal","sɔ́ndɔ mafú mána","mabágá má sukul","sásadi","maná","kugú","BL","PB","Bó Lahlɛ̄","Pfiɛ Burī","M y","'kl'. HH:mm:ss zzzz","sø.","må.","ty.","on.","to.","fr.","la.","måndag","tysdag","laurdag","formiddag","ettermiddag","{1},{0}","E , 'lyɛ'̌ʼ d 'na' M, y","'lyɛ'̌ʼ d 'na' MMMM, y","E , 'lyɛ'̌ʼ d 'na' MMM, y","EEEE , 'lyɛ'̌ʼ d 'na' MMMM, y","saŋ tsetsɛ̀ɛ lùm","saŋ kàg ngwóŋ","saŋ lepyè shúm","saŋ cÿó","saŋ tsɛ̀ɛ cÿó","saŋ njÿoláʼ","saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ","saŋ mbʉ̀ŋ","saŋ ngwɔ̀ʼ mbÿɛ","saŋ tàŋa tsetsáʼ","saŋ mejwoŋó","saŋ lùm","lyɛʼɛ́ sẅíŋtè","mvfò lyɛ̌ʼ","mbɔ́ɔntè mvfò lyɛ̌ʼ","tsètsɛ̀ɛ lyɛ̌ʼ","mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ","mvfò màga lyɛ̌ʼ","màga lyɛ̌ʼ","mbaʼámbaʼ","ncwònzém","m.z.Y.","m.g.n.Y.","mé zyé Yěsô","mé gÿo ńzyé Yěsô","E، d-M","E، d/M/y","E، d MMM y","zzzz h:mm:ss a","z h:mm:ss a","Tiop","Pɛt","Duɔ̱ɔ̱","Guak","Duä","Kor","Pay","Thoo","Tɛɛ","Laa","Kur","Tid","Tiop thar pɛt","Duɔ̱ɔ̱ŋ","Duät","Kornyoot","Pay yie̱tni","Tho̱o̱r","Tɛɛr","Laath","Tio̱p in di̱i̱t","Ŋ","Cäŋ","Jiec","Rɛw","Diɔ̱k","Ŋuaan","Dhieec","Bäkɛl","Cäŋ kuɔth","Jiec la̱t","Rɛw lätni","Diɔ̱k lätni","Ŋuaan lätni","Dhieec lätni","Bäkɛl lätni","RW","TŊ","ƐY","A ka̱n Yecu ni dap","Ɛ ca Yecu dap","dd MMMM","Ama","Gur","Bit","Elb","Cam","Wax","Ado","Hag","Ful","Onk","Mud","Amajjii","Guraandhala","Bitooteessa","Elba","Caamsa","Waxabajjii","Adooleessa","Hagayya","Fuulbana","Onkololeessa","Sadaasa","Muddee","Dil","Wix","Qib","Rob","Dilbata","Wiixata","Qibxata","Roobii","Kamiisa","Jimaata","Sanbata","WD","WB","KD","KB","Br","d-M-yy","ଜା","ଫେ","ମା","ଅ","ମଇ","ଜୁ","ସେ","ନ","ଡି","ଜାନୁଆରୀ","ଫେବୃଆରୀ","ମାର୍ଚ୍ଚ","ଅପ୍ରେଲ","ଜୁନ","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","ଡିସେମ୍ବର","ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ","ରବି","ସୋମ","ମଙ୍ଗଳ","ବୁଧ","ଗୁରୁ","ଶୁକ୍ର","ଶନି","ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର","ccc, d MMM","y-'ӕм' 'азы' QQQ","y-'ӕм' 'азы' QQQQ","EEEE, d MMMM, y 'аз'","d MMMM, y 'аз'","dd MMM y 'аз'","майы","июны","июлы","январы","февралы","мартъийы","апрелы","августы","сентябры","октябры","ноябры","декабры","Х","К","Ӕ","Ц","хцб","крс","дцг","ӕрт","цпр","мрб","сбт","хуыцаубон","къуырисӕр","дыццӕг","ӕртыццӕг","цыппӕрӕм","майрӕмбон","сабат","ӕмбисбоны размӕ","ӕмбисбоны фӕстӕ","н.д.а.","н.д.","НН","E d MMM, G y","E, dd-MM.","ਜ","ਫ਼","ਮਾ","ਅ","ਮ","ਜੂ","ਜੁ","ਸ","ਨ","ਦ","ਜਨ","ਫ਼ਰ","ਮਾਰਚ","ਅਪ੍ਰੈ","ਮਈ","ਜੂਨ","ਜੁਲਾ","ਅਗ","ਸਤੰ","ਅਕਤੂ","ਨਵੰ","ਦਸੰ","ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਅਪ੍ਰੈਲ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ","ਐ","ਸੋ","ਮੰ","ਬੁੱ","ਵੀ","ਸ਼ੁੱ","ਸ਼","ਐਤ","ਸੋਮ","ਮੰਗਲ","ਬੁੱਧ","ਵੀਰ","ਸ਼ੁੱਕਰ","ਸ਼ਨਿੱਚਰ","ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ","ਪੂ.ਦੁ.","ਬਾ.ਦੁ.","ਈ. ਪੂ.","ਸੰਨ","ਈ. ਪੂ. ਸੰ.","ਈ. ਸੰ.","ਈਸਵੀ ਪੂਰਵ","ਈਸਵੀ ਸੰਨ","ਈਸਵੀ ਪੂਰਵ ਯੁੱਗ","ਈਸਵੀ ਯੁੱਗ","੧","੨","੩","੪","੫","੬","੭","੮","੯","੧੦","੧੧","੧੨","ਚੇਤ","ਵੈਸਾਖ","ਜੇਠ","ਹਾੜ","ਸਾਉਣ","ਭਾਦੋਂ","ਅੱਸੂ","ਕੱਤਕ","ਮੱਘਰ","ਪੋਹ","ਮਾਘ","ਫੱਗਣ","ਸਾਕਾ","فروری","مئ","جولائی","اتوار","پیر","منگل","بُدھ","جمعرات","جمعہ","ہفتہ","ايساپورو","سں","d.MM.y G","d MMMM y G","E, d MMMM y G","d.MM.y","E, d.MM.y","E, d MMMM y","sty","lut","kwi","cze","sie","wrz","paź","gru","stycznia","lutego","marca","kwietnia","czerwca","lipca","sierpnia","września","października","grudnia","Ś","niedz.","pon.","wt.","śr.","czw.","pt.","sob.","niedziela","poniedziałek","wtorek","środa","czwartek","piątek","p.n.e.","Tiszri","Cheszwan","Kislew","Tewet","Szwat","Siwan","Aw","Dżu. I","Dżu. II","Ra.","Sza.","Szaw.","Zu al-k.","Zu al-h.","Dżumada I","Dżumada II","Radżab","Szaban","Szawwal","Zu al-kada","Zu al-hidżdża","Farwardin","Ordibeheszt","Chordād","Mordād","Szahriwar","Ābān","Āsar","Déi","Przed ROC","ROC","EEEE د y د MMMM d","د y د MMMM d","جنوري","فبروري","اګست","غ.م.","غ.و.","وری","غویی","غبرگولی","چنگاښ","زمری","وږی","تله","لړم","لیندۍ","مرغومی","سلواغه","کب","E, d 'de' MMMM 'de' y","dez","janeiro","fevereiro","março","junho","julho","dezembro","seg","qua","qui","sex","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","Mês 1","Mês 2","Mês 3","Mês 4","Mês 5","Mês 6","Mês 7","Mês 8","Mês 9","Mês 10","Mês 11","Mês 12","depois de Cristo","antes da Era Comum","Era Comum","Antes de R.O.C.","Esc.","{1} 'às' {0}","E, d/MM","ccc, d 'de' MMMM","E, d/MM/y","EEEE, d/MM/y","ccc, d 'de' MMMM 'de' y","segunda","terça","quarta","quinta","sexta","da manhã","da tarde","M2","M4","M5","M6","M7","M8","M9","a.E.C.","E.C.","​PTE","Db","Qul","Hat","Pau","Ayr","Aym","Int","Ant","Qha","Uma","Aya","Kap","Qulla puquy","Hatun puquy","Pauqar waray","Ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarqʼa","Kapaq Raymi","Dom","Mié","Jue","Vie","Domingo","Miércoles","Jueves","Viernes","Sábado","EEEE, 'ils' d 'da' MMMM y","d 'da' MMMM y","schan.","favr.","matg","zercl.","fan.","avust","sett.","schaner","favrer","avrigl","zercladur","fanadur","settember","october","du","gli","gie","dumengia","glindesdi","mesemna","gievgia","venderdi","sonda","sm","av. Cr.","s. Cr.","avant Cristus","suenter Cristus","Mut.","Gas.","Wer.","Mat.","Gic.","Kam.","Nya.","Kan.","Nze.","Ukw.","Ugu.","Uku.","Nzero","Ruhuhuma","Ntwarante","Ndamukiza","Rusama","Ruheshi","Mukakaro","Nyandagaro","Nyakanga","Gitugutu","Munyonyo","Kigarama","cu.","mbe.","kab.","gtu.","kan.","gnu.","gnd.","Ku w’indwi","Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Z.MU.","Z.MW.","Mb.Y.","Ny.Y","Mbere ya Yezu","Nyuma ya Yezu","ian.","iun.","iul.","ianuarie","februarie","martie","aprilie","iunie","iulie","septembrie","octombrie","noiembrie","decembrie","dum.","mie.","vin.","sâm.","duminică","luni","marți","miercuri","vineri","sâmbătă","e.b.","era budistă","î.Hr.","d.Hr.","î.e.n","e.n.","înainte de Hristos","după Hristos","înaintea erei noastre","era noastră","Tișrei","Heșvan","Șevat","Tammuz","Mi","Dum","Mie","Joi","Vin","Sâm","î.e.n.","Mweri wa kwanza","Mweri wa kaili","Mweri wa katatu","Mweri wa kaana","Mweri wa tanu","Mweri wa sita","Mweri wa saba","Mweri wa nane","Mweri wa tisa","Mweri wa ikumi","Mweri wa ikumi na moja","Mweri wa ikumi na mbili","Ijp","Ijt","Ijn","Ijtn","Ijumapili","Ijumatatu","Ijumanne","Ijumatano","Ijumamosi","kang’ama","kingoto","Kabla ya Mayesu","Baada ya Mayesu","ccc, d","d MMM y 'г'. G","E, d MMM y 'г'. G","ccc, d.MM.y 'г'.","LLL y 'г'.","LLLL y 'г'.","февр.","сент.","нояб.","января","февраля","марта","апреля","июня","июля","августа","сентября","октября","ноября","декабря","вс","воскресенье","понедельник","четверг","пятница","суббота","ДП","ПП","Тот","Бабэ","Хатур","Кихак","Тубэ","Бармуда","Башнас","Бауна","Абиб","Мисра","Якатит","Магабит","Миазия","Сэнэ","Хамлэ","Нахасэ","Эпагомен","до н.э.","до н. э.","н. э.","до Рождества Христова","от Рождества Христова","до нашей эры","нашей эры","Тишрей","Ияр","Таммуз","Элул","Чайтра","Ваисакха","Джанштха","Асадха","Бхадра","Азвина","Аграхайана","Магха","Пхалгуна","Мухаррам","Раби-уль-авваль","Раби-уль-ахир","Джумад-уль-авваль","Джумад-уль-ахир","Раджаб","Шаабан","Шавваль","Зуль-Каада","Зуль-Хиджжа","Эпоха Тайка (645–650)","Эпоха Хакути (650–671)","Эпоха Хакухо (672–686)","Эпоха Сючё (686–701)","Эпоха Тайхо (701–704)","Эпоха Кёюн (704–708)","Эпоха Вадо (708–715)","Эпоха Рэйки (715–717)","Эпоха Ёро (717–724)","Эпоха Дзинки (724–729)","Эпоха Темпьё (729–749)","Эпоха Темпьё (749–749)","Эпоха Темпьё-Сьохо (749-757)","Эпоха Темпьё-Ходзи (757-765)","Эпоха Темпьё-Ходзи (765-767)","Эпоха Джинго-Кёюн (767-770)","Эпоха Хоки (770–780)","Эпоха Теньё (781–782)","Эпоха Енряку (782–806)","Эпоха Дайдо (806–810)","Эпоха Конин (810–824)","Эпоха Тентьо (824–834)","Эпоха Шова (834–848)","Эпоха Кайо (848–851)","Эпоха Ниндзю (851–854)","Эпоха Сайко (854–857)","Эпоха Теннан (857–859)","Эпоха Йоган (859–877)","Эпоха Генкей (877–885)","Эпоха Нинна (885–889)","Эпоха Кампьё (889–898)","Эпоха Сьотай (898–901)","Эпоха Энги (901–923)","Эпоха Ентьо (923–931)","Эпоха Сьёхэй (931–938)","Эпоха Тенгьо (938–947)","Эпоха Тенрияку (947–957)","Эпоха Тентоку (957–961)","Эпоха Ова (961–964)","Эпоха Кохо (964–968)","Эпоха Анна (968–970)","Эпоха Тенроку (970–973)","Эпоха Теньен (973–976)","Эпоха Дзьоген (976–978)","Эпоха Тенген (978–983)","Эпоха Ейкан (983–985)","Эпоха Канна (985–987)","Эпоха Ейен (987–989)","Эпоха Ейсо (989–990)","Эпоха Сёряку (990–995)","Эпоха Тётоку (995–999)","Эпоха Тёхо (999–1004)","Эпоха Канко (1004–1012)","Эпоха Тёва (1012–1017)","Эпоха Каннин (1017–1021)","Эпоха Дзиан (1021–1024)","Эпоха Мандзю (1024–1028)","Эпоха Тёгэн (1028–1037)","Эпоха Тёряку (1037–1040)","Эпоха Тёкю (1040–1044)","Эпоха Катоку (1044–1046)","Эпоха Эйсо (1046–1053)","Эпоха Тэнги (1053–1058)","Эпоха Кохэй (1058–1065)","Эпоха Дзиряку (1065–1069)","Эпоха Энкю (1069–1074)","Эпоха Сёхо (1074–1077)","Эпоха Сёряку (1077–1081)","Эпоха Эйхо (1081–1084)","Эпоха Отоку (1084–1087)","Эпоха Кандзи (1087–1094)","Эпоха Кахо (1094–1096)","Эпоха Эйтё (1096–1097)","Эпоха Сётоку (1097–1099)","Эпоха Кова (1099–1104)","Эпоха Тёдзи (1104–1106)","Эпоха Касё (1106–1108)","Эпоха Тэннин (1108–1110)","Эпоха Тэнъэй (1110–1113)","Эпоха Эйкю (1113–1118)","Эпоха Гэнъэй (1118–1120)","Эпоха Хоан (1120–1124)","Эпоха Тэндзи (1124–1126)","Эпоха Дайдзи (1126–1131)","Эпоха Тэнсё (1131–1132)","Эпоха Тёсё (1132–1135)","Эпоха Хоэн (1135–1141)","Эпоха Эйдзи (1141–1142)","Эпоха Кодзи (1142–1144)","Эпоха Тэнё (1144–1145)","Эпоха Кюан (1145–1151)","Эпоха Нимпэй (1151–1154)","Эпоха Кюдзю (1154–1156)","Эпоха Хогэн (1156–1159)","Эпоха Хэйдзи (1159–1160)","Эпоха Эйряку (1160–1161)","Эпоха Охо (1161–1163)","Эпоха Тёкан (1163–1165)","Эпоха Эйман (1165–1166)","Эпоха Нинъан (1166–1169)","Эпоха Као (1169–1171)","Эпоха Сёан (1171–1175)","Эпоха Ангэн (1175–1177)","Эпоха Дзисё (1177–1181)","Эпоха Ёва (1181–1182)","Эпоха Дзюэй (1182–1184)","Эпоха Гэнрюку (1184–1185)","Эпоха Бундзи (1185–1190)","Эпоха Кэнкю (1190–1199)","Эпоха Сёдзи (1199–1201)","Эпоха Кэннин (1201–1204)","Эпоха Гэнкю (1204–1206)","Эпоха Кэнъэй (1206–1207)","Эпоха Сёгэн (1207–1211)","Эпоха Кэнряку (1211–1213)","Эпоха Кэмпо (1213–1219)","Эпоха Сёкю (1219–1222)","Эпоха Дзёо (1222–1224)","Эпоха Гэннин (1224–1225)","Эпоха Кароку (1225–1227)","Эпоха Антэй (1227–1229)","Эпоха Канки (1229–1232)","Эпоха Дзёэй (1232–1233)","Эпоха Тэмпуку (1233–1234)","Эпоха Бунряку (1234–1235)","Эпоха Катэй (1235–1238)","Эпоха Рякунин (1238–1239)","Эпоха Энъо (1239–1240)","Эпоха Ниндзи (1240–1243)","Эпоха Кангэн (1243–1247)","Эпоха Ходзи (1247–1249)","Эпоха Кэнтё (1249–1256)","Эпоха Когэн (1256–1257)","Эпоха Сёка (1257–1259)","Эпоха Сёгэн (1259–1260)","Эпоха Бунъо (1260–1261)","Эпоха Котё (1261–1264)","Эпоха Бунъэй (1264–1275)","Эпоха Кэндзи (1275–1278)","Эпоха Коан (1278–1288)","Эпоха Сёо (1288–1293)","Эпоха Эйнин (1293–1299)","Эпоха Сёан (1299–1302)","Эпоха Кэнгэн (1302–1303)","Эпоха Кагэн (1303–1306)","Эпоха Токудзи (1306–1308)","Эпоха Энкэй (1308–1311)","Эпоха Отё (1311–1312)","Эпоха Сёва (1312–1317)","Эпоха Бумпо (1317–1319)","Эпоха Гэно (1319–1321)","Эпоха Гэнкё (1321–1324)","Эпоха Сётю (1324–1326)","Эпоха Карэки (1326–1329)","Эпоха Гэнтоку (1329–1331)","Эпоха Гэнко (1331–1334)","Эпоха Кэмму (1334–1336)","Эпоха Энгэн (1336–1340)","Эпоха Кококу (1340–1346)","Эпоха Сёхэй (1346–1370)","Эпоха Кэнтоку (1370–1372)","Эпоха Бунтю (1372–1375)","Эпоха Иэндзю (1375–1379)","Эпоха Коряку (1379–1381)","Эпоха Кова (1381–1384)","Эпоха Гэнтю (1384–1392)","Эпоха Мэйтоку (1384–1387)","Эпоха Какэй (1387–1389)","Эпоха Коо (1389–1390)","Эпоха Мэйтоку (1390–1394)","Эпоха Оэй (1394–1428)","Эпоха Сётё (1428–1429)","Эпоха Эйкё (1429–1441)","Эпоха Какицу (1441–1444)","Эпоха Банъан (1444–1449)","Эпоха Хотоку (1449–1452)","Эпоха Кётоку (1452–1455)","Эпоха Косё (1455–1457)","Эпоха Тёроку (1457–1460)","Эпоха Кансё (1460–1466)","Эпоха Бунсё (1466–1467)","Эпоха Онин (1467–1469)","Эпоха Буммэй (1469–1487)","Эпоха Тёкё (1487–1489)","Эпоха Энтоку (1489–1492)","Эпоха Мэйо (1492–1501)","Эпоха Бунки (1501–1504)","Эпоха Эйсё (1504–1521)","Эпоха Тайэй (1521–1528)","Эпоха Кёроку (1528–1532)","Эпоха Тэммон (1532–1555)","Эпоха Кодзи (1555–1558)","Эпоха Эйроку (1558–1570)","Эпоха Гэнки (1570–1573)","Эпоха Тэнсё (1573–1592)","Эпоха Бунроку (1592–1596)","Эпоха Кэйтё (1596–1615)","Эпоха Гэнва (1615–1624)","Эпоха Канъэй (1624–1644)","Эпоха Сёхо (1644–1648)","Эпоха Кэйан (1648–1652)","Эпоха Сё (1652–1655)","Эпоха Мэйряку (1655–1658)","Эпоха Мандзи (1658–1661)","Эпоха Камбун (1661–1673)","Эпоха Эмпо (1673–1681)","Эпоха Тэнва (1681–1684)","Эпоха Дзёкё (1684–1688)","Эпоха Гэнроку (1688–1704)","Эпоха Хоэй (1704–1711)","Эпоха Сётоку (1711–1716)","Эпоха Кёхо (1716–1736)","Эпоха Гэмбун (1736–1741)","Эпоха Кампо (1741–1744)","Эпоха Энкё (1744–1748)","Эпоха Канъэн (1748–1751)","Эпоха Хоряку (1751–1764)","Эпоха Мэйва (1764–1772)","Эпоха Анъэй (1772–1781)","Эпоха Тэммэй (1781–1789)","Эпоха Кансэй (1789–1801)","Эпоха Кёва (1801–1804)","Эпоха Бунка (1804–1818)","Эпоха Бунсэй (1818–1830)","Эпоха Тэмпо (1830–1844)","Эпоха Кока (1844–1848)","Эпоха Каэй (1848–1854)","Эпоха Ансэй (1854–1860)","Эпоха Манъэн (1860–1861)","Эпоха Бункю (1861–1864)","Эпоха Гендзи (1864–1865)","Эпоха Кейо (1865–1868)","Эпоха Мэйдзи","Эпоха Тайсьо","Сьова","Эпоха Хэйсэй","Фарвардин","Хордад","Шахривер","Азер","Дей","Эсфанд","не число","ТМТ","₴","XXXX","mut.","gas.","wer.","mat.","gic.","kam.","nya.","nze.","ukw.","ugu.","uku.","Mutarama","Gashyantare","Werurwe","Mata","Gicuransi","Kamena","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza","cyu.","Ku cyumweru","Kuwa mbere","Kuwa kabiri","Kuwa gatatu","Kuwa kane","Kuwa gatanu","Kuwa gatandatu","y 'сыл' MMMM d 'күнэ', EEEE","yy/M/d","Ы","Тохс","Олун","Клн_ттр","Мус_уст","Ыам_йн","Бэс_йн","От_йн","Атрдь_йн","Блҕн_йн","Алт","Сэт","Ахс","Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйын","Бэс ыйын","От ыйын","Атырдьых ыйын","Балаҕан ыйын","Алтынньы","Сэтинньи","Ахсынньы","Ч","Бн","Оп","Сэ","Чп","Бэ","Баскыһыанньа","Бэнидиэлинньик","Оптуорунньук","Сэрэдэ","Чэппиэр","Бээтиҥсэ","Субуота","ЭИ","ЭК","б. э. и.","б. э","Obo","Waa","Oku","Ong","Ime","Ile","Sap","Isi","Saa","Tom","Tob","Tow","Lapa le obo","Lapa le waare","Lapa le okuni","Lapa le ong’wan","Lapa le imet","Lapa le ile","Lapa le sapa","Lapa le isiet","Lapa le saal","Lapa le tomon","Lapa le tomon obo","Lapa le tomon waare","Are","Kun","Mderot ee are","Mderot ee kuni","Mderot ee ong’wan","Mderot ee inet","Mderot ee ile","Mderot ee sapa","Mderot ee kwe","Tesiran","Teipa","Kabla ya Christo","Baada ya Christo","MMM d y","Mup","Mwi","Msh","Mun","Mag","Muj","Msp","Mpg","Mye","Mok","Mus","Muh","Mupalangulwa","Mwitope","Mushende","Munyi","Mushende Magali","Mujimbi","Mushipepo","Mupuguto","Munyense","Mokhu","Musongandembwe","Muhaano","Mulungu","Alahamisi","Lwamilawu","Pashamihe","Ashanali uKilisito","Pamwandi ya Kilisto","ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov","ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu","sotn","vuos","maŋ","gask","duor","bear","láv","sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorasdat","bearjadat","lávvardat","iđitbeaivet","eahketbeaivet","o.Kr.","m.Kr.","ovdal Kristtusa","maŋŋel Kristtusa","Dkr","Skr","Nkr","Janeiro","Fevreiro","Marco","Maio","Junho","Julho","Augusto","Setembro","Otubro","Novembro","Decembro","Pos","Pir","Nai","Sha","Dimingu","Chiposi","Chipiri","Chitatu","Chinai","Chishanu","Sabudu","AC","Antes de Cristo","Nye","Mbä","Bêl","Fön","Len","Kük","Ngb","Nab","Kak","Nyenye","Fulundïgi","Mbängü","Ngubùe","Bêläwü","Föndo","Lengua","Kükürü","Mvuka","Ngberere","Nabändüru","Kakauka","Bk1","Bk2","Bk3","Bk4","Bk5","Lâp","Lây","Bikua-ôko","Bïkua-ûse","Bïkua-ptâ","Bïkua-usïö","Bïkua-okü","Lâpôsö","Lâyenga","LK","KnK","NpK","Kôzo na Krîstu","Na pekô tî Krîstu","ⵉ","ⴱ","ⵎ","ⵢ","ⵖ","ⵛ","ⴽ","ⵏ","ⴷ","ⵉⵏⵏ","ⴱⵕⴰ","ⵎⴰⵕ","ⵉⴱⵔ","ⵎⴰⵢ","ⵢⵓⵏ","ⵢⵓⵍ","ⵖⵓⵛ","ⵛⵓⵜ","ⴽⵜⵓ","ⵏⵓⵡ","ⴷⵓⵊ","ⵉⵏⵏⴰⵢⵔ","ⴱⵕⴰⵢⵕ","ⵎⴰⵕⵚ","ⵉⴱⵔⵉⵔ","ⵎⴰⵢⵢⵓ","ⵢⵓⵏⵢⵓ","ⵢⵓⵍⵢⵓⵣ","ⵖⵓⵛⵜ","ⵛⵓⵜⴰⵏⴱⵉⵔ","ⴽⵜⵓⴱⵔ","ⵏⵓⵡⴰⵏⴱⵉⵔ","ⴷⵓⵊⴰⵏⴱⵉⵔ","ⴰⵙⴰ","ⴰⵢⵏ","ⴰⵙⵉ","ⴰⴽⵕ","ⴰⴽⵡ","ⴰⵙⵉⵎ","ⴰⵙⵉⴹ","ⴰⵙⴰⵎⴰⵙ","ⴰⵢⵏⴰⵙ","ⴰⵙⵉⵏⴰⵙ","ⴰⴽⵕⴰⵙ","ⴰⴽⵡⴰⵙ","ⵙⵉⵎⵡⴰⵙ","ⴰⵙⵉⴹⵢⴰⵙ","ⵜⵉⴼⴰⵡⵜ","ⵜⴰⴷⴳⴳⵯⴰⵜ","ⴷⴰⵄ","ⴷⴼⵄ","ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ","ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ","i","ɣ","inn","bṛa","maṛ","ibr","ɣuc","cut","ktu","nuw","duj","innayr","bṛayṛ","maṛṣ","ibrir","mayyu","yunyu","yulyuz","ɣuct","cutanbir","ktubr","nuwanbir","dujanbir","asa","ayn","asi","akṛ","akw","asim","asiḍ","asamas","aynas","asinas","akṛas","akwas","asimwas","asiḍyas","tifawt","tadggʷat","daɛ","dfɛ","dat n ɛisa","dffir n ɛisa","E a h.mm","E a h.mm.ss","a h.mm","a h.mm.ss","M-d, E","MMM d E","y-M-d, E","ජ","පෙ","මා","අ","මැ","ජූ","සැ","ඔ","නෙ","දෙ","ජන","පෙබ","මාර්තු","අප්‍රේල්","මැයි","ජූනි","ජූලි","අගෝ","සැප්","ඔක්","නොවැ","දෙසැ","ජනවාරි","පෙබරවාරි","අගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්","ඉ","ස","බ","බ්‍ර","සි","සෙ","ඉරිදා","සඳුදා","අඟහ","බදාදා","බ්‍රහස්","සිකු","සෙන","අඟහරුවාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා","පෙ.ව.","ප.ව.","ක්‍රි.පූ.","ක්‍රි.ව.","පොපෙ","පො.යු","ක්‍රිස්තු පූර්ව","ක්‍රිස්තු වර්ෂ","පොදු යුගයට පෙර","පොදු යුගය","රු.","සිෆ්එ","E, d. M. y G","máj","jún","júl","januára","februára","apríla","mája","júna","júla","augusta","októbra","novembra","ut","pi","nedeľa","pondelok","utorok","streda","štvrtok","piatok","pred Kr.","pred n. l.","pred Kristom","po Kristovi","pred naším letopočtom","nášho letopočtu","NIS","E, d. M.","E, d. M. y","EEEE, dd. MMMM y","dd. MMMM y","d. MM. yy","avg.","marec","junij","julij","avgust","č","ned.","sre.","čet.","pet.","nedelja","ponedeljek","torek","sreda","četrtek","petek","pop.","po n. št.","pr. n. št.","n. št.","pred Kristusom","naše štetje","pred našim štetjem","pa","vu","ko","tu","vá","lá","pasepeeivi","vuossaargâ","majebaargâ","koskoho","tuorâstuv","vástuppeeivi","lávurduv","epiloho","Ndi","Kuk","Kub","Chv","Chk","Chg","Gun","Gum","Mb","Zvi","Ndira","Kukadzi","Kurume","Kubvumbi","Chivabvu","Chikumi","Chikunguru","Nyamavhuvhu","Gunyana","Gumiguru","Mbudzi","Zvita","Svo","Muv","Chip","Chit","Chin","Chis","Svondo","Muvhuro","China","Mugovera","Kristo asati auya","Kristo ashaya","EEEE, MMMM dd, y","Kob","Lab","Afr","Lix","Tod","Sid","Sag","KIT","LIT","Bisha Koobaad","Bisha Labaad","Bisha Saddexaad","Bisha Afraad","Bisha Shanaad","Bisha Lixaad","Bisha Todobaad","Bisha Sideedaad","Bisha Sagaalaad","Bisha Tobnaad","Bisha Kow iyo Tobnaad","Bisha Laba iyo Tobnaad","Axd","Arb","Axad","Isniin","Talaado","Arbaco","Khamiis","Jimco","Sabti","sn.","gn.","CK","CD","Ciise ka hor (CS)","Ciise ka dib (CS)","{1} 'në' {0}","h:mm:ss a, v","HH:mm:ss, v","h:mm a, v","HH:mm, v","h:mm:ss a, zzzz","h:mm:ss a, z","Shk","Pri","Maj","Qer","Gsh","Sht","Tet","Nën","Dhj","janar","shkurt","prill","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor","Die","Hën","Mër","Enj","Pre","e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë","e paradites","e pasdites","p.e.r.","e.r.","p.e.s.","e.s.","para erës së re","erës së re","para erës sonë","erës sonë","Lekë","den","E, h.mm a","E, HH.mm","E, h.mm.ss a","E, HH.mm.ss","dd.MMM","M.y.","MMMM y.","QQQ. y","QQQQ. y","сре","по подне","пре нове ере","нове ере","[BGN]","[BYR]","avg","sre","ponedeljak","pre podne","po podne","Taut","Amšir","Baramuda","Bašans","Jekatit","Nehase","pre nove ere","nove ere","Tišri","Hešvan","Ševat","Čaitra","Vaisaka","Jiaista","Asada","Badra","Argajana","Pauza","Maga","Falguna","Muraham","Rađab","Šaʻban","Šaval","Duʻl-Kiʻda","Duʻl-hiđa","Tempio-kampo (749-749)","Tempio-šoho (749-757)","Tempio-hođi (757-765)","Tempo-đingo (765-767)","Đingo-keiun (767-770)","Ten-o (781-782)","Enđi (901–923)","Đian (1021–1024)","Tenđi (1053–1058)","Đirjaku (1065–1069)","Eišo (1081–1084)","Kanđi (1087–1094)","Čođi (1104–1106)","Đen-ei (1118-1120)","Tenđi (1124–1126)","Daiđi (1126–1131)","Čošao (1132–1135)","Eiđi (1141–1142)","Kođi (1142–1144)","Heiđi (1159–1160)","Đišo (1177–1181)","Đuei (1182–1184)","Bunđi (1185–1190)","Šođi (1199–1201)","Đu (1222–1224)","Đenin (1224–1225)","Đoei (1232–1233)","En-o (1239-1240)","Hođi (1247–1249)","Bun-o (1260-1261)","Kenđi (1275–1278)","Tokuđi (1306–1308)","Đeno (1319–1321)","Đenkjo (1321–1324)","Buču (1372–1375)","Kođi (1555–1558)","Jokjo (1684–1688)","Genđi (1864–1865)","Meiđi","Haisei","Faravadin","Ordibehešt","Kordad","Šahrivar","Dej","Pre RK","RK","augusti","sön","mån","tis","ons","tors","fre","lör","söndag","tisdag","lördag","fm","em","bâbâ","hâtour","toubah","amshîr","barmahât","barmoudah","ba’ounah","abîb","misra","al-nasi","mäskäräm","teqemt","tahesas","yäkatit","mägabit","miyazya","guenbot","säné","hamlé","nähasé","pagumén","före Kristus","efter Kristus","före västerländsk tideräkning","västerländsk tideräkning","tishrí","heshván","kislév","tevét","shevát","adár I","adár","nisán","ijjár","siván","tammúz","ab","elúl","adár II","vaishākh","jyaishtha","āshādha","shrāvana","bhādrapad","āshwin","kārtik","mārgashīrsha","paush","māgh","phālgun","Saka-eran","jumada-l-ula","jumada-l-akhira","sha’ban","dhu-l-ga’da","dhu-l-hijja","Tempyō-kampō (749–749)","Tempyō-shōhō (749–757)","Tempyō-hōji (757–765)","Temphō-jingo (765–767)","Jingo-keiun (767–770)","Ten-ō (781–782)","En-ō (1239–1240)","Bun-ō (1260–1261)","khordād","mordād","ābān","āzar","före R.K.","R.K.","Bds$","BM$","BR$","BS$","BZ$","Ekr","EG£","Ikr","JM$","mkw","mpi","mtu","msb","mun","mts","mku","mkm","mkb","mwezi ya kwanja","mwezi ya pili","mwezi ya tatu","mwezi ya ine","mwezi ya tanu","mwezi ya sita","mwezi ya saba","mwezi ya munane","mwezi ya tisa","mwezi ya kumi","mwezi ya kumi na moya","mwezi ya kumi ya mbili","yen","pil","tat","ine","tan","sit","siku ya yenga","siku ya kwanza","siku ya pili","siku ya tatu","siku ya ine","siku ya tanu","siku ya sita","ya asubuyi","ya muchana","{1} ’அன்று’ {0}","E a h:mm","E a h:mm:ss","a h:mm:ss zzzz","a h:mm:ss z","ஜ","பி","மா","ஏ","மே","ஜூ","ஆ","செ","அ","ந","டி","ஜன.","பிப்.","மார்.","ஏப்.","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச.","ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்","ஞா","தி","பு","வி","வெ","ச","ஞாயி.","திங்.","செவ்.","புத.","வியா.","வெள்.","சனி","ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","முற்பகல்","பிற்பகல்","மா1","மா2","மா3","மா4","மா5","மா6","மா7","மா8","மா9","மா10","மா11","மா12","மாதம்1","மாதம்2","மாதம்3","மாதம்4","மாதம்5","மாதம்6","மாதம்7","மாதம்8","மாதம்9","மாதம்10","மாதம்11","மாதம்12","கி.மு.","கி.பி.","பொ.ச.மு","பொ.ச","கிறிஸ்துவுக்கு முன்","அன்னோ டோமினி","Rs.","S$","G d, MMM y","G, E d, MMM y","d, MMM y","d, MMMM y, EEEE","జ","ఫి","మా","ఏ","మే","జూ","జు","ఆ","సె","అ","న","డి","జన","ఫిబ్ర","మార్చి","ఏప్రి","జూన్","జులై","ఆగ","సెప్టెం","అక్టో","నవం","డిసెం","జనవరి","ఫిబ్రవరి","ఏప్రిల్","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్","సో","మ","బు","గు","శు","శ","ఆది","సోమ","మంగళ","బుధ","గురు","శుక్ర","శని","ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం","[AM]","[PM]","క్రీపూ","క్రీశ","[BCE]","[CE]","క్రీస్తు పూర్వం","క్రీస్తు శకం","ప్రస్తుత శకానికి పూర్వం","ప్రస్తుత శకం","Muk","Dun","Mod","Ped","Sok","Tib","Poo","Orara","Omuk","Okwamg’","Odung’el","Omaruk","Omodok’king’ol","Ojola","Opedel","Osokosokoma","Otibar","Olabor","Opoo","Bar","Aar","Uni","Ung","Nakaejuma","Nakaebarasa","Nakaare","Nakauni","Nakaung’on","Nakakany","Nakasabiti","Taparachu","Ebongi","E HH:mm น.","d MMM G y","E d MMM G y","EEEEที่ d MMM G y","HH:mm น.","EEEEที่ d MMM","EEEEที่ d MMMM","EEEEที่ d MMM y","MMMM G y","d MMMM G y","E d MMMM G y","EEEEที่ d MMMM G y","QQQQ G y","H นาฬิกา mm นาที ss วินาที zzzz","H นาฬิกา mm นาที ss วินาที z","ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.","มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม","อา","จ","อ","พ","พฤ","ศ","ส","อา.","จ.","อ.","พ.","พฤ.","ศ.","ส.","วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์","พ.ศ.","พุทธศักราช","ก่อนเที่ยง","หลังเที่ยง","เทาท์","บาบา","ฮาเทอร์","เคียฟ","โทบา","อัมเชอร์","บารัมฮัท","บาราเมาดา","บาชันส์","พาโอนา","อีเปป","เมสรา","นาซี","เมสเคอเรม","เตเกมท","เฮดาร์","ทาฮ์ซัส","เทอร์","เยคาทิท","เมกาบิต","เมียเซีย","เจนบอต","เซเน","ฮัมเล","เนแฮซ","พากูเมน","ก่อน ค.ศ.","ค.ศ.","ก.ส.ศ.","ส.ศ.","ปีก่อน ค.ศ.","ปีก่อนคริสต์ศักราช","คริสต์ศักราช","ก่อนสามัญศักราช","สามัญศักราช","ทิชรี","เฮวาน","กีสเลฟ","เตเวต","เชวัต","อาดาร์ I","อาดาร์","นิสซาน","อิยาร์","สีวัน","ตามูซ","อัฟ","เอลอุล","อาดาร์ II","ย.ศ.","จิตรา","วิสาขา","เชษฐา","อัษฎา","ศรวณา","พัตรา","อัศวิชา","การติกา","มฤคศิรา","ปุษยา","มาฆะ","ผลคุณี","ม.ศ.","มุฮัร.","เศาะ.","รอบี I","รอบี II","จุมาดา I","จุมาดา II","เราะ.","ชะอ์.","เราะมะ.","เชาว.","ซุลกิอฺ.","ซุลหิจ.","มุฮะร์รอม","ซอฟาร์","รอจับ","ชะอะบาน","รอมะดอน","เชาวัล","ซุลกิอฺดะฮฺ","ซุลหิจญะฮฺ","ฮ.ศ.","ฮิจเราะห์ศักราช","ทะอิกะ (645–650)","ฮะกุชิ (650–671)","ฮากุโฮ (672–686)","ชุโช (686–701)","ทะอิโฮ (701–704)","เคอุง (704–708)","วะโด (708–715)","เรกิ (715–717)","โยโร (717–724)","จิงกิ (724–729)","เท็มเพียว (729–749)","เท็มเพียว-คัมโป (749-749)","เท็มเพียว-โชโฮ (749-757)","เท็มเพียว-โฮจิ (757-765)","เท็มเพียว-จิงโงะ (765-767)","จิงโงะ-เคอุง (767-770)","โฮกิ (770–780)","เท็นโอ (781–782)","เอ็นเรียะกุ (782–806)","ดะอิโด (806–810)","โคนิง (810–824)","เท็นโช (824–834)","โชวะ (834–848)","คะโจ (848–851)","นินจุ (851–854)","ซะอิโกะ (854–857)","เท็นนัง (857–859)","โจงัง (859–877)","เก็งเก (877–885)","นินนะ (885–889)","คัมเพียว (889–898)","โชตะอิ (898–901)","เอ็งงิ (901–923)","เอ็นโช (923–931)","โชเฮ (931–938)","เท็งเงียว (938–947)","เท็นเรียะกุ (947–957)","เท็นโตะกุ (957–961)","โอวะ (961–964)","โคโฮ (964–968)","อันนะ (968–970)","เท็นโระกุ (970–973)","เท็นเอ็ง (973–976)","โจเง็ง (976–978)","เท็งเง็ง (978–983)","เอกัง (983–985)","คันนะ (985–987)","เอเอ็ง (987–989)","เอโซ (989–990)","โชเรียะกุ (990–995)","โชโตะกุ (995–999)","โชโฮ (999–1004)","คันโก (1004–1012)","โชวะ (1012–1017)","คันนิง (1017–1021)","จิอัง (1021–1024)","มันจุ (1024–1028)","โชเง็ง (1028–1037)","โชเรียะกุ (1037–1040)","โชคีว (1040–1044)","คันโตะกุ (1044–1046)","เอโช (1046–1053)","เท็งงิ (1053–1058)","โคเฮ (1058–1065)","จิเรียะกุ (1065–1069)","เอ็งคีว (1069–1074)","โชโฮ (1074–1077)","โชเรียะกุ (1077–1081)","เอโฮะ (1081–1084)","โอโตะกุ (1084–1087)","คันจิ (1087–1094)","คะโฮะ (1094–1096)","เอโช (1096–1097)","โชโตะกุ (1097–1099)","โควะ (1099–1104)","โชจิ (1104–1106)","คะโช (1106–1108)","เท็นนิง (1108–1110)","เท็นเอ (1110–1113)","เอกีว (1113–1118)","เก็นเอ (1118–1120)","โฮะอัง (1120–1124)","เท็นจิ (1124–1126)","ดะอิจิ (1126–1131)","เท็นโช (1131–1132)","โชโช (1132–1135)","โฮะเอ็ง (1135–1141)","เอจิ (1141–1142)","โคจิ (1142–1144)","เท็นโย (1144–1145)","คีวอัง (1145–1151)","นิมเป (1151–1154)","คีวจุ (1154–1156)","โฮะเง็ง (1156–1159)","เฮจิ (1159–1160)","เอเรียะกุ (1160–1161)","โอโฮ (1161–1163)","โชกัง (1163–1165)","เอมัง (1165–1166)","นินอัง (1166–1169)","คะโอ (1169–1171)","โชอัง (1171–1175)","อังเง็ง (1175–1177)","จิโช (1177–1181)","โยวะ (1181–1182)","จุเอ (1182–1184)","เก็นเรียะกุ (1184–1185)","บุนจิ (1185–1190)","เค็งกีว (1190–1199)","โชจิ (1199–1201)","เค็นนิง (1201–1204)","เก็งกีว (1204–1206)","เค็นเอ (1206–1207)","โชเก็ง (1207–1211)","เค็นเรียะกุ (1211–1213)","เค็มโป (1213–1219)","โชกีว (1219–1222)","โจโอ (1222–1224)","เก็นนิง (1224–1225)","คะโระกุ (1225–1227)","อันเต (1227–1229)","คังกิ (1229–1232)","โจเอ (1232–1233)","เท็มปุกุ (1233–1234)","บุนเรียะกุ (1234–1235)","คะเต (1235–1238)","เรียะกุนิง (1238–1239)","เอ็นโอ (1239–1240)","นินจิ (1240–1243)","คังเง็ง (1243–1247)","โฮจิ (1247–1249)","เค็นโช (1249–1256)","โคเง็ง (1256–1257)","โชกะ (1257–1259)","โชเง็ง (1259–1260)","บุนโอ (1260–1261)","โคโช (1261–1264)","บุนเอ (1264–1275)","เค็นจิ (1275–1278)","โคอัง (1278–1288)","โชโอ (1288–1293)","เอนิง (1293–1299)","โชอัง (1299–1302)","เค็งเง็ง (1302–1303)","คะเง็ง (1303–1306)","โทะกุจิ (1306–1308)","เอ็งเก (1308–1311)","โอโช (1311–1312)","โชวะ (1312–1317)","บุมโป (1317–1319)","เก็นโอ (1319–1321)","เก็งเกียว (1321–1324)","โชชู (1324–1326)","คะเระกิ (1326–1329)","เก็นโตะกุ (1329–1331)","เก็งโก (1331–1334)","เค็มมุ (1334–1336)","เอ็งเง็ง (1336–1340)","โคโกะกุ (1340–1346)","โชเฮ (1346–1370)","เค็นโตะกุ (1370–1372)","บุนชู (1372–1375)","เท็นจุ (1375–1379)","โคเรียะกุ (1379–1381)","โควะ (1381–1384)","เก็นชู (1384–1392)","เมโตะกุ (1384–1387)","คะเค (1387–1389)","โคโอ (1389–1390)","เมโตะกุ (1390–1394)","โอเอ (1394–1428)","โชโช (1428–1429)","เอเกียว (1429–1441)","คะกิสึ (1441–1444)","บุนอัง (1444–1449)","โฮโตะกุ (1449–1452)","เคียวโตะกุ (1452–1455)","โคโช (1455–1457)","โชโระกุ (1457–1460)","คันโช (1460–1466)","บุนโช (1466–1467)","โอนิง (1467–1469)","บุมเม (1469–1487)","โชเกียว (1487–1489)","เอ็นโตะกุ (1489–1492)","เมโอ (1492–1501)","บุงกิ (1501–1504)","เอโช (1504–1521)","ทะอิเอ (1521–1528)","เคียวโระกุ (1528–1532)","เท็มมน (1532–1555)","โคจิ (1555–1558)","เอโระกุ (1558–1570)","เก็งกิ (1570–1573)","เท็นโช (1573–1592)","บุนโระกุ (1592–1596)","เคโช (1596–1615)","เก็งวะ (1615–1624)","คันเอ (1624–1644)","โชโฮ (1644–1648)","เคอัง (1648–1652)","โชโอ (1652–1655)","เมเรียะกุ (1655–1658)","มันจิ (1658–1661)","คัมบุง (1661–1673)","เอ็มโป (1673–1681)","เท็นวะ (1681–1684)","โจเกียว (1684–1688)","เก็นโระกุ (1688–1704)","โฮเอ (1704–1711)","โชโตะกุ (1711–1716)","เคียวโฮ (1716–1736)","เก็มบุง (1736–1741)","คัมโป (1741–1744)","เอ็งเกียว (1744–1748)","คันเอ็ง (1748–1751)","โฮเรียะกุ (1751–1764)","เมวะ (1764–1772)","อันเอ (1772–1781)","เท็มเม (1781–1789)","คันเซ (1789–1801)","เคียววะ (1801–1804)","บุงกะ (1804–1818)","บุนเซ (1818–1830)","เท็มโป (1830–1844)","โคกะ (1844–1848)","คะเอ (1848–1854)","อันเซ (1854–1860)","มันเอ็ง (1860–1861)","บุงกีว (1861–1864)","เก็นจิ (1864–1865)","เคโอ (1865–1868)","เมจิ","ทะอิโช","โชวะ","เฮเซ","ฟาร์วาร์ดิน","ออร์ดิเบเฮชต์","คอร์แดด","เตอร์","มอร์แดด","ชาหริวาร์","เมฮร์","อะบาน","อะซาร์","เดย์","บาฮ์มาน","เอสฟานด์","ปีเปอร์เซีย","ปีก่อนไต้หวัน","ไต้หวัน","EEEE፣ dd MMMM መዓልቲ y G","ኤፕረ","ኦክተ","ኤፕረል","ኦክተውበር","ሠ","ኃ","ቀ","ሰንበት","ሰኑይ","ሠሉስ","ኃሙስ","ዓርቢ","ቀዳም","ንጉሆ ሰዓተ","ድሕር ሰዓት","EEEE፡ dd MMMM መዓልቲ y G","ጥሪ","ለካቲ","መጋቢ","ሚያዝ","ግንቦ","ሰነ","ሓምለ","ነሓሰ","መስከ","ጥቅም","ሕዳር","ታሕሳ","ለካቲት","ጥቅምቲ","ታሕሳስ","ሰሉስ","ሓሙስ","d MMMM y EEEE","Ý","Ç","Ş","san däl","Sān","Fēp","Maʻa","ʻEpe","Mē","Siu","ʻAok","ʻOka","Nōv","Tīs","Sānuali","Fēpueli","Maʻasi","ʻEpeleli","Sune","Siulai","ʻAokosi","Sepitema","ʻOkatopa","Nōvema","Tīsema","Sāp","Mōn","Tūs","Pul","Tuʻa","Fal","Tok","Sāpate","Mōnite","Tūsite","Pulelulu","Tuʻapulelulu","Falaite","Tokonaki","TS","ki muʻa","taʻu ʻo Sīsū","TF","AUD$","NZD$","G dd MMM y","G d MMM y E","dd/MM E","d MMMM E","dd MMMM E","dd.MM.y E","d MMM y E","y/QQQQ","Oca","Şub","Nis","Haz","Tem","Ağu","Eyl","Eki","Ocak","Şubat","Mart","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık","Paz","Pzt","Sal","Çar","Per","Cum","Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","ÖÖ","ÖS","Tût","Bâbe","Keyhek","Tûbe","Imşir","Bermuhat","Bermude","Peyştes","Bune","Ebip","Mısrî","Nesî","Tikimt","Hidar","Yakatit","Magabit","Ginbot","Nehasa","Pagumiene","MÖ","MS","İÖ","İS","Milattan Önce","Milattan Sonra","İsa’dan Önce","İsa’dan Sonra","Tişri","Heşvan","Şevat","Veadar","İyar","Muharrem","Safer","Rebiülevvel","Rebiülahir","Cemaziyelevvel","Cemaziyelahir","Recep","Şaban","Ramazan","Şevval","Zilkade","Zilhicce","Hicri","Ferverdin","Ordibeheşt","Hordad","Şehriver","Azer","Behmen","Esfend","{percentSign}{number}","{minusSign}{percentSign}{number}","₺","Ibr","Cut","Kṭu","Nwa","Duj","Yebrayer","Ibrir","Yulyuz","Cutanbir","Kṭuber","Nwanbir","Dujanbir","Asa","Ayn","Asn","Akr","Akw","Asm","Asḍ","Asamas","Aynas","Asinas","Akras","Akwas","Asimwas","Asiḍyas","Zdat azal","Ḍeffir aza","ZƐ","ḌƐ","Zdat Ɛisa (TAƔ)","Ḍeffir Ɛisa (TAƔ)","{1}، {0}","MMM d، y G","E، MMM d، y G","E، M/d","E، MMM d","E، M/d/y","MMM d، y","E، MMM d، y","EEEE، MMMM d، y","MMMM d، y","يانۋار","فېۋرال","مارت","ئاپرېل","ئىيۇن","ئىيۇل","ئاۋغۇست","سېنتەبىر","ئۆكتەبىر","نويابىر","دېكابىر","بويابىر","يە","دۈ","سە","چا","پە","چۈ","شە","يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە","بۇددا يىلنامەسى","چۈشتىن بۇرۇن","چۈشتىن كېيىن","مىلادىيە","مىلادىيەدىن بۇرۇن","مۇھەررەم","سەپەر","رەبىئۇلئەۋۋەل","رەبىئۇلئاخىر","جەمادىيەلئەۋۋەل","جەمادىيەلئاخىر","رەجەب","شەئبان","رامىزان","شەۋۋال","زۇلقەئدە","زۇلھەججە","ھىجرىيە","مىنگو","جۇڭخۇا مىنگودىن بۇرۇن","{1} 'о' {0}","QQQQ y 'р'.","EEEE, d MMMM y 'р'.","d MMMM y 'р'.","d MMM y 'р'.","Л","В","Г","січ.","лют.","бер.","квіт.","трав.","черв.","лип.","серп.","вер.","жовт.","лист.","груд.","січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня","П","Нд","Пн","Вт","Чт","Пт","неділя","понеділок","вівторок","середа","четвер","пʼятниця","дп","пп","Бабе","Кіхак","Тобе","Абіб","Насі","мес.","тек.","хед.","тах.","тер.","єкат.","мег.","міяз.","ген.","хам.","нех.","паг.","мескерема","текемта","хедара","тахсаса","тера","єкатіта","мегабіта","міязія","генбота","сене","хамле","нехасе","пагумена","до н.е.","до н. е.","до нашої ери","нашої ери","до нової ери","нової ери","Тішри","Марчешван","Числьов","Тебет","Нісан","Іар","Аб","чайт.","вайс.","джай.","асад.","шрав.","бхад.","асв.","кар.","агр.","паус.","маг.","фаль.","джайстха","шравана","бхадра","асвіна","картіка","аграхаяна","пауса","фальгуна","Рабі I","Рабі II","Джумада I","Джумада II","Даввал","Зу-ль-каада","Зу-ль-хіджа","Фарвардін","Ордібехешт","Тір","Шахрівер","крб.","سوموار","بدھ","قبل دوپہر","بعد دوپہر","قبل مسیح","عیسوی","ر بیع الاول","ر بیع الثانی","ذوالقعدۃ","ذوالحجۃ","d-MMM, G y","E, d-MMM, G y","h:mm:ss (v)","HH:mm:ss (v)","h:mm (v)","HH:mm (v)","E, d-MMM","d-MMMM","d-MMM, y","E, d-MMM, y","y, QQQ","y, QQQQ","d-MMMM, y","Sentabr","Oktabr","Ya","Pa","Sh","yakshanba","dushanba","seshanba","chorshanba","payshanba","shanba","TO","m.a.","milodiy","e.a.","miloddan avvalgi","eramizdan avvalgi","Robiʼ ul-avval","Robiʼ ul-oxir","Jumad ul-avval","Jumad ul-oxir","Shaʼbon","Ramazon","Shavvol","Zul-qaʼda","Zul-hijja","haqiqiy son emas","soʻm","فبر","مار","اپر","اگس","سپت","اکت","نوم","ی.","د.","س.","چ.","پ.","ج.","ش.","Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек","Январ","Феврал","Март","Апрел","Август","Сентябр","Октябр","Ноябр","Декабр","Якш","Душ","Сеш","Чор","Пай","Жум","Шан","якшанба","душанба","сешанба","чоршанба","пайшанба","шанба","М.А.","Э","сўм","ꖨꕪꖃ ꔞꕮ","ꕒꕡꖝꖕ","ꕾꖺ","ꖢꖕ","ꖑꕱ","ꗛꔕ","ꕢꕌ","ꕭꖃ","ꔞꘋꕔꕿ ꕸꖃꗏ","ꖨꕪꕱ ꗏꕮ","ꕞꕌꔵ","ꗳꗡꘉ","ꕚꕞꕚ","ꕉꕞꕒ","ꕉꔤꕆꕢ","ꕉꔤꕀꕮ","ꔻꔬꔳ","luukao kemã","ɓandaɓu","vɔɔ","fulu","goo","kɔnde","saah","galo","kenpkato ɓololɔ","luukao lɔma","lahadi","tɛɛnɛɛ","talata","alaba","aimisa","aijima","siɓiti","{0}, {1}","E, 'ngày' d","dd MMM, y G","dd/M","E, dd/M","E, dd/M/y","'tháng' MM, y","MMMM 'năm' y","QQQQ 'năm' y","EEEE, 'ngày' dd MMMM 'năm' y","'Ngày' dd 'tháng' MM 'năm' y","thg 1","thg 2","thg 3","thg 4","thg 5","thg 6","thg 7","thg 8","thg 9","thg 10","thg 11","thg 12","tháng 1","tháng 2","tháng 3","tháng 4","tháng 5","tháng 6","tháng 7","tháng 8","tháng 9","tháng 10","tháng 11","tháng 12","CN","T2","T3","T4","T5","T6","T7","Th 2","Th 3","Th 4","Th 5","Th 6","Th 7","Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy","SA","CH","tr. CN","sau CN","Trước R.O.C","Ö","Hor","Brá","Hei","Öig","Her","Wím","Win","Chr","Jenner","Hornig","Märze","Abrille","Meije","Bráčet","Heiwet","Öigšte","Herbštmánet","Wímánet","Wintermánet","Chrištmánet","Män","Ziš","Mit","Fró","Sunntag","Mäntag","Zištag","Mittwuč","Fróntag","Fritag","Samštag","n. Chr","Sabi","Bala","Kubi","Kusa","Kuna","Kuta","Muka","Sabiiti","Owokubili","Owokusatu","Olokuna","Olokutaanu","Olomukaaga","Munkyo","Eigulo","AZ","AF","Kulisto nga azilawo","Kulisto nga affile","o.1","o.2","o.3","o.4","o.5","o.6","o.7","o.8","o.9","o.10","o.11","o.12","pikítíkítie, oólí ú kutúan","siɛyɛ́, oóli ú kándíɛ","ɔnsúmbɔl, oóli ú kátátúɛ","mesiŋ, oóli ú kénie","ensil, oóli ú kátánuɛ","ɔsɔn","efute","pisuyú","imɛŋ i puɔs","imɛŋ i putúk,oóli ú kátíɛ","makandikɛ","pilɔndɔ́","sd","md","mw","et","kl","fl","ss","sɔ́ndiɛ","móndie","muányáŋmóndie","metúkpíápɛ","kúpélimetúkpiapɛ","feléte","séselé","kiɛmɛ́ɛm","kisɛ́ndɛ","+J.C.","katikupíen Yésuse","ékélémkúnupíén n","E דעם dטן","dטן MMM y G","E דעם dטן MMM yG","dטן MMM y","E, dטן MMM y","EEEE, dטן MMMM y","dטן MMMM y","יאַנואַר","פֿעברואַר","מערץ","אַפּריל","מיי","אויגוסט","סעפּטעמבער","אקטאבער","נאוועמבער","דעצעמבער","זונטיק","מאָנטיק","דינסטיק","מיטוואך","דאנערשטיק","פֿרײַטיק","פֿאַרמיטאָג","נאָכמיטאָג","תש","חש","כס","טב","שב","אא","אד","ני","אי","סי","תמ","אל","א2","חשוון","Ṣẹ́rẹ́","Èrèlè","Ẹrẹ̀nà","Ìgbé","Ẹ̀bibi","Òkúdu","Agẹmọ","Ògún","Owewe","Ọ̀wàrà","Bélú","Ọ̀pẹ̀","Oṣù Ṣẹ́rẹ́","Oṣù Èrèlè","Oṣù Ẹrẹ̀nà","Oṣù Ìgbé","Oṣù Ẹ̀bibi","Oṣù Òkúdu","Oṣù Agẹmọ","Oṣù Ògún","Oṣù Owewe","Oṣù Ọ̀wàrà","Oṣù Bélú","Oṣù Ọ̀pẹ̀","Àìkú","Ajé","Ìsẹ́gun","Ọjọ́rú","Ọjọ́bọ","Ẹtì","Àbámẹ́ta","Ọjọ́ Àìkú","Ọjọ́ Ajé","Ọjọ́ Ìsẹ́gun","Ọjọ́ Ẹtì","Ọjọ́ Àbámẹ́ta","Àárọ̀","Ọ̀sán","Saju Kristi","Lehin Kristi","Shɛ́rɛ́","Ɛrɛ̀nà","Ɛ̀bibi","Agɛmɔ","Ɔ̀wàrà","Ɔ̀pɛ̀","Oshù Shɛ́rɛ́","Oshù Èrèlè","Oshù Ɛrɛ̀nà","Oshù Ìgbé","Oshù Ɛ̀bibi","Oshù Òkúdu","Oshù Agɛmɔ","Oshù Ògún","Oshù Owewe","Oshù Ɔ̀wàrà","Oshù Bélú","Oshù Ɔ̀pɛ̀","Ìsɛ́gun","Ɔjɔ́rú","Ɔjɔ́bɔ","Ɛtì","Àbámɛ́ta","Ɔjɔ́ Àìkú","Ɔjɔ́ Ajé","Ɔjɔ́ Ìsɛ́gun","Ɔjɔ́ Ɛtì","Ɔjɔ́ Àbámɛ́ta","Àárɔ̀","Ɔ̀sán","ⴰⵙⵉⵎⵡⴰⵙ","d日E","E ah:mm","EHH:mm","E ah:mm:ss","EHH:mm:ss","Gy年M月d日E","ah时","H时","ah:mm","ah:mm:ss","v ah:mm:ss","v HH:mm:ss","v ah:mm","v HH:mm","M/dE","M月d日E","y/M/dE","y年M月d日E","y年第Q季度","zzzz ah:mm:ss","z ah:mm:ss","一月","一","周日","周一","周二","周三","周四","周五","周六","星期日","星期一","星期二","星期三","星期四","星期五","星期六","佛历","上午","下午","冬","腊","冬月","腊月","13月","十三月","公元前","公元","西元前","西元","闰7月","闰七月","希伯来历","印度历","伊斯兰历","大化 (645–650)","白雉 (650–671)","白凤 (672–686)","朱鸟 (686–701)","大宝 (701–704)","庆云 (704–708)","和铜 (708–715)","灵龟 (715–717)","养老 (717–724)","神龟 (724–729)","天平 (729–749)","天平感宝 (749–749)","天平胜宝 (749–757)","天平宝字 (757–765)","天平神护 (765–767)","神护景云 (767–770)","宝龟 (770–780)","天应 (781–782)","延历 (782–806)","大同 (806–810)","弘仁 (810–824)","天长 (824–834)","承和 (834–848)","嘉祥 (848–851)","仁寿 (851–854)","齐衡 (854–857)","天安 (857–859)","贞观 (859–877)","元庆 (877–885)","仁和 (885–889)","宽平 (889–898)","昌泰 (898–901)","延喜 (901–923)","延长 (923–931)","承平 (931–938)","天庆 (938–947)","天历 (947–957)","天德 (957–961)","应和 (961–964)","康保 (964–968)","安和 (968–970)","天禄 (970–973)","天延 (973–976)","贞元 (976–978)","天元 (978–983)","永观 (983–985)","宽和 (985–987)","永延 (987–989)","永祚 (989–990)","正历 (990–995)","长德 (995–999)","长保 (999–1004)","宽弘 (1004–1012)","长和 (1012–1017)","宽仁 (1017–1021)","治安 (1021–1024)","万寿 (1024–1028)","长元 (1028–1037)","长历 (1037–1040)","长久 (1040–1044)","宽德 (1044–1046)","永承 (1046–1053)","天喜 (1053–1058)","康平 (1058–1065)","治历 (1065–1069)","延久 (1069–1074)","承保 (1074–1077)","正历 (1077–1081)","永保 (1081–1084)","应德 (1084–1087)","宽治 (1087–1094)","嘉保 (1094–1096)","永长 (1096–1097)","承德 (1097–1099)","康和 (1099–1104)","长治 (1104–1106)","嘉承 (1106–1108)","天仁 (1108–1110)","天永 (1110–1113)","永久 (1113–1118)","元永 (1118–1120)","保安 (1120–1124)","天治 (1124–1126)","大治 (1126–1131)","天承 (1131–1132)","长承 (1132–1135)","保延 (1135–1141)","永治 (1141–1142)","康治 (1142–1144)","天养 (1144–1145)","久安 (1145–1151)","仁平 (1151–1154)","久寿 (1154–1156)","保元 (1156–1159)","平治 (1159–1160)","永历 (1160–1161)","应保 (1161–1163)","长宽 (1163–1165)","永万 (1165–1166)","仁安 (1166–1169)","嘉应 (1169–1171)","承安 (1171–1175)","安元 (1175–1177)","治承 (1177–1181)","养和 (1181–1182)","寿永 (1182–1184)","元历 (1184–1185)","文治 (1185–1190)","建久 (1190–1199)","正治 (1199–1201)","建仁 (1201–1204)","元久 (1204–1206)","建永 (1206–1207)","承元 (1207–1211)","建历 (1211–1213)","建保 (1213–1219)","承久 (1219–1222)","贞应 (1222–1224)","元仁 (1224–1225)","嘉禄 (1225–1227)","安贞 (1227–1229)","宽喜 (1229–1232)","贞永 (1232–1233)","天福 (1233–1234)","文历 (1234–1235)","嘉祯 (1235–1238)","历仁 (1238–1239)","延应 (1239–1240)","仁治 (1240–1243)","宽元 (1243–1247)","宝治 (1247–1249)","建长 (1249–1256)","康元 (1256–1257)","正嘉 (1257–1259)","正元 (1259–1260)","文应 (1260–1261)","弘长 (1261–1264)","文永 (1264–1275)","建治 (1275–1278)","弘安 (1278–1288)","正应 (1288–1293)","永仁 (1293–1299)","正安 (1299–1302)","干元 (1302–1303)","嘉元 (1303–1306)","德治 (1306–1308)","延庆 (1308–1311)","应长 (1311–1312)","正和 (1312–1317)","文保 (1317–1319)","元应 (1319–1321)","元亨 (1321–1324)","正中 (1324–1326)","嘉历 (1326–1329)","元德 (1329–1331)","元弘 (1331–1334)","建武 (1334–1336)","延元 (1336–1340)","兴国 (1340–1346)","正平 (1346–1370)","建德 (1370–1372)","文中 (1372–1375)","天授 (1375–1379)","康历 (1379–1381)","弘和 (1381–1384)","元中 (1384–1392)","至德 (1384–1387)","嘉庆 (1387–1389)","康应 (1389–1390)","明德 (1390–1394)","应永 (1394–1428)","正长 (1428–1429)","永享 (1429–1441)","嘉吉 (1441–1444)","文安 (1444–1449)","宝德 (1449–1452)","享德 (1452–1455)","康正 (1455–1457)","长禄 (1457–1460)","宽正 (1460–1466)","文正 (1466–1467)","应仁 (1467–1469)","文明 (1469–1487)","长享 (1487–1489)","延德 (1489–1492)","明应 (1492–1501)","文龟 (1501–1504)","永正 (1504–1521)","大永 (1521–1528)","享禄 (1528–1532)","天文 (1532–1555)","弘治 (1555–1558)","永禄 (1558–1570)","元龟 (1570–1573)","天正 (1573–1592)","文禄 (1592–1596)","庆长 (1596–1615)","元和 (1615–1624)","宽永 (1624–1644)","正保 (1644–1648)","庆安 (1648–1652)","承应 (1652–1655)","明历 (1655–1658)","万治 (1658–1661)","宽文 (1661–1673)","延宝 (1673–1681)","天和 (1681–1684)","贞享 (1684–1688)","元禄 (1688–1704)","宝永 (1704–1711)","正德 (1711–1716)","享保 (1716–1736)","元文 (1736–1741)","宽保 (1741–1744)","延享 (1744–1748)","宽延 (1748–1751)","宝历 (1751–1764)","明和 (1764–1772)","安永 (1772–1781)","天明 (1781–1789)","宽政 (1789–1801)","享和 (1801–1804)","文化 (1804–1818)","文政 (1818–1830)","天保 (1830–1844)","弘化 (1844–1848)","嘉永 (1848–1854)","安政 (1854–1860)","万延 (1860–1861)","文久 (1861–1864)","元治 (1864–1865)","庆应 (1865–1868)","波斯历","ILS","₩","d/M/y(E)","y年M月d日,E","M-dE","Gy年M月d日 E","ah時","ah:mm:ss [v]","HH:mm:ss [v]","ah:mm [v]","HH:mm [v]","M/d(E)","M月d日 E","y/M/d(E)","y年M月d日 E","y年QQQ","y年QQQQ","y年M月d日 EEEE","ah:mm:ss [zzzz]","ah:mm:ss [z]","週日","週一","週二","週三","週四","週五","週六","佛曆","臘","臘月","提斯利月","瑪西班月","基斯流月","提別月","細罷特月","亞達月 I","亞達月","尼散月","以珥月","西彎月","搭模斯月","埃波月","以祿月","亞達月 II","創世紀元","制檀邏月","吠舍佉月","逝瑟吒月","頞沙荼月","室羅伐拏月","婆羅鉢陀月","頞涇縛庚闍月","迦剌底迦月","末伽始羅月","報沙月","磨祛月","頗勒窶拏月","印度曆","穆哈蘭姆月","色法爾月","賴比月 I","賴比月 II","主馬達月 I","主馬達月 II","賴哲卜月","舍爾邦月","賴買丹月","閃瓦魯月","都爾喀爾德月","都爾黑哲月","伊斯蘭曆","白鳳","大寶","靈龜","神龜","天平感寶","天平勝寶","天平寶字","寶龜","天應","延曆","仁壽","齊衡","貞觀","寬平","天曆","天德","應和","天祿","永觀","寬和","正曆","長德","寬弘","寬仁","萬壽","長曆","寬德","治曆","承曆","應德","寬治","承德","久壽","永曆","應保","長寬","永萬","嘉應","壽永","元曆","建曆","貞應","嘉祿","寬喜","文曆","曆仁","延應","寬元","寶治","文應","正應","德治","應長","元應","嘉曆","元德","興國","建德","康曆","至德","康應","明德","應永","寶德","享德","長祿","寬正","應仁","延德","明應","文龜","享祿","永祿","元龜","文祿","寬永","承應","明曆","萬治","寬文","延寶","元祿","寶永","正德","寬保","寬延","寶曆","寬政","萬延","慶應","波斯曆","民國前","民國","非數值","cccc","Mas","Eph","Aga","Januwari","Februwari","Mashi","Ephreli","Meyi","Julayi","Septhemba","Okthoba","Mso","Bil","Hla","ISonto","UMsombuluko","ULwesibili","ULwesithathu","ULwesine","ULwesihlanu","UMgqibelo"],b=[];b[0]=[[a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[26],"GyMMMEd":a[27],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[48],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[51],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[56],"yMMMMd":a[57],"yMMMd":a[51],"yMd":a[58]},{"hmmsszzzz":a[59],"hmsz":a[60],"hms":a[32],"hm":a[30]},[a[61],a[62],a[63],a[64],a[63],a[61],a[61],a[64],a[65],a[66],a[67],a[68]],[a[69],a[70],a[71],a[72],a[73],a[74],a[75],a[76],a[77],a[78],a[79],a[80]],[a[81],a[82],a[83],a[84],a[73],a[85],a[86],a[87],a[88],a[89],a[90],a[91]],[a[65],a[63],a[92],a[93],a[92],a[62],a[65]],[a[94],a[95],a[96],a[97],a[98],a[99],a[100]],[a[101],a[102],a[103],a[104],a[105],a[106],a[107]],[a[108]],{"am":a[109],"pm":a[110]},[a[111],a[112],a[113],a[114],a[115],a[116],a[117],a[118],a[119],a[120],a[121],a[122]],[a[123],a[124],a[125],a[126],a[127],a[128],a[129],a[130],a[131],a[132],a[133],a[134]],[a[135],a[136],a[137],a[138],a[139],a[140],a[141],a[142],a[143],a[144],a[145],a[146]],[a[111],a[112],a[113],a[114],a[115],a[116],a[117],a[118],a[119],a[120],a[121],a[122],a[147]],[a[148],a[149],a[150],a[151],a[152],a[153],a[154],a[155],a[156],a[157],a[158],a[159],a[160]],[a[161],a[162]],[a[163],a[164],a[165],a[166],a[167],a[168],a[169],a[170],a[171],a[172],a[173],a[174],a[175]],[a[161]],[a[176],a[177],a[178],a[179],a[180],a[181],a[182],a[183],a[184],a[185],a[186],a[187]],[a[188],a[64],a[189],a[190]],[a[191],a[192],a[189],a[190]],[a[193],a[194],a[195],a[196]],[a[111],a[112],a[113],a[114],a[115],a[116],a[117],a[118],a[119],a[120],a[121],a[122],a[147],a[117]],[a[197],a[198],a[199],a[200],a[201],a[202],a[203],a[204],a[205],a[206],a[207],a[208],a[209],a[210]],[a[109]],[a[211],a[212],a[213],a[214],a[215],a[216],a[217],a[218],a[219],a[220],a[221],a[222]],[a[223]],[a[224],a[225],a[226],a[227],a[228],a[229],a[230],a[231],a[232],a[233],a[234],a[235]],[a[236],a[237],a[238],a[239],a[240],a[241],a[242],a[243],a[244],a[245],a[246],a[247]],[a[248]],[a[249],a[250],a[251],a[252],a[253],a[254],a[255],a[256],a[257],a[258],a[259],a[260],a[261],a[262],a[263],a[264],a[265],a[266],a[267],a[268],a[269],a[270],a[271],a[272],a[273],a[274],a[275],a[276],a[277],a[278],a[279],a[280],a[281],a[282],a[283],a[284],a[285],a[286],a[287],a[288],a[289],a[290],a[291],a[292],a[293],a[294],a[295],a[296],a[297],a[298],a[299],a[300],a[301],a[302],a[303],a[304],a[305],a[306],a[307],a[308],a[309],a[310],a[311],a[312],a[313],a[314],a[315],a[316],a[317],a[318],a[319],a[320],a[321],a[322],a[323],a[324],a[325],a[326],a[327],a[328],a[329],a[330],a[331],a[332],a[333],a[334],a[335],a[336],a[337],a[338],a[339],a[340],a[341],a[342],a[343],a[344],a[345],a[346],a[347],a[348],a[349],a[350],a[351],a[352],a[353],a[354],a[355],a[356],a[357],a[358],a[359],a[360],a[361],a[362],a[363],a[364],a[365],a[366],a[367],a[368],a[369],a[370],a[371],a[372],a[373],a[374],a[375],a[376],a[377],a[378],a[379],a[380],a[381],a[382],a[383],a[384],a[385],a[386],a[387],a[388],a[389],a[390],a[391],a[392],a[393],a[394],a[395],a[396],a[397],a[398],a[399],a[400],a[401],a[402],a[403],a[404],a[405],a[406],a[407],a[408],a[409],a[410],a[411],a[412],a[413],a[414],a[415],a[416],a[417],a[418],a[419],a[420],a[421],a[422],a[423],a[424],a[425],a[426],a[427],a[428],a[429],a[430],a[431],a[432],a[433],a[434],a[435],a[436],a[437],a[438],a[439],a[440],a[441],a[442],a[443],a[444],a[445],a[446],a[447],a[448],a[449],a[450],a[451],a[452],a[453],a[454],a[455],a[456],a[457],a[458],a[459],a[460],a[461],a[462],a[463],a[464],a[465],a[466],a[467],a[468],a[469],a[470],a[471],a[472],a[473],a[474],a[475],a[476],a[477],a[478],a[479],a[480],a[63],a[92],a[65],a[481]],[a[249],a[250],a[251],a[252],a[253],a[254],a[255],a[256],a[257],a[258],a[259],a[260],a[261],a[262],a[263],a[264],a[265],a[266],a[267],a[268],a[269],a[270],a[271],a[272],a[273],a[274],a[275],a[276],a[277],a[278],a[279],a[280],a[281],a[282],a[283],a[284],a[285],a[286],a[287],a[288],a[289],a[290],a[291],a[292],a[293],a[294],a[295],a[296],a[297],a[298],a[299],a[300],a[301],a[302],a[303],a[304],a[305],a[306],a[307],a[308],a[309],a[310],a[311],a[312],a[313],a[314],a[315],a[316],a[317],a[318],a[319],a[320],a[321],a[322],a[323],a[324],a[325],a[326],a[327],a[328],a[329],a[330],a[331],a[332],a[333],a[334],a[335],a[336],a[337],a[338],a[339],a[340],a[341],a[342],a[343],a[344],a[345],a[346],a[347],a[348],a[349],a[350],a[351],a[352],a[353],a[354],a[355],a[356],a[357],a[358],a[359],a[360],a[361],a[362],a[363],a[364],a[365],a[366],a[367],a[368],a[369],a[370],a[371],a[372],a[373],a[374],a[375],a[376],a[377],a[378],a[379],a[380],a[381],a[382],a[383],a[384],a[385],a[386],a[387],a[388],a[389],a[390],a[391],a[392],a[393],a[394],a[395],a[396],a[397],a[398],a[399],a[400],a[401],a[402],a[403],a[404],a[405],a[406],a[407],a[408],a[409],a[410],a[411],a[412],a[413],a[414],a[415],a[416],a[417],a[418],a[419],a[420],a[421],a[422],a[423],a[424],a[425],a[426],a[427],a[428],a[429],a[430],a[431],a[432],a[433],a[434],a[435],a[436],a[437],a[438],a[439],a[440],a[441],a[442],a[443],a[444],a[445],a[446],a[447],a[448],a[449],a[450],a[451],a[452],a[453],a[454],a[455],a[456],a[457],a[458],a[459],a[460],a[461],a[462],a[463],a[464],a[465],a[466],a[467],a[468],a[469],a[470],a[471],a[472],a[473],a[474],a[475],a[476],a[477],a[478],a[479],a[480],a[482],a[483],a[484],a[485]],[a[486],a[487],a[488],a[489],a[490],a[491],a[492],a[493],a[494],a[495],a[496],a[497]],[a[498]],[a[499],a[500]],[a[501]],{"positivePattern":a[502],"negativePattern":a[503]},{"positivePattern":a[504],"negativePattern":a[505]},{"positivePattern":a[506],"negativePattern":a[507]},{"decimal":a[508],"group":a[509],"nan":a[510],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[537],"EHm":a[21],"Ehms":a[538],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[539],"GyMMMEd":a[540],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[541],"MEd":a[542],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[543],"MMMMEd":a[545],"ms":a[45],"y":a[46],"yM":a[546],"yMd":a[547],"yMEd":a[548],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[551],"yMMMMd":a[552],"yMMMd":a[553],"yMd":a[547]},[a[554],a[555],a[556],a[557],a[558],a[559],a[560],a[561],a[562],a[563],a[564],a[565]],[a[566],a[567],a[568],a[84],a[558],a[569],a[570],a[571],a[88],a[572],a[90],a[573]],[a[65],a[63],a[68],a[93],a[68],a[574],a[65]],[a[575],a[576],a[577],a[578],a[579],a[580],a[581]],[a[582],a[583],a[584],a[585],a[586],a[587],a[588]],{"am":a[589],"pm":a[590]},[a[591],a[592],a[593],a[594]],[a[595],a[596],a[597],a[594]],[a[499],a[598]],{"decimal":a[509],"group":a[599],"nan":a[510],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"ZAR":a[603]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"NAD":a[529],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"ZAR":a[603]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[44],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[617],"yMd":a[611]},{"hmmsszzzz":a[618],"hmsz":a[619],"hms":a[33],"hm":a[31]},[a[620],a[621],a[622],a[622],a[623],a[624],a[621],a[625],a[17],a[626],a[627],a[625]],[a[628],a[629],a[630],a[631],a[632],a[633],a[634],a[635],a[636],a[637],a[638],a[639]],[a[640],a[641],a[642],a[643],a[644],a[645],a[646],a[647],a[648],a[649],a[650],a[651]],[a[620],a[621],a[652],a[622],a[653],a[652],a[17]],[a[654],a[655],a[656],a[657],a[658],a[659],a[660]],[a[661],a[662],a[663],a[664],a[665],a[666],a[667]],{"am":a[668],"pm":a[669]},[a[670],a[671],a[189],a[190]],[a[672],a[673],a[189],a[190]],{"positivePattern":a[674],"negativePattern":a[675]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"MMMMEd":a[677],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[678],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[680],"yMMMMd":a[681],"yMMMd":a[679],"yMd":a[682]},[a[683],a[684],a[685],a[686],a[687],a[688],a[689],a[690],a[691],a[692],a[693],a[694]],[a[695],a[696],a[697],a[698],a[699],a[700],a[701],a[702],a[703],a[704],a[705],a[706]],[a[707],a[68],a[188],a[93],a[708],a[62],a[63]],[a[709],a[710],a[711],a[712],a[713],a[714],a[715]],[a[716],a[717],a[718],a[719],a[720],a[721],a[722]],{"am":a[723],"pm":a[724]},[a[725],a[726],a[189],a[190]],[a[727],a[728],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"GHS":a[729],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[730],"GyMMMEd":a[731],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[732],"MMM":a[41],"MMMd":a[42],"MMMEd":a[733],"MMMMd":a[44],"MMMMEd":a[734],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[735],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[736],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[737],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[738]},[a[739],a[740],a[741],a[742],a[743],a[744],a[744],a[745],a[746],a[745],a[747],a[748]],[a[749],a[750],a[751],a[752],a[753],a[754],a[755],a[756],a[757],a[758],a[759],a[760]],[a[761],a[762],a[751],a[763],a[753],a[754],a[755],a[764],a[765],a[766],a[767],a[768]],[a[769],a[770],a[741],a[771],a[772],a[773],a[774]],[a[775],a[776],a[777],a[778],a[779],a[780],a[781]],[a[775],a[776],a[782],a[778],a[779],a[780],a[781]],{"am":a[783],"pm":a[784]},[a[785],a[786],a[787],a[788],a[789],a[790],a[791],a[792],a[793],a[794],a[795],a[796],a[797]],[a[798],a[799],a[189],a[190]],[a[800],a[801],a[189],a[799]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"ETB":a[803],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[804],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[805],"GyMMMEd":a[806],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[807],"MEd":a[808],"MMdd":a[809],"MMM":a[41],"MMMd":a[543],"MMMEd":a[810],"MMMMd":a[811],"MMMMEd":a[812],"ms":a[45],"y":a[46],"yM":a[813],"yMd":a[814],"yMEd":a[815],"yMM":a[816],"yMMM":a[50],"yMMMd":a[817],"yMMMEd":a[818],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[819],"yMMMMd":a[820],"yMMMd":a[821],"yMd":a[814]},[a[822],a[823],a[824],a[825],a[826],a[827],a[828],a[829],a[830],a[831],a[832],a[833]],[a[834],a[835],a[836],a[837],a[838],a[839],a[840],a[841],a[842],a[843],a[844],a[845]],[a[846],a[827],a[847],a[848],a[849],a[850],a[830]],[a[851],a[852],a[853],a[854],a[855],a[856],a[857]],[a[858]],{"am":a[859],"pm":a[824]},[a[860],a[861],a[862],a[863],a[864],a[865],a[866],a[867],a[868],a[869],a[870],a[871],a[872]],[a[873],a[874],a[875],a[876],a[877],a[878],a[879],a[880],a[881],a[882],a[883],a[884],a[885]],[a[886],a[887],a[888],a[889],a[890],a[891],a[892],a[893],a[894],a[895],a[896],a[897],a[898]],[a[899],a[824],a[189],a[900]],[a[901],a[902],a[189],a[903]],[a[904],a[905],a[906],a[907],a[908],a[909],a[910],a[911],a[912],a[913],a[914],a[915],a[916],a[917]],[a[859]],[a[860],a[861],a[862],a[863],a[864],a[865],a[866],a[867],a[868],a[869],a[870],a[871]],[a[918],a[919],a[920],a[921],a[922],a[923],a[924],a[925],a[926],a[927],a[928],a[929]],[a[930]],[a[931],a[932],a[933],a[934],a[935],a[936],a[937],a[938],a[939],a[940],a[941],a[942],a[943],a[944],a[945],a[946],a[947],a[948],a[949],a[950],a[951],a[952],a[953],a[954],a[955],a[956],a[957],a[958],a[959],a[960],a[961],a[962],a[963],a[964],a[965],a[966],a[967],a[968],a[969],a[970],a[971],a[972],a[973],a[974],a[975],a[976],a[977],a[978],a[979],a[980],a[981],a[982],a[983],a[984],a[985],a[986],a[987],a[988],a[989],a[990],a[991],a[992],a[993],a[994],a[995],a[996],a[997],a[998],a[999],a[1000],a[1001],a[1002],a[1003],a[1004],a[1005],a[1006],a[1007],a[1008],a[1009],a[1010],a[1011],a[1012],a[1013],a[1014],a[1015],a[1016],a[1017],a[1018],a[1019],a[1020],a[1021],a[1022],a[1023],a[1024],a[1025],a[1026],a[1027],a[1028],a[1029],a[1030],a[1031],a[1032],a[1033],a[1034],a[1035],a[1036],a[1037],a[1038],a[1039],a[1040],a[1041],a[1042],a[1043],a[1044],a[1045],a[1046],a[1047],a[1048],a[1049],a[1050],a[1051],a[1052],a[1053],a[1054],a[1055],a[1056],a[1057],a[1058],a[1059],a[1060],a[1061],a[1062],a[1063],a[1064],a[1065],a[1066],a[1067],a[1068],a[1069],a[1070],a[1071],a[1072],a[1073],a[1074],a[1075],a[1076],a[1077],a[1078],a[1079],a[1080],a[1081],a[1082],a[1083],a[1084],a[1085],a[1086],a[1087],a[1088],a[1089],a[1090],a[1091],a[1092],a[1093],a[1094],a[1095],a[1096],a[1097],a[1098],a[1099],a[1100],a[1101],a[1102],a[1103],a[1104],a[1105],a[1106],a[1107],a[1108],a[1109],a[1110],a[1111],a[1112],a[1113],a[1114],a[1115],a[1116],a[1117],a[1118],a[1119],a[1120],a[1121],a[1122],a[1123],a[1124],a[1125],a[1126],a[1127],a[1128],a[1129],a[1130],a[1131],a[1132],a[1133],a[1134],a[1135],a[1136],a[1137],a[1138],a[1139],a[1140],a[1141],a[1142],a[1143],a[1144],a[1145],a[1146],a[1147],a[1148],a[1149],a[1150],a[1151],a[1152],a[1153],a[1154],a[1155],a[1156],a[1157],a[1158],a[1159],a[1160],a[1161],a[1162],a[1163],a[1164],a[1165],a[1166]],[a[1167],a[1168],a[1169],a[1170],a[1171],a[1172],a[1173],a[1174],a[1175],a[1176],a[1177],a[1178]],[a[1179]],[a[499],a[1180]],[a[1181],a[501]],{"positivePattern":a[1182],"negativePattern":a[1183]},{"decimal":a[1184],"group":a[1185],"nan":a[1186],"plusSign":a[1187],"minusSign":a[1188],"percentSign":a[1189],"infinity":a[514]},{"decimal":a[508],"group":a[509],"nan":a[1190],"plusSign":a[1191],"minusSign":a[1192],"percentSign":a[1189],"infinity":a[514]},{"AED":a[1193],"AUD":a[802],"BHD":a[1194],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DZD":a[1195],"EGP":a[1196],"EUR":a[519],"GBP":a[520],"HKD":a[521],"IDR":a[1197],"ILS":a[522],"INR":a[523],"IQD":a[1198],"IRR":a[1199],"JOD":a[1200],"JPY":a[600],"KMF":a[1201],"KRW":a[525],"KWD":a[1202],"LBP":a[1203],"LYD":a[1204],"MAD":a[1205],"MRO":a[1206],"MXN":a[526],"NZD":a[527],"OMR":a[1207],"PKR":a[1208],"QAR":a[1209],"SAR":a[1210],"SDD":a[1211],"SDG":a[1212],"SSP":a[1213],"SYP":a[1214],"THB":a[601],"TND":a[1215],"TRY":a[1216],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[1217],"YER":a[1218]},[a[899],a[824],a[899],a[900]],[a[901],a[902],a[901],a[903]],{"AED":a[1193],"AUD":a[802],"BHD":a[1194],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DJF":a[1219],"DZD":a[1195],"EGP":a[1196],"EUR":a[519],"GBP":a[520],"HKD":a[521],"IDR":a[1197],"ILS":a[522],"INR":a[523],"IQD":a[1198],"IRR":a[1199],"JOD":a[1200],"JPY":a[600],"KMF":a[1201],"KRW":a[525],"KWD":a[1202],"LBP":a[1203],"LYD":a[1204],"MAD":a[1205],"MRO":a[1206],"MXN":a[526],"NZD":a[527],"OMR":a[1207],"PKR":a[1208],"QAR":a[1209],"SAR":a[1210],"SDD":a[1211],"SDG":a[1212],"SSP":a[1213],"SYP":a[1214],"THB":a[601],"TND":a[1215],"TRY":a[1216],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[1217],"YER":a[1218]},[a[850],a[823],a[824],a[825],a[824],a[850],a[850],a[825],a[830],a[825],a[827],a[833]],[a[1220],a[1221],a[836],a[1222],a[1223],a[1224],a[1225],a[1226],a[842],a[843],a[844],a[845]],{"decimal":a[509],"group":a[508],"nan":a[1190],"plusSign":a[1191],"minusSign":a[1192],"percentSign":a[1189],"infinity":a[514]},{"AED":a[1193],"AUD":a[802],"BHD":a[1194],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DZD":a[1195],"EGP":a[1196],"ERN":a[1227],"EUR":a[519],"GBP":a[520],"HKD":a[521],"IDR":a[1197],"ILS":a[522],"INR":a[523],"IQD":a[1198],"IRR":a[1199],"JOD":a[1200],"JPY":a[600],"KMF":a[1201],"KRW":a[525],"KWD":a[1202],"LBP":a[1203],"LYD":a[1204],"MAD":a[1205],"MRO":a[1206],"MXN":a[526],"NZD":a[527],"OMR":a[1207],"PKR":a[1208],"QAR":a[1209],"SAR":a[1210],"SDD":a[1211],"SDG":a[1212],"SSP":a[1213],"SYP":a[1214],"THB":a[601],"TND":a[1215],"TRY":a[1216],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[1217],"YER":a[1218]},{"hmmsszzzz":a[1228],"hmsz":a[1229],"hms":a[1230],"hm":a[1231]},[a[831],a[1232],a[1233],a[827],a[825],a[846],a[1234],a[1233],a[825],a[1234],a[1234],a[831]],[a[1235],a[908],a[910],a[911],a[912],a[1236],a[914],a[915],a[916],a[1237],a[1238],a[1239]],[a[1235],a[908],a[910],a[911],a[912],a[1236],a[914],a[915],a[916],a[1240],a[1238],a[1239]],{"AED":a[1193],"AUD":a[802],"BHD":a[1194],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DZD":a[1195],"EGP":a[1196],"EUR":a[519],"GBP":a[520],"HKD":a[521],"IDR":a[1197],"ILS":a[522],"INR":a[523],"IQD":a[1198],"IRR":a[1199],"JOD":a[1200],"JPY":a[600],"KMF":a[1201],"KRW":a[525],"KWD":a[1202],"LBP":a[1203],"LYD":a[1204],"MAD":a[1205],"MRO":a[1206],"MXN":a[526],"NZD":a[527],"OMR":a[1207],"PKR":a[1208],"QAR":a[1209],"SAR":a[1210],"SDD":a[1211],"SSP":a[1213],"SYP":a[1214],"THB":a[601],"TND":a[1215],"TRY":a[1216],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[1217],"YER":a[1218]},[a[822],a[823],a[824],a[825],a[824],a[827],a[828],a[829],a[1232],a[831],a[832],a[833]],[a[834],a[835],a[836],a[837],a[1223],a[839],a[1241],a[1242],a[1243],a[843],a[1244],a[1245]],[a[822],a[823],a[824],a[1246],a[826],a[827],a[828],a[829],a[1232],a[831],a[832],a[833]],[a[834],a[835],a[836],a[1247],a[838],a[839],a[840],a[1248],a[1249],a[843],a[844],a[1250]],{"AED":a[1193],"AUD":a[802],"BHD":a[1194],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DZD":a[1195],"EGP":a[1196],"EUR":a[519],"GBP":a[520],"HKD":a[521],"IDR":a[1197],"ILS":a[522],"INR":a[523],"IQD":a[1198],"IRR":a[1199],"JOD":a[1200],"JPY":a[600],"KMF":a[1201],"KRW":a[525],"KWD":a[1202],"LBP":a[1203],"LYD":a[1204],"MAD":a[1205],"MRO":a[1206],"MXN":a[526],"NZD":a[527],"OMR":a[1207],"PKR":a[1208],"QAR":a[1209],"SAR":a[1210],"SDD":a[1211],"SDG":a[1212],"SOS":a[65],"SSP":a[1213],"SYP":a[1214],"THB":a[601],"TND":a[1215],"TRY":a[1216],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[1217],"YER":a[1218]},{"AED":a[1193],"AUD":a[802],"BHD":a[1194],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DZD":a[1195],"EGP":a[1196],"EUR":a[519],"GBP":a[1251],"HKD":a[521],"IDR":a[1197],"ILS":a[522],"INR":a[523],"IQD":a[1198],"IRR":a[1199],"JOD":a[1200],"JPY":a[600],"KMF":a[1201],"KRW":a[525],"KWD":a[1202],"LBP":a[1203],"LYD":a[1204],"MAD":a[1205],"MRO":a[1206],"MXN":a[526],"NZD":a[527],"OMR":a[1207],"PKR":a[1208],"QAR":a[1209],"SAR":a[1210],"SDD":a[1211],"SDG":a[1212],"SSP":a[520],"SYP":a[1214],"THB":a[601],"TND":a[1215],"TRY":a[1216],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[1217],"YER":a[1218]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[1253],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[1261],"yMMMMd":a[681],"yMMMd":a[679],"yMd":a[547]},[a[1262],a[1263],a[1264],a[1265],a[1266],a[1267],a[1268],a[1269],a[1270],a[1271],a[1272],a[1273]],[a[1274],a[1275],a[1264],a[1265],a[1266],a[1267],a[1268],a[1276],a[1277],a[1278],a[1279],a[1280]],[a[1281],a[1282],a[1283],a[1284],a[1285],a[1286],a[1287]],[a[1288],a[1289],a[1290],a[1291],a[1292],a[1293],a[1294]],{"am":a[1295],"pm":a[1296]},[a[189],a[190],a[189],a[190]],[a[1297],a[501]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"MMMMEd":a[677],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[738]},[a[69],a[70],a[1299],a[72],a[558],a[74],a[75],a[1300],a[77],a[1301],a[79],a[80]],[a[1302],a[1303],a[1304],a[1305],a[558],a[1306],a[1307],a[1308],a[1309],a[1310],a[1311],a[1312]],[a[61],a[61],a[61],a[61],a[64],a[1313],a[61]],[a[1314],a[1315],a[1316],a[1317],a[1318],a[1319],a[1320]],[a[1321],a[1322],a[1323],a[1324],a[1325],a[1326],a[1327]],{"am":a[1328],"pm":a[1329]},[a[1330],a[1331],a[189],a[190]],[a[1332],a[1333],a[189],a[190]],{"positivePattern":a[1334],"negativePattern":a[1335]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"TZS":a[1336],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[1342],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1343],"yMMMMd":a[1344],"yMMMd":a[549],"yMd":a[1345]},[a[1346],a[62],a[63],a[64],a[63],a[1346],a[1346],a[64],a[65],a[66],a[1347],a[64]],[a[1348],a[1349],a[1350],a[1351],a[1352],a[1353],a[1354],a[1355],a[1356],a[1357],a[1358],a[1359]],[a[1360],a[1361],a[1362],a[1363],a[1364],a[1365],a[1366],a[1367],a[1368],a[1369],a[1370],a[1371]],[a[68],a[38],a[63],a[63],a[1346],a[574],a[65]],[a[1372],a[1373],a[1350],a[1374],a[1375],a[1376],a[1377]],[a[1378],a[1379],a[1380],a[1381],a[1382],a[1383],a[1384]],[a[1385]],[a[1386]],{"am":a[1387],"pm":a[1388]},[a[1389],a[1390],a[1391],a[1392],a[1393],a[1394],a[1395],a[1396],a[1397],a[1398],a[1399],a[1400]],[a[1401],a[1402],a[1403],a[1404],a[1405],a[1406],a[1407],a[1408],a[1409],a[1410],a[1411],a[1412],a[1413]],[a[1414],a[1415],a[1416],a[1417],a[1418],a[1419],a[1420],a[1421],a[1422],a[1423],a[1424],a[1425],a[1426]],[a[1427],a[1428]],[a[1429],a[1430]],[a[1431],a[1432]],[a[1433],a[1434],a[1435],a[1436]],[a[1437],a[1438],a[1439],a[1440]],[a[1437],a[1441],a[1442],a[1443]],[a[1444],a[250],a[251],a[252],a[253],a[254],a[255],a[256],a[257],a[258],a[1445],a[1446],a[1447],a[1448],a[1449],a[264],a[265],a[266],a[267],a[268],a[269],a[270],a[271],a[272],a[273],a[1450],a[1451],a[1452],a[1453],a[278],a[1454],a[280],a[281],a[282],a[1455],a[284],a[1456],a[286],a[287],a[288],a[289],a[290],a[291],a[292],a[293],a[294],a[295],a[1457],a[297],a[298],a[299],a[300],a[301],a[302],a[303],a[304],a[305],a[306],a[307],a[308],a[309],a[310],a[311],a[312],a[313],a[314],a[315],a[316],a[1458],a[318],a[319],a[320],a[321],a[322],a[323],a[324],a[325],a[326],a[327],a[328],a[329],a[330],a[331],a[332],a[333],a[334],a[335],a[336],a[337],a[338],a[339],a[340],a[341],a[342],a[343],a[344],a[345],a[346],a[347],a[348],a[349],a[350],a[351],a[352],a[353],a[354],a[355],a[356],a[357],a[358],a[359],a[360],a[361],a[362],a[363],a[364],a[365],a[366],a[367],a[368],a[369],a[370],a[371],a[372],a[373],a[374],a[375],a[376],a[377],a[378],a[379],a[380],a[381],a[382],a[383],a[384],a[385],a[386],a[387],a[388],a[389],a[390],a[391],a[392],a[393],a[394],a[395],a[396],a[397],a[398],a[399],a[400],a[401],a[402],a[403],a[404],a[405],a[406],a[407],a[408],a[409],a[410],a[411],a[412],a[413],a[414],a[415],a[416],a[417],a[418],a[419],a[420],a[421],a[422],a[423],a[424],a[425],a[426],a[427],a[428],a[429],a[430],a[431],a[432],a[433],a[434],a[435],a[436],a[437],a[438],a[439],a[440],a[441],a[442],a[443],a[444],a[445],a[446],a[447],a[448],a[449],a[450],a[451],a[452],a[453],a[454],a[455],a[456],a[457],a[458],a[459],a[460],a[461],a[462],a[463],a[464],a[465],a[466],a[467],a[468],a[469],a[470],a[471],a[472],a[473],a[474],a[475],a[476],a[477],a[478],a[479],a[480],a[63],a[92],a[65],a[481]],[a[1444],a[1459],a[1460],a[1461],a[1462],a[1463],a[1464],a[1465],a[1466],a[1467],a[1445],a[1468],a[1469],a[1470],a[1471],a[1472],a[1473],a[1474],a[1475],a[1476],a[1477],a[1478],a[1479],a[1480],a[1481],a[1450],a[1451],a[1452],a[1453],a[1482],a[1454],a[1483],a[1484],a[1485],a[1455],a[1486],a[1456],a[1487],a[1488],a[1489],a[1490],a[1491],a[1492],a[1493],a[1494],a[1495],a[1496],a[1457],a[1497],a[1498],a[1499],a[1500],a[1501],a[1502],a[1503],a[1504],a[1505],a[1506],a[1507],a[1508],a[1509],a[1510],a[1511],a[1512],a[1513],a[1514],a[1515],a[1516],a[1458],a[1517],a[1518],a[1519],a[1520],a[1521],a[1522],a[1523],a[1524],a[1525],a[1526],a[1527],a[1528],a[1529],a[1530],a[1531],a[1532],a[1533],a[1534],a[1535],a[1536],a[1537],a[1538],a[1539],a[1540],a[1541],a[1542],a[1543],a[1544],a[1545],a[1546],a[1547],a[1548],a[1549],a[1550],a[1551],a[1552],a[1553],a[1554],a[1555],a[1556],a[1557],a[1558],a[1559],a[1560],a[1561],a[1562],a[1563],a[1564],a[1565],a[1566],a[1567],a[1568],a[1569],a[1570],a[1571],a[1572],a[1573],a[1574],a[1575],a[1576],a[1577],a[1578],a[1579],a[1580],a[1581],a[1582],a[1583],a[1584],a[1585],a[1586],a[1587],a[1588],a[1589],a[1590],a[1591],a[1592],a[1593],a[1594],a[1595],a[484],a[1596],a[1597],a[1598],a[1599],a[1600],a[1601],a[1602],a[1603],a[1604],a[1605],a[1606],a[1607],a[1608],a[1609],a[1610],a[1611],a[1612],a[1613],a[1614],a[1615],a[1616],a[1617],a[1618],a[1619],a[1620],a[1621],a[1622],a[1623],a[1624],a[1625],a[1626],a[1627],a[1628],a[1629],a[1630],a[1631],a[1632],a[1633],a[1634],a[1635],a[1636],a[1637],a[1638],a[1639],a[1640],a[1641],a[1642],a[1643],a[1644],a[1645],a[1646],a[1647],a[1648],a[1649],a[1650],a[1651],a[1652],a[1653],a[1654],a[1655],a[1656],a[1657],a[1658],a[1659],a[1660],a[1661],a[1662],a[1663],a[1664],a[1665],a[1666],a[1667],a[1668],a[1669],a[1670],a[1671],a[1672],a[1673],a[1674],a[1675],a[1676],a[1677],a[1678],a[482],a[483],a[1679],a[485]],[a[249],a[250],a[251],a[252],a[253],a[254],a[255],a[256],a[257],a[258],a[259],a[260],a[261],a[262],a[263],a[264],a[265],a[266],a[267],a[268],a[269],a[270],a[271],a[272],a[273],a[274],a[275],a[276],a[277],a[278],a[279],a[280],a[281],a[282],a[283],a[284],a[285],a[286],a[287],a[288],a[289],a[290],a[291],a[292],a[293],a[294],a[295],a[296],a[297],a[298],a[299],a[300],a[301],a[302],a[303],a[304],a[305],a[306],a[307],a[308],a[309],a[310],a[311],a[312],a[313],a[314],a[315],a[316],a[317],a[318],a[319],a[320],a[321],a[322],a[323],a[324],a[325],a[326],a[327],a[328],a[329],a[330],a[331],a[332],a[333],a[334],a[335],a[336],a[337],a[338],a[339],a[340],a[341],a[342],a[343],a[344],a[345],a[346],a[347],a[348],a[349],a[350],a[351],a[352],a[353],a[354],a[355],a[356],a[357],a[358],a[359],a[360],a[361],a[362],a[363],a[364],a[365],a[366],a[367],a[368],a[369],a[370],a[371],a[372],a[373],a[374],a[375],a[1680],a[377],a[378],a[379],a[380],a[381],a[382],a[383],a[384],a[385],a[386],a[387],a[388],a[389],a[390],a[391],a[392],a[393],a[394],a[395],a[396],a[397],a[398],a[399],a[400],a[401],a[402],a[403],a[404],a[405],a[406],a[407],a[408],a[409],a[410],a[411],a[412],a[413],a[414],a[415],a[416],a[417],a[418],a[419],a[420],a[421],a[422],a[423],a[424],a[425],a[426],a[427],a[428],a[429],a[430],a[431],a[432],a[433],a[434],a[435],a[436],a[437],a[438],a[439],a[440],a[441],a[442],a[443],a[444],a[445],a[446],a[447],a[448],a[449],a[450],a[451],a[452],a[453],a[454],a[455],a[456],a[457],a[458],a[459],a[460],a[461],a[462],a[463],a[464],a[465],a[466],a[467],a[468],a[469],a[470],a[471],a[472],a[473],a[474],a[475],a[476],a[477],a[478],a[479],a[480],a[482],a[483],a[1681],a[485]],[a[1682],a[1683]],[a[1682],a[500]],[a[1684],a[500]],{"decimal":a[509],"group":a[508],"nan":a[1685],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[1686],"GyMMMd":a[1687],"GyMMMEd":a[1688],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1689],"MEd":a[1690],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1691],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[1693],"yMEd":a[1694],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[1695],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[1696],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[1697]},[a[1698],a[1699],a[1350],a[1700],a[1352],a[1701],a[1702],a[1703],a[1410],a[1704],a[1705],a[1706]],[a[1707],a[1708],a[1709],a[1710],a[1352],a[1711],a[1712],a[1713],a[1714],a[1715],a[1716],a[1717]],[a[117],a[111],a[112],a[113],a[114],a[115],a[116]],[a[1718],a[1719],a[1720],a[1721],a[1722],a[1723],a[1724]],[a[1725],a[1726],a[1727],a[1728],a[1729],a[1730],a[1731]],[a[1732],a[1733],a[1734],a[1735]],[a[1736],a[1737],a[1738],a[1739]],{"decimal":a[509],"group":a[508],"nan":a[510],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"AZN":a[1740],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1689],"MEd":a[1741],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1742],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[1693],"yMEd":a[1743],"yMMM":a[1744],"yMMMd":a[617],"yMMMEd":a[1745],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[1746],"yMMMMd":a[1747],"yMMMd":a[617],"yMd":a[1697]},[a[1748],a[1749],a[1750],a[1751],a[1752],a[1753],a[1754],a[1755],a[1756],a[1757],a[1758],a[1759]],[a[1760],a[1761],a[1762],a[1763],a[1764],a[1765],a[1766]],{"AUD":a[515],"AZN":a[1740],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[44],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},[a[621],a[1767],a[1767],a[1767],a[1767],a[1768],a[620],a[1768],a[17],a[1769],a[1767],a[626]],[a[1770],a[1771],a[1772],a[1773],a[1774],a[1775],a[1776],a[1777],a[1778],a[1779],a[1352],a[1780]],[a[1781],a[1782],a[1783],a[1784],a[1785],a[1786],a[1787],a[1788],a[1789],a[1790],a[1791],a[1792]],[a[620],a[620],a[653],a[1793],a[1767],a[621],a[1794]],[a[1795],a[1796],a[1797],a[1798],a[1799],a[1800],a[1801]],[a[1802],a[1803],a[1804],a[1805],a[1806],a[1807],a[1808]],{"am":a[1809],"pm":a[1810]},[a[1811],a[1812],a[189],a[190]],[a[1813],a[1814],a[189],a[190]],{"positivePattern":a[1815],"negativePattern":a[1816]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[1818],"EHm":a[1819],"Ehms":a[1820],"EHms":a[1821],"Gy":a[24],"GyMMM":a[1822],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[1823],"H":a[29],"hm":a[1824],"Hm":a[1825],"hms":a[1826],"Hms":a[1827],"hmsv":a[1828],"Hmsv":a[1829],"hmv":a[1830],"Hmv":a[1831],"M":a[38],"Md":a[1832],"MEd":a[1833],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[1835],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[1839],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[1840],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[1837],"yMd":a[1841]},{"hmmsszzzz":a[1842],"hmsz":a[1843],"hms":a[1827],"hm":a[1825]},[a[1844],a[1845],a[1844],a[1846],a[1847],a[1848],a[1845],a[1849],a[1850],a[1846],a[1845],a[1844]],[a[1851],a[1852],a[1853],a[1854],a[1855],a[1856],a[1857],a[1858],a[1859],a[1860],a[1861],a[1862]],[a[1863],a[1864],a[1865],a[1866],a[1855],a[1867],a[1868],a[1869],a[1870],a[1871],a[1872],a[1873]],[a[1874],a[1875],a[1876],a[1844],a[1848],a[1875],a[1844]],[a[1877],a[1878],a[1879],a[1880],a[1881],a[1882],a[1883]],[a[1884],a[1885],a[1886],a[1887],a[1888],a[1889],a[1890]],{"am":a[1891],"pm":a[1892]},[a[1893],a[1894],a[189],a[190]],[a[1895],a[1896],a[189],a[1897]],{"AUD":a[515],"BYR":a[1898],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"RUB":a[1899],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[61],a[62],a[63],a[1900],a[63],a[61],a[61],a[66],a[65],a[66],a[67],a[68]],[a[69],a[70],a[1299],a[1901],a[558],a[74],a[75],a[1902],a[77],a[1301],a[79],a[1903]],[a[1302],a[1303],a[1304],a[1904],a[558],a[1306],a[1307],a[1905],a[1309],a[1310],a[1311],a[1906]],[a[1907],a[1908],a[1909],a[1910],a[1911],a[1912],a[1913]],{"am":a[1914],"pm":a[1915]},[a[1916],a[1917],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"ZMW":a[707]},[a[481],a[574],a[68],a[92],a[481],a[65],a[65],a[67],a[92],a[707],a[707],a[707]],[a[1918],a[1919],a[1920],a[1921],a[1922],a[1923],a[1924],a[1925],a[1926],a[1927],a[1928],a[1929]],[a[1930],a[1931],a[1932],a[1933],a[1934],a[1935],a[1936],a[1937],a[1938],a[1939],a[1940],a[1941]],[a[63],a[61],a[481],a[481],a[481],a[93],a[61]],[a[1942],a[1919],a[1943],a[1944],a[1945],a[1946],a[1947]],[a[1948],a[1949],a[1950],a[1951],a[1952],a[1953],a[1954]],{"am":a[1955],"pm":a[1956]},[a[1957],a[1958],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[1963],"Gy":a[1964],"GyMMM":a[1965],"GyMMMd":a[1966],"GyMMMEd":a[1967],"GyMMMM":a[1968],"GyMMMMd":a[1969],"GyMMMMEd":a[1970],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1971],"MEd":a[1972],"MMM":a[1973],"MMMd":a[1971],"MMMEd":a[1972],"MMMM":a[1974],"MMMMd":a[811],"MMMMdd":a[811],"MMMMEd":a[1834],"ms":a[610],"y":a[1975],"yM":a[1976],"yMd":a[1977],"yMEd":a[1978],"yMMM":a[1979],"yMMMd":a[1977],"yMMMEd":a[1978],"yMMMM":a[1980],"yMMMMd":a[1981],"yMMMMEd":a[1982],"yQQQ":a[1983],"yQQQQ":a[1984]},{"yMMMMEEEEd":a[1985],"yMMMMd":a[1981],"yMMMd":a[1977],"yMd":a[1986]},[a[1987],a[1988],a[1847],a[1876],a[1847],a[1989],a[1989],a[1876],a[1844],a[1990],a[1874],a[1991]],[a[1992],a[1993],a[1750],a[1994],a[1752],a[1995],a[1996],a[1997],a[1998],a[1999],a[2000],a[2001]],[a[2002],a[2003],a[1750],a[2004],a[1752],a[1995],a[1996],a[1755],a[2005],a[2006],a[2007],a[2008]],[a[1874],a[1875],a[1850],a[1844],a[1848],a[1875],a[1844]],[a[1877],a[1878],a[2009],a[1880],a[2010],a[1882],a[1883]],[a[2011],a[2012],a[2013],a[2014],a[2015],a[2016],a[2017]],{"am":a[2018],"pm":a[2019]},[a[2020],a[2021],a[2022],a[2023]],[a[2024],a[2025],a[2026],a[2027]],[a[2028],a[2029],a[2030],a[2031],a[2032],a[2033],a[2034],a[2035],a[2036],a[2037],a[2038],a[2039],a[2040],a[2041]],[a[2042],a[2043],a[2044],a[2045],a[2046],a[2047],a[2048],a[2049],a[2050],a[2051],a[2052],a[2053]],[a[2054],a[2055],a[2056],a[2057],a[2058],a[2059],a[2060],a[2061],a[2062],a[2063],a[2064],a[2065]],{"BGN":a[2066],"EUR":a[519],"USD":a[2067],"XAF":a[531],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[63],"Md":a[608],"MEd":a[1253],"MMd":a[2068],"MMdd":a[2069],"MMM":a[2070],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMM":a[2071],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[2072],a[62],a[63],a[64],a[63],a[2072],a[2072],a[2073],a[65],a[2074],a[67],a[68]],[a[2075],a[1349],a[1350],a[2076],a[2077],a[2078],a[2079],a[2080],a[2081],a[2082],a[2083],a[2084]],[a[2085],a[2086],a[2087],a[2088],a[2077],a[2089],a[2090],a[2080],a[2091],a[2092],a[2093],a[2094]],[a[707],a[67],a[92],a[64],a[64],a[61],a[65]],[a[2095],a[2096],a[2097],a[2098],a[2099],a[2100],a[2101]],[a[2102],a[2103],a[2104],a[2105],a[2106],a[2107],a[2108]],[a[2109],a[2110],a[189],a[190]],[a[2111],a[2112],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[2113],"GyMMMEd":a[2114],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[2115],"MMdd":a[541],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMM":a[546],"yMMM":a[50],"yMMMd":a[617],"yMMMEd":a[2116],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[2117],"yMMMMd":a[1747],"yMMMd":a[617],"yMd":a[1345]},[a[2118],a[2119],a[2120],a[2121],a[1266],a[1267],a[2122],a[2123],a[2124],a[2125],a[2126],a[2127]],[a[2128],a[2129],a[2130],a[2131],a[1266],a[1267],a[1268],a[2132],a[2133],a[2134],a[2135],a[2136]],[a[2137],a[2138],a[2139],a[2140],a[2141],a[2142],a[2143]],[a[2144],a[1282],a[1283],a[1284],a[2145],a[2146],a[1287]],[a[2147],a[2148],a[2149],a[2150],a[2151],a[2152],a[2153]],{"am":a[109],"pm":a[2154]},[a[2155],a[2156],a[2157],a[2158]],[a[2159],a[2160],a[2161],a[2162],a[2163],a[2164],a[2165],a[2166],a[2167],a[2168],a[2169],a[2170]],[a[2171],a[2172],a[2173],a[2174],a[2175],a[2176],a[2177],a[2178],a[2179],a[2180],a[2181],a[2182]],[a[2183]],[a[2184],a[2185],a[2186],a[2187],a[2188],a[2189],a[2190],a[2191],a[2192],a[2193],a[2194],a[2195]],[a[2196]],{"decimal":a[508],"group":a[509],"nan":a[2197],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BDT":a[2198],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[2199],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[1253],"MMM":a[41],"MMMd":a[2200],"MMMEd":a[2201],"MMMMd":a[2202],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMMM":a[2203],"yMMMd":a[2204],"yMMMEd":a[1258],"yMMMM":a[614],"yMMMMd":a[2205],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[2206],"yMMMMd":a[2205],"yMMMd":a[2204],"yMd":a[547]},[a[2207],a[2208],a[2209],a[2210],a[2211],a[2212],a[2213],a[2214],a[2215],a[2216],a[2217],a[2218]],[a[2219],a[2220],a[2221],a[2222],a[2223],a[2224],a[2225],a[2226],a[2227],a[2228],a[2229],a[2230]],[a[2231],a[2232],a[2233],a[2234],a[2235],a[2236],a[2237]],[a[2238],a[2239],a[2240],a[2241],a[2242],a[2243],a[2244]],[a[2245],a[2246],a[2247],a[2248],a[2249],a[2250],a[2251]],{"am":a[2252],"pm":a[2253]},[a[2254],a[2255],a[189],a[190]],{"decimal":a[508],"group":a[509],"nan":a[2256],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[524],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[1973],"Md":a[2069],"MEd":a[2259],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[2260],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},[a[2261],a[2262],a[2263],a[2264],a[2265],a[2266],a[2267],a[2268],a[2269],a[120],a[121],a[122]],[a[2270],a[2271],a[2272],a[2273],a[2274],a[2275],a[2276],a[2277],a[2278],a[2279],a[2280],a[2281]],[a[2282],a[2283],a[2284],a[2285],a[2274],a[2286],a[2287],a[2277],a[2288],a[2279],a[2280],a[2289]],[a[2290],a[38],a[2291],a[2292],a[708],a[2293],a[2294]],[a[2295],a[2296],a[2297],a[2298],a[2299],a[2300],a[2301]],[a[2295],a[2296],a[2284],a[2302],a[2299],a[2303],a[2304]],{"am":a[2305],"pm":a[2306]},[a[2307],a[2308],a[189],a[190]],[a[2309],a[2310],a[189],a[190]],[a[2311],a[2312]],[a[2313],a[2314]],{"AUD":a[2315],"CAD":a[2316],"EUR":a[519],"GBP":a[2317],"HKD":a[2318],"INR":a[523],"MXN":a[526],"NZD":a[2319],"USD":a[2320],"XAF":a[531],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[2321],"GyMMMd":a[26],"GyMMMEd":a[27],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[2322],"MMMEd":a[43],"MMMMd":a[44],"MMMMEd":a[677],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[547],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[2323],a[2324],a[2325],a[2326],a[2327],a[2328],a[2328],a[2329],a[2330],a[2331],a[2332],a[2333]],[a[2334],a[2335],a[2336],a[2337],a[2327],a[2338],a[2339],a[2340],a[2341],a[2342],a[2343],a[2344]],[a[2345],a[2346],a[2347],a[2348],a[2349],a[2350],a[2350]],[a[2351],a[2352],a[2353],a[2354],a[2355],a[2356],a[2357]],[a[2358],a[2359],a[2360],a[2361],a[2362],a[2363],a[2364]],{"am":a[2365],"pm":a[2366]},[a[2367],a[2368],a[189],a[190]],[a[2369],a[2370],a[2371],a[2372],a[2373],a[2374],a[2375],a[2376],a[2377],a[2378],a[2379],a[2380]],{"d":a[17],"E":a[18],"Ed":a[2382],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[2383],"GyMMM":a[2384],"GyMMMd":a[2385],"GyMMMEd":a[2386],"h":a[28],"H":a[29],"hm":a[2387],"Hm":a[31],"hms":a[2388],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2389],"MEd":a[2390],"MMdd":a[2391],"MMM":a[41],"MMMd":a[2392],"MMMEd":a[2393],"MMMMd":a[2394],"MMMMEd":a[2395],"ms":a[45],"y":a[2396],"yM":a[2397],"yMd":a[2398],"yMEd":a[2399],"yMM":a[2400],"yMMM":a[2401],"yMMMd":a[2402],"yMMMEd":a[2403],"yMMMM":a[2404],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[2405],"yMMMMd":a[2406],"yMMMd":a[2407],"yMd":a[2408]},[a[1794],a[625],a[1767],a[2409],a[1767],a[1794],a[1794],a[2409],a[623],a[2410],a[620],a[17]],[a[2411],a[1349],a[1350],a[1700],a[2412],a[2413],a[2414],a[2415],a[2416],a[1704],a[2417],a[2418]],[a[2419],a[2420],a[1709],a[2421],a[2412],a[2422],a[2423],a[2424],a[2425],a[2426],a[2427],a[2428]],[a[67],a[1347],a[2073],a[65],a[2429],a[1347],a[65]],[a[2430],a[2431],a[2432],a[2433],a[2434],a[2435],a[2436]],[a[2437],a[2438],a[2439],a[2440],a[2441],a[2442],a[2443]],{"am":a[2444],"pm":a[2445]},[a[2446],a[2447],a[2448],a[2449]],[a[2450],a[2451],a[2452],a[2449]],{"BAM":a[1330],"EUR":a[519],"HRK":a[2453],"INR":a[523],"JPY":a[524],"KRW":a[525],"RSD":a[2454],"THB":a[601],"TWD":a[528],"VND":a[530],"XAF":a[531],"XOF":a[533]},{"d":a[17],"E":a[18],"Ed":a[2455],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[2383],"GyMMM":a[2384],"GyMMMd":a[2385],"GyMMMEd":a[2386],"h":a[1823],"H":a[29],"hm":a[2387],"Hm":a[31],"hms":a[2388],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2389],"MEd":a[2390],"MMM":a[41],"MMMd":a[2392],"MMMEd":a[2393],"MMMMd":a[44],"ms":a[45],"y":a[2396],"yM":a[2397],"yMd":a[2398],"yMEd":a[2399],"yMMM":a[2401],"yMMMd":a[2402],"yMMMEd":a[2403],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[2405],"yMMMMd":a[2406],"yMMMd":a[2398],"yMd":a[2456]},[a[2457],a[1988],a[1847],a[1876],a[1847],a[2457],a[2457],a[1876],a[1844],a[1990],a[1874],a[1991]],[a[2458],a[2459],a[2460],a[1994],a[2461],a[2462],a[2463],a[1997],a[1998],a[1999],a[2464],a[2465]],[a[2466],a[2467],a[1750],a[2004],a[2461],a[2468],a[2469],a[1755],a[2470],a[2471],a[2472],a[2473]],[a[1874],a[1875],a[2474],a[1844],a[1848],a[1875],a[1844]],[a[2475],a[2476],a[2477],a[2478],a[2479],a[2480],a[2481]],[a[2482],a[2483],a[2484],a[2485],a[2486],a[2487],a[1890]],[a[2488]],{"am":a[2489],"pm":a[2490]},[a[2491],a[2492],a[2493],a[2494],a[2495],a[2496],a[2497],a[2498],a[2499],a[2500],a[2501],a[2502],a[2503]],[a[2504],a[2505],a[2506],a[2507],a[2508],a[2509],a[2510],a[2511],a[2512],a[2513],a[2514],a[2515],a[2516]],[a[2517],a[2518],a[189],a[190]],[a[2519],a[2520],a[189],a[190]],[a[2521],a[2522],a[189],a[190]],[a[2523],a[2524],a[2525],a[2526],a[2527],a[2528],a[2529],a[2530],a[2531],a[2532],a[2533],a[2534],a[2535],a[2536]],[a[2537],a[2538],a[2539],a[2540],a[2541],a[2542],a[2543],a[2544],a[2545],a[2546],a[2547],a[2548]],[a[2549]],[a[2550],a[2551],a[2552],a[2553],a[2554],a[2555],a[2556],a[2557],a[2558],a[2063],a[2559],a[2560]],[a[2561]],[a[2562],a[2563],a[2564],a[2565],a[2566],a[2567],a[2568],a[2569],a[2570],a[2571],a[2572],a[2573],a[2574],a[2575],a[2576],a[2577],a[2578],a[2579],a[2580],a[2581],a[2582],a[2583],a[2584],a[2585],a[2586],a[2587],a[2588],a[2589],a[2590],a[2591],a[2592],a[2593],a[2594],a[2595],a[2596],a[2597],a[2598],a[2599],a[2600],a[2601],a[2602],a[2603],a[2604],a[2605],a[2606],a[2607],a[2608],a[2609],a[2610],a[2611],a[2612],a[2613],a[2614],a[2615],a[2616],a[2617],a[2618],a[2619],a[2620],a[2621],a[2622],a[2623],a[2624],a[2625],a[2626],a[2627],a[2628],a[2629],a[2630],a[2631],a[2632],a[2633],a[2634],a[2635],a[2636],a[2637],a[2638],a[2639],a[2640],a[2641],a[2642],a[2643],a[2644],a[2645],a[2646],a[2647],a[2648],a[2649],a[2650],a[2651],a[2652],a[2653],a[2654],a[2655],a[2656],a[2657],a[2658],a[2659],a[2660],a[2661],a[2662],a[2663],a[2664],a[2665],a[2666],a[2667],a[2668],a[2669],a[2670],a[2671],a[2672],a[2673],a[2674],a[2675],a[2676],a[2677],a[2678],a[2679],a[2680],a[2681],a[2682],a[2683],a[2684],a[2685],a[2686],a[2687],a[2688],a[2689],a[2690],a[2691],a[2692],a[2693],a[2694],a[2695],a[2696],a[2697],a[2698],a[2699],a[2700],a[2701],a[2702],a[2703],a[2704],a[2705],a[2706],a[2707],a[2708],a[2709],a[2710],a[2711],a[2712],a[2713],a[2714],a[2715],a[2716],a[2717],a[2718],a[2719],a[2720],a[2721],a[2722],a[2723],a[2724],a[2725],a[2726],a[2727],a[2728],a[2729],a[2730],a[2731],a[2732],a[2733],a[2734],a[2735],a[2736],a[2737],a[2738],a[2739],a[2740],a[2741],a[2742],a[2743],a[2744],a[2745],a[2746],a[2747],a[2748],a[2749],a[2750],a[2751],a[2752],a[2753],a[2754],a[2755],a[2756],a[2757],a[2758],a[2759],a[2760],a[2761],a[2762],a[2763],a[2764],a[2765],a[2766],a[2767],a[2768],a[2769],a[2770],a[2771],a[2772],a[2773],a[2774],a[2775],a[2776],a[2777],a[2778],a[2779],a[2780],a[2781],a[2782],a[2783],a[2784],a[2785],a[2786],a[2787],a[2788],a[2789],a[2790],a[2791],a[2792],a[2793],a[2794],a[2795],a[2796],a[2797]],[a[2798],a[2799],a[2800],a[2801],a[2802],a[2803],a[2804],a[2805],a[2806],a[2807],a[2808],a[2809]],[a[2810],a[2811]],{"AUD":a[515],"BAM":a[2812],"BRL":a[516],"CAD":a[517],"CNY":a[518],"CZK":a[2813],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PLN":a[2814],"RSD":a[2815],"TRY":a[2816],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[2817],"Ehms":a[22],"EHms":a[2818],"Gy":a[24],"GyMMM":a[1822],"GyMMMd":a[1338],"GyMMMEd":a[1339],"GyMMMM":a[2819],"GyMMMMd":a[2820],"GyMMMMEd":a[2821],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[2822],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[1342],"yMMMMd":a[1344],"yMMMMEd":a[2823],"yQQQ":a[54],"yQQQQ":a[55]},[a[2824],a[2825],a[2826],a[2827],a[2828],a[2829],a[2830],a[2831],a[2832],a[2833],a[2834],a[2835]],[a[2836],a[2837],a[2838],a[2839],a[2840],a[2841],a[2842],a[2843],a[2844],a[2845],a[2846],a[2847]],[a[2848],a[2849],a[2850],a[1363],a[2851],a[2852],a[2853],a[2854],a[2855],a[2856],a[2857],a[2858]],[a[2859],a[2860],a[2861],a[2862],a[2863],a[2864],a[2865]],[a[2866],a[2867],a[2868],a[2869],a[2870],a[2871],a[2872]],[a[2873],a[2874],a[2875],a[2876],a[2877],a[2878],a[2879]],[a[2880]],{"am":a[2881],"pm":a[2882]},[a[1433],a[1434],a[2883],a[2884]],[a[2885],a[2886],a[2887],a[2888]],{"AUD":a[802],"CNY":a[524],"ESP":a[2889],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"NZD":a[527],"THB":a[601],"TWD":a[528],"VND":a[530],"XAF":a[531],"XOF":a[533],"XPF":a[534]},{"AUD":a[802],"CNY":a[524],"ESP":a[2889],"EUR":a[519],"FRF":a[62],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"NZD":a[527],"THB":a[601],"TWD":a[528],"VND":a[530],"XAF":a[531],"XOF":a[533],"XPF":a[534]},[a[2890],a[1993],a[2460],a[1994],a[1752],a[2891],a[2892],a[1997],a[2893],a[1999],a[2894],a[2001]],[a[2895],a[2896],a[1750],a[2897],a[1752],a[2898],a[2899],a[1755],a[2900],a[2901],a[2902],a[2903]],[a[2904],a[2905],a[2906],a[2907],a[2908],a[2909],a[2910]],{"decimal":a[508],"group":a[509],"nan":a[2911],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"RUB":a[1899],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[2912],a[2913],a[2914],a[2915],a[2916],a[2917],a[2918],a[2919],a[2920],a[2921],a[2922],a[2923]],[a[2924],a[2925],a[2926],a[2927],a[2928],a[2929],a[2930],a[2931],a[2932],a[2933],a[2934],a[2935]],[a[65],a[707],a[603],a[65],a[67],a[92],a[63]],[a[2936],a[2937],a[2938],a[2939],a[2940],a[2941],a[2942]],[a[2943],a[2944],a[2945],a[2946],a[2947],a[2948],a[2949]],[a[2950],a[2951],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"UGX":a[2952],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[26],"GyMMMEd":a[27],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[48],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[51],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[2953],a[2954],a[2955],a[2954],a[2955],a[2956],a[2957],a[2958],a[2959],a[2959],a[2960],a[2961]],[a[2962],a[2963],a[2964],a[2965],a[2966],a[2967],a[2968],a[2969],a[2970],a[2971],a[2972],a[2973]],[a[2974],a[2975],a[2976],a[2977],a[2978],a[2979],a[2980],a[2981],a[2982],a[2983],a[2984],a[2985]],[a[2986],a[2987],a[2988],a[2989],a[2960],a[2990],a[2953]],[a[2991],a[2992],a[2993],a[2994],a[2995],a[2996],a[2997]],[a[2998],a[2999],a[3000],a[3001],a[3002],a[3003],a[3004]],{"am":a[3005],"pm":a[3006]},[a[3007],a[3008],a[189],a[190]],[a[3009],a[3010],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"decimal":a[1184],"group":a[1185],"nan":a[510],"plusSign":a[1187],"minusSign":a[1188],"percentSign":a[1189],"infinity":a[514]},{"decimal":a[508],"group":a[509],"nan":a[510],"plusSign":a[1191],"minusSign":a[1192],"percentSign":a[513],"infinity":a[514]},{"d":a[3011],"E":a[18],"Ed":a[3012],"Ehm":a[20],"EHm":a[2817],"Ehms":a[22],"EHms":a[2818],"Gy":a[24],"GyMMM":a[3013],"GyMMMd":a[3014],"GyMMMEd":a[3015],"GyMMMMd":a[3016],"GyMMMMEd":a[3017],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[3018],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[3020],"MEd":a[3021],"MMM":a[41],"MMMd":a[3020],"MMMEd":a[3021],"MMMMd":a[2394],"MMMMEd":a[3022],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[3023],"yMEd":a[3024],"yMMM":a[1840],"yMMMd":a[3023],"yMMMEd":a[3024],"yMMMM":a[1840],"yMMMMd":a[3025],"yMMMMEd":a[3026],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3027],"yMMMMd":a[3025],"yMMMd":a[3023],"yMd":a[1697]},[a[3028],a[3029],a[3030],a[3031],a[3032],a[3033],a[3034],a[3035],a[3036],a[3037],a[3038],a[3039]],[a[3040],a[3041],a[3042],a[3043],a[3044],a[3045],a[3046],a[3047],a[3048],a[3049],a[3050],a[3051]],[a[67],a[1347],a[3052],a[65],a[2429],a[1347],a[65]],[a[3053],a[3054],a[3055],a[3056],a[3057],a[3058],a[3059]],[a[3060],a[3061],a[3062],a[3063],a[3064],a[3065],a[3066]],{"am":a[3067],"pm":a[3068]},[a[3069],a[3070],a[189],a[190]],[a[3071],a[3072],a[189],a[190]],[a[3073],a[598]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"CSK":a[3074],"CZK":a[3075],"EUR":a[519],"GBP":a[520],"HKD":a[521],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"XAF":a[531],"XCD":a[532],"XEU":a[3076],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQ":a[3079],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3080]},[a[1313],a[3081],a[63],a[1900],a[63],a[63],a[2293],a[64],a[63],a[481],a[92],a[3082]],[a[3083],a[3084],a[3085],a[3086],a[3087],a[3088],a[3089],a[3090],a[3091],a[3092],a[3093],a[3094]],[a[3095],a[3096],a[3097],a[3086],a[3087],a[3098],a[3099],a[3090],a[3091],a[3100],a[3101],a[3102]],[a[65],a[3103],a[63],a[63],a[1313],a[2293],a[65]],[a[2295],a[3104],a[3085],a[3105],a[3106],a[3107],a[3108]],[a[3109],a[3110],a[3111],a[3112],a[3113],a[3114],a[3115]],[a[3116],a[66],a[189],a[190]],[a[3117],a[2833],a[189],a[190]],[a[3118],a[3119],a[3120],a[3121]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[3011],"E":a[18],"Ed":a[3123],"Ehm":a[3124],"EHm":a[1819],"Ehms":a[3125],"EHms":a[1821],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3127],"h":a[28],"H":a[29],"hm":a[3128],"Hm":a[1825],"hms":a[3129],"Hms":a[1827],"hmsv":a[3130],"Hmsv":a[1829],"hmv":a[3131],"Hmv":a[1831],"M":a[63],"Md":a[608],"MEd":a[609],"MMdd":a[2069],"MMM":a[2070],"MMMd":a[3132],"MMMEd":a[3133],"MMMMd":a[2394],"MMMMEd":a[3022],"ms":a[1835],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMM":a[2071],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3135],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3136],"yMMMMd":a[3025],"yMMMd":a[3134],"yMd":a[738]},[a[3137],a[3138],a[3139],a[3140],a[2412],a[3141],a[2842],a[3142],a[3143],a[3144],a[2846],a[3145]],[a[2419],a[2420],a[3146],a[2421],a[2412],a[2422],a[2423],a[2424],a[3147],a[3148],a[3149],a[3150]],[a[65],a[63],a[92],a[66],a[92],a[62],a[38]],[a[3151],a[3152],a[3153],a[3154],a[3155],a[3156],a[3157]],[a[3158],a[3159],a[3160],a[3161],a[3162],a[3163],a[3164]],[a[3165],a[3166],a[3167],a[3168]],[a[3169],a[3170],a[3171],a[3172]],[a[3169],a[3170],a[3173],a[3174]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DKK":a[3175],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"hmmsszzzz":a[3176],"hmsz":a[3177],"hms":a[3129],"hm":a[3128]},[a[1313],a[707],a[707],a[707],a[707],a[707],a[63],a[93],a[1313],a[1313],a[1313],a[1313]],[a[3178],a[3179],a[3180],a[3181],a[3182],a[3183],a[3184],a[3185],a[3186],a[3187],a[3188],a[3189]],[a[3190],a[3191],a[3192],a[3193],a[3194],a[3195],a[3196],a[3197],a[3198],a[3199],a[3200],a[3201]],[a[61],a[61],a[707],a[707],a[707],a[707],a[67]],[a[3202],a[3203],a[3179],a[3180],a[3181],a[3182],a[3204]],[a[3205],a[3206],a[3207],a[3208],a[3209],a[3210],a[3211]],{"am":a[3212],"pm":a[3213]},[a[3214],a[671],a[189],a[190]],[a[3215],a[3216],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KES":a[3217],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[2455],"Ehm":a[20],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3219],"h":a[28],"H":a[3220],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3221],"MEd":a[3222],"MMd":a[3223],"MMdd":a[2389],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[2394],"MMMMEd":a[2395],"ms":a[45],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMM":a[1692],"yMMdd":a[1693],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3225],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3226],"yMMMMd":a[3025],"yMMMd":a[1693],"yMd":a[1697]},[a[554],a[555],a[3227],a[557],a[3087],a[1306],a[3228],a[561],a[562],a[563],a[564],a[3229]],[a[3230],a[3231],a[3227],a[84],a[3087],a[1306],a[3228],a[87],a[88],a[572],a[90],a[3232]],[a[65],a[63],a[68],a[63],a[68],a[62],a[65]],[a[575],a[3233],a[577],a[3234],a[579],a[3235],a[581]],[a[3236],a[3237],a[3238],a[3239],a[3240],a[3241],a[3242]],{"am":a[3243],"pm":a[3244]},[a[3245],a[3246],a[3247],a[3248]],[a[3245],a[3246],a[3249],a[3250]],{"ATS":a[3251],"AUD":a[802],"BGM":a[3252],"BGO":a[3253],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DEM":a[3254],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[3255],a[555],a[3227],a[557],a[3087],a[1306],a[3228],a[561],a[562],a[563],a[564],a[3229]],[a[3256],a[3231],a[3227],a[84],a[3087],a[1306],a[3228],a[87],a[88],a[572],a[90],a[3232]],{"positivePattern":a[1182],"negativePattern":a[3257]},{"decimal":a[508],"group":a[3258],"nan":a[510],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"ATS":a[3251],"AUD":a[802],"BGM":a[3252],"BGO":a[3253],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DEM":a[3254],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"ATS":a[3251],"AUD":a[802],"BGM":a[3252],"BGO":a[3253],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DEM":a[3254],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"LUF":a[62],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[3259],a[62],a[63],a[64],a[63],a[3259],a[3259],a[2073],a[65],a[66],a[67],a[68]],[a[3260],a[3261],a[71],a[3262],a[3263],a[3264],a[3265],a[3266],a[3267],a[1301],a[3268],a[3269]],[a[3270],a[3271],a[3272],a[3273],a[3263],a[3274],a[3275],a[3266],a[3276],a[3277],a[3278],a[3279]],[a[481],a[92],a[92],a[38],a[63],a[2072],a[65]],[a[1318],a[3280],a[3281],a[3282],a[3283],a[3284],a[3285]],[a[3286],a[3287],a[3288],a[3289],a[1325],a[3290],a[3291]],{"am":a[3292],"pm":a[3293]},[a[3294],a[3295],a[189],a[190]],[a[3296],a[3297],a[189],a[190]],{"decimal":a[508],"group":a[599],"nan":a[510],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"d":a[17],"E":a[18],"Ed":a[2455],"Ehm":a[1960],"EHm":a[3298],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3219],"h":a[28],"H":a[3299],"hm":a[30],"Hm":a[3300],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3221],"MEd":a[3222],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3225],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3226],"yMMMMd":a[3025],"yMMMd":a[1837],"yMd":a[1841]},[a[3137],a[3138],a[3301],a[3140],a[3302],a[3141],a[2842],a[3303],a[3143],a[3144],a[3304],a[3145]],[a[3305],a[3306],a[3307],a[3308],a[3309],a[3310],a[3311],a[3312],a[3313],a[3314],a[3315],a[3316]],[a[620],a[3317],a[3318],a[623],a[623],a[3317],a[623]],[a[1776],a[3319],a[3320],a[3321],a[3322],a[3323],a[3324]],[a[3325],a[3326],a[3327],a[3328],a[3329],a[3330],a[3066]],{"am":a[3331],"pm":a[3332]},[a[3333],a[3334],a[3335],a[3336]],[a[3337],a[3338],a[3339],a[3340]],{"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PLN":a[3341],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[611]},[a[17],a[1793],a[623],a[17],a[3342],a[3342],a[1767],a[17],a[620],a[1767],a[622],a[3342]],[a[3343],a[3344],a[3345],a[3346],a[3347],a[3348],a[3349],a[3350],a[3351],a[1352],a[3352],a[3353]],[a[3354],a[3355],a[3356],a[3357],a[3358],a[3359],a[3360],a[3361],a[3362],a[3363],a[3364],a[3365]],[a[3342],a[1767],a[621],a[1767],a[1793],a[3366],a[3342]],[a[3367],a[3368],a[3369],a[3370],a[3371],a[3372],a[3373]],[a[3374],a[3375],a[3376],a[3377],a[3378],a[3379],a[3380]],{"am":a[3381],"pm":a[3382]},[a[3383],a[3384],a[189],a[190]],[a[3385],a[3386],a[189],a[190]],[a[65],a[62],a[63],a[64],a[63],a[65],a[65],a[2073],a[65],a[66],a[67],a[68]],[a[2294],a[3387],a[3388],a[3389],a[3263],a[2290],a[3390],a[3266],a[3391],a[3392],a[3393],a[3394]],[a[3395],a[3396],a[3397],a[3398],a[3399],a[3400],a[3401],a[3266],a[3402],a[3403],a[3404],a[3405]],[a[68],a[92],a[92],a[64],a[64],a[64],a[65]],[a[3406],a[3407],a[3408],a[3282],a[3409],a[3410],a[3411]],[a[3412],a[3413],a[3414],a[3415],a[3416],a[3417],a[3418]],[a[3419],a[3420],a[189],a[190]],[a[3421],a[3422],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[3423],"GyMMMd":a[606],"GyMMMEd":a[3424],"h":a[3425],"H":a[3426],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3427],"MEd":a[3428],"MMM":a[3429],"MMMd":a[3430],"MMMEd":a[3431],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[3432],"yMd":a[3433],"yMEd":a[3434],"yMMM":a[3435],"yMMMd":a[679],"yMMMEd":a[3436],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[3437],"yMMMMd":a[3438],"yMMMd":a[3439],"yMd":a[547]},{"hmmsszzzz":a[3440],"hmsz":a[3441],"hms":a[3442],"hm":a[3443]},[a[3444],a[3445],a[3446],a[114],a[3447],a[3448],a[3449],a[3450],a[119],a[3451],a[3452],a[3453]],[a[3444],a[3445],a[3446],a[3454],a[3447],a[3448],a[3449],a[3450],a[3455],a[3451],a[3452],a[122]],[a[3456],a[3457],a[3458],a[3459],a[3460],a[3461],a[3462],a[3463],a[3464],a[3465],a[3466],a[3467]],[a[2232],a[3468],a[2234],a[2235],a[3469],a[2237],a[2231]],[a[3470],a[3471],a[3472],a[3473],a[3474],a[3475],a[3476]],[a[2246],a[2247],a[2248],a[2249],a[2250],a[2251],a[2245]],{"am":a[3477],"pm":a[3478]},[a[3479],a[501]],{"decimal":a[508],"group":a[509],"nan":a[3480],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[3481]},{"AUD":a[802],"BRL":a[516],"BTN":a[3482],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"INR":a[523],"JPY":a[600],"KRW":a[3483],"MXN":a[526],"NZD":a[527],"THB":a[3484],"TWD":a[528],"USD":a[602],"VND":a[530],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[63],a[707],a[707],a[707],a[2293],a[2293],a[63],a[707],a[707],a[1313],a[1313],a[1313]],[a[3485],a[3486],a[3487],a[3181],a[3488],a[3489],a[3490],a[3491],a[3492],a[3187],a[3188],a[3493]],[a[3494],a[3495],a[3496],a[3497],a[3498],a[3499],a[3500],a[3501],a[3502],a[3503],a[3504],a[3505]],[a[707],a[67],a[67],a[67],a[64],a[63],a[67]],[a[3506],a[3507],a[3508],a[3509],a[3510],a[3511],a[3512]],[a[3513],a[3514],a[3515],a[3516],a[3517],a[3518],a[3519]],{"am":a[3520],"pm":a[3521]},[a[3522],a[3523],a[189],a[190]],[a[3524],a[3525],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[3527],"EHm":a[21],"Ehms":a[3528],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3529],"GyMMMEd":a[3530],"h":a[3531],"H":a[29],"hm":a[3532],"Hm":a[31],"hms":a[3533],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[3534],"MMMEd":a[3535],"MMMMd":a[3536],"MMMMEd":a[3537],"ms":a[3538],"y":a[46],"yM":a[47],"yMd":a[48],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[3539],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3540],"yMMMMd":a[3541],"yMMMd":a[3539],"yMd":a[58]},{"hmmsszzzz":a[3542],"hmsz":a[3543],"hms":a[3533],"hm":a[3532]},[a[17],a[17],a[622],a[2409],a[17],a[1767],a[623],a[17],a[2409],a[621],a[2409],a[17]],[a[3544],a[3545],a[3546],a[3547],a[3548],a[3549],a[3550],a[3551],a[3552],a[3553],a[3554],a[3555]],[a[3556],a[3557],a[3558],a[3559],a[3560],a[3561],a[3562],a[3563],a[3564],a[3565],a[3566],a[3567]],[a[621],a[17],a[1769],a[621],a[46],a[625],a[1767]],[a[3568],a[3569],a[3570],a[3571],a[3572],a[3573],a[3574]],[a[3575],a[3576],a[3577],a[3578],a[3579],a[3580],a[3581]],{"am":a[3582],"pm":a[3583]},[a[3584],a[3585],a[3586],a[3587]],[a[3588],a[3589],a[3586],a[3587]],{"decimal":a[508],"group":a[509],"nan":a[3590],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"GHS":a[729],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[1822],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[1345]},[a[3592],a[3593],a[3594],a[3595],a[3594],a[3592],a[3592],a[3595],a[3596],a[3597],a[3598],a[3599]],[a[3600],a[3601],a[3602],a[3603],a[3604],a[3605],a[3606],a[3607],a[3608],a[3609],a[3610],a[3611]],[a[3612],a[3613],a[3614],a[3615],a[3616],a[3617],a[3618],a[3619],a[3620],a[3621],a[3622],a[3623]],[a[3624],a[3599],a[3625],a[3625],a[3626],a[3626],a[3596]],[a[3627],a[3628],a[3629],a[3630],a[3631],a[3632],a[3633]],[a[3634],a[3635],a[3636],a[3637],a[3638],a[3639],a[3640]],{"am":a[3641],"pm":a[3642]},[a[3643],a[3644],a[3645],a[3646]],[a[3647],a[3648],a[3649],a[3650]],[a[3651],a[598]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"GRD":a[3652],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[529],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[3655],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[3656],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[3657],"yMMMd":a[3658],"yMd":a[1345]},[a[554],a[555],a[3659],a[557],a[73],a[559],a[560],a[561],a[562],a[3660],a[564],a[3661]],[a[3662],a[3663],a[3664],a[3665],a[3666],a[3667],a[581]],[a[3668],a[3669],a[3670],a[3671],a[3672],a[3673],a[3674]],{"am":a[3675],"pm":a[3676]},{"AUD":a[529],"SCR":a[3677],"XPF":a[3678]},{"AUD":a[515],"BBD":a[529],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[553],"yMd":a[3080]},{"AUD":a[515],"BIF":a[3679],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BMD":a[529],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"BSD":a[529],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[539],"GyMMMEd":a[540],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[3680],"MMMEd":a[3681],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[553],"yMMMEd":a[3682],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[551],"yMMMMd":a[552],"yMMMd":a[553],"yMd":a[3080]},{"AUD":a[515],"BRL":a[516],"BWP":a[1347],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[3680],"MMMEd":a[3681],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[553],"yMMMEd":a[3682],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[551],"yMMMMd":a[552],"yMMMd":a[3683],"yMd":a[3080]},{"AUD":a[515],"BRL":a[516],"BZD":a[529],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[26],"GyMMMEd":a[27],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[3684],"MMdd":a[1252],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[3685],"yMMM":a[50],"yMMMd":a[51],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[56],"yMMMMd":a[57],"yMMMd":a[51],"yMd":a[547]},{"AUD":a[515],"BRL":a[516],"CAD":a[529],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[529],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[529],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[3124],"EHm":a[1819],"Ehms":a[3125],"EHms":a[1821],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[3128],"Hm":a[1825],"hms":a[3129],"Hms":a[1827],"hmsv":a[3130],"Hmsv":a[1829],"hmv":a[3131],"Hmv":a[1831],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[1835],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DKK":a[3175],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"ERN":a[1227],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[3124],"EHm":a[3686],"Ehms":a[3125],"EHms":a[3687],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[3128],"Hm":a[3688],"hms":a[3129],"Hms":a[3689],"hmsv":a[3130],"Hmsv":a[3690],"hmv":a[3131],"Hmv":a[3691],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[1835],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"hmmsszzzz":a[3692],"hmsz":a[3693],"hms":a[3689],"hm":a[3688]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"FJD":a[529],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"FKP":a[520],"GBP":a[1251],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[1251],"GIP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"GMD":a[68],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"GYD":a[529],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[611],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[611]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[738]},{"am":a[3694],"pm":a[3695]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[2817],"Ehms":a[22],"EHms":a[2818],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[611],"yMEd":a[612],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[3696],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[3683],"yMd":a[3080]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JMD":a[529],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"KYD":a[529],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"LRD":a[529],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"ZAR":a[603]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MGA":a[3697],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MOP":a[3698],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[3680],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[553],"yMMMEd":a[3682],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[552],"yMMMd":a[553],"yMd":a[738]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[1251],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MUR":a[3677],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MWK":a[3522],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"MYR":a[3699],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NAD":a[529],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NGN":a[3700],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"positivePattern":a[1182],"negativePattern":a[3701]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[3702],"yMEd":a[3654],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[3702],"yMd":a[3703]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PGK":a[707],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PHP":a[3704],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[3683],"yMd":a[738]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PKR":a[3677],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"RWF":a[3705],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SBD":a[529],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SCR":a[3706],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[3685],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[547]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SEK":a[3707],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SGD":a[529],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[1251],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SHP":a[520],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SLL":a[3708],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[1251],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SSP":a[520],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"ANG":a[3709],"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SZL":a[1900],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TOP":a[3710],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TTD":a[529],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"VUV":a[3711],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"WST":a[3712],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3713],"MEd":a[3714],"MMdd":a[2069],"MMM":a[41],"MMMd":a[3680],"MMMEd":a[3681],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[3715],"yMEd":a[3716],"yMMM":a[50],"yMMMd":a[553],"yMMMEd":a[3682],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[551],"yMMMMd":a[552],"yMMMd":a[553],"yMd":a[3715]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMdd":a[2069],"MMM":a[41],"MMMd":a[3680],"MMMEd":a[3681],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[3717],"yMMMEd":a[3718],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[551],"yMMMMd":a[552],"yMMMd":a[3719],"yMd":a[611]},{"yMMMMEEEEd":a[3720],"yMMMMd":a[3721],"yMMMd":a[3722],"yMd":a[3723]},{"hmmsszzzz":a[3724],"hmsz":a[619],"hms":a[33],"hm":a[31]},[a[2411],a[1349],a[1350],a[1700],a[2412],a[2413],a[2414],a[3725],a[2416],a[1704],a[2417],a[2418]],[a[3726],a[3727],a[3728],a[3729],a[3730],a[3731],a[3732],a[3733],a[3734],a[3735],a[3736],a[3737]],[a[3343],a[3738],a[3739],a[3740],a[3741],a[3742],a[3743]],[a[3744],a[3745],a[3746],a[3747],a[3748],a[3749],a[3750]],{"am":a[3751],"pm":a[3752]},[a[3753],a[3754],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[3755],"Ehms":a[1962],"EHms":a[1963],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[608],"MEd":a[542],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[3763],"yMM":a[47],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[3764],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[54],"yQQQQ":a[3768]},{"yMMMMEEEEd":a[3769],"yMMMMd":a[3766],"yMMMd":a[549],"yMd":a[1345]},{"hmmsszzzz":a[3770],"hmsz":a[1229],"hms":a[1230],"hm":a[1231]},[a[1900],a[62],a[63],a[64],a[63],a[61],a[61],a[64],a[65],a[66],a[67],a[68]],[a[3771],a[3138],a[3139],a[2839],a[3772],a[3141],a[2842],a[3773],a[3774],a[2845],a[2846],a[3775]],[a[3776],a[3777],a[3778],a[3779],a[3780],a[3731],a[3732],a[3781],a[3782],a[3783],a[3784],a[3785]],[a[68],a[38],a[63],a[1346],a[61],a[574],a[65]],[a[3786],a[3787],a[3139],a[3788],a[3789],a[3790],a[3791]],[a[3792],a[3793],a[1380],a[1381],a[3794],a[3795],a[3796]],[a[3797],a[3798],a[3799],a[3800]],[a[3801],a[3802],a[3803],a[3804]],[a[3805],a[598]],{"CAD":a[517],"ESP":a[2889],"EUR":a[519],"THB":a[601],"USD":a[529],"VND":a[530],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3806],"GyMMMEd":a[1339],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[608],"MEd":a[542],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[543],"MMMdd":a[3807],"MMMEd":a[1340],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMM":a[47],"yMMM":a[3765],"yMMMd":a[3766],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[3809],"yQQQQ":a[3768]},[a[3342],a[625],a[1767],a[2409],a[1767],a[1794],a[1794],a[2409],a[623],a[2410],a[620],a[17]],[a[3771],a[3138],a[3139],a[2839],a[3772],a[3141],a[2842],a[3773],a[3143],a[2845],a[2846],a[3775]],[a[17],a[626],a[1767],a[1767],a[1794],a[3810],a[623]],{"ESP":a[2889],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3806],"GyMMMEd":a[3811],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[3812],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[3813],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[543],"MMMdd":a[3807],"MMMEd":a[1340],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[3814],"yMd":a[611],"yMEd":a[1341],"yMM":a[47],"yMMM":a[3765],"yMMMd":a[3815],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[3809],"yQQQQ":a[3768]},{"ARS":a[529],"ESP":a[2889],"USD":a[602],"XPF":a[534]},{"BOB":a[3816],"ESP":a[2889],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3806],"GyMMMEd":a[1339],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[541],"MEd":a[3817],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[543],"MMMdd":a[3807],"MMMEd":a[1340],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[546],"yMd":a[3818],"yMEd":a[3819],"yMM":a[47],"yMMM":a[3765],"yMMMd":a[3766],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[3809],"yQQQQ":a[3768]},{"yMMMMEEEEd":a[3769],"yMMMMd":a[3766],"yMMMd":a[3818],"yMd":a[3820]},{"positivePattern":a[504],"negativePattern":a[3257]},{"CLP":a[529],"ESP":a[2889],"USD":a[602],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[3821],"GyMMMd":a[3806],"GyMMMEd":a[3822],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[608],"MEd":a[542],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[3823],"MMMdd":a[3823],"MMMEd":a[3824],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMM":a[47],"yMMM":a[3825],"yMMMd":a[3815],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[3809],"yQQQQ":a[3768]},{"yMMMMEEEEd":a[3769],"yMMMMd":a[3766],"yMMMd":a[3702],"yMd":a[3703]},{"COP":a[529],"ESP":a[2889],"USD":a[602],"XPF":a[534]},{"CRC":a[3826],"ESP":a[2889],"XPF":a[534]},{"CUP":a[529],"ESP":a[2889],"USD":a[602],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3806],"GyMMMEd":a[1339],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[608],"MEd":a[542],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[543],"MMMdd":a[3807],"MMMEd":a[1340],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMM":a[47],"yMMM":a[3765],"yMMMd":a[3827],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[3809],"yQQQQ":a[3768]},[a[3801],a[3802],a[3828],a[3829]],{"DOP":a[3830],"ESP":a[2889],"USD":a[602],"XPF":a[534]},{"ESP":a[2889],"USD":a[529],"XPF":a[534]},{"CAD":a[517],"ESP":a[2889],"EUR":a[519],"THB":a[601],"USD":a[529],"VND":a[530],"XAF":a[531],"XPF":a[534]},{"ESP":a[2889],"GTQ":a[3831],"XPF":a[534]},{"yMMMMEEEEd":a[3832],"yMMMMd":a[3833],"yMMMd":a[549],"yMd":a[1345]},{"ESP":a[2889],"HNL":a[38],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[2817],"Ehms":a[22],"EHms":a[2818],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[608],"MEd":a[542],"MMd":a[2068],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMdd":a[3807],"MMMEd":a[3834],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMM":a[2071],"yMMM":a[3765],"yMMMd":a[3766],"yMMMEd":a[3767],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[54],"yQQQQ":a[3768]},{"yMMMMEEEEd":a[3769],"yMMMMd":a[3766],"yMMMd":a[738],"yMd":a[3080]},[a[3835],a[1349],a[1350],a[1351],a[1352],a[2413],a[2414],a[1355],a[2416],a[3836],a[2417],a[3837]],[a[68],a[38],a[63],a[63],a[61],a[574],a[65]],{"AFN":a[3838],"ANG":a[3839],"AOA":a[3840],"ARS":a[3841],"AUD":a[802],"AWG":a[3842],"CNY":a[518],"ESP":a[2889],"MXN":a[529]},{"ESP":a[2889],"NIO":a[3843],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3806],"GyMMMEd":a[1339],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[3713],"MEd":a[3714],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[543],"MMMdd":a[3807],"MMMEd":a[1340],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[3844],"yMEd":a[3845],"yMM":a[47],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[3809],"yQQQQ":a[3768]},{"yMMMMEEEEd":a[3769],"yMMMMd":a[3766],"yMMMd":a[3844],"yMd":a[3846]},{"ESP":a[2889],"PAB":a[3847],"XPF":a[534]},{"yMMMMEEEEd":a[3769],"yMMMMd":a[3766],"yMMMd":a[549],"yMd":a[3703]},[a[3771],a[3138],a[3139],a[2839],a[3772],a[3141],a[2842],a[3773],a[2844],a[2845],a[2846],a[3775]],[a[3776],a[3777],a[3778],a[3779],a[3780],a[3731],a[3732],a[3781],a[3848],a[3783],a[3784],a[3785]],{"ESP":a[2889],"PEN":a[3849],"XPF":a[534]},{"CAD":a[517],"ESP":a[2889],"EUR":a[519],"PHP":a[3704],"THB":a[601],"USD":a[529],"VND":a[530],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3806],"GyMMMEd":a[1339],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[3713],"MEd":a[3714],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[543],"MMMdd":a[3807],"MMMEd":a[1340],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[3844],"yMEd":a[3845],"yMM":a[47],"yMMM":a[3765],"yMMMd":a[3766],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[3809],"yQQQQ":a[3768]},{"ESP":a[2889],"PYG":a[3850],"XPF":a[534]},{"ESP":a[2889],"JPY":a[524],"USD":a[529],"XPF":a[534]},{"ESP":a[2889],"USD":a[602],"UYU":a[529],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3806],"GyMMMEd":a[1339],"GyMMMM":a[3756],"GyMMMMd":a[3757],"GyMMMMEd":a[3758],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[3018],"hmsvvvv":a[3759],"Hmsvvvv":a[3760],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[608],"MEd":a[542],"MMd":a[608],"MMdd":a[608],"MMM":a[41],"MMMd":a[543],"MMMdd":a[3807],"MMMEd":a[1340],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMM":a[47],"yMMM":a[3765],"yMMMd":a[549],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[3767],"yQQQ":a[3809],"yQQQQ":a[3768]},{"ESP":a[2889],"VEF":a[3851],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[20],"EHm":a[21],"Ehms":a[3852],"EHms":a[3853],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3854],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[3855],"Hms":a[3856],"hmsv":a[3857],"Hmsv":a[3858],"hmv":a[36],"Hmv":a[37],"M":a[63],"Md":a[1832],"MEd":a[1833],"MMM":a[3859],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[2394],"MMMMEd":a[2395],"mmss":a[1835],"ms":a[1835],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3860],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3226],"yMMMMd":a[3025],"yMMMd":a[3134],"yMd":a[1697]},{"hmmsszzzz":a[3861],"hmsz":a[3862],"hms":a[3856],"hm":a[1231]},[a[61],a[574],a[63],a[64],a[63],a[61],a[61],a[64],a[65],a[66],a[67],a[68]],[a[3863],a[3864],a[3865],a[1700],a[3866],a[3867],a[3868],a[2415],a[3869],a[1704],a[2417],a[3870]],[a[3871],a[3872],a[3865],a[3873],a[3866],a[3867],a[3868],a[2424],a[3147],a[3874],a[3149],a[3875]],[a[1347],a[1900],a[92],a[707],a[67],a[603],a[38]],[a[3876],a[3877],a[3878],a[3879],a[3880],a[3881],a[3882]],[a[3166],a[3883],a[3884],a[3885]],[a[3886],a[3887],a[3888],a[3889]],{"decimal":a[509],"group":a[599],"nan":a[510],"plusSign":a[511],"minusSign":a[3890],"percentSign":a[513],"infinity":a[514]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EEK":a[3707],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[3891],"GyMMMd":a[3892],"GyMMMEd":a[3893],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[3894],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[3895],"yMd":a[678],"yMEd":a[3896],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[3897],"yMMMMd":a[3898],"yMMMMEd":a[3899],"yQQQ":a[3900],"yQQQQ":a[3901]},{"yMMMMEEEEd":a[3902],"yMMMMd":a[3898],"yMMMd":a[679],"yMd":a[3715]},{"hmmsszzzz":a[3903],"hmsz":a[3904],"hms":a[33],"hm":a[31]},[a[2073],a[66],a[63],a[64],a[63],a[1900],a[2073],a[64],a[1313],a[2073],a[64],a[64]],[a[3905],a[3906],a[3139],a[3907],a[3908],a[3909],a[3910],a[3911],a[3912],a[3913],a[3914],a[3915]],[a[3916],a[3917],a[3918],a[3919],a[3920],a[3921],a[3922],a[3923],a[3924],a[3925],a[3926],a[3927]],[a[1313],a[64],a[64],a[64],a[66],a[66],a[38]],[a[3928],a[3929],a[3930],a[3931],a[3932],a[3933],a[3934]],[a[3935],a[3936],a[3937],a[3938],a[3939],a[3940],a[3941]],[a[3942]],[a[3943],a[3944],a[189],a[190]],[a[3945],a[598]],{"positivePattern":a[3946],"negativePattern":a[3947]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"ESP":a[2889],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[2410],a[1769],a[626],a[620],a[622],a[623],a[624],a[1767],a[3342],a[2409],a[17],a[1769]],[a[3948],a[3949],a[3950],a[3951],a[3952],a[3953],a[3954],a[3955],a[3956],a[3957],a[3958],a[3959]],[a[3960],a[3961],a[3962],a[3963],a[3964],a[3965],a[3966],a[3967],a[3968],a[3969],a[3970],a[3971]],[a[623],a[1767],a[623],a[623],a[623],a[625],a[623]],[a[3972],a[3973],a[3974],a[3975],a[3976],a[3977],a[3978]],[a[3979],a[3980],a[3981],a[3982],a[3983],a[3984],a[3985]],{"am":a[3986],"pm":a[3987]},[a[3988],a[3989],a[189],a[190]],[a[3990],a[3991],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[2817],"Ehms":a[22],"EHms":a[2818],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[481],"HHmmZ":a[3994],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[3995],"MMM":a[41],"MMMd":a[3996],"MMMEd":a[3997],"MMMMd":a[3998],"MMMMEd":a[3999],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[3895],"yMd":a[678],"yMEd":a[4000],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yMMMMEEEEd":a[615],"yQQQ":a[55],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[678]},{"hmmsszzzz":a[3770],"hmsz":a[4001],"hms":a[1230],"hm":a[1231]},[a[4002],a[823],a[824],a[1233],a[824],a[4002],a[4002],a[4003],a[830],a[4003],a[827],a[833]],[a[4004],a[4005],a[836],a[4006],a[4007],a[4008],a[4009],a[4010],a[4011],a[4012],a[4013],a[4014]],[a[4015],a[833],a[830],a[4016],a[4017],a[850],a[1232]],[a[4018],a[4019],a[4020],a[4021],a[4022],a[4023],a[4024]],{"am":a[4025],"pm":a[4026]},[a[4027],a[824],a[4028],a[4029]],[a[4030],a[4031],a[4028],a[4029]],[a[4032],a[4033],a[4034],a[4035]],[a[1234],a[846],a[4036],a[4037],a[1232],a[1233],a[826],a[827],a[4003],a[830],a[1234],a[1233],a[4003],a[826]],[a[4038],a[4039],a[4040],a[4041],a[908],a[910],a[4042],a[4043],a[4044],a[4045],a[914],a[915],a[4046],a[4047]],[a[918],a[919],a[4048],a[4049],a[4050],a[4051],a[924],a[925],a[926],a[927],a[4052],a[4053]],[a[4054]],[a[4055]],[a[823],a[4003],a[849],a[1234],a[824],a[1232],a[824],a[1233],a[1233],a[833],a[832],a[4003]],[a[4056],a[4057],a[1169],a[4058],a[1171],a[4059],a[1173],a[4060],a[1175],a[4061],a[1177],a[4062]],[a[4063]],[a[4064]],[a[4065],a[501]],{"positivePattern":a[4066],"negativePattern":a[4067]},{"decimal":a[1184],"group":a[1185],"nan":a[4068],"plusSign":a[4069],"minusSign":a[4070],"percentSign":a[1189],"infinity":a[514]},{"decimal":a[508],"group":a[509],"nan":a[4068],"plusSign":a[1191],"minusSign":a[4070],"percentSign":a[513],"infinity":a[514]},{"AFN":a[4071],"AUD":a[515],"BRL":a[516],"CAD":a[2316],"CNY":a[4072],"EUR":a[519],"GBP":a[520],"HKD":a[4073],"ILS":a[522],"INR":a[523],"IRR":a[4074],"JPY":a[524],"KRW":a[525],"MXN":a[4075],"NZD":a[4076],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[4077],"XOF":a[533],"XPF":a[534]},[a[1081],a[4005],a[836],a[4006],a[4078],a[4008],a[4079],a[4010],a[4011],a[4012],a[4013],a[4080]],[a[4081],a[4082],a[4083],a[4084],a[4078],a[4085],a[4086],a[4087],a[4088],a[4089],a[4090],a[4091]],[a[4092],a[4093],a[4094],a[4095],a[4096],a[4097],a[4098],a[4099],a[4100],a[4101],a[4102],a[4103]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[63],"Md":a[608],"MEd":a[1253],"MMd":a[2068],"MMdd":a[2069],"MMM":a[2070],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[547],"yMEd":a[612],"yMM":a[2071],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[623],a[627],a[1767],a[623],a[17],a[621],a[1767],a[1794],a[623],a[46],a[1794],a[1769]],[a[4104],a[4105],a[4106],a[632],a[4107],a[4108],a[4109],a[4110],a[4111],a[4112],a[4113],a[4114]],[a[4115],a[4116],a[4117],a[4118],a[4119],a[4120],a[4121],a[4122],a[4123],a[4124],a[4125],a[4126]],[a[17],a[2409],a[1767],a[620],a[620],a[1767],a[1768]],[a[4127],a[4128],a[4129],a[1776],a[4130],a[4131],a[4132]],[a[4133],a[4134],a[4135],a[4136],a[4137],a[4138],a[4139]],{"am":a[4140],"pm":a[4141]},[a[4142],a[4143],a[189],a[190]],[a[4144],a[4145],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"GNF":a[4146],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MRO":a[4147],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[3012],"Ehm":a[3124],"EHm":a[3686],"Ehms":a[3125],"EHms":a[3687],"Gy":a[24],"GyMMM":a[1822],"GyMMMd":a[3126],"GyMMMEd":a[3127],"h":a[28],"H":a[481],"hm":a[3128],"Hm":a[3688],"hms":a[3129],"Hms":a[3689],"hmsv":a[3130],"Hmsv":a[3690],"hmv":a[3131],"Hmv":a[3691],"M":a[38],"Md":a[3221],"MEd":a[4149],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[4150],"MMMMd":a[2394],"ms":a[4151],"y":a[46],"yM":a[4152],"yMd":a[1837],"yMEd":a[4153],"yMM":a[1836],"yMMM":a[1839],"yMMMd":a[3134],"yMMMEd":a[3135],"yMMMM":a[1840],"yMMMMccccd":a[4154],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[4154],"yMMMMd":a[3025],"yMMMd":a[1837],"yMd":a[1837]},[a[92],a[481],a[63],a[481],a[92],a[707],a[481],a[1900],a[65],a[38],a[63],a[61]],[a[4155],a[4156],a[4157],a[4158],a[4159],a[4160],a[4161],a[4162],a[4163],a[4164],a[4165],a[4166]],[a[65],a[63],a[92],a[707],a[92],a[1347],a[38]],[a[4167],a[3739],a[4168],a[4169],a[4170],a[4171],a[4172]],[a[4173],a[4174],a[4175],a[4176],a[4177],a[4178],a[4179]],{"am":a[4180],"pm":a[4181]},[a[4182],a[4183],a[4184],a[4185]],[a[4186],a[4187],a[4188],a[4189]],[a[4190],a[4191],a[4192],a[4193]],[a[92],a[481],a[707],a[92],a[65],a[64],a[64],a[67],a[1313],a[65],a[92],a[64],a[1900],a[64]],[a[4194],a[4195],a[4196],a[4197],a[4198],a[4199],a[4200],a[4201],a[4202],a[4203],a[4204],a[4205],a[4206],a[4207]],[a[4208],a[4209],a[4210],a[4211],a[4212],a[4213],a[4214],a[4215],a[4216],a[4217],a[4218],a[4219]],{"decimal":a[509],"group":a[599],"nan":a[4220],"plusSign":a[511],"minusSign":a[3890],"percentSign":a[513],"infinity":a[514]},{"EUR":a[519],"FIM":a[4221],"GBP":a[520],"JPY":a[524],"USD":a[529],"XAF":a[531],"XOF":a[533]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[25],"GyMMMd":a[26],"GyMMMEd":a[27],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"MMMMEd":a[677],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[48],"yMEd":a[49],"yMM":a[2071],"yMMM":a[50],"yMMMd":a[51],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[4223],a[4224],a[71],a[4225],a[73],a[4226],a[4227],a[1300],a[4228],a[1301],a[4229],a[1903]],[a[4230],a[4231],a[4232],a[4233],a[4234],a[4235],a[4236],a[4237],a[4238],a[4239],a[4240],a[4241]],[a[4242],a[2296],a[71],a[4243],a[4244],a[4245],a[1924]],[a[4246],a[4247],a[4248],a[4249],a[4250],a[4251],a[4252]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PHP":a[3704],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[3011],"E":a[18],"Ed":a[3012],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3127],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[3655],"Md":a[1689],"MEd":a[4253],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3133],"MMMMd":a[2394],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[1693],"yMEd":a[4254],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3135],"yMMMM":a[53],"yQQQ":a[4255],"yQQQQ":a[4256]},[a[3137],a[3138],a[3139],a[3140],a[3866],a[3141],a[2842],a[3142],a[3143],a[3144],a[2846],a[2847]],[a[2419],a[2420],a[4257],a[4258],a[3866],a[2422],a[2423],a[2424],a[3147],a[3148],a[3149],a[4259]],[a[65],a[63],a[92],a[63],a[481],a[62],a[38]],[a[4260],a[4261],a[4262],a[4263],a[4264],a[4265],a[4266]],[a[4267],a[4268],a[4269],a[4270],a[4271],a[4272],a[4273]],[a[3165],a[3166],a[4274],a[4275]],[a[3169],a[3170],a[4276],a[4277]],[a[4278],a[4279],a[4280],a[4281]],{"decimal":a[509],"group":a[508],"nan":a[510],"plusSign":a[511],"minusSign":a[3890],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DKK":a[3707],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[1900],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[4283],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[2259],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[2260],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[4284],a[4285],a[4257],a[4286],a[3866],a[4287],a[4288],a[4289],a[3774],a[2845],a[2846],a[4290]],[a[4291],a[4292],a[4257],a[4293],a[3866],a[4287],a[4294],a[4289],a[4295],a[4296],a[4297],a[4298]],[a[4299],a[3787],a[3139],a[4300],a[4301],a[4302],a[4303]],[a[4304],a[4305],a[4306],a[4307],a[4308],a[4309],a[4310]],[a[4311]],[a[4312]],[a[4313]],[a[4314],a[4315],a[4316],a[4317],a[4318],a[4319],a[4320],a[4321],a[4322],a[4323],a[4324],a[4325]],[a[4326],a[4327],a[4328],a[4329],a[4330],a[4331],a[4332],a[4333],a[4334],a[4335],a[4336],a[4337]],[a[4338],a[4339],a[2883],a[2884]],[a[4340],a[4341],a[4342],a[4343]],[a[4344],a[4345],a[199],a[4346],a[4347],a[202],a[203],a[4348],a[205],a[206],a[4349],a[3389],a[4350],a[210]],[a[4351],a[4352],a[4353],a[4354],a[4355],a[4356],a[4357],a[4358],a[4359],a[4360],a[4361],a[4362]],[a[4363],a[4209],a[4364],a[4365],a[4366],a[4367],a[4368],a[4369],a[4216],a[4370],a[4371],a[4372]],[a[4373],a[4374]],{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3703]},{"hmmsszzzz":a[4402],"hmsz":a[619],"hms":a[33],"hm":a[31]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BIF":a[3679],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"d":a[17],"E":a[1900],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[4283],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3427],"MEd":a[4403],"MMd":a[4404],"MMdd":a[1252],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[548],"yMM":a[1255],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3723]},{"AUD":a[4405],"BEF":a[2825],"BRL":a[516],"CAD":a[529],"CNY":a[518],"CYP":a[4383],"EUR":a[519],"FRF":a[62],"GBP":a[520],"HKD":a[4406],"IEP":a[4388],"ILP":a[4389],"INR":a[523],"ITL":a[4390],"JPY":a[524],"MTP":a[4392],"NZD":a[4407],"RHD":a[4394],"SGD":a[4408],"USD":a[4409],"WST":a[3712]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CDF":a[4410],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[1697]},{"hmmsszzzz":a[4411],"hmsz":a[619],"hms":a[33],"hm":a[31]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"DJF":a[1219],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"DZD":a[4412],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"GNF":a[4146],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"HTG":a[2293],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KMF":a[4413],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"LUF":a[62],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},[a[3137],a[4414],a[3139],a[4286],a[3866],a[4415],a[4288],a[4289],a[3774],a[2845],a[2846],a[4290]],{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MGA":a[3697],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MRO":a[4147],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MUR":a[3677],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"RWF":a[3705],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SCR":a[3706],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"SYP":a[4416],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TND":a[4417],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"ARS":a[4375],"AUD":a[4376],"BEF":a[2825],"BMD":a[4377],"BND":a[4378],"BRL":a[516],"BSD":a[4379],"BZD":a[4380],"CAD":a[2316],"CLP":a[4381],"COP":a[4382],"CYP":a[4383],"EUR":a[519],"FJD":a[4384],"FKP":a[4385],"FRF":a[62],"GBP":a[4386],"GIP":a[4387],"IEP":a[4388],"ILP":a[4389],"ILS":a[522],"INR":a[523],"ITL":a[4390],"KRW":a[525],"LBP":a[4391],"MTP":a[4392],"MXN":a[4075],"NAD":a[4393],"NZD":a[4076],"RHD":a[4394],"SBD":a[4395],"SGD":a[4396],"SRD":a[4397],"TTD":a[4398],"USD":a[4399],"UYU":a[4400],"VND":a[530],"VUV":a[3711],"WST":a[3712],"XAF":a[531],"XOF":a[533],"XPF":a[4401]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMd":a[2068],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[4418],"MMMMEd":a[545],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[547],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[613],"yMMMM":a[4419],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[4420],"yMMMMd":a[4421],"yMMMd":a[738],"yMd":a[3080]},[a[2072],a[62],a[63],a[64],a[63],a[61],a[38],a[64],a[65],a[66],a[67],a[68]],[a[4422],a[4423],a[71],a[4424],a[3087],a[4425],a[4426],a[4427],a[4228],a[4428],a[79],a[4429]],[a[4430],a[4431],a[4432],a[4433],a[3087],a[4434],a[4426],a[4435],a[4436],a[4437],a[3404],a[4438]],[a[1372],a[4439],a[1350],a[4440],a[4441],a[4442],a[4443]],[a[4444],a[4445],a[4446],a[4447],a[4448],a[4449],a[4450]],{"am":a[4451],"pm":a[4452]},[a[4453],a[4454],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[4455],"MEd":a[3813],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[3814],"yMd":a[4456],"yMEd":a[4457],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3820]},[a[3137],a[3138],a[4458],a[3140],a[3908],a[3141],a[2842],a[3142],a[3143],a[3144],a[2846],a[2847]],[a[4459],a[4460],a[4461],a[2421],a[4462],a[2841],a[4463],a[4464],a[4465],a[3148],a[4466],a[4467]],[a[2072],a[63],a[68],a[93],a[68],a[574],a[2072]],[a[4468],a[4469],a[4168],a[4470],a[4170],a[4471],a[3059]],[a[4472],a[4473],a[4474],a[4475],a[4476],a[4477],a[4478]],[a[4479],a[4480],a[4481],a[4482],a[4483],a[153],a[154],a[4484],a[156],a[4485],a[4486],a[4487],a[4488]],[a[4489],a[4490],a[165],a[166],a[4491],a[4492],a[4493],a[4494],a[171],a[4495],a[173],a[4496],a[4497]],[a[4498],a[4499],a[4500],a[4501]],[a[3169],a[4502],a[4503],a[594]],[a[4504],a[4505],a[4506],a[4507]],[a[4508],a[4509],a[199],a[200],a[4510],a[4511],a[203],a[204],a[4512],a[206],a[4513],a[208],a[4514],a[4515]],[a[211],a[4516],a[4517],a[4518],a[4519],a[4520],a[4521],a[4522],a[219],a[4523],a[4524],a[4525]],[a[4526]],[a[4527],a[225],a[226],a[227],a[4528],a[4529],a[230],a[4530],a[232],a[4531],a[4532],a[4533]],[a[4534],a[237],a[4535],a[4536],a[4537],a[4538],a[242],a[4539],a[244],a[4540],a[4541],a[4542]],[a[4543]],{"positivePattern":a[1182],"negativePattern":a[4544]},{"AUD":a[802],"BRL":a[516],"CAD":a[3843],"CNY":a[518],"EUR":a[519],"FJD":a[4545],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SBD":a[4546],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[3655],"Md":a[2069],"MEd":a[2259],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[2260],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[1900],a[62],a[63],a[64],a[188],a[63],a[1313],a[38],a[63],a[68],a[65],a[67]],[a[4547],a[4548],a[4549],a[4550],a[4551],a[4552],a[4553],a[4554],a[4555],a[4556],a[4557],a[4558]],[a[4559],a[4560],a[4549],a[4561],a[4562],a[4563],a[4553],a[4564],a[4565],a[4566],a[4567],a[4568]],[a[68],a[38],a[63],a[3116],a[68],a[64],a[65]],[a[4569],a[4570],a[4571],a[4572],a[4573],a[4574],a[4575]],[a[4576],a[4577],a[4578],a[4579],a[4580],a[4581],a[4582]],[a[4583],a[192],a[4584],a[4585]],[a[4586],a[194],a[4587],a[4588]],{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[4589],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[4590],"H":a[29],"hm":a[4591],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[4592],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[4593],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[48],"yMEd":a[1341],"yMM":a[2071],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[1840],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[4594],"yMMMMd":a[4595],"yMMMd":a[549],"yMd":a[738]},[a[62],a[2293],a[63],a[2293],a[3116],a[4596],a[1313],a[38],a[65],a[68],a[65],a[68]],[a[4597],a[4598],a[4599],a[4600],a[4601],a[4602],a[4603],a[4604],a[4605],a[4606],a[4557],a[4607]],[a[4608],a[4609],a[4610],a[4611],a[4612],a[4613],a[4614],a[4615],a[4616],a[4617],a[4618],a[4619]],[a[68],a[38],a[63],a[3116],a[64],a[481],a[65]],[a[4620],a[4621],a[4622],a[4623],a[4624],a[4625],a[4626]],[a[4627],a[4628],a[4629],a[4630],a[4631],a[4632],a[4633]],{"am":a[1767],"pm":a[625]},[a[603],a[64],a[189],a[190]],[a[4583],a[192],a[189],a[190]],[a[4634],a[4635],a[189],a[190]],[a[4636],a[4637]],[a[4638],a[4637]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[4455],"MEd":a[2115],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[45],"y":a[46],"yM":a[3814],"yMd":a[611],"yMEd":a[1341],"yMM":a[2071],"yMMM":a[50],"yMMMd":a[617],"yMMMEd":a[2116],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[4639],"yMMMMd":a[552],"yMMMd":a[617],"yMd":a[3080]},[a[1346],a[62],a[63],a[64],a[63],a[1346],a[1346],a[64],a[65],a[66],a[67],a[68]],[a[4640],a[1349],a[1350],a[1351],a[3866],a[4641],a[4642],a[1355],a[1356],a[4643],a[2417],a[2418]],[a[4644],a[4645],a[3778],a[3779],a[4646],a[4647],a[4648],a[3781],a[4649],a[4650],a[3736],a[3737]],[a[1372],a[4651],a[1350],a[4652],a[4653],a[4654],a[1377]],[a[3792],a[4651],a[1380],a[4655],a[4656],a[4657],a[3796]],[a[1437],a[1438],a[189],a[190]],[a[3801],a[4658],a[1437],a[1438]],{"AUD":a[2315],"BRL":a[4659],"CAD":a[2316],"CNY":a[518],"ESP":a[2889],"EUR":a[519],"GBP":a[520],"HKD":a[4073],"ILS":a[522],"INR":a[523],"JPY":a[4660],"KRW":a[525],"MXN":a[4075],"NZD":a[527],"THB":a[601],"TWD":a[4661],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[3012],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3221],"MEd":a[3222],"MMd":a[3223],"MMdd":a[2389],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3133],"MMMMd":a[2394],"MMMMEd":a[3022],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[3432],"yMd":a[547],"yMEd":a[3434],"yMM":a[1692],"yMMdd":a[1693],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[3225],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[69],a[70],a[4662],a[72],a[3087],a[74],a[75],a[76],a[77],a[1301],a[79],a[4663]],[a[3230],a[3231],a[3227],a[84],a[3087],a[1306],a[3228],a[4664],a[4665],a[4666],a[4667],a[4668]],[a[3662],a[4669],a[4670],a[3234],a[4671],a[3235],a[581]],[a[4672],a[4673],a[4674],a[4675],a[4676],a[4677],a[4678]],{"am":a[3243],"pm":a[4679]},[a[3245],a[3246],a[189],a[190]],{"decimal":a[508],"group":a[4680],"nan":a[510],"plusSign":a[511],"minusSign":a[3890],"percentSign":a[513],"infinity":a[514]},{"ATS":a[3251],"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[4681],"GyMMMd":a[4682],"GyMMMEd":a[4683],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMdd":a[541],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMM":a[546],"yMMM":a[50],"yMMMd":a[617],"yMMMEd":a[2116],"yMMMM":a[53],"yQQQ":a[1259],"yQQQQ":a[1260]},{"hmmsszzzz":a[4684],"hmsz":a[4685],"hms":a[2388],"hm":a[2387]},[a[4686],a[4687],a[4688],a[4689],a[4690],a[4691],a[4692],a[4693],a[4694],a[4693],a[4695],a[4696]],[a[4697],a[4698],a[4699],a[4700],a[4690],a[4701],a[4702],a[4703],a[4704],a[4705],a[4706],a[4707]],[a[4708],a[4709],a[4699],a[4700],a[4690],a[4701],a[4702],a[4703],a[4710],a[4711],a[4712],a[4713]],[a[4714],a[4715],a[4716],a[4717],a[4718],a[4719],a[4720]],[a[4721],a[4722],a[4723],a[4724],a[4725],a[4726],a[4727]],[a[4728],a[4729],a[4730],a[4731],a[4732],a[4733],a[4734]],[a[4735],a[4736],a[4737],a[4738]],[a[4739],a[4740],a[4737],a[4738]],[a[4741],a[4742],a[4743],a[4744]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"MMMMEd":a[677],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[547],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[3116],a[62],a[63],a[64],a[63],a[61],a[3116],a[64],a[65],a[66],a[67],a[68]],[a[4745],a[70],a[1299],a[72],a[558],a[74],a[4746],a[4747],a[77],a[1301],a[4229],a[1903]],[a[4748],a[4749],a[1304],a[4750],a[558],a[1306],a[4751],a[1308],a[1309],a[4752],a[4753],a[1906]],[a[3116],a[3116],a[3116],a[3116],a[64],a[1313],a[1900]],[a[4754],a[4755],a[4756],a[4757],a[4758],a[4759],a[4760]],[a[4761],a[4762],a[4763],a[4764],a[4765],a[4766],a[4767]],{"am":a[4768],"pm":a[4769]},[a[4770],a[4771],a[189],a[190]],[a[4772],a[4773],a[189],a[190]],[a[4774],a[4775],a[4776],a[4777],a[4778],a[4779],a[4780],a[4781],a[4782],a[4783],a[4784],a[4785]],[a[4786],a[4787],a[4776],a[4788],a[4778],a[4789],a[4790],a[4781],a[4791],a[4792],a[4793],a[4794]],[a[4795],a[4796],a[4797],a[4798],a[4799],a[4800],a[4801]],[a[4802],a[4803],a[4804],a[4805],a[4806],a[4807],a[4808]],[a[61],a[62],a[63],a[64],a[63],a[708],a[708],a[64],a[65],a[66],a[67],a[68]],[a[69],a[4809],a[71],a[4810],a[73],a[4811],a[4812],a[4813],a[100],a[1301],a[4814],a[1903]],[a[4815],a[4816],a[4817],a[4818],a[4819],a[4820],a[4821],a[4822],a[4823],a[1310],a[4824],a[4825]],[a[38],a[38],a[92],a[38],a[64],a[61],a[64]],[a[4826],a[4827],a[4828],a[4829],a[4830],a[4831],a[4832]],[a[4833],a[4834],a[3414],a[4835],a[4836],a[4837],a[4838]],[a[4839],a[4840],a[189],a[190]],[a[4841],a[4842],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"GHS":a[729],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NGN":a[3700],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"_value":a[1345],"_numbers":a[4843]},[a[4844],a[4845],a[4846],a[4847],a[558],a[4848],a[4849],a[4850],a[4851],a[4852],a[4853],a[4854]],[a[4855],a[4856],a[4857],a[4858],a[558],a[4859],a[4860],a[4861],a[4862],a[4863],a[4864],a[4865]],[a[4866],a[4867],a[4868],a[4869],a[4870],a[4871],a[4872]],[a[4873],a[4874],a[4875],a[4876],a[4877],a[4878],a[4879]],{"d":a[17],"E":a[18],"Ed":a[4881],"Ehm":a[20],"EHm":a[2817],"Ehms":a[22],"EHms":a[2818],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[4882],"GyMMMEd":a[4883],"h":a[4884],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1832],"MEd":a[1833],"MMM":a[41],"MMMd":a[4885],"MMMEd":a[4886],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMM":a[1836],"yMMM":a[50],"yMMMd":a[4887],"yMMMEd":a[4888],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[4889],"yMMMMd":a[4890],"yMMMd":a[4887],"yMd":a[1837]},[a[4891],a[4892],a[4893],a[4894],a[4895],a[4896],a[4897],a[4898],a[4899],a[4900],a[4901],a[4902]],[a[4903],a[4904],a[4893],a[4905],a[4895],a[4896],a[4897],a[4906],a[4907],a[4908],a[4909],a[4910]],[a[4911],a[4912],a[4913],a[4914],a[4915],a[4916],a[4917]],[a[4918],a[4919],a[4920],a[4921],a[4922],a[4923],a[4924]],[a[4925],a[4926],a[4927],a[4928],a[4929],a[4930],a[4931]],{"am":a[4932],"pm":a[4933]},[a[4934],a[4935],a[189],a[190]],[a[4936],a[4935],a[4934],a[190]],[a[4937],a[4938],a[4939],a[4940],a[4941],a[4942],a[4943],a[4944],a[4945],a[4946],a[4947],a[4948],a[4949],a[4950]],[a[4951],a[4952],a[4953],a[4954],a[4955],a[4956],a[4957],a[4958],a[4959],a[4960],a[4961],a[4948],a[4962],a[4963]],[a[4964]],[a[4965],a[4966],a[4967],a[4968],a[4969],a[4970],a[4971],a[4972],a[4973],a[4974],a[4975],a[4976]],[a[4965],a[4966],a[4977],a[4978],a[4979],a[4980],a[4971],a[4972],a[4973],a[4974],a[4975],a[4976]],[a[4981]],[a[4982],a[250],a[251],a[252],a[253],a[254],a[255],a[256],a[257],a[258],a[259],a[260],a[261],a[262],a[263],a[264],a[265],a[266],a[267],a[268],a[269],a[270],a[271],a[272],a[4983],a[274],a[275],a[276],a[277],a[278],a[279],a[280],a[281],a[282],a[283],a[284],a[285],a[286],a[287],a[288],a[289],a[290],a[291],a[292],a[293],a[294],a[295],a[296],a[297],a[298],a[299],a[300],a[301],a[302],a[303],a[304],a[305],a[306],a[307],a[308],a[309],a[310],a[311],a[312],a[313],a[314],a[315],a[316],a[317],a[318],a[319],a[320],a[321],a[4984],a[323],a[324],a[325],a[326],a[327],a[328],a[329],a[330],a[331],a[332],a[333],a[334],a[335],a[336],a[337],a[338],a[339],a[340],a[341],a[342],a[343],a[344],a[345],a[346],a[347],a[348],a[349],a[350],a[351],a[352],a[353],a[354],a[355],a[356],a[357],a[358],a[359],a[360],a[361],a[362],a[363],a[364],a[365],a[366],a[367],a[368],a[369],a[370],a[371],a[372],a[373],a[374],a[375],a[376],a[377],a[378],a[379],a[380],a[381],a[382],a[383],a[384],a[385],a[386],a[387],a[388],a[389],a[390],a[391],a[392],a[393],a[394],a[395],a[396],a[397],a[398],a[399],a[400],a[401],a[402],a[403],a[404],a[405],a[406],a[407],a[408],a[409],a[410],a[411],a[412],a[413],a[414],a[415],a[416],a[417],a[418],a[419],a[420],a[421],a[422],a[423],a[424],a[425],a[426],a[427],a[428],a[429],a[430],a[431],a[432],a[433],a[434],a[435],a[436],a[437],a[438],a[439],a[440],a[441],a[442],a[443],a[444],a[445],a[446],a[447],a[448],a[449],a[450],a[451],a[452],a[453],a[454],a[455],a[456],a[457],a[458],a[459],a[460],a[461],a[462],a[463],a[464],a[465],a[466],a[467],a[468],a[469],a[470],a[471],a[472],a[473],a[474],a[475],a[476],a[477],a[478],a[479],a[480],a[482],a[483],a[484],a[485]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILP":a[4985],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[4987],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMM":a[2071],"yMMdd":a[738],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[738],"yMd":a[1345]},[a[2323],a[4988],a[2325],a[2331],a[4989],a[4990],a[2328],a[2331],a[4991],a[2331],a[2332],a[2333]],[a[4992],a[4993],a[4994],a[4995],a[4996],a[4997],a[4998],a[4999],a[5000],a[5001],a[5002],a[5003]],[a[5004],a[5005],a[4994],a[4995],a[4996],a[4997],a[5006],a[5007],a[5008],a[5009],a[5010],a[5011]],[a[2345],a[5012],a[2347],a[2348],a[5013],a[5014],a[5015]],[a[5016],a[5017],a[2353],a[5018],a[5019],a[5020],a[5021]],[a[5022],a[5023],a[5024],a[5025],a[5026],a[5027],a[5028]],{"am":a[5029],"pm":a[5030]},[a[5031],a[5032],a[5033],a[5034],a[5035],a[5036],a[5037],a[5038],a[5039],a[5040],a[5041],a[5042],a[5043]],[a[5044],a[5045],a[5046],a[5047]],[a[5044],a[5048],a[5046],a[5047]],[a[5049],a[5050],a[5051],a[5052],a[5053],a[5054],a[5055],a[5056],a[5057],a[5058],a[5059],a[5060]],[a[5061]],[a[5062],a[5063],a[5064],a[5065],a[5066],a[5067],a[5068],a[5069],a[5070],a[5071],a[5072],a[5073]],[a[5074],a[5075],a[5076],a[5077],a[5078],a[5079],a[5080],a[5081],a[5082],a[5083],a[5084],a[5085],a[5086],a[5087],a[5088],a[5089],a[5090],a[5091],a[5092],a[5093],a[5094],a[5095],a[5096],a[5097],a[5098],a[5099],a[5100],a[5101],a[5102],a[5103],a[5104],a[5105],a[5106],a[5107],a[5108],a[5109],a[5110],a[5111],a[5112],a[5113],a[5114],a[5115],a[5116],a[5117],a[5118],a[5119],a[5120],a[5121],a[5122],a[5123],a[5124],a[5125],a[5126],a[5127],a[5128],a[5129],a[5130],a[5131],a[5132],a[5133],a[5134],a[5135],a[5136],a[5137],a[5138],a[5139],a[5140],a[5141],a[5142],a[5143],a[5144],a[5145],a[5146],a[5147],a[5148],a[5149],a[5150],a[5151],a[5152],a[5153],a[5154],a[5155],a[5156],a[5157],a[5158],a[5159],a[5160],a[5161],a[5162],a[5163],a[5164],a[5165],a[5166],a[5167],a[5168],a[5169],a[5170],a[5171],a[5172],a[5173],a[5174],a[5175],a[5176],a[5177],a[5178],a[5179],a[5180],a[5181],a[5182],a[5183],a[5184],a[5185],a[5186],a[5187],a[5188],a[5189],a[5190],a[5191],a[5192],a[5193],a[5194],a[5195],a[5196],a[5197],a[5198],a[5199],a[5200],a[5201],a[5202],a[5203],a[5204],a[5205],a[5206],a[5207],a[5208],a[5209],a[5210],a[5211],a[5212],a[5213],a[5214],a[5215],a[5216],a[5217],a[5218],a[5219],a[5220],a[5221],a[5222],a[5223],a[5224],a[5225],a[5226],a[5227],a[5228],a[5229],a[5230],a[5231],a[5232],a[5233],a[5234],a[5235],a[5236],a[5237],a[5238],a[5239],a[5240],a[5241],a[5242],a[5243],a[5244],a[5245],a[5246],a[5247],a[5248],a[5249],a[5250],a[5251],a[5252],a[5253],a[5254],a[5255],a[5256],a[5257],a[5258],a[5259],a[5260],a[5261],a[5262],a[5263],a[5264],a[5265],a[5266],a[5267],a[5268],a[5269],a[5270],a[5271],a[5272],a[5273],a[5274],a[5275],a[5276],a[5277],a[5278],a[5279],a[5280],a[5281],a[5282],a[5283],a[5284],a[5285],a[5286],a[5287],a[5288],a[5289],a[5290],a[5291],a[5292],a[5293],a[5294],a[5295],a[5296],a[5297],a[5298],a[5299],a[5300],a[5301],a[5302],a[5303],a[5304],a[5305],a[5306],a[5307],a[5308],a[5309]],[a[5310],a[5311],a[5312],a[5313],a[5314],a[5315],a[5316],a[5317],a[5318],a[5319],a[5320],a[5321]],{"d":a[3011],"E":a[18],"Ed":a[2455],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[2383],"GyMMM":a[5322],"GyMMMd":a[5323],"GyMMMEd":a[5324],"h":a[28],"H":a[29],"hm":a[2387],"Hm":a[31],"hms":a[2388],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[5325],"Md":a[2389],"MEd":a[2390],"MMdd":a[2391],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[2394],"MMMMEd":a[2395],"ms":a[45],"y":a[2396],"yM":a[2397],"yMd":a[2398],"yMEd":a[2399],"yMM":a[2400],"yMMM":a[5326],"yMMMd":a[5327],"yMMMEd":a[5328],"yMMMM":a[2404],"yQQQ":a[5329],"yQQQQ":a[5330]},{"yMMMMEEEEd":a[5331],"yMMMMd":a[5332],"yMMMd":a[5327],"yMd":a[2398]},[a[5333],a[5334],a[5335],a[5336],a[5337],a[5338],a[5339],a[5340],a[5341],a[5342],a[5343],a[5344]],[a[5345],a[5346],a[5347],a[5348],a[5349],a[5350],a[3035],a[5351],a[5352],a[3038],a[5353],a[3039]],[a[5354],a[5355],a[5356],a[5357],a[5358],a[5359],a[5360],a[5361],a[5362],a[5363],a[5364],a[5365]],[a[2448],a[192],a[2452],a[2449]],[a[5366],a[5367],a[2452],a[2449]],[a[5368],a[5369],a[2452],a[2449]],[a[5370],a[5371],a[5372],a[5373],a[5374],a[5375],a[5376],a[5377],a[5378],a[5379],a[5380],a[5381],a[5382],a[5383],a[5384],a[5385],a[5386],a[5387],a[5388],a[5389],a[5390],a[5391],a[5392],a[5393],a[5394],a[5395],a[5396],a[5397],a[5398],a[5399],a[5400],a[5401],a[5402],a[5403],a[5404],a[5405],a[5406],a[5407],a[5408],a[5409],a[5410],a[5411],a[5412],a[5413],a[5414],a[5415],a[5416],a[5417],a[5418],a[5419],a[5420],a[5421],a[5422],a[5423],a[5424],a[5425],a[5426],a[5427],a[5428],a[5429],a[5430],a[5431],a[5432],a[5433],a[5434],a[5435],a[5436],a[5437],a[5438],a[5439],a[5440],a[5441],a[5442],a[5443],a[5444],a[5445],a[5446],a[5447],a[5448],a[5449],a[5450],a[5451],a[5452],a[5453],a[5454],a[5455],a[5456],a[5457],a[5458],a[5459],a[5460],a[5461],a[5462],a[5463],a[5464],a[5465],a[5466],a[5467],a[5468],a[5469],a[5470],a[5471],a[5472],a[5473],a[5474],a[5475],a[5476],a[5477],a[5478],a[5479],a[5480],a[5481],a[5482],a[5483],a[5484],a[5485],a[5486],a[5487],a[5488],a[5489],a[5490],a[5491],a[5492],a[5493],a[5494],a[5495],a[5496],a[5497],a[5498],a[5499],a[5500],a[5501],a[5502],a[5503],a[5504],a[5505],a[5506],a[5507],a[5508],a[5509],a[5510],a[5511],a[5512],a[5513],a[5514],a[5515],a[5516],a[5517],a[5518],a[5519],a[5520],a[5521],a[5522],a[5523],a[5524],a[5525],a[5526],a[5527],a[5528],a[5529],a[5530],a[5531],a[5532],a[5533],a[5534],a[5535],a[5536],a[5537],a[5538],a[5539],a[5540],a[5541],a[5542],a[5543],a[5544],a[5545],a[5546],a[5547],a[5548],a[5549],a[5550],a[5551],a[5552],a[5553],a[5554],a[5555],a[5556],a[5557],a[5558],a[5559],a[5560],a[5561],a[5562],a[5563],a[5564],a[5565],a[5566],a[5567],a[5568],a[5569],a[5570],a[5571],a[5572],a[5573],a[5574],a[5575],a[5576],a[5577],a[5578],a[5579],a[5580],a[5581],a[5582],a[5583],a[5584],a[5585],a[5586],a[5587],a[5588],a[5589],a[5590],a[5591],a[5592],a[5593],a[5594],a[5595],a[5596],a[5597],a[5598],a[5599],a[5600],a[5601],a[482],a[483],a[484],a[485]],[a[5602],a[598]],{"XAF":a[531],"XOF":a[533]},{"BAM":a[1330],"XAF":a[531],"XOF":a[533]},{"d":a[17],"E":a[18],"Ed":a[2455],"Ehm":a[1960],"EHm":a[5603],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3219],"h":a[28],"H":a[5604],"hm":a[30],"Hm":a[5605],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3221],"MEd":a[3222],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3225],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},{"hmmsszzzz":a[1228],"hmsz":a[1229],"hms":a[1230],"hm":a[5605]},[a[3137],a[3138],a[3301],a[3140],a[5606],a[3141],a[2842],a[3303],a[3143],a[3144],a[3304],a[3145]],[a[3305],a[3306],a[3307],a[3308],a[5607],a[3310],a[3311],a[3312],a[3313],a[3314],a[3315],a[3316]],[a[620],a[3317],a[3318],a[623],a[5608],a[3317],a[623]],[a[1776],a[3319],a[5609],a[3321],a[5610],a[5611],a[3324]],[a[5612],a[5613],a[5614],a[5615],a[5616],a[5617],a[3066]],{"am":a[3331],"pm":a[5618]},[a[5619],a[5620],a[5621],a[5622]],[a[5623],a[5624],a[5625],a[5626]],{"d":a[17],"E":a[18],"Ed":a[5627],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[5628],"GyMMM":a[5629],"GyMMMd":a[5630],"GyMMMEd":a[5631],"h":a[5632],"H":a[481],"hm":a[5633],"Hm":a[1231],"hms":a[5634],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[5635],"MEd":a[5636],"MMM":a[41],"MMMd":a[5637],"MMMEd":a[5638],"MMMMd":a[5639],"mmss":a[45],"ms":a[45],"y":a[2396],"yM":a[5640],"yMd":a[5641],"yMEd":a[5642],"yMMM":a[5643],"yMMMd":a[5644],"yMMMEd":a[5645],"yMMMM":a[5646],"yQQQ":a[5647],"yQQQQ":a[5648]},{"yMMMMEEEEd":a[5649],"yMMMMd":a[5650],"yMMMd":a[5644],"yMd":a[5641]},[a[61],a[62],a[63],a[5651],a[63],a[61],a[61],a[64],a[5652],a[66],a[67],a[68]],[a[3137],a[2837],a[5653],a[5654],a[5655],a[5656],a[5657],a[3142],a[5658],a[3144],a[2846],a[3145]],[a[5659],a[5660],a[5661],a[5662],a[5663],a[5664],a[5665],a[5666],a[5667],a[5668],a[3149],a[3150]],[a[574],a[481],a[707],a[5652],a[5669],a[1347],a[5652]],[a[574],a[481],a[707],a[5670],a[5669],a[1347],a[5671]],[a[5672],a[5673],a[5674],a[5675],a[5676],a[5677],a[5678]],[a[671]],{"am":a[5679],"pm":a[5680]},[a[5681],a[5682],a[189],a[190]],[a[5683],a[5684],a[189],a[190]],[a[5685],a[5686],a[5683],a[5684]],[a[5687],a[5688],a[5689],a[5690],a[5691],a[5692],a[5693],a[5694],a[5695],a[5696],a[207],a[5697],a[209],a[5698]],[a[5699]],[a[5700],a[225],a[5701],a[5702],a[5703],a[5704],a[5705],a[5706],a[232],a[5707],a[5708],a[5709]],[a[5710],a[237],a[5711],a[5712],a[5713],a[5714],a[5715],a[5716],a[5717],a[5718],a[5719],a[5720]],[a[5721]],[a[5722],a[598]],{"HUF":a[5723],"JPY":a[524],"XAF":a[531],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[5724],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[5725],"GyMMM":a[5726],"GyMMMd":a[5727],"GyMMMEd":a[5728],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1689],"MEd":a[1690],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1691],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[1693],"yMEd":a[5729],"yMMM":a[5730],"yMMMd":a[5731],"yMMMEd":a[5732],"yMMMM":a[5733],"yQQQ":a[5734],"yQQQQ":a[5735]},{"yMMMMEEEEd":a[5736],"yMMMMd":a[5737],"yMMMd":a[5738],"yMd":a[1697]},{"hmmsszzzz":a[5739],"hmsz":a[5740],"hms":a[1230],"hm":a[1231]},[a[5741],a[5742],a[5743],a[5744],a[5743],a[5741],a[5741],a[5745],a[5746],a[5741],a[5747],a[5748]],[a[5749],a[5750],a[5751],a[5752],a[5753],a[5754],a[5755],a[5756],a[5757],a[5758],a[5759],a[5760]],[a[5761],a[5762],a[5763],a[5764],a[5765],a[5766],a[5767],a[5768],a[5769],a[5770],a[5771],a[5772]],[a[5773],a[5774],a[5774],a[5775],a[5741],a[5776],a[5777]],[a[5778],a[5779],a[5780],a[5781],a[5782],a[5783],a[5784]],[a[5785],a[5786],a[5787],a[5788],a[5789],a[5790],a[5791]],[a[5792],a[5793],a[5794],a[190]],[a[5792],a[5793],a[5795],a[5796]],{"AMD":a[5797],"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[3124],"EHm":a[1819],"Ehms":a[3125],"EHms":a[1821],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[3128],"Hm":a[1825],"hms":a[3129],"Hms":a[1827],"hmsv":a[5798],"Hmsv":a[1829],"hmv":a[3131],"Hmv":a[1831],"M":a[38],"Md":a[608],"MEd":a[542],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[1835],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[551],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3080]},[a[69],a[70],a[71],a[72],a[558],a[74],a[75],a[4747],a[77],a[1301],a[79],a[5799]],[a[1302],a[1303],a[5800],a[84],a[558],a[1306],a[3228],a[5801],a[88],a[572],a[90],a[573]],[a[63],a[65],a[65],a[603],a[707],a[61],a[65]],[a[5802],a[5803],a[5804],a[5805],a[5806],a[3202],a[1924]],[a[5807],a[5808],a[5809],a[5810],a[5811],a[5812],a[5813]],[a[5814],a[63],a[5815],a[5816]],[a[5817],a[63],a[5818],a[5819]],[a[224],a[225],a[226],a[227],a[228],a[229],a[230],a[231],a[232],a[5820],a[234],a[235]],[a[236],a[237],a[238],a[239],a[240],a[241],a[242],a[5821],a[5822],a[5823],a[246],a[247]],[a[249],a[250],a[251],a[252],a[253],a[254],a[255],a[256],a[257],a[258],a[5824],a[5825],a[5826],a[5827],a[5828],a[264],a[265],a[266],a[267],a[268],a[269],a[270],a[271],a[272],a[273],a[5829],a[5830],a[276],a[5831],a[278],a[5832],a[280],a[281],a[282],a[5833],a[284],a[285],a[286],a[287],a[288],a[289],a[290],a[5834],a[292],a[293],a[294],a[295],a[5835],a[297],a[298],a[299],a[300],a[301],a[302],a[303],a[304],a[305],a[306],a[307],a[308],a[309],a[310],a[311],a[312],a[313],a[314],a[315],a[316],a[5836],a[318],a[319],a[5837],a[321],a[5838],a[323],a[324],a[325],a[326],a[327],a[328],a[5839],a[5840],a[331],a[332],a[333],a[334],a[5841],a[336],a[337],a[5842],a[339],a[340],a[341],a[5843],a[343],a[344],a[345],a[346],a[347],a[5844],a[349],a[350],a[351],a[352],a[353],a[354],a[5845],a[356],a[357],a[358],a[359],a[360],a[5846],a[5847],a[363],a[364],a[5848],a[366],a[367],a[368],a[369],a[370],a[371],a[5849],a[373],a[374],a[375],a[1680],a[377],a[378],a[379],a[380],a[381],a[382],a[383],a[5850],a[385],a[5851],a[387],a[388],a[389],a[390],a[391],a[392],a[393],a[394],a[5852],a[396],a[397],a[398],a[399],a[5853],a[401],a[5854],a[403],a[404],a[5855],a[406],a[407],a[408],a[409],a[410],a[411],a[412],a[413],a[414],a[415],a[416],a[417],a[418],a[419],a[420],a[421],a[422],a[5856],a[424],a[425],a[426],a[427],a[428],a[429],a[430],a[431],a[432],a[433],a[434],a[435],a[436],a[437],a[438],a[5857],a[440],a[441],a[442],a[443],a[444],a[445],a[5858],a[5859],a[448],a[449],a[5860],a[5861],a[452],a[453],a[454],a[5862],a[456],a[457],a[458],a[459],a[460],a[461],a[462],a[463],a[5863],a[5864],a[466],a[5865],a[468],a[469],a[470],a[471],a[472],a[473],a[474],a[475],a[476],a[5866],a[478],a[479],a[480],a[482],a[483],a[484],a[485]],[a[5867],a[598]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"IDR":a[5868],"ILS":a[522],"INR":a[3677],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[5869],a[70],a[3511],a[1901],a[3399],a[5870],a[75],a[5871],a[77],a[5872],a[79],a[1903]],[a[5873],a[5874],a[5875],a[5876],a[3399],a[5877],a[5878],a[5879],a[1309],a[5880],a[1311],a[1906]],[a[5881],a[5882],a[5883],a[5884],a[5885],a[5886],a[100]],[a[5887],a[5888],a[5889],a[5890],a[5891],a[5892],a[5893]],{"am":a[2305],"pm":a[5894]},[a[5895],a[5896],a[189],a[190]],[a[5897],a[5898],a[189],a[190]],[a[5899],a[5900],a[5901],a[5902],a[5903],a[5904],a[5905],a[5906],a[5907],a[5908],a[5909],a[5910]],[a[5911],a[5912],a[5913],a[5914],a[5915],a[5916],a[5917]],[a[5918],a[5919],a[5920],a[5921],a[5922],a[5923],a[5924]],[a[5925],a[5926],a[5927],a[5928],a[5929],a[5930],a[5931]],{"am":a[5932],"pm":a[5933]},[a[5934],a[5935],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[3012],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3219],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3221],"MEd":a[3222],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[2394],"MMMMEd":a[2395],"ms":a[45],"y":a[46],"yM":a[5936],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3225],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3226],"yMMMMd":a[3025],"yMMMd":a[3134],"yMd":a[1837]},[a[61],a[62],a[63],a[64],a[63],a[61],a[61],a[5651],a[65],a[66],a[67],a[68]],[a[3137],a[3138],a[3139],a[3140],a[5937],a[5656],a[5657],a[5938],a[3143],a[3144],a[5939],a[2847]],[a[5940],a[5941],a[4257],a[4258],a[5937],a[5942],a[5943],a[5944],a[3147],a[5668],a[5945],a[4259]],[a[65],a[63],a[5946],a[63],a[62],a[62],a[38]],[a[4260],a[4261],a[5947],a[5948],a[5949],a[5950],a[5951]],[a[4267],a[5952],a[5953],a[5954],a[5955],a[5956],a[5957]],{"am":a[5958],"pm":a[5959]},[a[5960],a[5961],a[5962],a[5963]],[a[3169],a[3170],a[5962],a[5963]],[a[5964],a[4279],a[5965],a[5966]],{"CNY":a[518],"HKD":a[521],"ILS":a[522],"JPY":a[600],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[553],"yMd":a[3080]},[a[2293],a[62],a[63],a[64],a[63],a[2293],a[38],a[64],a[65],a[66],a[67],a[68]],[a[1409],a[1349],a[1350],a[1700],a[5967],a[5968],a[5969],a[1355],a[1356],a[5970],a[2417],a[3837]],[a[5971],a[5972],a[3778],a[5973],a[5974],a[5975],a[5976],a[3781],a[5977],a[5978],a[4297],a[5979]],[a[68],a[38],a[63],a[63],a[2293],a[574],a[65]],[a[1372],a[4439],a[1350],a[5980],a[5981],a[4654],a[4443]],[a[5982],a[5983],a[5984],a[5985],a[5986],a[5987],a[3750]],[a[1433],a[1434],a[189],a[190]],[a[1437],a[1438],a[5988],a[5989]],[a[1437],a[1438],a[5990],a[5991]],[a[5992],a[500]],{"AUD":a[515],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"ILS":a[522],"INR":a[523],"NZD":a[527],"THB":a[601],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[5993],"yMd":a[1697]},{"d":a[5994],"E":a[18],"Ed":a[5995],"EEEEd":a[5996],"Ehm":a[5997],"EHm":a[5998],"Ehms":a[5999],"EHms":a[6000],"Gy":a[6001],"GyMMM":a[6002],"GyMMMd":a[6003],"GyMMMEd":a[6004],"GyMMMEEEEd":a[6005],"h":a[6006],"H":a[6007],"hm":a[6008],"Hm":a[1231],"hms":a[6009],"Hms":a[1230],"hmsv":a[6010],"Hmsv":a[3018],"hmv":a[6011],"Hmv":a[3019],"M":a[6012],"Md":a[39],"MEd":a[6013],"MEEEEd":a[6014],"MMM":a[6012],"MMMd":a[6015],"MMMEd":a[6016],"MMMEEEEd":a[6017],"MMMMd":a[6015],"ms":a[45],"y":a[6018],"yM":a[3895],"yMd":a[678],"yMEd":a[6019],"yMEEEEd":a[6020],"yMM":a[6021],"yMMM":a[6022],"yMMMd":a[6023],"yMMMEd":a[6024],"yMMMEEEEd":a[6025],"yMMMM":a[6022],"yQQQ":a[6026],"yQQQQ":a[6027]},{"yMMMMEEEEd":a[6025],"yMMMMd":a[6023],"yMMMd":a[3715],"yMd":a[3715]},{"hmmsszzzz":a[6028],"hmsz":a[1229],"hms":a[1230],"hm":a[1231]},[a[6029],a[6030],a[6031],a[6032],a[6033],a[6034],a[6035],a[6036],a[6037],a[6038],a[6039],a[6040]],[a[6041],a[6042],a[6043],a[6044],a[6045],a[6046],a[6047]],[a[6048],a[6049],a[6050],a[6051],a[6052],a[6053],a[6054]],[a[6055]],{"am":a[6056],"pm":a[6057]},[a[6058],a[6059],a[6060],a[6061],a[6062],a[6063],a[6064],a[6065],a[6066],a[6067],a[6068],a[6069]],[a[6070],a[6071],a[6072],a[6073],a[6074],a[6075],a[6076],a[6077],a[6078],a[6079],a[6080],a[6081]],[a[6082],a[6083],a[6084],a[6085],a[6086],a[6087],a[6088],a[6089],a[6090],a[6091],a[6092],a[6093],a[6094]],[a[6095],a[6096],a[6097],a[6098],a[6099],a[6100],a[6101],a[6102],a[6103],a[6104],a[6105],a[6106],a[6107]],[a[6108],a[6109],a[6110],a[6111]],[a[6112],a[6113],a[6114],a[6115],a[6116],a[6117],a[6118],a[6119],a[6120],a[6121],a[6122],a[6123],a[6124],a[6125]],[a[6126],a[6127],a[6128],a[6129],a[6130],a[6131],a[6132],a[6133],a[6134],a[6135],a[6136],a[6137]],[a[6138]],[a[6139],a[6140],a[6141],a[6142],a[6143],a[6144],a[6145],a[6146],a[6147],a[6148],a[6149],a[6150]],[a[6151],a[6152],a[6153],a[6154],a[6155],a[6156],a[6157],a[6158],a[6159],a[6160],a[6161],a[6162],a[6163],a[6164],a[6165],a[6166],a[6167],a[6168],a[6169],a[6170],a[6171],a[6172],a[6173],a[6174],a[6175],a[6176],a[6177],a[6178],a[6179],a[6180],a[6181],a[6182],a[6183],a[6184],a[6185],a[6186],a[6187],a[6188],a[6189],a[6190],a[6191],a[6192],a[6193],a[6194],a[6195],a[6196],a[6197],a[6198],a[6199],a[6200],a[6201],a[6202],a[6203],a[6204],a[6205],a[6206],a[6207],a[6208],a[6209],a[6210],a[6211],a[6212],a[6213],a[6214],a[6215],a[6216],a[6217],a[6218],a[6219],a[6220],a[6221],a[6222],a[6223],a[6224],a[6225],a[6226],a[6227],a[6228],a[6229],a[6230],a[6231],a[6232],a[6233],a[6234],a[6235],a[6236],a[6237],a[6238],a[6239],a[6240],a[6241],a[6242],a[6243],a[6244],a[6245],a[6246],a[6247],a[6248],a[6249],a[6250],a[6251],a[6252],a[6253],a[6254],a[6255],a[6256],a[6257],a[6258],a[6259],a[6260],a[6261],a[6262],a[6263],a[6264],a[6265],a[6266],a[6267],a[6268],a[6269],a[6270],a[6271],a[6272],a[6273],a[6274],a[6275],a[6276],a[6277],a[6278],a[6279],a[6280],a[6281],a[6282],a[6283],a[6284],a[6285],a[6286],a[6287],a[6288],a[6289],a[6290],a[6291],a[6292],a[6293],a[6294],a[6295],a[6296],a[6297],a[6298],a[6299],a[6300],a[6301],a[6302],a[6303],a[6304],a[6305],a[6306],a[6307],a[6308],a[6309],a[6310],a[6311],a[6312],a[6313],a[6314],a[6315],a[6316],a[6317],a[6318],a[6319],a[6320],a[6321],a[6322],a[6323],a[6324],a[6325],a[6326],a[6327],a[6328],a[6329],a[6330],a[6331],a[6332],a[6333],a[6334],a[6335],a[6336],a[6337],a[6338],a[6339],a[6340],a[6341],a[6342],a[6343],a[6344],a[6345],a[6346],a[6347],a[6348],a[6349],a[6350],a[6351],a[6352],a[6353],a[6354],a[6355],a[6356],a[6357],a[6358],a[6359],a[6360],a[6361],a[6362],a[6363],a[6364],a[6365],a[6366],a[6367],a[6368],a[6369],a[6370],a[6371],a[6372],a[6373],a[6374],a[6375],a[6376],a[6377],a[6378],a[6379],a[6380],a[6381],a[6382],a[63],a[92],a[65],a[481]],[a[6151],a[6152],a[6153],a[6154],a[6155],a[6156],a[6157],a[6158],a[6159],a[6160],a[6161],a[6162],a[6163],a[6164],a[6165],a[6166],a[6167],a[6168],a[6169],a[6170],a[6171],a[6172],a[6173],a[6174],a[6175],a[6176],a[6177],a[6178],a[6179],a[6180],a[6181],a[6182],a[6183],a[6184],a[6185],a[6186],a[6187],a[6188],a[6189],a[6190],a[6191],a[6192],a[6193],a[6194],a[6195],a[6196],a[6197],a[6198],a[6199],a[6200],a[6201],a[6202],a[6203],a[6204],a[6205],a[6206],a[6207],a[6208],a[6209],a[6210],a[6211],a[6212],a[6213],a[6214],a[6215],a[6216],a[6217],a[6218],a[6219],a[6220],a[6221],a[6222],a[6223],a[6224],a[6225],a[6226],a[6227],a[6228],a[6229],a[6230],a[6231],a[6232],a[6233],a[6234],a[6235],a[6236],a[6237],a[6238],a[6239],a[6240],a[6241],a[6242],a[6243],a[6244],a[6245],a[6246],a[6247],a[6248],a[6249],a[6250],a[6251],a[6252],a[6253],a[6254],a[6255],a[6256],a[6257],a[6258],a[6259],a[6260],a[6261],a[6262],a[6263],a[6264],a[6265],a[6266],a[6267],a[6268],a[6269],a[6270],a[6271],a[6272],a[6273],a[6274],a[6275],a[6276],a[6277],a[6278],a[6279],a[6280],a[6281],a[6282],a[6283],a[6284],a[6285],a[6286],a[6287],a[6288],a[6289],a[6290],a[6291],a[6292],a[6293],a[6294],a[6295],a[6296],a[6297],a[6298],a[6299],a[6300],a[6301],a[6302],a[6303],a[6304],a[6305],a[6306],a[6307],a[6308],a[6309],a[6310],a[6311],a[6312],a[6313],a[6314],a[6315],a[6316],a[6317],a[6318],a[6319],a[6320],a[6321],a[6322],a[6323],a[6324],a[6325],a[6326],a[6327],a[6328],a[6329],a[6330],a[6331],a[6332],a[6333],a[6334],a[6335],a[6336],a[6337],a[6338],a[6339],a[6340],a[6341],a[6342],a[6343],a[6344],a[6345],a[6346],a[6347],a[6348],a[6349],a[6350],a[6351],a[6352],a[6353],a[6354],a[6355],a[6356],a[6357],a[6358],a[6359],a[6360],a[6361],a[6362],a[6363],a[6364],a[6365],a[6366],a[6367],a[6368],a[6369],a[6370],a[6371],a[6372],a[6373],a[6374],a[6375],a[6376],a[6377],a[6378],a[6379],a[6380],a[6381],a[6382],a[6383],a[6384],a[6385],a[6386]],[a[6387],a[6388],a[6389],a[6390],a[6391],a[6392],a[6393],a[6394],a[6395],a[6396],a[6397],a[6398]],[a[6399],a[6400]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[6401],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[6402],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1832],"MEd":a[1833],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[6403],"yMEd":a[1256],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[680],"yMMMMd":a[681],"yMMMd":a[679],"yMd":a[547]},[a[6404],a[6405],a[6406],a[6407],a[6408],a[6409],a[6410],a[6411],a[6412],a[6413],a[6414],a[6415]],[a[6416],a[6417],a[6418],a[6419],a[6420],a[6421],a[6422]],[a[6423],a[6424],a[6425],a[6426],a[6427],a[6428],a[6429]],{"am":a[6430],"pm":a[6431]},[a[6432],a[6433],a[189],a[190]],[a[69],a[70],a[1299],a[72],a[558],a[74],a[75],a[1300],a[77],a[1301],a[79],a[5799]],[a[1302],a[1303],a[1304],a[6434],a[558],a[6435],a[6436],a[6437],a[1309],a[1310],a[1311],a[1312]],[a[1314],a[1315],a[1316],a[1317],a[1318],a[6438],a[1320]],[a[6439],a[6440],a[1323],a[6441],a[1325],a[1326],a[1327]],{"am":a[6442],"pm":a[6443]},[a[6444],a[6445],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[6446],"GyMMMd":a[6447],"GyMMMEd":a[6448],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1832],"MEd":a[1833],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[6449],"yMMMd":a[6450],"yMMMEd":a[6451],"yMMMM":a[6452],"yQQQ":a[6453],"yQQQQ":a[6454]},{"yMMMMEEEEd":a[6455],"yMMMMd":a[1747],"yMMMd":a[6450],"yMd":a[1697]},[a[6456],a[6457],a[6458],a[6459],a[6458],a[6456],a[6456],a[6459],a[6460],a[6461],a[6462],a[6463]],[a[6464],a[6465],a[6466],a[6467],a[6468],a[6469],a[6470],a[6471],a[6472],a[6473],a[6474],a[6475]],[a[6476],a[6477],a[6478],a[6479],a[6480],a[6481],a[6482],a[6483],a[6484],a[6485],a[6486],a[6487]],[a[6488],a[6461],a[6460],a[6461],a[6489],a[6490],a[6491]],[a[6492],a[6493],a[6494],a[6495],a[6496],a[6497],a[6498]],[a[6499],a[6500],a[6501],a[6502],a[6503],a[6504],a[6505]],[a[6506],a[6507],a[6508],a[6509]],[a[6510],a[6511],a[6512],a[6513]],{"decimal":a[509],"group":a[599],"nan":a[6514],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"BRL":a[516],"CAD":a[517],"EUR":a[519],"GBP":a[520],"MXN":a[526],"TWD":a[528],"USD":a[602],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[708],a[62],a[63],a[708],a[63],a[708],a[708],a[6515],a[3116],a[92],a[67],a[68]],[a[6516],a[6517],a[6518],a[6519],a[73],a[4811],a[4812],a[6520],a[6521],a[6522],a[6523],a[6524]],[a[6525],a[6526],a[6527],a[6528],a[6529],a[6530],a[6531],a[6532],a[6533],a[6534],a[6535],a[6536]],[a[708],a[65],a[707],a[707],a[65],a[65],a[65]],[a[6537],a[6538],a[6539],a[6540],a[6541],a[6542],a[6543]],[a[6544],a[6545],a[6546],a[6547],a[6548],a[6549],a[6550]],{"am":a[6551],"pm":a[6552]},[a[6553],a[6554],a[189],a[190]],[a[6555],a[6556],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DZD":a[4412],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[63],a[707],a[707],a[707],a[707],a[92],a[63],a[67],a[707],a[6557],a[6557],a[6557]],[a[3485],a[6558],a[6559],a[3181],a[6560],a[6561],a[6562],a[6563],a[6564],a[6565],a[6566],a[6567]],[a[6568],a[6569],a[6570],a[6571],a[6572],a[6573],a[6574],a[6575],a[6576],a[6577],a[6578],a[6579]],[a[708],a[93],a[1900],a[64],a[64],a[64],a[64]],[a[6580],a[6581],a[6582],a[6583],a[6584],a[6585],a[6586]],[a[6587],a[6588],a[6589],a[6590],a[6591],a[6592],a[6593]],{"am":a[6594],"pm":a[6595]},[a[6596],a[6597],a[189],a[190]],[a[6598],a[6599],a[189],a[190]],[a[6600],a[6601],a[6602],a[6603],a[6604],a[6605],a[6606],a[6607],a[6608],a[6609],a[6610],a[6611]],[a[112],a[113],a[114],a[115],a[116],a[117],a[111]],[a[6612],a[6613],a[6614],a[6615],a[6616],a[6617],a[6618]],[a[6619],a[6620],a[6621],a[6622],a[6623],a[6624],a[6625]],{"am":a[6626],"pm":a[6627]},[a[6628],a[6629],a[189],a[190]],[a[6630],a[6631],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[6632],"GyMMMd":a[6633],"GyMMMEd":a[6634],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[4418],"MMMMEd":a[6635],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMM":a[2071],"yMMM":a[6636],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[6637],"yQQQ":a[54],"yQQQQ":a[6638]},{"yMMMMEEEEd":a[6639],"yMMMMd":a[6640],"yMMMd":a[549],"yMd":a[611]},[a[69],a[70],a[71],a[4225],a[3087],a[74],a[75],a[1300],a[4228],a[4428],a[6641],a[6642]],[a[6643],a[6644],a[6645],a[4233],a[6646],a[6647],a[6648],a[6649],a[6650],a[6651],a[6652],a[6653]],[a[68],a[65],a[92],a[707],a[707],a[65],a[65]],[a[634],a[6654],a[1405],a[6655],a[6656],a[6657],a[4443]],[a[6658],a[6659],a[6660],a[6661],a[6662],a[6663],a[6664]],[a[725],a[6665],a[6666],a[6667]],[a[6668],a[6669],a[6670],a[6671]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"CVE":a[6672],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[481],a[92],a[92],a[38],a[38],a[38],a[65]],[a[1318],a[3280],a[3281],a[3282],a[3283],a[6673],a[6674]],[a[3286],a[6675],a[6676],a[3289],a[6677],a[6678],a[6679]],{"am":a[6680],"pm":a[6681]},[a[3296],a[6682],a[189],a[190]],[a[61],a[707],a[2293],a[707],a[2293],a[2293],a[63],a[707],a[707],a[1313],a[1313],a[68]],[a[6683],a[6684],a[6685],a[6686],a[6687],a[6688],a[6689],a[6690],a[6691],a[6692],a[6693],a[6694]],[a[6695],a[6696],a[6697],a[6698],a[6699],a[6700],a[6701],a[6702],a[6703],a[6704],a[6705],a[6706]],[a[707],a[67],a[67],a[67],a[64],a[67],a[67]],[a[6707],a[6708],a[6709],a[6710],a[6711],a[6712],a[3512]],[a[3513],a[6713],a[3515],a[6714],a[3517],a[3518],a[6715]],{"am":a[6716],"pm":a[6717]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[6718],"EHm":a[21],"Ehms":a[6719],"EHms":a[23],"Gy":a[6720],"GyMMM":a[6721],"GyMMMd":a[6722],"GyMMMEd":a[6723],"h":a[5632],"H":a[29],"hm":a[5633],"Hm":a[31],"hms":a[5634],"Hms":a[33],"hmsv":a[6724],"Hmsv":a[35],"hmv":a[6725],"Hmv":a[37],"M":a[38],"Md":a[1689],"MEd":a[1690],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1691],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[1693],"yMEd":a[1694],"yMMM":a[6726],"yMMMd":a[6727],"yMMMEd":a[6728],"yMMMM":a[6729],"yQQQ":a[6730],"yQQQQ":a[6731]},{"yMMMMEEEEd":a[6732],"yMMMMd":a[6733],"yMMMd":a[6734],"yMd":a[1697]},[a[6735],a[6736],a[6737],a[6738],a[6739],a[6739],a[6740],a[6741],a[6735],a[6735],a[6735],a[6742]],[a[6743],a[6744],a[6745],a[6746],a[6747],a[6748],a[6749],a[6750],a[6751],a[6752],a[6753],a[6754]],[a[6755],a[6756],a[6757],a[6758],a[6759],a[6760],a[6761],a[6762],a[6763],a[6764],a[6765],a[6766]],[a[6742],a[6767],a[6738],a[6738],a[6768],a[6742],a[6738]],[a[6769],a[6770],a[6771],a[6772],a[6773],a[6774],a[6775]],[a[6776],a[6777],a[6778],a[6779],a[6780],a[6781],a[6782]],{"am":a[6783],"pm":a[6784]},[a[6785],a[6786],a[189],a[190]],[a[6787],a[6788],a[189],a[190]],{"AUD":a[515],"BMD":a[6789],"BRL":a[516],"CAD":a[6790],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"KZT":a[6791],"MXN":a[526],"NZD":a[527],"RUB":a[1899],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[2259],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[6792],"yMd":a[6793],"yMEd":a[6794],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[4639],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[6793]},[a[6795],a[6796],a[6797],a[6798],a[6799],a[6800],a[6801],a[6802],a[6803],a[6804],a[121],a[6805]],[a[3059],a[3738],a[3739],a[2077],a[6806],a[6807],a[6808]],[a[6809],a[4305],a[4306],a[6810],a[6811],a[6812],a[6813]],[a[6814],a[6815],a[6816],a[6817],a[6818],a[2422],a[2423],a[6819],a[6820],a[6821],a[6822],a[6823]],[a[4443],a[6824],a[1350],a[6825],a[6826],a[6827],a[6828]],[a[6829],a[6830],a[6831],a[6832],a[6833],a[6834],a[6835]],[a[63],a[67],a[92],a[1313],a[63],a[1347],a[67],a[603],a[188],a[1900],a[707],a[707]],[a[1942],a[6836],a[6837],a[6838],a[6839],a[6840],a[6841],a[6842],a[6843],a[6844],a[6845],a[6846]],[a[6847],a[6848],a[6849],a[6850],a[6851],a[6852],a[6853],a[6854],a[6855],a[6856],a[6857],a[6858]],[a[92],a[92],a[66],a[65],a[64],a[63],a[38]],[a[6859],a[6860],a[6861],a[6862],a[6863],a[6864],a[6865]],[a[6866],a[6867],a[6868],a[6869],a[6870],a[6871],a[6872]],{"am":a[6873],"pm":a[6874]},[a[109],a[6875],a[189],a[190]],[a[6876],a[6877],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[6879],"GyMMM":a[6880],"GyMMMd":a[6881],"GyMMMEd":a[6882],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[4455],"MEd":a[544],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[3814],"yMd":a[4456],"yMEd":a[4457],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[1345]},[a[6883],a[6884],a[6885],a[6886],a[6887],a[6888],a[6889],a[6890],a[6891],a[6892],a[6893],a[6894]],[a[6895],a[6896],a[6897],a[6898],a[6899],a[6900],a[6901]],[a[6902],a[6903],a[6904],a[6905],a[6906],a[6907],a[6908]],{"am":a[6909],"pm":a[6910]},[a[6911],a[6912],a[189],a[190]],[a[6913],a[6914],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KHR":a[6915],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[6916],"MMdd":a[541],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[49],"yMM":a[546],"yMMM":a[50],"yMMMd":a[6917],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[56],"yMMMMd":a[57],"yMMMd":a[51],"yMd":a[1345]},[a[6918],a[6919],a[6920],a[6921],a[6922],a[6923],a[6924],a[6925],a[6926],a[6927],a[6928],a[6929]],[a[6930],a[6931],a[6932],a[6933],a[6922],a[6934],a[6935],a[6936],a[6937],a[6938],a[6939],a[6940]],[a[6941],a[6942],a[6932],a[6943],a[6922],a[6934],a[6935],a[6944],a[6945],a[6946],a[6947],a[6948]],[a[6949],a[6950],a[6951],a[6952],a[6953],a[6954],a[6955]],[a[6956],a[6957],a[6958],a[6959],a[6960],a[6961],a[6962]],[a[6963],a[6964],a[6965],a[6966],a[6967],a[6968],a[6969]],{"am":a[6970],"pm":a[6971]},[a[6972],a[6973],a[6974],a[6975]],[a[6976],a[6977],a[6974],a[6975]],{"d":a[6978],"E":a[18],"Ed":a[6979],"EEEEd":a[6980],"Ehm":a[6981],"EHm":a[6982],"Ehms":a[6983],"EHms":a[6984],"Gy":a[6985],"GyMMM":a[6986],"GyMMMd":a[6987],"GyMMMEd":a[6988],"GyMMMEEEEd":a[6989],"h":a[6990],"H":a[6991],"HHmmss":a[33],"hm":a[5633],"Hm":a[31],"hms":a[5634],"Hms":a[6992],"hmsv":a[6724],"Hmsv":a[6993],"hmv":a[6725],"Hmv":a[37],"M":a[6994],"Md":a[5635],"MEd":a[6995],"MEEEEd":a[6996],"MMM":a[41],"MMMd":a[6997],"MMMEd":a[6998],"MMMEEEEd":a[6999],"MMMMd":a[7000],"mmss":a[45],"ms":a[45],"y":a[7001],"yM":a[5640],"yMd":a[7002],"yMEd":a[7003],"yMEEEEd":a[7004],"yMM":a[5640],"yMMM":a[7005],"yMMMd":a[7006],"yMMMEd":a[7007],"yMMMEEEEd":a[7008],"yMMMM":a[7009],"yQQQ":a[7010],"yQQQQ":a[7011]},{"yMMMMEEEEd":a[7012],"yMMMMd":a[7013],"yMMMd":a[7002],"yMd":a[7014]},{"hmmsszzzz":a[7015],"hmsz":a[7016],"hms":a[5634],"hm":a[5633]},[a[7017],a[7018],a[7019],a[7020],a[7021],a[7022],a[7023],a[7024],a[7025],a[7026],a[7027],a[7028]],[a[7029],a[7030],a[7031],a[7032],a[7033],a[7034],a[7035]],[a[7036],a[7037],a[7038],a[7039],a[7040],a[7041],a[7042]],[a[7043]],{"am":a[7044],"pm":a[7045]},[a[7046],a[7047],a[7048],a[7049],a[7050],a[7051],a[7052],a[7053],a[7054],a[7055],a[7056],a[7057],a[7058]],[a[7059],a[7060],a[7061],a[7062],a[7063],a[7064],a[7065],a[7066],a[7067],a[7068],a[7069],a[7070],a[7071]],[a[7072],a[7073],a[189],a[190]],[a[7074],a[7075],a[7076],a[7077],a[7078],a[7079],a[7080],a[7081],a[7082],a[7083],a[7084],a[7085],a[7086],a[7087]],[a[7088],a[7089],a[7090],a[7091],a[7092],a[7093],a[7094],a[7095],a[7096],a[7097],a[7098],a[7099]],[a[7100],a[7101],a[7102],a[7103],a[7104],a[7105],a[7106],a[7107],a[7108],a[7109],a[7110],a[7111],a[7112],a[7113],a[7114],a[7115],a[7116],a[7117],a[7118],a[7119],a[7120],a[7121],a[7122],a[7123],a[7124],a[7125],a[7126],a[7127],a[7128],a[7129],a[7130],a[7131],a[7132],a[7133],a[7134],a[7135],a[7136],a[7137],a[7138],a[7139],a[7140],a[7141],a[7142],a[7143],a[7144],a[7145],a[7146],a[7147],a[7148],a[7149],a[7150],a[7151],a[7152],a[7153],a[7154],a[7155],a[7156],a[7157],a[7158],a[7159],a[7160],a[7161],a[7162],a[7163],a[7164],a[7165],a[7166],a[7167],a[7168],a[7169],a[7170],a[7171],a[7172],a[7173],a[7174],a[7175],a[7176],a[7177],a[7178],a[7179],a[7180],a[7181],a[7182],a[7183],a[7184],a[7185],a[7186],a[7187],a[7188],a[7189],a[7190],a[7191],a[7192],a[7193],a[7194],a[7195],a[7196],a[7197],a[7198],a[7199],a[7200],a[7201],a[7202],a[7203],a[7204],a[7205],a[7206],a[7207],a[7208],a[7209],a[7210],a[7211],a[7212],a[7213],a[7214],a[7215],a[7216],a[7217],a[7218],a[7219],a[7220],a[7221],a[7222],a[7223],a[7224],a[7225],a[7226],a[7227],a[7228],a[7229],a[7230],a[7231],a[7232],a[7233],a[7234],a[7235],a[7236],a[7237],a[7238],a[7239],a[7240],a[7241],a[7242],a[7243],a[7244],a[7245],a[7246],a[7247],a[7248],a[7249],a[7250],a[7251],a[7252],a[7253],a[7254],a[7255],a[7256],a[7257],a[7258],a[7259],a[7260],a[7261],a[7262],a[7263],a[7264],a[7265],a[7266],a[7267],a[7268],a[7269],a[7270],a[7271],a[7272],a[7273],a[7274],a[7275],a[7276],a[7277],a[7278],a[7279],a[7280],a[7281],a[7282],a[7283],a[7284],a[7285],a[7286],a[7287],a[7288],a[7289],a[7290],a[7291],a[7292],a[7293],a[7294],a[7295],a[7296],a[7297],a[7298],a[7299],a[7300],a[7301],a[7302],a[7303],a[7304],a[7305],a[7306],a[7307],a[7308],a[7309],a[7310],a[7311],a[7312],a[7313],a[7314],a[7315],a[7316],a[7317],a[7318],a[7319],a[7320],a[7321],a[7322],a[7323],a[7324],a[7325],a[7326],a[7327],a[7328],a[7329],a[7330],a[7331],a[7332],a[7333],a[7334],a[7335]],[a[7336],a[7337],a[7338],a[7339],a[7340],a[7341],a[7342],a[7343],a[7344],a[7345],a[7346],a[7347]],[a[7348],a[7349]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[7350],a[2335],a[4994],a[7351],a[2327],a[4997],a[7352],a[7353],a[7354],a[7355],a[7356],a[7357]],[a[5016],a[5017],a[7358],a[5018],a[5019],a[5020],a[5021]],[a[7359],a[5023],a[7360],a[5025],a[5026],a[5027],a[5028]],{"am":a[7361],"pm":a[7362]},[a[7363],a[7364],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[7365],"GyMMM":a[7366],"GyMMMd":a[7367],"GyMMMEd":a[7368],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[2322],"MMMEd":a[43],"MMMMd":a[44],"MMMMEd":a[677],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[547],"yMEd":a[7369],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[7370],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[850],a[823],a[824],a[4003],a[824],a[850],a[850],a[4003],a[830],a[830],a[4003],a[827]],[a[7371],a[7372],a[7373],a[4084],a[7374],a[7375],a[7376],a[4087],a[7377],a[7378],a[4090],a[4091]],[a[4003],a[4002],a[832],a[832],a[832],a[850],a[832]],[a[7379],a[7380],a[7381],a[7382],a[7383],a[7384],a[7385]],[a[7386],a[7387],a[7381],a[7382],a[7383],a[7384],a[7385]],[a[7388],a[7389],a[189],a[190]],[a[7390],a[7391],a[189],a[190]],[a[918],a[919],a[7392],a[7393],a[4050],a[4051],a[924],a[925],a[926],a[927],a[7394],a[7395]],{"decimal":a[1184],"group":a[1185],"nan":a[510],"plusSign":a[4069],"minusSign":a[7396],"percentSign":a[1189],"infinity":a[514]},{"decimal":a[508],"group":a[509],"nan":a[510],"plusSign":a[1191],"minusSign":a[1192],"percentSign":a[513],"infinity":a[7397]},[a[7398],a[7399],a[1304],a[7400],a[558],a[1306],a[1307],a[1308],a[1309],a[1310],a[1311],a[1312]],[a[112],a[113],a[114],a[115],a[64],a[1313],a[111]],[a[1314],a[1315],a[7401],a[1317],a[1318],a[6438],a[1320]],[a[7402],a[7403],a[7404],a[7405],a[1325],a[1326],a[7406]],{"am":a[7407],"pm":a[7408]},[a[7409],a[7410],a[189],a[190]],[a[7411],a[7412],a[7413],a[7414],a[7415],a[7416],a[7417],a[7418],a[7419],a[7420],a[7421],a[7422]],[a[7423],a[7424],a[7425],a[7426],a[7427],a[7428],a[7429],a[7430],a[7431],a[7432],a[7433],a[7434]],[a[623],a[626],a[1767],a[1767],a[1794],a[1794],a[623]],[a[3972],a[7435],a[7436],a[7437],a[7438],a[7439],a[7440]],[a[7441],a[7442],a[7443],a[7444],a[7445],a[7446],a[7447]],{"am":a[7448],"pm":a[7449]},[a[7450],a[7451],a[189],a[190]],[a[7452],a[7453],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[7454],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[3021],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3133],"MMMMd":a[2394],"ms":a[45],"y":a[46],"yM":a[7455],"yMd":a[547],"yMEd":a[548],"yMMM":a[50],"yMMMd":a[7456],"yMMMEd":a[7457],"yMMMM":a[53],"yQQQ":a[7458],"yQQQQ":a[55]},{"yMMMMEEEEd":a[7459],"yMMMMd":a[3025],"yMMMd":a[7456],"yMd":a[3023]},[a[69],a[7460],a[7461],a[72],a[7462],a[74],a[75],a[7463],a[7464],a[1301],a[79],a[4663]],[a[7465],a[7466],a[7467],a[7468],a[7462],a[7469],a[7470],a[7471],a[4665],a[4666],a[4667],a[4668]],[a[3662],a[3233],a[577],a[7472],a[4671],a[3235],a[581]],[a[7473],a[7474],a[7475],a[7476],a[7477],a[7478],a[7479]],{"am":a[7480],"pm":a[7481]},[a[7482],a[7483],a[7484],a[7485]],[a[3245],a[3246],a[7486],a[7487]],[a[7488],a[7489],a[7490],a[7491]],{"decimal":a[509],"group":a[599],"nan":a[7492],"plusSign":a[511],"minusSign":a[3890],"percentSign":a[513],"infinity":a[514]},[a[7493],a[7494],a[7495],a[7496],a[3263],a[7497],a[7498],a[4760],a[7499],a[7500],a[2280],a[7501]],[a[7502],a[7503],a[7504],a[7505],a[7506],a[7507],a[7508],a[7509],a[7510],a[7511],a[7512],a[7513]],[a[2295],a[2296],a[7514],a[7515],a[7516],a[7517],a[3108]],[a[7518],a[7519],a[7520],a[7521],a[7522],a[7523],a[7524]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[7525],"GyMMM":a[7526],"GyMMMd":a[7527],"GyMMMEd":a[7528],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[541],"MEd":a[7529],"MMM":a[41],"MMMd":a[2322],"MMMEd":a[7530],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMMM":a[7531],"yMMMd":a[7532],"yMMMEd":a[7533],"yMMMM":a[614],"yQQQ":a[7534],"yQQQQ":a[7535]},{"yMMMMEEEEd":a[7536],"yMMMMd":a[681],"yMMMd":a[679],"yMd":a[1697]},[a[7537],a[7538],a[6739],a[6736],a[6739],a[7539],a[7539],a[6736],a[6738],a[7540],a[6737],a[6767]],[a[7541],a[7542],a[7543],a[7544],a[1752],a[7545],a[7546],a[7547],a[7548],a[7549],a[7550],a[7551]],[a[6742],a[6767],a[6740],a[6740],a[6768],a[6742],a[7539]],[a[7552],a[7553],a[7554],a[7555],a[7556],a[7557],a[7558]],[a[7559],a[7560],a[7561],a[7562],a[7563],a[7557],a[7564]],{"am":a[7565],"pm":a[7566]},[a[7567],a[6786],a[189],a[190]],[a[7568],a[7569],a[189],a[190]],{"decimal":a[509],"group":a[599],"nan":a[7570],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"CNY":a[518],"EUR":a[519],"JPY":a[600],"KGS":a[7571],"THB":a[601],"VND":a[530],"XAF":a[531],"XOF":a[533],"XPF":a[534]},[a[62],a[67],a[707],a[1313],a[1313],a[1313],a[63],a[574],a[65],a[1313],a[65],a[65]],[a[7572],a[7573],a[7574],a[7575],a[7576],a[7577],a[7578],a[7579],a[7580],a[7581],a[7582],a[7583]],[a[7584],a[7585],a[7586],a[7587],a[7588],a[7589],a[7590],a[7591],a[7592],a[7593],a[7594],a[7595]],[a[1347],a[92],a[1900],a[66],a[64],a[1313],a[63]],[a[7596],a[7597],a[7598],a[7599],a[1318],a[1319],a[7600]],[a[7601],a[7602],a[7603],a[7604],a[7605],a[7606],a[7607]],{"am":a[7608],"pm":a[7609]},[a[7610],a[7611],a[189],a[190]],[a[7612],a[7613],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[2455],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3219],"h":a[28],"H":a[7614],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3221],"MEd":a[3222],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3225],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},[a[554],a[555],a[7615],a[7616],a[3399],a[1306],a[3228],a[561],a[562],a[563],a[564],a[3229]],[a[3230],a[3231],a[7617],a[7618],a[3399],a[1306],a[3228],a[87],a[88],a[572],a[90],a[3232]],[a[7619],a[7620],a[7621],a[7622],a[7623],a[7624],a[7625]],[a[7626],a[7627],a[7628],a[7629],a[7630],a[7631],a[7632]],{"am":a[7633],"pm":a[7634]},[a[3245],a[3246],a[7635],a[7636]],{"ATS":a[3251],"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[69],a[70],a[71],a[7637],a[3511],a[5870],a[75],a[4813],a[7638],a[7639],a[79],a[5799]],[a[7640],a[7641],a[7642],a[7643],a[7644],a[7469],a[7645],a[7646],a[7647],a[7648],a[1311],a[1312]],[a[65],a[188],a[38],a[38],a[38],a[38],a[38]],[a[1924],a[7649],a[7650],a[7651],a[7652],a[7653],a[7654]],[a[7655],a[7656],a[7657],a[7658],a[7659],a[7660],a[7661]],[a[7662],a[7663],a[189],a[190]],[a[7664],a[7665],a[7666],a[7667],a[7668],a[7669],a[7670],a[7671],a[7672],a[7673],a[7674],a[7675]],[a[64],a[93],a[67],a[708],a[92],a[2072],a[66]],[a[7676],a[7677],a[7678],a[7679],a[7680],a[7681],a[7682]],[a[46],a[625],a[1767],a[2409],a[1767],a[46],a[46],a[2409],a[623],a[7683],a[620],a[17]],[a[1698],a[7684],a[7685],a[7686],a[3866],a[7687],a[7688],a[7689],a[7690],a[7691],a[7692],a[7693]],[a[7694],a[7695],a[7696],a[7697],a[7698],a[7699],a[7700],a[7701],a[7702],a[7703],a[7704],a[7705]],[a[3342],a[46],a[1767],a[1767],a[1767],a[1767],a[3317]],[a[7706],a[7707],a[7708],a[7709],a[7710],a[7711],a[7712]],[a[7713],a[7714],a[7715],a[7716],a[7717],a[7718],a[7719]],{"am":a[7720],"pm":a[7721]},[a[7722],a[7723],a[189],a[190]],[a[7724],a[7725],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CDF":a[4410],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AOA":a[3840],"AUD":a[515],"BRL":a[516],"CAD":a[517],"CDF":a[4410],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[4681],"GyMMMd":a[7726],"GyMMMEd":a[7727],"h":a[7728],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[7729],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[611]},{"hmmsszzzz":a[7730],"hmsz":a[7731],"hms":a[1230],"hm":a[1231]},[a[7732],a[7733],a[7734],a[7735],a[7736],a[7737],a[7738],a[7739],a[7740],a[7741],a[7742],a[7743]],[a[7744],a[7745],a[7746],a[7747],a[7748],a[7749],a[7750],a[7751],a[7752],a[7753],a[7754],a[7755]],[a[111],a[112],a[113],a[114],a[115],a[116],a[117]],[a[7756],a[7757],a[7758],a[7759],a[7760],a[7761],a[7762]],{"am":a[7763],"pm":a[7764]},[a[7765],a[7766],a[7767],a[7768],a[7769],a[7770],a[7771],a[7772],a[7773],a[7774],a[7775],a[7776],a[7777]],[a[7765],a[7766],a[7767],a[7768],a[7769],a[7778],a[7771],a[7772],a[7773],a[7774],a[7775],a[7776],a[7779]],[a[7780],a[7781],a[7782],a[7783],a[7784],a[7785],a[7786],a[7787],a[7788],a[7789],a[7790],a[7791],a[7792]],[a[7793],a[7794],a[7795],a[7796]],[a[7797],a[7798],a[7799],a[7800]],[a[7801],a[7802],a[7803],a[7804],a[7805],a[7806],a[7807],a[7808],a[7809],a[7810],a[7811],a[7812],a[7813],a[7814]],[a[7815],a[7816],a[7817],a[7818],a[7819],a[7820],a[7821],a[7822],a[7823],a[7824],a[7825],a[7826]],[a[7815],a[7816],a[7817],a[7818],a[7819],a[7820],a[7821],a[7822],a[7823],a[7827],a[7825],a[7826]],[a[7735]],[a[7828],a[7829],a[7830],a[7831],a[7832],a[7833],a[7834],a[7835],a[7836],a[7837],a[7838],a[7839]],[a[7840],a[7841],a[7830],a[7842],a[7843],a[7844],a[7845],a[7846],a[7847],a[7848],a[7849],a[7850]],[a[7851],a[7852],a[7853],a[7854],a[7855],a[7856],a[7857],a[7858],a[7859],a[7860],a[7861],a[7862],a[7863],a[7864],a[7865],a[7866],a[7867],a[7868],a[7869],a[7870],a[7871],a[7872],a[7873],a[7874],a[7875],a[7876],a[7877],a[7878],a[7879],a[7880],a[7881],a[7882],a[7883],a[7884],a[7885],a[7886],a[7887],a[7888],a[7889],a[7890],a[7891],a[7892],a[7893],a[7894],a[7895],a[7896],a[7897],a[7898],a[7899],a[7900],a[7901],a[7902],a[7903],a[7904],a[7905],a[7906],a[7907],a[7908],a[7909],a[7910],a[7911],a[7912],a[7913],a[7914],a[7915],a[7916],a[7917],a[7918],a[7919],a[7920],a[7921],a[7922],a[7923],a[7924],a[7925],a[7926],a[7927],a[7928],a[7929],a[7930],a[7931],a[7932],a[7933],a[7934],a[7935],a[7936],a[7937],a[7938],a[7939],a[7940],a[7941],a[7942],a[7943],a[7944],a[7945],a[7946],a[7947],a[7948],a[7949],a[7950],a[7951],a[7952],a[7953],a[7954],a[7955],a[7956],a[7957],a[7958],a[7959],a[7960],a[7961],a[7962],a[7963],a[7964],a[7965],a[7966],a[7967],a[7968],a[7969],a[7970],a[7971],a[7972],a[7973],a[7974],a[7975],a[7976],a[7977],a[7978],a[7979],a[7980],a[7981],a[7982],a[7983],a[7984],a[7985],a[7986],a[7987],a[7988],a[7989],a[7990],a[7991],a[7992],a[7993],a[7994],a[7995],a[7996],a[7997],a[7998],a[7999],a[8000],a[8001],a[8002],a[8003],a[8004],a[8005],a[8006],a[8007],a[8008],a[8009],a[8010],a[8011],a[8012],a[8013],a[8014],a[8015],a[8016],a[8017],a[8018],a[8019],a[8020],a[8021],a[8022],a[8023],a[8024],a[8025],a[8026],a[8027],a[8028],a[8029],a[8030],a[8031],a[8032],a[8033],a[8034],a[8035],a[8036],a[8037],a[8038],a[8039],a[8040],a[8041],a[8042],a[8043],a[8044],a[8045],a[8046],a[8047],a[8048],a[8049],a[8050],a[8051],a[8052],a[8053],a[8054],a[8055],a[8056],a[8057],a[8058],a[8059],a[8060],a[8061],a[8062],a[8063],a[8064],a[8065],a[8066],a[8067],a[8068],a[8069],a[8070],a[8071],a[8072],a[8073],a[8074],a[8075],a[8076],a[8077],a[8078],a[8079],a[8080],a[8081],a[8082],a[8083],a[8084],a[8085],a[8086]],[a[8087],a[8088],a[8089],a[8090],a[8091],a[8092],a[8093],a[8094],a[8095],a[8096],a[8097],a[8098]],[a[8099],a[8088],a[8089],a[8090],a[8091],a[8092],a[8093],a[8094],a[8100],a[8096],a[8101],a[8098]],[a[8102]],[a[8103],a[598]],{"decimal":a[509],"group":a[508],"nan":a[8104],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"LAK":a[8105],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[8106],a[8107],a[836],a[8108],a[8109],a[8110],a[8111],a[8112],a[8113],a[8114],a[8115],a[8116]],{"d":a[8117],"E":a[18],"Ed":a[676],"Ehm":a[8118],"EHm":a[8119],"Ehms":a[8120],"EHms":a[8121],"Gy":a[8122],"GyMMM":a[8123],"GyMMMd":a[8124],"GyMMMEd":a[8125],"GyMMMM":a[8126],"GyMMMMd":a[8127],"GyMMMMEd":a[8128],"h":a[1823],"H":a[29],"hm":a[2387],"Hm":a[31],"hms":a[2388],"Hms":a[33],"hmsv":a[8129],"Hmsv":a[8130],"hmv":a[8131],"Hmv":a[8132],"M":a[1973],"Md":a[4404],"MEd":a[1253],"MMdd":a[1252],"MMM":a[1973],"MMMd":a[1252],"MMMEd":a[1253],"MMMM":a[1974],"MMMMd":a[8133],"MMMMEd":a[8134],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMMM":a[1255],"yMMMd":a[547],"yMMMEd":a[1256],"yMMMM":a[8135],"yMMMMd":a[8136],"yMMMMEd":a[8137],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[8138],"yMMMMd":a[8136],"yMMMd":a[547],"yMd":a[547]},[a[65],a[574],a[707],a[188],a[2293],a[188],a[38],a[603],a[603],a[65],a[38],a[2293]],[a[8139],a[8140],a[8141],a[8142],a[8143],a[8144],a[8145],a[8146],a[8147],a[8148],a[8149],a[8150]],[a[8151],a[8152],a[8153],a[8154],a[8155],a[8156],a[8157],a[8158],a[8159],a[8160],a[8161],a[8162]],[a[65],a[1347],a[64],a[92],a[707],a[1347],a[8163]],[a[8164],a[8165],a[8166],a[8167],a[8168],a[8169],a[8170]],[a[8171],a[8172],a[8173],a[8174],a[8175],a[8176],a[8177]],{"am":a[8178],"pm":a[8179]},[a[5366],a[8180],a[8181],a[8182]],[a[8183],a[8184],a[8185],a[8182]],[a[249],a[8186],a[8187],a[8188],a[8189],a[254],a[8190],a[256],a[8191],a[258],a[8192],a[8193],a[8194],a[8195],a[8196],a[8197],a[8198],a[8199],a[8200],a[8201],a[8202],a[8203],a[8204],a[8205],a[273],a[5829],a[8206],a[8207],a[5831],a[8208],a[8209],a[8210],a[281],a[8211],a[8212],a[8213],a[8214],a[286],a[8215],a[8216],a[8217],a[290],a[8218],a[8219],a[293],a[294],a[8220],a[8221],a[297],a[8222],a[8223],a[8224],a[8225],a[8226],a[8227],a[8228],a[8229],a[8230],a[8231],a[8232],a[309],a[8233],a[311],a[8234],a[8235],a[8236],a[8237],a[8238],a[8239],a[8240],a[8241],a[5837],a[8242],a[8243],a[8244],a[8245],a[8246],a[8247],a[8248],a[8249],a[8250],a[5840],a[8251],a[8252],a[8253],a[8254],a[5841],a[8255],a[8256],a[8257],a[8258],a[340],a[8259],a[5843],a[8260],a[8261],a[8262],a[8263],a[347],a[8264],a[8265],a[8266],a[351],a[8267],a[8268],a[8269],a[8270],a[8271],a[8272],a[8273],a[8274],a[8275],a[8276],a[8277],a[8278],a[8279],a[8280],a[8281],a[8282],a[368],a[369],a[370],a[8283],a[5849],a[8284],a[374],a[8285],a[8286],a[8287],a[378],a[8288],a[8289],a[8290],a[8291],a[8292],a[8293],a[8294],a[8295],a[8296],a[8297],a[8298],a[390],a[8299],a[392],a[393],a[8300],a[5852],a[8301],a[8302],a[8303],a[8304],a[8305],a[8306],a[5854],a[403],a[8307],a[8308],a[406],a[8309],a[8310],a[409],a[8311],a[8312],a[8313],a[8314],a[8315],a[415],a[416],a[8316],a[418],a[8317],a[8318],a[8319],a[422],a[8320],a[8321],a[8322],a[8323],a[8324],a[8325],a[8326],a[8327],a[431],a[8328],a[433],a[8329],a[435],a[8330],a[437],a[8331],a[5857],a[8332],a[441],a[442],a[8333],a[444],a[8334],a[8335],a[8336],a[8337],a[449],a[8338],a[8339],a[8340],a[453],a[8341],a[8342],a[8343],a[457],a[8344],a[8345],a[8346],a[461],a[8347],a[8348],a[8349],a[8350],a[8351],a[8352],a[468],a[469],a[8353],a[471],a[472],a[8354],a[8355],a[475],a[476],a[8356],a[8357],a[8358],a[8359],a[8360],a[8361],a[8362],a[485]],[a[8363],a[598]],{"EUR":a[519]},[a[3116],a[38],a[38],a[63],a[38],a[38],a[707],a[38],a[38],a[38],a[707],a[3116]],[a[8364],a[4426],a[8365],a[8366],a[8367],a[8368],a[8369],a[8370],a[8371],a[2296],a[3182],a[8372]],[a[8373],a[8374],a[8375],a[8376],a[8377],a[8378],a[8379],a[8380],a[8381],a[8382],a[8383],a[8384]],[a[38],a[67],a[67],a[67],a[67],a[67],a[38]],[a[8367],a[8385],a[8386],a[8387],a[8388],a[8389],a[8390]],[a[8391],a[8392],a[8393],a[8394],a[8395],a[8396],a[8397]],{"am":a[8398],"pm":a[8399]},[a[8400],a[8401],a[189],a[190]],[a[8402],a[8403],a[189],a[190]],[a[3116],a[603],a[68],a[67],a[188],a[2073],a[188],a[188],a[3116],a[1347],a[3116],a[1347]],[a[8404],a[8405],a[8406],a[8407],a[8408],a[8409],a[8410],a[8411],a[8412],a[8413],a[8414],a[8415]],[a[8416],a[8417],a[8418],a[8419],a[8420],a[8421],a[8422],a[8423],a[8424],a[8425],a[8426],a[8427]],[a[61],a[93],a[92],a[92],a[92],a[92],a[67]],[a[8428],a[8429],a[8430],a[8431],a[8432],a[8433],a[8434]],[a[8435],a[8436],a[8437],a[8438],a[8439],a[8440],a[8441]],{"am":a[8442],"pm":a[8443]},[a[8444],a[8445],a[189],a[190]],[a[69],a[70],a[71],a[72],a[558],a[74],a[75],a[1300],a[77],a[1301],a[79],a[5799]],[a[8446],a[8447],a[8448],a[8449],a[4830],a[8450],a[8451]],[a[8452],a[1322],a[1323],a[1324],a[8453],a[8454],a[1327]],[a[8455],a[8456],a[189],a[190]],{"positivePattern":a[504],"negativePattern":a[8457]},{"d":a[17],"E":a[18],"Ed":a[2455],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[8458],"GyMMM":a[8459],"GyMMMd":a[8460],"GyMMMEd":a[8461],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2389],"MEd":a[2390],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[2394],"MMMMEd":a[2395],"mmss":a[45],"ms":a[45],"y":a[8462],"yM":a[2397],"yMd":a[8463],"yMEd":a[8464],"yMMM":a[8465],"yMMMd":a[8466],"yMMMEd":a[8467],"yMMMM":a[8468],"yQQQ":a[8469],"yQQQQ":a[8470]},{"yMMMMEEEEd":a[8471],"yMMMMd":a[8472],"yMMMd":a[8473],"yMd":a[1697]},[a[4284],a[2837],a[3146],a[3140],a[8474],a[8475],a[8476],a[3142],a[3774],a[3144],a[2846],a[3145]],[a[8477],a[8478],a[3146],a[8479],a[8474],a[8480],a[8481],a[8482],a[8483],a[8484],a[8485],a[8486]],[a[65],a[1347],a[66],a[92],a[3116],a[1347],a[65]],[a[8487],a[8488],a[8489],a[8490],a[8491],a[8492],a[3391]],[a[8493],a[8494],a[8495],a[8496],a[8497],a[8498],a[8499]],{"am":a[8500],"pm":a[8501]},[a[8502],a[8503],a[189],a[190]],[a[8504],a[8505],a[189],a[190]],[a[8506],a[8507],a[8508],a[8509],a[8510],a[8511],a[8512],a[8513],a[8514],a[8515],a[8516],a[8517],a[8518],a[8519]],[a[8520],a[8521],a[8522],a[8523],a[8524],a[8525],a[8526],a[8527],a[8528],a[8529],a[8530],a[8531]],{"decimal":a[509],"group":a[599],"nan":a[8532],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"LVL":a[8533],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[8534],a[8535],a[8536],a[8537],a[8538],a[8539],a[8540],a[8541],a[8542],a[8543],a[8544],a[8545]],[a[8546],a[8547],a[8548],a[8549],a[8550],a[8551],a[8552],a[8553],a[8554],a[8555],a[8556],a[8557]],[a[8558],a[7602],a[8559],a[8560],a[8561],a[8562],a[8563]],{"am":a[8564],"pm":a[8565]},[a[6596],a[8566],a[189],a[190]],[a[8567],a[8568],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KES":a[3217],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"TZS":a[1336],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[61],a[62],a[63],a[6557],a[63],a[67],a[67],a[64],a[65],a[66],a[67],a[68]],[a[8569],a[8570],a[8571],a[8572],a[8573],a[8574],a[8575],a[8576],a[8577],a[2941],a[8578],a[8579]],[a[8580],a[8581],a[1304],a[8582],a[8583],a[8584],a[8585],a[8586],a[1309],a[8587],a[1311],a[8588]],[a[707],a[63],a[93],a[93],a[93],a[93],a[61]],[a[8589],a[8590],a[8591],a[8592],a[8593],a[6687],a[8594]],[a[3513],a[8595],a[8596],a[8597],a[8598],a[8599],a[1327]],{"am":a[8600],"pm":a[8601]},[a[3522],a[8602],a[189],a[190]],[a[8603],a[8604],a[189],a[190]],[a[624],a[625],a[1767],a[2409],a[1767],a[624],a[624],a[2410],a[623],a[2410],a[620],a[17]],[a[2075],a[1699],a[1350],a[8605],a[3740],a[8606],a[8607],a[4643],a[2416],a[1704],a[2417],a[2084]],[a[8608],a[8609],a[4257],a[4293],a[3740],a[8606],a[8610],a[4643],a[8611],a[8612],a[8613],a[8614]],[a[17],a[626],a[1767],a[1767],a[624],a[3810],a[623]],[a[8615],a[8616],a[1350],a[5980],a[8617],a[8618],a[7440]],[a[8619],a[8620],a[4306],a[8621],a[8622],a[8623],a[8624]],[a[8625],a[8626],a[189],a[190]],[a[8627],a[8628],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[63],"Md":a[608],"MEd":a[609],"MMd":a[2068],"MMdd":a[2069],"MMM":a[2070],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[547],"yMEd":a[612],"yMM":a[2071],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[69],a[70],a[71],a[72],a[8629],a[8630],a[8631],a[8632],a[77],a[1301],a[79],a[5799]],[a[8633],a[8634],a[8635],a[8636],a[8629],a[8637],a[8638],a[8639],a[8640],a[8641],a[8642],a[8643]],[a[64],a[64],a[92],a[64],a[64],a[2072],a[64]],[a[8644],a[8645],a[3408],a[8646],a[8647],a[8648],a[8649]],[a[8650],a[8651],a[3414],a[8652],a[8653],a[8654],a[8655]],[a[8656],a[8657],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[51],"yMMMEd":a[52],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},[a[707],a[2073],a[603],a[3116],a[92],a[63],a[65],a[67],a[92],a[707],a[63],a[708]],[a[8658],a[8659],a[8660],a[8661],a[6561],a[8662],a[1924],a[1925],a[1926],a[1927],a[8663],a[8664]],[a[8665],a[8666],a[8667],a[8668],a[8669],a[8670],a[8671],a[8672],a[8673],a[8674],a[8675],a[8676]],[a[65],a[61],a[61],a[61],a[64],a[1313],a[61]],[a[1924],a[1315],a[1316],a[1317],a[3409],a[6438],a[1320]],[a[8677],a[1322],a[1323],a[1324],a[8678],a[1326],a[1327]],{"am":a[8679],"pm":a[8680]},[a[8681],a[8682],a[189],a[190]],[a[8683],a[8684],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"MZN":a[8685],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[8686],a[8687],a[8688],a[8689],a[8690],a[8691],a[8692],a[8693],a[8694],a[120],a[121],a[122]],[a[8695],a[8696],a[8697],a[8698],a[8699],a[8700],a[8701],a[8702],a[8703],a[8704],a[8705],a[8706]],[a[8707],a[8696],a[8697],a[8698],a[8699],a[8700],a[8701],a[8702],a[8703],a[8704],a[8705],a[8706]],[a[8708],a[8687],a[8709],a[8710],a[8711],a[8712],a[8692]],[a[8713],a[8714],a[8715],a[8716],a[8717],a[8718],a[8719]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[539],"GyMMMEd":a[540],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1832],"Mdd":a[8720],"MEd":a[1833],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[45],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[8721],"yMMMd":a[8722],"yMMMEd":a[8723],"yMMMM":a[1980],"yQQQ":a[1983],"yQQQQ":a[1984]},{"yMMMMEEEEd":a[551],"yMMMMd":a[552],"yMMMd":a[8724],"yMd":a[8725]},[a[8726],a[7542],a[7543],a[7544],a[2461],a[8727],a[8728],a[7547],a[8729],a[7549],a[8730],a[7551]],[a[8731],a[2003],a[1750],a[2004],a[2461],a[2468],a[2469],a[1755],a[2005],a[2006],a[2007],a[2008]],[a[8732],a[8733],a[8734],a[8735],a[8736],a[8737],a[8738]],[a[8739],a[2012],a[2013],a[8740],a[8741],a[8742],a[8743]],{"am":a[8744],"pm":a[8745]},[a[2022],a[2518],a[8746],a[190]],[a[8747],a[8748],a[8746],a[190]],{"BRL":a[516],"CAD":a[517],"EUR":a[519],"MKD":a[8749],"MXN":a[526],"USD":a[602],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[6916],"MMdd":a[2069],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"MMMMEd":a[8750],"ms":a[45],"y":a[46],"yM":a[3814],"yMd":a[611],"yMEd":a[8751],"yMM":a[546],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[8752],"yMMMMd":a[8753],"yMMMd":a[8754],"yMd":a[1345]},[a[8755],a[8756],a[8757],a[8758],a[8759],a[8760],a[8760],a[8761],a[8762],a[8763],a[8764],a[8765]],[a[8766],a[8767],a[8768],a[8769],a[8770],a[8771],a[8772],a[8773],a[8774],a[8775],a[8776],a[8777]],[a[8778],a[8779],a[8780],a[8781],a[8770],a[8771],a[8772],a[8782],a[8783],a[8784],a[8785],a[8786]],[a[8787],a[8788],a[8789],a[8790],a[8791],a[8792],a[8793]],[a[8794],a[8795],a[8796],a[8797],a[8798],a[8799],a[8800]],[a[8801],a[8802],a[8803],a[8804],a[8805],a[8806],a[8807]],[a[8808],a[8809],a[8810],a[8811]],[a[8812],a[8813],a[8814],a[8815]],[a[8816],a[8817],a[8818],a[8819],a[8820],a[8821],a[8819],a[8822],a[8757],a[8823],a[8757],a[8756]],[a[8824],a[8825],a[8826],a[8827],a[8828],a[8829],a[8830],a[8831],a[8832],a[8833],a[8834],a[8835]],[a[8836]],[a[8837],a[8762],a[8838],a[8838],a[8755],a[8755],a[8838],a[8793],a[8838],a[8793],a[8839],a[8839]],[a[8840],a[8841],a[8842],a[8843],a[8844],a[8845],a[8846],a[8847],a[8848],a[8849],a[8850],a[8851]],[a[8852]],{"decimal":a[508],"group":a[509],"nan":a[8853],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"d":a[17],"E":a[18],"Ed":a[8854],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[8855],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3427],"MEd":a[3428],"MMM":a[41],"MMMd":a[42],"MMMEd":a[8856],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[3432],"yMd":a[3433],"yMEd":a[3434],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[8857],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[8858]},{"yMMMMEEEEd":a[8859],"yMMMMd":a[8860],"yMMMd":a[679],"yMd":a[547]},[a[8861],a[8862],a[8863],a[8864],a[8865],a[8866],a[8867],a[8868],a[8869],a[8870],a[8871],a[8872]],[a[8873],a[8874],a[8875],a[8876],a[8877],a[8878],a[8879],a[8880],a[8881],a[8882],a[8883],a[8884]],[a[8885],a[8886],a[8887],a[8888],a[8889],a[8890],a[8891]],[a[8892],a[8893],a[8894],a[8895],a[8896],a[8897],a[8898]],{"am":a[8899],"pm":a[8900]},[a[8901],a[8902],a[8903],a[8904]],[a[8905],a[8906],a[8903],a[8904]],[a[8907],a[8908],a[8903],a[8904]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MNT":a[8909],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[4987],"GyMMMd":a[4682],"GyMMMEd":a[4683],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMdd":a[541],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMM":a[546],"yMMM":a[50],"yMMMd":a[617],"yMMMEd":a[8911],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[8912],a[2324],a[2325],a[2326],a[2327],a[4990],a[2328],a[8913],a[2346],a[8913],a[8914],a[8915]],[a[8916],a[8917],a[4994],a[8918],a[2327],a[4997],a[7352],a[8919],a[8920],a[8921],a[8922],a[8923]],[a[7350],a[2335],a[4994],a[7351],a[2327],a[4997],a[7352],a[8924],a[8925],a[8926],a[7356],a[7357]],[a[5022],a[5023],a[8927],a[5025],a[5026],a[5027],a[5028]],{"am":a[7361],"pm":a[8928]},[a[8929],a[8930],a[8931],a[8932]],[a[8933],a[8934],a[8931],a[8935]],[a[8936],a[501]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"Hmm":a[1231],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[4455],"MEd":a[2115],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[3814],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3703]},[a[61],a[62],a[63],a[64],a[63],a[61],a[61],a[66],a[65],a[66],a[67],a[68]],[a[69],a[70],a[1299],a[72],a[558],a[74],a[75],a[8937],a[77],a[1301],a[79],a[1903]],[a[1302],a[1303],a[1299],a[84],a[558],a[74],a[1307],a[8938],a[88],a[572],a[90],a[8939]],[a[64],a[1313],a[65],a[603],a[707],a[61],a[65]],[a[8940],a[8941],a[5804],a[5805],a[8942],a[3202],a[1924]],[a[8943],a[8944],a[5809],a[5810],a[8945],a[8946],a[5813]],{"am":a[8947],"pm":a[8948]},[a[8949],a[8950],a[2292],a[8951],a[3263],a[4831],a[8952],a[8953],a[8954],a[3392],a[8955],a[8956]],[a[8957],a[8958],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MYR":a[3699],"NZD":a[527],"TWD":a[528],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"yMMMMEEEEd":a[552],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3703]},{"AUD":a[515],"BND":a[529],"BRL":a[516],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MYR":a[3699],"NZD":a[527],"TWD":a[528],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MYR":a[3699],"NZD":a[527],"SGD":a[529],"TWD":a[528],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"yMMMMEEEEd":a[8959],"yMMMMd":a[8960],"yMMMd":a[553],"yMd":a[738]},[a[61],a[62],a[63],a[64],a[63],a[8961],a[38],a[64],a[65],a[66],a[67],a[68]],[a[69],a[8962],a[71],a[72],a[8963],a[8964],a[8965],a[8966],a[4228],a[8967],a[79],a[8968]],[a[8969],a[8970],a[8971],a[84],a[8972],a[8973],a[8974],a[8975],a[8976],a[8977],a[8978],a[8979]],[a[8980],a[92],a[92],a[1900],a[8980],a[8961],a[65]],[a[8981],a[8982],a[8983],a[8984],a[8985],a[8986],a[3411]],[a[8987],a[8988],a[8989],a[8990],a[8991],a[8992],a[8993]],[a[8994],a[8995],a[8996],a[6667]],[a[8997],a[8998],a[8996],a[6667]],[a[66],a[64],a[1313],a[62],a[68],a[188],a[38],a[63],a[1900],a[2073],a[93],a[708]],[a[8999],a[9000],a[9001],a[9002],a[9003],a[9004],a[9005],a[9006],a[9007],a[9008],a[9009],a[9010]],[a[9011],a[9012],a[9013],a[9014],a[9015],a[9016],a[9017],a[9018],a[9019],a[9020],a[9021],a[9022]],[a[708],a[38],a[2072],a[66],a[64],a[2293],a[1900]],[a[9023],a[9024],a[9025],a[9026],a[9027],a[9028],a[9029]],[a[9030],a[9031],a[9032],a[9033],a[9034],a[9035],a[9036]],{"am":a[9037],"pm":a[9038]},[a[3214],a[9039],a[189],a[190]],[a[9040],a[9041],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[9043],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[1686],"GyMMMd":a[1687],"GyMMMEd":a[9044],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[9045],"MMM":a[41],"MMMd":a[543],"MMMEd":a[9046],"MMMMd":a[811],"MMMMEd":a[9047],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[3818],"yMEd":a[9048],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[9049],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[9050],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3820]},[a[9051],a[9052],a[9053],a[9054],a[9053],a[9051],a[9051],a[9055],a[9056],a[9057],a[9058],a[9059]],[a[9060],a[9061],a[9062],a[9063],a[9064],a[9065],a[9066],a[9055],a[9067],a[9068],a[9069],a[9070]],[a[9071],a[9072],a[9062],a[9063],a[9064],a[9065],a[9073],a[9074],a[9075],a[9076],a[9077],a[9078]],[a[9079],a[9079],a[9057],a[9080],a[9081],a[9082],a[9056]],[a[9083],a[9084],a[9085],a[9086],a[9087],a[9088],a[9089]],{"am":a[9090],"pm":a[9091]},[a[9092],a[9093],a[9094],a[9095]],[a[9096],a[9097],a[9094],a[9095]],[a[9098],a[501]],{"decimal":a[508],"group":a[509],"nan":a[9099],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"CRC":a[9100],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MMK":a[707],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[9101],a[9102],a[836],a[4006],a[9103],a[4008],a[9104],a[4010],a[4011],a[4012],a[4013],a[4014]],[a[9105],a[4031],a[9106],a[824]],[a[9107],a[9108],a[9109],a[4033]],[a[9110],a[9111],a[9112],a[9113],a[9114],a[9115],a[9116],a[9117],a[9118],a[9119],a[9120],a[9121]],[a[65],a[63],a[1900],a[93],a[68],a[62],a[64]],[a[9122],a[3388],a[3394],a[9123],a[9124],a[9125],a[100]],[a[9126],a[9127],a[9128],a[9129],a[9130],a[9131],a[9132]],{"am":a[9133],"pm":a[9134]},[a[9135],a[9136],a[189],a[190]],{"d":a[3011],"E":a[18],"Ed":a[3012],"Ehm":a[3124],"EHm":a[1819],"Ehms":a[3125],"EHms":a[1821],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3127],"h":a[28],"H":a[29],"hm":a[3128],"Hm":a[1825],"hms":a[3129],"Hms":a[1827],"hmsv":a[3130],"Hmsv":a[1829],"hmv":a[3131],"Hmv":a[1831],"M":a[5325],"Md":a[3221],"MEd":a[9137],"MMdd":a[3221],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3133],"MMMMd":a[2394],"ms":a[1835],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[9138],"yMM":a[1692],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3135],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3027],"yMMMMd":a[3025],"yMMMd":a[3134],"yMd":a[1693]},[a[2419],a[2420],a[4257],a[2421],a[3866],a[2422],a[2423],a[2424],a[3147],a[3148],a[3149],a[4259]],[a[9139],a[9140],a[9141],a[9142],a[9143],a[9144],a[9145],a[9146],a[9147],a[9148],a[9149],a[9150],a[9151]],[a[9152],a[9153]],[a[9154],a[9155]],[a[9156],a[9157]],[a[9158],a[9159],a[9160],a[9161],a[1405],a[9162],a[9163],a[9164],a[9165],a[9166],a[9167],a[9168],a[9169]],[a[3169],a[3170],a[9170],a[9171]],[a[3169],a[3170],a[9170],a[9172]],[a[9173],a[9174],a[9175],a[9176]],[a[9177],a[9178],a[9179],a[9180],a[9181],a[9182],a[9183],a[9184],a[9185],a[9186],a[9187],a[9188],a[9189],a[9190]],[a[9191],a[9192],a[9193],a[9194],a[9195],a[9196],a[9197],a[9198],a[9199],a[9200],a[9201],a[9202]],[a[9203]],[a[9204],a[4352],a[9205],a[9206],a[9207],a[9208],a[4357],a[9209],a[4359],a[9210],a[9211],a[9212]],[a[4208],a[4209],a[9213],a[9214],a[9215],a[9216],a[4368],a[9217],a[4216],a[9218],a[9219],a[9220]],[a[9221],a[9222],a[9223],a[9224],a[9225],a[9226],a[9227],a[9228],a[9229],a[9230],a[9231],a[9232]],{"EUR":a[519],"GBP":a[520],"NOK":a[3707],"XOF":a[533]},[a[2072],a[67],a[63],a[63],a[67],a[67],a[67],a[67],a[63],a[63],a[38],a[63]],[a[9233],a[9234],a[9235],a[9236],a[9237],a[9238],a[9239],a[9240],a[9241],a[3184],a[9242],a[9243]],[a[9244],a[9245],a[9246],a[9247],a[9248],a[9249],a[9250],a[9251],a[9252],a[9253],a[9254],a[9255]],[a[65],a[63],a[65],a[65],a[65],a[65],a[63]],[a[9122],a[9256],a[3411],a[1923],a[9257],a[9258],a[9259]],[a[9260],a[9261],a[9262],a[9263],a[9264],a[9265],a[9266]],[a[9267],a[9268],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[1253],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},[a[9269],a[9270],a[9271],a[9272],a[9273],a[9274],a[9275],a[9276],a[9277],a[9278],a[9279],a[9280]],[a[5004],a[9281],a[4994],a[9282],a[2327],a[2338],a[5006],a[9283],a[9284],a[9285],a[9286],a[9287]],[a[5004],a[9281],a[4994],a[9282],a[4996],a[2338],a[5006],a[9283],a[9284],a[9285],a[9286],a[9287]],[a[2329],a[5012],a[4989],a[2348],a[2349],a[5014],a[5015]],[a[9288],a[5017],a[9289],a[5018],a[9290],a[5020],a[5021]],[a[9291],a[9292],a[9293],a[9294],a[9295],a[9296],a[9297]],[a[9298],a[9299],a[9300],a[9301]],[a[5050],a[9302],a[9303],a[9304],a[9305],a[9306],a[9307],a[9308],a[9309],a[5059],a[2379],a[9310]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NPR":a[9311],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[3137],a[3138],a[4458],a[3140],a[9312],a[3141],a[2842],a[3142],a[3143],a[3144],a[2846],a[3145]],[a[6814],a[6815],a[4461],a[2421],a[9312],a[2422],a[2423],a[4464],a[3147],a[3148],a[3149],a[3150]],[a[9313],a[3739],a[3343],a[4470],a[9314],a[9315],a[9316]],[a[9317],a[9318],a[9319],a[9320],a[9321],a[9322],a[9323]],[a[9324],a[9325],a[9326],a[9327],a[9328],a[9329],a[9330],a[9331],a[9332],a[9333],a[9334],a[9335]],[a[9336],a[9337],a[9338],a[9339],a[9340],a[9341],a[9342],a[9343],a[9344],a[9345],a[9346],a[9347]],[a[591],a[592],a[9348],a[4501]],[a[9349],a[9350],a[593],a[594]],[a[595],a[596],a[9351],a[9352]],[a[249],a[250],a[251],a[252],a[253],a[254],a[255],a[256],a[257],a[258],a[259],a[260],a[261],a[262],a[263],a[264],a[265],a[266],a[267],a[268],a[269],a[270],a[271],a[272],a[273],a[274],a[275],a[276],a[277],a[278],a[279],a[280],a[281],a[282],a[283],a[284],a[285],a[286],a[287],a[288],a[289],a[290],a[291],a[292],a[293],a[294],a[295],a[296],a[297],a[298],a[299],a[300],a[301],a[302],a[303],a[304],a[305],a[306],a[307],a[308],a[309],a[310],a[311],a[312],a[313],a[314],a[315],a[316],a[317],a[318],a[319],a[5837],a[321],a[5838],a[323],a[324],a[325],a[326],a[327],a[328],a[5839],a[5840],a[331],a[332],a[333],a[334],a[5841],a[336],a[337],a[338],a[339],a[340],a[341],a[5843],a[343],a[344],a[345],a[346],a[347],a[348],a[349],a[350],a[351],a[352],a[353],a[354],a[355],a[356],a[357],a[358],a[359],a[360],a[5846],a[5847],a[363],a[364],a[5848],a[366],a[367],a[368],a[369],a[370],a[371],a[5849],a[373],a[374],a[375],a[1680],a[377],a[378],a[379],a[380],a[381],a[382],a[383],a[5850],a[385],a[5851],a[387],a[388],a[389],a[390],a[391],a[392],a[393],a[394],a[5852],a[396],a[397],a[398],a[399],a[5853],a[401],a[5854],a[403],a[404],a[5855],a[406],a[407],a[408],a[409],a[410],a[411],a[412],a[413],a[414],a[415],a[416],a[417],a[418],a[419],a[420],a[421],a[422],a[5856],a[424],a[425],a[426],a[427],a[428],a[429],a[430],a[431],a[432],a[433],a[434],a[435],a[436],a[437],a[438],a[5857],a[440],a[441],a[442],a[443],a[444],a[445],a[5858],a[5859],a[448],a[449],a[5860],a[5861],a[452],a[453],a[454],a[5862],a[456],a[457],a[458],a[459],a[460],a[461],a[462],a[463],a[5863],a[5864],a[466],a[5865],a[468],a[469],a[470],a[471],a[472],a[473],a[474],a[475],a[476],a[5866],a[478],a[479],a[480],a[482],a[483],a[484],a[485]],[a[9353],a[500]],{"AUD":a[802],"AWG":a[3842],"BRL":a[516],"CAD":a[3843],"CNY":a[518],"EUR":a[519],"FJD":a[4545],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SBD":a[4546],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533]},{"AUD":a[802],"BRL":a[516],"CAD":a[3843],"CNY":a[518],"EUR":a[519],"FJD":a[4545],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SBD":a[4546],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533]},{"ANG":a[3709],"AUD":a[802],"BRL":a[516],"CAD":a[3843],"CNY":a[518],"EUR":a[519],"FJD":a[4545],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SBD":a[4546],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533]},{"AUD":a[802],"BRL":a[516],"CAD":a[3843],"CNY":a[518],"EUR":a[519],"FJD":a[4545],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SBD":a[4546],"SRD":a[529],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533]},[a[9354],a[9355],a[9356],a[9357],a[9358],a[9359],a[9360],a[9361],a[9362],a[9363],a[9364],a[9365]],[a[9366],a[9367],a[9368],a[9369],a[9370],a[9371],a[9372],a[9373],a[9374],a[9375],a[9376],a[9377]],[a[623],a[1767],a[623],a[623],a[623],a[1767],a[623]],[a[3972],a[3973],a[3974],a[3975],a[3976],a[9378],a[9379]],[a[3979],a[9380],a[9381],a[9382],a[9383],a[9384],a[9385]],{"am":a[9386],"pm":a[9387]},[a[9388],a[9389],a[189],a[190]],[a[9390],a[9391],a[189],a[190]],{"d":a[3011],"E":a[18],"Ed":a[3012],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3127],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3221],"MEd":a[9137],"MMdd":a[3221],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3133],"MMMMd":a[2394],"ms":a[45],"y":a[46],"yM":a[9392],"yMd":a[1837],"yMEd":a[4153],"yMM":a[1692],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3135],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"hmmsszzzz":a[9393],"hmsz":a[619],"hms":a[33],"hm":a[31]},[a[3137],a[3138],a[4257],a[3140],a[3866],a[2422],a[2423],a[3142],a[3143],a[3144],a[2846],a[2847]],[a[9394],a[9395],a[9396],a[9397],a[9398],a[9399],a[9400]],[a[3158],a[9401],a[9402],a[3161],a[3162],a[3163],a[9403]],{"am":a[9404],"pm":a[9405]},[a[3169],a[3170],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NOK":a[3707],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[1253],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[611],"yMEd":a[9407],"yMMM":a[50],"yMMMd":a[9408],"yMMMEd":a[9409],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[9410],"yMMMMd":a[9408],"yMMMd":a[617],"yMd":a[3080]},[a[9411],a[9412],a[9413],a[9414],a[9415],a[9416],a[9417],a[9418],a[9419],a[9420],a[9421],a[9422]],[a[9423],a[9424],a[9425],a[9426],a[9427],a[9428],a[9429]],{"am":a[9430],"pm":a[9431]},[a[9432],a[9433],a[189],a[190]],[a[9434],a[9435],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[9436],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[44],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[9437],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[9438],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3702]},{"hmmsszzzz":a[9439],"hmsz":a[9440],"hms":a[32],"hm":a[30]},[a[92],a[1347],a[68],a[2293],a[68],a[707],a[1347],a[92],a[92],a[38],a[707],a[92]],[a[9441],a[9442],a[9443],a[9444],a[9445],a[9446],a[9447],a[9448],a[9449],a[9450],a[9451],a[9452]],[a[9453],a[9442],a[9454],a[9444],a[9455],a[9456],a[9457],a[9458],a[9459],a[9460],a[9451],a[9461]],[a[3116],a[61],a[603],a[68],a[9462],a[68],a[188]],[a[9463],a[9464],a[9465],a[9466],a[9467],a[9468],a[9469]],[a[9470],a[9471],a[9472],a[9473],a[9474],a[9475],a[9476]],{"am":a[9477],"pm":a[9478]},[a[6628],a[9479],a[189],a[190]],[a[9480],a[9481],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[1253],"MMdd":a[2069],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"MMMMdd":a[9482],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMM":a[2071],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[56],"yMMMMd":a[552],"yMMMd":a[3683],"yMd":a[3080]},[a[9483],a[9484],a[9485],a[9486],a[9487],a[9488],a[9489],a[9490],a[9491],a[9492],a[3108],a[9493]],[a[9494],a[9495],a[9496],a[9497],a[9498],a[9499],a[9500],a[9501],a[9502],a[9503],a[9504],a[9505]],[a[9506],a[9507],a[9508],a[9509],a[5806],a[3203],a[6538]],[a[9510],a[9511],a[9512],a[9513],a[9514],a[9515],a[9516]],{"am":a[9517],"pm":a[9518]},[a[9519],a[9520],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"ETB":a[9521],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"ETB":a[9521],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KES":a[3217],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[1253],"MMdd":a[541],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMM":a[546],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[9522]},[a[9523],a[9524],a[9525],a[9526],a[9527],a[9528],a[9528],a[9526],a[9529],a[9526],a[9530],a[9531]],[a[9532],a[9533],a[9534],a[9535],a[9527],a[9536],a[9537],a[9538],a[9539],a[9540],a[9541],a[9542]],[a[9543],a[9544],a[9545],a[9546],a[9547],a[9548],a[9549]],[a[9550],a[9551],a[9552],a[9553],a[9554],a[9555],a[9556]],[a[9557],a[9558],a[9559],a[9560],a[9561],a[9562],a[9563]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1689],"MEd":a[1741],"MMM":a[41],"MMMd":a[543],"MMMEd":a[9564],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[547],"yMEd":a[1743],"yMMM":a[1839],"yMMMd":a[679],"yMMMEd":a[550],"yMMMM":a[614],"yQQQ":a[9565],"yQQQQ":a[9566]},{"yMMMMEEEEd":a[9567],"yMMMMd":a[9568],"yMMMd":a[9569],"yMd":a[1697]},[a[7541],a[7542],a[7543],a[7544],a[9570],a[9571],a[9572],a[7547],a[7548],a[7549],a[7550],a[7551]],[a[9573],a[9574],a[9575],a[9576],a[9570],a[9571],a[9572],a[9577],a[9578],a[9579],a[9580],a[9581]],[a[9582],a[9583],a[6767],a[9584],a[9585],a[6739],a[6738]],[a[9586],a[9587],a[9588],a[9589],a[9590],a[9591],a[9592]],[a[9593],a[9594],a[9595],a[9596],a[9597],a[9598],a[9599]],{"am":a[9600],"pm":a[9601]},[a[9602],a[9603],a[189],a[190]],{"decimal":a[509],"group":a[599],"nan":a[9604],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"RUB":a[1899],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[4681],"GyMMMd":a[549],"GyMMMEd":a[9605],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[9606],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[44],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},[a[9607],a[9608],a[9609],a[9610],a[9611],a[9612],a[9613],a[9610],a[9614],a[9610],a[9615],a[9616]],[a[9617],a[9618],a[9619],a[9620],a[9621],a[9622],a[9623],a[9624],a[9625],a[9626],a[9627],a[9628]],[a[9629],a[9630],a[9619],a[9631],a[9621],a[9622],a[9632],a[9633],a[9634],a[9635],a[9636],a[9637]],[a[9638],a[9639],a[9640],a[9641],a[9642],a[9643],a[9644]],[a[9645],a[9646],a[9647],a[9648],a[9649],a[9650],a[9651]],[a[9652],a[9653],a[9654],a[9655],a[9656],a[9657],a[9658]],{"am":a[9659],"pm":a[9660]},[a[9661],a[9662],a[9663],a[9664]],[a[9665],a[9666],a[9667],a[9668]],[a[9669],a[9670],a[9671],a[9672],a[9673],a[9674],a[9675],a[9676],a[9677],a[9678],a[9679],a[9680]],[a[9681],a[9682],a[9683],a[9684],a[9685],a[9686],a[9687],a[9688],a[9689],a[9690],a[9691],a[9692]],[a[9693]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"HHmmss":a[33],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[1253],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[551],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[738]},[a[4081],a[9694],a[4083],a[4084],a[9695],a[4085],a[9696],a[4087],a[7377],a[4089],a[4090],a[4091]],[a[9697],a[9698],a[9699],a[9700],a[9701],a[9702],a[9703]],[a[9704],a[9705],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PKR":a[848],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[9706],"GyMMMEd":a[1339],"GyMMMM":a[3013],"GyMMMMd":a[9707],"GyMMMMEd":a[9708],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1971],"MEd":a[1972],"MMM":a[41],"MMMd":a[1971],"MMMEd":a[1972],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[9709],"yMEd":a[9710],"yMMM":a[1692],"yMMMd":a[9709],"yMMMEd":a[9710],"yMMMM":a[1840],"yMMMMd":a[616],"yMMMMEd":a[9711],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[1693],"yMd":a[1693]},[a[623],a[626],a[1767],a[621],a[1767],a[627],a[626],a[623],a[3318],a[3317],a[626],a[652]],[a[9712],a[9713],a[1350],a[9714],a[2412],a[9715],a[5350],a[9716],a[9717],a[9718],a[3038],a[9719]],[a[9720],a[9721],a[9722],a[9723],a[3309],a[9724],a[9725],a[9726],a[9727],a[9728],a[5363],a[9729]],[a[67],a[1347],a[93],a[9730],a[3116],a[1347],a[65]],[a[9731],a[9732],a[9733],a[9734],a[9735],a[9736],a[9737]],[a[9738],a[9739],a[9740],a[9741],a[9742],a[9743],a[3066]],[a[9744],a[2449],a[189],a[190]],[a[9745],a[9746],a[9747],a[9748],a[9749],a[202],a[203],a[204],a[4512],a[9750],a[207],a[9751],a[209],a[210]],[a[224],a[225],a[226],a[227],a[9752],a[9753],a[9754],a[9755],a[232],a[9756],a[9757],a[9758]],[a[236],a[237],a[238],a[239],a[9759],a[9760],a[9761],a[9762],a[244],a[9763],a[9764],a[9765]],[a[9766],a[9767],a[9768],a[489],a[9769],a[9770],a[492],a[9771],a[9772],a[9773],a[496],a[497]],[a[9774],a[9775]],{"BRL":a[516],"EUR":a[519],"PLN":a[3341],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[1253],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[9776],"yMMMMd":a[9777],"yMMMd":a[549],"yMd":a[678]},[a[9778],a[9779],a[4083],a[4084],a[4078],a[4085],a[4086],a[9780],a[4088],a[4089],a[4090],a[4091]],{"am":a[9781],"pm":a[9782]},[a[4030],a[4031],a[189],a[190]],[a[9783],a[9784],a[9785],a[9786],a[9787],a[9788],a[9789],a[9790],a[9791],a[9792],a[9793],a[9794]],{"decimal":a[509],"group":a[508],"nan":a[510],"plusSign":a[1191],"minusSign":a[4070],"percentSign":a[513],"infinity":a[514]},{"AFN":a[4071],"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[3821],"GyMMMd":a[3806],"GyMMMEd":a[3811],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[3823],"MMMEd":a[3824],"MMMMd":a[3761],"MMMMEd":a[3762],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMM":a[2071],"yMMM":a[3825],"yMMMd":a[3815],"yMMMEd":a[3808],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[9795],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[3769],"yMMMMd":a[3766],"yMMMd":a[3815],"yMd":a[3080]},[a[2411],a[1699],a[1350],a[1351],a[3866],a[2413],a[2414],a[1355],a[1356],a[4643],a[2417],a[9796]],[a[9797],a[9798],a[9799],a[3779],a[4646],a[9800],a[9801],a[3781],a[4649],a[4650],a[3736],a[9802]],[a[68],a[65],a[92],a[3831],a[3831],a[65],a[65]],[a[1372],a[9803],a[1405],a[9804],a[9805],a[9806],a[1377]],[a[3792],a[9807],a[9808],a[9809],a[9810],a[9811],a[3796]],[a[9812],a[9813],a[9814],a[9815],a[9816],a[9817],a[9818],a[9819],a[9820],a[9821],a[9822],a[9823]],[a[1437],a[1438],a[2883],a[2884]],[a[3801],a[9824],a[9825],a[9826]],[a[9827],a[598]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PTE":a[9828],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[3821],"GyMMMd":a[3806],"GyMMMEd":a[3811],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[2068],"MMMEd":a[9830],"MMMMd":a[3761],"MMMMEd":a[9831],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMM":a[2071],"yMMM":a[2071],"yMMMd":a[3702],"yMMMEd":a[9832],"yMMMEEEEd":a[9833],"yMMMM":a[3765],"yMMMMd":a[3766],"yMMMMEd":a[9834],"yQQQ":a[3768],"yQQQQ":a[3768]},[a[3792],a[9835],a[9836],a[9837],a[9838],a[9839],a[3796]],{"am":a[9840],"pm":a[9841]},[a[8686],a[9842],a[8688],a[9843],a[9844],a[9845],a[9846],a[9847],a[9848],a[185],a[186],a[187]],[a[1437],a[1438],a[9849],a[9850]],{"AOA":a[3840],"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PTE":a[6672],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"CVE":a[6672],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PTE":a[9851],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PTE":a[6672],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MOP":a[3698],"MXN":a[526],"NZD":a[527],"PTE":a[6672],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"MZN":a[8685],"NZD":a[527],"PTE":a[6672],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PTE":a[6672],"STD":a[9852],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[1253],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[3818],"yMEd":a[1256],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[2116],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[2117],"yMMMMd":a[681],"yMMMd":a[679],"yMd":a[738]},[a[9853],a[9854],a[9855],a[9856],a[9857],a[9858],a[9859],a[9860],a[9861],a[3181],a[9862],a[9863]],[a[9864],a[9865],a[9866],a[9867],a[9868],a[9869],a[9870],a[9871],a[9872],a[9873],a[9874],a[9875]],[a[9876],a[2296],a[71],a[9877],a[9878],a[9879],a[1924]],[a[9880],a[4247],a[4248],a[9881],a[9882],a[9883],a[9884]],[a[189],a[1434],a[189],a[190]],[a[189],a[1438],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PEN":a[3849],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BOB":a[3816],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[3012],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[481],"HHmm":a[31],"HHmmss":a[33],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3221],"MEd":a[3222],"MMd":a[3223],"MMdd":a[2389],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3133],"MMMMd":a[2394],"MMMMEd":a[3022],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[3432],"yMd":a[547],"yMEd":a[3434],"yMM":a[1692],"yMMdd":a[1693],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[3225],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[9885],"yMMMMd":a[9886],"yMMMd":a[3818],"yMd":a[3820]},[a[65],a[62],a[63],a[64],a[63],a[2072],a[62],a[64],a[65],a[66],a[67],a[68]],[a[9887],a[9888],a[4257],a[4286],a[9889],a[9890],a[9891],a[9892],a[9893],a[2845],a[2846],a[3145]],[a[9894],a[9895],a[4257],a[9896],a[9889],a[9897],a[9898],a[9892],a[9899],a[9900],a[3149],a[3150]],[a[68],a[2293],a[63],a[63],a[2293],a[574],a[65]],[a[9901],a[9902],a[3739],a[3740],a[9903],a[3742],a[3059]],[a[9904],a[9905],a[4306],a[9906],a[9907],a[9908],a[9909]],{"am":a[3675],"pm":a[9910]},[a[9911],a[9912],a[189],a[190]],[a[9913],a[9914],a[189],a[190]],[a[9915],a[9916],a[9917],a[9918],a[9919],a[9920],a[9921],a[9922],a[9923],a[9924],a[9925],a[9926]],[a[9927],a[9928],a[9929],a[9930],a[9931],a[9932],a[9933],a[9934],a[9935],a[9936],a[9937],a[9938]],[a[9939],a[9940],a[9941],a[9942],a[9943],a[9944],a[9945]],[a[9946],a[9947],a[9948],a[9949],a[9950],a[9951],a[9952]],{"am":a[9953],"pm":a[9954]},[a[9955],a[9956],a[189],a[190]],[a[9957],a[9958],a[189],a[190]],{"AUD":a[515],"BIF":a[3679],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1689],"MEd":a[1741],"MMdd":a[1689],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[1693],"yMEd":a[1743],"yMM":a[1692],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[1693]},[a[1313],a[62],a[63],a[64],a[63],a[1313],a[1313],a[64],a[65],a[66],a[67],a[68]],[a[9959],a[3138],a[3139],a[3140],a[3866],a[9960],a[9961],a[3142],a[3774],a[2845],a[2846],a[3145]],[a[9962],a[9963],a[9964],a[9965],a[3866],a[9966],a[9967],a[2424],a[9968],a[9969],a[9970],a[9971]],[a[9972],a[3787],a[3139],a[9973],a[4441],a[9974],a[9975]],[a[9976],a[9977],a[9978],a[9979],a[4441],a[9980],a[9981]],[a[9982]],[a[9983]],[a[9984],a[9985],a[9986],a[9987]],[a[9988],a[9989],a[9990],a[9991]],[a[9992],a[9993],a[199],a[200],a[9994],a[202],a[203],a[204],a[205],a[206],a[9995],a[208],a[209],a[210]],{"XAF":a[531],"XOF":a[533],"XPF":a[534]},[a[68],a[38],a[3388],a[9996],a[61],a[574],a[65]],[a[9997],a[2296],a[71],a[9998],a[9999],a[10000],a[10001]],[a[9984],a[9985],a[10002],a[9987]],{"MDL":a[38],"XAF":a[531],"XOF":a[533],"XPF":a[534]},[a[707],a[707],a[707],a[707],a[92],a[65],a[65],a[67],a[92],a[1313],a[1313],a[1313]],[a[10003],a[10004],a[10005],a[10006],a[10007],a[10008],a[10009],a[10010],a[10011],a[10012],a[10013],a[10014]],[a[10015],a[10016],a[10017],a[10018],a[1318],a[6438],a[1319]],[a[10019],a[10020],a[10021],a[10022],a[1325],a[1326],a[10023]],{"am":a[10024],"pm":a[10025]},[a[10026],a[10027],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[10028],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[1964],"GyMMM":a[1822],"GyMMMd":a[10029],"GyMMMEd":a[10030],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[3018],"hmv":a[36],"Hmv":a[3019],"M":a[38],"Md":a[1689],"MEd":a[1741],"MMdd":a[1689],"MMM":a[41],"MMMd":a[543],"MMMEd":a[9564],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[1693],"yMEd":a[10031],"yMM":a[1692],"yMMM":a[10032],"yMMMd":a[8722],"yMMMEd":a[8723],"yMMMM":a[10033],"yQQQ":a[1983],"yQQQQ":a[1984]},{"yMMMMEEEEd":a[1985],"yMMMMd":a[1981],"yMMMd":a[8722],"yMd":a[1697]},[a[7541],a[10034],a[7543],a[7544],a[1855],a[7545],a[7546],a[7547],a[10035],a[7549],a[10036],a[7551]],[a[10037],a[10038],a[10039],a[10040],a[1855],a[10041],a[10042],a[10043],a[10044],a[10045],a[10046],a[10047]],[a[10048],a[1878],a[2009],a[1880],a[2010],a[1882],a[1883]],[a[10049],a[10050],a[2013],a[8740],a[10051],a[10052],a[10053]],{"am":a[10054],"pm":a[10055]},[a[10056],a[10057],a[10058],a[10059],a[10060],a[2496],a[2497],a[10061],a[10062],a[10063],a[10064],a[10065],a[2503]],[a[2504],a[2505],a[2506],a[2507],a[2508],a[10066],a[10067],a[10068],a[2512],a[10069],a[10070],a[10071],a[10072]],[a[10073],a[1894],a[189],a[190]],[a[10074],a[10075],a[189],a[190]],[a[10076],a[10077],a[10078],a[10079]],[a[10080],a[2524],a[2525],a[2526],a[2527],a[2528],a[2529],a[2530],a[10081],a[2532],a[10082],a[2534],a[10083],a[2536]],[a[10084],a[10085],a[10086],a[10087],a[2541],a[10088],a[10089],a[2544],a[10090],a[2546],a[10091],a[10092]],[a[10093],a[2551],a[10094],a[10095],a[10096],a[10097],a[10098],a[10099],a[2558],a[10100],a[10101],a[10102]],[a[10103],a[10104],a[10105],a[10106],a[10107],a[10108],a[10109],a[10110],a[10111],a[10112],a[10113],a[10114],a[10115],a[10116],a[10117],a[10118],a[10119],a[10120],a[10121],a[10122],a[10123],a[10124],a[10125],a[10126],a[10127],a[10128],a[10129],a[10130],a[10131],a[10132],a[10133],a[10134],a[10135],a[10136],a[10137],a[10138],a[10139],a[10140],a[10141],a[10142],a[10143],a[10144],a[10145],a[10146],a[10147],a[10148],a[10149],a[10150],a[10151],a[10152],a[10153],a[10154],a[10155],a[10156],a[10157],a[10158],a[10159],a[10160],a[10161],a[10162],a[10163],a[10164],a[10165],a[10166],a[10167],a[10168],a[10169],a[10170],a[10171],a[10172],a[10173],a[10174],a[10175],a[10176],a[10177],a[10178],a[10179],a[10180],a[10181],a[10182],a[10183],a[10184],a[10185],a[10186],a[10187],a[10188],a[10189],a[10190],a[10191],a[10192],a[10193],a[10194],a[10195],a[10196],a[10197],a[10198],a[10199],a[10200],a[10201],a[10202],a[10203],a[10204],a[10205],a[10206],a[10207],a[10208],a[10209],a[10210],a[10211],a[10212],a[10213],a[10214],a[10215],a[10216],a[10217],a[10218],a[10219],a[10220],a[10221],a[10222],a[10223],a[10224],a[10225],a[10226],a[10227],a[10228],a[10229],a[10230],a[10231],a[10232],a[10233],a[10234],a[10235],a[10236],a[10237],a[10238],a[10239],a[10240],a[10241],a[10242],a[10243],a[10244],a[10245],a[10246],a[10247],a[10248],a[10249],a[10250],a[10251],a[10252],a[10253],a[10254],a[10255],a[10256],a[10257],a[10258],a[10259],a[10260],a[10261],a[10262],a[10263],a[10264],a[10265],a[10266],a[10267],a[10268],a[10269],a[10270],a[10271],a[10272],a[10273],a[10274],a[10275],a[10276],a[10277],a[10278],a[10279],a[10280],a[10281],a[10282],a[10283],a[10284],a[10285],a[10286],a[10287],a[10288],a[10289],a[10290],a[10291],a[10292],a[10293],a[10294],a[10295],a[10296],a[10297],a[10298],a[10299],a[10300],a[10301],a[10302],a[10303],a[10304],a[10305],a[10306],a[10307],a[10308],a[10309],a[10310],a[10311],a[10312],a[10313],a[10314],a[10315],a[10316],a[10317],a[10318],a[10319],a[10320],a[10321],a[10322],a[10323],a[10324],a[10325],a[10326],a[10327],a[10328],a[10329],a[10330],a[10331],a[10332],a[10333],a[10334],a[10335],a[10336],a[10337],a[10338]],[a[10339],a[2799],a[10340],a[2801],a[2802],a[10341],a[2804],a[2805],a[10342],a[10343],a[2808],a[10344]],{"decimal":a[509],"group":a[599],"nan":a[10345],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"RUB":a[1899],"RUR":a[1898],"THB":a[601],"TMT":a[10346],"TWD":a[528],"UAH":a[10347],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[10348]},{"AUD":a[515],"BRL":a[516],"BYR":a[1898],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"RUB":a[1899],"THB":a[601],"TMT":a[10346],"TWD":a[528],"UAH":a[10347],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[10348]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KGS":a[7571],"KRW":a[525],"MXN":a[526],"NZD":a[527],"RUB":a[1899],"RUR":a[1898],"THB":a[601],"TMT":a[10346],"TWD":a[528],"UAH":a[10347],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[10348]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"KZT":a[6791],"MXN":a[526],"NZD":a[527],"RUB":a[1899],"RUR":a[1898],"THB":a[601],"TMT":a[10346],"TWD":a[528],"UAH":a[10347],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[10348]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MDL":a[38],"MXN":a[526],"NZD":a[527],"RUB":a[1899],"RUR":a[1898],"THB":a[601],"TMT":a[10346],"TWD":a[528],"UAH":a[10347],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"XXX":a[10348]},[a[10349],a[10350],a[10351],a[10352],a[10353],a[10354],a[10355],a[9943],a[10356],a[10357],a[10358],a[10359]],[a[10360],a[10361],a[10362],a[10363],a[10364],a[10365],a[9935],a[10366],a[10367],a[10368],a[10369],a[10370]],[a[10371],a[9940],a[9941],a[9942],a[9943],a[9944],a[9945]],[a[10372],a[10373],a[10374],a[10375],a[10376],a[10377],a[10378]],{"yMMMMEEEEd":a[10379],"yMMMMd":a[8753],"yMMMd":a[8754],"yMd":a[10380]},[a[6741],a[7540],a[9583],a[6739],a[10381],a[6768],a[7540],a[6736],a[6768],a[6736],a[6738],a[6736]],[a[10382],a[10383],a[10384],a[10385],a[10386],a[10387],a[10388],a[10389],a[10390],a[10391],a[10392],a[10393]],[a[10394],a[10395],a[10396],a[10397],a[10398],a[10399],a[10400],a[10401],a[10402],a[10403],a[10404],a[10405]],[a[6768],a[6768],a[7540],a[6738],a[10406],a[6768],a[6738]],[a[6773],a[10407],a[10408],a[10409],a[10410],a[10411],a[6775]],[a[10412],a[10413],a[10414],a[10415],a[10416],a[10417],a[10418]],{"am":a[10419],"pm":a[10420]},[a[10421],a[10422],a[189],a[190]],[a[66],a[93],a[66],a[66],a[1313],a[1313],a[65],a[1313],a[65],a[92],a[92],a[92]],[a[10423],a[10424],a[10425],a[10426],a[10427],a[10428],a[10429],a[10430],a[10431],a[10432],a[10433],a[10434]],[a[10435],a[10436],a[10437],a[10438],a[10439],a[10440],a[10441],a[10442],a[10443],a[10444],a[10445],a[10446]],[a[64],a[707],a[66],a[1313],a[1313],a[65],a[707]],[a[10447],a[10448],a[10426],a[3508],a[10428],a[10429],a[709]],[a[10449],a[10450],a[10451],a[10452],a[10453],a[10454],a[10455]],{"am":a[10456],"pm":a[10457]},[a[10458],a[10459],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[48],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[10460],"yMMMEd":a[52],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},[a[10461],a[10462],a[10463],a[10464],a[10465],a[10466],a[10467],a[10468],a[10469],a[10470],a[10471],a[10472]],[a[10473],a[10474],a[10475],a[10476],a[10477],a[10478],a[10479],a[10480],a[10481],a[10482],a[10483],a[10484]],[a[63],a[61],a[61],a[61],a[64],a[1313],a[61]],[a[1942],a[1315],a[1316],a[1317],a[1318],a[6438],a[1320]],[a[10485],a[1322],a[1323],a[1324],a[10486],a[1326],a[1327]],{"am":a[10487],"pm":a[10488]},[a[725],a[9039],a[189],a[190]],[a[10489],a[10490],a[189],a[190]],[a[66],a[2293],a[67],a[3116],a[63],a[2293],a[65],a[188],a[2429],a[2293],a[65],a[61]],[a[10491],a[10492],a[10493],a[10494],a[10495],a[10496],a[10497],a[10498],a[10499],a[10500],a[10501],a[10502]],[a[10503],a[10504],a[10505],a[10506],a[10507],a[10508],a[10509],a[10510],a[10511],a[10512],a[10513],a[10514]],[a[65],a[574],a[63],a[2293],a[68],a[188],a[38]],[a[10515],a[10516],a[10517],a[10518],a[10519],a[10520],a[10521]],[a[10522],a[10523],a[10524],a[10525],a[10526],a[10527],a[10528]],{"am":a[10529],"pm":a[10530]},[a[10531],a[10532],a[189],a[190]],[a[10533],a[10534],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DKK":a[10535],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NOK":a[3707],"NZD":a[527],"SEK":a[10536],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DKK":a[10535],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NOK":a[10537],"NZD":a[527],"SEK":a[3707],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"HHmm":a[31],"HHmmss":a[33],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[3653],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[547],"yMEd":a[3654],"yMM":a[2071],"yMMM":a[3825],"yMMMd":a[3815],"yMMMEd":a[3808],"yMMMM":a[3765],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[3769],"yMMMMd":a[3766],"yMMMd":a[3815],"yMd":a[611]},[a[69],a[4423],a[71],a[4225],a[3087],a[74],a[75],a[76],a[4228],a[4428],a[79],a[80]],[a[10538],a[10539],a[10540],a[4233],a[10541],a[10542],a[10543],a[10544],a[10545],a[10546],a[10547],a[10548]],[a[68],a[1347],a[3116],a[92],a[67],a[65],a[65]],[a[3406],a[10549],a[10550],a[3507],a[10551],a[10552],a[1924]],[a[10553],a[10554],a[10555],a[10556],a[10557],a[10558],a[10559]],[a[10560],a[192],a[189],a[190]],[a[10561],a[194],a[189],a[190]],[a[3286],a[3287],a[3288],a[3289],a[6677],a[3290],a[3291]],{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[63],"Md":a[608],"MEd":a[1253],"MMd":a[2068],"MMdd":a[2069],"MMM":a[2070],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[547],"yMEd":a[612],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[67],a[62],a[63],a[67],a[188],a[62],a[38],a[707],a[63],a[67],a[67],a[707]],[a[10562],a[9491],a[10563],a[3204],a[10564],a[10565],a[10566],a[10567],a[9256],a[10568],a[10569],a[10570]],[a[10571],a[10572],a[10573],a[10574],a[10575],a[10576],a[10577],a[10578],a[10579],a[10580],a[10581],a[10582]],[a[707],a[65],a[92],a[65],a[707],a[1347],a[708]],[a[10583],a[10584],a[10585],a[10586],a[10587],a[10588],a[10589]],[a[10590],a[10591],a[10592],a[10593],a[10594],a[10595],a[10596]],{"am":a[1685],"pm":a[10597]},[a[10598],a[10599],a[189],a[190]],[a[10600],a[10601],a[189],a[190]],[a[10602],a[10603],a[10604],a[10602],a[10604],a[10605],a[10605],a[10606],a[10607],a[10608],a[10609],a[10610]],[a[10611],a[10612],a[10613],a[10614],a[10615],a[10616],a[10617],a[10618],a[10619],a[10620],a[10621],a[10622]],[a[10623],a[10624],a[10625],a[10626],a[10627],a[10628],a[10629],a[10630],a[10631],a[10632],a[10633],a[10634]],[a[10635],a[10636],a[10637],a[10638],a[10639],a[10640],a[10641]],[a[10642],a[10643],a[10644],a[10645],a[10646],a[10647],a[10648]],{"am":a[10649],"pm":a[10650]},[a[10651],a[10652],a[189],a[190]],[a[10653],a[10654],a[189],a[190]],[a[10655],a[1769],a[1767],a[10655],a[1767],a[46],a[46],a[10656],a[627],a[621],a[620],a[17]],[a[10657],a[10658],a[10659],a[10660],a[1352],a[7687],a[7688],a[10661],a[10662],a[10663],a[10664],a[10665]],[a[10666],a[10667],a[10668],a[10669],a[10670],a[10671],a[10672],a[10673],a[10674],a[10675],a[10676],a[10677]],[a[10678],a[10679],a[10680],a[10681],a[10682],a[10683],a[10684]],[a[10685],a[10686],a[10687],a[10688],a[10689],a[10690],a[10691]],{"am":a[10692],"pm":a[10693]},[a[10694],a[10695],a[189],a[190]],[a[10696],a[10697],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[10698],"EHm":a[1819],"Ehms":a[10699],"EHms":a[1821],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[5632],"H":a[29],"hm":a[10700],"Hm":a[1825],"hms":a[10701],"Hms":a[1827],"hmsv":a[3130],"Hmsv":a[1829],"hmv":a[3131],"Hmv":a[1831],"M":a[38],"Md":a[3427],"MEd":a[10702],"MMM":a[41],"MMMd":a[42],"MMMEd":a[10703],"MMMMd":a[44],"ms":a[1835],"y":a[46],"yM":a[3432],"yMd":a[3433],"yMEd":a[10704],"yMMM":a[1257],"yMMMd":a[679],"yMMMEd":a[1258],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},[a[10705],a[10706],a[10707],a[10708],a[10709],a[10710],a[10710],a[10708],a[10711],a[10712],a[10713],a[10714]],[a[10715],a[10716],a[10717],a[10718],a[10719],a[10720],a[10721],a[10722],a[10723],a[10724],a[10725],a[10726]],[a[10727],a[10728],a[10717],a[10718],a[10719],a[10720],a[10721],a[10729],a[10730],a[10731],a[10732],a[10733]],[a[10734],a[10735],a[10708],a[10736],a[10737],a[10738],a[10739]],[a[10740],a[10741],a[10742],a[10743],a[10744],a[10745],a[10746]],[a[10740],a[10741],a[10747],a[10743],a[10748],a[10749],a[10750]],{"am":a[10751],"pm":a[10752]},[a[10753],a[10754],a[10755],a[10756]],[a[10757],a[10758],a[10759],a[10760]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"LKR":a[10761],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[10762],"XPF":a[534]},{"d":a[3011],"E":a[18],"Ed":a[3012],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[3013],"GyMMMd":a[3014],"GyMMMEd":a[10763],"GyMMMMd":a[3014],"h":a[28],"H":a[481],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[1230],"hmsv":a[34],"Hmsv":a[3018],"hmv":a[36],"Hmv":a[3019],"M":a[5325],"Md":a[3020],"MEd":a[3021],"MMM":a[41],"MMMd":a[3020],"MMMEd":a[3021],"MMMMd":a[2394],"MMMMEd":a[3022],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[3023],"yMEd":a[3024],"yMMM":a[47],"yMMMd":a[3023],"yMMMEd":a[3024],"yMMMM":a[1840],"yMMMMd":a[3025],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[3226],"yMMMMd":a[3025],"yMMMd":a[3023],"yMd":a[1841]},[a[2411],a[1349],a[1350],a[1700],a[10764],a[10765],a[10766],a[2415],a[2416],a[1704],a[2417],a[2418]],[a[10767],a[10768],a[9722],a[10769],a[10770],a[10771],a[10772],a[10773],a[3313],a[10774],a[10775],a[3316]],[a[620],a[3317],a[653],a[623],a[5608],a[3317],a[623]],[a[3053],a[3054],a[10776],a[3056],a[8170],a[10777],a[3059]],[a[10778],a[10779],a[10780],a[10781],a[10782],a[10783],a[3066]],[a[10784],a[8180],a[10785],a[3072]],[a[10786],a[10787],a[10788],a[10789]],{"EUR":a[519],"ILS":a[10790],"MXN":a[526],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[3011],"E":a[18],"Ed":a[2455],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyM":a[25],"GyMMM":a[25],"GyMMMd":a[3126],"GyMMMEd":a[3219],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[3020],"MEd":a[10791],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[3023],"yMEd":a[10792],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3225],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[10793],"yMMMMd":a[10794],"yMMMd":a[3134],"yMd":a[10795]},[a[3137],a[3138],a[3139],a[3140],a[2412],a[3141],a[2842],a[10796],a[3143],a[3144],a[2846],a[3145]],[a[2419],a[2420],a[10797],a[2421],a[2412],a[10798],a[10799],a[10800],a[3147],a[3148],a[3149],a[3150]],[a[620],a[3317],a[622],a[623],a[10801],a[3317],a[623]],[a[10802],a[9732],a[3155],a[10803],a[10804],a[10805],a[9737]],[a[10806],a[10807],a[10808],a[10809],a[10810],a[10811],a[3066]],{"am":a[3067],"pm":a[10812]},[a[5366],a[10813],a[10814],a[10815]],[a[10816],a[10817],a[10818],a[10813]],{"AUD":a[515],"BRL":a[516],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[1347],a[574],a[63],a[707],a[92],a[574],a[38]],[a[10819],a[10820],a[3739],a[10821],a[10822],a[10823],a[10824]],[a[10825],a[10826],a[10827],a[10828],a[10829],a[10830],a[10831]],{"decimal":a[508],"group":a[509],"nan":a[10832],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},[a[67],a[707],a[707],a[707],a[3116],a[3116],a[3116],a[67],a[2293],a[2293],a[63],a[2072]],[a[10833],a[10834],a[9451],a[10835],a[10836],a[10837],a[10838],a[6563],a[10839],a[10840],a[10841],a[10842]],[a[10843],a[10844],a[10845],a[10846],a[10847],a[10848],a[10849],a[10850],a[10851],a[10852],a[10853],a[10854]],[a[65],a[63],a[3116],a[3116],a[3116],a[3116],a[63]],[a[10855],a[10856],a[10857],a[10858],a[10859],a[10860],a[3490]],[a[10861],a[10862],a[10555],a[10556],a[10863],a[10558],a[10864]],[a[10865],a[10866],a[189],a[190]],{"yMMMMEEEEd":a[10867],"yMMMMd":a[552],"yMMMd":a[3683],"yMd":a[3080]},[a[10868],a[10869],a[3108],a[10870],a[10552],a[10871],a[10872],a[10873],a[10874],a[10433],a[10875],a[10876]],[a[10877],a[10878],a[10879],a[10880],a[10881],a[10882],a[10883],a[10884],a[10885],a[10886],a[10887],a[10888]],[a[64],a[1313],a[92],a[64],a[707],a[61],a[65]],[a[10889],a[8941],a[3408],a[10890],a[8942],a[3203],a[1924]],[a[10891],a[10892],a[10893],a[10894],a[10895],a[10896],a[10897]],{"am":a[10898],"pm":a[10899]},[a[10900],a[10901],a[189],a[190]],[a[10902],a[10903],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SOS":a[65],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"DJF":a[1219],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SOS":a[65],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"ETB":a[9521],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SOS":a[65],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KES":a[3217],"KRW":a[525],"MXN":a[526],"NZD":a[527],"SOS":a[65],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[10905],"Hmsv":a[10906],"hmv":a[10907],"Hmv":a[10908],"M":a[38],"Md":a[1832],"MEd":a[1833],"MMdd":a[1832],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[1836],"yMd":a[1837],"yMEd":a[1838],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[53],"yQQQ":a[6453],"yQQQQ":a[6454]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[1841]},{"hmmsszzzz":a[10909],"hmsz":a[10910],"hms":a[32],"hm":a[30]},[a[61],a[65],a[63],a[1347],a[63],a[3831],a[707],a[2293],a[65],a[92],a[67],a[68]],[a[69],a[10911],a[71],a[10912],a[10913],a[10914],a[9446],a[10915],a[10916],a[10917],a[10918],a[10919]],[a[10920],a[10921],a[4257],a[10922],a[2412],a[10923],a[10924],a[10925],a[10926],a[10927],a[10928],a[10929]],[a[68],a[481],a[63],a[63],a[1900],a[1347],a[65]],[a[10930],a[10931],a[71],a[10932],a[10933],a[10934],a[10916]],[a[10935],a[10936],a[10937],a[10938],a[10939],a[10940],a[10941]],{"am":a[10942],"pm":a[10943]},[a[10944],a[10945],a[10946],a[10947]],[a[10948],a[10949],a[10950],a[10951]],{"ALL":a[10952],"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"ALL":a[10952],"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MKD":a[10953],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[1900],"Ed":a[3012],"Ehm":a[10954],"EHm":a[10955],"Ehms":a[10956],"EHms":a[10957],"Gy":a[2383],"GyMMM":a[2384],"GyMMMd":a[5323],"GyMMMEd":a[5324],"h":a[28],"H":a[29],"hm":a[1824],"Hm":a[1825],"hms":a[1826],"Hms":a[1827],"hmsv":a[3130],"Hmsv":a[1829],"hmv":a[3131],"Hmv":a[1831],"M":a[38],"Md":a[608],"MEd":a[3222],"MMdd":a[1252],"MMM":a[41],"MMMd":a[3132],"MMMdd":a[10958],"MMMEd":a[3133],"MMMMd":a[2394],"MMMMEd":a[2395],"ms":a[1835],"y":a[2396],"yM":a[10959],"yMd":a[8463],"yMEd":a[8464],"yMM":a[2397],"yMMdd":a[2398],"yMMM":a[2401],"yMMMd":a[5327],"yMMMEd":a[5328],"yMMMM":a[10960],"yQQQ":a[10961],"yQQQQ":a[10962]},[a[2466],a[2467],a[1750],a[2004],a[2461],a[2462],a[2463],a[1755],a[2470],a[2471],a[2472],a[2473]],[a[2475],a[2476],a[2477],a[10963],a[2479],a[2480],a[2481]],[a[2482],a[2483],a[2484],a[8740],a[2486],a[2487],a[1890]],{"am":a[2489],"pm":a[10964]},[a[10965],a[10966],a[2519],a[2520]],{"BAM":a[2812],"BGN":a[10967],"BRL":a[516],"BYR":a[10968],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"MXN":a[526],"TWD":a[528],"USD":a[602],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[2411],a[1349],a[1350],a[1700],a[2412],a[2413],a[2414],a[10969],a[2416],a[1704],a[2417],a[2418]],[a[2419],a[2420],a[1709],a[2421],a[2412],a[2413],a[2414],a[10800],a[2425],a[2426],a[2427],a[2428]],[a[620],a[3317],a[653],a[623],a[10801],a[3317],a[623]],[a[2430],a[2431],a[2432],a[10970],a[2434],a[2435],a[2436]],[a[10806],a[10971],a[2439],a[10809],a[2441],a[2442],a[2443]],{"am":a[10972],"pm":a[10973]},[a[10974],a[149],a[150],a[151],a[152],a[10975],a[154],a[10976],a[10977],a[157],a[158],a[159],a[4488]],[a[163],a[164],a[165],a[166],a[167],a[10978],a[169],a[170],a[171],a[172],a[173],a[10979],a[175]],[a[2446],a[2447],a[189],a[190]],[a[10980],a[10981],a[2446],a[2447]],[a[10982],a[10983],a[199],a[200],a[10984],a[202],a[203],a[204],a[4512],a[206],a[207],a[208],a[209],a[210]],[a[10985],a[10986],a[10987],a[10988],a[215],a[10989],a[217],a[218],a[10990],a[10991],a[10992],a[10993]],[a[10994],a[237],a[238],a[239],a[240],a[241],a[10995],a[10996],a[244],a[10997],a[10998],a[10999]],[a[249],a[8186],a[8187],a[8188],a[8189],a[254],a[8190],a[256],a[8191],a[258],a[8192],a[11000],a[11001],a[11002],a[11003],a[11004],a[8198],a[11005],a[8200],a[8201],a[8202],a[8203],a[8204],a[8205],a[273],a[5829],a[8206],a[8207],a[5831],a[8208],a[8209],a[8210],a[11006],a[8211],a[8212],a[8213],a[8214],a[286],a[8215],a[8216],a[8217],a[290],a[5834],a[8219],a[293],a[294],a[8220],a[5835],a[297],a[8222],a[8223],a[8224],a[8225],a[8226],a[8227],a[11007],a[305],a[8230],a[8231],a[8232],a[309],a[8233],a[11008],a[8234],a[11009],a[8236],a[8237],a[8238],a[11010],a[8240],a[11011],a[5837],a[8242],a[8243],a[8244],a[11012],a[8246],a[8247],a[327],a[8249],a[11013],a[5840],a[11014],a[11015],a[8253],a[11016],a[5841],a[11017],a[11018],a[8257],a[8258],a[340],a[8259],a[5843],a[11019],a[8261],a[8262],a[8263],a[347],a[5844],a[8265],a[8266],a[351],a[11020],a[8268],a[11021],a[8270],a[11022],a[8272],a[11023],a[8274],a[8275],a[5846],a[8277],a[8278],a[8279],a[8280],a[11024],a[11025],a[368],a[369],a[370],a[11026],a[5849],a[8284],a[374],a[8285],a[11027],a[377],a[378],a[11028],a[8289],a[8290],a[8291],a[8292],a[11029],a[8294],a[5851],a[11030],a[8297],a[8298],a[390],a[8299],a[392],a[393],a[11031],a[5852],a[8301],a[8302],a[8303],a[11032],a[11033],a[8306],a[5854],a[403],a[8307],a[8308],a[406],a[8309],a[8310],a[409],a[11034],a[411],a[8313],a[8314],a[8315],a[415],a[416],a[8316],a[418],a[8317],a[8318],a[8319],a[422],a[5856],a[8321],a[8322],a[8323],a[8324],a[8325],a[8326],a[8327],a[431],a[8328],a[433],a[8329],a[435],a[8330],a[437],a[8331],a[5857],a[11035],a[441],a[442],a[8333],a[444],a[8334],a[8335],a[5859],a[8337],a[449],a[8338],a[8339],a[452],a[453],a[8341],a[8342],a[11036],a[457],a[8344],a[8345],a[8346],a[461],a[8347],a[8348],a[5863],a[8350],a[8351],a[5865],a[468],a[469],a[8353],a[471],a[472],a[8354],a[8355],a[475],a[476],a[5866],a[8357],a[11037],a[8359],a[11038],a[8361],a[8362],a[11039]],[a[11040],a[11041],a[11042],a[489],a[490],a[11043],a[492],a[493],a[494],a[11044],a[496],a[497]],[a[11045],a[11046]],{"BAM":a[1330],"BGN":a[10967],"BRL":a[516],"BYR":a[10968],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"MXN":a[526],"TWD":a[528],"USD":a[602],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMd":a[608],"MMdd":a[2069],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[3685],"yMM":a[1255],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[547]},[a[3137],a[3138],a[4257],a[3140],a[2412],a[2422],a[2423],a[3142],a[3143],a[3144],a[2846],a[3145]],[a[6814],a[6815],a[4257],a[2421],a[2412],a[2422],a[2423],a[11047],a[3147],a[3148],a[3149],a[3150]],[a[11048],a[11049],a[11050],a[11051],a[11052],a[11053],a[11054]],[a[11055],a[9401],a[11056],a[3161],a[3162],a[3163],a[11057]],{"am":a[11058],"pm":a[11059]},[a[9139],a[11060],a[11061],a[9142],a[11062],a[11063],a[11064],a[11065],a[9147],a[11066],a[11067],a[11068],a[11069]],[a[11070],a[11071],a[9160],a[11072],a[1405],a[11073],a[11074],a[11075],a[11076],a[11077],a[11078],a[11079],a[11080]],[a[3169],a[3170],a[3167],a[3168]],[a[11081],a[11082],a[11083],a[11084]],[a[11085],a[11086],a[11087],a[11088],a[11089],a[11090],a[11091],a[11092],a[11093],a[11094],a[11095],a[11096],a[11097],a[11098]],[a[9191],a[11099],a[11100],a[11101],a[11102],a[11103],a[11104],a[11105],a[11106],a[11107],a[11108],a[11109]],[a[11110]],[a[4208],a[4209],a[4210],a[4211],a[11111],a[11112],a[4368],a[11113],a[4216],a[9218],a[11114],a[11115]],[a[249],a[250],a[251],a[252],a[253],a[254],a[255],a[256],a[257],a[258],a[5824],a[11116],a[11117],a[11118],a[11119],a[11120],a[265],a[11121],a[267],a[268],a[269],a[270],a[271],a[272],a[273],a[5829],a[5830],a[276],a[5831],a[278],a[5832],a[280],a[281],a[282],a[5833],a[284],a[285],a[286],a[287],a[288],a[289],a[290],a[8218],a[292],a[293],a[294],a[295],a[8221],a[297],a[298],a[299],a[300],a[301],a[302],a[303],a[304],a[305],a[306],a[307],a[308],a[309],a[310],a[311],a[312],a[313],a[314],a[315],a[316],a[5836],a[318],a[319],a[5837],a[321],a[5838],a[323],a[324],a[325],a[326],a[8248],a[328],a[8250],a[5840],a[331],a[332],a[333],a[334],a[5841],a[336],a[337],a[5842],a[339],a[340],a[341],a[5843],a[343],a[344],a[345],a[346],a[347],a[8264],a[349],a[350],a[351],a[352],a[353],a[354],a[5845],a[356],a[357],a[358],a[359],a[360],a[8276],a[5847],a[363],a[364],a[5848],a[366],a[367],a[368],a[369],a[370],a[371],a[5849],a[373],a[374],a[375],a[11122],a[377],a[378],a[379],a[380],a[381],a[382],a[383],a[11123],a[385],a[8295],a[387],a[388],a[389],a[390],a[391],a[392],a[393],a[394],a[5852],a[396],a[397],a[398],a[399],a[5853],a[401],a[5854],a[403],a[404],a[5855],a[406],a[407],a[408],a[409],a[410],a[411],a[412],a[413],a[414],a[415],a[416],a[417],a[418],a[419],a[420],a[421],a[422],a[8320],a[424],a[425],a[426],a[427],a[428],a[429],a[430],a[431],a[432],a[433],a[434],a[435],a[436],a[437],a[438],a[5857],a[440],a[441],a[442],a[443],a[444],a[445],a[5858],a[8336],a[448],a[449],a[5860],a[5861],a[452],a[453],a[454],a[5862],a[456],a[457],a[458],a[459],a[460],a[461],a[462],a[463],a[8349],a[5864],a[466],a[8352],a[468],a[469],a[470],a[471],a[472],a[473],a[474],a[475],a[476],a[8356],a[478],a[479],a[480],a[482],a[483],a[484],a[485]],[a[9221],a[9222],a[11124],a[9224],a[11125],a[9226],a[9227],a[11126],a[11127],a[9230],a[9231],a[9232]],[a[11128],a[11129]],{"BBD":a[11130],"BMD":a[11131],"BRL":a[11132],"BSD":a[11133],"BZD":a[11134],"CAD":a[517],"DKK":a[10535],"DOP":a[3830],"EEK":a[11135],"EGP":a[11136],"EUR":a[519],"ILS":a[522],"ISK":a[11137],"JMD":a[11138],"MXN":a[526],"NOK":a[10537],"SEK":a[3707],"USD":a[602],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"yMMMMEEEEd":a[615],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[3818]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[27],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[1259],"yQQQQ":a[55]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KES":a[3217],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"TZS":a[1336],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[27],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[1259],"yQQQQ":a[55]},[a[11139],a[11140],a[11141],a[7710],a[7711],a[7709],a[11142],a[11143],a[11144],a[11145],a[11146],a[11147]],[a[11148],a[11149],a[11150],a[11151],a[11152],a[11153],a[11154],a[11155],a[11156],a[11157],a[11158],a[11159]],[a[11160],a[3369],a[11161],a[11162],a[11163],a[11164],a[11165]],[a[11166],a[11167],a[11168],a[11169],a[11170],a[11171],a[11172]],{"am":a[11173],"pm":a[11174]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CDF":a[4410],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KES":a[3217],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"TZS":a[1336],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KES":a[3217],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"TZS":a[1336],"UGX":a[2952],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[11176],"EHm":a[21],"Ehms":a[11177],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[5632],"H":a[29],"hm":a[5633],"Hm":a[31],"hms":a[5634],"Hms":a[33],"hmsv":a[6724],"Hmsv":a[35],"hmv":a[6725],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[1253],"MMdd":a[541],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMM":a[546],"yMMM":a[50],"yMMMd":a[617],"yMMMEd":a[2116],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"hmmsszzzz":a[11178],"hmsz":a[11179],"hms":a[5634],"hm":a[5633]},[a[11180],a[11181],a[11182],a[11183],a[11184],a[11185],a[11185],a[11186],a[11187],a[11188],a[11189],a[11190]],[a[11191],a[11192],a[11193],a[11194],a[11184],a[11195],a[11196],a[11197],a[11198],a[11199],a[11200],a[11201]],[a[11202],a[11203],a[11204],a[11205],a[11184],a[11195],a[11196],a[11206],a[11207],a[11208],a[11209],a[11210]],[a[11211],a[11212],a[11187],a[11213],a[11214],a[11215],a[11216]],[a[11217],a[11218],a[11219],a[11220],a[11221],a[11222],a[11223]],[a[11224],a[11225],a[11226],a[11227],a[11228],a[11229],a[11223]],{"am":a[11230],"pm":a[11231]},[a[11232],a[11233],a[11234],a[11235],a[11236],a[11237],a[11238],a[11239],a[11240],a[11241],a[11242],a[11243]],[a[11244],a[11245],a[11246],a[11247],a[11248],a[11249],a[11250],a[11251],a[11252],a[11253],a[11254],a[11255]],[a[11256],a[11257],a[11258],a[11259]],[a[11260],a[11261],a[11258],a[11259]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"LKR":a[11262],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"MYR":a[3699],"NZD":a[527],"SGD":a[11263],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"MYR":a[3699],"NZD":a[527],"SGD":a[529],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[11264],"GyMMMEd":a[11265],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[542],"MMdd":a[541],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[1341],"yMM":a[546],"yMMM":a[50],"yMMMd":a[11266],"yMMMEd":a[8911],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[11267],"yMMMMd":a[1747],"yMMMd":a[617],"yMd":a[3820]},[a[11268],a[11269],a[11270],a[11271],a[11272],a[11273],a[11274],a[11275],a[11276],a[11277],a[11278],a[11279]],[a[11280],a[11281],a[11282],a[11283],a[11272],a[11284],a[11285],a[11286],a[11287],a[11288],a[11289],a[11290]],[a[11291],a[11292],a[11282],a[11293],a[11272],a[11284],a[11285],a[11294],a[11295],a[11296],a[11297],a[11298]],[a[11275],a[11299],a[11300],a[11301],a[11302],a[11303],a[11304]],[a[11305],a[11306],a[11307],a[11308],a[11309],a[11310],a[11311]],[a[11312],a[11313],a[11314],a[11315],a[11316],a[11317],a[11318]],{"am":a[11319],"pm":a[11320]},[a[11321],a[11322],a[11323],a[11324]],[a[11325],a[11326],a[11327],a[11328]],[a[603],a[63],a[707],a[68],a[63],a[63],a[61],a[1347],a[65],a[92],a[38],a[1347]],[a[8660],a[11329],a[8658],a[11330],a[71],a[11331],a[8631],a[11332],a[11333],a[11334],a[10869],a[11335]],[a[11336],a[11337],a[11338],a[11339],a[11340],a[11341],a[11342],a[11343],a[11344],a[11345],a[11346],a[11347]],[a[61],a[188],a[64],a[2073],a[2073],a[707],a[65]],[a[3202],a[11348],a[11349],a[11350],a[11351],a[3181],a[1924]],[a[11352],a[11353],a[11354],a[11355],a[11356],a[11357],a[11358]],{"am":a[11359],"pm":a[11360]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KES":a[3217],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"UGX":a[2952],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[536],"Ehm":a[20],"EHm":a[11361],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[4987],"GyMMMd":a[11362],"GyMMMEd":a[11363],"GyMMMEEEEd":a[11364],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[11365],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMEEEEd":a[11366],"MMMMd":a[811],"MMMMEd":a[545],"MMMMEEEEd":a[11367],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMEEEEd":a[11368],"yMMMM":a[11369],"yMMMMd":a[11370],"yMMMMEd":a[11371],"yMMMMEEEEd":a[11372],"yQQQ":a[54],"yQQQQ":a[11373]},{"yMMMMEEEEd":a[11372],"yMMMMd":a[11370],"yMMMd":a[549],"yMd":a[1345]},{"hmmsszzzz":a[11374],"hmsz":a[11375],"hms":a[33],"hm":a[31]},[a[11376],a[11377],a[11378],a[11379],a[11380],a[11381],a[11382],a[11383],a[11384],a[11385],a[11386],a[11387]],[a[11388],a[11389],a[11390],a[11391],a[11392],a[11393],a[11394],a[11395],a[11396],a[11397],a[11398],a[11399]],[a[11400],a[11401],a[11402],a[11403],a[11404],a[11405],a[11406]],[a[11407],a[11408],a[11409],a[11410],a[11411],a[11412],a[11413]],[a[11414],a[11415],a[11416],a[11417],a[11418],a[11419],a[11420]],[a[11421]],[a[11422]],{"am":a[11423],"pm":a[11424]},[a[11425],a[11426],a[11427],a[11428],a[11429],a[11430],a[11431],a[11432],a[11433],a[11434],a[11435],a[11436],a[11437]],[a[11438],a[11439],a[11440],a[11441],a[11442],a[11443],a[11444],a[11445],a[11446],a[11447],a[11448],a[11449],a[11450]],[a[11451],a[11452],a[11453],a[11454]],[a[11455],a[11452],a[11453],a[11454]],[a[11456],a[11457],a[11458],a[11459]],[a[11460],a[11461],a[11462],a[11463],a[11464],a[11465],a[11466],a[11467],a[11468],a[11469],a[11470],a[11471],a[11472],a[11473]],[a[11474]],[a[11475],a[11476],a[11477],a[11478],a[11479],a[11480],a[11481],a[11482],a[11483],a[11484],a[11485],a[11486]],[a[11487]],[a[11488],a[11489],a[11490],a[11491],a[11492],a[11493],a[11494],a[11495],a[11496],a[11497],a[11498],a[11499]],[a[11500],a[11501],a[11490],a[11491],a[11492],a[11493],a[11502],a[11503],a[11504],a[11505],a[11506],a[11507]],[a[11508]],[a[11509]],[a[11510],a[11511],a[11512],a[11513],a[11514],a[11515],a[11516],a[11517],a[11518],a[11519],a[11520],a[11521],a[11522],a[11523],a[11524],a[11525],a[11526],a[11527],a[11528],a[11529],a[11530],a[11531],a[11532],a[11533],a[11534],a[11535],a[11536],a[11537],a[11538],a[11539],a[11540],a[11541],a[11542],a[11543],a[11544],a[11545],a[11546],a[11547],a[11548],a[11549],a[11550],a[11551],a[11552],a[11553],a[11554],a[11555],a[11556],a[11557],a[11558],a[11559],a[11560],a[11561],a[11562],a[11563],a[11564],a[11565],a[11566],a[11567],a[11568],a[11569],a[11570],a[11571],a[11572],a[11573],a[11574],a[11575],a[11576],a[11577],a[11578],a[11579],a[11580],a[11581],a[11582],a[11583],a[11584],a[11585],a[11586],a[11587],a[11588],a[11589],a[11590],a[11591],a[11592],a[11593],a[11594],a[11595],a[11596],a[11597],a[11598],a[11599],a[11600],a[11601],a[11602],a[11603],a[11604],a[11605],a[11606],a[11607],a[11608],a[11609],a[11610],a[11611],a[11612],a[11613],a[11614],a[11615],a[11616],a[11617],a[11618],a[11619],a[11620],a[11621],a[11622],a[11623],a[11624],a[11625],a[11626],a[11627],a[11628],a[11629],a[11630],a[11631],a[11632],a[11633],a[11634],a[11635],a[11636],a[11637],a[11638],a[11639],a[11640],a[11641],a[11642],a[11643],a[11644],a[11645],a[11646],a[11647],a[11648],a[11649],a[11650],a[11651],a[11652],a[11653],a[11654],a[11655],a[11656],a[11657],a[11658],a[11659],a[11660],a[11661],a[11662],a[11663],a[11664],a[11665],a[11666],a[11667],a[11668],a[11669],a[11670],a[11671],a[11672],a[11673],a[11674],a[11675],a[11676],a[11677],a[11678],a[11679],a[11680],a[11681],a[11682],a[11683],a[11684],a[11685],a[11686],a[11687],a[11688],a[11689],a[11690],a[11691],a[11692],a[11693],a[11694],a[11695],a[11696],a[11697],a[11698],a[11699],a[11700],a[11701],a[11702],a[11703],a[11704],a[11705],a[11706],a[11707],a[11708],a[11709],a[11710],a[11711],a[11712],a[11713],a[11714],a[11715],a[11716],a[11717],a[11718],a[11719],a[11720],a[11721],a[11722],a[11723],a[11724],a[11725],a[11726],a[11727],a[11728],a[11729],a[11730],a[11731],a[11732],a[11733],a[11734],a[11735],a[11736],a[11737],a[11738],a[11739],a[11740],a[11741],a[11742],a[11743],a[11744],a[11745]],[a[11746],a[11747],a[11748],a[11749],a[11750],a[11751],a[11752],a[11753],a[11754],a[11755],a[11756],a[11757]],[a[11758]],[a[11759],a[11760]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"yMMMMEEEEd":a[11761],"yMMMMd":a[552],"yMMMd":a[3683],"yMd":a[3080]},[a[749],a[750],a[751],a[11762],a[753],a[754],a[755],a[756],a[757],a[11763],a[759],a[760]],[a[761],a[762],a[751],a[11764],a[753],a[754],a[755],a[764],a[765],a[11765],a[767],a[768]],[a[770],a[770],a[11766],a[771],a[11767],a[773],a[11768]],[a[11769],a[11770],a[11771],a[778],a[11772],a[11773],a[11774]],{"am":a[11775],"pm":a[11776]},{"yMMMMEEEEd":a[11777],"yMMMMd":a[552],"yMMMd":a[3683],"yMd":a[3080]},[a[11778],a[11779],a[11780],a[11781],a[11782],a[11783],a[11784],a[11785],a[11786],a[11787],a[11788],a[11789]],[a[11778],a[11790],a[791],a[792],a[793],a[11783],a[11784],a[11785],a[785],a[11791],a[11788],a[11792]],[a[11769],a[11770],a[11793],a[778],a[11794],a[11773],a[11774]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"ERN":a[1227],"ETB":a[9521],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"yMMMMEEEEd":a[11795],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[1693]},[a[11796],a[68],a[65],a[11797],a[1347],a[64],a[11798]],{"decimal":a[509],"group":a[599],"nan":a[11799],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[1338],"GyMMMEd":a[2258],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[609],"MMM":a[41],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[811],"MMMMEd":a[545],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[612],"yMM":a[546],"yMMM":a[50],"yMMMd":a[549],"yMMMEd":a[613],"yMMMM":a[53],"yQQQ":a[1259],"yQQQQ":a[1260]},[a[65],a[62],a[63],a[1900],a[63],a[65],a[65],a[64],a[65],a[66],a[67],a[92]],[a[11800],a[11801],a[11802],a[11803],a[11804],a[94],a[11805],a[11806],a[77],a[11807],a[11808],a[11809]],[a[11810],a[11811],a[11812],a[11813],a[11804],a[11814],a[11815],a[11816],a[11817],a[11818],a[11819],a[11820]],[a[65],a[63],a[92],a[1347],a[92],a[62],a[92]],[a[11821],a[11822],a[11823],a[11824],a[11825],a[11826],a[11827]],[a[11828],a[11829],a[11830],a[11831],a[11832],a[11833],a[11834]],[a[1330],a[11835],a[189],a[190]],[a[11836],a[11837],a[1330],a[11835]],{"decimal":a[508],"group":a[509],"nan":a[11838],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[11839],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[11840],"TOP":a[3710],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[11176],"EHm":a[21],"Ehms":a[11177],"EHms":a[23],"Gy":a[604],"GyMMM":a[1686],"GyMMMd":a[11841],"GyMMMEd":a[11842],"h":a[5632],"H":a[29],"hm":a[5633],"Hm":a[31],"hms":a[5634],"Hms":a[33],"hmsv":a[6724],"Hmsv":a[35],"hmv":a[6725],"Hmv":a[37],"M":a[38],"Md":a[2069],"MEd":a[11843],"MMM":a[41],"MMMd":a[543],"MMMEd":a[11844],"MMMMd":a[9482],"MMMMEd":a[11845],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[1693],"yMEd":a[11846],"yMM":a[1692],"yMMM":a[50],"yMMMd":a[553],"yMMMEd":a[11847],"yMMMM":a[53],"yQQQ":a[6026],"yQQQQ":a[11848]},{"yMMMMEEEEd":a[11795],"yMMMMd":a[616],"yMMMd":a[549],"yMd":a[9709]},[a[66],a[11798],a[63],a[67],a[63],a[481],a[92],a[64],a[1900],a[1900],a[707],a[64]],[a[11849],a[11850],a[71],a[11851],a[73],a[11852],a[11853],a[11854],a[11855],a[11856],a[3182],a[3409]],[a[11857],a[11858],a[11859],a[204],a[11860],a[11861],a[11862],a[11863],a[11864],a[11865],a[11866],a[11867]],[a[1347],a[1347],a[65],a[11797],a[1347],a[3116],a[3116]],[a[11868],a[11869],a[11870],a[11871],a[11872],a[11873],a[4757]],[a[11874],a[11875],a[11876],a[11877],a[11878],a[11879],a[11880]],{"am":a[11881],"pm":a[11882]},[a[11883],a[11884],a[4481],a[11885],a[11886],a[11887],a[11888],a[11889],a[11890],a[11891],a[11892],a[11893],a[11894]],[a[163],a[11895],a[11896],a[166],a[489],a[11897],a[11898],a[4494],a[11899],a[172],a[173],a[11900],a[11901]],[a[11902],a[11903],a[11904],a[11905]],[a[11906],a[11907],a[11908],a[11909]],[a[11910],a[11911],a[199],a[200],a[11912],a[11913],a[203],a[204],a[11914],a[206],a[207],a[208],a[209],a[210]],[a[11915],a[11916],a[11917],a[11918],a[11919],a[11920],a[11921],a[11922],a[11923],a[11924],a[11925],a[11926]],[a[11927]],[a[11928],a[11929],a[11930],a[489],a[490],a[11931],a[492],a[493],a[11932],a[495],a[11933],a[11934]],{"positivePattern":a[11935],"negativePattern":a[11936]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TRY":a[11937],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[708],a[708],a[63],a[1313],a[63],a[708],a[708],a[6515],a[3116],a[707],a[67],a[68]],[a[6516],a[6519],a[71],a[11938],a[73],a[4811],a[4812],a[6520],a[11939],a[11940],a[11941],a[11942]],[a[6525],a[11943],a[3397],a[11944],a[6529],a[6530],a[11945],a[6532],a[11946],a[11947],a[11948],a[11949]],[a[64],a[64],a[64],a[64],a[64],a[64],a[64]],[a[11950],a[11951],a[11952],a[11953],a[11954],a[11955],a[11956]],[a[11957],a[11958],a[11959],a[11960],a[11961],a[11962],a[11963]],{"am":a[11964],"pm":a[11965]},[a[11966],a[11967],a[189],a[190]],[a[11968],a[11969],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[11971],"GyMMMEd":a[11972],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[11973],"MMM":a[41],"MMMd":a[42],"MMMEd":a[11974],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[48],"yMEd":a[11975],"yMMM":a[50],"yMMMd":a[11976],"yMMMEd":a[11977],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[11978],"yMMMMd":a[11979],"yMMMd":a[11976],"yMd":a[58]},[a[11980],a[11981],a[11982],a[11983],a[1223],a[11984],a[11985],a[11986],a[11987],a[11988],a[11989],a[11990]],[a[11980],a[11981],a[11982],a[11983],a[1223],a[11984],a[11985],a[11986],a[11987],a[11988],a[11991],a[11990]],[a[822],a[833],a[830],a[4016],a[4017],a[850],a[1232]],[a[11992],a[11993],a[11994],a[11995],a[11996],a[11997],a[11998]],[a[11999],a[12000],a[12001],a[12002],a[12003],a[12004],a[12005]],[a[12006]],{"am":a[12007],"pm":a[12008]},[a[189],a[12009],a[189],a[190]],[a[12010],a[12009],a[189],a[190]],[a[12011],a[12012],a[12013],a[12014],a[12015],a[12016],a[12017],a[12018],a[12019],a[12020],a[12021],a[12022]],[a[12023]],[a[499],a[12024]],[a[12025],a[12024]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[6402],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[1959],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[1822],"GyMMMd":a[1338],"GyMMMEd":a[1339],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[3655],"Md":a[1689],"MEd":a[1741],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"ms":a[45],"y":a[46],"yM":a[1692],"yMd":a[1693],"yMEd":a[1743],"yMMM":a[1839],"yMMMd":a[549],"yMMMEd":a[550],"yMMMM":a[1840],"yQQQ":a[54],"yQQQQ":a[12027]},{"yMMMMEEEEd":a[12028],"yMMMMd":a[12029],"yMMMd":a[12030],"yMd":a[1697]},[a[6738],a[12031],a[6768],a[9583],a[6741],a[10406],a[12031],a[6738],a[12032],a[6742],a[12031],a[12033]],[a[12034],a[12035],a[12036],a[12037],a[12038],a[12039],a[12040],a[12041],a[12042],a[12043],a[12044],a[12045]],[a[12046],a[12047],a[12048],a[12049],a[12050],a[12051],a[12052],a[12053],a[12054],a[12055],a[12056],a[12057]],[a[6737],a[12058],a[12032],a[6738],a[10406],a[12058],a[6738]],[a[12059],a[12060],a[12061],a[6772],a[12062],a[12063],a[6775]],[a[12064],a[12065],a[12066],a[12067],a[12068],a[12069],a[1890]],{"am":a[12070],"pm":a[12071]},[a[10056],a[12072],a[10058],a[12073],a[12074],a[2496],a[2497],a[10061],a[10062],a[10063],a[12075],a[10065],a[12076]],[a[2261],a[2262],a[2263],a[2264],a[2265],a[2266],a[2267],a[2268],a[2269],a[120],a[121],a[122],a[147]],[a[12077],a[12078],a[12079],a[12080],a[12081],a[12082],a[12083],a[12084],a[12085],a[7548],a[12086],a[12087],a[12088]],[a[12089],a[12090],a[12091],a[12092],a[12093],a[12094],a[12095],a[12096],a[12097],a[12098],a[12099],a[12100],a[12101]],[a[12102],a[2518],a[189],a[190]],[a[12103],a[2520],a[189],a[190]],[a[12104],a[12105],a[12106],a[12107]],[a[12108],a[12109],a[12110],a[12111],a[2527],a[2528],a[2529],a[12112],a[12113],a[2532],a[10082],a[12114],a[2535],a[2536]],[a[12115],a[12116],a[12117],a[12118],a[12119],a[12120],a[12121],a[12122],a[12123],a[12124],a[12125],a[12126]],[a[2042],a[2043],a[12127],a[2045],a[12128],a[12129],a[12130],a[12131],a[12132],a[12133],a[2052],a[12134]],[a[10093],a[2551],a[12135],a[12136],a[12137],a[12138],a[10098],a[10099],a[2558],a[12139],a[12140],a[12141]],[a[12142],a[12143],a[10340],a[12144],a[2802],a[12145],a[2804],a[2805],a[10342],a[10343],a[2808],a[2809]],{"JPY":a[524],"UAH":a[10347],"UAK":a[12146],"XAF":a[531],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[805],"GyMMMEd":a[806],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[608],"MEd":a[808],"MMM":a[41],"MMMd":a[543],"MMMEd":a[810],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[9437],"yMMM":a[50],"yMMMd":a[817],"yMMMEd":a[818],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},{"yMMMMEEEEd":a[819],"yMMMMd":a[820],"yMMMd":a[817],"yMd":a[1345]},[a[4081],a[9694],a[4083],a[4084],a[8109],a[4085],a[9696],a[4087],a[7377],a[4089],a[4090],a[4091]],[a[9697],a[12147],a[9699],a[12148],a[9701],a[9702],a[9703]],{"am":a[12149],"pm":a[12150]},[a[12151],a[12152],a[189],a[190]],[a[918],a[919],a[12153],a[12154],a[4050],a[4051],a[924],a[925],a[926],a[927],a[12155],a[12156]],{"decimal":a[508],"group":a[509],"nan":a[510],"plusSign":a[4069],"minusSign":a[7396],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"PKR":a[3677],"THB":a[601],"TWD":a[528],"USD":a[529],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[1960],"EHm":a[1961],"Ehms":a[1962],"EHms":a[3078],"Gy":a[604],"GyMMM":a[4681],"GyMMMd":a[12157],"GyMMMEd":a[12158],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[12159],"Hmsv":a[12160],"hmv":a[12161],"Hmv":a[12162],"M":a[3655],"Md":a[2069],"MEd":a[3653],"MMM":a[41],"MMMd":a[2322],"MMMEd":a[12163],"MMMMd":a[12164],"ms":a[45],"y":a[46],"yM":a[2071],"yMd":a[738],"yMEd":a[3654],"yMMM":a[1744],"yMMMd":a[12165],"yMMMEd":a[12166],"yMMMM":a[6452],"yQQQ":a[12167],"yQQQQ":a[12168]},{"yMMMMEEEEd":a[680],"yMMMMd":a[12169],"yMMMd":a[12165],"yMd":a[3080]},{"hmmsszzzz":a[3770],"hmsz":a[4001],"hms":a[33],"hm":a[31]},[a[708],a[62],a[63],a[64],a[63],a[1313],a[1313],a[64],a[65],a[66],a[67],a[68]],[a[1698],a[1699],a[1350],a[1700],a[1352],a[1701],a[1702],a[10969],a[1410],a[1704],a[1705],a[1706]],[a[1707],a[1708],a[1709],a[1710],a[1352],a[1711],a[1712],a[10800],a[12170],a[12171],a[1716],a[1717]],[a[708],a[68],a[65],a[3116],a[1347],a[61],a[65]],[a[12172],a[2280],a[3391],a[3081],a[12173],a[4831],a[12174]],[a[12175],a[12176],a[12177],a[12178],a[12179],a[2107],a[12180]],{"am":a[12181],"pm":a[3523]},[a[12182],a[12183],a[12184],a[190]],[a[12185],a[12183],a[12186],a[190]],[a[236],a[237],a[12187],a[12188],a[12189],a[12190],a[242],a[12191],a[12192],a[12193],a[12194],a[12195]],{"decimal":a[509],"group":a[599],"nan":a[12196],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"UZS":a[12197],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[1081],a[12198],a[12199],a[12200],a[4078],a[4085],a[4079],a[12201],a[12202],a[12203],a[12204],a[4080]],[a[12205],a[12206],a[12207],a[12208],a[12209],a[12210],a[12211]],{"yMMMMEEEEd":a[680],"yMMMMd":a[681],"yMMMd":a[679],"yMd":a[3080]},[a[12212],a[12213],a[12214],a[12215],a[12216],a[12217],a[12218],a[12219],a[12220],a[12221],a[12222],a[12223]],[a[12224],a[12225],a[12226],a[12227],a[12216],a[12217],a[12218],a[12228],a[12229],a[12230],a[12231],a[12232]],[a[7537],a[6767],a[6738],a[10406],a[12058],a[6742],a[6740]],[a[12233],a[12234],a[12235],a[12236],a[12237],a[12238],a[12239]],[a[12240],a[12241],a[12242],a[12243],a[12244],a[7557],a[12245]],[a[12246],a[12247],a[189],a[190]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"UZS":a[12248],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},[a[12249],a[12250],a[12251],a[12252],a[12253],a[116],a[117],a[12254],a[12255],a[12256],a[12257],a[12258]],[a[12259],a[12260],a[12261],a[12262],a[12263],a[12264],a[12265]],[a[12266],a[12267],a[12268],a[12269],a[12270],a[116],a[117],a[12271],a[12272],a[12273],a[12274],a[12275]],[a[12276],a[12277],a[12278],a[12279],a[12280],a[12281],a[12282]],{"d":a[17],"E":a[18],"Ed":a[12284],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[24],"GyMMM":a[25],"GyMMMd":a[12285],"GyMMMEd":a[2114],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[1231],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[12286],"MEd":a[12287],"MMdd":a[541],"MMM":a[41],"MMMd":a[543],"MMMEd":a[1340],"MMMMd":a[811],"MMMMEd":a[1834],"mmss":a[45],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[611],"yMEd":a[12288],"yMM":a[12289],"yMMM":a[50],"yMMMd":a[617],"yMMMEd":a[2116],"yMMMM":a[12290],"yQQQ":a[54],"yQQQQ":a[12291]},{"yMMMMEEEEd":a[12292],"yMMMMd":a[12293],"yMMMd":a[617],"yMd":a[738]},[a[12294],a[12295],a[12296],a[12297],a[12298],a[12299],a[12300],a[12301],a[12302],a[12303],a[12304],a[12305]],[a[12306],a[12307],a[12308],a[12309],a[12310],a[12311],a[12312],a[12313],a[12314],a[12315],a[12316],a[12317]],[a[12318],a[12319],a[12320],a[12321],a[12322],a[12323],a[12324]],[a[12318],a[12325],a[12326],a[12327],a[12328],a[12329],a[12330]],[a[12331],a[12332],a[12333],a[12334],a[12335],a[12336],a[12337]],{"am":a[12338],"pm":a[12339]},[a[12340],a[12341],a[189],a[190]],[a[12342],a[598]],{"d":a[17],"E":a[18],"Ed":a[3012],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[41],"Md":a[3132],"MEd":a[3224],"MMM":a[41],"MMMd":a[3132],"MMMEd":a[3224],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[547],"yMEd":a[1256],"yMMM":a[50],"yMMMd":a[3134],"yMMMEd":a[3225],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[3226],"yMMMMd":a[3025],"yMMMd":a[3134],"yMd":a[547]},[a[61],a[481],a[63],a[64],a[63],a[188],a[481],a[12343],a[481],a[93],a[93],a[3116]],[a[5869],a[12344],a[4662],a[4225],a[558],a[12345],a[12346],a[12347],a[12348],a[12349],a[12350],a[12351]],[a[12352],a[12353],a[12354],a[12355],a[12356],a[12357],a[12358],a[12359],a[12360],a[12361],a[12362],a[12363]],[a[65],a[63],a[2072],a[63],a[62],a[62],a[65]],[a[94],a[12364],a[12365],a[12366],a[12367],a[99],a[6541]],[a[12368],a[12369],a[12370],a[12371],a[12372],a[12373],a[12374]],[a[3245],a[12375],a[189],a[190]],{"decimal":a[509],"group":a[4680],"nan":a[510],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},[a[65],a[188],a[188],a[65],a[707],a[707],a[63]],[a[12376],a[12377],a[12378],a[12379],a[12380],a[12381],a[12382]],[a[12383],a[7656],a[12384],a[12385],a[12386],a[12387],a[12388]],{"am":a[12389],"pm":a[12390]},[a[12391],a[12392],a[189],a[190]],[a[12393],a[12394],a[189],a[190]],[a[12395],a[12396],a[12397],a[12398],a[12399],a[12400],a[12401],a[12402],a[12403],a[12404],a[12405],a[12406]],[a[12407],a[12408],a[12409],a[12410],a[12411],a[12412],a[12413],a[12414],a[12415],a[12416],a[12417],a[12418]],[a[623],a[1767],a[1767],a[3342],a[621],a[625],a[623]],[a[12419],a[12420],a[12421],a[12422],a[12423],a[12424],a[12425]],[a[12426],a[12427],a[12428],a[12429],a[12430],a[12431],a[12432]],{"am":a[12433],"pm":a[12434]},[a[7451],a[12435],a[189],a[190]],[a[12436],a[12437],a[189],a[190]],{"d":a[17],"E":a[18],"Ed":a[12438],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[12439],"GyMMMEd":a[12440],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[1252],"MEd":a[542],"MMM":a[41],"MMMd":a[42],"MMMEd":a[1254],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[1255],"yMd":a[4456],"yMEd":a[1341],"yMM":a[2071],"yMMM":a[50],"yMMMd":a[12441],"yMMMEd":a[12442],"yMMMM":a[614],"yQQQ":a[1259],"yQQQQ":a[1260]},{"yMMMMEEEEd":a[12443],"yMMMMd":a[12444],"yMMMd":a[12441],"yMd":a[3080]},[a[12445],a[12446],a[12447],a[12448],a[12449],a[4896],a[4897],a[12450],a[12451],a[12452],a[12453],a[12454]],[a[12455],a[12456],a[12457],a[12458],a[12459],a[12460],a[4924]],{"am":a[12461],"pm":a[12462]},[a[12463],a[12464],a[12465],a[12466],a[12467],a[12468],a[12469],a[12470],a[12471],a[12472],a[12473],a[4948],a[12474],a[12475]],[a[4951],a[12476],a[4953],a[4954],a[4955],a[4956],a[4957],a[4958],a[4959],a[4960],a[4961],a[4948],a[4962],a[4963]],[a[12477],a[12478],a[12479],a[12480],a[12481],a[12482],a[12483],a[12484],a[12485],a[12486],a[12487],a[12488]],[a[12489],a[12490],a[12491],a[12492],a[12493],a[12494],a[12495],a[12496],a[12497],a[12498],a[12499],a[12500]],[a[12501],a[12502],a[12503],a[12504],a[12505],a[12506],a[12507]],[a[12508],a[12509],a[12510],a[12504],a[12505],a[12511],a[12512]],{"am":a[12513],"pm":a[12514]},[a[670],a[10597],a[189],a[190]],[a[12515],a[12516],a[189],a[190]],[a[12517],a[12478],a[12518],a[12480],a[12519],a[12482],a[12520],a[12484],a[12485],a[12521],a[12487],a[12522]],[a[12523],a[12524],a[12525],a[12526],a[12527],a[12528],a[12529],a[12530],a[12531],a[12532],a[12533],a[12534]],[a[12501],a[12502],a[12535],a[12536],a[12537],a[12538],a[12539]],[a[12540],a[12541],a[12542],a[12536],a[12537],a[12543],a[12544]],{"am":a[12545],"pm":a[12546]},{"d":a[17],"E":a[18],"Ed":a[676],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[63],"Md":a[608],"MEd":a[1253],"MMM":a[2070],"MMMd":a[543],"MMMEd":a[544],"MMMMd":a[44],"ms":a[610],"y":a[46],"yM":a[47],"yMd":a[547],"yMEd":a[612],"yMMM":a[50],"yMMMd":a[679],"yMMMEd":a[613],"yMMMM":a[614],"yQQQ":a[54],"yQQQQ":a[55]},[a[10642],a[10643],a[10644],a[10645],a[10646],a[12547],a[10648]],{"d":a[5994],"E":a[18],"Ed":a[12548],"Ehm":a[12549],"EHm":a[12550],"Ehms":a[12551],"EHms":a[12552],"Gy":a[6001],"GyMMM":a[6002],"GyMMMd":a[6003],"GyMMMEd":a[12553],"h":a[12554],"H":a[12555],"hm":a[12556],"Hm":a[31],"hms":a[12557],"Hms":a[33],"hmsv":a[12558],"Hmsv":a[12559],"hmv":a[12560],"Hmv":a[12561],"M":a[6012],"Md":a[39],"MEd":a[12562],"MMdd":a[3713],"MMM":a[41],"MMMd":a[6015],"MMMEd":a[12563],"MMMMd":a[6015],"ms":a[45],"y":a[6018],"yM":a[6022],"yMd":a[678],"yMEd":a[12564],"yMM":a[6022],"yMMM":a[6022],"yMMMd":a[6023],"yMMMEd":a[12565],"yMMMM":a[6022],"yQQQ":a[12566],"yQQQQ":a[12566]},{"yMMMMEEEEd":a[6025],"yMMMMd":a[6023],"yMMMd":a[6023],"yMd":a[678]},{"hmmsszzzz":a[12567],"hmsz":a[12568],"hms":a[12557],"hm":a[12556]},[a[12569],a[6071],a[6072],a[6073],a[6074],a[6075],a[6076],a[6077],a[6078],a[6079],a[6080],a[6081]],[a[6041],a[12570],a[6059],a[6060],a[6061],a[6062],a[6063]],[a[12571],a[12572],a[12573],a[12574],a[12575],a[12576],a[12577]],[a[12578],a[12579],a[12580],a[12581],a[12582],a[12583],a[12584]],[a[12585]],{"am":a[12586],"pm":a[12587]},[a[6058],a[6059],a[6060],a[6061],a[6062],a[6063],a[6064],a[6065],a[6066],a[6067],a[12588],a[12589]],[a[6070],a[6071],a[6072],a[6073],a[6074],a[6075],a[6076],a[6077],a[6078],a[6079],a[12590],a[12591]],[a[6029],a[6030],a[6031],a[6032],a[6033],a[6034],a[6035],a[6036],a[6037],a[6038],a[6039],a[6040],a[12592]],[a[12569],a[6071],a[6072],a[6073],a[6074],a[6075],a[6076],a[6077],a[6078],a[6079],a[6080],a[6081],a[12593]],[a[12594],a[12595],a[12596],a[12597]],[a[6029],a[6030],a[6031],a[6032],a[6033],a[6034],a[6035],a[6036],a[6037],a[6038],a[6039],a[6040],a[12592],a[12598]],[a[12569],a[6071],a[6072],a[6073],a[6074],a[6075],a[6076],a[6077],a[6078],a[6079],a[6080],a[6081],a[12593],a[12599]],[a[12600]],[a[12601]],[a[12602]],[a[12603],a[12604],a[12605],a[12606],a[12607],a[12608],a[12609],a[12610],a[12611],a[12612],a[12613],a[12614],a[12615],a[12616],a[12617],a[12618],a[12619],a[12620],a[12621],a[12622],a[12623],a[12624],a[12625],a[12626],a[12627],a[12628],a[12629],a[12630],a[12631],a[12632],a[12633],a[12634],a[12635],a[12636],a[12637],a[12638],a[12639],a[12640],a[12641],a[12642],a[12643],a[12644],a[12645],a[12646],a[12647],a[12648],a[12649],a[12650],a[12651],a[12652],a[12653],a[12654],a[12655],a[12656],a[12657],a[12658],a[12659],a[12660],a[12661],a[12662],a[12663],a[12664],a[12665],a[12666],a[12667],a[12668],a[12669],a[12670],a[12671],a[12672],a[12673],a[12674],a[12675],a[12676],a[12677],a[12678],a[12679],a[12680],a[12681],a[12682],a[12683],a[12684],a[12685],a[12686],a[12687],a[12688],a[12689],a[12690],a[12691],a[12692],a[12693],a[12694],a[12695],a[12696],a[12697],a[12698],a[12699],a[12700],a[12701],a[12702],a[12703],a[12704],a[12705],a[12706],a[12707],a[12708],a[12709],a[12710],a[12711],a[12712],a[12713],a[12714],a[12715],a[12716],a[12717],a[12718],a[12719],a[12720],a[12721],a[12722],a[12723],a[12724],a[12725],a[12726],a[12727],a[12728],a[12729],a[12730],a[12731],a[12732],a[12733],a[12734],a[12735],a[12736],a[12737],a[12738],a[12739],a[12740],a[12741],a[12742],a[12743],a[12744],a[12745],a[12746],a[12747],a[12748],a[12749],a[12750],a[12751],a[12752],a[12753],a[12754],a[12755],a[12756],a[12757],a[12758],a[12759],a[12760],a[12761],a[12762],a[12763],a[12764],a[12765],a[12766],a[12767],a[12768],a[12769],a[12770],a[12771],a[12772],a[12773],a[12774],a[12775],a[12776],a[12777],a[12778],a[12779],a[12780],a[12781],a[12782],a[12783],a[12784],a[12785],a[12786],a[12787],a[12788],a[12789],a[12790],a[12791],a[12792],a[12793],a[12794],a[12795],a[12796],a[12797],a[12798],a[12799],a[12800],a[12801],a[12802],a[12803],a[12804],a[12805],a[12806],a[12807],a[12808],a[12809],a[12810],a[12811],a[12812],a[12813],a[12814],a[12815],a[12816],a[12817],a[12818],a[12819],a[12820],a[12821],a[12822],a[12823],a[12824],a[12825],a[12826],a[12827],a[12828],a[12829],a[12830],a[12831],a[12832],a[12833],a[12834],a[6383],a[6384],a[6385],a[6386]],[a[12835]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[6402],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILR":a[12836],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[12837],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[5994],"E":a[18],"Ed":a[12548],"Ehm":a[12549],"EHm":a[12550],"Ehms":a[12551],"EHms":a[12552],"Gy":a[6001],"GyMMM":a[6002],"GyMMMd":a[6003],"GyMMMEd":a[12553],"h":a[12554],"H":a[12555],"HHmm":a[31],"hm":a[12556],"Hm":a[31],"hms":a[12557],"Hms":a[33],"hmsv":a[12558],"Hmsv":a[12559],"hmv":a[12560],"Hmv":a[12561],"M":a[6012],"Md":a[608],"MEd":a[542],"MMdd":a[2069],"MMM":a[41],"MMMd":a[6015],"MMMEd":a[12563],"MMMMd":a[6015],"MMMMdd":a[6015],"ms":a[45],"y":a[6018],"yM":a[47],"yMd":a[611],"yMEd":a[12838],"yMM":a[2071],"yMMM":a[6022],"yMMMd":a[6023],"yMMMEd":a[12565],"yMMMM":a[6022],"yQQQ":a[12566],"yQQQQ":a[12566]},{"yMMMMEEEEd":a[6025],"yMMMMd":a[6023],"yMMMd":a[6023],"yMd":a[1345]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILR":a[12836],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[12837],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[5994],"E":a[18],"Ed":a[12548],"Ehm":a[12549],"EHm":a[12550],"Ehms":a[12551],"EHms":a[12552],"Gy":a[6001],"GyMMM":a[6002],"GyMMMd":a[6003],"GyMMMEd":a[12553],"h":a[12554],"H":a[12555],"hm":a[12556],"Hm":a[31],"hms":a[12557],"Hms":a[33],"hmsv":a[12558],"Hmsv":a[12559],"hmv":a[12560],"Hmv":a[12561],"M":a[6012],"Md":a[608],"MEd":a[542],"MMdd":a[2069],"MMM":a[41],"MMMd":a[6015],"MMMEd":a[12563],"MMMMd":a[6015],"MMMMdd":a[6015],"ms":a[45],"y":a[6018],"yM":a[6022],"yMd":a[6023],"yMEd":a[12839],"yMM":a[6022],"yMMM":a[6022],"yMMMd":a[6023],"yMMMEd":a[12565],"yMMMM":a[6022],"yQQQ":a[12566],"yQQQQ":a[12566]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILR":a[12836],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[12837],"MOP":a[3698],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[5994],"E":a[18],"Ed":a[12548],"Ehm":a[12549],"EHm":a[12550],"Ehms":a[12551],"EHms":a[12552],"Gy":a[6001],"GyMMM":a[6002],"GyMMMd":a[6003],"GyMMMEd":a[12553],"h":a[12554],"H":a[12555],"hm":a[12556],"Hm":a[31],"hms":a[12557],"Hms":a[33],"hmsv":a[12558],"Hmsv":a[12559],"hmv":a[12560],"Hmv":a[12561],"M":a[6012],"Md":a[3427],"MEd":a[12840],"MMdd":a[1252],"MMM":a[6012],"MMMd":a[6015],"MMMEd":a[12563],"MMMMd":a[6015],"MMMMdd":a[6015],"ms":a[45],"y":a[6018],"yM":a[6022],"yMd":a[6023],"yMEd":a[12839],"yMM":a[6022],"yMMM":a[6022],"yMMMd":a[6023],"yMMMEd":a[12565],"yMMMM":a[6022],"yQQQ":a[12566],"yQQQQ":a[12566]},{"yMMMMEEEEd":a[6025],"yMMMMd":a[6023],"yMMMd":a[6023],"yMd":a[3080]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILR":a[12836],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[12837],"MXN":a[526],"NZD":a[527],"SGD":a[529],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[5994],"E":a[18],"Ed":a[19],"Ehm":a[12549],"EHm":a[21],"Ehms":a[12551],"EHms":a[23],"Gy":a[6001],"GyMMM":a[6002],"GyMMMd":a[6003],"GyMMMEd":a[12841],"h":a[12842],"H":a[6007],"hm":a[12556],"Hm":a[31],"hms":a[12557],"Hms":a[33],"hmsv":a[12843],"Hmsv":a[12844],"hmv":a[12845],"Hmv":a[12846],"M":a[6012],"Md":a[39],"MEd":a[12847],"MMdd":a[3713],"MMM":a[41],"MMMd":a[6015],"MMMEd":a[12848],"MMMMd":a[6015],"ms":a[45],"y":a[6018],"yM":a[3895],"yMd":a[678],"yMEd":a[12849],"yMM":a[6021],"yMMM":a[6022],"yMMMd":a[6023],"yMMMEd":a[12850],"yMMMM":a[6022],"yQQQ":a[12851],"yQQQQ":a[12852]},{"yMMMMEEEEd":a[12853],"yMMMMd":a[6023],"yMMMd":a[6023],"yMd":a[678]},{"hmmsszzzz":a[12854],"hmsz":a[12855],"hms":a[12557],"hm":a[12556]},[a[12856],a[12857],a[12858],a[12859],a[12860],a[12861],a[12862]],[a[12863]],[a[6058],a[6059],a[6060],a[6061],a[6062],a[6063],a[6064],a[6065],a[6066],a[6067],a[12588],a[12864]],[a[6070],a[6071],a[6072],a[6073],a[6074],a[6075],a[6076],a[6077],a[6078],a[6079],a[12590],a[12865]],[a[12596],a[12597],a[12594],a[12595]],[a[12866],a[12867],a[12868],a[12869],a[12870],a[12871],a[12872],a[12873],a[12874],a[12875],a[12876],a[12877],a[12878],a[12879]],[a[12880]],[a[12881],a[12882],a[12883],a[12884],a[12885],a[12886],a[12887],a[12888],a[12889],a[12890],a[12891],a[12892]],[a[12893]],[a[12894],a[12895],a[12896],a[12897],a[12898],a[12899],a[12900],a[12901],a[12902],a[12903],a[12904],a[12905]],[a[12906]],[a[6151],a[6152],a[12907],a[6154],a[12908],a[6156],a[6157],a[12909],a[6159],a[12910],a[6161],a[12911],a[12912],a[12913],a[6165],a[6166],a[12914],a[12915],a[12916],a[6170],a[6171],a[6172],a[6173],a[6174],a[12917],a[12918],a[6177],a[12919],a[6179],a[6180],a[12920],a[6182],a[6183],a[6184],a[6185],a[6186],a[12921],a[12922],a[12923],a[6190],a[6191],a[12924],a[6193],a[6194],a[6195],a[12925],a[12926],a[6198],a[6199],a[12927],a[12928],a[6202],a[12929],a[6204],a[12930],a[6206],a[12931],a[6208],a[12932],a[6210],a[12933],a[6212],a[6213],a[6214],a[12934],a[6216],a[6217],a[12935],a[6219],a[12936],a[12937],a[6222],a[6223],a[12938],a[6225],a[6226],a[6227],a[6228],a[6229],a[6230],a[6231],a[6232],a[6233],a[6234],a[6235],a[6236],a[6237],a[6238],a[6239],a[6240],a[6241],a[6242],a[12939],a[6244],a[6245],a[12940],a[12941],a[12942],a[12943],a[6250],a[12944],a[6252],a[6253],a[6254],a[6255],a[12945],a[12946],a[6258],a[6259],a[6260],a[6261],a[6262],a[6263],a[6264],a[12947],a[6266],a[6267],a[12948],a[6269],a[12949],a[6271],a[12950],a[6273],a[6274],a[12951],a[6276],a[12952],a[12953],a[6279],a[12954],a[12955],a[6282],a[6283],a[6284],a[6285],a[12956],a[6287],a[6288],a[6289],a[6290],a[12957],a[6292],a[6293],a[6294],a[6295],a[12958],a[6297],a[12959],a[6299],a[6300],a[12960],a[6302],a[6303],a[12961],a[12962],a[6306],a[6307],a[6308],a[12963],a[6310],a[12964],a[6312],a[6313],a[12965],a[6315],a[6316],a[12966],a[6318],a[12967],a[12968],a[12969],a[6322],a[6323],a[6324],a[6325],a[12970],a[12971],a[6328],a[12972],a[12973],a[6331],a[12974],a[6333],a[6334],a[12975],a[12976],a[12977],a[6338],a[6339],a[12978],a[6341],a[6342],a[12979],a[12980],a[6345],a[12981],a[6347],a[6348],a[12982],a[6350],a[6351],a[12983],a[12984],a[12985],a[12986],a[12987],a[6357],a[6358],a[12988],a[12989],a[12990],a[6362],a[6363],a[12991],a[6365],a[12992],a[12993],a[6368],a[6369],a[6370],a[12994],a[6372],a[6373],a[6374],a[6375],a[6376],a[6377],a[6378],a[12995],a[6380],a[6381],a[12996],a[6383],a[6384],a[6385],a[6386]],[a[12997]],[a[12998],a[12999]],{"decimal":a[508],"group":a[509],"nan":a[13000],"plusSign":a[511],"minusSign":a[512],"percentSign":a[513],"infinity":a[514]},{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[12837],"MXN":a[526],"NZD":a[527],"TWD":a[529],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[5994],"E":a[13001],"Ed":a[12548],"Ehm":a[12549],"EHm":a[21],"Ehms":a[12551],"EHms":a[23],"Gy":a[6001],"GyMMM":a[6002],"GyMMMd":a[6003],"GyMMMEd":a[12553],"h":a[12842],"H":a[6007],"hm":a[12556],"Hm":a[31],"hms":a[12557],"Hms":a[33],"hmsv":a[12843],"Hmsv":a[12844],"hmv":a[12845],"Hmv":a[12846],"M":a[6012],"Md":a[608],"MEd":a[542],"MMdd":a[2069],"MMM":a[41],"MMMd":a[6015],"MMMEd":a[12563],"MMMMd":a[6015],"ms":a[45],"y":a[6018],"yM":a[47],"yMd":a[611],"yMEd":a[12564],"yMM":a[2071],"yMMM":a[6022],"yMMMd":a[6023],"yMMMEd":a[12565],"yMMMM":a[6022],"yQQQ":a[12851],"yQQQQ":a[12852]},{"yMMMMEEEEd":a[6025],"yMMMMd":a[6023],"yMMMd":a[6023],"yMd":a[611]},[a[12594],a[12595],a[12594],a[12595]],{"AUD":a[802],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[524],"KRW":a[525],"MOP":a[3698],"MXN":a[526],"NZD":a[527],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534]},{"d":a[17],"E":a[18],"Ed":a[19],"Ehm":a[20],"EHm":a[21],"Ehms":a[22],"EHms":a[23],"Gy":a[604],"GyMMM":a[605],"GyMMMd":a[606],"GyMMMEd":a[607],"h":a[28],"H":a[29],"hm":a[30],"Hm":a[31],"hms":a[32],"Hms":a[33],"hmsv":a[34],"Hmsv":a[35],"hmv":a[36],"Hmv":a[37],"M":a[38],"Md":a[39],"MEd":a[40],"MMM":a[41],"MMMd":a[42],"MMMEd":a[43],"MMMMd":a[44],"ms":a[45],"y":a[46],"yM":a[47],"yMd":a[48],"yMEd":a[49],"yMMM":a[50],"yMMMd":a[51],"yMMMEd":a[52],"yMMMM":a[53],"yQQQ":a[54],"yQQQQ":a[55]},[a[61],a[62],a[63],a[1900],a[63],a[61],a[61],a[64],a[65],a[66],a[67],a[68]],[a[69],a[70],a[13002],a[13003],a[8629],a[74],a[75],a[13004],a[77],a[1301],a[79],a[1903]],[a[13005],a[13006],a[13007],a[13008],a[13009],a[1306],a[13010],a[8586],a[13011],a[13012],a[1311],a[1906]],[a[65],a[63],a[188],a[92],a[65],a[481],a[63]],[a[9122],a[13013],a[13014],a[6561],a[9257],a[13015],a[9259]],[a[13016],a[13017],a[13018],a[13019],a[13020],a[13021],a[13022]],{"AUD":a[515],"BRL":a[516],"CAD":a[517],"CNY":a[518],"EUR":a[519],"GBP":a[520],"HKD":a[521],"ILS":a[522],"INR":a[523],"JPY":a[600],"KRW":a[525],"MXN":a[526],"NZD":a[527],"THB":a[601],"TWD":a[528],"USD":a[602],"VND":a[530],"XAF":a[531],"XCD":a[532],"XOF":a[533],"XPF":a[534],"ZAR":a[603]}];b[1]=[{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][1],"dateFormats":b[0][2],"timeFormats":b[0][3]},{"narrow":b[0][4],"short":b[0][5],"long":b[0][6]},{"narrow":b[0][7],"short":b[0][8],"long":b[0][9]},{"narrow":b[0][10],"short":b[0][10],"long":b[0][10]},{"narrow":b[0][12],"short":b[0][13],"long":b[0][14]},{"narrow":b[0][15],"short":b[0][16],"long":b[0][16]},{"narrow":b[0][17],"short":b[0][17],"long":b[0][17]},{"narrow":b[0][15],"short":b[0][18],"long":b[0][18]},{"narrow":b[0][19],"short":b[0][19],"long":b[0][19]},{"narrow":b[0][12],"short":b[0][20],"long":b[0][20]},{"narrow":b[0][21],"short":b[0][22],"long":b[0][23]},{"narrow":b[0][24],"short":b[0][25],"long":b[0][25]},{"narrow":b[0][26],"short":b[0][26],"long":b[0][26]},{"narrow":b[0][12],"short":b[0][27],"long":b[0][27]},{"narrow":b[0][28],"short":b[0][28],"long":b[0][28]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][30]},{"narrow":b[0][31],"short":b[0][31],"long":b[0][31]},{"narrow":b[0][32],"short":b[0][33],"long":b[0][33]},{"narrow":b[0][12],"short":b[0][34],"long":b[0][34]},{"narrow":b[0][35],"short":b[0][35],"long":b[0][35]},{"narrow":b[0][36],"short":b[0][36],"long":b[0][36]},{"decimal":b[0][38],"currency":b[0][39],"percent":b[0][40]},{"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][43],"dateFormats":b[0][44],"timeFormats":b[0][3]},{"narrow":b[0][4],"short":b[0][45],"long":b[0][46]},{"narrow":b[0][47],"short":b[0][48],"long":b[0][49]},{"narrow":b[0][51],"short":b[0][51],"long":b[0][52]},{"narrow":b[0][53],"short":b[0][53],"long":b[0][53]},{"latn":b[0][54]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][57],"dateFormats":b[0][58],"timeFormats":b[0][59]},{"narrow":b[0][60],"short":b[0][61],"long":b[0][62]},{"narrow":b[0][63],"short":b[0][64],"long":b[0][65]},{"narrow":b[0][67],"short":b[0][67],"long":b[0][68]},{"decimal":b[0][38],"currency":b[0][69],"percent":b[0][40]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][71],"dateFormats":b[0][72],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][73],"long":b[0][74]},{"narrow":b[0][75],"short":b[0][76],"long":b[0][77]},{"narrow":b[0][79],"short":b[0][79],"long":b[0][80]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][82],"dateFormats":b[0][83],"timeFormats":b[0][3]},{"narrow":b[0][84],"short":b[0][85],"long":b[0][86]},{"narrow":b[0][87],"short":b[0][88],"long":b[0][89]},{"narrow":b[0][15],"short":b[0][91],"long":b[0][91]},{"narrow":b[0][92],"short":b[0][92],"long":b[0][93]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][95],"dateFormats":b[0][96],"timeFormats":b[0][3]},{"narrow":b[0][97],"short":b[0][98],"long":b[0][98]},{"narrow":b[0][99],"short":b[0][100],"long":b[0][100]},{"narrow":b[0][10],"short":b[0][10],"long":b[0][101]},{"narrow":b[0][103],"short":b[0][104],"long":b[0][104]},{"narrow":b[0][15],"short":b[0][105],"long":b[0][105]},{"narrow":b[0][106],"short":b[0][106],"long":b[0][107]},{"narrow":b[0][24],"short":b[0][108],"long":b[0][108]},{"narrow":b[0][109],"short":b[0][109],"long":b[0][109]},{"narrow":b[0][110],"short":b[0][111],"long":b[0][111]},{"narrow":b[0][112],"short":b[0][112],"long":b[0][112]},{"narrow":b[0][32],"short":b[0][113],"long":b[0][113]},{"narrow":b[0][12],"short":b[0][114],"long":b[0][114]},{"narrow":b[0][115],"short":b[0][115],"long":b[0][115]},{"narrow":b[0][116],"short":b[0][116],"long":b[0][116]},{"decimal":b[0][38],"currency":b[0][118],"percent":b[0][40]},{"arab":b[0][119],"latn":b[0][120]},{"narrow":b[0][122],"short":b[0][122],"long":b[0][123]},{"narrow":b[0][125],"short":b[0][126],"long":b[0][126]},{"arab":b[0][119],"latn":b[0][127]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][95],"dateFormats":b[0][96],"timeFormats":b[0][129]},{"narrow":b[0][130],"short":b[0][131],"long":b[0][132]},{"narrow":b[0][130],"short":b[0][132],"long":b[0][132]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][95],"dateFormats":b[0][96],"timeFormats":b[0][59]},{"narrow":b[0][134],"short":b[0][135],"long":b[0][135]},{"narrow":b[0][136],"short":b[0][137],"long":b[0][137]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][141],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][142],"long":b[0][143]},{"narrow":b[0][7],"short":b[0][144],"long":b[0][145]},{"narrow":b[0][147],"short":b[0][147],"long":b[0][147]},{"decimal":b[0][38],"currency":b[0][118],"percent":b[0][40],"secondaryGroupSize":2},{"beng":b[0][41],"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][149],"dateFormats":b[0][150],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][151],"long":b[0][152]},{"narrow":b[0][153],"short":b[0][154],"long":b[0][155]},{"narrow":b[0][157],"short":b[0][157],"long":b[0][158]},{"decimal":b[0][38],"currency":b[0][159],"percent":b[0][40]},{"short":a[535],"medium":a[15],"full":a[1337],"long":a[1337],"availableFormats":b[0][161],"dateFormats":b[0][162],"timeFormats":b[0][59]},{"narrow":b[0][163],"short":b[0][164],"long":b[0][165]},{"narrow":b[0][166],"short":b[0][167],"long":b[0][168]},{"narrow":b[0][169],"short":b[0][169],"long":b[0][170]},{"narrow":b[0][12],"short":b[0][172],"long":b[0][172]},{"narrow":b[0][15],"short":b[0][173],"long":b[0][174]},{"narrow":b[0][175],"short":b[0][176],"long":b[0][177]},{"narrow":b[0][178],"short":b[0][179],"long":b[0][180]},{"narrow":b[0][181],"short":b[0][182],"long":b[0][183]},{"narrow":b[0][184],"short":b[0][185],"long":b[0][186]},{"latn":b[0][187]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][189],"dateFormats":b[0][190],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][191],"long":b[0][192]},{"narrow":b[0][193],"short":b[0][194],"long":b[0][195]},{"narrow":b[0][196],"short":b[0][196],"long":b[0][197]},{"latn":b[0][198]},{"narrow":b[0][7],"short":b[0][8],"long":b[0][8]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][200],"dateFormats":b[0][201],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][202],"long":b[0][202]},{"narrow":b[0][193],"short":b[0][203],"long":b[0][203]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][205],"dateFormats":b[0][58],"timeFormats":b[0][59]},{"narrow":b[0][206],"short":b[0][207],"long":b[0][208]},{"narrow":b[0][209],"short":b[0][210],"long":b[0][211]},{"narrow":b[0][213],"short":b[0][213],"long":b[0][214]},{"decimal":b[0][38],"currency":b[0][159],"percent":b[0][215]},{"short":a[15],"medium":a[15],"full":a[1817],"long":a[1817],"availableFormats":b[0][216],"dateFormats":b[0][217],"timeFormats":b[0][218]},{"narrow":b[0][219],"short":b[0][220],"long":b[0][221]},{"narrow":b[0][222],"short":b[0][223],"long":b[0][224]},{"narrow":b[0][226],"short":b[0][226],"long":b[0][227]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][149],"dateFormats":b[0][150],"timeFormats":b[0][3]},{"narrow":b[0][229],"short":b[0][230],"long":b[0][231]},{"narrow":b[0][7],"short":b[0][232],"long":b[0][232]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][234]},{"narrow":b[0][236],"short":b[0][237],"long":b[0][238]},{"narrow":b[0][239],"short":b[0][240],"long":b[0][241]},{"narrow":b[0][157],"short":b[0][157],"long":b[0][243]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][244],"dateFormats":b[0][245],"timeFormats":b[0][129]},{"narrow":b[0][246],"short":b[0][247],"long":b[0][248]},{"narrow":b[0][249],"short":b[0][250],"long":b[0][251]},{"narrow":b[0][253],"short":b[0][253],"long":b[0][254]},{"narrow":b[0][24],"short":b[0][255],"long":b[0][255]},{"narrow":b[0][12],"short":b[0][256],"long":b[0][256]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][257]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][259],"dateFormats":b[0][58],"timeFormats":b[0][59]},{"narrow":b[0][260],"short":b[0][261],"long":b[0][262]},{"narrow":b[0][263],"short":b[0][264],"long":b[0][265]},{"narrow":b[0][266],"short":b[0][266],"long":b[0][267]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][268],"dateFormats":b[0][269],"timeFormats":b[0][3]},{"narrow":b[0][270],"short":b[0][271],"long":b[0][271]},{"narrow":b[0][272],"short":b[0][273],"long":b[0][274]},{"narrow":b[0][276],"short":b[0][276],"long":b[0][276]},{"narrow":b[0][277],"short":b[0][278],"long":b[0][278]},{"narrow":b[0][279],"short":b[0][279],"long":b[0][279]},{"narrow":b[0][277],"short":b[0][29],"long":b[0][280]},{"narrow":b[0][281],"short":b[0][281],"long":b[0][281]},{"decimal":b[0][38],"currency":b[0][69],"percent":b[0][40],"secondaryGroupSize":2},{"beng":b[0][282],"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][284],"dateFormats":b[0][285],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][286],"long":b[0][287]},{"narrow":b[0][288],"short":b[0][289],"long":b[0][290]},{"narrow":b[0][292],"short":b[0][292],"long":b[0][292]},{"latn":b[0][41],"tibt":b[0][293]},{"short":a[535],"medium":a[535],"full":a[2257],"long":a[2257],"availableFormats":b[0][295],"dateFormats":b[0][141],"timeFormats":b[0][59]},{"narrow":b[0][296],"short":b[0][297],"long":b[0][298]},{"narrow":b[0][299],"short":b[0][300],"long":b[0][301]},{"narrow":b[0][303],"short":b[0][303],"long":b[0][304]},{"narrow":b[0][305],"short":b[0][305],"long":b[0][306]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][308],"dateFormats":b[0][2],"timeFormats":b[0][3]},{"narrow":b[0][309],"short":b[0][310],"long":b[0][310]},{"narrow":b[0][311],"short":b[0][312],"long":b[0][313]},{"narrow":b[0][315],"short":b[0][315],"long":b[0][315]},{"narrow":b[0][12],"short":b[0][316],"long":b[0][316]},{"deva":b[0][41],"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[2381],"long":a[2381],"availableFormats":b[0][317],"dateFormats":b[0][318],"timeFormats":b[0][59]},{"narrow":b[0][319],"short":b[0][320],"long":b[0][321]},{"narrow":b[0][322],"short":b[0][323],"long":b[0][324]},{"narrow":b[0][326],"short":b[0][326],"long":b[0][327]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][329],"dateFormats":b[0][330],"timeFormats":b[0][59]},{"narrow":b[0][331],"short":b[0][332],"long":b[0][333]},{"narrow":b[0][334],"short":b[0][335],"long":b[0][336]},{"narrow":b[0][337],"short":b[0][337],"long":b[0][337]},{"narrow":b[0][15],"short":b[0][339],"long":b[0][339]},{"narrow":b[0][15],"short":b[0][340],"long":b[0][340]},{"narrow":b[0][341],"short":b[0][342],"long":b[0][343]},{"narrow":b[0][24],"short":b[0][344],"long":b[0][344]},{"narrow":b[0][12],"short":b[0][345],"long":b[0][345]},{"narrow":b[0][346],"short":b[0][346],"long":b[0][346]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][347]},{"narrow":b[0][348],"short":b[0][348],"long":b[0][348]},{"narrow":b[0][32],"short":b[0][349],"long":b[0][349]},{"narrow":b[0][12],"short":b[0][350],"long":b[0][350]},{"narrow":b[0][351],"short":b[0][351],"long":b[0][351]},{"short":a[535],"medium":a[15],"full":a[1337],"long":a[15],"availableFormats":b[0][353],"dateFormats":b[0][162],"timeFormats":b[0][129]},{"narrow":b[0][354],"short":b[0][355],"long":b[0][356]},{"narrow":b[0][357],"short":b[0][358],"long":b[0][359]},{"narrow":b[0][360],"short":b[0][360],"long":b[0][360]},{"narrow":b[0][12],"short":b[0][12],"long":b[0][12]},{"narrow":b[0][362],"short":b[0][362],"long":b[0][363]},{"narrow":b[0][12],"short":b[0][366],"long":b[0][367]},{"narrow":b[0][7],"short":b[0][368],"long":b[0][368]},{"latn":b[0][369]},{"narrow":b[0][4],"short":b[0][371],"long":b[0][372]},{"narrow":b[0][373],"short":b[0][374],"long":b[0][375]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][376]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][378],"dateFormats":b[0][2],"timeFormats":b[0][3]},{"narrow":b[0][379],"short":b[0][380],"long":b[0][381]},{"narrow":b[0][382],"short":b[0][383],"long":b[0][384]},{"narrow":b[0][386],"short":b[0][386],"long":b[0][387]},{"arab":b[0][389],"latn":b[0][390]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][391],"dateFormats":b[0][392],"timeFormats":b[0][129]},{"narrow":b[0][12],"short":b[0][393],"long":b[0][394]},{"narrow":b[0][395],"short":b[0][396],"long":b[0][397]},{"narrow":b[0][399],"short":b[0][400],"long":b[0][400]},{"narrow":b[0][401],"short":b[0][401],"long":b[0][401]},{"short":a[535],"medium":a[535],"full":a[3077],"long":a[3077],"availableFormats":b[0][403],"dateFormats":b[0][404],"timeFormats":b[0][59]},{"narrow":b[0][405],"short":b[0][406],"long":b[0][407]},{"narrow":b[0][408],"short":b[0][409],"long":b[0][410]},{"narrow":b[0][411],"short":b[0][412],"long":b[0][413]},{"short":a[535],"medium":a[535],"full":a[3122],"long":a[3122],"availableFormats":b[0][415],"dateFormats":b[0][416],"timeFormats":b[0][218]},{"narrow":b[0][4],"short":b[0][417],"long":b[0][418]},{"narrow":b[0][419],"short":b[0][420],"long":b[0][421]},{"narrow":b[0][422],"short":b[0][423],"long":b[0][424]},{"short":a[535],"medium":a[535],"full":a[3122],"long":a[3122],"availableFormats":b[0][415],"dateFormats":b[0][416],"timeFormats":b[0][426]},{"narrow":b[0][427],"short":b[0][428],"long":b[0][429]},{"narrow":b[0][430],"short":b[0][431],"long":b[0][432]},{"narrow":b[0][434],"short":b[0][434],"long":b[0][435]},{"short":a[15],"medium":a[15],"full":a[3218],"long":a[3218],"availableFormats":b[0][437],"dateFormats":b[0][438],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][439],"long":b[0][440]},{"narrow":b[0][441],"short":b[0][442],"long":b[0][443]},{"narrow":b[0][445],"short":b[0][445],"long":b[0][446]},{"narrow":b[0][4],"short":b[0][448],"long":b[0][449]},{"decimal":b[0][38],"currency":b[0][118],"percent":b[0][215]},{"decimal":b[0][38],"currency":b[0][450],"percent":b[0][40]},{"latn":b[0][451]},{"narrow":b[0][454],"short":b[0][455],"long":b[0][456]},{"narrow":b[0][457],"short":b[0][458],"long":b[0][459]},{"narrow":b[0][461],"short":b[0][461],"long":b[0][462]},{"latn":b[0][463]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][464],"dateFormats":b[0][465],"timeFormats":b[0][129]},{"narrow":b[0][319],"short":b[0][466],"long":b[0][467]},{"narrow":b[0][468],"short":b[0][469],"long":b[0][470]},{"narrow":b[0][472],"short":b[0][472],"long":b[0][473]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][205],"dateFormats":b[0][475],"timeFormats":b[0][59]},{"narrow":b[0][476],"short":b[0][477],"long":b[0][478]},{"narrow":b[0][479],"short":b[0][480],"long":b[0][481]},{"narrow":b[0][483],"short":b[0][483],"long":b[0][484]},{"narrow":b[0][485],"short":b[0][486],"long":b[0][487]},{"narrow":b[0][488],"short":b[0][489],"long":b[0][490]},{"narrow":b[0][491],"short":b[0][491],"long":b[0][492]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][493],"dateFormats":b[0][494],"timeFormats":b[0][495]},{"narrow":b[0][496],"short":b[0][497],"long":b[0][498]},{"narrow":b[0][499],"short":b[0][500],"long":b[0][501]},{"decimal":b[0][38],"currency":b[0][39],"percent":b[0][215],"secondaryGroupSize":2},{"latn":b[0][41],"tibt":b[0][504]},{"narrow":b[0][506],"short":b[0][507],"long":b[0][508]},{"narrow":b[0][509],"short":b[0][510],"long":b[0][511]},{"narrow":b[0][513],"short":b[0][513],"long":b[0][514]},{"short":a[3526],"medium":a[3526],"full":a[3526],"long":a[3526],"availableFormats":b[0][515],"dateFormats":b[0][516],"timeFormats":b[0][517]},{"narrow":b[0][518],"short":b[0][519],"long":b[0][520]},{"narrow":b[0][521],"short":b[0][522],"long":b[0][523]},{"narrow":b[0][525],"short":b[0][525],"long":b[0][526]},{"latn":b[0][527]},{"short":a[3526],"medium":a[3526],"full":a[3526],"long":a[3526],"availableFormats":b[0][515],"dateFormats":b[0][516],"timeFormats":b[0][59]},{"short":a[15],"medium":a[15],"full":a[3591],"long":a[3591],"availableFormats":b[0][529],"dateFormats":b[0][530],"timeFormats":b[0][3]},{"narrow":b[0][531],"short":b[0][532],"long":b[0][533]},{"narrow":b[0][534],"short":b[0][535],"long":b[0][536]},{"narrow":b[0][538],"short":b[0][538],"long":b[0][539]},{"narrow":b[0][540],"short":b[0][540],"long":b[0][540]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][542],"dateFormats":b[0][150],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][542],"dateFormats":b[0][150],"timeFormats":b[0][59]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][544],"dateFormats":b[0][545],"timeFormats":b[0][3]},{"narrow":b[0][546],"short":b[0][546],"long":b[0][6]},{"narrow":b[0][547],"short":b[0][548],"long":b[0][9]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][552],"dateFormats":b[0][553],"timeFormats":b[0][59]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][557],"dateFormats":b[0][558],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][560],"dateFormats":b[0][561],"timeFormats":b[0][59]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][563],"dateFormats":b[0][564],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][568],"dateFormats":b[0][150],"timeFormats":b[0][218]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][571],"dateFormats":b[0][150],"timeFormats":b[0][572]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][578],"dateFormats":b[0][579],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][580],"dateFormats":b[0][581],"timeFormats":b[0][59]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][583],"dateFormats":b[0][150],"timeFormats":b[0][129]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][584],"dateFormats":b[0][585],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][592],"dateFormats":b[0][593],"timeFormats":b[0][59]},{"decimal":b[0][38],"currency":b[0][600],"percent":b[0][40]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][601],"dateFormats":b[0][602],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][542],"dateFormats":b[0][605],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][610],"dateFormats":b[0][611],"timeFormats":b[0][59]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][542],"dateFormats":b[0][530],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][623],"dateFormats":b[0][624],"timeFormats":b[0][3]},{"short":a[15],"medium":a[15],"full":a[16],"long":a[16],"availableFormats":b[0][625],"dateFormats":b[0][626],"timeFormats":b[0][3]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][627],"timeFormats":b[0][628]},{"narrow":b[0][12],"short":b[0][629],"long":b[0][630]},{"narrow":b[0][7],"short":b[0][631],"long":b[0][632]},{"narrow":b[0][634],"short":b[0][634],"long":b[0][634]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][635],"dateFormats":b[0][636],"timeFormats":b[0][637]},{"narrow":b[0][638],"short":b[0][639],"long":b[0][640]},{"narrow":b[0][641],"short":b[0][642],"long":b[0][643]},{"narrow":b[0][644],"short":b[0][644],"long":b[0][645]},{"narrow":b[0][646],"short":b[0][646],"long":b[0][646]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][648],"dateFormats":b[0][636],"timeFormats":b[0][59]},{"narrow":b[0][649],"short":b[0][650],"long":b[0][640]},{"narrow":b[0][651],"short":b[0][642],"long":b[0][643]},{"decimal":b[0][38],"currency":b[0][39],"percent":b[0][215]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][653],"dateFormats":b[0][636],"timeFormats":b[0][59]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][656],"dateFormats":b[0][657],"timeFormats":b[0][59]},{"decimal":b[0][38],"currency":b[0][658],"percent":b[0][215]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][660],"dateFormats":b[0][661],"timeFormats":b[0][3]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][665],"dateFormats":b[0][636],"timeFormats":b[0][3]},{"narrow":b[0][644],"short":b[0][644],"long":b[0][666]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][648],"dateFormats":b[0][661],"timeFormats":b[0][59]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][648],"dateFormats":b[0][671],"timeFormats":b[0][59]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][673],"dateFormats":b[0][674],"timeFormats":b[0][59]},{"narrow":b[0][649],"short":b[0][675],"long":b[0][640]},{"narrow":b[0][676],"short":b[0][642],"long":b[0][643]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][679],"dateFormats":b[0][680],"timeFormats":b[0][3]},{"narrow":b[0][638],"short":b[0][650],"long":b[0][640]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][648],"dateFormats":b[0][682],"timeFormats":b[0][59]},{"narrow":b[0][649],"short":b[0][683],"long":b[0][684]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][635],"dateFormats":b[0][636],"timeFormats":b[0][3]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][687],"dateFormats":b[0][680],"timeFormats":b[0][3]},{"narrow":b[0][649],"short":b[0][639],"long":b[0][640]},{"decimal":b[0][38],"currency":b[0][600],"percent":b[0][215]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][648],"dateFormats":b[0][636],"timeFormats":b[0][3]},{"short":a[535],"medium":a[535],"full":a[15],"long":a[15],"availableFormats":b[0][691],"dateFormats":b[0][636],"timeFormats":b[0][3]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][693],"dateFormats":b[0][694],"timeFormats":b[0][695]},{"narrow":b[0][696],"short":b[0][697],"long":b[0][698]},{"narrow":b[0][699],"short":b[0][699],"long":b[0][700]},{"narrow":b[0][701],"short":b[0][701],"long":b[0][702]},{"latn":b[0][703]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][705],"dateFormats":b[0][706],"timeFormats":b[0][707]},{"narrow":b[0][708],"short":b[0][709],"long":b[0][710]},{"narrow":b[0][711],"short":b[0][712],"long":b[0][713]},{"narrow":b[0][714],"short":b[0][714],"long":b[0][714]},{"narrow":b[0][715],"short":b[0][715],"long":b[0][715]},{"narrow":b[0][716],"short":b[0][716],"long":b[0][716]},{"decimal":b[0][38],"currency":b[0][159],"percent":b[0][717]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][57],"dateFormats":b[0][475],"timeFormats":b[0][59]},{"narrow":b[0][719],"short":b[0][720],"long":b[0][721]},{"narrow":b[0][722],"short":b[0][723],"long":b[0][724]},{"narrow":b[0][726],"short":b[0][726],"long":b[0][727]},{"short":a[3992],"medium":a[3992],"full":a[3993],"long":a[3993],"availableFormats":b[0][728],"dateFormats":b[0][729],"timeFormats":b[0][730]},{"narrow":b[0][731],"short":b[0][732],"long":b[0][732]},{"narrow":b[0][733],"short":b[0][734],"long":b[0][734]},{"narrow":b[0][736],"short":b[0][737],"long":b[0][738]},{"narrow":b[0][739],"short":b[0][740],"long":b[0][740]},{"narrow":b[0][12],"short":b[0][741],"long":b[0][741]},{"narrow":b[0][742],"short":b[0][742],"long":b[0][743]},{"narrow":b[0][744],"short":b[0][745],"long":b[0][745]},{"narrow":b[0][746],"short":b[0][746],"long":b[0][747]},{"decimal":b[0][38],"currency":b[0][749],"percent":b[0][40]},{"arabext":b[0][750],"latn":b[0][751]},{"narrow":b[0][731],"short":b[0][753],"long":b[0][754]},{"narrow":b[0][744],"short":b[0][745],"long":b[0][755]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][756],"dateFormats":b[0][58],"timeFormats":b[0][59]},{"narrow":b[0][757],"short":b[0][758],"long":b[0][759]},{"narrow":b[0][760],"short":b[0][761],"long":b[0][762]},{"narrow":b[0][764],"short":b[0][764],"long":b[0][765]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][756],"dateFormats":b[0][58],"timeFormats":b[0][3]},{"short":a[535],"medium":a[4148],"full":a[4148],"long":a[4148],"availableFormats":b[0][768],"dateFormats":b[0][769],"timeFormats":b[0][572]},{"narrow":b[0][770],"short":b[0][771],"long":b[0][771]},{"narrow":b[0][772],"short":b[0][773],"long":b[0][774]},{"narrow":b[0][776],"short":b[0][777],"long":b[0][778]},{"narrow":b[0][779],"short":b[0][780],"long":b[0][780]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][781]},{"latn":b[0][782]},{"short":a[15],"medium":a[15],"full":a[4222],"long":a[4222],"availableFormats":b[0][784],"dateFormats":b[0][2],"timeFormats":b[0][3]},{"narrow":b[0][785],"short":b[0][785],"long":b[0][786]},{"narrow":b[0][787],"short":b[0][787],"long":b[0][788]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][22]},{"short":a[15],"medium":a[15],"full":a[3122],"long":a[3122],"availableFormats":b[0][790],"dateFormats":b[0][438],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][791],"long":b[0][792]},{"narrow":b[0][793],"short":b[0][794],"long":b[0][795]},{"narrow":b[0][796],"short":b[0][797],"long":b[0][798]},{"latn":b[0][799]},{"short":a[535],"medium":a[4282],"full":a[4282],"long":a[4282],"availableFormats":b[0][801],"dateFormats":b[0][581],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][802],"long":b[0][803]},{"narrow":b[0][676],"short":b[0][804],"long":b[0][805]},{"narrow":b[0][806],"short":b[0][807],"long":b[0][808]},{"narrow":b[0][12],"short":b[0][809],"long":b[0][810]},{"narrow":b[0][811],"short":b[0][811],"long":b[0][812]},{"narrow":b[0][24],"short":b[0][813],"long":b[0][813]},{"narrow":b[0][12],"short":b[0][814],"long":b[0][815]},{"narrow":b[0][816],"short":b[0][816],"long":b[0][816]},{"short":a[535],"medium":a[4282],"full":a[4282],"long":a[4282],"availableFormats":b[0][801],"dateFormats":b[0][818],"timeFormats":b[0][819]},{"short":a[535],"medium":a[535],"full":a[4282],"long":a[4282],"availableFormats":b[0][821],"dateFormats":b[0][822],"timeFormats":b[0][59]},{"short":a[535],"medium":a[4282],"full":a[4282],"long":a[4282],"availableFormats":b[0][801],"dateFormats":b[0][825],"timeFormats":b[0][826]},{"short":a[535],"medium":a[4282],"full":a[4282],"long":a[4282],"availableFormats":b[0][801],"dateFormats":b[0][581],"timeFormats":b[0][3]},{"narrow":b[0][4],"short":b[0][833],"long":b[0][803]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][842],"dateFormats":b[0][843],"timeFormats":b[0][59]},{"narrow":b[0][844],"short":b[0][845],"long":b[0][846]},{"narrow":b[0][676],"short":b[0][847],"long":b[0][848]},{"narrow":b[0][850],"short":b[0][850],"long":b[0][850]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][851],"dateFormats":b[0][852],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][853],"long":b[0][854]},{"narrow":b[0][855],"short":b[0][856],"long":b[0][857]},{"narrow":b[0][15],"short":b[0][858],"long":b[0][858]},{"narrow":b[0][15],"short":b[0][859],"long":b[0][859]},{"narrow":b[0][860],"short":b[0][861],"long":b[0][862]},{"narrow":b[0][24],"short":b[0][863],"long":b[0][863]},{"narrow":b[0][12],"short":b[0][864],"long":b[0][864]},{"narrow":b[0][865],"short":b[0][865],"long":b[0][865]},{"narrow":b[0][12],"short":b[0][866],"long":b[0][867]},{"narrow":b[0][868],"short":b[0][868],"long":b[0][868]},{"decimal":b[0][38],"currency":b[0][869],"percent":b[0][40]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][871],"dateFormats":b[0][581],"timeFormats":b[0][59]},{"narrow":b[0][872],"short":b[0][873],"long":b[0][874]},{"narrow":b[0][875],"short":b[0][876],"long":b[0][877]},{"narrow":b[0][878],"short":b[0][878],"long":b[0][879]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][880],"dateFormats":b[0][881],"timeFormats":b[0][59]},{"narrow":b[0][882],"short":b[0][883],"long":b[0][884]},{"narrow":b[0][885],"short":b[0][886],"long":b[0][887]},{"narrow":b[0][889],"short":b[0][890],"long":b[0][891]},{"narrow":b[0][892],"short":b[0][892],"long":b[0][893]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][895],"dateFormats":b[0][896],"timeFormats":b[0][59]},{"narrow":b[0][897],"short":b[0][898],"long":b[0][899]},{"narrow":b[0][166],"short":b[0][900],"long":b[0][901]},{"narrow":b[0][902],"short":b[0][902],"long":b[0][903]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][905],"dateFormats":b[0][438],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][906],"long":b[0][907]},{"narrow":b[0][441],"short":b[0][908],"long":b[0][909]},{"narrow":b[0][911],"short":b[0][911],"long":b[0][911]},{"latn":b[0][912]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][914],"dateFormats":b[0][269],"timeFormats":b[0][915]},{"narrow":b[0][916],"short":b[0][917],"long":b[0][918]},{"narrow":b[0][919],"short":b[0][920],"long":b[0][921]},{"narrow":b[0][922],"short":b[0][923],"long":b[0][924]},{"decimal":b[0][38],"currency":b[0][39],"percent":b[0][40],"secondaryGroupSize":2},{"gujr":b[0][41],"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][926],"dateFormats":b[0][150],"timeFormats":b[0][59]},{"narrow":b[0][927],"short":b[0][928],"long":b[0][929]},{"narrow":b[0][930],"short":b[0][931],"long":b[0][932]},{"narrow":b[0][934],"short":b[0][934],"long":b[0][935]},{"narrow":b[0][12],"short":b[0][936],"long":b[0][937]},{"narrow":b[0][7],"short":b[0][938],"long":b[0][939]},{"narrow":b[0][890],"short":b[0][890],"long":b[0][890]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][926],"dateFormats":b[0][269],"timeFormats":b[0][3]},{"narrow":b[0][940],"short":b[0][941],"long":b[0][942]},{"narrow":b[0][943],"short":b[0][944],"long":b[0][945]},{"narrow":b[0][946],"short":b[0][946],"long":b[0][947]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][926],"dateFormats":b[0][269],"timeFormats":b[0][59]},{"yMMMMEEEEd":a[1298],"yMMMMd":a[616],"yMMMd":a[549],"yMd":b[0][950]},{"narrow":b[0][12],"short":b[0][951],"long":b[0][952]},{"narrow":b[0][7],"short":b[0][953],"long":b[0][954]},{"short":a[15],"medium":a[15],"full":a[4880],"long":a[4880],"availableFormats":b[0][955],"dateFormats":b[0][956],"timeFormats":b[0][129]},{"narrow":b[0][12],"short":b[0][957],"long":b[0][958]},{"narrow":b[0][959],"short":b[0][960],"long":b[0][961]},{"narrow":b[0][963],"short":b[0][963],"long":b[0][964]},{"narrow":b[0][965],"short":b[0][966],"long":b[0][966]},{"narrow":b[0][967],"short":b[0][967],"long":b[0][967]},{"narrow":b[0][12],"short":b[0][968],"long":b[0][969]},{"narrow":b[0][970],"short":b[0][970],"long":b[0][970]},{"narrow":b[0][32],"short":b[0][971],"long":b[0][971]},{"latn":b[0][390]},{"short":a[15],"medium":a[15],"full":a[4986],"long":a[4986],"availableFormats":b[0][973],"dateFormats":b[0][974],"timeFormats":b[0][3]},{"narrow":b[0][975],"short":b[0][976],"long":b[0][977]},{"narrow":b[0][978],"short":b[0][979],"long":b[0][980]},{"narrow":b[0][15],"short":b[0][982],"long":b[0][982]},{"narrow":b[0][983],"short":b[0][983],"long":b[0][984]},{"narrow":b[0][12],"short":b[0][985],"long":b[0][985]},{"narrow":b[0][986],"short":b[0][986],"long":b[0][986]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][987]},{"narrow":b[0][32],"short":b[0][988],"long":b[0][988]},{"narrow":b[0][12],"short":b[0][989],"long":b[0][989]},{"short":a[535],"medium":a[535],"full":a[2381],"long":a[2381],"availableFormats":b[0][990],"dateFormats":b[0][991],"timeFormats":b[0][59]},{"narrow":b[0][992],"short":b[0][993],"long":b[0][994]},{"narrow":b[0][995],"short":b[0][996],"long":b[0][997]},{"narrow":b[0][32],"short":b[0][998],"long":b[0][998]},{"narrow":b[0][999],"short":b[0][999],"long":b[0][999]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1002],"dateFormats":b[0][465],"timeFormats":b[0][1003]},{"narrow":b[0][319],"short":b[0][1004],"long":b[0][1005]},{"narrow":b[0][1006],"short":b[0][1007],"long":b[0][1008]},{"narrow":b[0][1010],"short":b[0][1010],"long":b[0][1011]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1012],"dateFormats":b[0][1013],"timeFormats":b[0][129]},{"narrow":b[0][1014],"short":b[0][1015],"long":b[0][1016]},{"narrow":b[0][1017],"short":b[0][1018],"long":b[0][1019]},{"narrow":b[0][1020],"short":b[0][1020],"long":b[0][1020]},{"narrow":b[0][12],"short":b[0][12],"long":b[0][20]},{"narrow":b[0][1022],"short":b[0][1023],"long":b[0][1024]},{"narrow":b[0][24],"short":b[0][1025],"long":b[0][1025]},{"narrow":b[0][1026],"short":b[0][1026],"long":b[0][1026]},{"narrow":b[0][12],"short":b[0][1027],"long":b[0][1028]},{"narrow":b[0][1029],"short":b[0][1029],"long":b[0][1029]},{"narrow":b[0][1030],"short":b[0][1030],"long":b[0][1030]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][1032],"dateFormats":b[0][1033],"timeFormats":b[0][1034]},{"narrow":b[0][1035],"short":b[0][1036],"long":b[0][1037]},{"narrow":b[0][1038],"short":b[0][1039],"long":b[0][1040]},{"narrow":b[0][1041],"short":b[0][1041],"long":b[0][1042]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1044],"dateFormats":b[0][1045],"timeFormats":b[0][218]},{"narrow":b[0][4],"short":b[0][1046],"long":b[0][1047]},{"narrow":b[0][1048],"short":b[0][1049],"long":b[0][1050]},{"narrow":b[0][1051],"short":b[0][1051],"long":b[0][1052]},{"narrow":b[0][12],"short":b[0][1053],"long":b[0][1054]},{"narrow":b[0][32],"short":b[0][1055],"long":b[0][1055]},{"narrow":b[0][1056],"short":b[0][1056],"long":b[0][1056]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][926],"dateFormats":b[0][150],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][1058],"long":b[0][1059]},{"narrow":b[0][7],"short":b[0][1060],"long":b[0][1061]},{"narrow":b[0][1063],"short":b[0][1063],"long":b[0][1064]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][141],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][1065],"long":b[0][1065]},{"narrow":b[0][1066],"short":b[0][1067],"long":b[0][1068]},{"narrow":b[0][1070],"short":b[0][1070],"long":b[0][1070]},{"short":a[15],"medium":a[15],"full":a[3122],"long":a[3122],"availableFormats":b[0][1071],"dateFormats":b[0][1072],"timeFormats":b[0][59]},{"narrow":b[0][1073],"short":b[0][1074],"long":b[0][1075]},{"narrow":b[0][1076],"short":b[0][1077],"long":b[0][1078]},{"narrow":b[0][1080],"short":b[0][1081],"long":b[0][1082]},{"short":a[15],"medium":a[15],"full":a[535],"long":a[535],"availableFormats":b[0][1084],"dateFormats":b[0][1085],"timeFormats":b[0][59]},{"narrow":b[0][1086],"short":b[0][1087],"long":b[0][1088]},{"narrow":b[0][1089],"short":b[0][1090],"long":b[0][1091]},{"narrow":b[0][169],"short":b[0][169],"long":b[0][169]},{"narrow":b[0][1092],"short":b[0][1093],"long":b[0][1094]},{"narrow":b[0][1095],"short":b[0][1095],"long":b[0][1095]},{"short":a[15],"medium":a[15],"full":a[535],"long":a[535],"availableFormats":b[0][1084],"dateFormats":b[0][1097],"timeFormats":b[0][59]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1098],"dateFormats":b[0][1099],"timeFormats":b[0][1100]},{"narrow":b[0][12],"short":b[0][1101],"long":b[0][1101]},{"narrow":b[0][1102],"short":b[0][1102],"long":b[0][1103]},{"narrow":b[0][10],"short":b[0][10],"long":b[0][1104]},{"narrow":b[0][1106],"short":b[0][1107],"long":b[0][1107]},{"narrow":b[0][15],"short":b[0][1108],"long":b[0][1108]},{"narrow":b[0][15],"short":b[0][1109],"long":b[0][1109]},{"narrow":b[0][22],"short":b[0][1110],"long":b[0][1110]},{"narrow":b[0][24],"short":b[0][1111],"long":b[0][1111]},{"narrow":b[0][12],"short":b[0][1112],"long":b[0][1112]},{"narrow":b[0][1113],"short":b[0][1113],"long":b[0][1113]},{"narrow":b[0][12],"short":b[0][1114],"long":b[0][1114]},{"narrow":b[0][1115],"short":b[0][1116],"long":b[0][1116]},{"narrow":b[0][12],"short":b[0][1117],"long":b[0][1117]},{"narrow":b[0][1118],"short":b[0][1118],"long":b[0][1118]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1120],"dateFormats":b[0][1121],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][1122],"long":b[0][1122]},{"narrow":b[0][1123],"short":b[0][1124],"long":b[0][1124]},{"narrow":b[0][147],"short":b[0][147],"long":b[0][1126]},{"narrow":b[0][4],"short":b[0][1127],"long":b[0][1128]},{"narrow":b[0][153],"short":b[0][1129],"long":b[0][1130]},{"narrow":b[0][434],"short":b[0][434],"long":b[0][1132]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][1133],"dateFormats":b[0][1134],"timeFormats":b[0][59]},{"narrow":b[0][1135],"short":b[0][1136],"long":b[0][1137]},{"narrow":b[0][1138],"short":b[0][1139],"long":b[0][1140]},{"narrow":b[0][1141],"short":b[0][1141],"long":b[0][1142]},{"latn":b[0][1143]},{"narrow":b[0][1145],"short":b[0][1146],"long":b[0][1147]},{"narrow":b[0][1148],"short":b[0][1149],"long":b[0][1150]},{"narrow":b[0][1152],"short":b[0][1152],"long":b[0][1153]},{"narrow":b[0][1155],"short":b[0][1156],"long":b[0][1157]},{"narrow":b[0][1158],"short":b[0][1159],"long":b[0][1160]},{"narrow":b[0][1162],"short":b[0][1162],"long":b[0][1163]},{"narrow":b[0][4],"short":b[0][1127],"long":b[0][1164]},{"narrow":b[0][1165],"short":b[0][1166],"long":b[0][1167]},{"narrow":b[0][1169],"short":b[0][1169],"long":b[0][1170]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1171],"dateFormats":b[0][1172],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][1173],"long":b[0][1174]},{"narrow":b[0][1175],"short":b[0][1176],"long":b[0][1177]},{"narrow":b[0][1178],"short":b[0][1178],"long":b[0][1179]},{"narrow":b[0][1181],"short":b[0][1182],"long":b[0][1183]},{"narrow":b[0][461],"short":b[0][461],"long":b[0][1185]},{"narrow":b[0][1186],"short":b[0][1187],"long":b[0][1188]},{"narrow":b[0][1189],"short":b[0][1190],"long":b[0][1191]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1193],"dateFormats":b[0][1194],"timeFormats":b[0][59]},{"narrow":b[0][1195],"short":b[0][1196],"long":b[0][1197]},{"narrow":b[0][1198],"short":b[0][1199],"long":b[0][1200]},{"narrow":b[0][1202],"short":b[0][1202],"long":b[0][1203]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1205],"dateFormats":b[0][1206],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][1207],"long":b[0][1207]},{"narrow":b[0][1208],"short":b[0][1209],"long":b[0][1209]},{"narrow":b[0][12],"short":b[0][320],"long":b[0][1210]},{"narrow":b[0][7],"short":b[0][1211],"long":b[0][1212]},{"narrow":b[0][1213],"short":b[0][1214],"long":b[0][1215]},{"narrow":b[0][1216],"short":b[0][1217],"long":b[0][1218]},{"narrow":b[0][1220],"short":b[0][1220],"long":b[0][1221]},{"short":a[15],"medium":a[15],"full":a[6878],"long":a[6878],"availableFormats":b[0][1222],"dateFormats":b[0][1223],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][1224],"long":b[0][1224]},{"narrow":b[0][1225],"short":b[0][1226],"long":b[0][1226]},{"narrow":b[0][1228],"short":b[0][1228],"long":b[0][1229]},{"khmr":b[0][198],"latn":b[0][198]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1231],"dateFormats":b[0][1232],"timeFormats":b[0][915]},{"narrow":b[0][1233],"short":b[0][1234],"long":b[0][1235]},{"narrow":b[0][1236],"short":b[0][1237],"long":b[0][1238]},{"narrow":b[0][1240],"short":b[0][1240],"long":b[0][1241]},{"knda":b[0][41],"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1242],"dateFormats":b[0][1243],"timeFormats":b[0][1244]},{"narrow":b[0][1245],"short":b[0][1245],"long":b[0][1245]},{"narrow":b[0][1246],"short":b[0][1246],"long":b[0][1247]},{"narrow":b[0][1248],"short":b[0][1248],"long":b[0][1248]},{"narrow":b[0][12],"short":b[0][1245],"long":b[0][1245]},{"narrow":b[0][15],"short":b[0][1250],"long":b[0][1250]},{"narrow":b[0][15],"short":b[0][1251],"long":b[0][1251]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][1252]},{"narrow":b[0][24],"short":b[0][1253],"long":b[0][1253]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][1254]},{"narrow":b[0][32],"short":b[0][1255],"long":b[0][1255]},{"narrow":b[0][12],"short":b[0][1256],"long":b[0][1256]},{"narrow":b[0][1257],"short":b[0][1257],"long":b[0][1257]},{"narrow":b[0][12],"short":b[0][1259],"long":b[0][1259]},{"narrow":b[0][7],"short":b[0][1260],"long":b[0][1261]},{"narrow":b[0][1263],"short":b[0][1263],"long":b[0][1263]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1264],"dateFormats":b[0][2],"timeFormats":b[0][3]},{"narrow":b[0][1265],"short":b[0][1266],"long":b[0][1266]},{"narrow":b[0][1267],"short":b[0][1268],"long":b[0][1269]},{"narrow":b[0][1270],"short":b[0][1270],"long":b[0][1271]},{"narrow":b[0][12],"short":b[0][1272],"long":b[0][1272]},{"arabext":b[0][1273],"latn":b[0][1274]},{"narrow":b[0][4],"short":b[0][1127],"long":b[0][1275]},{"narrow":b[0][1276],"short":b[0][1277],"long":b[0][1278]},{"narrow":b[0][434],"short":b[0][434],"long":b[0][1280]},{"narrow":b[0][12],"short":b[0][1281],"long":b[0][1282]},{"narrow":b[0][1283],"short":b[0][1284],"long":b[0][1285]},{"narrow":b[0][1287],"short":b[0][1287],"long":b[0][1288]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1289],"dateFormats":b[0][1290],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][1291],"long":b[0][1292]},{"narrow":b[0][441],"short":b[0][1293],"long":b[0][1294]},{"narrow":b[0][1296],"short":b[0][1297],"long":b[0][1298]},{"latn":b[0][1299]},{"narrow":b[0][12],"short":b[0][1300],"long":b[0][1301]},{"narrow":b[0][7],"short":b[0][1302],"long":b[0][1303]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1304],"dateFormats":b[0][1305],"timeFormats":b[0][59]},{"narrow":b[0][1306],"short":b[0][1307],"long":b[0][367]},{"narrow":b[0][1308],"short":b[0][1309],"long":b[0][1310]},{"narrow":b[0][1312],"short":b[0][1312],"long":b[0][1313]},{"latn":b[0][1314]},{"narrow":b[0][1316],"short":b[0][1317],"long":b[0][1318]},{"narrow":b[0][1319],"short":b[0][1320],"long":b[0][1321]},{"narrow":b[0][1323],"short":b[0][1323],"long":b[0][1324]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1325],"dateFormats":b[0][694],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][1326],"long":b[0][1327]},{"narrow":b[0][441],"short":b[0][1328],"long":b[0][1329]},{"narrow":b[0][1331],"short":b[0][1331],"long":b[0][1331]},{"narrow":b[0][4],"short":b[0][1333],"long":b[0][1334]},{"narrow":b[0][1335],"short":b[0][1336],"long":b[0][1337]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][1338]},{"narrow":b[0][12],"short":b[0][1339],"long":b[0][1339]},{"narrow":b[0][1340],"short":b[0][1341],"long":b[0][1341]},{"narrow":b[0][1342],"short":b[0][1343],"long":b[0][1344]},{"narrow":b[0][1345],"short":b[0][1346],"long":b[0][1347]},{"narrow":b[0][1349],"short":b[0][1349],"long":b[0][1350]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][1353],"dateFormats":b[0][1354],"timeFormats":b[0][1355]},{"narrow":b[0][12],"short":b[0][1356],"long":b[0][1357]},{"narrow":b[0][1358],"short":b[0][1359],"long":b[0][1359]},{"narrow":b[0][15],"short":b[0][1361],"long":b[0][1362]},{"narrow":b[0][15],"short":b[0][1363],"long":b[0][1363]},{"narrow":b[0][1364],"short":b[0][1364],"long":b[0][1365]},{"narrow":b[0][24],"short":b[0][1366],"long":b[0][1366]},{"narrow":b[0][12],"short":b[0][1367],"long":b[0][1368]},{"narrow":b[0][1369],"short":b[0][1369],"long":b[0][1369]},{"narrow":b[0][12],"short":b[0][1370],"long":b[0][1371]},{"narrow":b[0][32],"short":b[0][1372],"long":b[0][1372]},{"narrow":b[0][12],"short":b[0][1373],"long":b[0][1374]},{"narrow":b[0][1375],"short":b[0][1375],"long":b[0][1375]},{"narrow":b[0][1376],"short":b[0][1376],"long":b[0][1376]},{"decimal":b[0][38],"currency":b[0][658],"percent":b[0][40]},{"laoo":b[0][1377],"latn":b[0][1377]},{"narrow":b[0][12],"short":b[0][1379],"long":b[0][1379]},{"arabext":b[0][1273],"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1380],"dateFormats":b[0][1381],"timeFormats":b[0][59]},{"narrow":b[0][1382],"short":b[0][1383],"long":b[0][1384]},{"narrow":b[0][1385],"short":b[0][1386],"long":b[0][1387]},{"narrow":b[0][1389],"short":b[0][1389],"long":b[0][1390]},{"narrow":b[0][32],"short":b[0][1391],"long":b[0][1391]},{"narrow":b[0][1392],"short":b[0][1392],"long":b[0][1392]},{"narrow":b[0][1394],"short":b[0][1395],"long":b[0][1396]},{"narrow":b[0][1397],"short":b[0][1398],"long":b[0][1399]},{"narrow":b[0][1401],"short":b[0][1401],"long":b[0][1402]},{"narrow":b[0][1403],"short":b[0][1404],"long":b[0][1405]},{"narrow":b[0][1406],"short":b[0][1407],"long":b[0][1408]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][1410]},{"narrow":b[0][4],"short":b[0][1411],"long":b[0][152]},{"narrow":b[0][7],"short":b[0][1412],"long":b[0][1413]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][1414]},{"decimal":b[0][38],"currency":b[0][1415],"percent":b[0][40]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1416],"dateFormats":b[0][1417],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][1418],"long":b[0][1419]},{"narrow":b[0][1420],"short":b[0][1421],"long":b[0][1422]},{"narrow":b[0][1424],"short":b[0][1424],"long":b[0][1425]},{"narrow":b[0][24],"short":b[0][1426],"long":b[0][1426]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][1427]},{"latn":b[0][1428]},{"narrow":b[0][12],"short":b[0][1430],"long":b[0][1431]},{"narrow":b[0][1165],"short":b[0][1129],"long":b[0][1432]},{"narrow":b[0][1434],"short":b[0][1434],"long":b[0][1435]},{"narrow":b[0][1437],"short":b[0][1438],"long":b[0][1439]},{"narrow":b[0][1440],"short":b[0][1441],"long":b[0][1442]},{"narrow":b[0][1444],"short":b[0][1444],"long":b[0][1445]},{"narrow":b[0][1446],"short":b[0][1447],"long":b[0][1448]},{"narrow":b[0][1449],"short":b[0][1450],"long":b[0][1451]},{"narrow":b[0][1452],"short":b[0][1452],"long":b[0][1453]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1454],"dateFormats":b[0][58],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][1455],"long":b[0][1456]},{"narrow":b[0][1457],"short":b[0][1458],"long":b[0][1459]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][1460]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1461],"dateFormats":b[0][150],"timeFormats":b[0][59]},{"narrow":b[0][1462],"short":b[0][1463],"long":b[0][1464]},{"narrow":b[0][1465],"short":b[0][1466],"long":b[0][1467]},{"narrow":b[0][1469],"short":b[0][1469],"long":b[0][1470]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][1121],"timeFormats":b[0][59]},{"narrow":b[0][1472],"short":b[0][1473],"long":b[0][1474]},{"narrow":b[0][1475],"short":b[0][1476],"long":b[0][1476]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1477],"dateFormats":b[0][1478],"timeFormats":b[0][59]},{"narrow":b[0][331],"short":b[0][1479],"long":b[0][1480]},{"narrow":b[0][249],"short":b[0][1481],"long":b[0][1482]},{"narrow":b[0][1484],"short":b[0][1484],"long":b[0][1485]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1487],"dateFormats":b[0][1488],"timeFormats":b[0][3]},{"narrow":b[0][1489],"short":b[0][1490],"long":b[0][1491]},{"narrow":b[0][1492],"short":b[0][1493],"long":b[0][1494]},{"narrow":b[0][1495],"short":b[0][1495],"long":b[0][1496]},{"narrow":b[0][1497],"short":b[0][1498],"long":b[0][1498]},{"narrow":b[0][1499],"short":b[0][1499],"long":b[0][1499]},{"narrow":b[0][1500],"short":b[0][29],"long":b[0][1501]},{"narrow":b[0][1502],"short":b[0][1502],"long":b[0][1502]},{"latn":b[0][41],"mlym":b[0][1503]},{"short":a[15],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1504],"dateFormats":b[0][1505],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][1506],"long":b[0][1507]},{"narrow":b[0][1358],"short":b[0][1508],"long":b[0][1509]},{"narrow":b[0][1511],"short":b[0][1512],"long":b[0][1513]},{"short":a[15],"medium":a[15],"full":a[8910],"long":a[8910],"availableFormats":b[0][1515],"dateFormats":b[0][269],"timeFormats":b[0][3]},{"narrow":b[0][1516],"short":b[0][1517],"long":b[0][1518]},{"narrow":b[0][978],"short":b[0][1260],"long":b[0][1519]},{"narrow":b[0][1521],"short":b[0][1521],"long":b[0][1522]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1524],"dateFormats":b[0][1525],"timeFormats":b[0][3]},{"narrow":b[0][1526],"short":b[0][1527],"long":b[0][1528]},{"narrow":b[0][1529],"short":b[0][1530],"long":b[0][1531]},{"narrow":b[0][1533],"short":b[0][1527],"long":b[0][1528]},{"narrow":b[0][1534],"short":b[0][1534],"long":b[0][1534]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1524],"dateFormats":b[0][1536],"timeFormats":b[0][3]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][1539],"timeFormats":b[0][59]},{"narrow":b[0][1540],"short":b[0][1541],"long":b[0][1542]},{"narrow":b[0][1543],"short":b[0][1544],"long":b[0][1545]},{"narrow":b[0][1546],"short":b[0][1546],"long":b[0][1547]},{"narrow":b[0][1548],"short":b[0][1549],"long":b[0][1550]},{"narrow":b[0][1551],"short":b[0][1552],"long":b[0][1553]},{"narrow":b[0][1555],"short":b[0][1555],"long":b[0][1556]},{"short":a[535],"medium":a[535],"full":a[9042],"long":a[535],"availableFormats":b[0][1557],"dateFormats":b[0][1558],"timeFormats":b[0][59]},{"narrow":b[0][1559],"short":b[0][1560],"long":b[0][1561]},{"narrow":b[0][1562],"short":b[0][1563],"long":b[0][1563]},{"narrow":b[0][1565],"short":b[0][1565],"long":b[0][1566]},{"latn":b[0][1568],"mymr":b[0][1568]},{"narrow":b[0][12],"short":b[0][1570],"long":b[0][1570]},{"narrow":b[0][1571],"short":b[0][1571],"long":b[0][1572]},{"narrow":b[0][4],"short":b[0][5],"long":b[0][1573]},{"narrow":b[0][1574],"short":b[0][1575],"long":b[0][1576]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][1578]},{"short":a[15],"medium":a[15],"full":a[535],"long":a[3122],"availableFormats":b[0][1579],"dateFormats":b[0][1580],"timeFormats":b[0][218]},{"narrow":b[0][4],"short":b[0][791],"long":b[0][1581]},{"narrow":b[0][15],"short":b[0][1582],"long":b[0][1582]},{"narrow":b[0][1583],"short":b[0][1584],"long":b[0][1585]},{"narrow":b[0][15],"short":b[0][1586],"long":b[0][1586]},{"narrow":b[0][1587],"short":b[0][1588],"long":b[0][1589]},{"narrow":b[0][24],"short":b[0][1590],"long":b[0][1590]},{"narrow":b[0][12],"short":b[0][1591],"long":b[0][1591]},{"narrow":b[0][1592],"short":b[0][1592],"long":b[0][1592]},{"narrow":b[0][12],"short":b[0][1593],"long":b[0][1594]},{"narrow":b[0][12],"short":b[0][1595],"long":b[0][1595]},{"narrow":b[0][1597],"short":b[0][1598],"long":b[0][1599]},{"narrow":b[0][1600],"short":b[0][1601],"long":b[0][1602]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][1603]},{"short":a[15],"medium":a[15],"full":a[535],"long":a[535],"availableFormats":b[0][1604],"dateFormats":b[0][141],"timeFormats":b[0][59]},{"narrow":b[0][1605],"short":b[0][1606],"long":b[0][1607]},{"narrow":b[0][1608],"short":b[0][1609],"long":b[0][1610]},{"narrow":b[0][1611],"short":b[0][1611],"long":b[0][1611]},{"narrow":b[0][12],"short":b[0][1612],"long":b[0][1612]},{"short":a[15],"medium":a[15],"full":a[535],"long":a[535],"availableFormats":b[0][1604],"dateFormats":b[0][141],"timeFormats":b[0][3]},{"narrow":b[0][4],"short":b[0][1614],"long":b[0][1615]},{"narrow":b[0][855],"short":b[0][1616],"long":b[0][1617]},{"narrow":b[0][12],"short":b[0][1618],"long":b[0][1619]},{"narrow":b[0][1620],"short":b[0][1621],"long":b[0][1622]},{"narrow":b[0][32],"short":b[0][1623],"long":b[0][1623]},{"narrow":b[0][1624],"short":b[0][1624],"long":b[0][1624]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][851],"dateFormats":b[0][818],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][1629],"long":b[0][1630]},{"narrow":b[0][1631],"short":b[0][1632],"long":b[0][1633]},{"narrow":b[0][1635],"short":b[0][1635],"long":b[0][1636]},{"short":a[15],"medium":a[15],"full":a[535],"long":a[3122],"availableFormats":b[0][1637],"dateFormats":b[0][1580],"timeFormats":b[0][1638]},{"narrow":b[0][4],"short":b[0][1639],"long":b[0][1581]},{"narrow":b[0][419],"short":b[0][1640],"long":b[0][1641]},{"narrow":b[0][1643],"short":b[0][1643],"long":b[0][1643]},{"short":a[535],"medium":a[535],"full":a[9406],"long":a[15],"availableFormats":b[0][1645],"dateFormats":b[0][1646],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][1647],"long":b[0][1647]},{"narrow":b[0][7],"short":b[0][1648],"long":b[0][1648]},{"narrow":b[0][1650],"short":b[0][1650],"long":b[0][1651]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1652],"dateFormats":b[0][1653],"timeFormats":b[0][1654]},{"narrow":b[0][1655],"short":b[0][1656],"long":b[0][1657]},{"narrow":b[0][1658],"short":b[0][1659],"long":b[0][1660]},{"narrow":b[0][1662],"short":b[0][1662],"long":b[0][1663]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1664],"dateFormats":b[0][1665],"timeFormats":b[0][3]},{"narrow":b[0][4],"short":b[0][1666],"long":b[0][1667]},{"narrow":b[0][7],"short":b[0][1668],"long":b[0][1669]},{"narrow":b[0][1671],"short":b[0][1671],"long":b[0][1671]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1664],"dateFormats":b[0][1665],"timeFormats":b[0][59]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1674],"dateFormats":b[0][1675],"timeFormats":b[0][3]},{"narrow":b[0][1676],"short":b[0][1677],"long":b[0][1677]},{"narrow":b[0][1678],"short":b[0][1679],"long":b[0][1680]},{"latn":b[0][41],"orya":b[0][41]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][1681],"dateFormats":b[0][1682],"timeFormats":b[0][59]},{"narrow":b[0][1306],"short":b[0][1683],"long":b[0][1684]},{"narrow":b[0][1685],"short":b[0][1686],"long":b[0][1687]},{"narrow":b[0][1689],"short":b[0][1689],"long":b[0][1689]},{"latn":b[0][1690]},{"short":a[15],"medium":a[15],"full":a[535],"long":a[535],"availableFormats":b[0][1692],"dateFormats":b[0][530],"timeFormats":b[0][3]},{"narrow":b[0][1693],"short":b[0][1694],"long":b[0][1695]},{"narrow":b[0][1696],"short":b[0][1697],"long":b[0][1698]},{"narrow":b[0][1700],"short":b[0][1700],"long":b[0][1701]},{"narrow":b[0][1702],"short":b[0][1703],"long":b[0][1703]},{"narrow":b[0][1704],"short":b[0][1704],"long":b[0][1704]},{"guru":b[0][41],"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1705],"dateFormats":b[0][1706],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][1707],"long":b[0][1707]},{"narrow":b[0][7],"short":b[0][1708],"long":b[0][1708]},{"narrow":b[0][1709],"short":b[0][1709],"long":b[0][1709]},{"arabext":b[0][1273],"latn":b[0][390]},{"short":a[15],"medium":a[15],"full":a[535],"long":a[535],"availableFormats":b[0][1711],"dateFormats":b[0][1712],"timeFormats":b[0][59]},{"narrow":b[0][1713],"short":b[0][1714],"long":b[0][1715]},{"narrow":b[0][1716],"short":b[0][1717],"long":b[0][1718]},{"narrow":b[0][1719],"short":b[0][1719],"long":b[0][1719]},{"narrow":b[0][24],"short":b[0][1720],"long":b[0][1720]},{"narrow":b[0][12],"short":b[0][1721],"long":b[0][1722]},{"narrow":b[0][12],"short":b[0][1723],"long":b[0][1723]},{"narrow":b[0][1724],"short":b[0][1724],"long":b[0][1724]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1726],"dateFormats":b[0][1727],"timeFormats":b[0][730]},{"narrow":b[0][12],"short":b[0][1728],"long":b[0][1728]},{"narrow":b[0][7],"short":b[0][734],"long":b[0][734]},{"narrow":b[0][1730],"short":b[0][1730],"long":b[0][1730]},{"narrow":b[0][12],"short":b[0][1731],"long":b[0][1731]},{"arabext":b[0][1273],"latn":b[0][1732]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1734],"dateFormats":b[0][1735],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][1736],"long":b[0][1737]},{"narrow":b[0][1738],"short":b[0][1739],"long":b[0][1740]},{"narrow":b[0][12],"short":b[0][1741],"long":b[0][1741]},{"narrow":b[0][1742],"short":b[0][1742],"long":b[0][1743]},{"narrow":b[0][1744],"short":b[0][1744],"long":b[0][1744]},{"short":a[15],"medium":a[15],"full":a[9829],"long":a[9829],"availableFormats":b[0][1746],"dateFormats":b[0][674],"timeFormats":b[0][59]},{"narrow":b[0][1738],"short":b[0][1747],"long":b[0][1740]},{"narrow":b[0][12],"short":b[0][1749],"long":b[0][1741]},{"narrow":b[0][1750],"short":b[0][1750],"long":b[0][1743]},{"short":a[15],"medium":a[15],"full":a[9829],"long":a[9829],"availableFormats":b[0][1746],"dateFormats":b[0][674],"timeFormats":b[0][3]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1757],"dateFormats":b[0][1758],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][1759],"long":b[0][1760]},{"narrow":b[0][641],"short":b[0][1761],"long":b[0][1762]},{"narrow":b[0][1763],"short":b[0][1764],"long":b[0][1764]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1767],"dateFormats":b[0][1768],"timeFormats":b[0][59]},{"narrow":b[0][1769],"short":b[0][1770],"long":b[0][1771]},{"narrow":b[0][1772],"short":b[0][1773],"long":b[0][1774]},{"narrow":b[0][1776],"short":b[0][1776],"long":b[0][1777]},{"narrow":b[0][12],"short":b[0][1778],"long":b[0][1779]},{"narrow":b[0][7],"short":b[0][1780],"long":b[0][1781]},{"narrow":b[0][1783],"short":b[0][1783],"long":b[0][1784]},{"decimal":b[0][38],"currency":b[0][69],"percent":b[0][215]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][1786],"dateFormats":b[0][1787],"timeFormats":b[0][59]},{"narrow":b[0][1788],"short":b[0][1789],"long":b[0][1790]},{"narrow":b[0][676],"short":b[0][1791],"long":b[0][1792]},{"narrow":b[0][1793],"short":b[0][1793],"long":b[0][1794]},{"narrow":b[0][1795],"short":b[0][1795],"long":b[0][1796]},{"narrow":b[0][24],"short":b[0][1797],"long":b[0][1797]},{"narrow":b[0][1799],"short":b[0][1800],"long":b[0][1792]},{"narrow":b[0][1801],"short":b[0][1801],"long":b[0][1796]},{"narrow":b[0][1803],"short":b[0][1749],"long":b[0][1804]},{"narrow":b[0][1165],"short":b[0][1805],"long":b[0][1806]},{"narrow":b[0][157],"short":b[0][157],"long":b[0][1808]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][1809],"dateFormats":b[0][1810],"timeFormats":b[0][129]},{"narrow":b[0][1306],"short":b[0][1811],"long":b[0][1812]},{"narrow":b[0][1813],"short":b[0][1813],"long":b[0][1814]},{"narrow":b[0][15],"short":b[0][1816],"long":b[0][1816]},{"narrow":b[0][15],"short":b[0][1817],"long":b[0][1817]},{"narrow":b[0][1818],"short":b[0][1819],"long":b[0][1820]},{"narrow":b[0][24],"short":b[0][1821],"long":b[0][1821]},{"narrow":b[0][12],"short":b[0][1822],"long":b[0][1822]},{"narrow":b[0][12],"short":b[0][1823],"long":b[0][1823]},{"narrow":b[0][32],"short":b[0][1824],"long":b[0][1824]},{"narrow":b[0][12],"short":b[0][1825],"long":b[0][1825]},{"latn":b[0][1826]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][1809],"dateFormats":b[0][1810],"timeFormats":b[0][59]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][72],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][1832],"long":b[0][1833]},{"narrow":b[0][7],"short":b[0][1834],"long":b[0][1835]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][1836],"timeFormats":b[0][59]},{"narrow":b[0][1837],"short":b[0][1838],"long":b[0][1839]},{"narrow":b[0][1840],"short":b[0][1841],"long":b[0][1842]},{"narrow":b[0][1844],"short":b[0][1844],"long":b[0][1844]},{"narrow":b[0][1845],"short":b[0][1846],"long":b[0][1847]},{"narrow":b[0][1848],"short":b[0][1849],"long":b[0][1850]},{"narrow":b[0][434],"short":b[0][434],"long":b[0][1852]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1853],"dateFormats":b[0][150],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][1854],"long":b[0][1855]},{"narrow":b[0][1856],"short":b[0][1857],"long":b[0][1858]},{"narrow":b[0][1860],"short":b[0][1860],"long":b[0][1861]},{"narrow":b[0][1862],"short":b[0][1863],"long":b[0][1864]},{"narrow":b[0][1865],"short":b[0][1866],"long":b[0][1867]},{"narrow":b[0][1869],"short":b[0][1869],"long":b[0][1870]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1873],"dateFormats":b[0][1874],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][1875],"long":b[0][1876]},{"narrow":b[0][1877],"short":b[0][1878],"long":b[0][1879]},{"narrow":b[0][1880],"short":b[0][1880],"long":b[0][1881]},{"narrow":b[0][1181],"short":b[0][458],"long":b[0][1882]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1883],"dateFormats":b[0][58],"timeFormats":b[0][59]},{"narrow":b[0][1884],"short":b[0][1885],"long":b[0][1886]},{"narrow":b[0][1887],"short":b[0][1888],"long":b[0][1889]},{"narrow":b[0][1891],"short":b[0][1891],"long":b[0][1892]},{"narrow":b[0][1893],"short":b[0][1894],"long":b[0][1895]},{"narrow":b[0][7],"short":b[0][1896],"long":b[0][1897]},{"narrow":b[0][1899],"short":b[0][1899],"long":b[0][1900]},{"narrow":b[0][1901],"short":b[0][1902],"long":b[0][1903]},{"narrow":b[0][7],"short":b[0][1904],"long":b[0][1905]},{"narrow":b[0][1907],"short":b[0][1907],"long":b[0][1908]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1909],"dateFormats":b[0][141],"timeFormats":b[0][218]},{"narrow":b[0][1910],"short":b[0][1911],"long":b[0][1912]},{"narrow":b[0][1913],"short":b[0][1914],"long":b[0][1915]},{"narrow":b[0][1917],"short":b[0][1917],"long":b[0][1918]},{"short":a[535],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][1920],"dateFormats":b[0][1921],"timeFormats":b[0][129]},{"narrow":b[0][319],"short":b[0][1922],"long":b[0][1923]},{"narrow":b[0][1924],"short":b[0][1925],"long":b[0][1926]},{"narrow":b[0][1927],"short":b[0][1927],"long":b[0][1928]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1930],"dateFormats":b[0][1931],"timeFormats":b[0][59]},{"narrow":b[0][319],"short":b[0][1932],"long":b[0][1933]},{"narrow":b[0][1934],"short":b[0][1935],"long":b[0][1936]},{"narrow":b[0][1938],"short":b[0][1938],"long":b[0][1939]},{"narrow":b[0][1941],"short":b[0][1942],"long":b[0][1943]},{"latn":b[0][1944]},{"narrow":b[0][1945],"short":b[0][1946],"long":b[0][1947]},{"narrow":b[0][1948],"short":b[0][1949],"long":b[0][1950]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][1951]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][926],"dateFormats":b[0][1952],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][1953],"long":b[0][1954]},{"narrow":b[0][1955],"short":b[0][1956],"long":b[0][1957]},{"narrow":b[0][1959],"short":b[0][1959],"long":b[0][1960]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][926],"dateFormats":b[0][1952],"timeFormats":b[0][59]},{"short":a[15],"medium":a[15],"full":a[10904],"long":a[10904],"availableFormats":b[0][1965],"dateFormats":b[0][1966],"timeFormats":b[0][1967]},{"narrow":b[0][1968],"short":b[0][1969],"long":b[0][1970]},{"narrow":b[0][1971],"short":b[0][1972],"long":b[0][1973]},{"narrow":b[0][1975],"short":b[0][1975],"long":b[0][1976]},{"short":a[15],"medium":a[15],"full":a[10904],"long":a[10904],"availableFormats":b[0][1965],"dateFormats":b[0][1966],"timeFormats":b[0][59]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1979],"dateFormats":b[0][330],"timeFormats":b[0][218]},{"narrow":b[0][331],"short":b[0][332],"long":b[0][1980]},{"narrow":b[0][334],"short":b[0][1981],"long":b[0][1982]},{"narrow":b[0][341],"short":b[0][342],"long":b[0][1984]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1979],"dateFormats":b[0][330],"timeFormats":b[0][59]},{"narrow":b[0][319],"short":b[0][1986],"long":b[0][1987]},{"narrow":b[0][1988],"short":b[0][1989],"long":b[0][1990]},{"narrow":b[0][15],"short":b[0][1992],"long":b[0][1992]},{"narrow":b[0][15],"short":b[0][1993],"long":b[0][1993]},{"narrow":b[0][1719],"short":b[0][1994],"long":b[0][1995]},{"narrow":b[0][24],"short":b[0][1996],"long":b[0][1996]},{"narrow":b[0][12],"short":b[0][1997],"long":b[0][1997]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][1998]},{"narrow":b[0][32],"short":b[0][1999],"long":b[0][1999]},{"narrow":b[0][12],"short":b[0][2000],"long":b[0][2000]},{"narrow":b[0][2001],"short":b[0][2001],"long":b[0][2001]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2003],"dateFormats":b[0][2004],"timeFormats":b[0][1638]},{"narrow":b[0][4],"short":b[0][2005],"long":b[0][2006]},{"narrow":b[0][419],"short":b[0][2007],"long":b[0][2008]},{"narrow":b[0][15],"short":b[0][2010],"long":b[0][2010]},{"narrow":b[0][15],"short":b[0][2011],"long":b[0][2011]},{"narrow":b[0][2012],"short":b[0][423],"long":b[0][2013]},{"narrow":b[0][24],"short":b[0][2014],"long":b[0][2014]},{"narrow":b[0][12],"short":b[0][2015],"long":b[0][2015]},{"narrow":b[0][865],"short":b[0][865],"long":b[0][2016]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][2017]},{"narrow":b[0][32],"short":b[0][2018],"long":b[0][2018]},{"narrow":b[0][12],"short":b[0][2019],"long":b[0][2019]},{"narrow":b[0][2020],"short":b[0][2020],"long":b[0][2020]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2003],"dateFormats":b[0][2022],"timeFormats":b[0][1638]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2023],"dateFormats":b[0][150],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][1127],"long":b[0][152]},{"narrow":b[0][7],"short":b[0][155],"long":b[0][155]},{"narrow":b[0][22],"short":b[0][22],"long":b[0][435]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2025],"dateFormats":b[0][475],"timeFormats":b[0][59]},{"narrow":b[0][4],"short":b[0][2026],"long":b[0][2027]},{"narrow":b[0][7],"short":b[0][2028],"long":b[0][2029]},{"short":a[15],"medium":a[15],"full":a[11175],"long":a[11175],"availableFormats":b[0][2033],"dateFormats":b[0][269],"timeFormats":b[0][2034]},{"narrow":b[0][2035],"short":b[0][2036],"long":b[0][2037]},{"narrow":b[0][2038],"short":b[0][2039],"long":b[0][2040]},{"narrow":b[0][12],"short":b[0][2042],"long":b[0][2043]},{"narrow":b[0][2044],"short":b[0][2044],"long":b[0][2045]},{"latn":b[0][41],"tamldec":b[0][41]},{"short":a[15],"medium":a[15],"full":a[11175],"long":a[11175],"availableFormats":b[0][2033],"dateFormats":b[0][269],"timeFormats":b[0][59]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2049],"dateFormats":b[0][2050],"timeFormats":b[0][3]},{"narrow":b[0][2051],"short":b[0][2052],"long":b[0][2053]},{"narrow":b[0][2054],"short":b[0][2055],"long":b[0][2056]},{"narrow":b[0][2058],"short":b[0][2058],"long":b[0][2059]},{"latn":b[0][41],"telu":b[0][41]},{"narrow":b[0][2060],"short":b[0][2061],"long":b[0][2062]},{"narrow":b[0][2063],"short":b[0][2064],"long":b[0][2065]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2068],"dateFormats":b[0][2069],"timeFormats":b[0][2070]},{"narrow":b[0][2071],"short":b[0][2071],"long":b[0][2072]},{"narrow":b[0][2073],"short":b[0][2074],"long":b[0][2075]},{"narrow":b[0][2076],"short":b[0][2076],"long":b[0][2077]},{"narrow":b[0][15],"short":b[0][2079],"long":b[0][2079]},{"narrow":b[0][15],"short":b[0][2080],"long":b[0][2080]},{"narrow":b[0][2081],"short":b[0][2082],"long":b[0][2083]},{"narrow":b[0][24],"short":b[0][2084],"long":b[0][2084]},{"narrow":b[0][2085],"short":b[0][2085],"long":b[0][2085]},{"narrow":b[0][12],"short":b[0][2086],"long":b[0][2086]},{"narrow":b[0][2087],"short":b[0][2087],"long":b[0][2087]},{"narrow":b[0][12],"short":b[0][2088],"long":b[0][2089]},{"narrow":b[0][2090],"short":b[0][2090],"long":b[0][2091]},{"narrow":b[0][32],"short":b[0][2092],"long":b[0][2092]},{"narrow":b[0][12],"short":b[0][2093],"long":b[0][2093]},{"narrow":b[0][2094],"short":b[0][2094],"long":b[0][2094]},{"narrow":b[0][2095],"short":b[0][2095],"long":b[0][2095]},{"latn":b[0][41],"thai":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1664],"dateFormats":b[0][2097],"timeFormats":b[0][3]},{"narrow":b[0][84],"short":b[0][2098],"long":b[0][2099]},{"narrow":b[0][2100],"short":b[0][2101],"long":b[0][2101]},{"narrow":b[0][92],"short":b[0][92],"long":b[0][92]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1664],"dateFormats":b[0][2103],"timeFormats":b[0][3]},{"narrow":b[0][84],"short":b[0][2104],"long":b[0][2105]},{"narrow":b[0][2100],"short":b[0][2106],"long":b[0][2106]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][2108],"timeFormats":b[0][59]},{"narrow":b[0][2109],"short":b[0][8],"long":b[0][8]},{"latn":b[0][2110]},{"short":a[535],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][2112],"dateFormats":b[0][1223],"timeFormats":b[0][3]},{"narrow":b[0][2113],"short":b[0][2114],"long":b[0][2115]},{"narrow":b[0][2116],"short":b[0][2117],"long":b[0][2118]},{"narrow":b[0][2119],"short":b[0][2119],"long":b[0][2120]},{"latn":b[0][2121]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2123],"dateFormats":b[0][2124],"timeFormats":b[0][59]},{"narrow":b[0][2125],"short":b[0][2126],"long":b[0][2127]},{"narrow":b[0][2128],"short":b[0][2129],"long":b[0][2130]},{"narrow":b[0][15],"short":b[0][2132],"long":b[0][2132]},{"narrow":b[0][15],"short":b[0][2133],"long":b[0][2133]},{"narrow":b[0][2134],"short":b[0][2134],"long":b[0][2135]},{"narrow":b[0][24],"short":b[0][2136],"long":b[0][2136]},{"narrow":b[0][12],"short":b[0][2137],"long":b[0][2137]},{"narrow":b[0][2138],"short":b[0][2138],"long":b[0][2138]},{"narrow":b[0][12],"short":b[0][2139],"long":b[0][2139]},{"decimal":b[0][38],"currency":b[0][159],"percent":b[0][2140]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2123],"dateFormats":b[0][2124],"timeFormats":b[0][3]},{"narrow":b[0][2142],"short":b[0][2143],"long":b[0][2144]},{"narrow":b[0][2145],"short":b[0][2146],"long":b[0][2147]},{"narrow":b[0][2149],"short":b[0][2149],"long":b[0][2150]},{"short":a[11970],"medium":a[11970],"full":a[535],"long":a[535],"availableFormats":b[0][2151],"dateFormats":b[0][2152],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][2153],"long":b[0][2154]},{"narrow":b[0][2155],"short":b[0][2156],"long":b[0][2157]},{"narrow":b[0][10],"short":b[0][10],"long":b[0][2158]},{"narrow":b[0][2160],"short":b[0][2160],"long":b[0][2161]},{"narrow":b[0][12],"short":b[0][2162],"long":b[0][2162]},{"narrow":b[0][2163],"short":b[0][2163],"long":b[0][2163]},{"narrow":b[0][2164],"short":b[0][2164],"long":b[0][2165]},{"short":a[15],"medium":a[15],"full":a[12026],"long":a[12026],"availableFormats":b[0][2167],"dateFormats":b[0][2168],"timeFormats":b[0][59]},{"narrow":b[0][2169],"short":b[0][2170],"long":b[0][2171]},{"narrow":b[0][2172],"short":b[0][2173],"long":b[0][2174]},{"narrow":b[0][15],"short":b[0][2176],"long":b[0][2176]},{"narrow":b[0][2177],"short":b[0][2178],"long":b[0][2179]},{"narrow":b[0][2180],"short":b[0][2181],"long":b[0][2182]},{"narrow":b[0][24],"short":b[0][2183],"long":b[0][2183]},{"narrow":b[0][12],"short":b[0][2184],"long":b[0][2185]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][2186]},{"narrow":b[0][12],"short":b[0][2187],"long":b[0][2187]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2189],"dateFormats":b[0][2190],"timeFormats":b[0][3]},{"narrow":b[0][4],"short":b[0][2191],"long":b[0][2191]},{"narrow":b[0][7],"short":b[0][2192],"long":b[0][2192]},{"narrow":b[0][2194],"short":b[0][2194],"long":b[0][2194]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][2195]},{"arabext":b[0][2196],"latn":b[0][390]},{"short":a[15],"medium":a[15],"full":a[15],"long":a[15],"availableFormats":b[0][2198],"dateFormats":b[0][2199],"timeFormats":b[0][2200]},{"narrow":b[0][2201],"short":b[0][2202],"long":b[0][2203]},{"narrow":b[0][2204],"short":b[0][2205],"long":b[0][2206]},{"narrow":b[0][2208],"short":b[0][2208],"long":b[0][2209]},{"narrow":b[0][12],"short":b[0][29],"long":b[0][2210]},{"latn":b[0][2211]},{"narrow":b[0][12],"short":b[0][2213],"long":b[0][754]},{"narrow":b[0][7],"short":b[0][2214],"long":b[0][734]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][140],"dateFormats":b[0][2215],"timeFormats":b[0][59]},{"narrow":b[0][1306],"short":b[0][2216],"long":b[0][2217]},{"narrow":b[0][2218],"short":b[0][2219],"long":b[0][2220]},{"narrow":b[0][2221],"short":b[0][2221],"long":b[0][2221]},{"narrow":b[0][12],"short":b[0][2223],"long":b[0][2223]},{"narrow":b[0][7],"short":b[0][2224],"long":b[0][2224]},{"latn":b[0][41],"vaii":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][1853],"dateFormats":b[0][150],"timeFormats":b[0][3]},{"narrow":b[0][12],"short":b[0][2225],"long":b[0][2225]},{"narrow":b[0][7],"short":b[0][2226],"long":b[0][2226]},{"short":a[12283],"medium":a[12283],"full":a[3526],"long":a[3526],"availableFormats":b[0][2227],"dateFormats":b[0][2228],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][2229],"long":b[0][2230]},{"narrow":b[0][2231],"short":b[0][2232],"long":b[0][2233]},{"narrow":b[0][2235],"short":b[0][2235],"long":b[0][2235]},{"narrow":b[0][2236],"short":b[0][2236],"long":b[0][2236]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2237],"dateFormats":b[0][2238],"timeFormats":b[0][59]},{"narrow":b[0][2239],"short":b[0][2240],"long":b[0][2241]},{"narrow":b[0][2242],"short":b[0][2243],"long":b[0][2244]},{"narrow":b[0][2245],"short":b[0][2245],"long":b[0][2245]},{"latn":b[0][2246]},{"narrow":b[0][2247],"short":b[0][2248],"long":b[0][2249]},{"narrow":b[0][2251],"short":b[0][2251],"long":b[0][2252]},{"narrow":b[0][12],"short":b[0][2253],"long":b[0][2254]},{"narrow":b[0][2255],"short":b[0][2256],"long":b[0][2257]},{"narrow":b[0][2259],"short":b[0][2259],"long":b[0][2260]},{"short":a[535],"medium":a[15],"full":a[535],"long":a[535],"availableFormats":b[0][2261],"dateFormats":b[0][2262],"timeFormats":b[0][59]},{"narrow":b[0][12],"short":b[0][2263],"long":b[0][2263]},{"narrow":b[0][7],"short":b[0][2264],"long":b[0][2264]},{"narrow":b[0][2266],"short":b[0][2267],"long":b[0][2267]},{"narrow":b[0][12],"short":b[0][2268],"long":b[0][2269]},{"narrow":b[0][7],"short":b[0][2270],"long":b[0][2271]},{"narrow":b[0][2273],"short":b[0][2273],"long":b[0][2274]},{"narrow":b[0][12],"short":b[0][2275],"long":b[0][2276]},{"narrow":b[0][7],"short":b[0][2277],"long":b[0][2278]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2280],"dateFormats":b[0][58],"timeFormats":b[0][59]},{"narrow":b[0][7],"short":b[0][1896],"long":b[0][2281]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2282],"dateFormats":b[0][2283],"timeFormats":b[0][2284]},{"narrow":b[0][12],"short":b[0][1101],"long":b[0][2285]},{"narrow":b[0][2286],"short":b[0][2287],"long":b[0][2288]},{"narrow":b[0][2289],"short":b[0][2289],"long":b[0][2289]},{"narrow":b[0][2291],"short":b[0][2292],"long":b[0][2292]},{"narrow":b[0][15],"short":b[0][2293],"long":b[0][2294]},{"narrow":b[0][2295],"short":b[0][2295],"long":b[0][2295]},{"narrow":b[0][24],"short":b[0][2296],"long":b[0][2297]},{"narrow":b[0][2298],"short":b[0][2298],"long":b[0][2298]},{"narrow":b[0][2299],"short":b[0][2299],"long":b[0][2299]},{"narrow":b[0][2300],"short":b[0][2300],"long":b[0][2300]},{"narrow":b[0][32],"short":b[0][2301],"long":b[0][2301]},{"narrow":b[0][2302],"short":b[0][2302],"long":b[0][2302]},{"hanidec":b[0][41],"latn":b[0][41]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2304],"dateFormats":b[0][2305],"timeFormats":b[0][2284]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2307],"dateFormats":b[0][2305],"timeFormats":b[0][2284]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2309],"dateFormats":b[0][2310],"timeFormats":b[0][2284]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2312],"dateFormats":b[0][2313],"timeFormats":b[0][2314]},{"narrow":b[0][2286],"short":b[0][2315],"long":b[0][2288]},{"narrow":b[0][2316],"short":b[0][2316],"long":b[0][2316]},{"narrow":b[0][2317],"short":b[0][2318],"long":b[0][2318]},{"narrow":b[0][15],"short":b[0][2293],"long":b[0][2293]},{"narrow":b[0][2319],"short":b[0][2319],"long":b[0][2319]},{"narrow":b[0][24],"short":b[0][2320],"long":b[0][2320]},{"narrow":b[0][2321],"short":b[0][2321],"long":b[0][2321]},{"narrow":b[0][12],"short":b[0][2322],"long":b[0][2322]},{"narrow":b[0][2323],"short":b[0][2323],"long":b[0][2323]},{"narrow":b[0][12],"short":b[0][2324],"long":b[0][2324]},{"narrow":b[0][2325],"short":b[0][2325],"long":b[0][2325]},{"narrow":b[0][32],"short":b[0][2326],"long":b[0][2326]},{"narrow":b[0][2327],"short":b[0][2327],"long":b[0][2327]},{"narrow":b[0][2328],"short":b[0][2328],"long":b[0][2328]},{"hanidec":b[0][2329],"latn":b[0][2329]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2331],"dateFormats":b[0][2332],"timeFormats":b[0][2314]},{"narrow":b[0][2319],"short":b[0][2333],"long":b[0][2333]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][2335],"dateFormats":b[0][2],"timeFormats":b[0][3]},{"narrow":b[0][2336],"short":b[0][2337],"long":b[0][2338]},{"narrow":b[0][2339],"short":b[0][2340],"long":b[0][2341]}];b[2]=[{"months":b[1][1],"days":b[1][2],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][4],"days":b[1][2],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][2],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][1],"days":b[1][2],"eras":b[1][10],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][2],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][2],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][2],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][1],"days":b[1][2],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][2],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][1],"days":b[1][2],"eras":b[1][20],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][42]},{"months":b[1][24],"days":b[1][25],"eras":b[1][3],"dayPeriods":b[0][50]},{"months":b[1][9],"days":b[1][25],"dayPeriods":b[0][50]},{"months":b[1][5],"days":b[1][25],"eras":b[1][6],"dayPeriods":b[0][50]},{"months":b[1][7],"days":b[1][25],"eras":b[1][6],"dayPeriods":b[0][50]},{"months":b[1][7],"days":b[1][25],"eras":b[1][8],"dayPeriods":b[0][50]},{"months":b[1][9],"days":b[1][25],"eras":b[1][6],"dayPeriods":b[0][50]},{"months":b[1][24],"days":b[1][25],"eras":b[1][26],"dayPeriods":b[0][50]},{"months":b[1][11],"days":b[1][25],"eras":b[1][12],"dayPeriods":b[0][50]},{"months":b[1][13],"days":b[1][25],"eras":b[1][14],"dayPeriods":b[0][50]},{"months":b[1][15],"days":b[1][25],"eras":b[1][16],"dayPeriods":b[0][50]},{"months":b[1][24],"days":b[1][25],"eras":b[1][17],"dayPeriods":b[0][50]},{"months":b[1][18],"days":b[1][25],"eras":b[1][19],"dayPeriods":b[0][50]},{"months":b[1][24],"days":b[1][25],"eras":b[1][27],"dayPeriods":b[0][50]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][28],"currencies":b[0][55]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][28],"currencies":b[0][56]},{"months":b[1][30],"days":b[1][31],"eras":b[1][3],"dayPeriods":b[0][66]},{"months":b[1][9],"days":b[1][31],"dayPeriods":b[0][66]},{"months":b[1][5],"days":b[1][31],"eras":b[1][6],"dayPeriods":b[0][66]},{"months":b[1][7],"days":b[1][31],"eras":b[1][6],"dayPeriods":b[0][66]},{"months":b[1][7],"days":b[1][31],"eras":b[1][8],"dayPeriods":b[0][66]},{"months":b[1][9],"days":b[1][31],"eras":b[1][6],"dayPeriods":b[0][66]},{"months":b[1][30],"days":b[1][31],"eras":b[1][32],"dayPeriods":b[0][66]},{"months":b[1][11],"days":b[1][31],"eras":b[1][12],"dayPeriods":b[0][66]},{"months":b[1][13],"days":b[1][31],"eras":b[1][14],"dayPeriods":b[0][66]},{"months":b[1][15],"days":b[1][31],"eras":b[1][16],"dayPeriods":b[0][66]},{"months":b[1][30],"days":b[1][31],"eras":b[1][17],"dayPeriods":b[0][66]},{"months":b[1][18],"days":b[1][31],"eras":b[1][19],"dayPeriods":b[0][66]},{"months":b[1][30],"days":b[1][31],"eras":b[1][27],"dayPeriods":b[0][66]},{"nu":b[0][37],"patterns":b[1][33],"symbols":b[1][28],"currencies":b[0][70]},{"months":b[1][35],"days":b[1][36],"eras":b[1][3],"dayPeriods":b[0][78]},{"months":b[1][9],"days":b[1][36],"dayPeriods":b[0][78]},{"months":b[1][5],"days":b[1][36],"eras":b[1][6],"dayPeriods":b[0][78]},{"months":b[1][7],"days":b[1][36],"eras":b[1][6],"dayPeriods":b[0][78]},{"months":b[1][7],"days":b[1][36],"eras":b[1][8],"dayPeriods":b[0][78]},{"months":b[1][9],"days":b[1][36],"eras":b[1][6],"dayPeriods":b[0][78]},{"months":b[1][35],"days":b[1][36],"eras":b[1][37],"dayPeriods":b[0][78]},{"months":b[1][11],"days":b[1][36],"eras":b[1][12],"dayPeriods":b[0][78]},{"months":b[1][13],"days":b[1][36],"eras":b[1][14],"dayPeriods":b[0][78]},{"months":b[1][15],"days":b[1][36],"eras":b[1][16],"dayPeriods":b[0][78]},{"months":b[1][35],"days":b[1][36],"eras":b[1][17],"dayPeriods":b[0][78]},{"months":b[1][18],"days":b[1][36],"eras":b[1][19],"dayPeriods":b[0][78]},{"months":b[1][35],"days":b[1][36],"eras":b[1][27],"dayPeriods":b[0][78]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][81]},{"months":b[1][39],"days":b[1][40],"eras":b[1][3],"dayPeriods":b[0][90]},{"months":b[1][9],"days":b[1][40],"dayPeriods":b[0][90]},{"months":b[1][5],"days":b[1][40],"eras":b[1][6],"dayPeriods":b[0][90]},{"months":b[1][41],"days":b[1][40],"eras":b[1][6],"dayPeriods":b[0][90]},{"months":b[1][41],"days":b[1][40],"eras":b[1][8],"dayPeriods":b[0][90]},{"months":b[1][9],"days":b[1][40],"eras":b[1][6],"dayPeriods":b[0][90]},{"months":b[1][39],"days":b[1][40],"eras":b[1][42],"dayPeriods":b[0][90]},{"months":b[1][11],"days":b[1][40],"eras":b[1][12],"dayPeriods":b[0][90]},{"months":b[1][13],"days":b[1][40],"eras":b[1][14],"dayPeriods":b[0][90]},{"months":b[1][15],"days":b[1][40],"eras":b[1][16],"dayPeriods":b[0][90]},{"months":b[1][39],"days":b[1][40],"eras":b[1][17],"dayPeriods":b[0][90]},{"months":b[1][18],"days":b[1][40],"eras":b[1][19],"dayPeriods":b[0][90]},{"months":b[1][39],"days":b[1][40],"eras":b[1][27],"dayPeriods":b[0][90]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][94]},{"months":b[1][44],"days":b[1][45],"eras":b[1][46],"dayPeriods":b[0][102]},{"months":b[1][9],"days":b[1][45],"dayPeriods":b[0][102]},{"months":b[1][47],"days":b[1][45],"eras":b[1][6],"dayPeriods":b[0][102]},{"months":b[1][48],"days":b[1][45],"eras":b[1][6],"dayPeriods":b[0][102]},{"months":b[1][48],"days":b[1][45],"eras":b[1][8],"dayPeriods":b[0][102]},{"months":b[1][9],"days":b[1][45],"eras":b[1][6],"dayPeriods":b[0][102]},{"months":b[1][44],"days":b[1][45],"eras":b[1][49],"dayPeriods":b[0][102]},{"months":b[1][50],"days":b[1][45],"eras":b[1][51],"dayPeriods":b[0][102]},{"months":b[1][13],"days":b[1][45],"eras":b[1][14],"dayPeriods":b[0][102]},{"months":b[1][52],"days":b[1][45],"eras":b[1][53],"dayPeriods":b[0][102]},{"months":b[1][44],"days":b[1][45],"eras":b[1][54],"dayPeriods":b[0][102]},{"months":b[1][55],"days":b[1][45],"eras":b[1][56],"dayPeriods":b[0][102]},{"months":b[1][44],"days":b[1][45],"eras":b[1][57],"dayPeriods":b[0][102]},{"nu":b[0][117],"patterns":b[1][58],"symbols":b[1][59],"currencies":b[0][121]},{"months":b[1][44],"days":b[1][45],"eras":b[1][60],"dayPeriods":b[0][102]},{"nu":b[0][117],"patterns":b[1][58],"symbols":b[1][59],"currencies":b[0][124]},{"months":b[1][61],"days":b[1][45],"eras":b[1][46],"dayPeriods":b[0][102]},{"months":b[1][61],"days":b[1][45],"eras":b[1][49],"dayPeriods":b[0][102]},{"months":b[1][61],"days":b[1][45],"eras":b[1][54],"dayPeriods":b[0][102]},{"months":b[1][61],"days":b[1][45],"eras":b[1][57],"dayPeriods":b[0][102]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][62],"currencies":b[0][121]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][59],"currencies":b[0][121]},{"nu":b[0][117],"patterns":b[1][58],"symbols":b[1][59],"currencies":b[0][128]},{"months":b[1][64],"days":b[1][45],"eras":b[1][46],"dayPeriods":b[0][102]},{"months":b[1][64],"days":b[1][45],"eras":b[1][49],"dayPeriods":b[0][102]},{"months":b[1][64],"days":b[1][45],"eras":b[1][54],"dayPeriods":b[0][102]},{"months":b[1][64],"days":b[1][45],"eras":b[1][57],"dayPeriods":b[0][102]},{"months":b[1][65],"days":b[1][45],"eras":b[1][46],"dayPeriods":b[0][102]},{"months":b[1][65],"days":b[1][45],"eras":b[1][49],"dayPeriods":b[0][102]},{"months":b[1][65],"days":b[1][45],"eras":b[1][54],"dayPeriods":b[0][102]},{"months":b[1][65],"days":b[1][45],"eras":b[1][57],"dayPeriods":b[0][102]},{"nu":b[0][117],"patterns":b[1][58],"symbols":b[1][62],"currencies":b[0][133]},{"months":b[1][67],"days":b[1][45],"eras":b[1][46],"dayPeriods":b[0][102]},{"months":b[1][67],"days":b[1][45],"eras":b[1][49],"dayPeriods":b[0][102]},{"months":b[1][67],"days":b[1][45],"eras":b[1][54],"dayPeriods":b[0][102]},{"months":b[1][67],"days":b[1][45],"eras":b[1][57],"dayPeriods":b[0][102]},{"months":b[1][68],"days":b[1][45],"eras":b[1][46],"dayPeriods":b[0][102]},{"months":b[1][68],"days":b[1][45],"eras":b[1][49],"dayPeriods":b[0][102]},{"months":b[1][68],"days":b[1][45],"eras":b[1][54],"dayPeriods":b[0][102]},{"months":b[1][68],"days":b[1][45],"eras":b[1][57],"dayPeriods":b[0][102]},{"nu":b[0][117],"patterns":b[1][58],"symbols":b[1][62],"currencies":b[0][121]},{"nu":b[0][117],"patterns":b[1][58],"symbols":b[1][59],"currencies":b[0][138]},{"nu":b[0][117],"patterns":b[1][58],"symbols":b[1][59],"currencies":b[0][139]},{"months":b[1][70],"days":b[1][71],"eras":b[1][3],"dayPeriods":b[0][146]},{"months":b[1][9],"days":b[1][71],"dayPeriods":b[0][146]},{"months":b[1][5],"days":b[1][71],"eras":b[1][6],"dayPeriods":b[0][146]},{"months":b[1][7],"days":b[1][71],"eras":b[1][6],"dayPeriods":b[0][146]},{"months":b[1][7],"days":b[1][71],"eras":b[1][8],"dayPeriods":b[0][146]},{"months":b[1][9],"days":b[1][71],"eras":b[1][6],"dayPeriods":b[0][146]},{"months":b[1][70],"days":b[1][71],"eras":b[1][72],"dayPeriods":b[0][146]},{"months":b[1][11],"days":b[1][71],"eras":b[1][12],"dayPeriods":b[0][146]},{"months":b[1][13],"days":b[1][71],"eras":b[1][14],"dayPeriods":b[0][146]},{"months":b[1][15],"days":b[1][71],"eras":b[1][16],"dayPeriods":b[0][146]},{"months":b[1][70],"days":b[1][71],"eras":b[1][17],"dayPeriods":b[0][146]},{"months":b[1][18],"days":b[1][71],"eras":b[1][19],"dayPeriods":b[0][146]},{"months":b[1][70],"days":b[1][71],"eras":b[1][27],"dayPeriods":b[0][146]},{"nu":b[0][148],"patterns":b[1][73],"symbols":b[1][74],"currencies":b[0][70]},{"months":b[1][76],"days":b[1][77],"eras":b[1][3],"dayPeriods":b[0][156]},{"months":b[1][9],"days":b[1][77],"dayPeriods":b[0][156]},{"months":b[1][5],"days":b[1][77],"eras":b[1][6],"dayPeriods":b[0][156]},{"months":b[1][7],"days":b[1][77],"eras":b[1][6],"dayPeriods":b[0][156]},{"months":b[1][7],"days":b[1][77],"eras":b[1][8],"dayPeriods":b[0][156]},{"months":b[1][9],"days":b[1][77],"eras":b[1][6],"dayPeriods":b[0][156]},{"months":b[1][76],"days":b[1][77],"eras":b[1][78],"dayPeriods":b[0][156]},{"months":b[1][11],"days":b[1][77],"eras":b[1][12],"dayPeriods":b[0][156]},{"months":b[1][13],"days":b[1][77],"eras":b[1][14],"dayPeriods":b[0][156]},{"months":b[1][15],"days":b[1][77],"eras":b[1][16],"dayPeriods":b[0][156]},{"months":b[1][76],"days":b[1][77],"eras":b[1][17],"dayPeriods":b[0][156]},{"months":b[1][18],"days":b[1][77],"eras":b[1][19],"dayPeriods":b[0][156]},{"months":b[1][76],"days":b[1][77],"eras":b[1][27],"dayPeriods":b[0][156]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][22],"currencies":b[0][160]},{"months":b[1][81],"days":b[1][82],"eras":b[1][83],"dayPeriods":b[0][171]},{"months":b[1][84],"days":b[1][82],"dayPeriods":b[0][171]},{"months":b[1][5],"days":b[1][82],"eras":b[1][6],"dayPeriods":b[0][171]},{"months":b[1][85],"days":b[1][82],"eras":b[1][86],"dayPeriods":b[0][171]},{"months":b[1][85],"days":b[1][82],"eras":b[1][8],"dayPeriods":b[0][171]},{"months":b[1][9],"days":b[1][82],"eras":b[1][6],"dayPeriods":b[0][171]},{"months":b[1][81],"days":b[1][82],"eras":b[1][87],"dayPeriods":b[0][171]},{"months":b[1][11],"days":b[1][82],"eras":b[1][12],"dayPeriods":b[0][171]},{"months":b[1][13],"days":b[1][82],"eras":b[1][14],"dayPeriods":b[0][171]},{"months":b[1][15],"days":b[1][82],"eras":b[1][16],"dayPeriods":b[0][171]},{"months":b[1][81],"days":b[1][82],"eras":b[1][88],"dayPeriods":b[0][171]},{"months":b[1][18],"days":b[1][82],"eras":b[1][19],"dayPeriods":b[0][171]},{"months":b[1][81],"days":b[1][82],"eras":b[1][89],"dayPeriods":b[0][171]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][90],"currencies":b[0][188]},{"months":b[1][92],"days":b[1][93],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][93],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][93],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][93],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][93],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][93],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][92],"days":b[1][93],"eras":b[1][94],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][93],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][93],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][93],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][92],"days":b[1][93],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][93],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][92],"days":b[1][93],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][199]},{"months":b[1][9],"days":b[1][96],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][96],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][96],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][96],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][96],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][96],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][96],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][96],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][96],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][96],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][96],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][96],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][96],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][22],"currencies":b[0][70]},{"months":b[1][98],"days":b[1][99],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][99],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][99],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][99],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][99],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][99],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][98],"days":b[1][99],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][99],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][99],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][99],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][98],"days":b[1][99],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][99],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][98],"days":b[1][99],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][204]},{"months":b[1][101],"days":b[1][102],"eras":b[1][3],"dayPeriods":b[0][212]},{"months":b[1][9],"days":b[1][102],"dayPeriods":b[0][212]},{"months":b[1][5],"days":b[1][102],"eras":b[1][6],"dayPeriods":b[0][212]},{"months":b[1][7],"days":b[1][102],"eras":b[1][6],"dayPeriods":b[0][212]},{"months":b[1][7],"days":b[1][102],"eras":b[1][8],"dayPeriods":b[0][212]},{"months":b[1][9],"days":b[1][102],"eras":b[1][6],"dayPeriods":b[0][212]},{"months":b[1][101],"days":b[1][102],"eras":b[1][103],"dayPeriods":b[0][212]},{"months":b[1][11],"days":b[1][102],"eras":b[1][12],"dayPeriods":b[0][212]},{"months":b[1][13],"days":b[1][102],"eras":b[1][14],"dayPeriods":b[0][212]},{"months":b[1][15],"days":b[1][102],"eras":b[1][16],"dayPeriods":b[0][212]},{"months":b[1][101],"days":b[1][102],"eras":b[1][17],"dayPeriods":b[0][212]},{"months":b[1][18],"days":b[1][102],"eras":b[1][19],"dayPeriods":b[0][212]},{"months":b[1][101],"days":b[1][102],"eras":b[1][27],"dayPeriods":b[0][212]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][70]},{"months":b[1][106],"days":b[1][107],"eras":b[1][3],"dayPeriods":b[0][225]},{"months":b[1][9],"days":b[1][107],"dayPeriods":b[0][225]},{"months":b[1][5],"days":b[1][107],"eras":b[1][6],"dayPeriods":b[0][225]},{"months":b[1][7],"days":b[1][107],"eras":b[1][6],"dayPeriods":b[0][225]},{"months":b[1][7],"days":b[1][107],"eras":b[1][8],"dayPeriods":b[0][225]},{"months":b[1][9],"days":b[1][107],"eras":b[1][6],"dayPeriods":b[0][225]},{"months":b[1][106],"days":b[1][107],"eras":b[1][108],"dayPeriods":b[0][225]},{"months":b[1][11],"days":b[1][107],"eras":b[1][12],"dayPeriods":b[0][225]},{"months":b[1][13],"days":b[1][107],"eras":b[1][14],"dayPeriods":b[0][225]},{"months":b[1][15],"days":b[1][107],"eras":b[1][16],"dayPeriods":b[0][225]},{"months":b[1][106],"days":b[1][107],"eras":b[1][17],"dayPeriods":b[0][225]},{"months":b[1][18],"days":b[1][107],"eras":b[1][19],"dayPeriods":b[0][225]},{"months":b[1][106],"days":b[1][107],"eras":b[1][27],"dayPeriods":b[0][225]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][228]},{"months":b[1][110],"days":b[1][111],"eras":b[1][3],"dayPeriods":b[0][233]},{"months":b[1][9],"days":b[1][111],"dayPeriods":b[0][233]},{"months":b[1][5],"days":b[1][111],"eras":b[1][6],"dayPeriods":b[0][233]},{"months":b[1][7],"days":b[1][111],"eras":b[1][6],"dayPeriods":b[0][233]},{"months":b[1][7],"days":b[1][111],"eras":b[1][8],"dayPeriods":b[0][233]},{"months":b[1][9],"days":b[1][111],"eras":b[1][6],"dayPeriods":b[0][233]},{"months":b[1][110],"days":b[1][111],"eras":b[1][112],"dayPeriods":b[0][233]},{"months":b[1][11],"days":b[1][111],"eras":b[1][12],"dayPeriods":b[0][233]},{"months":b[1][13],"days":b[1][111],"eras":b[1][14],"dayPeriods":b[0][233]},{"months":b[1][15],"days":b[1][111],"eras":b[1][16],"dayPeriods":b[0][233]},{"months":b[1][110],"days":b[1][111],"eras":b[1][17],"dayPeriods":b[0][233]},{"months":b[1][18],"days":b[1][111],"eras":b[1][19],"dayPeriods":b[0][233]},{"months":b[1][110],"days":b[1][111],"eras":b[1][27],"dayPeriods":b[0][233]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][235]},{"months":b[1][113],"days":b[1][114],"eras":b[1][3],"dayPeriods":b[0][242]},{"months":b[1][9],"days":b[1][114],"dayPeriods":b[0][242]},{"months":b[1][5],"days":b[1][114],"eras":b[1][6],"dayPeriods":b[0][242]},{"months":b[1][7],"days":b[1][114],"eras":b[1][6],"dayPeriods":b[0][242]},{"months":b[1][7],"days":b[1][114],"eras":b[1][8],"dayPeriods":b[0][242]},{"months":b[1][9],"days":b[1][114],"eras":b[1][6],"dayPeriods":b[0][242]},{"months":b[1][113],"days":b[1][114],"eras":b[1][115],"dayPeriods":b[0][242]},{"months":b[1][11],"days":b[1][114],"eras":b[1][12],"dayPeriods":b[0][242]},{"months":b[1][13],"days":b[1][114],"eras":b[1][14],"dayPeriods":b[0][242]},{"months":b[1][15],"days":b[1][114],"eras":b[1][16],"dayPeriods":b[0][242]},{"months":b[1][113],"days":b[1][114],"eras":b[1][17],"dayPeriods":b[0][242]},{"months":b[1][18],"days":b[1][114],"eras":b[1][19],"dayPeriods":b[0][242]},{"months":b[1][113],"days":b[1][114],"eras":b[1][27],"dayPeriods":b[0][242]},{"nu":b[0][37],"patterns":b[1][33],"symbols":b[1][22],"currencies":b[0][160]},{"months":b[1][117],"days":b[1][118],"eras":b[1][3],"dayPeriods":b[0][252]},{"months":b[1][9],"days":b[1][118],"dayPeriods":b[0][252]},{"months":b[1][5],"days":b[1][118],"eras":b[1][6],"dayPeriods":b[0][252]},{"months":b[1][7],"days":b[1][118],"eras":b[1][6],"dayPeriods":b[0][252]},{"months":b[1][7],"days":b[1][118],"eras":b[1][8],"dayPeriods":b[0][252]},{"months":b[1][9],"days":b[1][118],"eras":b[1][6],"dayPeriods":b[0][252]},{"months":b[1][117],"days":b[1][118],"eras":b[1][119],"dayPeriods":b[0][252]},{"months":b[1][120],"days":b[1][118],"eras":b[1][12],"dayPeriods":b[0][252]},{"months":b[1][121],"days":b[1][118],"eras":b[1][14],"dayPeriods":b[0][252]},{"months":b[1][122],"days":b[1][118],"eras":b[1][16],"dayPeriods":b[0][252]},{"months":b[1][117],"days":b[1][118],"eras":b[1][17],"dayPeriods":b[0][252]},{"months":b[1][18],"days":b[1][118],"eras":b[1][19],"dayPeriods":b[0][252]},{"months":b[1][117],"days":b[1][118],"eras":b[1][27],"dayPeriods":b[0][252]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][258]},{"months":b[1][124],"days":b[1][125],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][125],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][125],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][125],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][125],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][125],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][124],"days":b[1][125],"eras":b[1][126],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][125],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][125],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][125],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][124],"days":b[1][125],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][125],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][124],"days":b[1][125],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][70]},{"months":b[1][128],"days":b[1][129],"eras":b[1][3],"dayPeriods":b[0][275]},{"months":b[1][9],"days":b[1][129],"dayPeriods":b[0][275]},{"months":b[1][5],"days":b[1][129],"eras":b[1][6],"dayPeriods":b[0][275]},{"months":b[1][7],"days":b[1][129],"eras":b[1][6],"dayPeriods":b[0][275]},{"months":b[1][7],"days":b[1][129],"eras":b[1][8],"dayPeriods":b[0][275]},{"months":b[1][9],"days":b[1][129],"eras":b[1][6],"dayPeriods":b[0][275]},{"months":b[1][128],"days":b[1][129],"eras":b[1][130],"dayPeriods":b[0][275]},{"months":b[1][11],"days":b[1][129],"eras":b[1][12],"dayPeriods":b[0][275]},{"months":b[1][131],"days":b[1][129],"eras":b[1][132],"dayPeriods":b[0][275]},{"months":b[1][133],"days":b[1][129],"eras":b[1][134],"dayPeriods":b[0][275]},{"months":b[1][128],"days":b[1][129],"eras":b[1][17],"dayPeriods":b[0][275]},{"months":b[1][18],"days":b[1][129],"eras":b[1][19],"dayPeriods":b[0][275]},{"months":b[1][128],"days":b[1][129],"eras":b[1][27],"dayPeriods":b[0][275]},{"nu":b[0][148],"patterns":b[1][135],"symbols":b[1][136],"currencies":b[0][283]},{"months":b[1][138],"days":b[1][139],"eras":b[1][3],"dayPeriods":b[0][291]},{"months":b[1][9],"days":b[1][139],"dayPeriods":b[0][291]},{"months":b[1][5],"days":b[1][139],"eras":b[1][6],"dayPeriods":b[0][291]},{"months":b[1][7],"days":b[1][139],"eras":b[1][6],"dayPeriods":b[0][291]},{"months":b[1][7],"days":b[1][139],"eras":b[1][8],"dayPeriods":b[0][291]},{"months":b[1][9],"days":b[1][139],"eras":b[1][6],"dayPeriods":b[0][291]},{"months":b[1][138],"days":b[1][139],"eras":b[1][140],"dayPeriods":b[0][291]},{"months":b[1][11],"days":b[1][139],"eras":b[1][12],"dayPeriods":b[0][291]},{"months":b[1][13],"days":b[1][139],"eras":b[1][14],"dayPeriods":b[0][291]},{"months":b[1][15],"days":b[1][139],"eras":b[1][16],"dayPeriods":b[0][291]},{"months":b[1][138],"days":b[1][139],"eras":b[1][17],"dayPeriods":b[0][291]},{"months":b[1][18],"days":b[1][139],"eras":b[1][19],"dayPeriods":b[0][291]},{"months":b[1][138],"days":b[1][139],"eras":b[1][27],"dayPeriods":b[0][291]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][141],"currencies":b[0][294]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][141],"currencies":b[0][70]},{"months":b[1][143],"days":b[1][144],"eras":b[1][3],"dayPeriods":b[0][302]},{"months":b[1][9],"days":b[1][144],"dayPeriods":b[0][302]},{"months":b[1][5],"days":b[1][144],"eras":b[1][6],"dayPeriods":b[0][302]},{"months":b[1][7],"days":b[1][144],"eras":b[1][6],"dayPeriods":b[0][302]},{"months":b[1][7],"days":b[1][144],"eras":b[1][8],"dayPeriods":b[0][302]},{"months":b[1][9],"days":b[1][144],"eras":b[1][6],"dayPeriods":b[0][302]},{"months":b[1][143],"days":b[1][144],"eras":b[1][145],"dayPeriods":b[0][302]},{"months":b[1][11],"days":b[1][144],"eras":b[1][12],"dayPeriods":b[0][302]},{"months":b[1][13],"days":b[1][144],"eras":b[1][14],"dayPeriods":b[0][302]},{"months":b[1][15],"days":b[1][144],"eras":b[1][16],"dayPeriods":b[0][302]},{"months":b[1][143],"days":b[1][144],"eras":b[1][17],"dayPeriods":b[0][302]},{"months":b[1][18],"days":b[1][144],"eras":b[1][19],"dayPeriods":b[0][302]},{"months":b[1][143],"days":b[1][144],"eras":b[1][146],"dayPeriods":b[0][302]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][307]},{"months":b[1][148],"days":b[1][149],"eras":b[1][3],"dayPeriods":b[0][314]},{"months":b[1][9],"days":b[1][149],"dayPeriods":b[0][314]},{"months":b[1][5],"days":b[1][149],"eras":b[1][6],"dayPeriods":b[0][314]},{"months":b[1][7],"days":b[1][149],"eras":b[1][6],"dayPeriods":b[0][314]},{"months":b[1][7],"days":b[1][149],"eras":b[1][8],"dayPeriods":b[0][314]},{"months":b[1][9],"days":b[1][149],"eras":b[1][6],"dayPeriods":b[0][314]},{"months":b[1][148],"days":b[1][149],"eras":b[1][150],"dayPeriods":b[0][314]},{"months":b[1][11],"days":b[1][149],"eras":b[1][12],"dayPeriods":b[0][314]},{"months":b[1][151],"days":b[1][149],"eras":b[1][14],"dayPeriods":b[0][314]},{"months":b[1][15],"days":b[1][149],"eras":b[1][16],"dayPeriods":b[0][314]},{"months":b[1][148],"days":b[1][149],"eras":b[1][17],"dayPeriods":b[0][314]},{"months":b[1][18],"days":b[1][149],"eras":b[1][19],"dayPeriods":b[0][314]},{"months":b[1][148],"days":b[1][149],"eras":b[1][27],"dayPeriods":b[0][314]},{"nu":b[0][37],"patterns":b[1][73],"symbols":b[1][152],"currencies":b[0][70]},{"months":b[1][154],"days":b[1][155],"eras":b[1][3],"dayPeriods":b[0][325]},{"months":b[1][9],"days":b[1][155],"dayPeriods":b[0][325]},{"months":b[1][5],"days":b[1][155],"eras":b[1][6],"dayPeriods":b[0][325]},{"months":b[1][7],"days":b[1][155],"eras":b[1][6],"dayPeriods":b[0][325]},{"months":b[1][7],"days":b[1][155],"eras":b[1][8],"dayPeriods":b[0][325]},{"months":b[1][9],"days":b[1][155],"eras":b[1][6],"dayPeriods":b[0][325]},{"months":b[1][154],"days":b[1][155],"eras":b[1][156],"dayPeriods":b[0][325]},{"months":b[1][11],"days":b[1][155],"eras":b[1][12],"dayPeriods":b[0][325]},{"months":b[1][13],"days":b[1][155],"eras":b[1][14],"dayPeriods":b[0][325]},{"months":b[1][15],"days":b[1][155],"eras":b[1][16],"dayPeriods":b[0][325]},{"months":b[1][154],"days":b[1][155],"eras":b[1][17],"dayPeriods":b[0][325]},{"months":b[1][18],"days":b[1][155],"eras":b[1][19],"dayPeriods":b[0][325]},{"months":b[1][154],"days":b[1][155],"eras":b[1][27],"dayPeriods":b[0][325]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][328]},{"months":b[1][158],"days":b[1][159],"eras":b[1][160],"dayPeriods":b[0][338]},{"months":b[1][9],"days":b[1][159],"dayPeriods":b[0][338]},{"months":b[1][161],"days":b[1][159],"eras":b[1][6],"dayPeriods":b[0][338]},{"months":b[1][162],"days":b[1][159],"eras":b[1][6],"dayPeriods":b[0][338]},{"months":b[1][162],"days":b[1][159],"eras":b[1][8],"dayPeriods":b[0][338]},{"months":b[1][9],"days":b[1][159],"eras":b[1][6],"dayPeriods":b[0][338]},{"months":b[1][158],"days":b[1][159],"eras":b[1][163],"dayPeriods":b[0][338]},{"months":b[1][164],"days":b[1][159],"eras":b[1][12],"dayPeriods":b[0][338]},{"months":b[1][165],"days":b[1][159],"eras":b[1][166],"dayPeriods":b[0][338]},{"months":b[1][167],"days":b[1][159],"eras":b[1][168],"dayPeriods":b[0][338]},{"months":b[1][158],"days":b[1][159],"eras":b[1][169],"dayPeriods":b[0][338]},{"months":b[1][170],"days":b[1][159],"eras":b[1][19],"dayPeriods":b[0][338]},{"months":b[1][158],"days":b[1][159],"eras":b[1][171],"dayPeriods":b[0][338]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][352]},{"months":b[1][173],"days":b[1][174],"eras":b[1][175],"dayPeriods":b[0][361]},{"months":b[1][176],"days":b[1][174],"dayPeriods":b[0][361]},{"months":b[1][5],"days":b[1][174],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][7],"days":b[1][174],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][7],"days":b[1][174],"eras":b[1][8],"dayPeriods":b[0][361]},{"months":b[1][9],"days":b[1][174],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][173],"days":b[1][174],"eras":b[1][177],"dayPeriods":b[0][361]},{"months":b[1][11],"days":b[1][174],"eras":b[1][12],"dayPeriods":b[0][361]},{"months":b[1][13],"days":b[1][174],"eras":b[1][14],"dayPeriods":b[0][361]},{"months":b[1][15],"days":b[1][174],"eras":b[1][16],"dayPeriods":b[0][361]},{"months":b[1][173],"days":b[1][174],"eras":b[1][17],"dayPeriods":b[0][361]},{"months":b[1][18],"days":b[1][174],"eras":b[1][19],"dayPeriods":b[0][361]},{"months":b[1][173],"days":b[1][174],"eras":b[1][27],"dayPeriods":b[0][361]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][364]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][365]},{"months":b[1][178],"days":b[1][179],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][179],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][179],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][179],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][179],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][179],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][178],"days":b[1][179],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][179],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][179],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][179],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][178],"days":b[1][179],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][179],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][178],"days":b[1][179],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][180],"currencies":b[0][370]},{"months":b[1][181],"days":b[1][182],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][182],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][182],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][182],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][182],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][182],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][181],"days":b[1][182],"eras":b[1][183],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][182],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][182],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][182],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][181],"days":b[1][182],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][182],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][181],"days":b[1][182],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][377]},{"months":b[1][185],"days":b[1][186],"eras":b[1][3],"dayPeriods":b[0][385]},{"months":b[1][9],"days":b[1][186],"dayPeriods":b[0][385]},{"months":b[1][5],"days":b[1][186],"eras":b[1][6],"dayPeriods":b[0][385]},{"months":b[1][7],"days":b[1][186],"eras":b[1][6],"dayPeriods":b[0][385]},{"months":b[1][7],"days":b[1][186],"eras":b[1][8],"dayPeriods":b[0][385]},{"months":b[1][9],"days":b[1][186],"eras":b[1][6],"dayPeriods":b[0][385]},{"months":b[1][185],"days":b[1][186],"eras":b[1][187],"dayPeriods":b[0][385]},{"months":b[1][11],"days":b[1][186],"eras":b[1][12],"dayPeriods":b[0][385]},{"months":b[1][13],"days":b[1][186],"eras":b[1][14],"dayPeriods":b[0][385]},{"months":b[1][15],"days":b[1][186],"eras":b[1][16],"dayPeriods":b[0][385]},{"months":b[1][185],"days":b[1][186],"eras":b[1][17],"dayPeriods":b[0][385]},{"months":b[1][18],"days":b[1][186],"eras":b[1][19],"dayPeriods":b[0][385]},{"months":b[1][185],"days":b[1][186],"eras":b[1][27],"dayPeriods":b[0][385]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][388]},{"nu":b[0][117],"patterns":b[1][58],"symbols":b[1][188],"currencies":b[0][70]},{"months":b[1][190],"days":b[1][191],"eras":b[1][3],"dayPeriods":b[0][398]},{"months":b[1][9],"days":b[1][191],"dayPeriods":b[0][398]},{"months":b[1][5],"days":b[1][191],"eras":b[1][6],"dayPeriods":b[0][398]},{"months":b[1][7],"days":b[1][191],"eras":b[1][6],"dayPeriods":b[0][398]},{"months":b[1][7],"days":b[1][191],"eras":b[1][8],"dayPeriods":b[0][398]},{"months":b[1][9],"days":b[1][191],"eras":b[1][6],"dayPeriods":b[0][398]},{"months":b[1][190],"days":b[1][191],"eras":b[1][192],"dayPeriods":b[0][398]},{"months":b[1][11],"days":b[1][191],"eras":b[1][12],"dayPeriods":b[0][398]},{"months":b[1][13],"days":b[1][191],"eras":b[1][14],"dayPeriods":b[0][398]},{"months":b[1][15],"days":b[1][191],"eras":b[1][16],"dayPeriods":b[0][398]},{"months":b[1][190],"days":b[1][191],"eras":b[1][17],"dayPeriods":b[0][398]},{"months":b[1][18],"days":b[1][191],"eras":b[1][19],"dayPeriods":b[0][398]},{"months":b[1][190],"days":b[1][191],"eras":b[1][193],"dayPeriods":b[0][398]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][402]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][22],"currencies":b[0][370]},{"months":b[1][195],"days":b[1][196],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][196],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][196],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][196],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][196],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][196],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][195],"days":b[1][196],"eras":b[1][197],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][196],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][196],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][196],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][195],"days":b[1][196],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][196],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][195],"days":b[1][196],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][414]},{"months":b[1][199],"days":b[1][200],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][200],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][200],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][200],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][200],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][200],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][199],"days":b[1][200],"eras":b[1][201],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][200],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][200],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][200],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][199],"days":b[1][200],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][200],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][199],"days":b[1][200],"eras":b[1][20],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][425]},{"months":b[1][203],"days":b[1][204],"eras":b[1][3],"dayPeriods":b[0][433]},{"months":b[1][9],"days":b[1][204],"dayPeriods":b[0][433]},{"months":b[1][5],"days":b[1][204],"eras":b[1][6],"dayPeriods":b[0][433]},{"months":b[1][7],"days":b[1][204],"eras":b[1][6],"dayPeriods":b[0][433]},{"months":b[1][7],"days":b[1][204],"eras":b[1][8],"dayPeriods":b[0][433]},{"months":b[1][9],"days":b[1][204],"eras":b[1][6],"dayPeriods":b[0][433]},{"months":b[1][203],"days":b[1][204],"eras":b[1][205],"dayPeriods":b[0][433]},{"months":b[1][11],"days":b[1][204],"eras":b[1][12],"dayPeriods":b[0][433]},{"months":b[1][13],"days":b[1][204],"eras":b[1][14],"dayPeriods":b[0][433]},{"months":b[1][15],"days":b[1][204],"eras":b[1][16],"dayPeriods":b[0][433]},{"months":b[1][203],"days":b[1][204],"eras":b[1][17],"dayPeriods":b[0][433]},{"months":b[1][18],"days":b[1][204],"eras":b[1][19],"dayPeriods":b[0][433]},{"months":b[1][203],"days":b[1][204],"eras":b[1][27],"dayPeriods":b[0][433]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][436]},{"months":b[1][207],"days":b[1][208],"eras":b[1][3],"dayPeriods":b[0][444]},{"months":b[1][9],"days":b[1][208],"dayPeriods":b[0][444]},{"months":b[1][5],"days":b[1][208],"eras":b[1][6],"dayPeriods":b[0][444]},{"months":b[1][7],"days":b[1][208],"eras":b[1][6],"dayPeriods":b[0][444]},{"months":b[1][7],"days":b[1][208],"eras":b[1][8],"dayPeriods":b[0][444]},{"months":b[1][9],"days":b[1][208],"eras":b[1][6],"dayPeriods":b[0][444]},{"months":b[1][207],"days":b[1][208],"eras":b[1][209],"dayPeriods":b[0][444]},{"months":b[1][11],"days":b[1][208],"eras":b[1][12],"dayPeriods":b[0][444]},{"months":b[1][13],"days":b[1][208],"eras":b[1][14],"dayPeriods":b[0][444]},{"months":b[1][15],"days":b[1][208],"eras":b[1][16],"dayPeriods":b[0][444]},{"months":b[1][207],"days":b[1][208],"eras":b[1][17],"dayPeriods":b[0][444]},{"months":b[1][18],"days":b[1][208],"eras":b[1][19],"dayPeriods":b[0][444]},{"months":b[1][207],"days":b[1][208],"eras":b[1][20],"dayPeriods":b[0][444]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][447]},{"months":b[1][210],"days":b[1][208],"eras":b[1][3],"dayPeriods":b[0][444]},{"months":b[1][210],"days":b[1][208],"eras":b[1][209],"dayPeriods":b[0][444]},{"months":b[1][210],"days":b[1][208],"eras":b[1][17],"dayPeriods":b[0][444]},{"months":b[1][210],"days":b[1][208],"eras":b[1][20],"dayPeriods":b[0][444]},{"nu":b[0][37],"patterns":b[1][211],"symbols":b[1][28],"currencies":b[0][447]},{"nu":b[0][37],"patterns":b[1][212],"symbols":b[1][213],"currencies":b[0][452]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][213],"currencies":b[0][452]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][453]},{"months":b[1][214],"days":b[1][215],"eras":b[1][3],"dayPeriods":b[0][460]},{"months":b[1][9],"days":b[1][215],"dayPeriods":b[0][460]},{"months":b[1][5],"days":b[1][215],"eras":b[1][6],"dayPeriods":b[0][460]},{"months":b[1][7],"days":b[1][215],"eras":b[1][6],"dayPeriods":b[0][460]},{"months":b[1][7],"days":b[1][215],"eras":b[1][8],"dayPeriods":b[0][460]},{"months":b[1][9],"days":b[1][215],"eras":b[1][6],"dayPeriods":b[0][460]},{"months":b[1][214],"days":b[1][215],"eras":b[1][216],"dayPeriods":b[0][460]},{"months":b[1][11],"days":b[1][215],"eras":b[1][12],"dayPeriods":b[0][460]},{"months":b[1][13],"days":b[1][215],"eras":b[1][14],"dayPeriods":b[0][460]},{"months":b[1][15],"days":b[1][215],"eras":b[1][16],"dayPeriods":b[0][460]},{"months":b[1][214],"days":b[1][215],"eras":b[1][17],"dayPeriods":b[0][460]},{"months":b[1][18],"days":b[1][215],"eras":b[1][19],"dayPeriods":b[0][460]},{"months":b[1][214],"days":b[1][215],"eras":b[1][27],"dayPeriods":b[0][460]},{"nu":b[0][37],"patterns":b[1][33],"symbols":b[1][217],"currencies":b[0][70]},{"months":b[1][219],"days":b[1][220],"eras":b[1][3],"dayPeriods":b[0][471]},{"months":b[1][9],"days":b[1][220],"dayPeriods":b[0][471]},{"months":b[1][5],"days":b[1][220],"eras":b[1][6],"dayPeriods":b[0][471]},{"months":b[1][7],"days":b[1][220],"eras":b[1][6],"dayPeriods":b[0][471]},{"months":b[1][7],"days":b[1][220],"eras":b[1][8],"dayPeriods":b[0][471]},{"months":b[1][9],"days":b[1][220],"eras":b[1][6],"dayPeriods":b[0][471]},{"months":b[1][219],"days":b[1][220],"eras":b[1][221],"dayPeriods":b[0][471]},{"months":b[1][11],"days":b[1][220],"eras":b[1][12],"dayPeriods":b[0][471]},{"months":b[1][13],"days":b[1][220],"eras":b[1][14],"dayPeriods":b[0][471]},{"months":b[1][15],"days":b[1][220],"eras":b[1][16],"dayPeriods":b[0][471]},{"months":b[1][219],"days":b[1][220],"eras":b[1][17],"dayPeriods":b[0][471]},{"months":b[1][18],"days":b[1][220],"eras":b[1][19],"dayPeriods":b[0][471]},{"months":b[1][219],"days":b[1][220],"eras":b[1][27],"dayPeriods":b[0][471]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][474]},{"months":b[1][223],"days":b[1][224],"eras":b[1][3],"dayPeriods":b[0][482]},{"months":b[1][9],"days":b[1][224],"dayPeriods":b[0][482]},{"months":b[1][5],"days":b[1][224],"eras":b[1][6],"dayPeriods":b[0][482]},{"months":b[1][7],"days":b[1][224],"eras":b[1][6],"dayPeriods":b[0][482]},{"months":b[1][7],"days":b[1][224],"eras":b[1][8],"dayPeriods":b[0][482]},{"months":b[1][9],"days":b[1][224],"eras":b[1][6],"dayPeriods":b[0][482]},{"months":b[1][223],"days":b[1][224],"eras":b[1][225],"dayPeriods":b[0][482]},{"months":b[1][11],"days":b[1][224],"eras":b[1][12],"dayPeriods":b[0][482]},{"months":b[1][13],"days":b[1][224],"eras":b[1][14],"dayPeriods":b[0][482]},{"months":b[1][15],"days":b[1][224],"eras":b[1][16],"dayPeriods":b[0][482]},{"months":b[1][223],"days":b[1][224],"eras":b[1][17],"dayPeriods":b[0][482]},{"months":b[1][18],"days":b[1][224],"eras":b[1][19],"dayPeriods":b[0][482]},{"months":b[1][223],"days":b[1][224],"eras":b[1][27],"dayPeriods":b[0][482]},{"months":b[1][226],"days":b[1][227],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][227],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][227],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][227],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][227],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][227],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][226],"days":b[1][227],"eras":b[1][228],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][227],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][227],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][227],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][226],"days":b[1][227],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][227],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][226],"days":b[1][227],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][70]},{"months":b[1][230],"days":b[1][231],"eras":b[1][3],"dayPeriods":b[0][502]},{"months":b[1][9],"days":b[1][231],"dayPeriods":b[0][502]},{"months":b[1][5],"days":b[1][231],"eras":b[1][6],"dayPeriods":b[0][502]},{"months":b[1][7],"days":b[1][231],"eras":b[1][6],"dayPeriods":b[0][502]},{"months":b[1][7],"days":b[1][231],"eras":b[1][8],"dayPeriods":b[0][502]},{"months":b[1][9],"days":b[1][231],"eras":b[1][6],"dayPeriods":b[0][502]},{"months":b[1][230],"days":b[1][231],"eras":b[1][72],"dayPeriods":b[0][502]},{"months":b[1][11],"days":b[1][231],"eras":b[1][12],"dayPeriods":b[0][502]},{"months":b[1][13],"days":b[1][231],"eras":b[1][14],"dayPeriods":b[0][502]},{"months":b[1][15],"days":b[1][231],"eras":b[1][16],"dayPeriods":b[0][502]},{"months":b[1][230],"days":b[1][231],"eras":b[1][17],"dayPeriods":b[0][502]},{"months":b[1][18],"days":b[1][231],"eras":b[1][19],"dayPeriods":b[0][502]},{"months":b[1][230],"days":b[1][231],"eras":b[1][27],"dayPeriods":b[0][502]},{"nu":b[0][503],"patterns":b[1][232],"symbols":b[1][233],"currencies":b[0][505]},{"months":b[1][234],"days":b[1][235],"eras":b[1][3],"dayPeriods":b[0][512]},{"months":b[1][9],"days":b[1][235],"dayPeriods":b[0][512]},{"months":b[1][5],"days":b[1][235],"eras":b[1][6],"dayPeriods":b[0][512]},{"months":b[1][7],"days":b[1][235],"eras":b[1][6],"dayPeriods":b[0][512]},{"months":b[1][7],"days":b[1][235],"eras":b[1][8],"dayPeriods":b[0][512]},{"months":b[1][9],"days":b[1][235],"eras":b[1][6],"dayPeriods":b[0][512]},{"months":b[1][234],"days":b[1][235],"eras":b[1][236],"dayPeriods":b[0][512]},{"months":b[1][11],"days":b[1][235],"eras":b[1][12],"dayPeriods":b[0][512]},{"months":b[1][13],"days":b[1][235],"eras":b[1][14],"dayPeriods":b[0][512]},{"months":b[1][15],"days":b[1][235],"eras":b[1][16],"dayPeriods":b[0][512]},{"months":b[1][234],"days":b[1][235],"eras":b[1][17],"dayPeriods":b[0][512]},{"months":b[1][18],"days":b[1][235],"eras":b[1][19],"dayPeriods":b[0][512]},{"months":b[1][234],"days":b[1][235],"eras":b[1][27],"dayPeriods":b[0][512]},{"months":b[1][238],"days":b[1][239],"eras":b[1][3],"dayPeriods":b[0][524]},{"months":b[1][9],"days":b[1][239],"dayPeriods":b[0][524]},{"months":b[1][5],"days":b[1][239],"eras":b[1][6],"dayPeriods":b[0][524]},{"months":b[1][7],"days":b[1][239],"eras":b[1][6],"dayPeriods":b[0][524]},{"months":b[1][7],"days":b[1][239],"eras":b[1][8],"dayPeriods":b[0][524]},{"months":b[1][9],"days":b[1][239],"eras":b[1][6],"dayPeriods":b[0][524]},{"months":b[1][238],"days":b[1][239],"eras":b[1][240],"dayPeriods":b[0][524]},{"months":b[1][11],"days":b[1][239],"eras":b[1][12],"dayPeriods":b[0][524]},{"months":b[1][13],"days":b[1][239],"eras":b[1][14],"dayPeriods":b[0][524]},{"months":b[1][15],"days":b[1][239],"eras":b[1][16],"dayPeriods":b[0][524]},{"months":b[1][238],"days":b[1][239],"eras":b[1][17],"dayPeriods":b[0][524]},{"months":b[1][18],"days":b[1][239],"eras":b[1][19],"dayPeriods":b[0][524]},{"months":b[1][238],"days":b[1][239],"eras":b[1][27],"dayPeriods":b[0][524]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][241],"currencies":b[0][528]},{"months":b[1][244],"days":b[1][245],"eras":b[1][3],"dayPeriods":b[0][537]},{"months":b[1][9],"days":b[1][245],"dayPeriods":b[0][537]},{"months":b[1][5],"days":b[1][245],"eras":b[1][6],"dayPeriods":b[0][537]},{"months":b[1][7],"days":b[1][245],"eras":b[1][6],"dayPeriods":b[0][537]},{"months":b[1][7],"days":b[1][245],"eras":b[1][8],"dayPeriods":b[0][537]},{"months":b[1][9],"days":b[1][245],"eras":b[1][6],"dayPeriods":b[0][537]},{"months":b[1][244],"days":b[1][245],"eras":b[1][246],"dayPeriods":b[0][537]},{"months":b[1][11],"days":b[1][245],"eras":b[1][12],"dayPeriods":b[0][537]},{"months":b[1][13],"days":b[1][245],"eras":b[1][14],"dayPeriods":b[0][537]},{"months":b[1][15],"days":b[1][245],"eras":b[1][16],"dayPeriods":b[0][537]},{"months":b[1][244],"days":b[1][245],"eras":b[1][17],"dayPeriods":b[0][537]},{"months":b[1][18],"days":b[1][245],"eras":b[1][19],"dayPeriods":b[0][537]},{"months":b[1][244],"days":b[1][245],"eras":b[1][247],"dayPeriods":b[0][537]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][541]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][70]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][543]},{"nu":b[0][37],"patterns":b[1][211],"symbols":b[1][95],"currencies":b[0][70]},{"months":b[1][251],"days":b[1][252],"eras":b[1][3],"dayPeriods":b[0][549]},{"months":b[1][4],"days":b[1][252],"dayPeriods":b[0][549]},{"months":b[1][5],"days":b[1][252],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][7],"days":b[1][252],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][7],"days":b[1][252],"eras":b[1][8],"dayPeriods":b[0][549]},{"months":b[1][9],"days":b[1][252],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][251],"days":b[1][252],"eras":b[1][10],"dayPeriods":b[0][549]},{"months":b[1][11],"days":b[1][252],"eras":b[1][12],"dayPeriods":b[0][549]},{"months":b[1][13],"days":b[1][252],"eras":b[1][14],"dayPeriods":b[0][549]},{"months":b[1][15],"days":b[1][252],"eras":b[1][16],"dayPeriods":b[0][549]},{"months":b[1][251],"days":b[1][252],"eras":b[1][17],"dayPeriods":b[0][549]},{"months":b[1][18],"days":b[1][252],"eras":b[1][19],"dayPeriods":b[0][549]},{"months":b[1][251],"days":b[1][252],"eras":b[1][20],"dayPeriods":b[0][549]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][550]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][551]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][554]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][555]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][556]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][559]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][562]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][565]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][566]},{"nu":b[0][37],"patterns":b[1][212],"symbols":b[1][95],"currencies":b[0][70]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][567]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][70]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][569]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][570]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][573]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][574]},{"months":b[1][1],"days":b[1][2],"eras":b[1][3],"dayPeriods":b[0][549]},{"months":b[1][4],"days":b[1][2],"dayPeriods":b[0][549]},{"months":b[1][5],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][7],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][7],"days":b[1][2],"eras":b[1][8],"dayPeriods":b[0][549]},{"months":b[1][9],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][1],"days":b[1][2],"eras":b[1][10],"dayPeriods":b[0][549]},{"months":b[1][11],"days":b[1][2],"eras":b[1][12],"dayPeriods":b[0][549]},{"months":b[1][13],"days":b[1][2],"eras":b[1][14],"dayPeriods":b[0][549]},{"months":b[1][15],"days":b[1][2],"eras":b[1][16],"dayPeriods":b[0][549]},{"months":b[1][1],"days":b[1][2],"eras":b[1][17],"dayPeriods":b[0][549]},{"months":b[1][18],"days":b[1][2],"eras":b[1][19],"dayPeriods":b[0][549]},{"months":b[1][1],"days":b[1][2],"eras":b[1][20],"dayPeriods":b[0][549]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][575]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][576]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][577]},{"months":b[1][1],"days":b[1][2],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][4],"days":b[1][2],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][2],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][2],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][1],"days":b[1][2],"eras":b[1][10],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][2],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][2],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][2],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][1],"days":b[1][2],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][2],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][1],"days":b[1][2],"eras":b[1][20],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][73],"symbols":b[1][22],"currencies":b[0][70]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][586]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][587]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][588]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][589]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][590]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][591]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][594]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][595]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][596]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][597]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][598]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][599]},{"nu":b[0][37],"patterns":b[1][264],"symbols":b[1][95],"currencies":b[0][70]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][603]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][604]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][606]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][607]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][608]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][609]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][612]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][613]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][614]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][615]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][616]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][617]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][618]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][619]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][620]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][160]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][621]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][622]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][28],"currencies":b[0][589]},{"months":b[1][272],"days":b[1][273],"eras":b[1][3],"dayPeriods":b[0][633]},{"months":b[1][9],"days":b[1][273],"dayPeriods":b[0][633]},{"months":b[1][5],"days":b[1][273],"eras":b[1][6],"dayPeriods":b[0][633]},{"months":b[1][7],"days":b[1][273],"eras":b[1][6],"dayPeriods":b[0][633]},{"months":b[1][7],"days":b[1][273],"eras":b[1][8],"dayPeriods":b[0][633]},{"months":b[1][9],"days":b[1][273],"eras":b[1][6],"dayPeriods":b[0][633]},{"months":b[1][272],"days":b[1][273],"eras":b[1][274],"dayPeriods":b[0][633]},{"months":b[1][11],"days":b[1][273],"eras":b[1][12],"dayPeriods":b[0][633]},{"months":b[1][13],"days":b[1][273],"eras":b[1][14],"dayPeriods":b[0][633]},{"months":b[1][15],"days":b[1][273],"eras":b[1][16],"dayPeriods":b[0][633]},{"months":b[1][272],"days":b[1][273],"eras":b[1][17],"dayPeriods":b[0][633]},{"months":b[1][18],"days":b[1][273],"eras":b[1][19],"dayPeriods":b[0][633]},{"months":b[1][272],"days":b[1][273],"eras":b[1][27],"dayPeriods":b[0][633]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][28],"currencies":b[0][70]},{"months":b[1][276],"days":b[1][277],"eras":b[1][3],"dayPeriods":b[0][361]},{"months":b[1][9],"days":b[1][277],"dayPeriods":b[0][361]},{"months":b[1][5],"days":b[1][277],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][7],"days":b[1][277],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][7],"days":b[1][277],"eras":b[1][8],"dayPeriods":b[0][361]},{"months":b[1][9],"days":b[1][277],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][276],"days":b[1][277],"eras":b[1][278],"dayPeriods":b[0][361]},{"months":b[1][11],"days":b[1][277],"eras":b[1][12],"dayPeriods":b[0][361]},{"months":b[1][13],"days":b[1][277],"eras":b[1][14],"dayPeriods":b[0][361]},{"months":b[1][15],"days":b[1][277],"eras":b[1][16],"dayPeriods":b[0][361]},{"months":b[1][276],"days":b[1][277],"eras":b[1][17],"dayPeriods":b[0][361]},{"months":b[1][18],"days":b[1][277],"eras":b[1][19],"dayPeriods":b[0][361]},{"months":b[1][276],"days":b[1][277],"eras":b[1][279],"dayPeriods":b[0][361]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][647]},{"months":b[1][281],"days":b[1][282],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][282],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][282],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][281],"days":b[1][282],"eras":b[1][278],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][282],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][282],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][282],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][281],"days":b[1][282],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][282],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][281],"days":b[1][282],"eras":b[1][279],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][652]},{"nu":b[0][37],"patterns":b[1][211],"symbols":b[1][95],"currencies":b[0][654]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][95],"currencies":b[0][655]},{"nu":b[0][37],"patterns":b[1][286],"symbols":b[1][95],"currencies":b[0][659]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][662]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][28],"currencies":b[0][663]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][664]},{"months":b[1][281],"days":b[1][282],"eras":b[1][289],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][667]},{"nu":b[0][37],"patterns":b[1][286],"symbols":b[1][95],"currencies":b[0][668]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][95],"currencies":b[0][669]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][670]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][672]},{"months":b[1][293],"days":b[1][294],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][294],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][294],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][294],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][294],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][294],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][293],"days":b[1][294],"eras":b[1][278],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][294],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][294],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][294],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][293],"days":b[1][294],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][294],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][293],"days":b[1][294],"eras":b[1][279],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][677]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][678]},{"months":b[1][296],"days":b[1][282],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][296],"days":b[1][282],"eras":b[1][278],"dayPeriods":b[0][582]},{"months":b[1][296],"days":b[1][282],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][296],"days":b[1][282],"eras":b[1][279],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][681]},{"months":b[1][298],"days":b[1][282],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][298],"days":b[1][282],"eras":b[1][278],"dayPeriods":b[0][582]},{"months":b[1][298],"days":b[1][282],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][298],"days":b[1][282],"eras":b[1][279],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][685]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][686]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][668]},{"months":b[1][301],"days":b[1][282],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][301],"days":b[1][282],"eras":b[1][278],"dayPeriods":b[0][582]},{"months":b[1][301],"days":b[1][282],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][301],"days":b[1][282],"eras":b[1][279],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][302],"symbols":b[1][95],"currencies":b[0][688]},{"months":b[1][281],"days":b[1][282],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][282],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][282],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][281],"days":b[1][282],"eras":b[1][278],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][282],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][282],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][282],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][281],"days":b[1][282],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][282],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][281],"days":b[1][282],"eras":b[1][279],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][283],"symbols":b[1][22],"currencies":b[0][689]},{"nu":b[0][37],"patterns":b[1][211],"symbols":b[1][95],"currencies":b[0][690]},{"months":b[1][276],"days":b[1][282],"eras":b[1][3],"dayPeriods":b[0][361]},{"months":b[1][9],"days":b[1][282],"dayPeriods":b[0][361]},{"months":b[1][5],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][7],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][7],"days":b[1][282],"eras":b[1][8],"dayPeriods":b[0][361]},{"months":b[1][9],"days":b[1][282],"eras":b[1][6],"dayPeriods":b[0][361]},{"months":b[1][276],"days":b[1][282],"eras":b[1][278],"dayPeriods":b[0][361]},{"months":b[1][11],"days":b[1][282],"eras":b[1][12],"dayPeriods":b[0][361]},{"months":b[1][13],"days":b[1][282],"eras":b[1][14],"dayPeriods":b[0][361]},{"months":b[1][15],"days":b[1][282],"eras":b[1][16],"dayPeriods":b[0][361]},{"months":b[1][276],"days":b[1][282],"eras":b[1][17],"dayPeriods":b[0][361]},{"months":b[1][18],"days":b[1][282],"eras":b[1][19],"dayPeriods":b[0][361]},{"months":b[1][276],"days":b[1][282],"eras":b[1][279],"dayPeriods":b[0][361]},{"nu":b[0][37],"patterns":b[1][286],"symbols":b[1][95],"currencies":b[0][692]},{"months":b[1][306],"days":b[1][307],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][307],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][307],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][307],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][307],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][307],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][306],"days":b[1][307],"eras":b[1][308],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][307],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][307],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][307],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][306],"days":b[1][307],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][307],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][306],"days":b[1][307],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][309],"currencies":b[0][704]},{"months":b[1][311],"days":b[1][312],"eras":b[1][313],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][312],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][312],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][312],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][312],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][312],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][311],"days":b[1][312],"eras":b[1][314],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][312],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][312],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][312],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][311],"days":b[1][312],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][312],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][311],"days":b[1][312],"eras":b[1][315],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][316],"symbols":b[1][95],"currencies":b[0][718]},{"months":b[1][318],"days":b[1][319],"eras":b[1][3],"dayPeriods":b[0][725]},{"months":b[1][9],"days":b[1][319],"dayPeriods":b[0][725]},{"months":b[1][5],"days":b[1][319],"eras":b[1][6],"dayPeriods":b[0][725]},{"months":b[1][7],"days":b[1][319],"eras":b[1][6],"dayPeriods":b[0][725]},{"months":b[1][7],"days":b[1][319],"eras":b[1][8],"dayPeriods":b[0][725]},{"months":b[1][9],"days":b[1][319],"eras":b[1][6],"dayPeriods":b[0][725]},{"months":b[1][318],"days":b[1][319],"eras":b[1][320],"dayPeriods":b[0][725]},{"months":b[1][11],"days":b[1][319],"eras":b[1][12],"dayPeriods":b[0][725]},{"months":b[1][13],"days":b[1][319],"eras":b[1][14],"dayPeriods":b[0][725]},{"months":b[1][15],"days":b[1][319],"eras":b[1][16],"dayPeriods":b[0][725]},{"months":b[1][318],"days":b[1][319],"eras":b[1][17],"dayPeriods":b[0][725]},{"months":b[1][18],"days":b[1][319],"eras":b[1][19],"dayPeriods":b[0][725]},{"months":b[1][318],"days":b[1][319],"eras":b[1][27],"dayPeriods":b[0][725]},{"months":b[1][322],"days":b[1][323],"eras":b[1][3],"dayPeriods":b[0][735]},{"months":b[1][9],"days":b[1][323],"dayPeriods":b[0][735]},{"months":b[1][5],"days":b[1][323],"eras":b[1][6],"dayPeriods":b[0][735]},{"months":b[1][7],"days":b[1][323],"eras":b[1][6],"dayPeriods":b[0][735]},{"months":b[1][7],"days":b[1][323],"eras":b[1][8],"dayPeriods":b[0][735]},{"months":b[1][9],"days":b[1][323],"eras":b[1][6],"dayPeriods":b[0][735]},{"months":b[1][322],"days":b[1][323],"eras":b[1][324],"dayPeriods":b[0][735]},{"months":b[1][325],"days":b[1][323],"eras":b[1][12],"dayPeriods":b[0][735]},{"months":b[1][13],"days":b[1][323],"eras":b[1][14],"dayPeriods":b[0][735]},{"months":b[1][326],"days":b[1][323],"eras":b[1][327],"dayPeriods":b[0][735]},{"months":b[1][322],"days":b[1][323],"eras":b[1][17],"dayPeriods":b[0][735]},{"months":b[1][328],"days":b[1][323],"eras":b[1][329],"dayPeriods":b[0][735]},{"months":b[1][322],"days":b[1][323],"eras":b[1][27],"dayPeriods":b[0][735]},{"nu":b[0][748],"patterns":b[1][330],"symbols":b[1][331],"currencies":b[0][752]},{"months":b[1][332],"days":b[1][323],"eras":b[1][3],"dayPeriods":b[0][735]},{"months":b[1][332],"days":b[1][323],"eras":b[1][324],"dayPeriods":b[0][735]},{"months":b[1][332],"days":b[1][323],"eras":b[1][17],"dayPeriods":b[0][735]},{"months":b[1][333],"days":b[1][323],"eras":b[1][329],"dayPeriods":b[0][735]},{"months":b[1][332],"days":b[1][323],"eras":b[1][27],"dayPeriods":b[0][735]},{"months":b[1][335],"days":b[1][336],"eras":b[1][3],"dayPeriods":b[0][763]},{"months":b[1][9],"days":b[1][336],"dayPeriods":b[0][763]},{"months":b[1][5],"days":b[1][336],"eras":b[1][6],"dayPeriods":b[0][763]},{"months":b[1][7],"days":b[1][336],"eras":b[1][6],"dayPeriods":b[0][763]},{"months":b[1][7],"days":b[1][336],"eras":b[1][8],"dayPeriods":b[0][763]},{"months":b[1][9],"days":b[1][336],"eras":b[1][6],"dayPeriods":b[0][763]},{"months":b[1][335],"days":b[1][336],"eras":b[1][337],"dayPeriods":b[0][763]},{"months":b[1][11],"days":b[1][336],"eras":b[1][12],"dayPeriods":b[0][763]},{"months":b[1][13],"days":b[1][336],"eras":b[1][14],"dayPeriods":b[0][763]},{"months":b[1][15],"days":b[1][336],"eras":b[1][16],"dayPeriods":b[0][763]},{"months":b[1][335],"days":b[1][336],"eras":b[1][17],"dayPeriods":b[0][763]},{"months":b[1][18],"days":b[1][336],"eras":b[1][19],"dayPeriods":b[0][763]},{"months":b[1][335],"days":b[1][336],"eras":b[1][27],"dayPeriods":b[0][763]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][766]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][767]},{"months":b[1][340],"days":b[1][341],"eras":b[1][3],"dayPeriods":b[0][775]},{"months":b[1][9],"days":b[1][341],"dayPeriods":b[0][775]},{"months":b[1][5],"days":b[1][341],"eras":b[1][6],"dayPeriods":b[0][775]},{"months":b[1][7],"days":b[1][341],"eras":b[1][6],"dayPeriods":b[0][775]},{"months":b[1][7],"days":b[1][341],"eras":b[1][8],"dayPeriods":b[0][775]},{"months":b[1][9],"days":b[1][341],"eras":b[1][6],"dayPeriods":b[0][775]},{"months":b[1][340],"days":b[1][341],"eras":b[1][342],"dayPeriods":b[0][775]},{"months":b[1][343],"days":b[1][341],"eras":b[1][12],"dayPeriods":b[0][775]},{"months":b[1][13],"days":b[1][341],"eras":b[1][14],"dayPeriods":b[0][775]},{"months":b[1][344],"days":b[1][341],"eras":b[1][16],"dayPeriods":b[0][775]},{"months":b[1][340],"days":b[1][341],"eras":b[1][17],"dayPeriods":b[0][775]},{"months":b[1][18],"days":b[1][341],"eras":b[1][19],"dayPeriods":b[0][775]},{"months":b[1][340],"days":b[1][341],"eras":b[1][20],"dayPeriods":b[0][775]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][345],"currencies":b[0][783]},{"months":b[1][347],"days":b[1][348],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][348],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][348],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][348],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][348],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][348],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][347],"days":b[1][348],"eras":b[1][349],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][348],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][348],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][348],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][347],"days":b[1][348],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][348],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][347],"days":b[1][348],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][789]},{"months":b[1][351],"days":b[1][352],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][352],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][352],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][352],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][352],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][352],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][351],"days":b[1][352],"eras":b[1][353],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][352],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][352],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][352],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][351],"days":b[1][352],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][352],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][351],"days":b[1][352],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][354],"currencies":b[0][800]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][354],"currencies":b[0][569]},{"months":b[1][356],"days":b[1][357],"eras":b[1][358],"dayPeriods":b[0][11]},{"months":b[1][359],"days":b[1][357],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][357],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][357],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][357],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][357],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][356],"days":b[1][357],"eras":b[1][360],"dayPeriods":b[0][11]},{"months":b[1][361],"days":b[1][357],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][357],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][362],"days":b[1][357],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][356],"days":b[1][357],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][357],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][356],"days":b[1][357],"eras":b[1][363],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][817]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][817]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][820]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][823]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][824]},{"nu":b[0][37],"patterns":b[1][212],"symbols":b[1][217],"currencies":b[0][817]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][827]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][828]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][829]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][830]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][831]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][832]},{"months":b[1][368],"days":b[1][357],"eras":b[1][358],"dayPeriods":b[0][582]},{"months":b[1][359],"days":b[1][357],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][357],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][357],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][357],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][357],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][368],"days":b[1][357],"eras":b[1][360],"dayPeriods":b[0][582]},{"months":b[1][361],"days":b[1][357],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][357],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][362],"days":b[1][357],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][368],"days":b[1][357],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][357],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][368],"days":b[1][357],"eras":b[1][363],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][834]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][835]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][836]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][837]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][838]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][839]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][840]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][841]},{"months":b[1][370],"days":b[1][371],"eras":b[1][3],"dayPeriods":b[0][849]},{"months":b[1][9],"days":b[1][371],"dayPeriods":b[0][849]},{"months":b[1][5],"days":b[1][371],"eras":b[1][6],"dayPeriods":b[0][849]},{"months":b[1][7],"days":b[1][371],"eras":b[1][6],"dayPeriods":b[0][849]},{"months":b[1][7],"days":b[1][371],"eras":b[1][8],"dayPeriods":b[0][849]},{"months":b[1][9],"days":b[1][371],"eras":b[1][6],"dayPeriods":b[0][849]},{"months":b[1][370],"days":b[1][371],"eras":b[1][372],"dayPeriods":b[0][849]},{"months":b[1][11],"days":b[1][371],"eras":b[1][12],"dayPeriods":b[0][849]},{"months":b[1][13],"days":b[1][371],"eras":b[1][14],"dayPeriods":b[0][849]},{"months":b[1][15],"days":b[1][371],"eras":b[1][16],"dayPeriods":b[0][849]},{"months":b[1][370],"days":b[1][371],"eras":b[1][17],"dayPeriods":b[0][849]},{"months":b[1][18],"days":b[1][371],"eras":b[1][19],"dayPeriods":b[0][849]},{"months":b[1][370],"days":b[1][371],"eras":b[1][27],"dayPeriods":b[0][849]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][70]},{"months":b[1][374],"days":b[1][375],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][375],"dayPeriods":b[0][11]},{"months":b[1][376],"days":b[1][375],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][377],"days":b[1][375],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][377],"days":b[1][375],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][375],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][374],"days":b[1][375],"eras":b[1][378],"dayPeriods":b[0][11]},{"months":b[1][379],"days":b[1][375],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][380],"days":b[1][375],"eras":b[1][381],"dayPeriods":b[0][11]},{"months":b[1][382],"days":b[1][375],"eras":b[1][383],"dayPeriods":b[0][11]},{"months":b[1][374],"days":b[1][375],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][375],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][374],"days":b[1][375],"eras":b[1][20],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][384],"symbols":b[1][95],"currencies":b[0][870]},{"months":b[1][386],"days":b[1][387],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][387],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][387],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][387],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][387],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][387],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][386],"days":b[1][387],"eras":b[1][388],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][387],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][387],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][387],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][386],"days":b[1][387],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][387],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][386],"days":b[1][387],"eras":b[1][27],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][188]},{"months":b[1][390],"days":b[1][391],"eras":b[1][3],"dayPeriods":b[0][888]},{"months":b[1][9],"days":b[1][391],"dayPeriods":b[0][888]},{"months":b[1][5],"days":b[1][391],"eras":b[1][6],"dayPeriods":b[0][888]},{"months":b[1][7],"days":b[1][391],"eras":b[1][6],"dayPeriods":b[0][888]},{"months":b[1][7],"days":b[1][391],"eras":b[1][8],"dayPeriods":b[0][888]},{"months":b[1][9],"days":b[1][391],"eras":b[1][6],"dayPeriods":b[0][888]},{"months":b[1][390],"days":b[1][391],"eras":b[1][392],"dayPeriods":b[0][888]},{"months":b[1][11],"days":b[1][391],"eras":b[1][12],"dayPeriods":b[0][888]},{"months":b[1][13],"days":b[1][391],"eras":b[1][14],"dayPeriods":b[0][888]},{"months":b[1][15],"days":b[1][391],"eras":b[1][16],"dayPeriods":b[0][888]},{"months":b[1][390],"days":b[1][391],"eras":b[1][17],"dayPeriods":b[0][888]},{"months":b[1][18],"days":b[1][391],"eras":b[1][19],"dayPeriods":b[0][888]},{"months":b[1][390],"days":b[1][391],"eras":b[1][393],"dayPeriods":b[0][888]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][894]},{"months":b[1][395],"days":b[1][396],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][396],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][396],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][396],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][396],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][396],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][395],"days":b[1][396],"eras":b[1][397],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][396],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][396],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][396],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][395],"days":b[1][396],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][396],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][395],"days":b[1][396],"eras":b[1][27],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][95],"currencies":b[0][904]},{"months":b[1][399],"days":b[1][400],"eras":b[1][3],"dayPeriods":b[0][910]},{"months":b[1][9],"days":b[1][400],"dayPeriods":b[0][910]},{"months":b[1][5],"days":b[1][400],"eras":b[1][6],"dayPeriods":b[0][910]},{"months":b[1][7],"days":b[1][400],"eras":b[1][6],"dayPeriods":b[0][910]},{"months":b[1][7],"days":b[1][400],"eras":b[1][8],"dayPeriods":b[0][910]},{"months":b[1][9],"days":b[1][400],"eras":b[1][6],"dayPeriods":b[0][910]},{"months":b[1][399],"days":b[1][400],"eras":b[1][401],"dayPeriods":b[0][910]},{"months":b[1][11],"days":b[1][400],"eras":b[1][12],"dayPeriods":b[0][910]},{"months":b[1][13],"days":b[1][400],"eras":b[1][14],"dayPeriods":b[0][910]},{"months":b[1][15],"days":b[1][400],"eras":b[1][16],"dayPeriods":b[0][910]},{"months":b[1][399],"days":b[1][400],"eras":b[1][17],"dayPeriods":b[0][910]},{"months":b[1][18],"days":b[1][400],"eras":b[1][19],"dayPeriods":b[0][910]},{"months":b[1][399],"days":b[1][400],"eras":b[1][27],"dayPeriods":b[0][910]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][402],"currencies":b[0][913]},{"months":b[1][404],"days":b[1][405],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][405],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][405],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][405],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][405],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][405],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][404],"days":b[1][405],"eras":b[1][406],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][405],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][405],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][405],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][404],"days":b[1][405],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][405],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][404],"days":b[1][405],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][407],"symbols":b[1][408],"currencies":b[0][925]},{"months":b[1][410],"days":b[1][411],"eras":b[1][3],"dayPeriods":b[0][933]},{"months":b[1][9],"days":b[1][411],"dayPeriods":b[0][933]},{"months":b[1][5],"days":b[1][411],"eras":b[1][6],"dayPeriods":b[0][933]},{"months":b[1][7],"days":b[1][411],"eras":b[1][6],"dayPeriods":b[0][933]},{"months":b[1][7],"days":b[1][411],"eras":b[1][8],"dayPeriods":b[0][933]},{"months":b[1][9],"days":b[1][411],"eras":b[1][6],"dayPeriods":b[0][933]},{"months":b[1][410],"days":b[1][411],"eras":b[1][412],"dayPeriods":b[0][933]},{"months":b[1][11],"days":b[1][411],"eras":b[1][12],"dayPeriods":b[0][933]},{"months":b[1][13],"days":b[1][411],"eras":b[1][14],"dayPeriods":b[0][933]},{"months":b[1][15],"days":b[1][411],"eras":b[1][16],"dayPeriods":b[0][933]},{"months":b[1][410],"days":b[1][411],"eras":b[1][17],"dayPeriods":b[0][933]},{"months":b[1][18],"days":b[1][411],"eras":b[1][19],"dayPeriods":b[0][933]},{"months":b[1][410],"days":b[1][411],"eras":b[1][27],"dayPeriods":b[0][933]},{"months":b[1][413],"days":b[1][414],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][414],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][414],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][414],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][414],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][414],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][413],"days":b[1][414],"eras":b[1][415],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][414],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][414],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][414],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][413],"days":b[1][414],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][414],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][413],"days":b[1][414],"eras":b[1][27],"dayPeriods":b[0][582]},{"months":b[1][417],"days":b[1][418],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][418],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][418],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][418],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][418],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][418],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][417],"days":b[1][418],"eras":b[1][419],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][418],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][418],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][418],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][417],"days":b[1][418],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][418],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][417],"days":b[1][418],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][22],"currencies":b[0][599]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][22],"currencies":b[0][948]},{"short":a[535],"medium":a[535],"full":a[535],"long":a[535],"availableFormats":b[0][949],"dateFormats":b[1][421],"timeFormats":b[0][3]},{"months":b[1][422],"days":b[1][423],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][423],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][423],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][423],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][423],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][423],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][422],"days":b[1][423],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][423],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][423],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][423],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][422],"days":b[1][423],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][423],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][422],"days":b[1][423],"eras":b[1][27],"dayPeriods":b[0][11]},{"months":b[1][425],"days":b[1][426],"eras":b[1][3],"dayPeriods":b[0][962]},{"months":b[1][9],"days":b[1][426],"dayPeriods":b[0][962]},{"months":b[1][5],"days":b[1][426],"eras":b[1][6],"dayPeriods":b[0][962]},{"months":b[1][7],"days":b[1][426],"eras":b[1][6],"dayPeriods":b[0][962]},{"months":b[1][7],"days":b[1][426],"eras":b[1][8],"dayPeriods":b[0][962]},{"months":b[1][9],"days":b[1][426],"eras":b[1][6],"dayPeriods":b[0][962]},{"months":b[1][425],"days":b[1][426],"eras":b[1][427],"dayPeriods":b[0][962]},{"months":b[1][428],"days":b[1][426],"eras":b[1][429],"dayPeriods":b[0][962]},{"months":b[1][13],"days":b[1][426],"eras":b[1][14],"dayPeriods":b[0][962]},{"months":b[1][430],"days":b[1][426],"eras":b[1][431],"dayPeriods":b[0][962]},{"months":b[1][425],"days":b[1][426],"eras":b[1][432],"dayPeriods":b[0][962]},{"months":b[1][18],"days":b[1][426],"eras":b[1][19],"dayPeriods":b[0][962]},{"months":b[1][425],"days":b[1][426],"eras":b[1][27],"dayPeriods":b[0][962]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][433],"currencies":b[0][972]},{"months":b[1][435],"days":b[1][436],"eras":b[1][3],"dayPeriods":b[0][981]},{"months":b[1][9],"days":b[1][436],"dayPeriods":b[0][981]},{"months":b[1][5],"days":b[1][436],"eras":b[1][6],"dayPeriods":b[0][981]},{"months":b[1][437],"days":b[1][436],"eras":b[1][6],"dayPeriods":b[0][981]},{"months":b[1][437],"days":b[1][436],"eras":b[1][8],"dayPeriods":b[0][981]},{"months":b[1][9],"days":b[1][436],"eras":b[1][6],"dayPeriods":b[0][981]},{"months":b[1][435],"days":b[1][436],"eras":b[1][438],"dayPeriods":b[0][981]},{"months":b[1][11],"days":b[1][436],"eras":b[1][12],"dayPeriods":b[0][981]},{"months":b[1][439],"days":b[1][436],"eras":b[1][440],"dayPeriods":b[0][981]},{"months":b[1][441],"days":b[1][436],"eras":b[1][16],"dayPeriods":b[0][981]},{"months":b[1][435],"days":b[1][436],"eras":b[1][442],"dayPeriods":b[0][981]},{"months":b[1][443],"days":b[1][436],"eras":b[1][19],"dayPeriods":b[0][981]},{"months":b[1][435],"days":b[1][436],"eras":b[1][27],"dayPeriods":b[0][981]},{"nu":b[0][37],"patterns":b[1][407],"symbols":b[1][152],"currencies":b[0][894]},{"months":b[1][445],"days":b[1][155],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][155],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][155],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][155],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][155],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][155],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][445],"days":b[1][155],"eras":b[1][446],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][155],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][155],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][155],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][445],"days":b[1][155],"eras":b[1][447],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][155],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][445],"days":b[1][155],"eras":b[1][448],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][1000]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][1001]},{"months":b[1][450],"days":b[1][451],"eras":b[1][3],"dayPeriods":b[0][1009]},{"months":b[1][9],"days":b[1][451],"dayPeriods":b[0][1009]},{"months":b[1][5],"days":b[1][451],"eras":b[1][6],"dayPeriods":b[0][1009]},{"months":b[1][7],"days":b[1][451],"eras":b[1][6],"dayPeriods":b[0][1009]},{"months":b[1][7],"days":b[1][451],"eras":b[1][8],"dayPeriods":b[0][1009]},{"months":b[1][9],"days":b[1][451],"eras":b[1][6],"dayPeriods":b[0][1009]},{"months":b[1][450],"days":b[1][451],"eras":b[1][452],"dayPeriods":b[0][1009]},{"months":b[1][11],"days":b[1][451],"eras":b[1][12],"dayPeriods":b[0][1009]},{"months":b[1][13],"days":b[1][451],"eras":b[1][14],"dayPeriods":b[0][1009]},{"months":b[1][15],"days":b[1][451],"eras":b[1][16],"dayPeriods":b[0][1009]},{"months":b[1][450],"days":b[1][451],"eras":b[1][17],"dayPeriods":b[0][1009]},{"months":b[1][18],"days":b[1][451],"eras":b[1][19],"dayPeriods":b[0][1009]},{"months":b[1][450],"days":b[1][451],"eras":b[1][27],"dayPeriods":b[0][1009]},{"months":b[1][454],"days":b[1][455],"eras":b[1][456],"dayPeriods":b[0][1021]},{"months":b[1][457],"days":b[1][455],"dayPeriods":b[0][1021]},{"months":b[1][5],"days":b[1][455],"eras":b[1][6],"dayPeriods":b[0][1021]},{"months":b[1][7],"days":b[1][455],"eras":b[1][6],"dayPeriods":b[0][1021]},{"months":b[1][7],"days":b[1][455],"eras":b[1][8],"dayPeriods":b[0][1021]},{"months":b[1][9],"days":b[1][455],"eras":b[1][6],"dayPeriods":b[0][1021]},{"months":b[1][454],"days":b[1][455],"eras":b[1][458],"dayPeriods":b[0][1021]},{"months":b[1][459],"days":b[1][455],"eras":b[1][460],"dayPeriods":b[0][1021]},{"months":b[1][13],"days":b[1][455],"eras":b[1][14],"dayPeriods":b[0][1021]},{"months":b[1][461],"days":b[1][455],"eras":b[1][462],"dayPeriods":b[0][1021]},{"months":b[1][454],"days":b[1][455],"eras":b[1][17],"dayPeriods":b[0][1021]},{"months":b[1][18],"days":b[1][455],"eras":b[1][19],"dayPeriods":b[0][1021]},{"months":b[1][454],"days":b[1][455],"eras":b[1][463],"dayPeriods":b[0][1021]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1031]},{"months":b[1][465],"days":b[1][466],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][466],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][466],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][466],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][466],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][466],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][465],"days":b[1][466],"eras":b[1][467],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][466],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][466],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][466],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][465],"days":b[1][466],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][466],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][465],"days":b[1][466],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][1043]},{"months":b[1][469],"days":b[1][470],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][176],"days":b[1][470],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][470],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][470],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][470],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][470],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][469],"days":b[1][470],"eras":b[1][471],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][470],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][470],"eras":b[1][381],"dayPeriods":b[0][11]},{"months":b[1][472],"days":b[1][470],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][469],"days":b[1][470],"eras":b[1][473],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][470],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][469],"days":b[1][470],"eras":b[1][474],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][95],"currencies":b[0][1057]},{"months":b[1][476],"days":b[1][477],"eras":b[1][3],"dayPeriods":b[0][1062]},{"months":b[1][9],"days":b[1][477],"dayPeriods":b[0][1062]},{"months":b[1][5],"days":b[1][477],"eras":b[1][6],"dayPeriods":b[0][1062]},{"months":b[1][7],"days":b[1][477],"eras":b[1][6],"dayPeriods":b[0][1062]},{"months":b[1][7],"days":b[1][477],"eras":b[1][8],"dayPeriods":b[0][1062]},{"months":b[1][9],"days":b[1][477],"eras":b[1][6],"dayPeriods":b[0][1062]},{"months":b[1][476],"days":b[1][477],"eras":b[1][478],"dayPeriods":b[0][1062]},{"months":b[1][11],"days":b[1][477],"eras":b[1][12],"dayPeriods":b[0][1062]},{"months":b[1][13],"days":b[1][477],"eras":b[1][14],"dayPeriods":b[0][1062]},{"months":b[1][15],"days":b[1][477],"eras":b[1][16],"dayPeriods":b[0][1062]},{"months":b[1][476],"days":b[1][477],"eras":b[1][17],"dayPeriods":b[0][1062]},{"months":b[1][18],"days":b[1][477],"eras":b[1][19],"dayPeriods":b[0][1062]},{"months":b[1][476],"days":b[1][477],"eras":b[1][27],"dayPeriods":b[0][1062]},{"months":b[1][480],"days":b[1][481],"eras":b[1][3],"dayPeriods":b[0][1069]},{"months":b[1][9],"days":b[1][481],"dayPeriods":b[0][1069]},{"months":b[1][5],"days":b[1][481],"eras":b[1][6],"dayPeriods":b[0][1069]},{"months":b[1][7],"days":b[1][481],"eras":b[1][6],"dayPeriods":b[0][1069]},{"months":b[1][7],"days":b[1][481],"eras":b[1][8],"dayPeriods":b[0][1069]},{"months":b[1][9],"days":b[1][481],"eras":b[1][6],"dayPeriods":b[0][1069]},{"months":b[1][480],"days":b[1][481],"eras":b[1][482],"dayPeriods":b[0][1069]},{"months":b[1][11],"days":b[1][481],"eras":b[1][12],"dayPeriods":b[0][1069]},{"months":b[1][13],"days":b[1][481],"eras":b[1][14],"dayPeriods":b[0][1069]},{"months":b[1][15],"days":b[1][481],"eras":b[1][16],"dayPeriods":b[0][1069]},{"months":b[1][480],"days":b[1][481],"eras":b[1][17],"dayPeriods":b[0][1069]},{"months":b[1][18],"days":b[1][481],"eras":b[1][19],"dayPeriods":b[0][1069]},{"months":b[1][480],"days":b[1][481],"eras":b[1][27],"dayPeriods":b[0][1069]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][22],"currencies":b[0][294]},{"months":b[1][484],"days":b[1][485],"eras":b[1][3],"dayPeriods":b[0][1079]},{"months":b[1][9],"days":b[1][485],"dayPeriods":b[0][1079]},{"months":b[1][5],"days":b[1][485],"eras":b[1][6],"dayPeriods":b[0][1079]},{"months":b[1][7],"days":b[1][485],"eras":b[1][6],"dayPeriods":b[0][1079]},{"months":b[1][7],"days":b[1][485],"eras":b[1][8],"dayPeriods":b[0][1079]},{"months":b[1][9],"days":b[1][485],"eras":b[1][6],"dayPeriods":b[0][1079]},{"months":b[1][484],"days":b[1][485],"eras":b[1][486],"dayPeriods":b[0][1079]},{"months":b[1][11],"days":b[1][485],"eras":b[1][12],"dayPeriods":b[0][1079]},{"months":b[1][13],"days":b[1][485],"eras":b[1][14],"dayPeriods":b[0][1079]},{"months":b[1][15],"days":b[1][485],"eras":b[1][16],"dayPeriods":b[0][1079]},{"months":b[1][484],"days":b[1][485],"eras":b[1][17],"dayPeriods":b[0][1079]},{"months":b[1][18],"days":b[1][485],"eras":b[1][19],"dayPeriods":b[0][1079]},{"months":b[1][484],"days":b[1][485],"eras":b[1][27],"dayPeriods":b[0][1079]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][1083]},{"months":b[1][488],"days":b[1][489],"eras":b[1][490],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][489],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][489],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][489],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][489],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][489],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][488],"days":b[1][489],"eras":b[1][491],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][489],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][489],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][489],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][488],"days":b[1][489],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][489],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][488],"days":b[1][489],"eras":b[1][492],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][1096]},{"nu":b[0][37],"patterns":b[1][212],"symbols":b[1][213],"currencies":b[0][1096]},{"months":b[1][495],"days":b[1][496],"eras":b[1][497],"dayPeriods":b[0][1105]},{"months":b[1][498],"days":b[1][496],"dayPeriods":b[0][1105]},{"months":b[1][499],"days":b[1][496],"eras":b[1][6],"dayPeriods":b[0][1105]},{"months":b[1][500],"days":b[1][496],"eras":b[1][6],"dayPeriods":b[0][1105]},{"months":b[1][500],"days":b[1][496],"eras":b[1][8],"dayPeriods":b[0][1105]},{"months":b[1][9],"days":b[1][496],"eras":b[1][6],"dayPeriods":b[0][1105]},{"months":b[1][495],"days":b[1][496],"eras":b[1][501],"dayPeriods":b[0][1105]},{"months":b[1][502],"days":b[1][496],"eras":b[1][12],"dayPeriods":b[0][1105]},{"months":b[1][503],"days":b[1][496],"eras":b[1][504],"dayPeriods":b[0][1105]},{"months":b[1][505],"days":b[1][496],"eras":b[1][16],"dayPeriods":b[0][1105]},{"months":b[1][495],"days":b[1][496],"eras":b[1][506],"dayPeriods":b[0][1105]},{"months":b[1][507],"days":b[1][496],"eras":b[1][19],"dayPeriods":b[0][1105]},{"months":b[1][495],"days":b[1][496],"eras":b[1][508],"dayPeriods":b[0][1105]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1119]},{"months":b[1][510],"days":b[1][511],"eras":b[1][3],"dayPeriods":b[0][1125]},{"months":b[1][9],"days":b[1][511],"dayPeriods":b[0][1125]},{"months":b[1][5],"days":b[1][511],"eras":b[1][6],"dayPeriods":b[0][1125]},{"months":b[1][7],"days":b[1][511],"eras":b[1][6],"dayPeriods":b[0][1125]},{"months":b[1][7],"days":b[1][511],"eras":b[1][8],"dayPeriods":b[0][1125]},{"months":b[1][9],"days":b[1][511],"eras":b[1][6],"dayPeriods":b[0][1125]},{"months":b[1][510],"days":b[1][511],"eras":b[1][512],"dayPeriods":b[0][1125]},{"months":b[1][11],"days":b[1][511],"eras":b[1][12],"dayPeriods":b[0][1125]},{"months":b[1][13],"days":b[1][511],"eras":b[1][14],"dayPeriods":b[0][1125]},{"months":b[1][15],"days":b[1][511],"eras":b[1][16],"dayPeriods":b[0][1125]},{"months":b[1][510],"days":b[1][511],"eras":b[1][17],"dayPeriods":b[0][1125]},{"months":b[1][18],"days":b[1][511],"eras":b[1][19],"dayPeriods":b[0][1125]},{"months":b[1][510],"days":b[1][511],"eras":b[1][27],"dayPeriods":b[0][1125]},{"months":b[1][513],"days":b[1][514],"eras":b[1][3],"dayPeriods":b[0][1131]},{"months":b[1][9],"days":b[1][514],"dayPeriods":b[0][1131]},{"months":b[1][5],"days":b[1][514],"eras":b[1][6],"dayPeriods":b[0][1131]},{"months":b[1][7],"days":b[1][514],"eras":b[1][6],"dayPeriods":b[0][1131]},{"months":b[1][7],"days":b[1][514],"eras":b[1][8],"dayPeriods":b[0][1131]},{"months":b[1][9],"days":b[1][514],"eras":b[1][6],"dayPeriods":b[0][1131]},{"months":b[1][513],"days":b[1][514],"eras":b[1][515],"dayPeriods":b[0][1131]},{"months":b[1][11],"days":b[1][514],"eras":b[1][12],"dayPeriods":b[0][1131]},{"months":b[1][13],"days":b[1][514],"eras":b[1][14],"dayPeriods":b[0][1131]},{"months":b[1][15],"days":b[1][514],"eras":b[1][16],"dayPeriods":b[0][1131]},{"months":b[1][513],"days":b[1][514],"eras":b[1][17],"dayPeriods":b[0][1131]},{"months":b[1][18],"days":b[1][514],"eras":b[1][19],"dayPeriods":b[0][1131]},{"months":b[1][513],"days":b[1][514],"eras":b[1][27],"dayPeriods":b[0][1131]},{"months":b[1][517],"days":b[1][518],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][518],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][518],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][518],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][518],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][518],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][517],"days":b[1][518],"eras":b[1][519],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][518],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][518],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][518],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][517],"days":b[1][518],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][518],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][517],"days":b[1][518],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][520],"currencies":b[0][1144]},{"months":b[1][521],"days":b[1][522],"eras":b[1][3],"dayPeriods":b[0][1151]},{"months":b[1][9],"days":b[1][522],"dayPeriods":b[0][1151]},{"months":b[1][5],"days":b[1][522],"eras":b[1][6],"dayPeriods":b[0][1151]},{"months":b[1][7],"days":b[1][522],"eras":b[1][6],"dayPeriods":b[0][1151]},{"months":b[1][7],"days":b[1][522],"eras":b[1][8],"dayPeriods":b[0][1151]},{"months":b[1][9],"days":b[1][522],"eras":b[1][6],"dayPeriods":b[0][1151]},{"months":b[1][521],"days":b[1][522],"eras":b[1][523],"dayPeriods":b[0][1151]},{"months":b[1][11],"days":b[1][522],"eras":b[1][12],"dayPeriods":b[0][1151]},{"months":b[1][13],"days":b[1][522],"eras":b[1][14],"dayPeriods":b[0][1151]},{"months":b[1][15],"days":b[1][522],"eras":b[1][16],"dayPeriods":b[0][1151]},{"months":b[1][521],"days":b[1][522],"eras":b[1][17],"dayPeriods":b[0][1151]},{"months":b[1][18],"days":b[1][522],"eras":b[1][19],"dayPeriods":b[0][1151]},{"months":b[1][521],"days":b[1][522],"eras":b[1][27],"dayPeriods":b[0][1151]},{"nu":b[0][37],"patterns":b[1][33],"symbols":b[1][28],"currencies":b[0][1154]},{"months":b[1][524],"days":b[1][525],"eras":b[1][3],"dayPeriods":b[0][1161]},{"months":b[1][9],"days":b[1][525],"dayPeriods":b[0][1161]},{"months":b[1][5],"days":b[1][525],"eras":b[1][6],"dayPeriods":b[0][1161]},{"months":b[1][7],"days":b[1][525],"eras":b[1][6],"dayPeriods":b[0][1161]},{"months":b[1][7],"days":b[1][525],"eras":b[1][8],"dayPeriods":b[0][1161]},{"months":b[1][9],"days":b[1][525],"eras":b[1][6],"dayPeriods":b[0][1161]},{"months":b[1][524],"days":b[1][525],"eras":b[1][526],"dayPeriods":b[0][1161]},{"months":b[1][11],"days":b[1][525],"eras":b[1][12],"dayPeriods":b[0][1161]},{"months":b[1][13],"days":b[1][525],"eras":b[1][14],"dayPeriods":b[0][1161]},{"months":b[1][15],"days":b[1][525],"eras":b[1][16],"dayPeriods":b[0][1161]},{"months":b[1][524],"days":b[1][525],"eras":b[1][17],"dayPeriods":b[0][1161]},{"months":b[1][18],"days":b[1][525],"eras":b[1][19],"dayPeriods":b[0][1161]},{"months":b[1][524],"days":b[1][525],"eras":b[1][27],"dayPeriods":b[0][1161]},{"months":b[1][527],"days":b[1][528],"eras":b[1][3],"dayPeriods":b[0][1168]},{"months":b[1][9],"days":b[1][528],"dayPeriods":b[0][1168]},{"months":b[1][5],"days":b[1][528],"eras":b[1][6],"dayPeriods":b[0][1168]},{"months":b[1][7],"days":b[1][528],"eras":b[1][6],"dayPeriods":b[0][1168]},{"months":b[1][7],"days":b[1][528],"eras":b[1][8],"dayPeriods":b[0][1168]},{"months":b[1][9],"days":b[1][528],"eras":b[1][6],"dayPeriods":b[0][1168]},{"months":b[1][527],"days":b[1][528],"eras":b[1][529],"dayPeriods":b[0][1168]},{"months":b[1][11],"days":b[1][528],"eras":b[1][12],"dayPeriods":b[0][1168]},{"months":b[1][13],"days":b[1][528],"eras":b[1][14],"dayPeriods":b[0][1168]},{"months":b[1][15],"days":b[1][528],"eras":b[1][16],"dayPeriods":b[0][1168]},{"months":b[1][527],"days":b[1][528],"eras":b[1][17],"dayPeriods":b[0][1168]},{"months":b[1][18],"days":b[1][528],"eras":b[1][19],"dayPeriods":b[0][1168]},{"months":b[1][527],"days":b[1][528],"eras":b[1][27],"dayPeriods":b[0][1168]},{"months":b[1][531],"days":b[1][532],"eras":b[1][3],"dayPeriods":b[0][549]},{"months":b[1][9],"days":b[1][532],"dayPeriods":b[0][549]},{"months":b[1][5],"days":b[1][532],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][7],"days":b[1][532],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][7],"days":b[1][532],"eras":b[1][8],"dayPeriods":b[0][549]},{"months":b[1][9],"days":b[1][532],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][531],"days":b[1][532],"eras":b[1][533],"dayPeriods":b[0][549]},{"months":b[1][11],"days":b[1][532],"eras":b[1][12],"dayPeriods":b[0][549]},{"months":b[1][13],"days":b[1][532],"eras":b[1][14],"dayPeriods":b[0][549]},{"months":b[1][15],"days":b[1][532],"eras":b[1][16],"dayPeriods":b[0][549]},{"months":b[1][531],"days":b[1][532],"eras":b[1][17],"dayPeriods":b[0][549]},{"months":b[1][18],"days":b[1][532],"eras":b[1][19],"dayPeriods":b[0][549]},{"months":b[1][531],"days":b[1][532],"eras":b[1][27],"dayPeriods":b[0][549]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1180]},{"months":b[1][214],"days":b[1][534],"eras":b[1][3],"dayPeriods":b[0][1184]},{"months":b[1][9],"days":b[1][534],"dayPeriods":b[0][1184]},{"months":b[1][5],"days":b[1][534],"eras":b[1][6],"dayPeriods":b[0][1184]},{"months":b[1][7],"days":b[1][534],"eras":b[1][6],"dayPeriods":b[0][1184]},{"months":b[1][7],"days":b[1][534],"eras":b[1][8],"dayPeriods":b[0][1184]},{"months":b[1][9],"days":b[1][534],"eras":b[1][6],"dayPeriods":b[0][1184]},{"months":b[1][214],"days":b[1][534],"eras":b[1][535],"dayPeriods":b[0][1184]},{"months":b[1][11],"days":b[1][534],"eras":b[1][12],"dayPeriods":b[0][1184]},{"months":b[1][13],"days":b[1][534],"eras":b[1][14],"dayPeriods":b[0][1184]},{"months":b[1][15],"days":b[1][534],"eras":b[1][16],"dayPeriods":b[0][1184]},{"months":b[1][214],"days":b[1][534],"eras":b[1][17],"dayPeriods":b[0][1184]},{"months":b[1][18],"days":b[1][534],"eras":b[1][19],"dayPeriods":b[0][1184]},{"months":b[1][214],"days":b[1][534],"eras":b[1][27],"dayPeriods":b[0][1184]},{"months":b[1][536],"days":b[1][537],"eras":b[1][3],"dayPeriods":b[0][1192]},{"months":b[1][9],"days":b[1][537],"dayPeriods":b[0][1192]},{"months":b[1][5],"days":b[1][537],"eras":b[1][6],"dayPeriods":b[0][1192]},{"months":b[1][7],"days":b[1][537],"eras":b[1][6],"dayPeriods":b[0][1192]},{"months":b[1][7],"days":b[1][537],"eras":b[1][8],"dayPeriods":b[0][1192]},{"months":b[1][9],"days":b[1][537],"eras":b[1][6],"dayPeriods":b[0][1192]},{"months":b[1][536],"days":b[1][537],"eras":b[1][236],"dayPeriods":b[0][1192]},{"months":b[1][11],"days":b[1][537],"eras":b[1][12],"dayPeriods":b[0][1192]},{"months":b[1][13],"days":b[1][537],"eras":b[1][14],"dayPeriods":b[0][1192]},{"months":b[1][15],"days":b[1][537],"eras":b[1][16],"dayPeriods":b[0][1192]},{"months":b[1][536],"days":b[1][537],"eras":b[1][17],"dayPeriods":b[0][1192]},{"months":b[1][18],"days":b[1][537],"eras":b[1][19],"dayPeriods":b[0][1192]},{"months":b[1][536],"days":b[1][537],"eras":b[1][27],"dayPeriods":b[0][1192]},{"months":b[1][539],"days":b[1][540],"eras":b[1][3],"dayPeriods":b[0][1201]},{"months":b[1][9],"days":b[1][540],"dayPeriods":b[0][1201]},{"months":b[1][5],"days":b[1][540],"eras":b[1][6],"dayPeriods":b[0][1201]},{"months":b[1][7],"days":b[1][540],"eras":b[1][6],"dayPeriods":b[0][1201]},{"months":b[1][7],"days":b[1][540],"eras":b[1][8],"dayPeriods":b[0][1201]},{"months":b[1][9],"days":b[1][540],"eras":b[1][6],"dayPeriods":b[0][1201]},{"months":b[1][539],"days":b[1][540],"eras":b[1][541],"dayPeriods":b[0][1201]},{"months":b[1][11],"days":b[1][540],"eras":b[1][12],"dayPeriods":b[0][1201]},{"months":b[1][13],"days":b[1][540],"eras":b[1][14],"dayPeriods":b[0][1201]},{"months":b[1][15],"days":b[1][540],"eras":b[1][16],"dayPeriods":b[0][1201]},{"months":b[1][539],"days":b[1][540],"eras":b[1][17],"dayPeriods":b[0][1201]},{"months":b[1][18],"days":b[1][540],"eras":b[1][19],"dayPeriods":b[0][1201]},{"months":b[1][539],"days":b[1][540],"eras":b[1][27],"dayPeriods":b[0][1201]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1204]},{"months":b[1][543],"days":b[1][544],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][544],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][544],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][544],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][544],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][544],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][543],"days":b[1][544],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][544],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][544],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][544],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][543],"days":b[1][544],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][544],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][543],"days":b[1][544],"eras":b[1][27],"dayPeriods":b[0][11]},{"months":b[1][545],"days":b[1][546],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][546],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][546],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][546],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][546],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][546],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][545],"days":b[1][546],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][546],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][546],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][546],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][545],"days":b[1][546],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][546],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][545],"days":b[1][546],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][286],"symbols":b[1][95],"currencies":b[0][569]},{"months":b[1][547],"days":b[1][548],"eras":b[1][3],"dayPeriods":b[0][1219]},{"months":b[1][9],"days":b[1][548],"dayPeriods":b[0][1219]},{"months":b[1][5],"days":b[1][548],"eras":b[1][6],"dayPeriods":b[0][1219]},{"months":b[1][7],"days":b[1][548],"eras":b[1][6],"dayPeriods":b[0][1219]},{"months":b[1][7],"days":b[1][548],"eras":b[1][8],"dayPeriods":b[0][1219]},{"months":b[1][9],"days":b[1][548],"eras":b[1][6],"dayPeriods":b[0][1219]},{"months":b[1][547],"days":b[1][548],"eras":b[1][549],"dayPeriods":b[0][1219]},{"months":b[1][11],"days":b[1][548],"eras":b[1][12],"dayPeriods":b[0][1219]},{"months":b[1][13],"days":b[1][548],"eras":b[1][14],"dayPeriods":b[0][1219]},{"months":b[1][15],"days":b[1][548],"eras":b[1][16],"dayPeriods":b[0][1219]},{"months":b[1][547],"days":b[1][548],"eras":b[1][17],"dayPeriods":b[0][1219]},{"months":b[1][18],"days":b[1][548],"eras":b[1][19],"dayPeriods":b[0][1219]},{"months":b[1][547],"days":b[1][548],"eras":b[1][27],"dayPeriods":b[0][1219]},{"months":b[1][551],"days":b[1][552],"eras":b[1][3],"dayPeriods":b[0][1227]},{"months":b[1][9],"days":b[1][552],"dayPeriods":b[0][1227]},{"months":b[1][5],"days":b[1][552],"eras":b[1][6],"dayPeriods":b[0][1227]},{"months":b[1][7],"days":b[1][552],"eras":b[1][6],"dayPeriods":b[0][1227]},{"months":b[1][7],"days":b[1][552],"eras":b[1][8],"dayPeriods":b[0][1227]},{"months":b[1][9],"days":b[1][552],"eras":b[1][6],"dayPeriods":b[0][1227]},{"months":b[1][551],"days":b[1][552],"eras":b[1][553],"dayPeriods":b[0][1227]},{"months":b[1][11],"days":b[1][552],"eras":b[1][12],"dayPeriods":b[0][1227]},{"months":b[1][13],"days":b[1][552],"eras":b[1][14],"dayPeriods":b[0][1227]},{"months":b[1][15],"days":b[1][552],"eras":b[1][16],"dayPeriods":b[0][1227]},{"months":b[1][551],"days":b[1][552],"eras":b[1][17],"dayPeriods":b[0][1227]},{"months":b[1][18],"days":b[1][552],"eras":b[1][19],"dayPeriods":b[0][1227]},{"months":b[1][551],"days":b[1][552],"eras":b[1][27],"dayPeriods":b[0][1227]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][554],"currencies":b[0][1230]},{"months":b[1][556],"days":b[1][557],"eras":b[1][3],"dayPeriods":b[0][1239]},{"months":b[1][9],"days":b[1][557],"dayPeriods":b[0][1239]},{"months":b[1][5],"days":b[1][557],"eras":b[1][6],"dayPeriods":b[0][1239]},{"months":b[1][7],"days":b[1][557],"eras":b[1][6],"dayPeriods":b[0][1239]},{"months":b[1][7],"days":b[1][557],"eras":b[1][8],"dayPeriods":b[0][1239]},{"months":b[1][9],"days":b[1][557],"eras":b[1][6],"dayPeriods":b[0][1239]},{"months":b[1][556],"days":b[1][557],"eras":b[1][558],"dayPeriods":b[0][1239]},{"months":b[1][11],"days":b[1][557],"eras":b[1][12],"dayPeriods":b[0][1239]},{"months":b[1][13],"days":b[1][557],"eras":b[1][14],"dayPeriods":b[0][1239]},{"months":b[1][15],"days":b[1][557],"eras":b[1][16],"dayPeriods":b[0][1239]},{"months":b[1][556],"days":b[1][557],"eras":b[1][17],"dayPeriods":b[0][1239]},{"months":b[1][18],"days":b[1][557],"eras":b[1][19],"dayPeriods":b[0][1239]},{"months":b[1][556],"days":b[1][557],"eras":b[1][27],"dayPeriods":b[0][1239]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][559],"currencies":b[0][894]},{"months":b[1][561],"days":b[1][562],"eras":b[1][563],"dayPeriods":b[0][1249]},{"months":b[1][564],"days":b[1][562],"dayPeriods":b[0][1249]},{"months":b[1][565],"days":b[1][562],"eras":b[1][6],"dayPeriods":b[0][1249]},{"months":b[1][566],"days":b[1][562],"eras":b[1][6],"dayPeriods":b[0][1249]},{"months":b[1][566],"days":b[1][562],"eras":b[1][8],"dayPeriods":b[0][1249]},{"months":b[1][9],"days":b[1][562],"eras":b[1][6],"dayPeriods":b[0][1249]},{"months":b[1][561],"days":b[1][562],"eras":b[1][567],"dayPeriods":b[0][1249]},{"months":b[1][568],"days":b[1][562],"eras":b[1][12],"dayPeriods":b[0][1249]},{"months":b[1][13],"days":b[1][562],"eras":b[1][14],"dayPeriods":b[0][1249]},{"months":b[1][569],"days":b[1][562],"eras":b[1][16],"dayPeriods":b[0][1249]},{"months":b[1][561],"days":b[1][562],"eras":b[1][570],"dayPeriods":b[0][1249]},{"months":b[1][571],"days":b[1][562],"eras":b[1][19],"dayPeriods":b[0][1249]},{"months":b[1][561],"days":b[1][562],"eras":b[1][572],"dayPeriods":b[0][1249]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1258]},{"months":b[1][573],"days":b[1][574],"eras":b[1][3],"dayPeriods":b[0][1262]},{"months":b[1][9],"days":b[1][574],"dayPeriods":b[0][1262]},{"months":b[1][5],"days":b[1][574],"eras":b[1][6],"dayPeriods":b[0][1262]},{"months":b[1][7],"days":b[1][574],"eras":b[1][6],"dayPeriods":b[0][1262]},{"months":b[1][7],"days":b[1][574],"eras":b[1][8],"dayPeriods":b[0][1262]},{"months":b[1][9],"days":b[1][574],"eras":b[1][6],"dayPeriods":b[0][1262]},{"months":b[1][573],"days":b[1][574],"eras":b[1][575],"dayPeriods":b[0][1262]},{"months":b[1][11],"days":b[1][574],"eras":b[1][12],"dayPeriods":b[0][1262]},{"months":b[1][13],"days":b[1][574],"eras":b[1][14],"dayPeriods":b[0][1262]},{"months":b[1][15],"days":b[1][574],"eras":b[1][16],"dayPeriods":b[0][1262]},{"months":b[1][573],"days":b[1][574],"eras":b[1][17],"dayPeriods":b[0][1262]},{"months":b[1][18],"days":b[1][574],"eras":b[1][19],"dayPeriods":b[0][1262]},{"months":b[1][573],"days":b[1][574],"eras":b[1][27],"dayPeriods":b[0][1262]},{"months":b[1][577],"days":b[1][578],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][578],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][578],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][578],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][578],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][578],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][577],"days":b[1][578],"eras":b[1][579],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][578],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][580],"days":b[1][578],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][578],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][577],"days":b[1][578],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][578],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][577],"days":b[1][578],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][748],"patterns":b[1][73],"symbols":b[1][581],"currencies":b[0][70]},{"months":b[1][582],"days":b[1][583],"eras":b[1][3],"dayPeriods":b[0][1279]},{"months":b[1][9],"days":b[1][583],"dayPeriods":b[0][1279]},{"months":b[1][5],"days":b[1][583],"eras":b[1][6],"dayPeriods":b[0][1279]},{"months":b[1][7],"days":b[1][583],"eras":b[1][6],"dayPeriods":b[0][1279]},{"months":b[1][7],"days":b[1][583],"eras":b[1][8],"dayPeriods":b[0][1279]},{"months":b[1][9],"days":b[1][583],"eras":b[1][6],"dayPeriods":b[0][1279]},{"months":b[1][582],"days":b[1][583],"eras":b[1][584],"dayPeriods":b[0][1279]},{"months":b[1][11],"days":b[1][583],"eras":b[1][12],"dayPeriods":b[0][1279]},{"months":b[1][13],"days":b[1][583],"eras":b[1][14],"dayPeriods":b[0][1279]},{"months":b[1][15],"days":b[1][583],"eras":b[1][16],"dayPeriods":b[0][1279]},{"months":b[1][582],"days":b[1][583],"eras":b[1][17],"dayPeriods":b[0][1279]},{"months":b[1][18],"days":b[1][583],"eras":b[1][19],"dayPeriods":b[0][1279]},{"months":b[1][582],"days":b[1][583],"eras":b[1][27],"dayPeriods":b[0][1279]},{"months":b[1][585],"days":b[1][586],"eras":b[1][3],"dayPeriods":b[0][1286]},{"months":b[1][9],"days":b[1][586],"dayPeriods":b[0][1286]},{"months":b[1][5],"days":b[1][586],"eras":b[1][6],"dayPeriods":b[0][1286]},{"months":b[1][7],"days":b[1][586],"eras":b[1][6],"dayPeriods":b[0][1286]},{"months":b[1][7],"days":b[1][586],"eras":b[1][8],"dayPeriods":b[0][1286]},{"months":b[1][9],"days":b[1][586],"eras":b[1][6],"dayPeriods":b[0][1286]},{"months":b[1][585],"days":b[1][586],"eras":b[1][587],"dayPeriods":b[0][1286]},{"months":b[1][11],"days":b[1][586],"eras":b[1][12],"dayPeriods":b[0][1286]},{"months":b[1][13],"days":b[1][586],"eras":b[1][14],"dayPeriods":b[0][1286]},{"months":b[1][15],"days":b[1][586],"eras":b[1][16],"dayPeriods":b[0][1286]},{"months":b[1][585],"days":b[1][586],"eras":b[1][17],"dayPeriods":b[0][1286]},{"months":b[1][18],"days":b[1][586],"eras":b[1][19],"dayPeriods":b[0][1286]},{"months":b[1][585],"days":b[1][586],"eras":b[1][27],"dayPeriods":b[0][1286]},{"months":b[1][589],"days":b[1][590],"eras":b[1][3],"dayPeriods":b[0][1295]},{"months":b[1][9],"days":b[1][590],"dayPeriods":b[0][1295]},{"months":b[1][5],"days":b[1][590],"eras":b[1][6],"dayPeriods":b[0][1295]},{"months":b[1][7],"days":b[1][590],"eras":b[1][6],"dayPeriods":b[0][1295]},{"months":b[1][7],"days":b[1][590],"eras":b[1][8],"dayPeriods":b[0][1295]},{"months":b[1][9],"days":b[1][590],"eras":b[1][6],"dayPeriods":b[0][1295]},{"months":b[1][589],"days":b[1][590],"eras":b[1][591],"dayPeriods":b[0][1295]},{"months":b[1][11],"days":b[1][590],"eras":b[1][12],"dayPeriods":b[0][1295]},{"months":b[1][13],"days":b[1][590],"eras":b[1][14],"dayPeriods":b[0][1295]},{"months":b[1][15],"days":b[1][590],"eras":b[1][16],"dayPeriods":b[0][1295]},{"months":b[1][589],"days":b[1][590],"eras":b[1][17],"dayPeriods":b[0][1295]},{"months":b[1][18],"days":b[1][590],"eras":b[1][19],"dayPeriods":b[0][1295]},{"months":b[1][589],"days":b[1][590],"eras":b[1][27],"dayPeriods":b[0][1295]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][592],"currencies":b[0][70]},{"months":b[1][593],"days":b[1][594],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][594],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][594],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][594],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][594],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][594],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][593],"days":b[1][594],"eras":b[1][415],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][594],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][594],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][594],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][593],"days":b[1][594],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][594],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][593],"days":b[1][594],"eras":b[1][27],"dayPeriods":b[0][582]},{"months":b[1][596],"days":b[1][597],"eras":b[1][3],"dayPeriods":b[0][1311]},{"months":b[1][9],"days":b[1][597],"dayPeriods":b[0][1311]},{"months":b[1][5],"days":b[1][597],"eras":b[1][6],"dayPeriods":b[0][1311]},{"months":b[1][7],"days":b[1][597],"eras":b[1][6],"dayPeriods":b[0][1311]},{"months":b[1][7],"days":b[1][597],"eras":b[1][8],"dayPeriods":b[0][1311]},{"months":b[1][9],"days":b[1][597],"eras":b[1][6],"dayPeriods":b[0][1311]},{"months":b[1][596],"days":b[1][597],"eras":b[1][598],"dayPeriods":b[0][1311]},{"months":b[1][11],"days":b[1][597],"eras":b[1][12],"dayPeriods":b[0][1311]},{"months":b[1][13],"days":b[1][597],"eras":b[1][14],"dayPeriods":b[0][1311]},{"months":b[1][15],"days":b[1][597],"eras":b[1][16],"dayPeriods":b[0][1311]},{"months":b[1][596],"days":b[1][597],"eras":b[1][17],"dayPeriods":b[0][1311]},{"months":b[1][18],"days":b[1][597],"eras":b[1][19],"dayPeriods":b[0][1311]},{"months":b[1][596],"days":b[1][597],"eras":b[1][27],"dayPeriods":b[0][1311]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][599],"currencies":b[0][1315]},{"months":b[1][600],"days":b[1][601],"eras":b[1][3],"dayPeriods":b[0][1322]},{"months":b[1][9],"days":b[1][601],"dayPeriods":b[0][1322]},{"months":b[1][5],"days":b[1][601],"eras":b[1][6],"dayPeriods":b[0][1322]},{"months":b[1][7],"days":b[1][601],"eras":b[1][6],"dayPeriods":b[0][1322]},{"months":b[1][7],"days":b[1][601],"eras":b[1][8],"dayPeriods":b[0][1322]},{"months":b[1][9],"days":b[1][601],"eras":b[1][6],"dayPeriods":b[0][1322]},{"months":b[1][600],"days":b[1][601],"eras":b[1][602],"dayPeriods":b[0][1322]},{"months":b[1][11],"days":b[1][601],"eras":b[1][12],"dayPeriods":b[0][1322]},{"months":b[1][13],"days":b[1][601],"eras":b[1][14],"dayPeriods":b[0][1322]},{"months":b[1][15],"days":b[1][601],"eras":b[1][16],"dayPeriods":b[0][1322]},{"months":b[1][600],"days":b[1][601],"eras":b[1][17],"dayPeriods":b[0][1322]},{"months":b[1][18],"days":b[1][601],"eras":b[1][19],"dayPeriods":b[0][1322]},{"months":b[1][600],"days":b[1][601],"eras":b[1][27],"dayPeriods":b[0][1322]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][22],"currencies":b[0][160]},{"months":b[1][604],"days":b[1][605],"eras":b[1][3],"dayPeriods":b[0][1330]},{"months":b[1][9],"days":b[1][605],"dayPeriods":b[0][1330]},{"months":b[1][5],"days":b[1][605],"eras":b[1][6],"dayPeriods":b[0][1330]},{"months":b[1][7],"days":b[1][605],"eras":b[1][6],"dayPeriods":b[0][1330]},{"months":b[1][7],"days":b[1][605],"eras":b[1][8],"dayPeriods":b[0][1330]},{"months":b[1][9],"days":b[1][605],"eras":b[1][6],"dayPeriods":b[0][1330]},{"months":b[1][604],"days":b[1][605],"eras":b[1][606],"dayPeriods":b[0][1330]},{"months":b[1][11],"days":b[1][605],"eras":b[1][12],"dayPeriods":b[0][1330]},{"months":b[1][13],"days":b[1][605],"eras":b[1][14],"dayPeriods":b[0][1330]},{"months":b[1][15],"days":b[1][605],"eras":b[1][16],"dayPeriods":b[0][1330]},{"months":b[1][604],"days":b[1][605],"eras":b[1][17],"dayPeriods":b[0][1330]},{"months":b[1][18],"days":b[1][605],"eras":b[1][19],"dayPeriods":b[0][1330]},{"months":b[1][604],"days":b[1][605],"eras":b[1][20],"dayPeriods":b[0][1330]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][1332]},{"months":b[1][607],"days":b[1][608],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][608],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][608],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][608],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][608],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][608],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][607],"days":b[1][608],"eras":b[1][609],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][608],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][608],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][608],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][607],"days":b[1][608],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][608],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][607],"days":b[1][608],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][33],"symbols":b[1][22],"currencies":b[0][377]},{"months":b[1][610],"days":b[1][611],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][611],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][611],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][611],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][611],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][611],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][610],"days":b[1][611],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][611],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][611],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][611],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][610],"days":b[1][611],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][611],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][610],"days":b[1][611],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][22],"currencies":b[0][388]},{"months":b[1][612],"days":b[1][613],"eras":b[1][3],"dayPeriods":b[0][1348]},{"months":b[1][9],"days":b[1][613],"dayPeriods":b[0][1348]},{"months":b[1][5],"days":b[1][613],"eras":b[1][6],"dayPeriods":b[0][1348]},{"months":b[1][7],"days":b[1][613],"eras":b[1][6],"dayPeriods":b[0][1348]},{"months":b[1][7],"days":b[1][613],"eras":b[1][8],"dayPeriods":b[0][1348]},{"months":b[1][9],"days":b[1][613],"eras":b[1][6],"dayPeriods":b[0][1348]},{"months":b[1][612],"days":b[1][613],"eras":b[1][614],"dayPeriods":b[0][1348]},{"months":b[1][11],"days":b[1][613],"eras":b[1][12],"dayPeriods":b[0][1348]},{"months":b[1][13],"days":b[1][613],"eras":b[1][14],"dayPeriods":b[0][1348]},{"months":b[1][15],"days":b[1][613],"eras":b[1][16],"dayPeriods":b[0][1348]},{"months":b[1][612],"days":b[1][613],"eras":b[1][17],"dayPeriods":b[0][1348]},{"months":b[1][18],"days":b[1][613],"eras":b[1][19],"dayPeriods":b[0][1348]},{"months":b[1][612],"days":b[1][613],"eras":b[1][27],"dayPeriods":b[0][1348]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][1351]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][1352]},{"months":b[1][616],"days":b[1][617],"eras":b[1][3],"dayPeriods":b[0][1360]},{"months":b[1][176],"days":b[1][617],"dayPeriods":b[0][1360]},{"months":b[1][618],"days":b[1][617],"eras":b[1][6],"dayPeriods":b[0][1360]},{"months":b[1][619],"days":b[1][617],"eras":b[1][6],"dayPeriods":b[0][1360]},{"months":b[1][619],"days":b[1][617],"eras":b[1][8],"dayPeriods":b[0][1360]},{"months":b[1][9],"days":b[1][617],"eras":b[1][6],"dayPeriods":b[0][1360]},{"months":b[1][616],"days":b[1][617],"eras":b[1][620],"dayPeriods":b[0][1360]},{"months":b[1][621],"days":b[1][617],"eras":b[1][12],"dayPeriods":b[0][1360]},{"months":b[1][622],"days":b[1][617],"eras":b[1][623],"dayPeriods":b[0][1360]},{"months":b[1][624],"days":b[1][617],"eras":b[1][16],"dayPeriods":b[0][1360]},{"months":b[1][616],"days":b[1][617],"eras":b[1][625],"dayPeriods":b[0][1360]},{"months":b[1][626],"days":b[1][617],"eras":b[1][627],"dayPeriods":b[0][1360]},{"months":b[1][616],"days":b[1][617],"eras":b[1][628],"dayPeriods":b[0][1360]},{"nu":b[0][37],"patterns":b[1][629],"symbols":b[1][630],"currencies":b[0][1378]},{"months":b[1][631],"days":b[1][96],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][631],"days":b[1][96],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][631],"days":b[1][96],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][631],"days":b[1][96],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][748],"patterns":b[1][58],"symbols":b[1][632],"currencies":b[0][70]},{"months":b[1][634],"days":b[1][635],"eras":b[1][3],"dayPeriods":b[0][1388]},{"months":b[1][176],"days":b[1][635],"dayPeriods":b[0][1388]},{"months":b[1][5],"days":b[1][635],"eras":b[1][6],"dayPeriods":b[0][1388]},{"months":b[1][7],"days":b[1][635],"eras":b[1][6],"dayPeriods":b[0][1388]},{"months":b[1][7],"days":b[1][635],"eras":b[1][8],"dayPeriods":b[0][1388]},{"months":b[1][9],"days":b[1][635],"eras":b[1][6],"dayPeriods":b[0][1388]},{"months":b[1][634],"days":b[1][635],"eras":b[1][636],"dayPeriods":b[0][1388]},{"months":b[1][11],"days":b[1][635],"eras":b[1][12],"dayPeriods":b[0][1388]},{"months":b[1][13],"days":b[1][635],"eras":b[1][14],"dayPeriods":b[0][1388]},{"months":b[1][15],"days":b[1][635],"eras":b[1][16],"dayPeriods":b[0][1388]},{"months":b[1][634],"days":b[1][635],"eras":b[1][637],"dayPeriods":b[0][1388]},{"months":b[1][18],"days":b[1][635],"eras":b[1][19],"dayPeriods":b[0][1388]},{"months":b[1][634],"days":b[1][635],"eras":b[1][638],"dayPeriods":b[0][1388]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][309],"currencies":b[0][1393]},{"months":b[1][639],"days":b[1][640],"eras":b[1][3],"dayPeriods":b[0][1400]},{"months":b[1][9],"days":b[1][640],"dayPeriods":b[0][1400]},{"months":b[1][5],"days":b[1][640],"eras":b[1][6],"dayPeriods":b[0][1400]},{"months":b[1][7],"days":b[1][640],"eras":b[1][6],"dayPeriods":b[0][1400]},{"months":b[1][7],"days":b[1][640],"eras":b[1][8],"dayPeriods":b[0][1400]},{"months":b[1][9],"days":b[1][640],"eras":b[1][6],"dayPeriods":b[0][1400]},{"months":b[1][639],"days":b[1][640],"eras":b[1][641],"dayPeriods":b[0][1400]},{"months":b[1][11],"days":b[1][640],"eras":b[1][12],"dayPeriods":b[0][1400]},{"months":b[1][13],"days":b[1][640],"eras":b[1][14],"dayPeriods":b[0][1400]},{"months":b[1][15],"days":b[1][640],"eras":b[1][16],"dayPeriods":b[0][1400]},{"months":b[1][639],"days":b[1][640],"eras":b[1][17],"dayPeriods":b[0][1400]},{"months":b[1][18],"days":b[1][640],"eras":b[1][19],"dayPeriods":b[0][1400]},{"months":b[1][639],"days":b[1][640],"eras":b[1][27],"dayPeriods":b[0][1400]},{"nu":b[0][37],"patterns":b[1][33],"symbols":b[1][95],"currencies":b[0][1351]},{"months":b[1][642],"days":b[1][643],"eras":b[1][3],"dayPeriods":b[0][1409]},{"months":b[1][9],"days":b[1][643],"dayPeriods":b[0][1409]},{"months":b[1][5],"days":b[1][643],"eras":b[1][6],"dayPeriods":b[0][1409]},{"months":b[1][7],"days":b[1][643],"eras":b[1][6],"dayPeriods":b[0][1409]},{"months":b[1][7],"days":b[1][643],"eras":b[1][8],"dayPeriods":b[0][1409]},{"months":b[1][9],"days":b[1][643],"eras":b[1][6],"dayPeriods":b[0][1409]},{"months":b[1][642],"days":b[1][643],"eras":b[1][644],"dayPeriods":b[0][1409]},{"months":b[1][11],"days":b[1][643],"eras":b[1][12],"dayPeriods":b[0][1409]},{"months":b[1][13],"days":b[1][643],"eras":b[1][14],"dayPeriods":b[0][1409]},{"months":b[1][15],"days":b[1][643],"eras":b[1][16],"dayPeriods":b[0][1409]},{"months":b[1][642],"days":b[1][643],"eras":b[1][17],"dayPeriods":b[0][1409]},{"months":b[1][18],"days":b[1][643],"eras":b[1][19],"dayPeriods":b[0][1409]},{"months":b[1][642],"days":b[1][643],"eras":b[1][27],"dayPeriods":b[0][1409]},{"nu":b[0][37],"patterns":b[1][33],"symbols":b[1][22],"currencies":b[0][436]},{"months":b[1][645],"days":b[1][646],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][646],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][646],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][646],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][646],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][646],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][645],"days":b[1][646],"eras":b[1][647],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][646],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][646],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][646],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][645],"days":b[1][646],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][646],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][645],"days":b[1][646],"eras":b[1][27],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][648],"symbols":b[1][22],"currencies":b[0][436]},{"months":b[1][650],"days":b[1][651],"eras":b[1][3],"dayPeriods":b[0][1423]},{"months":b[1][9],"days":b[1][651],"dayPeriods":b[0][1423]},{"months":b[1][5],"days":b[1][651],"eras":b[1][6],"dayPeriods":b[0][1423]},{"months":b[1][7],"days":b[1][651],"eras":b[1][6],"dayPeriods":b[0][1423]},{"months":b[1][7],"days":b[1][651],"eras":b[1][8],"dayPeriods":b[0][1423]},{"months":b[1][9],"days":b[1][651],"eras":b[1][6],"dayPeriods":b[0][1423]},{"months":b[1][650],"days":b[1][651],"eras":b[1][652],"dayPeriods":b[0][1423]},{"months":b[1][653],"days":b[1][651],"eras":b[1][12],"dayPeriods":b[0][1423]},{"months":b[1][13],"days":b[1][651],"eras":b[1][14],"dayPeriods":b[0][1423]},{"months":b[1][654],"days":b[1][651],"eras":b[1][16],"dayPeriods":b[0][1423]},{"months":b[1][650],"days":b[1][651],"eras":b[1][17],"dayPeriods":b[0][1423]},{"months":b[1][18],"days":b[1][651],"eras":b[1][19],"dayPeriods":b[0][1423]},{"months":b[1][650],"days":b[1][651],"eras":b[1][27],"dayPeriods":b[0][1423]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][655],"currencies":b[0][1429]},{"months":b[1][656],"days":b[1][657],"eras":b[1][3],"dayPeriods":b[0][1433]},{"months":b[1][9],"days":b[1][657],"dayPeriods":b[0][1433]},{"months":b[1][5],"days":b[1][657],"eras":b[1][6],"dayPeriods":b[0][1433]},{"months":b[1][7],"days":b[1][657],"eras":b[1][6],"dayPeriods":b[0][1433]},{"months":b[1][7],"days":b[1][657],"eras":b[1][8],"dayPeriods":b[0][1433]},{"months":b[1][9],"days":b[1][657],"eras":b[1][6],"dayPeriods":b[0][1433]},{"months":b[1][656],"days":b[1][657],"eras":b[1][658],"dayPeriods":b[0][1433]},{"months":b[1][11],"days":b[1][657],"eras":b[1][12],"dayPeriods":b[0][1433]},{"months":b[1][13],"days":b[1][657],"eras":b[1][14],"dayPeriods":b[0][1433]},{"months":b[1][15],"days":b[1][657],"eras":b[1][16],"dayPeriods":b[0][1433]},{"months":b[1][656],"days":b[1][657],"eras":b[1][17],"dayPeriods":b[0][1433]},{"months":b[1][18],"days":b[1][657],"eras":b[1][19],"dayPeriods":b[0][1433]},{"months":b[1][656],"days":b[1][657],"eras":b[1][27],"dayPeriods":b[0][1433]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1436]},{"months":b[1][659],"days":b[1][660],"eras":b[1][3],"dayPeriods":b[0][1443]},{"months":b[1][9],"days":b[1][660],"dayPeriods":b[0][1443]},{"months":b[1][5],"days":b[1][660],"eras":b[1][6],"dayPeriods":b[0][1443]},{"months":b[1][7],"days":b[1][660],"eras":b[1][6],"dayPeriods":b[0][1443]},{"months":b[1][7],"days":b[1][660],"eras":b[1][8],"dayPeriods":b[0][1443]},{"months":b[1][9],"days":b[1][660],"eras":b[1][6],"dayPeriods":b[0][1443]},{"months":b[1][659],"days":b[1][660],"eras":b[1][661],"dayPeriods":b[0][1443]},{"months":b[1][11],"days":b[1][660],"eras":b[1][12],"dayPeriods":b[0][1443]},{"months":b[1][13],"days":b[1][660],"eras":b[1][14],"dayPeriods":b[0][1443]},{"months":b[1][15],"days":b[1][660],"eras":b[1][16],"dayPeriods":b[0][1443]},{"months":b[1][659],"days":b[1][660],"eras":b[1][17],"dayPeriods":b[0][1443]},{"months":b[1][18],"days":b[1][660],"eras":b[1][19],"dayPeriods":b[0][1443]},{"months":b[1][659],"days":b[1][660],"eras":b[1][27],"dayPeriods":b[0][1443]},{"months":b[1][662],"days":b[1][663],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][663],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][663],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][663],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][663],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][663],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][662],"days":b[1][663],"eras":b[1][664],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][663],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][663],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][663],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][662],"days":b[1][663],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][663],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][662],"days":b[1][663],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][217],"currencies":b[0][595]},{"months":b[1][666],"days":b[1][667],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][667],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][667],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][667],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][667],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][667],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][666],"days":b[1][667],"eras":b[1][668],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][667],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][667],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][667],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][666],"days":b[1][667],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][667],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][666],"days":b[1][667],"eras":b[1][27],"dayPeriods":b[0][11]},{"months":b[1][670],"days":b[1][671],"eras":b[1][3],"dayPeriods":b[0][1468]},{"months":b[1][9],"days":b[1][671],"dayPeriods":b[0][1468]},{"months":b[1][5],"days":b[1][671],"eras":b[1][6],"dayPeriods":b[0][1468]},{"months":b[1][7],"days":b[1][671],"eras":b[1][6],"dayPeriods":b[0][1468]},{"months":b[1][7],"days":b[1][671],"eras":b[1][8],"dayPeriods":b[0][1468]},{"months":b[1][9],"days":b[1][671],"eras":b[1][6],"dayPeriods":b[0][1468]},{"months":b[1][670],"days":b[1][671],"eras":b[1][672],"dayPeriods":b[0][1468]},{"months":b[1][11],"days":b[1][671],"eras":b[1][12],"dayPeriods":b[0][1468]},{"months":b[1][13],"days":b[1][671],"eras":b[1][14],"dayPeriods":b[0][1468]},{"months":b[1][15],"days":b[1][671],"eras":b[1][16],"dayPeriods":b[0][1468]},{"months":b[1][670],"days":b[1][671],"eras":b[1][17],"dayPeriods":b[0][1468]},{"months":b[1][18],"days":b[1][671],"eras":b[1][19],"dayPeriods":b[0][1468]},{"months":b[1][670],"days":b[1][671],"eras":b[1][27],"dayPeriods":b[0][1468]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][1471]},{"months":b[1][674],"days":b[1][675],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][675],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][675],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][675],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][675],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][675],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][674],"days":b[1][675],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][675],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][675],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][675],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][674],"days":b[1][675],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][675],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][674],"days":b[1][675],"eras":b[1][27],"dayPeriods":b[0][11]},{"months":b[1][677],"days":b[1][678],"eras":b[1][3],"dayPeriods":b[0][1483]},{"months":b[1][9],"days":b[1][678],"dayPeriods":b[0][1483]},{"months":b[1][5],"days":b[1][678],"eras":b[1][6],"dayPeriods":b[0][1483]},{"months":b[1][7],"days":b[1][678],"eras":b[1][6],"dayPeriods":b[0][1483]},{"months":b[1][7],"days":b[1][678],"eras":b[1][8],"dayPeriods":b[0][1483]},{"months":b[1][9],"days":b[1][678],"eras":b[1][6],"dayPeriods":b[0][1483]},{"months":b[1][677],"days":b[1][678],"eras":b[1][679],"dayPeriods":b[0][1483]},{"months":b[1][11],"days":b[1][678],"eras":b[1][12],"dayPeriods":b[0][1483]},{"months":b[1][13],"days":b[1][678],"eras":b[1][14],"dayPeriods":b[0][1483]},{"months":b[1][15],"days":b[1][678],"eras":b[1][16],"dayPeriods":b[0][1483]},{"months":b[1][677],"days":b[1][678],"eras":b[1][17],"dayPeriods":b[0][1483]},{"months":b[1][18],"days":b[1][678],"eras":b[1][19],"dayPeriods":b[0][1483]},{"months":b[1][677],"days":b[1][678],"eras":b[1][27],"dayPeriods":b[0][1483]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][1486]},{"months":b[1][681],"days":b[1][682],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][682],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][682],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][682],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][682],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][682],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][681],"days":b[1][682],"eras":b[1][683],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][682],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][684],"days":b[1][682],"eras":b[1][685],"dayPeriods":b[0][11]},{"months":b[1][686],"days":b[1][682],"eras":b[1][687],"dayPeriods":b[0][11]},{"months":b[1][681],"days":b[1][682],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][682],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][681],"days":b[1][682],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][688],"currencies":b[0][188]},{"months":b[1][690],"days":b[1][691],"eras":b[1][3],"dayPeriods":b[0][1510]},{"months":b[1][9],"days":b[1][691],"dayPeriods":b[0][1510]},{"months":b[1][5],"days":b[1][691],"eras":b[1][6],"dayPeriods":b[0][1510]},{"months":b[1][7],"days":b[1][691],"eras":b[1][6],"dayPeriods":b[0][1510]},{"months":b[1][7],"days":b[1][691],"eras":b[1][8],"dayPeriods":b[0][1510]},{"months":b[1][9],"days":b[1][691],"eras":b[1][6],"dayPeriods":b[0][1510]},{"months":b[1][690],"days":b[1][691],"eras":b[1][692],"dayPeriods":b[0][1510]},{"months":b[1][11],"days":b[1][691],"eras":b[1][12],"dayPeriods":b[0][1510]},{"months":b[1][13],"days":b[1][691],"eras":b[1][14],"dayPeriods":b[0][1510]},{"months":b[1][15],"days":b[1][691],"eras":b[1][16],"dayPeriods":b[0][1510]},{"months":b[1][690],"days":b[1][691],"eras":b[1][17],"dayPeriods":b[0][1510]},{"months":b[1][18],"days":b[1][691],"eras":b[1][19],"dayPeriods":b[0][1510]},{"months":b[1][690],"days":b[1][691],"eras":b[1][27],"dayPeriods":b[0][1510]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][22],"currencies":b[0][1514]},{"months":b[1][694],"days":b[1][695],"eras":b[1][3],"dayPeriods":b[0][1520]},{"months":b[1][9],"days":b[1][695],"dayPeriods":b[0][1520]},{"months":b[1][5],"days":b[1][695],"eras":b[1][6],"dayPeriods":b[0][1520]},{"months":b[1][7],"days":b[1][695],"eras":b[1][6],"dayPeriods":b[0][1520]},{"months":b[1][7],"days":b[1][695],"eras":b[1][8],"dayPeriods":b[0][1520]},{"months":b[1][9],"days":b[1][695],"eras":b[1][6],"dayPeriods":b[0][1520]},{"months":b[1][694],"days":b[1][695],"eras":b[1][696],"dayPeriods":b[0][1520]},{"months":b[1][11],"days":b[1][695],"eras":b[1][12],"dayPeriods":b[0][1520]},{"months":b[1][13],"days":b[1][695],"eras":b[1][14],"dayPeriods":b[0][1520]},{"months":b[1][15],"days":b[1][695],"eras":b[1][16],"dayPeriods":b[0][1520]},{"months":b[1][694],"days":b[1][695],"eras":b[1][17],"dayPeriods":b[0][1520]},{"months":b[1][18],"days":b[1][695],"eras":b[1][19],"dayPeriods":b[0][1520]},{"months":b[1][694],"days":b[1][695],"eras":b[1][27],"dayPeriods":b[0][1520]},{"nu":b[0][1523],"patterns":b[1][21],"symbols":b[1][152],"currencies":b[0][894]},{"months":b[1][698],"days":b[1][699],"eras":b[1][3],"dayPeriods":b[0][1532]},{"months":b[1][700],"days":b[1][699],"dayPeriods":b[0][1532]},{"months":b[1][5],"days":b[1][699],"eras":b[1][6],"dayPeriods":b[0][1532]},{"months":b[1][7],"days":b[1][699],"eras":b[1][6],"dayPeriods":b[0][1532]},{"months":b[1][7],"days":b[1][699],"eras":b[1][8],"dayPeriods":b[0][1532]},{"months":b[1][9],"days":b[1][699],"eras":b[1][6],"dayPeriods":b[0][1532]},{"months":b[1][698],"days":b[1][699],"eras":b[1][701],"dayPeriods":b[0][1532]},{"months":b[1][11],"days":b[1][699],"eras":b[1][12],"dayPeriods":b[0][1532]},{"months":b[1][13],"days":b[1][699],"eras":b[1][14],"dayPeriods":b[0][1532]},{"months":b[1][15],"days":b[1][699],"eras":b[1][16],"dayPeriods":b[0][1532]},{"months":b[1][698],"days":b[1][699],"eras":b[1][17],"dayPeriods":b[0][1532]},{"months":b[1][18],"days":b[1][699],"eras":b[1][19],"dayPeriods":b[0][1532]},{"months":b[1][698],"days":b[1][699],"eras":b[1][27],"dayPeriods":b[0][1532]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1535]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][1537]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1538]},{"months":b[1][704],"days":b[1][705],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][705],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][705],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][705],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][705],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][705],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][704],"days":b[1][705],"eras":b[1][706],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][705],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][705],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][705],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][704],"days":b[1][705],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][705],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][704],"days":b[1][705],"eras":b[1][27],"dayPeriods":b[0][11]},{"months":b[1][707],"days":b[1][708],"eras":b[1][3],"dayPeriods":b[0][1554]},{"months":b[1][9],"days":b[1][708],"dayPeriods":b[0][1554]},{"months":b[1][5],"days":b[1][708],"eras":b[1][6],"dayPeriods":b[0][1554]},{"months":b[1][7],"days":b[1][708],"eras":b[1][6],"dayPeriods":b[0][1554]},{"months":b[1][7],"days":b[1][708],"eras":b[1][8],"dayPeriods":b[0][1554]},{"months":b[1][9],"days":b[1][708],"eras":b[1][6],"dayPeriods":b[0][1554]},{"months":b[1][707],"days":b[1][708],"eras":b[1][709],"dayPeriods":b[0][1554]},{"months":b[1][11],"days":b[1][708],"eras":b[1][12],"dayPeriods":b[0][1554]},{"months":b[1][13],"days":b[1][708],"eras":b[1][14],"dayPeriods":b[0][1554]},{"months":b[1][15],"days":b[1][708],"eras":b[1][16],"dayPeriods":b[0][1554]},{"months":b[1][707],"days":b[1][708],"eras":b[1][17],"dayPeriods":b[0][1554]},{"months":b[1][18],"days":b[1][708],"eras":b[1][19],"dayPeriods":b[0][1554]},{"months":b[1][707],"days":b[1][708],"eras":b[1][27],"dayPeriods":b[0][1554]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][95],"currencies":b[0][70]},{"months":b[1][711],"days":b[1][712],"eras":b[1][3],"dayPeriods":b[0][1564]},{"months":b[1][9],"days":b[1][712],"dayPeriods":b[0][1564]},{"months":b[1][5],"days":b[1][712],"eras":b[1][6],"dayPeriods":b[0][1564]},{"months":b[1][7],"days":b[1][712],"eras":b[1][6],"dayPeriods":b[0][1564]},{"months":b[1][7],"days":b[1][712],"eras":b[1][8],"dayPeriods":b[0][1564]},{"months":b[1][9],"days":b[1][712],"eras":b[1][6],"dayPeriods":b[0][1564]},{"months":b[1][711],"days":b[1][712],"eras":b[1][713],"dayPeriods":b[0][1564]},{"months":b[1][11],"days":b[1][712],"eras":b[1][12],"dayPeriods":b[0][1564]},{"months":b[1][13],"days":b[1][712],"eras":b[1][14],"dayPeriods":b[0][1564]},{"months":b[1][15],"days":b[1][712],"eras":b[1][16],"dayPeriods":b[0][1564]},{"months":b[1][711],"days":b[1][712],"eras":b[1][17],"dayPeriods":b[0][1564]},{"months":b[1][18],"days":b[1][712],"eras":b[1][19],"dayPeriods":b[0][1564]},{"months":b[1][711],"days":b[1][712],"eras":b[1][27],"dayPeriods":b[0][1564]},{"nu":b[0][1567],"patterns":b[1][58],"symbols":b[1][714],"currencies":b[0][1569]},{"months":b[1][715],"days":b[1][96],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][715],"days":b[1][96],"eras":b[1][716],"dayPeriods":b[0][11]},{"months":b[1][715],"days":b[1][96],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][715],"days":b[1][96],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][748],"patterns":b[1][58],"symbols":b[1][632],"currencies":b[0][388]},{"months":b[1][717],"days":b[1][718],"eras":b[1][3],"dayPeriods":b[0][1577]},{"months":b[1][9],"days":b[1][718],"dayPeriods":b[0][1577]},{"months":b[1][5],"days":b[1][718],"eras":b[1][6],"dayPeriods":b[0][1577]},{"months":b[1][7],"days":b[1][718],"eras":b[1][6],"dayPeriods":b[0][1577]},{"months":b[1][7],"days":b[1][718],"eras":b[1][8],"dayPeriods":b[0][1577]},{"months":b[1][9],"days":b[1][718],"eras":b[1][6],"dayPeriods":b[0][1577]},{"months":b[1][717],"days":b[1][718],"eras":b[1][719],"dayPeriods":b[0][1577]},{"months":b[1][11],"days":b[1][718],"eras":b[1][12],"dayPeriods":b[0][1577]},{"months":b[1][13],"days":b[1][718],"eras":b[1][14],"dayPeriods":b[0][1577]},{"months":b[1][15],"days":b[1][718],"eras":b[1][16],"dayPeriods":b[0][1577]},{"months":b[1][717],"days":b[1][718],"eras":b[1][17],"dayPeriods":b[0][1577]},{"months":b[1][18],"days":b[1][718],"eras":b[1][19],"dayPeriods":b[0][1577]},{"months":b[1][717],"days":b[1][718],"eras":b[1][27],"dayPeriods":b[0][1577]},{"months":b[1][721],"days":b[1][200],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][200],"dayPeriods":b[0][582]},{"months":b[1][722],"days":b[1][200],"eras":b[1][723],"dayPeriods":b[0][582]},{"months":b[1][724],"days":b[1][200],"eras":b[1][723],"dayPeriods":b[0][582]},{"months":b[1][724],"days":b[1][200],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][200],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][721],"days":b[1][200],"eras":b[1][725],"dayPeriods":b[0][582]},{"months":b[1][726],"days":b[1][200],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][727],"days":b[1][200],"eras":b[1][728],"dayPeriods":b[0][582]},{"months":b[1][729],"days":b[1][200],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][721],"days":b[1][200],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][730],"days":b[1][200],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][721],"days":b[1][200],"eras":b[1][20],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][211],"symbols":b[1][309],"currencies":b[0][1596]},{"months":b[1][731],"days":b[1][732],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][732],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][732],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][732],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][732],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][732],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][731],"days":b[1][732],"eras":b[1][733],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][732],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][732],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][732],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][731],"days":b[1][732],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][732],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][731],"days":b[1][732],"eras":b[1][27],"dayPeriods":b[0][11]},{"months":b[1][735],"days":b[1][736],"eras":b[1][3],"dayPeriods":b[0][981]},{"months":b[1][9],"days":b[1][736],"dayPeriods":b[0][981]},{"months":b[1][5],"days":b[1][736],"eras":b[1][6],"dayPeriods":b[0][981]},{"months":b[1][7],"days":b[1][736],"eras":b[1][6],"dayPeriods":b[0][981]},{"months":b[1][7],"days":b[1][736],"eras":b[1][8],"dayPeriods":b[0][981]},{"months":b[1][9],"days":b[1][736],"eras":b[1][6],"dayPeriods":b[0][981]},{"months":b[1][735],"days":b[1][736],"eras":b[1][737],"dayPeriods":b[0][981]},{"months":b[1][11],"days":b[1][736],"eras":b[1][12],"dayPeriods":b[0][981]},{"months":b[1][738],"days":b[1][736],"eras":b[1][14],"dayPeriods":b[0][981]},{"months":b[1][15],"days":b[1][736],"eras":b[1][16],"dayPeriods":b[0][981]},{"months":b[1][735],"days":b[1][736],"eras":b[1][17],"dayPeriods":b[0][981]},{"months":b[1][18],"days":b[1][736],"eras":b[1][19],"dayPeriods":b[0][981]},{"months":b[1][735],"days":b[1][736],"eras":b[1][27],"dayPeriods":b[0][981]},{"nu":b[0][1523],"patterns":b[1][58],"symbols":b[1][152],"currencies":b[0][1613]},{"months":b[1][740],"days":b[1][741],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][742],"days":b[1][741],"dayPeriods":b[0][582]},{"months":b[1][376],"days":b[1][741],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][377],"days":b[1][741],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][377],"days":b[1][741],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][741],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][740],"days":b[1][741],"eras":b[1][743],"dayPeriods":b[0][582]},{"months":b[1][379],"days":b[1][741],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][380],"days":b[1][741],"eras":b[1][381],"dayPeriods":b[0][582]},{"months":b[1][382],"days":b[1][741],"eras":b[1][383],"dayPeriods":b[0][582]},{"months":b[1][740],"days":b[1][741],"eras":b[1][744],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][741],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][740],"days":b[1][741],"eras":b[1][745],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][264],"symbols":b[1][95],"currencies":b[0][870]},{"nu":b[0][37],"patterns":b[1][264],"symbols":b[1][95],"currencies":b[0][1625]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][870]},{"nu":b[0][37],"patterns":b[1][264],"symbols":b[1][95],"currencies":b[0][1626]},{"nu":b[0][37],"patterns":b[1][264],"symbols":b[1][95],"currencies":b[0][1627]},{"nu":b[0][37],"patterns":b[1][264],"symbols":b[1][95],"currencies":b[0][1628]},{"months":b[1][747],"days":b[1][748],"eras":b[1][3],"dayPeriods":b[0][1634]},{"months":b[1][9],"days":b[1][748],"dayPeriods":b[0][1634]},{"months":b[1][5],"days":b[1][748],"eras":b[1][6],"dayPeriods":b[0][1634]},{"months":b[1][7],"days":b[1][748],"eras":b[1][6],"dayPeriods":b[0][1634]},{"months":b[1][7],"days":b[1][748],"eras":b[1][8],"dayPeriods":b[0][1634]},{"months":b[1][9],"days":b[1][748],"eras":b[1][6],"dayPeriods":b[0][1634]},{"months":b[1][747],"days":b[1][748],"eras":b[1][749],"dayPeriods":b[0][1634]},{"months":b[1][11],"days":b[1][748],"eras":b[1][12],"dayPeriods":b[0][1634]},{"months":b[1][13],"days":b[1][748],"eras":b[1][14],"dayPeriods":b[0][1634]},{"months":b[1][15],"days":b[1][748],"eras":b[1][16],"dayPeriods":b[0][1634]},{"months":b[1][747],"days":b[1][748],"eras":b[1][17],"dayPeriods":b[0][1634]},{"months":b[1][18],"days":b[1][748],"eras":b[1][19],"dayPeriods":b[0][1634]},{"months":b[1][747],"days":b[1][748],"eras":b[1][27],"dayPeriods":b[0][1634]},{"months":b[1][751],"days":b[1][752],"eras":b[1][3],"dayPeriods":b[0][1642]},{"months":b[1][9],"days":b[1][752],"dayPeriods":b[0][1642]},{"months":b[1][5],"days":b[1][752],"eras":b[1][6],"dayPeriods":b[0][1642]},{"months":b[1][7],"days":b[1][752],"eras":b[1][6],"dayPeriods":b[0][1642]},{"months":b[1][7],"days":b[1][752],"eras":b[1][8],"dayPeriods":b[0][1642]},{"months":b[1][9],"days":b[1][752],"eras":b[1][6],"dayPeriods":b[0][1642]},{"months":b[1][751],"days":b[1][752],"eras":b[1][753],"dayPeriods":b[0][1642]},{"months":b[1][11],"days":b[1][752],"eras":b[1][12],"dayPeriods":b[0][1642]},{"months":b[1][13],"days":b[1][752],"eras":b[1][14],"dayPeriods":b[0][1642]},{"months":b[1][15],"days":b[1][752],"eras":b[1][16],"dayPeriods":b[0][1642]},{"months":b[1][751],"days":b[1][752],"eras":b[1][17],"dayPeriods":b[0][1642]},{"months":b[1][18],"days":b[1][752],"eras":b[1][19],"dayPeriods":b[0][1642]},{"months":b[1][751],"days":b[1][752],"eras":b[1][27],"dayPeriods":b[0][1642]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][309],"currencies":b[0][1644]},{"months":b[1][755],"days":b[1][756],"eras":b[1][3],"dayPeriods":b[0][1649]},{"months":b[1][9],"days":b[1][756],"dayPeriods":b[0][1649]},{"months":b[1][5],"days":b[1][756],"eras":b[1][6],"dayPeriods":b[0][1649]},{"months":b[1][7],"days":b[1][756],"eras":b[1][6],"dayPeriods":b[0][1649]},{"months":b[1][7],"days":b[1][756],"eras":b[1][8],"dayPeriods":b[0][1649]},{"months":b[1][9],"days":b[1][756],"eras":b[1][6],"dayPeriods":b[0][1649]},{"months":b[1][755],"days":b[1][756],"eras":b[1][757],"dayPeriods":b[0][1649]},{"months":b[1][11],"days":b[1][756],"eras":b[1][12],"dayPeriods":b[0][1649]},{"months":b[1][13],"days":b[1][756],"eras":b[1][14],"dayPeriods":b[0][1649]},{"months":b[1][15],"days":b[1][756],"eras":b[1][16],"dayPeriods":b[0][1649]},{"months":b[1][755],"days":b[1][756],"eras":b[1][17],"dayPeriods":b[0][1649]},{"months":b[1][18],"days":b[1][756],"eras":b[1][19],"dayPeriods":b[0][1649]},{"months":b[1][755],"days":b[1][756],"eras":b[1][27],"dayPeriods":b[0][1649]},{"months":b[1][759],"days":b[1][760],"eras":b[1][3],"dayPeriods":b[0][1661]},{"months":b[1][9],"days":b[1][760],"dayPeriods":b[0][1661]},{"months":b[1][5],"days":b[1][760],"eras":b[1][6],"dayPeriods":b[0][1661]},{"months":b[1][7],"days":b[1][760],"eras":b[1][6],"dayPeriods":b[0][1661]},{"months":b[1][7],"days":b[1][760],"eras":b[1][8],"dayPeriods":b[0][1661]},{"months":b[1][9],"days":b[1][760],"eras":b[1][6],"dayPeriods":b[0][1661]},{"months":b[1][759],"days":b[1][760],"eras":b[1][761],"dayPeriods":b[0][1661]},{"months":b[1][11],"days":b[1][760],"eras":b[1][12],"dayPeriods":b[0][1661]},{"months":b[1][13],"days":b[1][760],"eras":b[1][14],"dayPeriods":b[0][1661]},{"months":b[1][15],"days":b[1][760],"eras":b[1][16],"dayPeriods":b[0][1661]},{"months":b[1][759],"days":b[1][760],"eras":b[1][17],"dayPeriods":b[0][1661]},{"months":b[1][18],"days":b[1][760],"eras":b[1][19],"dayPeriods":b[0][1661]},{"months":b[1][759],"days":b[1][760],"eras":b[1][27],"dayPeriods":b[0][1661]},{"months":b[1][763],"days":b[1][764],"eras":b[1][3],"dayPeriods":b[0][1670]},{"months":b[1][9],"days":b[1][764],"dayPeriods":b[0][1670]},{"months":b[1][5],"days":b[1][764],"eras":b[1][6],"dayPeriods":b[0][1670]},{"months":b[1][7],"days":b[1][764],"eras":b[1][6],"dayPeriods":b[0][1670]},{"months":b[1][7],"days":b[1][764],"eras":b[1][8],"dayPeriods":b[0][1670]},{"months":b[1][9],"days":b[1][764],"eras":b[1][6],"dayPeriods":b[0][1670]},{"months":b[1][763],"days":b[1][764],"eras":b[1][765],"dayPeriods":b[0][1670]},{"months":b[1][11],"days":b[1][764],"eras":b[1][12],"dayPeriods":b[0][1670]},{"months":b[1][13],"days":b[1][764],"eras":b[1][14],"dayPeriods":b[0][1670]},{"months":b[1][15],"days":b[1][764],"eras":b[1][16],"dayPeriods":b[0][1670]},{"months":b[1][763],"days":b[1][764],"eras":b[1][17],"dayPeriods":b[0][1670]},{"months":b[1][18],"days":b[1][764],"eras":b[1][19],"dayPeriods":b[0][1670]},{"months":b[1][763],"days":b[1][764],"eras":b[1][27],"dayPeriods":b[0][1670]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1672]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1673]},{"months":b[1][768],"days":b[1][769],"eras":b[1][3],"dayPeriods":b[0][549]},{"months":b[1][9],"days":b[1][769],"dayPeriods":b[0][549]},{"months":b[1][5],"days":b[1][769],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][7],"days":b[1][769],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][7],"days":b[1][769],"eras":b[1][8],"dayPeriods":b[0][549]},{"months":b[1][9],"days":b[1][769],"eras":b[1][6],"dayPeriods":b[0][549]},{"months":b[1][768],"days":b[1][769],"eras":b[1][72],"dayPeriods":b[0][549]},{"months":b[1][11],"days":b[1][769],"eras":b[1][12],"dayPeriods":b[0][549]},{"months":b[1][13],"days":b[1][769],"eras":b[1][14],"dayPeriods":b[0][549]},{"months":b[1][15],"days":b[1][769],"eras":b[1][16],"dayPeriods":b[0][549]},{"months":b[1][768],"days":b[1][769],"eras":b[1][17],"dayPeriods":b[0][549]},{"months":b[1][18],"days":b[1][769],"eras":b[1][19],"dayPeriods":b[0][549]},{"months":b[1][768],"days":b[1][769],"eras":b[1][27],"dayPeriods":b[0][549]},{"nu":b[0][37],"patterns":b[1][73],"symbols":b[1][770],"currencies":b[0][70]},{"months":b[1][772],"days":b[1][773],"eras":b[1][3],"dayPeriods":b[0][1688]},{"months":b[1][9],"days":b[1][773],"dayPeriods":b[0][1688]},{"months":b[1][5],"days":b[1][773],"eras":b[1][6],"dayPeriods":b[0][1688]},{"months":b[1][7],"days":b[1][773],"eras":b[1][6],"dayPeriods":b[0][1688]},{"months":b[1][7],"days":b[1][773],"eras":b[1][8],"dayPeriods":b[0][1688]},{"months":b[1][9],"days":b[1][773],"eras":b[1][6],"dayPeriods":b[0][1688]},{"months":b[1][772],"days":b[1][773],"eras":b[1][774],"dayPeriods":b[0][1688]},{"months":b[1][11],"days":b[1][773],"eras":b[1][12],"dayPeriods":b[0][1688]},{"months":b[1][13],"days":b[1][773],"eras":b[1][14],"dayPeriods":b[0][1688]},{"months":b[1][15],"days":b[1][773],"eras":b[1][16],"dayPeriods":b[0][1688]},{"months":b[1][772],"days":b[1][773],"eras":b[1][17],"dayPeriods":b[0][1688]},{"months":b[1][18],"days":b[1][773],"eras":b[1][19],"dayPeriods":b[0][1688]},{"months":b[1][772],"days":b[1][773],"eras":b[1][27],"dayPeriods":b[0][1688]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][775],"currencies":b[0][388]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][775],"currencies":b[0][1691]},{"months":b[1][777],"days":b[1][778],"eras":b[1][3],"dayPeriods":b[0][1699]},{"months":b[1][9],"days":b[1][778],"dayPeriods":b[0][1699]},{"months":b[1][5],"days":b[1][778],"eras":b[1][6],"dayPeriods":b[0][1699]},{"months":b[1][7],"days":b[1][778],"eras":b[1][6],"dayPeriods":b[0][1699]},{"months":b[1][7],"days":b[1][778],"eras":b[1][8],"dayPeriods":b[0][1699]},{"months":b[1][9],"days":b[1][778],"eras":b[1][6],"dayPeriods":b[0][1699]},{"months":b[1][777],"days":b[1][778],"eras":b[1][779],"dayPeriods":b[0][1699]},{"months":b[1][11],"days":b[1][778],"eras":b[1][12],"dayPeriods":b[0][1699]},{"months":b[1][780],"days":b[1][778],"eras":b[1][781],"dayPeriods":b[0][1699]},{"months":b[1][15],"days":b[1][778],"eras":b[1][16],"dayPeriods":b[0][1699]},{"months":b[1][777],"days":b[1][778],"eras":b[1][17],"dayPeriods":b[0][1699]},{"months":b[1][18],"days":b[1][778],"eras":b[1][19],"dayPeriods":b[0][1699]},{"months":b[1][777],"days":b[1][778],"eras":b[1][27],"dayPeriods":b[0][1699]},{"nu":b[0][37],"patterns":b[1][73],"symbols":b[1][782],"currencies":b[0][925]},{"months":b[1][784],"days":b[1][785],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][785],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][785],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][785],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][785],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][785],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][784],"days":b[1][785],"eras":b[1][786],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][785],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][785],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][785],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][784],"days":b[1][785],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][785],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][784],"days":b[1][785],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][748],"patterns":b[1][58],"symbols":b[1][787],"currencies":b[0][1710]},{"months":b[1][789],"days":b[1][790],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][457],"days":b[1][790],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][790],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][790],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][790],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][790],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][789],"days":b[1][790],"eras":b[1][791],"dayPeriods":b[0][11]},{"months":b[1][792],"days":b[1][790],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][790],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][793],"days":b[1][790],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][789],"days":b[1][790],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][794],"days":b[1][790],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][789],"days":b[1][790],"eras":b[1][795],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1725]},{"months":b[1][797],"days":b[1][798],"eras":b[1][3],"dayPeriods":b[0][1729]},{"months":b[1][9],"days":b[1][798],"dayPeriods":b[0][1729]},{"months":b[1][5],"days":b[1][798],"eras":b[1][6],"dayPeriods":b[0][1729]},{"months":b[1][7],"days":b[1][798],"eras":b[1][6],"dayPeriods":b[0][1729]},{"months":b[1][7],"days":b[1][798],"eras":b[1][8],"dayPeriods":b[0][1729]},{"months":b[1][9],"days":b[1][798],"eras":b[1][6],"dayPeriods":b[0][1729]},{"months":b[1][797],"days":b[1][798],"eras":b[1][799],"dayPeriods":b[0][1729]},{"months":b[1][11],"days":b[1][798],"eras":b[1][12],"dayPeriods":b[0][1729]},{"months":b[1][13],"days":b[1][798],"eras":b[1][14],"dayPeriods":b[0][1729]},{"months":b[1][15],"days":b[1][798],"eras":b[1][16],"dayPeriods":b[0][1729]},{"months":b[1][797],"days":b[1][798],"eras":b[1][17],"dayPeriods":b[0][1729]},{"months":b[1][800],"days":b[1][798],"eras":b[1][19],"dayPeriods":b[0][1729]},{"months":b[1][797],"days":b[1][798],"eras":b[1][27],"dayPeriods":b[0][1729]},{"nu":b[0][748],"patterns":b[1][79],"symbols":b[1][801],"currencies":b[0][1733]},{"months":b[1][803],"days":b[1][804],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][805],"days":b[1][804],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][804],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][804],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][804],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][804],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][803],"days":b[1][804],"eras":b[1][806],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][804],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][804],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][804],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][803],"days":b[1][804],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][804],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][803],"days":b[1][804],"eras":b[1][807],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][95],"currencies":b[0][1745]},{"months":b[1][803],"days":b[1][809],"eras":b[1][3],"dayPeriods":b[0][1748]},{"months":b[1][810],"days":b[1][809],"dayPeriods":b[0][1748]},{"months":b[1][5],"days":b[1][809],"eras":b[1][6],"dayPeriods":b[0][1748]},{"months":b[1][7],"days":b[1][809],"eras":b[1][6],"dayPeriods":b[0][1748]},{"months":b[1][7],"days":b[1][809],"eras":b[1][8],"dayPeriods":b[0][1748]},{"months":b[1][9],"days":b[1][809],"eras":b[1][6],"dayPeriods":b[0][1748]},{"months":b[1][803],"days":b[1][809],"eras":b[1][811],"dayPeriods":b[0][1748]},{"months":b[1][11],"days":b[1][809],"eras":b[1][12],"dayPeriods":b[0][1748]},{"months":b[1][13],"days":b[1][809],"eras":b[1][14],"dayPeriods":b[0][1748]},{"months":b[1][15],"days":b[1][809],"eras":b[1][16],"dayPeriods":b[0][1748]},{"months":b[1][803],"days":b[1][809],"eras":b[1][17],"dayPeriods":b[0][1748]},{"months":b[1][18],"days":b[1][809],"eras":b[1][19],"dayPeriods":b[0][1748]},{"months":b[1][803],"days":b[1][809],"eras":b[1][807],"dayPeriods":b[0][1748]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1751]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1752]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1753]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1754]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1755]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1756]},{"months":b[1][814],"days":b[1][815],"eras":b[1][3],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][815],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][815],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][815],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][815],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][815],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][814],"days":b[1][815],"eras":b[1][816],"dayPeriods":b[0][582]},{"months":b[1][11],"days":b[1][815],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][815],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][815],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][814],"days":b[1][815],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][815],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][814],"days":b[1][815],"eras":b[1][27],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][211],"symbols":b[1][22],"currencies":b[0][1765]},{"nu":b[0][37],"patterns":b[1][211],"symbols":b[1][95],"currencies":b[0][1766]},{"nu":b[0][37],"patterns":b[1][211],"symbols":b[1][22],"currencies":b[0][388]},{"months":b[1][818],"days":b[1][819],"eras":b[1][3],"dayPeriods":b[0][1775]},{"months":b[1][9],"days":b[1][819],"dayPeriods":b[0][1775]},{"months":b[1][5],"days":b[1][819],"eras":b[1][6],"dayPeriods":b[0][1775]},{"months":b[1][7],"days":b[1][819],"eras":b[1][6],"dayPeriods":b[0][1775]},{"months":b[1][7],"days":b[1][819],"eras":b[1][8],"dayPeriods":b[0][1775]},{"months":b[1][9],"days":b[1][819],"eras":b[1][6],"dayPeriods":b[0][1775]},{"months":b[1][818],"days":b[1][819],"eras":b[1][820],"dayPeriods":b[0][1775]},{"months":b[1][11],"days":b[1][819],"eras":b[1][12],"dayPeriods":b[0][1775]},{"months":b[1][13],"days":b[1][819],"eras":b[1][14],"dayPeriods":b[0][1775]},{"months":b[1][15],"days":b[1][819],"eras":b[1][16],"dayPeriods":b[0][1775]},{"months":b[1][818],"days":b[1][819],"eras":b[1][17],"dayPeriods":b[0][1775]},{"months":b[1][18],"days":b[1][819],"eras":b[1][19],"dayPeriods":b[0][1775]},{"months":b[1][818],"days":b[1][819],"eras":b[1][27],"dayPeriods":b[0][1775]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][402],"currencies":b[0][70]},{"months":b[1][821],"days":b[1][822],"eras":b[1][3],"dayPeriods":b[0][1782]},{"months":b[1][9],"days":b[1][822],"dayPeriods":b[0][1782]},{"months":b[1][5],"days":b[1][822],"eras":b[1][6],"dayPeriods":b[0][1782]},{"months":b[1][7],"days":b[1][822],"eras":b[1][6],"dayPeriods":b[0][1782]},{"months":b[1][7],"days":b[1][822],"eras":b[1][8],"dayPeriods":b[0][1782]},{"months":b[1][9],"days":b[1][822],"eras":b[1][6],"dayPeriods":b[0][1782]},{"months":b[1][821],"days":b[1][822],"eras":b[1][823],"dayPeriods":b[0][1782]},{"months":b[1][11],"days":b[1][822],"eras":b[1][12],"dayPeriods":b[0][1782]},{"months":b[1][13],"days":b[1][822],"eras":b[1][14],"dayPeriods":b[0][1782]},{"months":b[1][15],"days":b[1][822],"eras":b[1][16],"dayPeriods":b[0][1782]},{"months":b[1][821],"days":b[1][822],"eras":b[1][17],"dayPeriods":b[0][1782]},{"months":b[1][18],"days":b[1][822],"eras":b[1][19],"dayPeriods":b[0][1782]},{"months":b[1][821],"days":b[1][822],"eras":b[1][27],"dayPeriods":b[0][1782]},{"nu":b[0][37],"patterns":b[1][824],"symbols":b[1][95],"currencies":b[0][1785]},{"months":b[1][826],"days":b[1][827],"eras":b[1][828],"dayPeriods":b[0][582]},{"months":b[1][457],"days":b[1][827],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][827],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][827],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][827],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][827],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][826],"days":b[1][827],"eras":b[1][829],"dayPeriods":b[0][582]},{"months":b[1][830],"days":b[1][827],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][827],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][827],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][826],"days":b[1][827],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][827],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][826],"days":b[1][827],"eras":b[1][27],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][1798]},{"months":b[1][826],"days":b[1][831],"eras":b[1][828],"dayPeriods":b[0][582]},{"months":b[1][457],"days":b[1][831],"dayPeriods":b[0][582]},{"months":b[1][5],"days":b[1][831],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][831],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][7],"days":b[1][831],"eras":b[1][8],"dayPeriods":b[0][582]},{"months":b[1][9],"days":b[1][831],"eras":b[1][6],"dayPeriods":b[0][582]},{"months":b[1][826],"days":b[1][831],"eras":b[1][832],"dayPeriods":b[0][582]},{"months":b[1][830],"days":b[1][831],"eras":b[1][12],"dayPeriods":b[0][582]},{"months":b[1][13],"days":b[1][831],"eras":b[1][14],"dayPeriods":b[0][582]},{"months":b[1][15],"days":b[1][831],"eras":b[1][16],"dayPeriods":b[0][582]},{"months":b[1][826],"days":b[1][831],"eras":b[1][17],"dayPeriods":b[0][582]},{"months":b[1][18],"days":b[1][831],"eras":b[1][19],"dayPeriods":b[0][582]},{"months":b[1][826],"days":b[1][831],"eras":b[1][27],"dayPeriods":b[0][582]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][95],"currencies":b[0][1802]},{"months":b[1][833],"days":b[1][834],"eras":b[1][3],"dayPeriods":b[0][1807]},{"months":b[1][9],"days":b[1][834],"dayPeriods":b[0][1807]},{"months":b[1][5],"days":b[1][834],"eras":b[1][6],"dayPeriods":b[0][1807]},{"months":b[1][7],"days":b[1][834],"eras":b[1][6],"dayPeriods":b[0][1807]},{"months":b[1][7],"days":b[1][834],"eras":b[1][8],"dayPeriods":b[0][1807]},{"months":b[1][9],"days":b[1][834],"eras":b[1][6],"dayPeriods":b[0][1807]},{"months":b[1][833],"days":b[1][834],"eras":b[1][835],"dayPeriods":b[0][1807]},{"months":b[1][11],"days":b[1][834],"eras":b[1][12],"dayPeriods":b[0][1807]},{"months":b[1][13],"days":b[1][834],"eras":b[1][14],"dayPeriods":b[0][1807]},{"months":b[1][15],"days":b[1][834],"eras":b[1][16],"dayPeriods":b[0][1807]},{"months":b[1][833],"days":b[1][834],"eras":b[1][17],"dayPeriods":b[0][1807]},{"months":b[1][18],"days":b[1][834],"eras":b[1][19],"dayPeriods":b[0][1807]},{"months":b[1][833],"days":b[1][834],"eras":b[1][27],"dayPeriods":b[0][1807]},{"months":b[1][837],"days":b[1][838],"eras":b[1][3],"dayPeriods":b[0][1815]},{"months":b[1][457],"days":b[1][838],"dayPeriods":b[0][1815]},{"months":b[1][839],"days":b[1][838],"eras":b[1][6],"dayPeriods":b[0][1815]},{"months":b[1][840],"days":b[1][838],"eras":b[1][6],"dayPeriods":b[0][1815]},{"months":b[1][840],"days":b[1][838],"eras":b[1][8],"dayPeriods":b[0][1815]},{"months":b[1][9],"days":b[1][838],"eras":b[1][6],"dayPeriods":b[0][1815]},{"months":b[1][837],"days":b[1][838],"eras":b[1][841],"dayPeriods":b[0][1815]},{"months":b[1][842],"days":b[1][838],"eras":b[1][12],"dayPeriods":b[0][1815]},{"months":b[1][843],"days":b[1][838],"eras":b[1][14],"dayPeriods":b[0][1815]},{"months":b[1][844],"days":b[1][838],"eras":b[1][16],"dayPeriods":b[0][1815]},{"months":b[1][837],"days":b[1][838],"eras":b[1][845],"dayPeriods":b[0][1815]},{"months":b[1][846],"days":b[1][838],"eras":b[1][19],"dayPeriods":b[0][1815]},{"months":b[1][837],"days":b[1][838],"eras":b[1][20],"dayPeriods":b[0][1815]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][847],"currencies":b[0][1827]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][847],"currencies":b[0][1828]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][847],"currencies":b[0][1829]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][847],"currencies":b[0][1830]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][847],"currencies":b[0][1831]},{"months":b[1][850],"days":b[1][851],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][851],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][851],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][851],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][851],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][851],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][850],"days":b[1][851],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][851],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][851],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][851],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][850],"days":b[1][851],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][851],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][850],"days":b[1][851],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][607]},{"months":b[1][853],"days":b[1][854],"eras":b[1][3],"dayPeriods":b[0][1843]},{"months":b[1][9],"days":b[1][854],"dayPeriods":b[0][1843]},{"months":b[1][5],"days":b[1][854],"eras":b[1][6],"dayPeriods":b[0][1843]},{"months":b[1][7],"days":b[1][854],"eras":b[1][6],"dayPeriods":b[0][1843]},{"months":b[1][7],"days":b[1][854],"eras":b[1][8],"dayPeriods":b[0][1843]},{"months":b[1][9],"days":b[1][854],"eras":b[1][6],"dayPeriods":b[0][1843]},{"months":b[1][853],"days":b[1][854],"eras":b[1][855],"dayPeriods":b[0][1843]},{"months":b[1][11],"days":b[1][854],"eras":b[1][12],"dayPeriods":b[0][1843]},{"months":b[1][13],"days":b[1][854],"eras":b[1][14],"dayPeriods":b[0][1843]},{"months":b[1][15],"days":b[1][854],"eras":b[1][16],"dayPeriods":b[0][1843]},{"months":b[1][853],"days":b[1][854],"eras":b[1][17],"dayPeriods":b[0][1843]},{"months":b[1][18],"days":b[1][854],"eras":b[1][19],"dayPeriods":b[0][1843]},{"months":b[1][853],"days":b[1][854],"eras":b[1][27],"dayPeriods":b[0][1843]},{"months":b[1][856],"days":b[1][857],"eras":b[1][3],"dayPeriods":b[0][1851]},{"months":b[1][9],"days":b[1][857],"dayPeriods":b[0][1851]},{"months":b[1][5],"days":b[1][857],"eras":b[1][6],"dayPeriods":b[0][1851]},{"months":b[1][7],"days":b[1][857],"eras":b[1][6],"dayPeriods":b[0][1851]},{"months":b[1][7],"days":b[1][857],"eras":b[1][8],"dayPeriods":b[0][1851]},{"months":b[1][9],"days":b[1][857],"eras":b[1][6],"dayPeriods":b[0][1851]},{"months":b[1][856],"days":b[1][857],"eras":b[1][858],"dayPeriods":b[0][1851]},{"months":b[1][11],"days":b[1][857],"eras":b[1][12],"dayPeriods":b[0][1851]},{"months":b[1][13],"days":b[1][857],"eras":b[1][14],"dayPeriods":b[0][1851]},{"months":b[1][15],"days":b[1][857],"eras":b[1][16],"dayPeriods":b[0][1851]},{"months":b[1][856],"days":b[1][857],"eras":b[1][17],"dayPeriods":b[0][1851]},{"months":b[1][18],"days":b[1][857],"eras":b[1][19],"dayPeriods":b[0][1851]},{"months":b[1][856],"days":b[1][857],"eras":b[1][27],"dayPeriods":b[0][1851]},{"months":b[1][860],"days":b[1][861],"eras":b[1][3],"dayPeriods":b[0][1859]},{"months":b[1][9],"days":b[1][861],"dayPeriods":b[0][1859]},{"months":b[1][5],"days":b[1][861],"eras":b[1][6],"dayPeriods":b[0][1859]},{"months":b[1][7],"days":b[1][861],"eras":b[1][6],"dayPeriods":b[0][1859]},{"months":b[1][7],"days":b[1][861],"eras":b[1][8],"dayPeriods":b[0][1859]},{"months":b[1][9],"days":b[1][861],"eras":b[1][6],"dayPeriods":b[0][1859]},{"months":b[1][860],"days":b[1][861],"eras":b[1][862],"dayPeriods":b[0][1859]},{"months":b[1][11],"days":b[1][861],"eras":b[1][12],"dayPeriods":b[0][1859]},{"months":b[1][13],"days":b[1][861],"eras":b[1][14],"dayPeriods":b[0][1859]},{"months":b[1][15],"days":b[1][861],"eras":b[1][16],"dayPeriods":b[0][1859]},{"months":b[1][860],"days":b[1][861],"eras":b[1][17],"dayPeriods":b[0][1859]},{"months":b[1][18],"days":b[1][861],"eras":b[1][19],"dayPeriods":b[0][1859]},{"months":b[1][860],"days":b[1][861],"eras":b[1][27],"dayPeriods":b[0][1859]},{"months":b[1][863],"days":b[1][864],"eras":b[1][3],"dayPeriods":b[0][1868]},{"months":b[1][9],"days":b[1][864],"dayPeriods":b[0][1868]},{"months":b[1][5],"days":b[1][864],"eras":b[1][6],"dayPeriods":b[0][1868]},{"months":b[1][7],"days":b[1][864],"eras":b[1][6],"dayPeriods":b[0][1868]},{"months":b[1][7],"days":b[1][864],"eras":b[1][8],"dayPeriods":b[0][1868]},{"months":b[1][9],"days":b[1][864],"eras":b[1][6],"dayPeriods":b[0][1868]},{"months":b[1][863],"days":b[1][864],"eras":b[1][865],"dayPeriods":b[0][1868]},{"months":b[1][11],"days":b[1][864],"eras":b[1][12],"dayPeriods":b[0][1868]},{"months":b[1][13],"days":b[1][864],"eras":b[1][14],"dayPeriods":b[0][1868]},{"months":b[1][15],"days":b[1][864],"eras":b[1][16],"dayPeriods":b[0][1868]},{"months":b[1][863],"days":b[1][864],"eras":b[1][17],"dayPeriods":b[0][1868]},{"months":b[1][18],"days":b[1][864],"eras":b[1][19],"dayPeriods":b[0][1868]},{"months":b[1][863],"days":b[1][864],"eras":b[1][27],"dayPeriods":b[0][1868]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][592],"currencies":b[0][1871]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][592],"currencies":b[0][1872]},{"months":b[1][867],"days":b[1][868],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][868],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][868],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][868],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][868],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][868],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][867],"days":b[1][868],"eras":b[1][869],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][868],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][868],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][868],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][867],"days":b[1][868],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][868],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][867],"days":b[1][868],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][33],"symbols":b[1][95],"currencies":b[0][1471]},{"months":b[1][214],"days":b[1][870],"eras":b[1][3],"dayPeriods":b[0][1184]},{"months":b[1][9],"days":b[1][870],"dayPeriods":b[0][1184]},{"months":b[1][5],"days":b[1][870],"eras":b[1][6],"dayPeriods":b[0][1184]},{"months":b[1][7],"days":b[1][870],"eras":b[1][6],"dayPeriods":b[0][1184]},{"months":b[1][7],"days":b[1][870],"eras":b[1][8],"dayPeriods":b[0][1184]},{"months":b[1][9],"days":b[1][870],"eras":b[1][6],"dayPeriods":b[0][1184]},{"months":b[1][214],"days":b[1][870],"eras":b[1][216],"dayPeriods":b[0][1184]},{"months":b[1][11],"days":b[1][870],"eras":b[1][12],"dayPeriods":b[0][1184]},{"months":b[1][13],"days":b[1][870],"eras":b[1][14],"dayPeriods":b[0][1184]},{"months":b[1][15],"days":b[1][870],"eras":b[1][16],"dayPeriods":b[0][1184]},{"months":b[1][214],"days":b[1][870],"eras":b[1][17],"dayPeriods":b[0][1184]},{"months":b[1][18],"days":b[1][870],"eras":b[1][19],"dayPeriods":b[0][1184]},{"months":b[1][214],"days":b[1][870],"eras":b[1][27],"dayPeriods":b[0][1184]},{"months":b[1][872],"days":b[1][873],"eras":b[1][3],"dayPeriods":b[0][1890]},{"months":b[1][9],"days":b[1][873],"dayPeriods":b[0][1890]},{"months":b[1][5],"days":b[1][873],"eras":b[1][6],"dayPeriods":b[0][1890]},{"months":b[1][7],"days":b[1][873],"eras":b[1][6],"dayPeriods":b[0][1890]},{"months":b[1][7],"days":b[1][873],"eras":b[1][8],"dayPeriods":b[0][1890]},{"months":b[1][9],"days":b[1][873],"eras":b[1][6],"dayPeriods":b[0][1890]},{"months":b[1][872],"days":b[1][873],"eras":b[1][874],"dayPeriods":b[0][1890]},{"months":b[1][11],"days":b[1][873],"eras":b[1][12],"dayPeriods":b[0][1890]},{"months":b[1][13],"days":b[1][873],"eras":b[1][14],"dayPeriods":b[0][1890]},{"months":b[1][15],"days":b[1][873],"eras":b[1][16],"dayPeriods":b[0][1890]},{"months":b[1][872],"days":b[1][873],"eras":b[1][17],"dayPeriods":b[0][1890]},{"months":b[1][18],"days":b[1][873],"eras":b[1][19],"dayPeriods":b[0][1890]},{"months":b[1][872],"days":b[1][873],"eras":b[1][27],"dayPeriods":b[0][1890]},{"nu":b[0][37],"patterns":b[1][629],"symbols":b[1][95],"currencies":b[0][70]},{"months":b[1][875],"days":b[1][876],"eras":b[1][3],"dayPeriods":b[0][1898]},{"months":b[1][9],"days":b[1][876],"dayPeriods":b[0][1898]},{"months":b[1][5],"days":b[1][876],"eras":b[1][6],"dayPeriods":b[0][1898]},{"months":b[1][7],"days":b[1][876],"eras":b[1][6],"dayPeriods":b[0][1898]},{"months":b[1][7],"days":b[1][876],"eras":b[1][8],"dayPeriods":b[0][1898]},{"months":b[1][9],"days":b[1][876],"eras":b[1][6],"dayPeriods":b[0][1898]},{"months":b[1][875],"days":b[1][876],"eras":b[1][877],"dayPeriods":b[0][1898]},{"months":b[1][11],"days":b[1][876],"eras":b[1][12],"dayPeriods":b[0][1898]},{"months":b[1][13],"days":b[1][876],"eras":b[1][14],"dayPeriods":b[0][1898]},{"months":b[1][15],"days":b[1][876],"eras":b[1][16],"dayPeriods":b[0][1898]},{"months":b[1][875],"days":b[1][876],"eras":b[1][17],"dayPeriods":b[0][1898]},{"months":b[1][18],"days":b[1][876],"eras":b[1][19],"dayPeriods":b[0][1898]},{"months":b[1][875],"days":b[1][876],"eras":b[1][27],"dayPeriods":b[0][1898]},{"months":b[1][878],"days":b[1][879],"eras":b[1][3],"dayPeriods":b[0][1906]},{"months":b[1][9],"days":b[1][879],"dayPeriods":b[0][1906]},{"months":b[1][5],"days":b[1][879],"eras":b[1][6],"dayPeriods":b[0][1906]},{"months":b[1][7],"days":b[1][879],"eras":b[1][6],"dayPeriods":b[0][1906]},{"months":b[1][7],"days":b[1][879],"eras":b[1][8],"dayPeriods":b[0][1906]},{"months":b[1][9],"days":b[1][879],"eras":b[1][6],"dayPeriods":b[0][1906]},{"months":b[1][878],"days":b[1][879],"eras":b[1][880],"dayPeriods":b[0][1906]},{"months":b[1][11],"days":b[1][879],"eras":b[1][12],"dayPeriods":b[0][1906]},{"months":b[1][13],"days":b[1][879],"eras":b[1][14],"dayPeriods":b[0][1906]},{"months":b[1][15],"days":b[1][879],"eras":b[1][16],"dayPeriods":b[0][1906]},{"months":b[1][878],"days":b[1][879],"eras":b[1][17],"dayPeriods":b[0][1906]},{"months":b[1][18],"days":b[1][879],"eras":b[1][19],"dayPeriods":b[0][1906]},{"months":b[1][878],"days":b[1][879],"eras":b[1][27],"dayPeriods":b[0][1906]},{"months":b[1][882],"days":b[1][883],"eras":b[1][3],"dayPeriods":b[0][1916]},{"months":b[1][9],"days":b[1][883],"dayPeriods":b[0][1916]},{"months":b[1][5],"days":b[1][883],"eras":b[1][6],"dayPeriods":b[0][1916]},{"months":b[1][7],"days":b[1][883],"eras":b[1][6],"dayPeriods":b[0][1916]},{"months":b[1][7],"days":b[1][883],"eras":b[1][8],"dayPeriods":b[0][1916]},{"months":b[1][9],"days":b[1][883],"eras":b[1][6],"dayPeriods":b[0][1916]},{"months":b[1][882],"days":b[1][883],"eras":b[1][884],"dayPeriods":b[0][1916]},{"months":b[1][11],"days":b[1][883],"eras":b[1][12],"dayPeriods":b[0][1916]},{"months":b[1][13],"days":b[1][883],"eras":b[1][14],"dayPeriods":b[0][1916]},{"months":b[1][15],"days":b[1][883],"eras":b[1][16],"dayPeriods":b[0][1916]},{"months":b[1][882],"days":b[1][883],"eras":b[1][17],"dayPeriods":b[0][1916]},{"months":b[1][18],"days":b[1][883],"eras":b[1][19],"dayPeriods":b[0][1916]},{"months":b[1][882],"days":b[1][883],"eras":b[1][27],"dayPeriods":b[0][1916]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1919]},{"months":b[1][886],"days":b[1][887],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][887],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][887],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][887],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][887],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][887],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][886],"days":b[1][887],"eras":b[1][888],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][887],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][887],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][887],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][886],"days":b[1][887],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][887],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][886],"days":b[1][887],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][28],"currencies":b[0][1929]},{"months":b[1][890],"days":b[1][891],"eras":b[1][3],"dayPeriods":b[0][1937]},{"months":b[1][9],"days":b[1][891],"dayPeriods":b[0][1937]},{"months":b[1][5],"days":b[1][891],"eras":b[1][6],"dayPeriods":b[0][1937]},{"months":b[1][7],"days":b[1][891],"eras":b[1][6],"dayPeriods":b[0][1937]},{"months":b[1][7],"days":b[1][891],"eras":b[1][8],"dayPeriods":b[0][1937]},{"months":b[1][9],"days":b[1][891],"eras":b[1][6],"dayPeriods":b[0][1937]},{"months":b[1][890],"days":b[1][891],"eras":b[1][892],"dayPeriods":b[0][1937]},{"months":b[1][11],"days":b[1][891],"eras":b[1][12],"dayPeriods":b[0][1937]},{"months":b[1][13],"days":b[1][891],"eras":b[1][14],"dayPeriods":b[0][1937]},{"months":b[1][15],"days":b[1][891],"eras":b[1][16],"dayPeriods":b[0][1937]},{"months":b[1][890],"days":b[1][891],"eras":b[1][17],"dayPeriods":b[0][1937]},{"months":b[1][18],"days":b[1][891],"eras":b[1][19],"dayPeriods":b[0][1937]},{"months":b[1][890],"days":b[1][891],"eras":b[1][27],"dayPeriods":b[0][1937]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][1940]},{"months":b[1][9],"days":b[1][893],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][893],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][893],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][893],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][893],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][893],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][893],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][893],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][893],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][893],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][893],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][893],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][893],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][894],"currencies":b[0][70]},{"months":b[1][895],"days":b[1][896],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][896],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][896],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][896],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][896],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][896],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][895],"days":b[1][896],"eras":b[1][897],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][896],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][896],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][896],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][895],"days":b[1][896],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][896],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][895],"days":b[1][896],"eras":b[1][27],"dayPeriods":b[0][11]},{"months":b[1][899],"days":b[1][900],"eras":b[1][3],"dayPeriods":b[0][1958]},{"months":b[1][9],"days":b[1][900],"dayPeriods":b[0][1958]},{"months":b[1][5],"days":b[1][900],"eras":b[1][6],"dayPeriods":b[0][1958]},{"months":b[1][7],"days":b[1][900],"eras":b[1][6],"dayPeriods":b[0][1958]},{"months":b[1][7],"days":b[1][900],"eras":b[1][8],"dayPeriods":b[0][1958]},{"months":b[1][9],"days":b[1][900],"eras":b[1][6],"dayPeriods":b[0][1958]},{"months":b[1][899],"days":b[1][900],"eras":b[1][901],"dayPeriods":b[0][1958]},{"months":b[1][11],"days":b[1][900],"eras":b[1][12],"dayPeriods":b[0][1958]},{"months":b[1][13],"days":b[1][900],"eras":b[1][14],"dayPeriods":b[0][1958]},{"months":b[1][15],"days":b[1][900],"eras":b[1][16],"dayPeriods":b[0][1958]},{"months":b[1][899],"days":b[1][900],"eras":b[1][17],"dayPeriods":b[0][1958]},{"months":b[1][18],"days":b[1][900],"eras":b[1][19],"dayPeriods":b[0][1958]},{"months":b[1][899],"days":b[1][900],"eras":b[1][27],"dayPeriods":b[0][1958]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1961]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1962]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1963]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][1964]},{"months":b[1][904],"days":b[1][905],"eras":b[1][3],"dayPeriods":b[0][1974]},{"months":b[1][9],"days":b[1][905],"dayPeriods":b[0][1974]},{"months":b[1][5],"days":b[1][905],"eras":b[1][6],"dayPeriods":b[0][1974]},{"months":b[1][7],"days":b[1][905],"eras":b[1][6],"dayPeriods":b[0][1974]},{"months":b[1][7],"days":b[1][905],"eras":b[1][8],"dayPeriods":b[0][1974]},{"months":b[1][9],"days":b[1][905],"eras":b[1][6],"dayPeriods":b[0][1974]},{"months":b[1][904],"days":b[1][905],"eras":b[1][906],"dayPeriods":b[0][1974]},{"months":b[1][11],"days":b[1][905],"eras":b[1][12],"dayPeriods":b[0][1974]},{"months":b[1][13],"days":b[1][905],"eras":b[1][14],"dayPeriods":b[0][1974]},{"months":b[1][15],"days":b[1][905],"eras":b[1][16],"dayPeriods":b[0][1974]},{"months":b[1][904],"days":b[1][905],"eras":b[1][17],"dayPeriods":b[0][1974]},{"months":b[1][18],"days":b[1][905],"eras":b[1][19],"dayPeriods":b[0][1974]},{"months":b[1][904],"days":b[1][905],"eras":b[1][27],"dayPeriods":b[0][1974]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1977]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][1978]},{"months":b[1][909],"days":b[1][910],"eras":b[1][160],"dayPeriods":b[0][1983]},{"months":b[1][9],"days":b[1][910],"dayPeriods":b[0][1983]},{"months":b[1][161],"days":b[1][910],"eras":b[1][6],"dayPeriods":b[0][1983]},{"months":b[1][162],"days":b[1][910],"eras":b[1][6],"dayPeriods":b[0][1983]},{"months":b[1][162],"days":b[1][910],"eras":b[1][8],"dayPeriods":b[0][1983]},{"months":b[1][9],"days":b[1][910],"eras":b[1][6],"dayPeriods":b[0][1983]},{"months":b[1][909],"days":b[1][910],"eras":b[1][911],"dayPeriods":b[0][1983]},{"months":b[1][164],"days":b[1][910],"eras":b[1][12],"dayPeriods":b[0][1983]},{"months":b[1][165],"days":b[1][910],"eras":b[1][166],"dayPeriods":b[0][1983]},{"months":b[1][167],"days":b[1][910],"eras":b[1][168],"dayPeriods":b[0][1983]},{"months":b[1][909],"days":b[1][910],"eras":b[1][169],"dayPeriods":b[0][1983]},{"months":b[1][170],"days":b[1][910],"eras":b[1][19],"dayPeriods":b[0][1983]},{"months":b[1][909],"days":b[1][910],"eras":b[1][171],"dayPeriods":b[0][1983]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][1985]},{"months":b[1][913],"days":b[1][914],"eras":b[1][3],"dayPeriods":b[0][1991]},{"months":b[1][9],"days":b[1][914],"dayPeriods":b[0][1991]},{"months":b[1][915],"days":b[1][914],"eras":b[1][6],"dayPeriods":b[0][1991]},{"months":b[1][916],"days":b[1][914],"eras":b[1][6],"dayPeriods":b[0][1991]},{"months":b[1][916],"days":b[1][914],"eras":b[1][8],"dayPeriods":b[0][1991]},{"months":b[1][9],"days":b[1][914],"eras":b[1][6],"dayPeriods":b[0][1991]},{"months":b[1][913],"days":b[1][914],"eras":b[1][917],"dayPeriods":b[0][1991]},{"months":b[1][918],"days":b[1][914],"eras":b[1][12],"dayPeriods":b[0][1991]},{"months":b[1][919],"days":b[1][914],"eras":b[1][381],"dayPeriods":b[0][1991]},{"months":b[1][920],"days":b[1][914],"eras":b[1][16],"dayPeriods":b[0][1991]},{"months":b[1][913],"days":b[1][914],"eras":b[1][921],"dayPeriods":b[0][1991]},{"months":b[1][922],"days":b[1][914],"eras":b[1][19],"dayPeriods":b[0][1991]},{"months":b[1][913],"days":b[1][914],"eras":b[1][923],"dayPeriods":b[0][1991]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][95],"currencies":b[0][2002]},{"months":b[1][925],"days":b[1][926],"eras":b[1][3],"dayPeriods":b[0][2009]},{"months":b[1][9],"days":b[1][926],"dayPeriods":b[0][2009]},{"months":b[1][927],"days":b[1][926],"eras":b[1][6],"dayPeriods":b[0][2009]},{"months":b[1][928],"days":b[1][926],"eras":b[1][6],"dayPeriods":b[0][2009]},{"months":b[1][928],"days":b[1][926],"eras":b[1][8],"dayPeriods":b[0][2009]},{"months":b[1][9],"days":b[1][926],"eras":b[1][6],"dayPeriods":b[0][2009]},{"months":b[1][925],"days":b[1][926],"eras":b[1][929],"dayPeriods":b[0][2009]},{"months":b[1][930],"days":b[1][926],"eras":b[1][12],"dayPeriods":b[0][2009]},{"months":b[1][931],"days":b[1][926],"eras":b[1][932],"dayPeriods":b[0][2009]},{"months":b[1][933],"days":b[1][926],"eras":b[1][16],"dayPeriods":b[0][2009]},{"months":b[1][925],"days":b[1][926],"eras":b[1][934],"dayPeriods":b[0][2009]},{"months":b[1][935],"days":b[1][926],"eras":b[1][19],"dayPeriods":b[0][2009]},{"months":b[1][925],"days":b[1][926],"eras":b[1][936],"dayPeriods":b[0][2009]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][592],"currencies":b[0][2021]},{"months":b[1][939],"days":b[1][940],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][940],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][940],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][940],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][940],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][940],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][939],"days":b[1][940],"eras":b[1][941],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][940],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][940],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][940],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][939],"days":b[1][940],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][940],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][939],"days":b[1][940],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][2024]},{"months":b[1][943],"days":b[1][944],"eras":b[1][3],"dayPeriods":b[0][2030]},{"months":b[1][9],"days":b[1][944],"dayPeriods":b[0][2030]},{"months":b[1][5],"days":b[1][944],"eras":b[1][6],"dayPeriods":b[0][2030]},{"months":b[1][7],"days":b[1][944],"eras":b[1][6],"dayPeriods":b[0][2030]},{"months":b[1][7],"days":b[1][944],"eras":b[1][8],"dayPeriods":b[0][2030]},{"months":b[1][9],"days":b[1][944],"eras":b[1][6],"dayPeriods":b[0][2030]},{"months":b[1][943],"days":b[1][944],"eras":b[1][941],"dayPeriods":b[0][2030]},{"months":b[1][11],"days":b[1][944],"eras":b[1][12],"dayPeriods":b[0][2030]},{"months":b[1][13],"days":b[1][944],"eras":b[1][14],"dayPeriods":b[0][2030]},{"months":b[1][15],"days":b[1][944],"eras":b[1][16],"dayPeriods":b[0][2030]},{"months":b[1][943],"days":b[1][944],"eras":b[1][17],"dayPeriods":b[0][2030]},{"months":b[1][18],"days":b[1][944],"eras":b[1][19],"dayPeriods":b[0][2030]},{"months":b[1][943],"days":b[1][944],"eras":b[1][27],"dayPeriods":b[0][2030]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][95],"currencies":b[0][2031]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][2032]},{"months":b[1][946],"days":b[1][947],"eras":b[1][3],"dayPeriods":b[0][2041]},{"months":b[1][948],"days":b[1][947],"dayPeriods":b[0][2041]},{"months":b[1][5],"days":b[1][947],"eras":b[1][6],"dayPeriods":b[0][2041]},{"months":b[1][7],"days":b[1][947],"eras":b[1][6],"dayPeriods":b[0][2041]},{"months":b[1][7],"days":b[1][947],"eras":b[1][8],"dayPeriods":b[0][2041]},{"months":b[1][9],"days":b[1][947],"eras":b[1][6],"dayPeriods":b[0][2041]},{"months":b[1][946],"days":b[1][947],"eras":b[1][949],"dayPeriods":b[0][2041]},{"months":b[1][11],"days":b[1][947],"eras":b[1][12],"dayPeriods":b[0][2041]},{"months":b[1][13],"days":b[1][947],"eras":b[1][14],"dayPeriods":b[0][2041]},{"months":b[1][15],"days":b[1][947],"eras":b[1][16],"dayPeriods":b[0][2041]},{"months":b[1][946],"days":b[1][947],"eras":b[1][17],"dayPeriods":b[0][2041]},{"months":b[1][18],"days":b[1][947],"eras":b[1][19],"dayPeriods":b[0][2041]},{"months":b[1][946],"days":b[1][947],"eras":b[1][27],"dayPeriods":b[0][2041]},{"nu":b[0][37],"patterns":b[1][73],"symbols":b[1][950],"currencies":b[0][188]},{"nu":b[0][37],"patterns":b[1][73],"symbols":b[1][950],"currencies":b[0][2046]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][950],"currencies":b[0][2047]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][950],"currencies":b[0][2048]},{"months":b[1][953],"days":b[1][954],"eras":b[1][3],"dayPeriods":b[0][2057]},{"months":b[1][9],"days":b[1][954],"dayPeriods":b[0][2057]},{"months":b[1][5],"days":b[1][954],"eras":b[1][6],"dayPeriods":b[0][2057]},{"months":b[1][7],"days":b[1][954],"eras":b[1][6],"dayPeriods":b[0][2057]},{"months":b[1][7],"days":b[1][954],"eras":b[1][8],"dayPeriods":b[0][2057]},{"months":b[1][9],"days":b[1][954],"eras":b[1][6],"dayPeriods":b[0][2057]},{"months":b[1][953],"days":b[1][954],"eras":b[1][955],"dayPeriods":b[0][2057]},{"months":b[1][11],"days":b[1][954],"eras":b[1][12],"dayPeriods":b[0][2057]},{"months":b[1][13],"days":b[1][954],"eras":b[1][14],"dayPeriods":b[0][2057]},{"months":b[1][15],"days":b[1][954],"eras":b[1][16],"dayPeriods":b[0][2057]},{"months":b[1][953],"days":b[1][954],"eras":b[1][17],"dayPeriods":b[0][2057]},{"months":b[1][18],"days":b[1][954],"eras":b[1][19],"dayPeriods":b[0][2057]},{"months":b[1][953],"days":b[1][954],"eras":b[1][27],"dayPeriods":b[0][2057]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][956],"currencies":b[0][894]},{"months":b[1][957],"days":b[1][958],"eras":b[1][3],"dayPeriods":b[0][2066]},{"months":b[1][9],"days":b[1][958],"dayPeriods":b[0][2066]},{"months":b[1][5],"days":b[1][958],"eras":b[1][6],"dayPeriods":b[0][2066]},{"months":b[1][7],"days":b[1][958],"eras":b[1][6],"dayPeriods":b[0][2066]},{"months":b[1][7],"days":b[1][958],"eras":b[1][8],"dayPeriods":b[0][2066]},{"months":b[1][9],"days":b[1][958],"eras":b[1][6],"dayPeriods":b[0][2066]},{"months":b[1][957],"days":b[1][958],"eras":b[1][858],"dayPeriods":b[0][2066]},{"months":b[1][11],"days":b[1][958],"eras":b[1][12],"dayPeriods":b[0][2066]},{"months":b[1][13],"days":b[1][958],"eras":b[1][14],"dayPeriods":b[0][2066]},{"months":b[1][15],"days":b[1][958],"eras":b[1][16],"dayPeriods":b[0][2066]},{"months":b[1][957],"days":b[1][958],"eras":b[1][17],"dayPeriods":b[0][2066]},{"months":b[1][18],"days":b[1][958],"eras":b[1][19],"dayPeriods":b[0][2066]},{"months":b[1][957],"days":b[1][958],"eras":b[1][27],"dayPeriods":b[0][2066]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][2067]},{"months":b[1][960],"days":b[1][961],"eras":b[1][962],"dayPeriods":b[0][2078]},{"months":b[1][176],"days":b[1][961],"dayPeriods":b[0][2078]},{"months":b[1][963],"days":b[1][961],"eras":b[1][6],"dayPeriods":b[0][2078]},{"months":b[1][964],"days":b[1][961],"eras":b[1][6],"dayPeriods":b[0][2078]},{"months":b[1][964],"days":b[1][961],"eras":b[1][8],"dayPeriods":b[0][2078]},{"months":b[1][9],"days":b[1][961],"eras":b[1][6],"dayPeriods":b[0][2078]},{"months":b[1][960],"days":b[1][961],"eras":b[1][965],"dayPeriods":b[0][2078]},{"months":b[1][966],"days":b[1][961],"eras":b[1][967],"dayPeriods":b[0][2078]},{"months":b[1][968],"days":b[1][961],"eras":b[1][969],"dayPeriods":b[0][2078]},{"months":b[1][970],"days":b[1][961],"eras":b[1][971],"dayPeriods":b[0][2078]},{"months":b[1][960],"days":b[1][961],"eras":b[1][972],"dayPeriods":b[0][2078]},{"months":b[1][973],"days":b[1][961],"eras":b[1][974],"dayPeriods":b[0][2078]},{"months":b[1][960],"days":b[1][961],"eras":b[1][975],"dayPeriods":b[0][2078]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][976],"currencies":b[0][2096]},{"months":b[1][978],"days":b[1][979],"eras":b[1][3],"dayPeriods":b[0][2102]},{"months":b[1][9],"days":b[1][979],"dayPeriods":b[0][2102]},{"months":b[1][5],"days":b[1][979],"eras":b[1][6],"dayPeriods":b[0][2102]},{"months":b[1][7],"days":b[1][979],"eras":b[1][6],"dayPeriods":b[0][2102]},{"months":b[1][7],"days":b[1][979],"eras":b[1][8],"dayPeriods":b[0][2102]},{"months":b[1][9],"days":b[1][979],"eras":b[1][6],"dayPeriods":b[0][2102]},{"months":b[1][978],"days":b[1][979],"eras":b[1][980],"dayPeriods":b[0][2102]},{"months":b[1][11],"days":b[1][979],"eras":b[1][12],"dayPeriods":b[0][2102]},{"months":b[1][13],"days":b[1][979],"eras":b[1][14],"dayPeriods":b[0][2102]},{"months":b[1][15],"days":b[1][979],"eras":b[1][16],"dayPeriods":b[0][2102]},{"months":b[1][978],"days":b[1][979],"eras":b[1][17],"dayPeriods":b[0][2102]},{"months":b[1][18],"days":b[1][979],"eras":b[1][19],"dayPeriods":b[0][2102]},{"months":b[1][978],"days":b[1][979],"eras":b[1][27],"dayPeriods":b[0][2102]},{"months":b[1][982],"days":b[1][983],"eras":b[1][3],"dayPeriods":b[0][2102]},{"months":b[1][9],"days":b[1][983],"dayPeriods":b[0][2102]},{"months":b[1][5],"days":b[1][983],"eras":b[1][6],"dayPeriods":b[0][2102]},{"months":b[1][7],"days":b[1][983],"eras":b[1][6],"dayPeriods":b[0][2102]},{"months":b[1][7],"days":b[1][983],"eras":b[1][8],"dayPeriods":b[0][2102]},{"months":b[1][9],"days":b[1][983],"eras":b[1][6],"dayPeriods":b[0][2102]},{"months":b[1][982],"days":b[1][983],"eras":b[1][980],"dayPeriods":b[0][2102]},{"months":b[1][11],"days":b[1][983],"eras":b[1][12],"dayPeriods":b[0][2102]},{"months":b[1][13],"days":b[1][983],"eras":b[1][14],"dayPeriods":b[0][2102]},{"months":b[1][15],"days":b[1][983],"eras":b[1][16],"dayPeriods":b[0][2102]},{"months":b[1][982],"days":b[1][983],"eras":b[1][17],"dayPeriods":b[0][2102]},{"months":b[1][18],"days":b[1][983],"eras":b[1][19],"dayPeriods":b[0][2102]},{"months":b[1][982],"days":b[1][983],"eras":b[1][27],"dayPeriods":b[0][2102]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][2107]},{"months":b[1][9],"days":b[1][985],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][985],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][985],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][985],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][985],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][985],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][985],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][985],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][985],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][985],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][985],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][985],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][985],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][104],"symbols":b[1][986],"currencies":b[0][2111]},{"months":b[1][988],"days":b[1][989],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][989],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][989],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][989],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][989],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][989],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][988],"days":b[1][989],"eras":b[1][990],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][989],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][989],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][989],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][988],"days":b[1][989],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][989],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][988],"days":b[1][989],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][991],"currencies":b[0][2122]},{"months":b[1][993],"days":b[1][994],"eras":b[1][3],"dayPeriods":b[0][2131]},{"months":b[1][9],"days":b[1][994],"dayPeriods":b[0][2131]},{"months":b[1][995],"days":b[1][994],"eras":b[1][6],"dayPeriods":b[0][2131]},{"months":b[1][996],"days":b[1][994],"eras":b[1][6],"dayPeriods":b[0][2131]},{"months":b[1][996],"days":b[1][994],"eras":b[1][8],"dayPeriods":b[0][2131]},{"months":b[1][9],"days":b[1][994],"eras":b[1][6],"dayPeriods":b[0][2131]},{"months":b[1][993],"days":b[1][994],"eras":b[1][997],"dayPeriods":b[0][2131]},{"months":b[1][998],"days":b[1][994],"eras":b[1][12],"dayPeriods":b[0][2131]},{"months":b[1][13],"days":b[1][994],"eras":b[1][14],"dayPeriods":b[0][2131]},{"months":b[1][999],"days":b[1][994],"eras":b[1][1000],"dayPeriods":b[0][2131]},{"months":b[1][993],"days":b[1][994],"eras":b[1][17],"dayPeriods":b[0][2131]},{"months":b[1][1001],"days":b[1][994],"eras":b[1][19],"dayPeriods":b[0][2131]},{"months":b[1][993],"days":b[1][994],"eras":b[1][20],"dayPeriods":b[0][2131]},{"nu":b[0][37],"patterns":b[1][1002],"symbols":b[1][95],"currencies":b[0][2141]},{"months":b[1][214],"days":b[1][870],"eras":b[1][3],"dayPeriods":b[0][460]},{"months":b[1][9],"days":b[1][870],"dayPeriods":b[0][460]},{"months":b[1][5],"days":b[1][870],"eras":b[1][6],"dayPeriods":b[0][460]},{"months":b[1][7],"days":b[1][870],"eras":b[1][6],"dayPeriods":b[0][460]},{"months":b[1][7],"days":b[1][870],"eras":b[1][8],"dayPeriods":b[0][460]},{"months":b[1][9],"days":b[1][870],"eras":b[1][6],"dayPeriods":b[0][460]},{"months":b[1][214],"days":b[1][870],"eras":b[1][216],"dayPeriods":b[0][460]},{"months":b[1][11],"days":b[1][870],"eras":b[1][12],"dayPeriods":b[0][460]},{"months":b[1][13],"days":b[1][870],"eras":b[1][14],"dayPeriods":b[0][460]},{"months":b[1][15],"days":b[1][870],"eras":b[1][16],"dayPeriods":b[0][460]},{"months":b[1][214],"days":b[1][870],"eras":b[1][17],"dayPeriods":b[0][460]},{"months":b[1][18],"days":b[1][870],"eras":b[1][19],"dayPeriods":b[0][460]},{"months":b[1][214],"days":b[1][870],"eras":b[1][27],"dayPeriods":b[0][460]},{"months":b[1][1004],"days":b[1][1005],"eras":b[1][3],"dayPeriods":b[0][2148]},{"months":b[1][9],"days":b[1][1005],"dayPeriods":b[0][2148]},{"months":b[1][5],"days":b[1][1005],"eras":b[1][6],"dayPeriods":b[0][2148]},{"months":b[1][7],"days":b[1][1005],"eras":b[1][6],"dayPeriods":b[0][2148]},{"months":b[1][7],"days":b[1][1005],"eras":b[1][8],"dayPeriods":b[0][2148]},{"months":b[1][9],"days":b[1][1005],"eras":b[1][6],"dayPeriods":b[0][2148]},{"months":b[1][1004],"days":b[1][1005],"eras":b[1][1006],"dayPeriods":b[0][2148]},{"months":b[1][11],"days":b[1][1005],"eras":b[1][12],"dayPeriods":b[0][2148]},{"months":b[1][13],"days":b[1][1005],"eras":b[1][14],"dayPeriods":b[0][2148]},{"months":b[1][15],"days":b[1][1005],"eras":b[1][16],"dayPeriods":b[0][2148]},{"months":b[1][1004],"days":b[1][1005],"eras":b[1][17],"dayPeriods":b[0][2148]},{"months":b[1][18],"days":b[1][1005],"eras":b[1][19],"dayPeriods":b[0][2148]},{"months":b[1][1004],"days":b[1][1005],"eras":b[1][27],"dayPeriods":b[0][2148]},{"months":b[1][1008],"days":b[1][1009],"eras":b[1][1010],"dayPeriods":b[0][2159]},{"months":b[1][4],"days":b[1][1009],"dayPeriods":b[0][2159]},{"months":b[1][5],"days":b[1][1009],"eras":b[1][6],"dayPeriods":b[0][2159]},{"months":b[1][7],"days":b[1][1009],"eras":b[1][6],"dayPeriods":b[0][2159]},{"months":b[1][7],"days":b[1][1009],"eras":b[1][8],"dayPeriods":b[0][2159]},{"months":b[1][9],"days":b[1][1009],"eras":b[1][6],"dayPeriods":b[0][2159]},{"months":b[1][1008],"days":b[1][1009],"eras":b[1][1011],"dayPeriods":b[0][2159]},{"months":b[1][11],"days":b[1][1009],"eras":b[1][12],"dayPeriods":b[0][2159]},{"months":b[1][13],"days":b[1][1009],"eras":b[1][14],"dayPeriods":b[0][2159]},{"months":b[1][1012],"days":b[1][1009],"eras":b[1][1013],"dayPeriods":b[0][2159]},{"months":b[1][1008],"days":b[1][1009],"eras":b[1][17],"dayPeriods":b[0][2159]},{"months":b[1][18],"days":b[1][1009],"eras":b[1][19],"dayPeriods":b[0][2159]},{"months":b[1][1008],"days":b[1][1009],"eras":b[1][1014],"dayPeriods":b[0][2159]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][632],"currencies":b[0][2166]},{"months":b[1][1016],"days":b[1][1017],"eras":b[1][3],"dayPeriods":b[0][2175]},{"months":b[1][9],"days":b[1][1017],"dayPeriods":b[0][2175]},{"months":b[1][1018],"days":b[1][1017],"eras":b[1][6],"dayPeriods":b[0][2175]},{"months":b[1][1019],"days":b[1][1017],"eras":b[1][6],"dayPeriods":b[0][2175]},{"months":b[1][1019],"days":b[1][1017],"eras":b[1][8],"dayPeriods":b[0][2175]},{"months":b[1][9],"days":b[1][1017],"eras":b[1][6],"dayPeriods":b[0][2175]},{"months":b[1][1016],"days":b[1][1017],"eras":b[1][1020],"dayPeriods":b[0][2175]},{"months":b[1][1021],"days":b[1][1017],"eras":b[1][12],"dayPeriods":b[0][2175]},{"months":b[1][1022],"days":b[1][1017],"eras":b[1][14],"dayPeriods":b[0][2175]},{"months":b[1][1023],"days":b[1][1017],"eras":b[1][16],"dayPeriods":b[0][2175]},{"months":b[1][1016],"days":b[1][1017],"eras":b[1][17],"dayPeriods":b[0][2175]},{"months":b[1][1024],"days":b[1][1017],"eras":b[1][19],"dayPeriods":b[0][2175]},{"months":b[1][1016],"days":b[1][1017],"eras":b[1][27],"dayPeriods":b[0][2175]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][28],"currencies":b[0][2188]},{"months":b[1][1026],"days":b[1][1027],"eras":b[1][3],"dayPeriods":b[0][2193]},{"months":b[1][9],"days":b[1][1027],"dayPeriods":b[0][2193]},{"months":b[1][5],"days":b[1][1027],"eras":b[1][6],"dayPeriods":b[0][2193]},{"months":b[1][7],"days":b[1][1027],"eras":b[1][6],"dayPeriods":b[0][2193]},{"months":b[1][7],"days":b[1][1027],"eras":b[1][8],"dayPeriods":b[0][2193]},{"months":b[1][9],"days":b[1][1027],"eras":b[1][6],"dayPeriods":b[0][2193]},{"months":b[1][1026],"days":b[1][1027],"eras":b[1][1028],"dayPeriods":b[0][2193]},{"months":b[1][11],"days":b[1][1027],"eras":b[1][12],"dayPeriods":b[0][2193]},{"months":b[1][13],"days":b[1][1027],"eras":b[1][14],"dayPeriods":b[0][2193]},{"months":b[1][1029],"days":b[1][1027],"eras":b[1][16],"dayPeriods":b[0][2193]},{"months":b[1][1026],"days":b[1][1027],"eras":b[1][17],"dayPeriods":b[0][2193]},{"months":b[1][18],"days":b[1][1027],"eras":b[1][19],"dayPeriods":b[0][2193]},{"months":b[1][1026],"days":b[1][1027],"eras":b[1][27],"dayPeriods":b[0][2193]},{"nu":b[0][37],"patterns":b[1][73],"symbols":b[1][1030],"currencies":b[0][2197]},{"nu":b[0][748],"patterns":b[1][73],"symbols":b[1][1030],"currencies":b[0][894]},{"months":b[1][1032],"days":b[1][1033],"eras":b[1][3],"dayPeriods":b[0][2207]},{"months":b[1][9],"days":b[1][1033],"dayPeriods":b[0][2207]},{"months":b[1][5],"days":b[1][1033],"eras":b[1][6],"dayPeriods":b[0][2207]},{"months":b[1][7],"days":b[1][1033],"eras":b[1][6],"dayPeriods":b[0][2207]},{"months":b[1][7],"days":b[1][1033],"eras":b[1][8],"dayPeriods":b[0][2207]},{"months":b[1][9],"days":b[1][1033],"eras":b[1][6],"dayPeriods":b[0][2207]},{"months":b[1][1032],"days":b[1][1033],"eras":b[1][1034],"dayPeriods":b[0][2207]},{"months":b[1][11],"days":b[1][1033],"eras":b[1][12],"dayPeriods":b[0][2207]},{"months":b[1][13],"days":b[1][1033],"eras":b[1][14],"dayPeriods":b[0][2207]},{"months":b[1][1035],"days":b[1][1033],"eras":b[1][16],"dayPeriods":b[0][2207]},{"months":b[1][1032],"days":b[1][1033],"eras":b[1][17],"dayPeriods":b[0][2207]},{"months":b[1][18],"days":b[1][1033],"eras":b[1][19],"dayPeriods":b[0][2207]},{"months":b[1][1032],"days":b[1][1033],"eras":b[1][27],"dayPeriods":b[0][2207]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][1036],"currencies":b[0][2212]},{"months":b[1][1037],"days":b[1][1038],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1038],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][1038],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1038],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1038],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1038],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][1037],"days":b[1][1038],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][1038],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][1038],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][1038],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][1037],"days":b[1][1038],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][1038],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][1037],"days":b[1][1038],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][748],"patterns":b[1][58],"symbols":b[1][801],"currencies":b[0][1733]},{"months":b[1][1040],"days":b[1][1041],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1041],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][1041],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1041],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1041],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1041],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][1040],"days":b[1][1041],"eras":b[1][1042],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][1041],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][1041],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][1041],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][1040],"days":b[1][1041],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][1041],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][1040],"days":b[1][1041],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][28],"currencies":b[0][2222]},{"months":b[1][1043],"days":b[1][1044],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1044],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][1044],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1044],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1044],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1044],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][1043],"days":b[1][1044],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][1044],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][1044],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][1044],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][1043],"days":b[1][1044],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][1044],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][1043],"days":b[1][1044],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][1045],"currencies":b[0][588]},{"months":b[1][1047],"days":b[1][1048],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1048],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][1048],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1048],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1048],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1048],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][1047],"days":b[1][1048],"eras":b[1][72],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][1048],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][1048],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][1048],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][1047],"days":b[1][1048],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][1048],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][1047],"days":b[1][1048],"eras":b[1][27],"dayPeriods":b[0][11]},{"months":b[1][1050],"days":b[1][1051],"eras":b[1][3],"dayPeriods":b[0][2234]},{"months":b[1][176],"days":b[1][1051],"dayPeriods":b[0][2234]},{"months":b[1][5],"days":b[1][1051],"eras":b[1][6],"dayPeriods":b[0][2234]},{"months":b[1][7],"days":b[1][1051],"eras":b[1][6],"dayPeriods":b[0][2234]},{"months":b[1][7],"days":b[1][1051],"eras":b[1][8],"dayPeriods":b[0][2234]},{"months":b[1][9],"days":b[1][1051],"eras":b[1][6],"dayPeriods":b[0][2234]},{"months":b[1][1050],"days":b[1][1051],"eras":b[1][1052],"dayPeriods":b[0][2234]},{"months":b[1][11],"days":b[1][1051],"eras":b[1][12],"dayPeriods":b[0][2234]},{"months":b[1][13],"days":b[1][1051],"eras":b[1][14],"dayPeriods":b[0][2234]},{"months":b[1][15],"days":b[1][1051],"eras":b[1][16],"dayPeriods":b[0][2234]},{"months":b[1][1050],"days":b[1][1051],"eras":b[1][17],"dayPeriods":b[0][2234]},{"months":b[1][18],"days":b[1][1051],"eras":b[1][19],"dayPeriods":b[0][2234]},{"months":b[1][1050],"days":b[1][1051],"eras":b[1][1053],"dayPeriods":b[0][2234]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][95],"currencies":b[0][1258]},{"months":b[1][1055],"days":b[1][1056],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1056],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][1056],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1056],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1056],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1056],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][1055],"days":b[1][1056],"eras":b[1][1057],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][1056],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][1056],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][1056],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][1055],"days":b[1][1056],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][1056],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][1055],"days":b[1][1056],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][58],"symbols":b[1][1058],"currencies":b[0][42]},{"months":b[1][607],"days":b[1][1059],"eras":b[1][3],"dayPeriods":b[0][2250]},{"months":b[1][9],"days":b[1][1059],"dayPeriods":b[0][2250]},{"months":b[1][5],"days":b[1][1059],"eras":b[1][6],"dayPeriods":b[0][2250]},{"months":b[1][7],"days":b[1][1059],"eras":b[1][6],"dayPeriods":b[0][2250]},{"months":b[1][7],"days":b[1][1059],"eras":b[1][8],"dayPeriods":b[0][2250]},{"months":b[1][9],"days":b[1][1059],"eras":b[1][6],"dayPeriods":b[0][2250]},{"months":b[1][607],"days":b[1][1059],"eras":b[1][1060],"dayPeriods":b[0][2250]},{"months":b[1][11],"days":b[1][1059],"eras":b[1][12],"dayPeriods":b[0][2250]},{"months":b[1][13],"days":b[1][1059],"eras":b[1][14],"dayPeriods":b[0][2250]},{"months":b[1][15],"days":b[1][1059],"eras":b[1][16],"dayPeriods":b[0][2250]},{"months":b[1][607],"days":b[1][1059],"eras":b[1][17],"dayPeriods":b[0][2250]},{"months":b[1][18],"days":b[1][1059],"eras":b[1][19],"dayPeriods":b[0][2250]},{"months":b[1][607],"days":b[1][1059],"eras":b[1][27],"dayPeriods":b[0][2250]},{"nu":b[0][37],"patterns":b[1][79],"symbols":b[1][22],"currencies":b[0][377]},{"months":b[1][1061],"days":b[1][1062],"eras":b[1][3],"dayPeriods":b[0][2258]},{"months":b[1][9],"days":b[1][1062],"dayPeriods":b[0][2258]},{"months":b[1][5],"days":b[1][1062],"eras":b[1][6],"dayPeriods":b[0][2258]},{"months":b[1][7],"days":b[1][1062],"eras":b[1][6],"dayPeriods":b[0][2258]},{"months":b[1][7],"days":b[1][1062],"eras":b[1][8],"dayPeriods":b[0][2258]},{"months":b[1][9],"days":b[1][1062],"eras":b[1][6],"dayPeriods":b[0][2258]},{"months":b[1][1061],"days":b[1][1062],"eras":b[1][1063],"dayPeriods":b[0][2258]},{"months":b[1][11],"days":b[1][1062],"eras":b[1][12],"dayPeriods":b[0][2258]},{"months":b[1][13],"days":b[1][1062],"eras":b[1][14],"dayPeriods":b[0][2258]},{"months":b[1][15],"days":b[1][1062],"eras":b[1][16],"dayPeriods":b[0][2258]},{"months":b[1][1061],"days":b[1][1062],"eras":b[1][17],"dayPeriods":b[0][2258]},{"months":b[1][18],"days":b[1][1062],"eras":b[1][19],"dayPeriods":b[0][2258]},{"months":b[1][1061],"days":b[1][1062],"eras":b[1][27],"dayPeriods":b[0][2258]},{"months":b[1][1065],"days":b[1][1066],"eras":b[1][3],"dayPeriods":b[0][2265]},{"months":b[1][9],"days":b[1][1066],"dayPeriods":b[0][2265]},{"months":b[1][5],"days":b[1][1066],"eras":b[1][6],"dayPeriods":b[0][2265]},{"months":b[1][7],"days":b[1][1066],"eras":b[1][6],"dayPeriods":b[0][2265]},{"months":b[1][7],"days":b[1][1066],"eras":b[1][8],"dayPeriods":b[0][2265]},{"months":b[1][9],"days":b[1][1066],"eras":b[1][6],"dayPeriods":b[0][2265]},{"months":b[1][1065],"days":b[1][1066],"eras":b[1][72],"dayPeriods":b[0][2265]},{"months":b[1][1067],"days":b[1][1066],"eras":b[1][429],"dayPeriods":b[0][2265]},{"months":b[1][13],"days":b[1][1066],"eras":b[1][14],"dayPeriods":b[0][2265]},{"months":b[1][15],"days":b[1][1066],"eras":b[1][16],"dayPeriods":b[0][2265]},{"months":b[1][1065],"days":b[1][1066],"eras":b[1][17],"dayPeriods":b[0][2265]},{"months":b[1][18],"days":b[1][1066],"eras":b[1][19],"dayPeriods":b[0][2265]},{"months":b[1][1065],"days":b[1][1066],"eras":b[1][27],"dayPeriods":b[0][2265]},{"months":b[1][1068],"days":b[1][1069],"eras":b[1][3],"dayPeriods":b[0][2272]},{"months":b[1][9],"days":b[1][1069],"dayPeriods":b[0][2272]},{"months":b[1][5],"days":b[1][1069],"eras":b[1][6],"dayPeriods":b[0][2272]},{"months":b[1][7],"days":b[1][1069],"eras":b[1][6],"dayPeriods":b[0][2272]},{"months":b[1][7],"days":b[1][1069],"eras":b[1][8],"dayPeriods":b[0][2272]},{"months":b[1][9],"days":b[1][1069],"eras":b[1][6],"dayPeriods":b[0][2272]},{"months":b[1][1068],"days":b[1][1069],"eras":b[1][1070],"dayPeriods":b[0][2272]},{"months":b[1][11],"days":b[1][1069],"eras":b[1][12],"dayPeriods":b[0][2272]},{"months":b[1][13],"days":b[1][1069],"eras":b[1][14],"dayPeriods":b[0][2272]},{"months":b[1][15],"days":b[1][1069],"eras":b[1][16],"dayPeriods":b[0][2272]},{"months":b[1][1068],"days":b[1][1069],"eras":b[1][17],"dayPeriods":b[0][2272]},{"months":b[1][18],"days":b[1][1069],"eras":b[1][19],"dayPeriods":b[0][2272]},{"months":b[1][1068],"days":b[1][1069],"eras":b[1][27],"dayPeriods":b[0][2272]},{"months":b[1][1071],"days":b[1][1072],"eras":b[1][3],"dayPeriods":b[0][2279]},{"months":b[1][9],"days":b[1][1072],"dayPeriods":b[0][2279]},{"months":b[1][5],"days":b[1][1072],"eras":b[1][6],"dayPeriods":b[0][2279]},{"months":b[1][7],"days":b[1][1072],"eras":b[1][6],"dayPeriods":b[0][2279]},{"months":b[1][7],"days":b[1][1072],"eras":b[1][8],"dayPeriods":b[0][2279]},{"months":b[1][9],"days":b[1][1072],"eras":b[1][6],"dayPeriods":b[0][2279]},{"months":b[1][1071],"days":b[1][1072],"eras":b[1][1070],"dayPeriods":b[0][2279]},{"months":b[1][11],"days":b[1][1072],"eras":b[1][12],"dayPeriods":b[0][2279]},{"months":b[1][13],"days":b[1][1072],"eras":b[1][14],"dayPeriods":b[0][2279]},{"months":b[1][15],"days":b[1][1072],"eras":b[1][16],"dayPeriods":b[0][2279]},{"months":b[1][1071],"days":b[1][1072],"eras":b[1][17],"dayPeriods":b[0][2279]},{"months":b[1][18],"days":b[1][1072],"eras":b[1][19],"dayPeriods":b[0][2279]},{"months":b[1][1071],"days":b[1][1072],"eras":b[1][27],"dayPeriods":b[0][2279]},{"months":b[1][875],"days":b[1][1074],"eras":b[1][3],"dayPeriods":b[0][1898]},{"months":b[1][9],"days":b[1][1074],"dayPeriods":b[0][1898]},{"months":b[1][5],"days":b[1][1074],"eras":b[1][6],"dayPeriods":b[0][1898]},{"months":b[1][7],"days":b[1][1074],"eras":b[1][6],"dayPeriods":b[0][1898]},{"months":b[1][7],"days":b[1][1074],"eras":b[1][8],"dayPeriods":b[0][1898]},{"months":b[1][9],"days":b[1][1074],"eras":b[1][6],"dayPeriods":b[0][1898]},{"months":b[1][875],"days":b[1][1074],"eras":b[1][877],"dayPeriods":b[0][1898]},{"months":b[1][11],"days":b[1][1074],"eras":b[1][12],"dayPeriods":b[0][1898]},{"months":b[1][13],"days":b[1][1074],"eras":b[1][14],"dayPeriods":b[0][1898]},{"months":b[1][15],"days":b[1][1074],"eras":b[1][16],"dayPeriods":b[0][1898]},{"months":b[1][875],"days":b[1][1074],"eras":b[1][17],"dayPeriods":b[0][1898]},{"months":b[1][18],"days":b[1][1074],"eras":b[1][19],"dayPeriods":b[0][1898]},{"months":b[1][875],"days":b[1][1074],"eras":b[1][27],"dayPeriods":b[0][1898]},{"nu":b[0][37],"patterns":b[1][824],"symbols":b[1][28],"currencies":b[0][70]},{"months":b[1][1076],"days":b[1][1077],"eras":b[1][1078],"dayPeriods":b[0][2290]},{"months":b[1][1079],"days":b[1][1077],"dayPeriods":b[0][2290]},{"months":b[1][1080],"days":b[1][1077],"eras":b[1][6],"dayPeriods":b[0][2290]},{"months":b[1][1080],"days":b[1][1077],"eras":b[1][8],"dayPeriods":b[0][2290]},{"months":b[1][9],"days":b[1][1077],"eras":b[1][6],"dayPeriods":b[0][2290]},{"months":b[1][1076],"days":b[1][1077],"eras":b[1][1081],"dayPeriods":b[0][2290]},{"months":b[1][1082],"days":b[1][1077],"eras":b[1][1083],"dayPeriods":b[0][2290]},{"months":b[1][1076],"days":b[1][1077],"eras":b[1][1084],"dayPeriods":b[0][2290]},{"months":b[1][1076],"days":b[1][1077],"eras":b[1][1085],"dayPeriods":b[0][2290]},{"months":b[1][1076],"days":b[1][1077],"eras":b[1][1086],"dayPeriods":b[0][2290]},{"months":b[1][1076],"days":b[1][1077],"eras":b[1][1087],"dayPeriods":b[0][2290]},{"months":b[1][1076],"days":b[1][1077],"eras":b[1][508],"dayPeriods":b[0][2290]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][1088],"currencies":b[0][2303]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][1088],"currencies":b[0][2306]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][1088],"currencies":b[0][2308]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][1088],"currencies":b[0][2311]},{"months":b[1][495],"days":b[1][1093],"eras":b[1][1094],"dayPeriods":b[0][2290]},{"months":b[1][1095],"days":b[1][1093],"dayPeriods":b[0][2290]},{"months":b[1][1096],"days":b[1][1093],"eras":b[1][6],"dayPeriods":b[0][2290]},{"months":b[1][498],"days":b[1][1093],"dayPeriods":b[0][2290]},{"months":b[1][1096],"days":b[1][1093],"eras":b[1][8],"dayPeriods":b[0][2290]},{"months":b[1][9],"days":b[1][1093],"eras":b[1][6],"dayPeriods":b[0][2290]},{"months":b[1][495],"days":b[1][1093],"eras":b[1][1097],"dayPeriods":b[0][2290]},{"months":b[1][1098],"days":b[1][1093],"eras":b[1][1099],"dayPeriods":b[0][2290]},{"months":b[1][1100],"days":b[1][1093],"eras":b[1][1101],"dayPeriods":b[0][2290]},{"months":b[1][1102],"days":b[1][1093],"eras":b[1][1103],"dayPeriods":b[0][2290]},{"months":b[1][495],"days":b[1][1093],"eras":b[1][1104],"dayPeriods":b[0][2290]},{"months":b[1][495],"days":b[1][1093],"eras":b[1][1105],"dayPeriods":b[0][2290]},{"months":b[1][495],"days":b[1][1093],"eras":b[1][1106],"dayPeriods":b[0][2290]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][1107],"currencies":b[0][2330]},{"months":b[1][495],"days":b[1][1093],"eras":b[1][1109],"dayPeriods":b[0][2290]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][1107],"currencies":b[0][2096]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][1107],"currencies":b[0][2334]},{"months":b[1][1111],"days":b[1][1112],"eras":b[1][3],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1112],"dayPeriods":b[0][11]},{"months":b[1][5],"days":b[1][1112],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1112],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][7],"days":b[1][1112],"eras":b[1][8],"dayPeriods":b[0][11]},{"months":b[1][9],"days":b[1][1112],"eras":b[1][6],"dayPeriods":b[0][11]},{"months":b[1][1111],"days":b[1][1112],"eras":b[1][349],"dayPeriods":b[0][11]},{"months":b[1][11],"days":b[1][1112],"eras":b[1][12],"dayPeriods":b[0][11]},{"months":b[1][13],"days":b[1][1112],"eras":b[1][14],"dayPeriods":b[0][11]},{"months":b[1][15],"days":b[1][1112],"eras":b[1][16],"dayPeriods":b[0][11]},{"months":b[1][1111],"days":b[1][1112],"eras":b[1][17],"dayPeriods":b[0][11]},{"months":b[1][18],"days":b[1][1112],"eras":b[1][19],"dayPeriods":b[0][11]},{"months":b[1][1111],"days":b[1][1112],"eras":b[1][27],"dayPeriods":b[0][11]},{"nu":b[0][37],"patterns":b[1][21],"symbols":b[1][22],"currencies":b[0][2342]}];b[3]=[{"buddhist":b[2][0],"chinese":b[2][1],"coptic":b[2][2],"dangi":b[2][1],"ethiopic":b[2][3],"ethioaa":b[2][4],"generic":b[2][5],"gregory":b[2][6],"hebrew":b[2][7],"indian":b[2][8],"islamic":b[2][9],"islamicc":b[2][9],"japanese":b[2][10],"persian":b[2][11],"roc":b[2][12]},{"buddhist":b[2][14],"chinese":b[2][15],"coptic":b[2][16],"dangi":b[2][15],"ethiopic":b[2][17],"ethioaa":b[2][18],"generic":b[2][19],"gregory":b[2][20],"hebrew":b[2][21],"indian":b[2][22],"islamic":b[2][23],"islamicc":b[2][23],"japanese":b[2][24],"persian":b[2][25],"roc":b[2][26]},{"buddhist":b[2][29],"chinese":b[2][30],"coptic":b[2][31],"dangi":b[2][30],"ethiopic":b[2][32],"ethioaa":b[2][33],"generic":b[2][34],"gregory":b[2][35],"hebrew":b[2][36],"indian":b[2][37],"islamic":b[2][38],"islamicc":b[2][38],"japanese":b[2][39],"persian":b[2][40],"roc":b[2][41]},{"buddhist":b[2][43],"chinese":b[2][44],"coptic":b[2][45],"dangi":b[2][44],"ethiopic":b[2][46],"ethioaa":b[2][47],"generic":b[2][48],"gregory":b[2][49],"hebrew":b[2][50],"indian":b[2][51],"islamic":b[2][52],"islamicc":b[2][52],"japanese":b[2][53],"persian":b[2][54],"roc":b[2][55]},{"buddhist":b[2][57],"chinese":b[2][58],"coptic":b[2][59],"dangi":b[2][58],"ethiopic":b[2][60],"ethioaa":b[2][61],"generic":b[2][62],"gregory":b[2][63],"hebrew":b[2][64],"indian":b[2][65],"islamic":b[2][66],"islamicc":b[2][66],"japanese":b[2][67],"persian":b[2][68],"roc":b[2][69]},{"buddhist":b[2][71],"chinese":b[2][72],"coptic":b[2][73],"dangi":b[2][72],"ethiopic":b[2][74],"ethioaa":b[2][75],"generic":b[2][76],"gregory":b[2][77],"hebrew":b[2][78],"indian":b[2][79],"islamic":b[2][80],"islamicc":b[2][80],"japanese":b[2][81],"persian":b[2][82],"roc":b[2][83]},{"buddhist":b[2][71],"chinese":b[2][72],"coptic":b[2][73],"dangi":b[2][72],"ethiopic":b[2][74],"ethioaa":b[2][75],"generic":b[2][76],"gregory":b[2][85],"hebrew":b[2][78],"indian":b[2][79],"islamic":b[2][80],"islamicc":b[2][80],"japanese":b[2][81],"persian":b[2][82],"roc":b[2][83]},{"buddhist":b[2][87],"chinese":b[2][72],"coptic":b[2][73],"dangi":b[2][72],"ethiopic":b[2][74],"ethioaa":b[2][75],"generic":b[2][76],"gregory":b[2][88],"hebrew":b[2][78],"indian":b[2][79],"islamic":b[2][80],"islamicc":b[2][80],"japanese":b[2][89],"persian":b[2][82],"roc":b[2][90]},{"buddhist":b[2][94],"chinese":b[2][72],"coptic":b[2][73],"dangi":b[2][72],"ethiopic":b[2][74],"ethioaa":b[2][75],"generic":b[2][76],"gregory":b[2][95],"hebrew":b[2][78],"indian":b[2][79],"islamic":b[2][80],"islamicc":b[2][80],"japanese":b[2][96],"persian":b[2][82],"roc":b[2][97]},{"buddhist":b[2][98],"chinese":b[2][72],"coptic":b[2][73],"dangi":b[2][72],"ethiopic":b[2][74],"ethioaa":b[2][75],"generic":b[2][76],"gregory":b[2][99],"hebrew":b[2][78],"indian":b[2][79],"islamic":b[2][80],"islamicc":b[2][80],"japanese":b[2][100],"persian":b[2][82],"roc":b[2][101]},{"buddhist":b[2][103],"chinese":b[2][72],"coptic":b[2][73],"dangi":b[2][72],"ethiopic":b[2][74],"ethioaa":b[2][75],"generic":b[2][76],"gregory":b[2][104],"hebrew":b[2][78],"indian":b[2][79],"islamic":b[2][80],"islamicc":b[2][80],"japanese":b[2][105],"persian":b[2][82],"roc":b[2][106]},{"buddhist":b[2][107],"chinese":b[2][72],"coptic":b[2][73],"dangi":b[2][72],"ethiopic":b[2][74],"ethioaa":b[2][75],"generic":b[2][76],"gregory":b[2][108],"hebrew":b[2][78],"indian":b[2][79],"islamic":b[2][80],"islamicc":b[2][80],"japanese":b[2][109],"persian":b[2][82],"roc":b[2][110]},{"buddhist":b[2][114],"chinese":b[2][115],"coptic":b[2][116],"dangi":b[2][115],"ethiopic":b[2][117],"ethioaa":b[2][118],"generic":b[2][119],"gregory":b[2][120],"hebrew":b[2][121],"indian":b[2][122],"islamic":b[2][123],"islamicc":b[2][123],"japanese":b[2][124],"persian":b[2][125],"roc":b[2][126]},{"buddhist":b[2][128],"chinese":b[2][129],"coptic":b[2][130],"dangi":b[2][129],"ethiopic":b[2][131],"ethioaa":b[2][132],"generic":b[2][133],"gregory":b[2][134],"hebrew":b[2][135],"indian":b[2][136],"islamic":b[2][137],"islamicc":b[2][137],"japanese":b[2][138],"persian":b[2][139],"roc":b[2][140]},{"buddhist":b[2][142],"chinese":b[2][143],"coptic":b[2][144],"dangi":b[2][143],"ethiopic":b[2][145],"ethioaa":b[2][146],"generic":b[2][147],"gregory":b[2][148],"hebrew":b[2][149],"indian":b[2][150],"islamic":b[2][151],"islamicc":b[2][151],"japanese":b[2][152],"persian":b[2][153],"roc":b[2][154]},{"buddhist":b[2][156],"chinese":b[2][157],"coptic":b[2][158],"dangi":b[2][157],"ethiopic":b[2][159],"ethioaa":b[2][160],"generic":b[2][161],"gregory":b[2][162],"hebrew":b[2][163],"indian":b[2][164],"islamic":b[2][165],"islamicc":b[2][165],"japanese":b[2][166],"persian":b[2][167],"roc":b[2][168]},{"buddhist":b[2][170],"chinese":b[2][171],"coptic":b[2][172],"dangi":b[2][171],"ethiopic":b[2][173],"ethioaa":b[2][174],"generic":b[2][175],"gregory":b[2][176],"hebrew":b[2][177],"indian":b[2][178],"islamic":b[2][179],"islamicc":b[2][179],"japanese":b[2][180],"persian":b[2][181],"roc":b[2][182]},{"buddhist":b[2][184],"chinese":b[2][185],"coptic":b[2][186],"dangi":b[2][185],"ethiopic":b[2][187],"ethioaa":b[2][188],"generic":b[2][189],"gregory":b[2][190],"hebrew":b[2][191],"indian":b[2][192],"islamic":b[2][193],"islamicc":b[2][193],"japanese":b[2][194],"persian":b[2][195],"roc":b[2][196]},{"buddhist":b[2][198],"chinese":b[2][199],"coptic":b[2][200],"dangi":b[2][199],"ethiopic":b[2][201],"ethioaa":b[2][202],"generic":b[2][203],"gregory":b[2][204],"hebrew":b[2][205],"indian":b[2][206],"islamic":b[2][207],"islamicc":b[2][207],"japanese":b[2][208],"persian":b[2][209],"roc":b[2][210]},{"buddhist":b[2][212],"chinese":b[2][213],"coptic":b[2][214],"dangi":b[2][213],"ethiopic":b[2][215],"ethioaa":b[2][216],"generic":b[2][217],"gregory":b[2][218],"hebrew":b[2][219],"indian":b[2][220],"islamic":b[2][221],"islamicc":b[2][221],"japanese":b[2][222],"persian":b[2][223],"roc":b[2][224]},{"buddhist":b[2][226],"chinese":b[2][227],"coptic":b[2][228],"dangi":b[2][227],"ethiopic":b[2][229],"ethioaa":b[2][230],"generic":b[2][231],"gregory":b[2][232],"hebrew":b[2][233],"indian":b[2][234],"islamic":b[2][235],"islamicc":b[2][235],"japanese":b[2][236],"persian":b[2][237],"roc":b[2][238]},{"buddhist":b[2][240],"chinese":b[2][241],"coptic":b[2][242],"dangi":b[2][241],"ethiopic":b[2][243],"ethioaa":b[2][244],"generic":b[2][245],"gregory":b[2][246],"hebrew":b[2][247],"indian":b[2][248],"islamic":b[2][249],"islamicc":b[2][249],"japanese":b[2][250],"persian":b[2][251],"roc":b[2][252]},{"buddhist":b[2][254],"chinese":b[2][255],"coptic":b[2][256],"dangi":b[2][255],"ethiopic":b[2][257],"ethioaa":b[2][258],"generic":b[2][259],"gregory":b[2][260],"hebrew":b[2][261],"indian":b[2][262],"islamic":b[2][263],"islamicc":b[2][263],"japanese":b[2][264],"persian":b[2][265],"roc":b[2][266]},{"buddhist":b[2][268],"chinese":b[2][269],"coptic":b[2][270],"dangi":b[2][269],"ethiopic":b[2][271],"ethioaa":b[2][272],"generic":b[2][273],"gregory":b[2][274],"hebrew":b[2][275],"indian":b[2][276],"islamic":b[2][277],"islamicc":b[2][277],"japanese":b[2][278],"persian":b[2][279],"roc":b[2][280]},{"buddhist":b[2][282],"chinese":b[2][283],"coptic":b[2][284],"dangi":b[2][283],"ethiopic":b[2][285],"ethioaa":b[2][286],"generic":b[2][287],"gregory":b[2][288],"hebrew":b[2][289],"indian":b[2][290],"islamic":b[2][291],"islamicc":b[2][291],"japanese":b[2][292],"persian":b[2][293],"roc":b[2][294]},{"buddhist":b[2][296],"chinese":b[2][297],"coptic":b[2][298],"dangi":b[2][297],"ethiopic":b[2][299],"ethioaa":b[2][300],"generic":b[2][301],"gregory":b[2][302],"hebrew":b[2][303],"indian":b[2][304],"islamic":b[2][305],"islamicc":b[2][305],"japanese":b[2][306],"persian":b[2][307],"roc":b[2][308]},{"buddhist":b[2][311],"chinese":b[2][312],"coptic":b[2][313],"dangi":b[2][312],"ethiopic":b[2][314],"ethioaa":b[2][315],"generic":b[2][316],"gregory":b[2][317],"hebrew":b[2][318],"indian":b[2][319],"islamic":b[2][320],"islamicc":b[2][320],"japanese":b[2][321],"persian":b[2][322],"roc":b[2][323]},{"buddhist":b[2][325],"chinese":b[2][326],"coptic":b[2][327],"dangi":b[2][326],"ethiopic":b[2][328],"ethioaa":b[2][329],"generic":b[2][330],"gregory":b[2][331],"hebrew":b[2][332],"indian":b[2][333],"islamic":b[2][334],"islamicc":b[2][334],"japanese":b[2][335],"persian":b[2][336],"roc":b[2][337]},{"buddhist":b[2][339],"chinese":b[2][340],"coptic":b[2][341],"dangi":b[2][340],"ethiopic":b[2][342],"ethioaa":b[2][343],"generic":b[2][344],"gregory":b[2][345],"hebrew":b[2][346],"indian":b[2][347],"islamic":b[2][348],"islamicc":b[2][348],"japanese":b[2][349],"persian":b[2][350],"roc":b[2][351]},{"buddhist":b[2][353],"chinese":b[2][354],"coptic":b[2][355],"dangi":b[2][354],"ethiopic":b[2][356],"ethioaa":b[2][357],"generic":b[2][358],"gregory":b[2][359],"hebrew":b[2][360],"indian":b[2][361],"islamic":b[2][362],"islamicc":b[2][362],"japanese":b[2][363],"persian":b[2][364],"roc":b[2][365]},{"buddhist":b[2][367],"chinese":b[2][368],"coptic":b[2][369],"dangi":b[2][368],"ethiopic":b[2][370],"ethioaa":b[2][371],"generic":b[2][372],"gregory":b[2][373],"hebrew":b[2][374],"indian":b[2][375],"islamic":b[2][376],"islamicc":b[2][376],"japanese":b[2][377],"persian":b[2][378],"roc":b[2][379]},{"buddhist":b[2][382],"chinese":b[2][383],"coptic":b[2][384],"dangi":b[2][383],"ethiopic":b[2][385],"ethioaa":b[2][386],"generic":b[2][387],"gregory":b[2][388],"hebrew":b[2][389],"indian":b[2][390],"islamic":b[2][391],"islamicc":b[2][391],"japanese":b[2][392],"persian":b[2][393],"roc":b[2][394]},{"buddhist":b[2][396],"chinese":b[2][397],"coptic":b[2][398],"dangi":b[2][397],"ethiopic":b[2][399],"ethioaa":b[2][400],"generic":b[2][401],"gregory":b[2][402],"hebrew":b[2][403],"indian":b[2][404],"islamic":b[2][405],"islamicc":b[2][405],"japanese":b[2][406],"persian":b[2][407],"roc":b[2][408]},{"buddhist":b[2][410],"chinese":b[2][411],"coptic":b[2][412],"dangi":b[2][411],"ethiopic":b[2][413],"ethioaa":b[2][414],"generic":b[2][415],"gregory":b[2][416],"hebrew":b[2][417],"indian":b[2][418],"islamic":b[2][419],"islamicc":b[2][419],"japanese":b[2][420],"persian":b[2][421],"roc":b[2][422]},{"buddhist":b[2][425],"chinese":b[2][426],"coptic":b[2][427],"dangi":b[2][426],"ethiopic":b[2][428],"ethioaa":b[2][429],"generic":b[2][430],"gregory":b[2][431],"hebrew":b[2][432],"indian":b[2][433],"islamic":b[2][434],"islamicc":b[2][434],"japanese":b[2][435],"persian":b[2][436],"roc":b[2][437]},{"buddhist":b[2][440],"chinese":b[2][441],"coptic":b[2][442],"dangi":b[2][441],"ethiopic":b[2][443],"ethioaa":b[2][444],"generic":b[2][445],"gregory":b[2][446],"hebrew":b[2][447],"indian":b[2][448],"islamic":b[2][449],"islamicc":b[2][449],"japanese":b[2][450],"persian":b[2][451],"roc":b[2][452]},{"buddhist":b[2][454],"chinese":b[2][455],"coptic":b[2][456],"dangi":b[2][455],"ethiopic":b[2][457],"ethioaa":b[2][458],"generic":b[2][459],"gregory":b[2][460],"hebrew":b[2][461],"indian":b[2][462],"islamic":b[2][463],"islamicc":b[2][463],"japanese":b[2][464],"persian":b[2][465],"roc":b[2][466]},{"buddhist":b[2][468],"chinese":b[2][469],"coptic":b[2][470],"dangi":b[2][469],"ethiopic":b[2][471],"ethioaa":b[2][472],"generic":b[2][473],"gregory":b[2][474],"hebrew":b[2][475],"indian":b[2][476],"islamic":b[2][477],"islamicc":b[2][477],"japanese":b[2][478],"persian":b[2][479],"roc":b[2][480]},{"buddhist":b[2][482],"chinese":b[2][483],"coptic":b[2][484],"dangi":b[2][483],"ethiopic":b[2][485],"ethioaa":b[2][486],"generic":b[2][487],"gregory":b[2][488],"hebrew":b[2][489],"indian":b[2][490],"islamic":b[2][491],"islamicc":b[2][491],"japanese":b[2][492],"persian":b[2][493],"roc":b[2][494]},{"buddhist":b[2][496],"chinese":b[2][483],"coptic":b[2][484],"dangi":b[2][483],"ethiopic":b[2][485],"ethioaa":b[2][486],"generic":b[2][487],"gregory":b[2][497],"hebrew":b[2][489],"indian":b[2][490],"islamic":b[2][491],"islamicc":b[2][491],"japanese":b[2][498],"persian":b[2][493],"roc":b[2][499]},{"buddhist":b[2][504],"chinese":b[2][505],"coptic":b[2][506],"dangi":b[2][505],"ethiopic":b[2][507],"ethioaa":b[2][508],"generic":b[2][509],"gregory":b[2][510],"hebrew":b[2][511],"indian":b[2][512],"islamic":b[2][513],"islamicc":b[2][513],"japanese":b[2][514],"persian":b[2][515],"roc":b[2][516]},{"buddhist":b[2][518],"chinese":b[2][519],"coptic":b[2][520],"dangi":b[2][519],"ethiopic":b[2][521],"ethioaa":b[2][522],"generic":b[2][523],"gregory":b[2][524],"hebrew":b[2][525],"indian":b[2][526],"islamic":b[2][527],"islamicc":b[2][527],"japanese":b[2][528],"persian":b[2][529],"roc":b[2][530]},{"buddhist":b[2][532],"chinese":b[2][533],"coptic":b[2][534],"dangi":b[2][533],"ethiopic":b[2][535],"ethioaa":b[2][536],"generic":b[2][537],"gregory":b[2][538],"hebrew":b[2][539],"indian":b[2][540],"islamic":b[2][541],"islamicc":b[2][541],"japanese":b[2][542],"persian":b[2][543],"roc":b[2][544]},{"buddhist":b[2][545],"chinese":b[2][546],"coptic":b[2][547],"dangi":b[2][546],"ethiopic":b[2][548],"ethioaa":b[2][549],"generic":b[2][550],"gregory":b[2][551],"hebrew":b[2][552],"indian":b[2][553],"islamic":b[2][554],"islamicc":b[2][554],"japanese":b[2][555],"persian":b[2][556],"roc":b[2][557]},{"buddhist":b[2][559],"chinese":b[2][560],"coptic":b[2][561],"dangi":b[2][560],"ethiopic":b[2][562],"ethioaa":b[2][563],"generic":b[2][564],"gregory":b[2][565],"hebrew":b[2][566],"indian":b[2][567],"islamic":b[2][568],"islamicc":b[2][568],"japanese":b[2][569],"persian":b[2][570],"roc":b[2][571]},{"buddhist":b[2][573],"chinese":b[2][574],"coptic":b[2][575],"dangi":b[2][574],"ethiopic":b[2][576],"ethioaa":b[2][577],"generic":b[2][578],"gregory":b[2][579],"hebrew":b[2][580],"indian":b[2][581],"islamic":b[2][582],"islamicc":b[2][582],"japanese":b[2][583],"persian":b[2][584],"roc":b[2][585]},{"buddhist":b[2][586],"chinese":b[2][587],"coptic":b[2][588],"dangi":b[2][587],"ethiopic":b[2][589],"ethioaa":b[2][590],"generic":b[2][591],"gregory":b[2][592],"hebrew":b[2][593],"indian":b[2][594],"islamic":b[2][595],"islamicc":b[2][595],"japanese":b[2][596],"persian":b[2][597],"roc":b[2][598]},{"buddhist":b[2][600],"chinese":b[2][601],"coptic":b[2][602],"dangi":b[2][601],"ethiopic":b[2][603],"ethioaa":b[2][604],"generic":b[2][605],"gregory":b[2][606],"hebrew":b[2][607],"indian":b[2][608],"islamic":b[2][609],"islamicc":b[2][609],"japanese":b[2][610],"persian":b[2][611],"roc":b[2][612]},{"buddhist":b[2][617],"chinese":b[2][618],"coptic":b[2][619],"dangi":b[2][618],"ethiopic":b[2][620],"ethioaa":b[2][621],"generic":b[2][622],"gregory":b[2][623],"hebrew":b[2][624],"indian":b[2][625],"islamic":b[2][626],"islamicc":b[2][626],"japanese":b[2][627],"persian":b[2][628],"roc":b[2][629]},{"buddhist":b[2][646],"chinese":b[2][647],"coptic":b[2][648],"dangi":b[2][647],"ethiopic":b[2][649],"ethioaa":b[2][650],"generic":b[2][651],"gregory":b[2][652],"hebrew":b[2][653],"indian":b[2][654],"islamic":b[2][655],"islamicc":b[2][655],"japanese":b[2][656],"persian":b[2][657],"roc":b[2][658]},{"buddhist":b[2][662],"chinese":b[2][663],"coptic":b[2][664],"dangi":b[2][663],"ethiopic":b[2][665],"ethioaa":b[2][666],"generic":b[2][667],"gregory":b[2][668],"hebrew":b[2][669],"indian":b[2][670],"islamic":b[2][671],"islamicc":b[2][671],"japanese":b[2][672],"persian":b[2][673],"roc":b[2][674]},{"buddhist":b[2][708],"chinese":b[2][709],"coptic":b[2][710],"dangi":b[2][709],"ethiopic":b[2][711],"ethioaa":b[2][712],"generic":b[2][713],"gregory":b[2][714],"hebrew":b[2][715],"indian":b[2][716],"islamic":b[2][717],"islamicc":b[2][717],"japanese":b[2][718],"persian":b[2][719],"roc":b[2][720]},{"buddhist":b[2][722],"chinese":b[2][723],"coptic":b[2][724],"dangi":b[2][723],"ethiopic":b[2][725],"ethioaa":b[2][726],"generic":b[2][727],"gregory":b[2][728],"hebrew":b[2][729],"indian":b[2][730],"islamic":b[2][731],"islamicc":b[2][731],"japanese":b[2][732],"persian":b[2][733],"roc":b[2][734]},{"buddhist":b[2][736],"chinese":b[2][737],"coptic":b[2][738],"dangi":b[2][737],"ethiopic":b[2][739],"ethioaa":b[2][740],"generic":b[2][741],"gregory":b[2][742],"hebrew":b[2][743],"indian":b[2][744],"islamic":b[2][745],"islamicc":b[2][745],"japanese":b[2][746],"persian":b[2][747],"roc":b[2][748]},{"buddhist":b[2][736],"chinese":b[2][737],"coptic":b[2][738],"dangi":b[2][737],"ethiopic":b[2][739],"ethioaa":b[2][740],"generic":b[2][741],"gregory":b[2][756],"hebrew":b[2][743],"indian":b[2][744],"islamic":b[2][745],"islamicc":b[2][745],"japanese":b[2][746],"persian":b[2][747],"roc":b[2][748]},{"buddhist":b[2][762],"chinese":b[2][763],"coptic":b[2][764],"dangi":b[2][763],"ethiopic":b[2][765],"ethioaa":b[2][766],"generic":b[2][767],"gregory":b[2][768],"hebrew":b[2][769],"indian":b[2][770],"islamic":b[2][771],"islamicc":b[2][771],"japanese":b[2][772],"persian":b[2][773],"roc":b[2][774]},{"buddhist":b[2][777],"chinese":b[2][737],"coptic":b[2][738],"dangi":b[2][737],"ethiopic":b[2][739],"ethioaa":b[2][740],"generic":b[2][741],"gregory":b[2][778],"hebrew":b[2][743],"indian":b[2][744],"islamic":b[2][745],"islamicc":b[2][745],"japanese":b[2][779],"persian":b[2][747],"roc":b[2][780]},{"buddhist":b[2][782],"chinese":b[2][737],"coptic":b[2][738],"dangi":b[2][737],"ethiopic":b[2][739],"ethioaa":b[2][740],"generic":b[2][741],"gregory":b[2][783],"hebrew":b[2][743],"indian":b[2][744],"islamic":b[2][745],"islamicc":b[2][745],"japanese":b[2][784],"persian":b[2][747],"roc":b[2][785]},{"buddhist":b[2][789],"chinese":b[2][737],"coptic":b[2][738],"dangi":b[2][737],"ethiopic":b[2][739],"ethioaa":b[2][740],"generic":b[2][741],"gregory":b[2][790],"hebrew":b[2][743],"indian":b[2][744],"islamic":b[2][745],"islamicc":b[2][745],"japanese":b[2][791],"persian":b[2][747],"roc":b[2][792]},{"buddhist":b[2][794],"chinese":b[2][795],"coptic":b[2][796],"dangi":b[2][795],"ethiopic":b[2][797],"ethioaa":b[2][798],"generic":b[2][799],"gregory":b[2][800],"hebrew":b[2][801],"indian":b[2][802],"islamic":b[2][803],"islamicc":b[2][803],"japanese":b[2][804],"persian":b[2][805],"roc":b[2][806]},{"buddhist":b[2][809],"chinese":b[2][810],"coptic":b[2][811],"dangi":b[2][810],"ethiopic":b[2][812],"ethioaa":b[2][813],"generic":b[2][814],"gregory":b[2][815],"hebrew":b[2][816],"indian":b[2][817],"islamic":b[2][818],"islamicc":b[2][818],"japanese":b[2][819],"persian":b[2][820],"roc":b[2][821]},{"buddhist":b[2][823],"chinese":b[2][824],"coptic":b[2][825],"dangi":b[2][824],"ethiopic":b[2][826],"ethioaa":b[2][827],"generic":b[2][828],"gregory":b[2][829],"hebrew":b[2][830],"indian":b[2][831],"islamic":b[2][832],"islamicc":b[2][832],"japanese":b[2][833],"persian":b[2][834],"roc":b[2][835]},{"buddhist":b[2][837],"chinese":b[2][838],"coptic":b[2][839],"dangi":b[2][838],"ethiopic":b[2][840],"ethioaa":b[2][841],"generic":b[2][842],"gregory":b[2][843],"hebrew":b[2][844],"indian":b[2][845],"islamic":b[2][846],"islamicc":b[2][846],"japanese":b[2][847],"persian":b[2][848],"roc":b[2][849]},{"buddhist":b[2][851],"chinese":b[2][852],"coptic":b[2][853],"dangi":b[2][852],"ethiopic":b[2][854],"ethioaa":b[2][855],"generic":b[2][856],"gregory":b[2][857],"hebrew":b[2][858],"indian":b[2][859],"islamic":b[2][860],"islamicc":b[2][860],"japanese":b[2][861],"persian":b[2][862],"roc":b[2][863]},{"buddhist":b[2][864],"chinese":b[2][865],"coptic":b[2][866],"dangi":b[2][865],"ethiopic":b[2][867],"ethioaa":b[2][868],"generic":b[2][869],"gregory":b[2][870],"hebrew":b[2][871],"indian":b[2][872],"islamic":b[2][873],"islamicc":b[2][873],"japanese":b[2][874],"persian":b[2][875],"roc":b[2][876]},{"buddhist":b[2][878],"chinese":b[2][865],"coptic":b[2][866],"dangi":b[2][865],"ethiopic":b[2][867],"ethioaa":b[2][868],"generic":b[2][869],"gregory":b[2][879],"hebrew":b[2][871],"indian":b[2][872],"islamic":b[2][873],"islamicc":b[2][873],"japanese":b[2][880],"persian":b[2][881],"roc":b[2][882]},{"buddhist":b[2][883],"chinese":b[2][884],"coptic":b[2][885],"dangi":b[2][884],"ethiopic":b[2][886],"ethioaa":b[2][887],"generic":b[2][888],"gregory":b[2][889],"hebrew":b[2][890],"indian":b[2][891],"islamic":b[2][892],"islamicc":b[2][892],"japanese":b[2][893],"persian":b[2][894],"roc":b[2][895]},{"buddhist":b[2][898],"chinese":b[2][899],"coptic":b[2][900],"dangi":b[2][899],"ethiopic":b[2][901],"ethioaa":b[2][902],"generic":b[2][903],"gregory":b[2][904],"hebrew":b[2][905],"indian":b[2][906],"islamic":b[2][907],"islamicc":b[2][907],"japanese":b[2][908],"persian":b[2][909],"roc":b[2][910]},{"buddhist":b[2][912],"chinese":b[2][913],"coptic":b[2][914],"dangi":b[2][913],"ethiopic":b[2][915],"ethioaa":b[2][916],"generic":b[2][917],"gregory":b[2][918],"hebrew":b[2][919],"indian":b[2][920],"islamic":b[2][921],"islamicc":b[2][921],"japanese":b[2][922],"persian":b[2][923],"roc":b[2][924]},{"buddhist":b[2][926],"chinese":b[2][927],"coptic":b[2][928],"dangi":b[2][927],"ethiopic":b[2][929],"ethioaa":b[2][930],"generic":b[2][931],"gregory":b[2][932],"hebrew":b[2][933],"indian":b[2][934],"islamic":b[2][935],"islamicc":b[2][935],"japanese":b[2][936],"persian":b[2][937],"roc":b[2][938]},{"buddhist":b[2][941],"chinese":b[2][942],"coptic":b[2][943],"dangi":b[2][942],"ethiopic":b[2][944],"ethioaa":b[2][945],"generic":b[2][946],"gregory":b[2][947],"hebrew":b[2][948],"indian":b[2][949],"islamic":b[2][950],"islamicc":b[2][950],"japanese":b[2][951],"persian":b[2][952],"roc":b[2][953]},{"buddhist":b[2][966],"chinese":b[2][967],"coptic":b[2][968],"dangi":b[2][967],"ethiopic":b[2][969],"ethioaa":b[2][970],"generic":b[2][971],"gregory":b[2][972],"hebrew":b[2][973],"indian":b[2][974],"islamic":b[2][975],"islamicc":b[2][975],"japanese":b[2][976],"persian":b[2][977],"roc":b[2][978]},{"buddhist":b[2][987],"chinese":b[2][988],"coptic":b[2][989],"dangi":b[2][988],"ethiopic":b[2][990],"ethioaa":b[2][991],"generic":b[2][992],"gregory":b[2][993],"hebrew":b[2][994],"indian":b[2][995],"islamic":b[2][996],"islamicc":b[2][996],"japanese":b[2][997],"persian":b[2][998],"roc":b[2][999]},{"buddhist":b[2][1001],"chinese":b[2][1002],"coptic":b[2][1003],"dangi":b[2][1002],"ethiopic":b[2][1004],"ethioaa":b[2][1005],"generic":b[2][1006],"gregory":b[2][1007],"hebrew":b[2][1008],"indian":b[2][1009],"islamic":b[2][1010],"islamicc":b[2][1010],"japanese":b[2][1011],"persian":b[2][1012],"roc":b[2][1013]},{"buddhist":b[2][1015],"chinese":b[2][1016],"coptic":b[2][1017],"dangi":b[2][1016],"ethiopic":b[2][1018],"ethioaa":b[2][1019],"generic":b[2][1020],"gregory":b[2][1021],"hebrew":b[2][1022],"indian":b[2][1023],"islamic":b[2][1024],"islamicc":b[2][1024],"japanese":b[2][1025],"persian":b[2][1026],"roc":b[2][1027]},{"buddhist":b[2][1029],"chinese":b[2][1030],"coptic":b[2][1031],"dangi":b[2][1030],"ethiopic":b[2][1032],"ethioaa":b[2][1033],"generic":b[2][1034],"gregory":b[2][1035],"hebrew":b[2][1036],"indian":b[2][1037],"islamic":b[2][1038],"islamicc":b[2][1038],"japanese":b[2][1039],"persian":b[2][1040],"roc":b[2][1041]},{"buddhist":b[2][1043],"chinese":b[2][1044],"coptic":b[2][1045],"dangi":b[2][1044],"ethiopic":b[2][1046],"ethioaa":b[2][1047],"generic":b[2][1048],"gregory":b[2][1049],"hebrew":b[2][1050],"indian":b[2][1051],"islamic":b[2][1052],"islamicc":b[2][1052],"japanese":b[2][1053],"persian":b[2][1054],"roc":b[2][1055]},{"buddhist":b[2][1057],"chinese":b[2][1058],"coptic":b[2][1059],"dangi":b[2][1058],"ethiopic":b[2][1060],"ethioaa":b[2][1061],"generic":b[2][1062],"gregory":b[2][1063],"hebrew":b[2][1064],"indian":b[2][1065],"islamic":b[2][1066],"islamicc":b[2][1066],"japanese":b[2][1067],"persian":b[2][1068],"roc":b[2][1069]},{"buddhist":b[2][1071],"chinese":b[2][1072],"coptic":b[2][1073],"dangi":b[2][1072],"ethiopic":b[2][1074],"ethioaa":b[2][1075],"generic":b[2][1076],"gregory":b[2][1077],"hebrew":b[2][1078],"indian":b[2][1079],"islamic":b[2][1080],"islamicc":b[2][1080],"japanese":b[2][1081],"persian":b[2][1082],"roc":b[2][1083]},{"buddhist":b[2][1085],"chinese":b[2][1086],"coptic":b[2][1087],"dangi":b[2][1086],"ethiopic":b[2][1088],"ethioaa":b[2][1089],"generic":b[2][1090],"gregory":b[2][1091],"hebrew":b[2][1092],"indian":b[2][1093],"islamic":b[2][1094],"islamicc":b[2][1094],"japanese":b[2][1095],"persian":b[2][1096],"roc":b[2][1097]},{"buddhist":b[2][1098],"chinese":b[2][1099],"coptic":b[2][1100],"dangi":b[2][1099],"ethiopic":b[2][1101],"ethioaa":b[2][1102],"generic":b[2][1103],"gregory":b[2][1104],"hebrew":b[2][1105],"indian":b[2][1106],"islamic":b[2][1107],"islamicc":b[2][1107],"japanese":b[2][1108],"persian":b[2][1109],"roc":b[2][1110]},{"buddhist":b[2][1111],"chinese":b[2][1112],"coptic":b[2][1113],"dangi":b[2][1112],"ethiopic":b[2][1114],"ethioaa":b[2][1115],"generic":b[2][1116],"gregory":b[2][1117],"hebrew":b[2][1118],"indian":b[2][1119],"islamic":b[2][1120],"islamicc":b[2][1120],"japanese":b[2][1121],"persian":b[2][1122],"roc":b[2][1123]},{"buddhist":b[2][1127],"chinese":b[2][1128],"coptic":b[2][1129],"dangi":b[2][1128],"ethiopic":b[2][1130],"ethioaa":b[2][1131],"generic":b[2][1132],"gregory":b[2][1133],"hebrew":b[2][1134],"indian":b[2][1135],"islamic":b[2][1136],"islamicc":b[2][1136],"japanese":b[2][1137],"persian":b[2][1138],"roc":b[2][1139]},{"buddhist":b[2][1140],"chinese":b[2][1141],"coptic":b[2][1142],"dangi":b[2][1141],"ethiopic":b[2][1143],"ethioaa":b[2][1144],"generic":b[2][1145],"gregory":b[2][1146],"hebrew":b[2][1147],"indian":b[2][1148],"islamic":b[2][1149],"islamicc":b[2][1149],"japanese":b[2][1150],"persian":b[2][1151],"roc":b[2][1152]},{"buddhist":b[2][1154],"chinese":b[2][1155],"coptic":b[2][1156],"dangi":b[2][1155],"ethiopic":b[2][1157],"ethioaa":b[2][1158],"generic":b[2][1159],"gregory":b[2][1160],"hebrew":b[2][1161],"indian":b[2][1162],"islamic":b[2][1163],"islamicc":b[2][1163],"japanese":b[2][1164],"persian":b[2][1165],"roc":b[2][1166]},{"buddhist":b[2][1168],"chinese":b[2][1169],"coptic":b[2][1170],"dangi":b[2][1169],"ethiopic":b[2][1171],"ethioaa":b[2][1172],"generic":b[2][1173],"gregory":b[2][1174],"hebrew":b[2][1175],"indian":b[2][1176],"islamic":b[2][1177],"islamicc":b[2][1177],"japanese":b[2][1178],"persian":b[2][1179],"roc":b[2][1180]},{"buddhist":b[2][1183],"chinese":b[2][1184],"coptic":b[2][1185],"dangi":b[2][1184],"ethiopic":b[2][1186],"ethioaa":b[2][1187],"generic":b[2][1188],"gregory":b[2][1189],"hebrew":b[2][1190],"indian":b[2][1191],"islamic":b[2][1192],"islamicc":b[2][1192],"japanese":b[2][1193],"persian":b[2][1194],"roc":b[2][1195]},{"buddhist":b[2][1196],"chinese":b[2][1197],"coptic":b[2][1198],"dangi":b[2][1197],"ethiopic":b[2][1199],"ethioaa":b[2][1200],"generic":b[2][1201],"gregory":b[2][1202],"hebrew":b[2][1203],"indian":b[2][1204],"islamic":b[2][1205],"islamicc":b[2][1205],"japanese":b[2][1206],"persian":b[2][1207],"roc":b[2][1208]},{"buddhist":b[2][1210],"chinese":b[2][1211],"coptic":b[2][1212],"dangi":b[2][1211],"ethiopic":b[2][1213],"ethioaa":b[2][1214],"generic":b[2][1215],"gregory":b[2][1216],"hebrew":b[2][1217],"indian":b[2][1218],"islamic":b[2][1219],"islamicc":b[2][1219],"japanese":b[2][1220],"persian":b[2][1221],"roc":b[2][1222]},{"buddhist":b[2][1224],"chinese":b[2][1225],"coptic":b[2][1226],"dangi":b[2][1225],"ethiopic":b[2][1227],"ethioaa":b[2][1228],"generic":b[2][1229],"gregory":b[2][1230],"hebrew":b[2][1231],"indian":b[2][1232],"islamic":b[2][1233],"islamicc":b[2][1233],"japanese":b[2][1234],"persian":b[2][1235],"roc":b[2][1236]},{"buddhist":b[2][1238],"chinese":b[2][1239],"coptic":b[2][1240],"dangi":b[2][1239],"ethiopic":b[2][1241],"ethioaa":b[2][1242],"generic":b[2][1243],"gregory":b[2][1244],"hebrew":b[2][1245],"indian":b[2][1246],"islamic":b[2][1247],"islamicc":b[2][1247],"japanese":b[2][1248],"persian":b[2][1249],"roc":b[2][1250]},{"buddhist":b[2][1251],"chinese":b[2][1252],"coptic":b[2][1253],"dangi":b[2][1252],"ethiopic":b[2][1254],"ethioaa":b[2][1255],"generic":b[2][1256],"gregory":b[2][1257],"hebrew":b[2][1258],"indian":b[2][1259],"islamic":b[2][1260],"islamicc":b[2][1260],"japanese":b[2][1261],"persian":b[2][1262],"roc":b[2][1263]},{"buddhist":b[2][1265],"chinese":b[2][1266],"coptic":b[2][1267],"dangi":b[2][1266],"ethiopic":b[2][1268],"ethioaa":b[2][1269],"generic":b[2][1270],"gregory":b[2][1271],"hebrew":b[2][1272],"indian":b[2][1273],"islamic":b[2][1274],"islamicc":b[2][1274],"japanese":b[2][1275],"persian":b[2][1276],"roc":b[2][1277]},{"buddhist":b[2][1279],"chinese":b[2][1280],"coptic":b[2][1281],"dangi":b[2][1280],"ethiopic":b[2][1282],"ethioaa":b[2][1283],"generic":b[2][1284],"gregory":b[2][1285],"hebrew":b[2][1286],"indian":b[2][1287],"islamic":b[2][1288],"islamicc":b[2][1288],"japanese":b[2][1289],"persian":b[2][1290],"roc":b[2][1291]},{"buddhist":b[2][1294],"chinese":b[2][1295],"coptic":b[2][1296],"dangi":b[2][1295],"ethiopic":b[2][1297],"ethioaa":b[2][1298],"generic":b[2][1299],"gregory":b[2][1300],"hebrew":b[2][1301],"indian":b[2][1302],"islamic":b[2][1303],"islamicc":b[2][1303],"japanese":b[2][1304],"persian":b[2][1305],"roc":b[2][1306]},{"buddhist":b[2][1308],"chinese":b[2][1309],"coptic":b[2][1310],"dangi":b[2][1309],"ethiopic":b[2][1311],"ethioaa":b[2][1312],"generic":b[2][1313],"gregory":b[2][1314],"hebrew":b[2][1315],"indian":b[2][1316],"islamic":b[2][1317],"islamicc":b[2][1317],"japanese":b[2][1318],"persian":b[2][1319],"roc":b[2][1320]},{"buddhist":b[2][1321],"chinese":b[2][1322],"coptic":b[2][1323],"dangi":b[2][1322],"ethiopic":b[2][1324],"ethioaa":b[2][1325],"generic":b[2][1326],"gregory":b[2][1327],"hebrew":b[2][1328],"indian":b[2][1329],"islamic":b[2][1330],"islamicc":b[2][1330],"japanese":b[2][1331],"persian":b[2][1332],"roc":b[2][1333]},{"buddhist":b[2][1334],"chinese":b[2][1335],"coptic":b[2][1336],"dangi":b[2][1335],"ethiopic":b[2][1337],"ethioaa":b[2][1338],"generic":b[2][1339],"gregory":b[2][1340],"hebrew":b[2][1341],"indian":b[2][1342],"islamic":b[2][1343],"islamicc":b[2][1343],"japanese":b[2][1344],"persian":b[2][1345],"roc":b[2][1346]},{"buddhist":b[2][1348],"chinese":b[2][1349],"coptic":b[2][1350],"dangi":b[2][1349],"ethiopic":b[2][1351],"ethioaa":b[2][1352],"generic":b[2][1353],"gregory":b[2][1354],"hebrew":b[2][1355],"indian":b[2][1356],"islamic":b[2][1357],"islamicc":b[2][1357],"japanese":b[2][1358],"persian":b[2][1359],"roc":b[2][1360]},{"buddhist":b[2][1362],"chinese":b[2][1363],"coptic":b[2][1364],"dangi":b[2][1363],"ethiopic":b[2][1365],"ethioaa":b[2][1366],"generic":b[2][1367],"gregory":b[2][1368],"hebrew":b[2][1369],"indian":b[2][1370],"islamic":b[2][1371],"islamicc":b[2][1371],"japanese":b[2][1372],"persian":b[2][1373],"roc":b[2][1374]},{"buddhist":b[2][1375],"chinese":b[2][1376],"coptic":b[2][1377],"dangi":b[2][1376],"ethiopic":b[2][1378],"ethioaa":b[2][1379],"generic":b[2][1380],"gregory":b[2][1381],"hebrew":b[2][1382],"indian":b[2][1383],"islamic":b[2][1384],"islamicc":b[2][1384],"japanese":b[2][1385],"persian":b[2][1386],"roc":b[2][1387]},{"buddhist":b[2][1388],"chinese":b[2][1389],"coptic":b[2][1390],"dangi":b[2][1389],"ethiopic":b[2][1391],"ethioaa":b[2][1392],"generic":b[2][1393],"gregory":b[2][1394],"hebrew":b[2][1395],"indian":b[2][1396],"islamic":b[2][1397],"islamicc":b[2][1397],"japanese":b[2][1398],"persian":b[2][1399],"roc":b[2][1400]},{"buddhist":b[2][1402],"chinese":b[2][1403],"coptic":b[2][1404],"dangi":b[2][1403],"ethiopic":b[2][1405],"ethioaa":b[2][1406],"generic":b[2][1407],"gregory":b[2][1408],"hebrew":b[2][1409],"indian":b[2][1410],"islamic":b[2][1411],"islamicc":b[2][1411],"japanese":b[2][1412],"persian":b[2][1413],"roc":b[2][1414]},{"buddhist":b[2][1415],"chinese":b[2][1416],"coptic":b[2][1417],"dangi":b[2][1416],"ethiopic":b[2][1418],"ethioaa":b[2][1419],"generic":b[2][1420],"gregory":b[2][1421],"hebrew":b[2][1422],"indian":b[2][1423],"islamic":b[2][1424],"islamicc":b[2][1424],"japanese":b[2][1425],"persian":b[2][1426],"roc":b[2][1427]},{"buddhist":b[2][1428],"chinese":b[2][1429],"coptic":b[2][1430],"dangi":b[2][1429],"ethiopic":b[2][1431],"ethioaa":b[2][1432],"generic":b[2][1433],"gregory":b[2][1434],"hebrew":b[2][1435],"indian":b[2][1436],"islamic":b[2][1437],"islamicc":b[2][1437],"japanese":b[2][1438],"persian":b[2][1439],"roc":b[2][1440]},{"buddhist":b[2][1442],"chinese":b[2][1443],"coptic":b[2][1444],"dangi":b[2][1443],"ethiopic":b[2][1445],"ethioaa":b[2][1446],"generic":b[2][1447],"gregory":b[2][1448],"hebrew":b[2][1449],"indian":b[2][1450],"islamic":b[2][1451],"islamicc":b[2][1451],"japanese":b[2][1452],"persian":b[2][1453],"roc":b[2][1454]},{"buddhist":b[2][1455],"chinese":b[2][1456],"coptic":b[2][1457],"dangi":b[2][1456],"ethiopic":b[2][1458],"ethioaa":b[2][1459],"generic":b[2][1460],"gregory":b[2][1461],"hebrew":b[2][1462],"indian":b[2][1463],"islamic":b[2][1464],"islamicc":b[2][1464],"japanese":b[2][1465],"persian":b[2][1466],"roc":b[2][1467]},{"buddhist":b[2][1469],"chinese":b[2][1470],"coptic":b[2][1471],"dangi":b[2][1470],"ethiopic":b[2][1472],"ethioaa":b[2][1473],"generic":b[2][1474],"gregory":b[2][1475],"hebrew":b[2][1476],"indian":b[2][1477],"islamic":b[2][1478],"islamicc":b[2][1478],"japanese":b[2][1479],"persian":b[2][1480],"roc":b[2][1481]},{"buddhist":b[2][1482],"chinese":b[2][1483],"coptic":b[2][1484],"dangi":b[2][1483],"ethiopic":b[2][1485],"ethioaa":b[2][1486],"generic":b[2][1487],"gregory":b[2][1488],"hebrew":b[2][1489],"indian":b[2][1490],"islamic":b[2][1491],"islamicc":b[2][1491],"japanese":b[2][1492],"persian":b[2][1493],"roc":b[2][1494]},{"buddhist":b[2][1496],"chinese":b[2][1497],"coptic":b[2][1498],"dangi":b[2][1497],"ethiopic":b[2][1499],"ethioaa":b[2][1500],"generic":b[2][1501],"gregory":b[2][1502],"hebrew":b[2][1503],"indian":b[2][1504],"islamic":b[2][1505],"islamicc":b[2][1505],"japanese":b[2][1506],"persian":b[2][1507],"roc":b[2][1508]},{"buddhist":b[2][1510],"chinese":b[2][1511],"coptic":b[2][1512],"dangi":b[2][1511],"ethiopic":b[2][1513],"ethioaa":b[2][1514],"generic":b[2][1515],"gregory":b[2][1516],"hebrew":b[2][1517],"indian":b[2][1518],"islamic":b[2][1519],"islamicc":b[2][1519],"japanese":b[2][1520],"persian":b[2][1521],"roc":b[2][1522]},{"buddhist":b[2][1524],"chinese":b[2][1525],"coptic":b[2][1526],"dangi":b[2][1525],"ethiopic":b[2][1527],"ethioaa":b[2][1528],"generic":b[2][1529],"gregory":b[2][1530],"hebrew":b[2][1531],"indian":b[2][1532],"islamic":b[2][1533],"islamicc":b[2][1533],"japanese":b[2][1534],"persian":b[2][1535],"roc":b[2][1536]},{"buddhist":b[2][1537],"chinese":b[2][1538],"coptic":b[2][1539],"dangi":b[2][1538],"ethiopic":b[2][1540],"ethioaa":b[2][1541],"generic":b[2][1542],"gregory":b[2][1543],"hebrew":b[2][1544],"indian":b[2][1545],"islamic":b[2][1546],"islamicc":b[2][1546],"japanese":b[2][1547],"persian":b[2][1548],"roc":b[2][1549]},{"buddhist":b[2][1551],"chinese":b[2][1552],"coptic":b[2][1553],"dangi":b[2][1552],"ethiopic":b[2][1554],"ethioaa":b[2][1555],"generic":b[2][1556],"gregory":b[2][1557],"hebrew":b[2][1558],"indian":b[2][1559],"islamic":b[2][1560],"islamicc":b[2][1560],"japanese":b[2][1561],"persian":b[2][1562],"roc":b[2][1563]},{"buddhist":b[2][1564],"chinese":b[2][1565],"coptic":b[2][1566],"dangi":b[2][1565],"ethiopic":b[2][1567],"ethioaa":b[2][1568],"generic":b[2][1569],"gregory":b[2][1570],"hebrew":b[2][1571],"indian":b[2][1572],"islamic":b[2][1573],"islamicc":b[2][1573],"japanese":b[2][1574],"persian":b[2][1575],"roc":b[2][1576]},{"buddhist":b[2][1577],"chinese":b[2][1578],"coptic":b[2][1579],"dangi":b[2][1578],"ethiopic":b[2][1580],"ethioaa":b[2][1581],"generic":b[2][1582],"gregory":b[2][1583],"hebrew":b[2][1584],"indian":b[2][1585],"islamic":b[2][1586],"islamicc":b[2][1586],"japanese":b[2][1587],"persian":b[2][1588],"roc":b[2][1589]},{"buddhist":b[2][1591],"chinese":b[2][1592],"coptic":b[2][1593],"dangi":b[2][1592],"ethiopic":b[2][1594],"ethioaa":b[2][1595],"generic":b[2][1596],"gregory":b[2][1597],"hebrew":b[2][1598],"indian":b[2][1599],"islamic":b[2][1600],"islamicc":b[2][1600],"japanese":b[2][1601],"persian":b[2][1602],"roc":b[2][1603]},{"buddhist":b[2][1604],"chinese":b[2][1605],"coptic":b[2][1606],"dangi":b[2][1605],"ethiopic":b[2][1607],"ethioaa":b[2][1608],"generic":b[2][1609],"gregory":b[2][1610],"hebrew":b[2][1611],"indian":b[2][1612],"islamic":b[2][1613],"islamicc":b[2][1613],"japanese":b[2][1614],"persian":b[2][1615],"roc":b[2][1616]},{"buddhist":b[2][1618],"chinese":b[2][1619],"coptic":b[2][1620],"dangi":b[2][1619],"ethiopic":b[2][1621],"ethioaa":b[2][1622],"generic":b[2][1623],"gregory":b[2][1624],"hebrew":b[2][1625],"indian":b[2][1626],"islamic":b[2][1627],"islamicc":b[2][1627],"japanese":b[2][1628],"persian":b[2][1629],"roc":b[2][1630]},{"buddhist":b[2][1632],"chinese":b[2][1633],"coptic":b[2][1634],"dangi":b[2][1633],"ethiopic":b[2][1635],"ethioaa":b[2][1636],"generic":b[2][1637],"gregory":b[2][1638],"hebrew":b[2][1639],"indian":b[2][1640],"islamic":b[2][1641],"islamicc":b[2][1641],"japanese":b[2][1642],"persian":b[2][1643],"roc":b[2][1644]},{"buddhist":b[2][1646],"chinese":b[2][1647],"coptic":b[2][1648],"dangi":b[2][1647],"ethiopic":b[2][1649],"ethioaa":b[2][1650],"generic":b[2][1651],"gregory":b[2][1652],"hebrew":b[2][1653],"indian":b[2][1654],"islamic":b[2][1655],"islamicc":b[2][1655],"japanese":b[2][1656],"persian":b[2][1657],"roc":b[2][1658]},{"buddhist":b[2][1660],"chinese":b[2][1661],"coptic":b[2][1662],"dangi":b[2][1661],"ethiopic":b[2][1663],"ethioaa":b[2][1664],"generic":b[2][1665],"gregory":b[2][1666],"hebrew":b[2][1667],"indian":b[2][1668],"islamic":b[2][1669],"islamicc":b[2][1669],"japanese":b[2][1670],"persian":b[2][1671],"roc":b[2][1672]},{"buddhist":b[2][1674],"chinese":b[2][1675],"coptic":b[2][1676],"dangi":b[2][1675],"ethiopic":b[2][1677],"ethioaa":b[2][1678],"generic":b[2][1679],"gregory":b[2][1680],"hebrew":b[2][1681],"indian":b[2][1682],"islamic":b[2][1683],"islamicc":b[2][1683],"japanese":b[2][1684],"persian":b[2][1685],"roc":b[2][1686]},{"buddhist":b[2][1689],"chinese":b[2][1690],"coptic":b[2][1691],"dangi":b[2][1690],"ethiopic":b[2][1692],"ethioaa":b[2][1693],"generic":b[2][1694],"gregory":b[2][1695],"hebrew":b[2][1696],"indian":b[2][1697],"islamic":b[2][1698],"islamicc":b[2][1698],"japanese":b[2][1699],"persian":b[2][1700],"roc":b[2][1701]},{"buddhist":b[2][1703],"chinese":b[2][171],"coptic":b[2][172],"dangi":b[2][171],"ethiopic":b[2][173],"ethioaa":b[2][174],"generic":b[2][175],"gregory":b[2][1704],"hebrew":b[2][177],"indian":b[2][178],"islamic":b[2][179],"islamicc":b[2][179],"japanese":b[2][1705],"persian":b[2][181],"roc":b[2][1706]},{"buddhist":b[2][1708],"chinese":b[2][1709],"coptic":b[2][1710],"dangi":b[2][1709],"ethiopic":b[2][1711],"ethioaa":b[2][1712],"generic":b[2][1713],"gregory":b[2][1714],"hebrew":b[2][1715],"indian":b[2][1716],"islamic":b[2][1717],"islamicc":b[2][1717],"japanese":b[2][1718],"persian":b[2][1719],"roc":b[2][1720]},{"buddhist":b[2][1722],"chinese":b[2][1723],"coptic":b[2][1724],"dangi":b[2][1723],"ethiopic":b[2][1725],"ethioaa":b[2][1726],"generic":b[2][1727],"gregory":b[2][1728],"hebrew":b[2][1729],"indian":b[2][1730],"islamic":b[2][1731],"islamicc":b[2][1731],"japanese":b[2][1732],"persian":b[2][1733],"roc":b[2][1734]},{"buddhist":b[2][1736],"chinese":b[2][1737],"coptic":b[2][1738],"dangi":b[2][1737],"ethiopic":b[2][1739],"ethioaa":b[2][1740],"generic":b[2][1741],"gregory":b[2][1742],"hebrew":b[2][1743],"indian":b[2][1744],"islamic":b[2][1745],"islamicc":b[2][1745],"japanese":b[2][1746],"persian":b[2][1747],"roc":b[2][1748]},{"buddhist":b[2][1750],"chinese":b[2][1751],"coptic":b[2][1752],"dangi":b[2][1751],"ethiopic":b[2][1753],"ethioaa":b[2][1754],"generic":b[2][1755],"gregory":b[2][1756],"hebrew":b[2][1757],"indian":b[2][1758],"islamic":b[2][1759],"islamicc":b[2][1759],"japanese":b[2][1760],"persian":b[2][1761],"roc":b[2][1762]},{"buddhist":b[2][1764],"chinese":b[2][1765],"coptic":b[2][1766],"dangi":b[2][1765],"ethiopic":b[2][1767],"ethioaa":b[2][1768],"generic":b[2][1769],"gregory":b[2][1770],"hebrew":b[2][1771],"indian":b[2][1772],"islamic":b[2][1773],"islamicc":b[2][1773],"japanese":b[2][1774],"persian":b[2][1775],"roc":b[2][1776]},{"buddhist":b[2][1778],"chinese":b[2][1779],"coptic":b[2][1780],"dangi":b[2][1779],"ethiopic":b[2][1781],"ethioaa":b[2][1782],"generic":b[2][1783],"gregory":b[2][1784],"hebrew":b[2][1785],"indian":b[2][1786],"islamic":b[2][1787],"islamicc":b[2][1787],"japanese":b[2][1788],"persian":b[2][1789],"roc":b[2][1790]},{"buddhist":b[2][1792],"chinese":b[2][1793],"coptic":b[2][1794],"dangi":b[2][1793],"ethiopic":b[2][1795],"ethioaa":b[2][1796],"generic":b[2][1797],"gregory":b[2][1798],"hebrew":b[2][1799],"indian":b[2][1800],"islamic":b[2][1801],"islamicc":b[2][1801],"japanese":b[2][1802],"persian":b[2][1803],"roc":b[2][1804]},{"buddhist":b[2][1805],"chinese":b[2][1806],"coptic":b[2][1807],"dangi":b[2][1806],"ethiopic":b[2][1808],"ethioaa":b[2][1809],"generic":b[2][1810],"gregory":b[2][1811],"hebrew":b[2][1812],"indian":b[2][1813],"islamic":b[2][1814],"islamicc":b[2][1814],"japanese":b[2][1815],"persian":b[2][1816],"roc":b[2][1817]},{"buddhist":b[2][1819],"chinese":b[2][1820],"coptic":b[2][1821],"dangi":b[2][1820],"ethiopic":b[2][1822],"ethioaa":b[2][1823],"generic":b[2][1824],"gregory":b[2][1825],"hebrew":b[2][1826],"indian":b[2][1827],"islamic":b[2][1828],"islamicc":b[2][1828],"japanese":b[2][1829],"persian":b[2][1830],"roc":b[2][1831]},{"buddhist":b[2][1832],"chinese":b[2][1833],"coptic":b[2][1834],"dangi":b[2][1833],"ethiopic":b[2][1835],"ethioaa":b[2][1836],"generic":b[2][1837],"gregory":b[2][1838],"hebrew":b[2][1839],"indian":b[2][1840],"islamic":b[2][1841],"islamicc":b[2][1841],"japanese":b[2][1842],"persian":b[2][1843],"roc":b[2][1844]},{"buddhist":b[2][1846],"chinese":b[2][1847],"coptic":b[2][1848],"dangi":b[2][1847],"ethiopic":b[2][1849],"ethioaa":b[2][1850],"generic":b[2][1851],"gregory":b[2][1852],"hebrew":b[2][1853],"indian":b[2][1854],"islamic":b[2][1855],"islamicc":b[2][1855],"japanese":b[2][1856],"persian":b[2][1857],"roc":b[2][1858]},{"buddhist":b[2][1859],"chinese":b[2][1860],"coptic":b[2][1861],"dangi":b[2][1860],"ethiopic":b[2][1862],"ethioaa":b[2][1863],"generic":b[2][1864],"gregory":b[2][1865],"hebrew":b[2][1866],"indian":b[2][1867],"islamic":b[2][1868],"islamicc":b[2][1868],"japanese":b[2][1869],"persian":b[2][1870],"roc":b[2][1871]},{"buddhist":b[2][1873],"chinese":b[2][1874],"coptic":b[2][1875],"dangi":b[2][1874],"ethiopic":b[2][1876],"ethioaa":b[2][1877],"generic":b[2][1878],"gregory":b[2][1879],"hebrew":b[2][1880],"indian":b[2][1881],"islamic":b[2][1882],"islamicc":b[2][1882],"japanese":b[2][1883],"persian":b[2][1884],"roc":b[2][1885]},{"buddhist":b[2][1887],"chinese":b[2][1888],"coptic":b[2][1889],"dangi":b[2][1888],"ethiopic":b[2][1890],"ethioaa":b[2][1891],"generic":b[2][1892],"gregory":b[2][1893],"hebrew":b[2][1894],"indian":b[2][1895],"islamic":b[2][1896],"islamicc":b[2][1896],"japanese":b[2][1897],"persian":b[2][1898],"roc":b[2][1899]},{"buddhist":b[2][1901],"chinese":b[2][1902],"coptic":b[2][1903],"dangi":b[2][1902],"ethiopic":b[2][1904],"ethioaa":b[2][1905],"generic":b[2][1906],"gregory":b[2][1907],"hebrew":b[2][1908],"indian":b[2][1909],"islamic":b[2][1910],"islamicc":b[2][1910],"japanese":b[2][1911],"persian":b[2][1912],"roc":b[2][1913]},{"buddhist":b[2][1915],"chinese":b[2][1916],"coptic":b[2][1917],"dangi":b[2][1916],"ethiopic":b[2][1918],"ethioaa":b[2][1919],"generic":b[2][1920],"gregory":b[2][1921],"hebrew":b[2][1922],"indian":b[2][1923],"islamic":b[2][1924],"islamicc":b[2][1924],"japanese":b[2][1925],"persian":b[2][1926],"roc":b[2][1927]},{"buddhist":b[2][1931],"chinese":b[2][1932],"coptic":b[2][1933],"dangi":b[2][1932],"ethiopic":b[2][1934],"ethioaa":b[2][1935],"generic":b[2][1936],"gregory":b[2][1937],"hebrew":b[2][1938],"indian":b[2][1939],"islamic":b[2][1940],"islamicc":b[2][1940],"japanese":b[2][1941],"persian":b[2][1942],"roc":b[2][1943]},{"buddhist":b[2][1944],"chinese":b[2][1945],"coptic":b[2][1946],"dangi":b[2][1945],"ethiopic":b[2][1947],"ethioaa":b[2][1948],"generic":b[2][1949],"gregory":b[2][1950],"hebrew":b[2][1951],"indian":b[2][1952],"islamic":b[2][1953],"islamicc":b[2][1953],"japanese":b[2][1954],"persian":b[2][1955],"roc":b[2][1956]},{"buddhist":b[2][1958],"chinese":b[2][1959],"coptic":b[2][1960],"dangi":b[2][1959],"ethiopic":b[2][1961],"ethioaa":b[2][1962],"generic":b[2][1963],"gregory":b[2][1964],"hebrew":b[2][1965],"indian":b[2][1966],"islamic":b[2][1967],"islamicc":b[2][1967],"japanese":b[2][1968],"persian":b[2][1969],"roc":b[2][1970]},{"buddhist":b[2][1972],"chinese":b[2][171],"coptic":b[2][172],"dangi":b[2][171],"ethiopic":b[2][173],"ethioaa":b[2][174],"generic":b[2][175],"gregory":b[2][1973],"hebrew":b[2][177],"indian":b[2][178],"islamic":b[2][179],"islamicc":b[2][179],"japanese":b[2][1974],"persian":b[2][181],"roc":b[2][1975]},{"buddhist":b[2][1977],"chinese":b[2][1978],"coptic":b[2][1979],"dangi":b[2][1978],"ethiopic":b[2][1980],"ethioaa":b[2][1981],"generic":b[2][1982],"gregory":b[2][1983],"hebrew":b[2][1984],"indian":b[2][1985],"islamic":b[2][1986],"islamicc":b[2][1986],"japanese":b[2][1987],"persian":b[2][1988],"roc":b[2][1989]},{"buddhist":b[2][1990],"chinese":b[2][1991],"coptic":b[2][1992],"dangi":b[2][1991],"ethiopic":b[2][1993],"ethioaa":b[2][1994],"generic":b[2][1995],"gregory":b[2][1996],"hebrew":b[2][1997],"indian":b[2][1998],"islamic":b[2][1999],"islamicc":b[2][1999],"japanese":b[2][2000],"persian":b[2][2001],"roc":b[2][2002]},{"buddhist":b[2][2004],"chinese":b[2][2005],"coptic":b[2][2006],"dangi":b[2][2005],"ethiopic":b[2][2007],"ethioaa":b[2][2008],"generic":b[2][2009],"gregory":b[2][2010],"hebrew":b[2][2011],"indian":b[2][2012],"islamic":b[2][2013],"islamicc":b[2][2013],"japanese":b[2][2014],"persian":b[2][2015],"roc":b[2][2016]},{"buddhist":b[2][2017],"chinese":b[2][2018],"coptic":b[2][2019],"dangi":b[2][2018],"ethiopic":b[2][2020],"ethioaa":b[2][2021],"generic":b[2][2022],"gregory":b[2][2023],"hebrew":b[2][2024],"indian":b[2][2025],"islamic":b[2][2026],"islamicc":b[2][2026],"japanese":b[2][2027],"persian":b[2][2028],"roc":b[2][2029]},{"buddhist":b[2][2031],"chinese":b[2][2032],"coptic":b[2][2033],"dangi":b[2][2032],"ethiopic":b[2][2034],"ethioaa":b[2][2035],"generic":b[2][2036],"gregory":b[2][2037],"hebrew":b[2][2038],"indian":b[2][2039],"islamic":b[2][2040],"islamicc":b[2][2040],"japanese":b[2][2041],"persian":b[2][2042],"roc":b[2][2043]},{"buddhist":b[2][2050],"chinese":b[2][2051],"coptic":b[2][2052],"dangi":b[2][2051],"ethiopic":b[2][2053],"ethioaa":b[2][2054],"generic":b[2][2055],"gregory":b[2][2056],"hebrew":b[2][2057],"indian":b[2][2058],"islamic":b[2][2059],"islamicc":b[2][2059],"japanese":b[2][2060],"persian":b[2][2061],"roc":b[2][2062]},{"buddhist":b[2][2063],"chinese":b[2][2064],"coptic":b[2][2065],"dangi":b[2][2064],"ethiopic":b[2][2066],"ethioaa":b[2][2067],"generic":b[2][2068],"gregory":b[2][2069],"hebrew":b[2][2070],"indian":b[2][2071],"islamic":b[2][2072],"islamicc":b[2][2072],"japanese":b[2][2073],"persian":b[2][2074],"roc":b[2][2075]},{"buddhist":b[2][2077],"chinese":b[2][2078],"coptic":b[2][2079],"dangi":b[2][2078],"ethiopic":b[2][2080],"ethioaa":b[2][2081],"generic":b[2][2082],"gregory":b[2][2083],"hebrew":b[2][2084],"indian":b[2][2085],"islamic":b[2][2086],"islamicc":b[2][2086],"japanese":b[2][2087],"persian":b[2][2088],"roc":b[2][2089]},{"buddhist":b[2][2090],"chinese":b[2][2091],"coptic":b[2][2092],"dangi":b[2][2091],"ethiopic":b[2][2093],"ethioaa":b[2][2094],"generic":b[2][2095],"gregory":b[2][2096],"hebrew":b[2][2097],"indian":b[2][2098],"islamic":b[2][2099],"islamicc":b[2][2099],"japanese":b[2][2100],"persian":b[2][2101],"roc":b[2][2102]},{"buddhist":b[2][2103],"chinese":b[2][2104],"coptic":b[2][2105],"dangi":b[2][2104],"ethiopic":b[2][2106],"ethioaa":b[2][2107],"generic":b[2][2108],"gregory":b[2][2109],"hebrew":b[2][2110],"indian":b[2][2111],"islamic":b[2][2112],"islamicc":b[2][2112],"japanese":b[2][2113],"persian":b[2][2114],"roc":b[2][2115]},{"buddhist":b[2][2118],"chinese":b[2][2119],"coptic":b[2][2120],"dangi":b[2][2119],"ethiopic":b[2][2121],"ethioaa":b[2][2122],"generic":b[2][2123],"gregory":b[2][2124],"hebrew":b[2][2125],"indian":b[2][2126],"islamic":b[2][2127],"islamicc":b[2][2127],"japanese":b[2][2128],"persian":b[2][2129],"roc":b[2][2130]},{"buddhist":b[2][2132],"chinese":b[2][2133],"coptic":b[2][2134],"dangi":b[2][2133],"ethiopic":b[2][2135],"ethioaa":b[2][2136],"generic":b[2][2137],"gregory":b[2][2138],"hebrew":b[2][2139],"indian":b[2][2140],"islamic":b[2][2141],"islamicc":b[2][2141],"japanese":b[2][2142],"persian":b[2][2143],"roc":b[2][2144]},{"buddhist":b[2][2147],"chinese":b[2][2148],"coptic":b[2][2149],"dangi":b[2][2148],"ethiopic":b[2][2150],"ethioaa":b[2][2151],"generic":b[2][2152],"gregory":b[2][2153],"hebrew":b[2][2154],"indian":b[2][2155],"islamic":b[2][2156],"islamicc":b[2][2156],"japanese":b[2][2157],"persian":b[2][2158],"roc":b[2][2159]},{"buddhist":b[2][2161],"chinese":b[2][2162],"coptic":b[2][2163],"dangi":b[2][2162],"ethiopic":b[2][2164],"ethioaa":b[2][2165],"generic":b[2][2166],"gregory":b[2][2167],"hebrew":b[2][2168],"indian":b[2][2169],"islamic":b[2][2170],"islamicc":b[2][2170],"japanese":b[2][2171],"persian":b[2][2172],"roc":b[2][2173]},{"buddhist":b[2][2175],"chinese":b[2][2176],"coptic":b[2][2177],"dangi":b[2][2176],"ethiopic":b[2][2178],"ethioaa":b[2][2179],"generic":b[2][2180],"gregory":b[2][2181],"hebrew":b[2][2182],"indian":b[2][2183],"islamic":b[2][2184],"islamicc":b[2][2184],"japanese":b[2][2185],"persian":b[2][2186],"roc":b[2][2187]},{"buddhist":b[2][2189],"chinese":b[2][2190],"coptic":b[2][2191],"dangi":b[2][2190],"ethiopic":b[2][2192],"ethioaa":b[2][2193],"generic":b[2][2194],"gregory":b[2][2195],"hebrew":b[2][2196],"indian":b[2][2197],"islamic":b[2][2198],"islamicc":b[2][2198],"japanese":b[2][2199],"persian":b[2][2200],"roc":b[2][2201]},{"buddhist":b[2][2203],"chinese":b[2][2204],"coptic":b[2][2205],"dangi":b[2][2204],"ethiopic":b[2][2206],"ethioaa":b[2][2207],"generic":b[2][2208],"gregory":b[2][2209],"hebrew":b[2][2210],"indian":b[2][2211],"islamic":b[2][2212],"islamicc":b[2][2212],"japanese":b[2][2213],"persian":b[2][2214],"roc":b[2][2215]},{"buddhist":b[2][2217],"chinese":b[2][2218],"coptic":b[2][2219],"dangi":b[2][2218],"ethiopic":b[2][2220],"ethioaa":b[2][2221],"generic":b[2][2222],"gregory":b[2][2223],"hebrew":b[2][2224],"indian":b[2][2225],"islamic":b[2][2226],"islamicc":b[2][2226],"japanese":b[2][2227],"persian":b[2][2228],"roc":b[2][2229]},{"buddhist":b[2][2236],"chinese":b[2][2237],"coptic":b[2][2238],"dangi":b[2][2237],"ethiopic":b[2][2239],"ethioaa":b[2][2240],"generic":b[2][2241],"gregory":b[2][2242],"hebrew":b[2][2243],"indian":b[2][2244],"islamic":b[2][2245],"islamicc":b[2][2245],"japanese":b[2][2246],"persian":b[2][2247],"roc":b[2][2248]},{"buddhist":b[2][2252],"chinese":b[2][2253],"coptic":b[2][2254],"dangi":b[2][2253],"ethiopic":b[2][2255],"ethioaa":b[2][2256],"generic":b[2][2257],"gregory":b[2][2258],"hebrew":b[2][2259],"indian":b[2][2260],"islamic":b[2][2261],"islamicc":b[2][2261],"japanese":b[2][2262],"persian":b[2][2263],"roc":b[2][2264]},{"buddhist":b[2][2266],"chinese":b[2][2267],"coptic":b[2][2268],"dangi":b[2][2267],"ethiopic":b[2][2269],"ethioaa":b[2][2270],"generic":b[2][2271],"gregory":b[2][2272],"hebrew":b[2][2273],"indian":b[2][2274],"islamic":b[2][2275],"islamicc":b[2][2275],"japanese":b[2][2276],"persian":b[2][2277],"roc":b[2][2278]},{"buddhist":b[2][2280],"chinese":b[2][2281],"coptic":b[2][2282],"dangi":b[2][2281],"ethiopic":b[2][2283],"ethioaa":b[2][2284],"generic":b[2][2285],"gregory":b[2][2286],"hebrew":b[2][2287],"indian":b[2][2288],"islamic":b[2][2289],"islamicc":b[2][2289],"japanese":b[2][2290],"persian":b[2][2291],"roc":b[2][2292]},{"buddhist":b[2][2294],"chinese":b[2][2295],"coptic":b[2][2296],"dangi":b[2][2295],"ethiopic":b[2][2297],"ethioaa":b[2][2298],"generic":b[2][2299],"gregory":b[2][2300],"hebrew":b[2][2301],"indian":b[2][2302],"islamic":b[2][2303],"islamicc":b[2][2303],"japanese":b[2][2304],"persian":b[2][2305],"roc":b[2][2306]},{"buddhist":b[2][2308],"chinese":b[2][2309],"coptic":b[2][2310],"dangi":b[2][2309],"ethiopic":b[2][2311],"ethioaa":b[2][2312],"generic":b[2][2313],"gregory":b[2][2314],"hebrew":b[2][2315],"indian":b[2][2316],"islamic":b[2][2317],"islamicc":b[2][2317],"japanese":b[2][2318],"persian":b[2][2319],"roc":b[2][2320]},{"buddhist":b[2][2321],"chinese":b[2][2322],"coptic":b[2][2323],"dangi":b[2][2322],"ethiopic":b[2][2324],"ethioaa":b[2][2325],"generic":b[2][2326],"gregory":b[2][2327],"hebrew":b[2][2328],"indian":b[2][2329],"islamic":b[2][2330],"islamicc":b[2][2330],"japanese":b[2][2331],"persian":b[2][2332],"roc":b[2][2333]},{"buddhist":b[2][2339],"chinese":b[2][2340],"coptic":b[2][2341],"dangi":b[2][2340],"ethiopic":b[2][2342],"ethioaa":b[2][2343],"generic":b[2][2344],"gregory":b[2][2345],"hebrew":b[2][2346],"indian":b[2][2347],"islamic":b[2][2348],"islamicc":b[2][2348],"japanese":b[2][2349],"persian":b[2][2350],"roc":b[2][2351]},{"buddhist":b[2][2353],"chinese":b[2][2354],"coptic":b[2][2355],"dangi":b[2][2354],"ethiopic":b[2][2356],"ethioaa":b[2][2357],"generic":b[2][2358],"gregory":b[2][2359],"hebrew":b[2][2360],"indian":b[2][2361],"islamic":b[2][2362],"islamicc":b[2][2362],"japanese":b[2][2363],"persian":b[2][2364],"roc":b[2][2365]},{"buddhist":b[2][2366],"chinese":b[2][2367],"coptic":b[2][2368],"dangi":b[2][2367],"ethiopic":b[2][2369],"ethioaa":b[2][2370],"generic":b[2][2371],"gregory":b[2][2372],"hebrew":b[2][2373],"indian":b[2][2374],"islamic":b[2][2375],"islamicc":b[2][2375],"japanese":b[2][2376],"persian":b[2][2377],"roc":b[2][2378]},{"buddhist":b[2][2379],"chinese":b[2][2380],"coptic":b[2][2381],"dangi":b[2][2380],"ethiopic":b[2][2382],"ethioaa":b[2][2383],"generic":b[2][2384],"gregory":b[2][2385],"hebrew":b[2][2386],"indian":b[2][2387],"islamic":b[2][2388],"islamicc":b[2][2388],"japanese":b[2][2389],"persian":b[2][2390],"roc":b[2][2391]},{"buddhist":b[2][2392],"chinese":b[2][2393],"coptic":b[2][2394],"dangi":b[2][2393],"ethiopic":b[2][2395],"ethioaa":b[2][2396],"generic":b[2][2397],"gregory":b[2][2398],"hebrew":b[2][2399],"indian":b[2][2400],"islamic":b[2][2401],"islamicc":b[2][2401],"japanese":b[2][2402],"persian":b[2][2403],"roc":b[2][2404]},{"buddhist":b[2][2407],"chinese":b[2][2408],"coptic":b[2][2409],"dangi":b[2][2408],"ethiopic":b[2][2410],"ethioaa":b[2][2411],"generic":b[2][2412],"gregory":b[2][2413],"hebrew":b[2][2414],"indian":b[2][2415],"islamic":b[2][2416],"islamicc":b[2][2416],"japanese":b[2][2417],"persian":b[2][2418],"roc":b[2][2419]},{"buddhist":b[2][2421],"chinese":b[2][2422],"coptic":b[2][2423],"dangi":b[2][2422],"ethiopic":b[2][2424],"ethioaa":b[2][2425],"generic":b[2][2426],"gregory":b[2][2427],"hebrew":b[2][2428],"indian":b[2][2429],"islamic":b[2][2430],"islamicc":b[2][2430],"japanese":b[2][2431],"persian":b[2][2432],"roc":b[2][2433]},{"buddhist":b[2][2434],"chinese":b[2][2435],"coptic":b[2][2436],"dangi":b[2][2435],"ethiopic":b[2][2437],"ethioaa":b[2][2438],"generic":b[2][2439],"gregory":b[2][2440],"hebrew":b[2][2441],"indian":b[2][2442],"islamic":b[2][2443],"islamicc":b[2][2443],"japanese":b[2][2444],"persian":b[2][2445],"roc":b[2][2446]},{"buddhist":b[2][2448],"chinese":b[2][2449],"coptic":b[2][2450],"dangi":b[2][2449],"ethiopic":b[2][2451],"ethioaa":b[2][2452],"generic":b[2][2453],"gregory":b[2][2454],"hebrew":b[2][2455],"indian":b[2][2456],"islamic":b[2][2457],"islamicc":b[2][2457],"japanese":b[2][2458],"persian":b[2][2459],"roc":b[2][2460]},{"buddhist":b[2][2461],"chinese":b[2][2462],"coptic":b[2][2463],"dangi":b[2][2462],"ethiopic":b[2][2464],"ethioaa":b[2][2465],"generic":b[2][2466],"gregory":b[2][2467],"hebrew":b[2][2468],"indian":b[2][2469],"islamic":b[2][2470],"islamicc":b[2][2470],"japanese":b[2][2471],"persian":b[2][2472],"roc":b[2][2473]},{"buddhist":b[2][2474],"chinese":b[2][2475],"coptic":b[2][2476],"dangi":b[2][2475],"ethiopic":b[2][2477],"ethioaa":b[2][2478],"generic":b[2][2479],"gregory":b[2][2480],"hebrew":b[2][2481],"indian":b[2][2482],"islamic":b[2][2483],"islamicc":b[2][2483],"japanese":b[2][2484],"persian":b[2][2485],"roc":b[2][2486]},{"buddhist":b[2][2488],"chinese":b[2][2489],"coptic":b[2][2490],"dangi":b[2][2489],"ethiopic":b[2][2491],"ethioaa":b[2][2492],"generic":b[2][2493],"gregory":b[2][2494],"hebrew":b[2][2495],"indian":b[2][2496],"islamic":b[2][2497],"islamicc":b[2][2497],"japanese":b[2][2498],"persian":b[2][2499],"roc":b[2][2500]},{"buddhist":b[2][2502],"chinese":b[2][2503],"coptic":b[2][2504],"dangi":b[2][2503],"ethiopic":b[2][2505],"ethioaa":b[2][2506],"generic":b[2][2507],"gregory":b[2][2508],"hebrew":b[2][2509],"indian":b[2][2510],"islamic":b[2][2511],"islamicc":b[2][2511],"japanese":b[2][2512],"persian":b[2][2513],"roc":b[2][2514]},{"buddhist":b[2][2516],"chinese":b[2][2517],"coptic":b[2][2518],"dangi":b[2][2517],"ethiopic":b[2][2519],"ethioaa":b[2][2520],"generic":b[2][2521],"gregory":b[2][2522],"hebrew":b[2][2523],"indian":b[2][2524],"islamic":b[2][2525],"islamicc":b[2][2525],"japanese":b[2][2526],"persian":b[2][2527],"roc":b[2][2528]},{"buddhist":b[2][2530],"chinese":b[2][2531],"coptic":b[2][2532],"dangi":b[2][2531],"ethiopic":b[2][2533],"ethioaa":b[2][2534],"generic":b[2][2535],"gregory":b[2][2536],"hebrew":b[2][2537],"indian":b[2][2538],"islamic":b[2][2539],"islamicc":b[2][2539],"japanese":b[2][2540],"persian":b[2][2541],"roc":b[2][2542]},{"buddhist":b[2][2543],"chinese":b[2][2544],"coptic":b[2][2545],"dangi":b[2][2544],"ethiopic":b[2][2546],"ethioaa":b[2][2547],"generic":b[2][2548],"gregory":b[2][2549],"hebrew":b[2][2550],"indian":b[2][2551],"islamic":b[2][2552],"islamicc":b[2][2552],"japanese":b[2][2553],"persian":b[2][2554],"roc":b[2][2555]},{"buddhist":b[2][2560],"chinese":b[2][2561],"coptic":b[2][2562],"dangi":b[2][2561],"ethiopic":b[2][2563],"ethioaa":b[2][2564],"generic":b[2][2565],"gregory":b[2][2566],"hebrew":b[2][2567],"indian":b[2][2568],"islamic":b[2][2569],"islamicc":b[2][2569],"japanese":b[2][2570],"persian":b[2][2571],"roc":b[2][2572]},{"buddhist":b[2][2575],"chinese":b[2][2576],"coptic":b[2][2577],"dangi":b[2][2576],"ethiopic":b[2][2578],"ethioaa":b[2][2579],"generic":b[2][2580],"gregory":b[2][2581],"hebrew":b[2][2582],"indian":b[2][2583],"islamic":b[2][2584],"islamicc":b[2][2584],"japanese":b[2][2585],"persian":b[2][2586],"roc":b[2][2587]},{"buddhist":b[2][2589],"chinese":b[2][2590],"coptic":b[2][2591],"dangi":b[2][2590],"ethiopic":b[2][2592],"ethioaa":b[2][2593],"generic":b[2][2594],"gregory":b[2][2595],"hebrew":b[2][2596],"indian":b[2][2597],"islamic":b[2][2598],"islamicc":b[2][2598],"japanese":b[2][2599],"persian":b[2][2600],"roc":b[2][2601]},{"buddhist":b[2][2603],"chinese":b[2][2604],"coptic":b[2][2605],"dangi":b[2][2604],"ethiopic":b[2][2606],"ethioaa":b[2][2607],"generic":b[2][2608],"gregory":b[2][2609],"hebrew":b[2][2610],"indian":b[2][2611],"islamic":b[2][2612],"islamicc":b[2][2612],"japanese":b[2][2613],"persian":b[2][2614],"roc":b[2][2615]},{"buddhist":b[2][2617],"chinese":b[2][2618],"coptic":b[2][2619],"dangi":b[2][2618],"ethiopic":b[2][2620],"ethioaa":b[2][2621],"generic":b[2][2622],"gregory":b[2][2623],"hebrew":b[2][2624],"indian":b[2][2625],"islamic":b[2][2626],"islamicc":b[2][2626],"japanese":b[2][2627],"persian":b[2][2628],"roc":b[2][2629]},{"buddhist":b[2][2631],"chinese":b[2][2632],"coptic":b[2][2633],"dangi":b[2][2632],"ethiopic":b[2][2634],"ethioaa":b[2][2635],"generic":b[2][2636],"gregory":b[2][2637],"hebrew":b[2][2638],"indian":b[2][2639],"islamic":b[2][2640],"islamicc":b[2][2640],"japanese":b[2][2641],"persian":b[2][2642],"roc":b[2][2643]},{"buddhist":b[2][2646],"chinese":b[2][2647],"coptic":b[2][2648],"dangi":b[2][2647],"ethiopic":b[2][2649],"ethioaa":b[2][2650],"generic":b[2][2651],"gregory":b[2][2652],"hebrew":b[2][2653],"indian":b[2][2654],"islamic":b[2][2655],"islamicc":b[2][2655],"japanese":b[2][2656],"persian":b[2][2657],"roc":b[2][2658]},{"buddhist":b[2][2663],"chinese":b[2][2664],"coptic":b[2][2665],"dangi":b[2][2664],"ethiopic":b[2][2666],"ethioaa":b[2][2667],"generic":b[2][2668],"gregory":b[2][2669],"hebrew":b[2][2670],"indian":b[2][2671],"islamic":b[2][2672],"islamicc":b[2][2672],"japanese":b[2][2673],"persian":b[2][2674],"roc":b[2][2675]},{"buddhist":b[2][2677],"chinese":b[2][2678],"coptic":b[2][2679],"dangi":b[2][2678],"ethiopic":b[2][2680],"ethioaa":b[2][2681],"generic":b[2][2682],"gregory":b[2][2683],"hebrew":b[2][2684],"indian":b[2][2685],"islamic":b[2][2686],"islamicc":b[2][2686],"japanese":b[2][2687],"persian":b[2][2688],"roc":b[2][2689]},{"buddhist":b[2][2691],"chinese":b[2][2692],"coptic":b[2][2693],"dangi":b[2][2692],"ethiopic":b[2][2694],"ethioaa":b[2][2695],"generic":b[2][2696],"gregory":b[2][2697],"hebrew":b[2][2698],"indian":b[2][2699],"islamic":b[2][2700],"islamicc":b[2][2700],"japanese":b[2][2701],"persian":b[2][2702],"roc":b[2][2703]},{"buddhist":b[2][2705],"chinese":b[2][2706],"coptic":b[2][2707],"dangi":b[2][2706],"ethiopic":b[2][2708],"ethioaa":b[2][2709],"generic":b[2][2710],"gregory":b[2][2711],"hebrew":b[2][2712],"indian":b[2][2713],"islamic":b[2][2714],"islamicc":b[2][2714],"japanese":b[2][2715],"persian":b[2][2716],"roc":b[2][2717]},{"buddhist":b[2][2718],"chinese":b[2][2719],"coptic":b[2][2720],"dangi":b[2][2719],"ethiopic":b[2][2721],"ethioaa":b[2][2722],"generic":b[2][2723],"gregory":b[2][2724],"hebrew":b[2][2725],"indian":b[2][2726],"islamic":b[2][2727],"islamicc":b[2][2727],"japanese":b[2][2728],"persian":b[2][2729],"roc":b[2][2730]},{"buddhist":b[2][2732],"chinese":b[2][2733],"coptic":b[2][2734],"dangi":b[2][2733],"ethiopic":b[2][2735],"ethioaa":b[2][2736],"generic":b[2][2737],"gregory":b[2][2738],"hebrew":b[2][2739],"indian":b[2][2740],"islamic":b[2][2741],"islamicc":b[2][2741],"japanese":b[2][2742],"persian":b[2][2743],"roc":b[2][2744]},{"buddhist":b[2][2746],"chinese":b[2][2747],"coptic":b[2][2748],"dangi":b[2][2747],"ethiopic":b[2][2749],"ethioaa":b[2][2750],"generic":b[2][2751],"gregory":b[2][2752],"hebrew":b[2][2753],"indian":b[2][2754],"islamic":b[2][2755],"islamicc":b[2][2755],"japanese":b[2][2756],"persian":b[2][2757],"roc":b[2][2758]},{"buddhist":b[2][2760],"chinese":b[2][2761],"coptic":b[2][2762],"dangi":b[2][2761],"ethiopic":b[2][2763],"ethioaa":b[2][2764],"generic":b[2][2765],"gregory":b[2][2766],"hebrew":b[2][2767],"indian":b[2][2768],"islamic":b[2][2769],"islamicc":b[2][2769],"japanese":b[2][2770],"persian":b[2][2771],"roc":b[2][2772]},{"buddhist":b[2][2774],"chinese":b[2][2775],"coptic":b[2][2776],"dangi":b[2][2775],"ethiopic":b[2][2777],"ethioaa":b[2][2778],"generic":b[2][2779],"gregory":b[2][2780],"hebrew":b[2][2781],"indian":b[2][2782],"islamic":b[2][2783],"islamicc":b[2][2783],"japanese":b[2][2784],"persian":b[2][2785],"roc":b[2][2786]},{"buddhist":b[2][2787],"chinese":b[2][2788],"coptic":b[2][2789],"dangi":b[2][2788],"ethiopic":b[2][2790],"ethioaa":b[2][2791],"generic":b[2][2792],"gregory":b[2][2793],"hebrew":b[2][2794],"indian":b[2][2795],"islamic":b[2][2796],"islamicc":b[2][2796],"japanese":b[2][2797],"persian":b[2][2798],"roc":b[2][2799]},{"buddhist":b[2][2800],"chinese":b[2][2801],"coptic":b[2][2802],"dangi":b[2][2801],"ethiopic":b[2][2803],"ethioaa":b[2][2804],"generic":b[2][2805],"gregory":b[2][2806],"hebrew":b[2][2807],"indian":b[2][2808],"islamic":b[2][2809],"islamicc":b[2][2809],"japanese":b[2][2810],"persian":b[2][2811],"roc":b[2][2812]},{"buddhist":b[2][2814],"chinese":b[2][2815],"coptic":b[2][2816],"dangi":b[2][2815],"ethiopic":b[2][2817],"ethioaa":b[2][2818],"generic":b[2][2819],"gregory":b[2][2820],"hebrew":b[2][2821],"indian":b[2][2822],"islamic":b[2][2823],"islamicc":b[2][2823],"japanese":b[2][2824],"persian":b[2][2825],"roc":b[2][2826]},{"buddhist":b[2][2828],"chinese":b[2][2829],"coptic":b[2][2830],"dangi":b[2][2829],"ethiopic":b[2][2831],"ethioaa":b[2][2832],"generic":b[2][2833],"gregory":b[2][2834],"hebrew":b[2][2835],"indian":b[2][2836],"islamic":b[2][2837],"islamicc":b[2][2837],"japanese":b[2][2838],"persian":b[2][2839],"roc":b[2][2840]},{"buddhist":b[2][2843],"chinese":b[2][2844],"coptic":b[2][2845],"dangi":b[2][2844],"ethiopic":b[2][2846],"ethioaa":b[2][2847],"generic":b[2][2848],"gregory":b[2][2849],"hebrew":b[2][2850],"indian":b[2][2851],"islamic":b[2][2852],"islamicc":b[2][2852],"japanese":b[2][2853],"persian":b[2][2854],"roc":b[2][2855]},{"buddhist":b[2][2857],"chinese":b[2][2858],"coptic":b[2][2859],"dangi":b[2][2858],"ethiopic":b[2][2860],"ethioaa":b[2][2861],"generic":b[2][2862],"gregory":b[2][2863],"hebrew":b[2][2864],"indian":b[2][2865],"islamic":b[2][2866],"islamicc":b[2][2866],"japanese":b[2][2867],"persian":b[2][2868],"roc":b[2][2869]},{"buddhist":b[2][2871],"chinese":b[2][2872],"coptic":b[2][2873],"dangi":b[2][2872],"ethiopic":b[2][2874],"ethioaa":b[2][2875],"generic":b[2][2876],"gregory":b[2][2877],"hebrew":b[2][2878],"indian":b[2][2879],"islamic":b[2][2880],"islamicc":b[2][2880],"japanese":b[2][2881],"persian":b[2][2882],"roc":b[2][2883]},{"buddhist":b[2][2885],"chinese":b[2][2886],"coptic":b[2][2887],"dangi":b[2][2886],"ethiopic":b[2][2888],"ethioaa":b[2][2889],"generic":b[2][2890],"gregory":b[2][2891],"hebrew":b[2][2892],"indian":b[2][2893],"islamic":b[2][2894],"islamicc":b[2][2894],"japanese":b[2][2895],"persian":b[2][2896],"roc":b[2][2897]},{"buddhist":b[2][2899],"chinese":b[2][2900],"coptic":b[2][2901],"dangi":b[2][2900],"ethiopic":b[2][2902],"ethioaa":b[2][2903],"generic":b[2][2904],"gregory":b[2][2905],"hebrew":b[2][2906],"indian":b[2][2907],"islamic":b[2][2908],"islamicc":b[2][2908],"japanese":b[2][2909],"persian":b[2][2910],"roc":b[2][2911]},{"buddhist":b[2][2912],"chinese":b[2][2913],"coptic":b[2][2914],"dangi":b[2][2913],"ethiopic":b[2][2915],"ethioaa":b[2][2916],"generic":b[2][2917],"gregory":b[2][2918],"hebrew":b[2][2919],"indian":b[2][2920],"islamic":b[2][2921],"islamicc":b[2][2921],"japanese":b[2][2922],"persian":b[2][2923],"roc":b[2][2924]},{"buddhist":b[2][2926],"chinese":b[2][2927],"coptic":b[2][2928],"dangi":b[2][2927],"ethiopic":b[2][2929],"ethioaa":b[2][2930],"generic":b[2][2931],"gregory":b[2][2932],"hebrew":b[2][2933],"indian":b[2][2934],"islamic":b[2][2935],"islamicc":b[2][2935],"japanese":b[2][2936],"persian":b[2][2937],"roc":b[2][2938]},{"buddhist":b[2][2940],"chinese":b[2][2941],"coptic":b[2][2942],"dangi":b[2][2941],"ethiopic":b[2][2943],"ethioaa":b[2][2944],"generic":b[2][2945],"gregory":b[2][2946],"hebrew":b[2][2947],"indian":b[2][2948],"islamic":b[2][2949],"islamicc":b[2][2949],"japanese":b[2][2950],"persian":b[2][2951],"roc":b[2][2952]},{"buddhist":b[2][2954],"chinese":b[2][2955],"coptic":b[2][2956],"dangi":b[2][2955],"ethiopic":b[2][2957],"ethioaa":b[2][2958],"generic":b[2][2959],"gregory":b[2][2960],"hebrew":b[2][2961],"indian":b[2][2962],"islamic":b[2][2963],"islamicc":b[2][2963],"japanese":b[2][2964],"persian":b[2][2965],"roc":b[2][2966]},{"buddhist":b[2][2967],"chinese":b[2][2968],"coptic":b[2][2969],"dangi":b[2][2968],"ethiopic":b[2][2970],"ethioaa":b[2][2971],"generic":b[2][2972],"gregory":b[2][2973],"hebrew":b[2][2974],"indian":b[2][2975],"islamic":b[2][2976],"islamicc":b[2][2976],"japanese":b[2][2977],"persian":b[2][2978],"roc":b[2][2979]},{"buddhist":b[2][2980],"chinese":b[2][2981],"coptic":b[2][2982],"dangi":b[2][2981],"ethiopic":b[2][2983],"ethioaa":b[2][2984],"generic":b[2][2985],"gregory":b[2][2986],"hebrew":b[2][2987],"indian":b[2][2988],"islamic":b[2][2989],"islamicc":b[2][2989],"japanese":b[2][2990],"persian":b[2][2991],"roc":b[2][2992]},{"buddhist":b[2][2993],"chinese":b[2][2994],"coptic":b[2][2995],"dangi":b[2][2994],"ethiopic":b[2][2996],"ethioaa":b[2][2997],"generic":b[2][2998],"gregory":b[2][2999],"hebrew":b[2][3000],"indian":b[2][3001],"islamic":b[2][3002],"islamicc":b[2][3002],"japanese":b[2][3003],"persian":b[2][3004],"roc":b[2][3005]},{"buddhist":b[2][3006],"chinese":b[2][3007],"coptic":b[2][3008],"dangi":b[2][3007],"ethiopic":b[2][3009],"ethioaa":b[2][3010],"generic":b[2][3011],"gregory":b[2][3012],"hebrew":b[2][3013],"indian":b[2][3014],"islamic":b[2][3015],"islamicc":b[2][3015],"japanese":b[2][3016],"persian":b[2][3017],"roc":b[2][3018]},{"buddhist":b[2][3020],"chinese":b[2][3021],"coptic":b[2][3022],"dangi":b[2][3021],"ethiopic":b[2][3022],"ethioaa":b[2][3023],"generic":b[2][3024],"gregory":b[2][3025],"hebrew":b[2][3026],"indian":b[2][3027],"islamic":b[2][3028],"islamicc":b[2][3028],"japanese":b[2][3029],"persian":b[2][3030],"roc":b[2][3031]},{"buddhist":b[2][3036],"chinese":b[2][3037],"coptic":b[2][3038],"dangi":b[2][3039],"ethiopic":b[2][3038],"ethioaa":b[2][3040],"generic":b[2][3041],"gregory":b[2][3042],"hebrew":b[2][3043],"indian":b[2][3044],"islamic":b[2][3045],"islamicc":b[2][3045],"japanese":b[2][3046],"persian":b[2][3047],"roc":b[2][3048]},{"buddhist":b[2][3036],"chinese":b[2][3039],"coptic":b[2][3038],"dangi":b[2][3039],"ethiopic":b[2][3038],"ethioaa":b[2][3040],"generic":b[2][3041],"gregory":b[2][3050],"hebrew":b[2][3043],"indian":b[2][3044],"islamic":b[2][3045],"islamicc":b[2][3045],"japanese":b[2][3046],"persian":b[2][3047],"roc":b[2][3048]},{"buddhist":b[2][3053],"chinese":b[2][3054],"coptic":b[2][3055],"dangi":b[2][3054],"ethiopic":b[2][3056],"ethioaa":b[2][3057],"generic":b[2][3058],"gregory":b[2][3059],"hebrew":b[2][3060],"indian":b[2][3061],"islamic":b[2][3062],"islamicc":b[2][3062],"japanese":b[2][3063],"persian":b[2][3064],"roc":b[2][3065]}];b[4]=[{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][0],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][23],"calendars":b[3][1]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][29],"calendars":b[3][2]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][34],"calendars":b[3][3]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][38],"calendars":b[3][4]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][43],"calendars":b[3][5]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][43],"calendars":b[3][6]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][43],"calendars":b[3][7]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][63],"calendars":b[3][5]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][43],"calendars":b[3][8]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][43],"calendars":b[3][9]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][66],"calendars":b[3][5]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][66],"calendars":b[3][10]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][43],"calendars":b[3][11]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][12]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][75],"calendars":b[3][13]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][80],"calendars":b[3][14]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][91],"calendars":b[3][15]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][16]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][97],"calendars":b[3][17]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][100],"calendars":b[3][18]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][105],"calendars":b[3][19]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][109],"calendars":b[3][20]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][75],"calendars":b[3][21]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][116],"calendars":b[3][22]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][123],"calendars":b[3][23]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][127],"calendars":b[3][24]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][137],"calendars":b[3][25]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][142],"calendars":b[3][26]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][147],"calendars":b[3][27]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][153],"calendars":b[3][28]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][157],"calendars":b[3][29]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][172],"calendars":b[3][30]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][31]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][75],"calendars":b[3][32]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][184],"calendars":b[3][33]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][189],"calendars":b[3][34]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][194],"calendars":b[3][35]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][198],"calendars":b[3][36]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][202],"calendars":b[3][36]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][75],"calendars":b[3][37]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][206],"calendars":b[3][38]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][206],"calendars":b[3][39]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][100],"calendars":b[3][40]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][218],"calendars":b[3][41]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][42]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][43]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][229],"calendars":b[3][44]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][75],"calendars":b[3][45]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][237],"calendars":b[3][46]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][242],"calendars":b[3][46]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][243],"calendars":b[3][47]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][248],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][249],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][250],"calendars":b[3][48]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][253],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][254],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][255],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][256],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][257],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][258],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][249],"calendars":b[3][49]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][259],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][260],"calendars":b[3][50]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][261],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][262],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][263],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][265],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][266],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][267],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][268],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][269],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][270],"calendars":b[3][0]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][271],"calendars":b[3][51]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][275],"calendars":b[3][52]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][280],"calendars":b[3][53]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][284],"calendars":b[3][53]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][285],"calendars":b[3][53]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][287],"calendars":b[3][53]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][288],"calendars":b[3][54]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][290],"calendars":b[3][53]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][291],"calendars":b[3][53]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][292],"calendars":b[3][55]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][295],"calendars":b[3][56]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][297],"calendars":b[3][57]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][299],"calendars":b[3][52]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][300],"calendars":b[3][53]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][280],"calendars":b[3][58]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][303],"calendars":b[3][59]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][280],"calendars":b[3][57]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][304],"calendars":b[3][60]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][305],"calendars":b[3][61]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][310],"calendars":b[3][62]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][317],"calendars":b[3][63]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][321],"calendars":b[3][64]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][321],"calendars":b[3][65]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][334],"calendars":b[3][66]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][338],"calendars":b[3][66]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][339],"calendars":b[3][67]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][346],"calendars":b[3][68]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][350],"calendars":b[3][69]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][355],"calendars":b[3][70]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][364],"calendars":b[3][70]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][365],"calendars":b[3][70]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][366],"calendars":b[3][70]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][367],"calendars":b[3][70]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][355],"calendars":b[3][71]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][369],"calendars":b[3][72]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][373],"calendars":b[3][73]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][385],"calendars":b[3][74]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][389],"calendars":b[3][75]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][394],"calendars":b[3][76]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][398],"calendars":b[3][77]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][403],"calendars":b[3][78]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][79]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][80]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][416],"calendars":b[3][81]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][420],"calendars":b[3][81]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[2][1126],"calendars":b[3][82]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][424],"calendars":b[3][83]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][434],"calendars":b[3][84]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][444],"calendars":b[3][85]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][449],"calendars":b[3][86]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][453],"calendars":b[3][87]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][464],"calendars":b[3][88]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][468],"calendars":b[3][89]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][475],"calendars":b[3][90]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][479],"calendars":b[3][91]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][483],"calendars":b[3][92]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][487],"calendars":b[3][93]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][493],"calendars":b[3][93]},{"ca":b[0][0],"hourNo0":false,"hour12":false,"formats":b[1][494],"calendars":b[3][94]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][509],"calendars":b[3][95]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][96]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][516],"calendars":b[3][97]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][338],"calendars":b[3][98]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][99]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][100]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][530],"calendars":b[3][101]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][334],"calendars":b[3][102]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][103]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][538],"calendars":b[3][104]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][542],"calendars":b[3][105]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][106]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][107]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][550],"calendars":b[3][108]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][555],"calendars":b[3][109]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][560],"calendars":b[3][110]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][111]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][576],"calendars":b[3][112]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][113]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][114]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][588],"calendars":b[3][115]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][116]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][595],"calendars":b[3][117]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][118]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][603],"calendars":b[3][119]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][120]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][121]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][122]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][615],"calendars":b[3][123]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][124]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][479],"calendars":b[3][124]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][633],"calendars":b[3][125]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][126]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][127]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][128]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][649],"calendars":b[3][129]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][130]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][131]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][334],"calendars":b[3][132]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][665],"calendars":b[3][133]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][669],"calendars":b[3][134]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][673],"calendars":b[3][135]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][676],"calendars":b[3][136]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][680],"calendars":b[3][137]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][689],"calendars":b[3][138]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][693],"calendars":b[3][139]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][697],"calendars":b[3][140]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][702],"calendars":b[3][140]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][703],"calendars":b[3][141]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][142]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][710],"calendars":b[3][143]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][144]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][475],"calendars":b[3][145]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][720],"calendars":b[3][146]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][475],"calendars":b[3][147]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][734],"calendars":b[3][148]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][739],"calendars":b[3][148]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][373],"calendars":b[3][149]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][746],"calendars":b[3][149]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][150]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][750],"calendars":b[3][151]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][754],"calendars":b[3][152]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][758],"calendars":b[3][153]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][32]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][762],"calendars":b[3][154]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][766],"calendars":b[3][154]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][767],"calendars":b[3][155]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][771],"calendars":b[3][156]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][776],"calendars":b[3][157]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][783],"calendars":b[3][158]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][788],"calendars":b[3][159]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][796],"calendars":b[3][160]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][802],"calendars":b[3][161]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][808],"calendars":b[3][162]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][812],"calendars":b[3][162]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][813],"calendars":b[3][163]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][817],"calendars":b[3][164]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][165]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][825],"calendars":b[3][166]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][825],"calendars":b[3][167]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][168]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][836],"calendars":b[3][169]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][848],"calendars":b[3][169]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][849],"calendars":b[3][170]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][852],"calendars":b[3][171]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][172]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][859],"calendars":b[3][173]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][174]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][866],"calendars":b[3][175]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][334],"calendars":b[3][176]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][871],"calendars":b[3][177]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][871],"calendars":b[3][178]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][871],"calendars":b[3][179]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][881],"calendars":b[3][180]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][885],"calendars":b[3][181]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][889],"calendars":b[3][182]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][183]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][475],"calendars":b[3][184]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][898],"calendars":b[3][185]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][902],"calendars":b[3][185]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][903],"calendars":b[3][186]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][907],"calendars":b[3][186]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][908],"calendars":b[3][187]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][912],"calendars":b[3][187]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][908],"calendars":b[3][188]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][912],"calendars":b[3][188]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][924],"calendars":b[3][189]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][937],"calendars":b[3][189]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][938],"calendars":b[3][190]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][942],"calendars":b[3][191]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][945],"calendars":b[3][192]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][951],"calendars":b[3][192]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][952],"calendars":b[3][193]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][194]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][959],"calendars":b[3][195]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][977],"calendars":b[3][196]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][981],"calendars":b[3][197]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][984],"calendars":b[3][198]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][987],"calendars":b[3][199]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][992],"calendars":b[3][200]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1003],"calendars":b[3][200]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][201]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][202]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1007],"calendars":b[3][203]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][1015],"calendars":b[3][204]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1025],"calendars":b[3][205]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][1031],"calendars":b[3][206]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][69],"calendars":b[3][207]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][1039],"calendars":b[3][208]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][475],"calendars":b[3][209]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1046],"calendars":b[3][210]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][1049],"calendars":b[3][211]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][1054],"calendars":b[3][212]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][213]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][222],"calendars":b[3][214]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][1064],"calendars":b[3][215]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][475],"calendars":b[3][216]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][409],"calendars":b[3][217]},{"ca":b[0][0],"hourNo0":true,"hour12":false,"formats":b[1][1073],"calendars":b[3][218]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1075],"calendars":b[3][219]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1089],"calendars":b[3][219]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1090],"calendars":b[3][219]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1091],"calendars":b[3][219]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1092],"calendars":b[3][220]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1108],"calendars":b[3][221]},{"ca":b[0][0],"hourNo0":true,"hour12":true,"formats":b[1][1110],"calendars":b[3][222]}];b[5]=[{"locale":"en","date":b[4][0],"number":b[2][13]},{"locale":"af","date":b[4][1],"number":b[2][27]},{"locale":"af-NA","date":b[4][1],"number":b[2][28]},{"locale":"af-ZA","date":b[4][1],"number":b[2][27]},{"locale":"agq","date":b[4][2],"number":b[2][42]},{"locale":"agq-CM","date":b[4][2],"number":b[2][42]},{"locale":"ak","date":b[4][3],"number":b[2][56]},{"locale":"ak-GH","date":b[4][3],"number":b[2][56]},{"locale":"am","date":b[4][4],"number":b[2][70]},{"locale":"am-ET","date":b[4][4],"number":b[2][70]},{"locale":"ar","date":b[4][5],"number":b[2][84]},{"locale":"ar-001","date":b[4][5],"number":b[2][84]},{"locale":"ar-AE","date":b[4][6],"number":b[2][84]},{"locale":"ar-BH","date":b[4][5],"number":b[2][84]},{"locale":"ar-DJ","date":b[4][5],"number":b[2][86]},{"locale":"ar-DZ","date":b[4][7],"number":b[2][91]},{"locale":"ar-EG","date":b[4][5],"number":b[2][84]},{"locale":"ar-EH","date":b[4][5],"number":b[2][92]},{"locale":"ar-ER","date":b[4][5],"number":b[2][93]},{"locale":"ar-IL","date":b[4][8],"number":b[2][84]},{"locale":"ar-IQ","date":b[4][9],"number":b[2][84]},{"locale":"ar-JO","date":b[4][10],"number":b[2][84]},{"locale":"ar-KM","date":b[4][11],"number":b[2][84]},{"locale":"ar-KW","date":b[4][5],"number":b[2][84]},{"locale":"ar-LB","date":b[4][10],"number":b[2][102]},{"locale":"ar-LY","date":b[4][5],"number":b[2][91]},{"locale":"ar-MA","date":b[4][12],"number":b[2][91]},{"locale":"ar-MR","date":b[4][13],"number":b[2][111]},{"locale":"ar-OM","date":b[4][5],"number":b[2][84]},{"locale":"ar-PS","date":b[4][10],"number":b[2][84]},{"locale":"ar-QA","date":b[4][5],"number":b[2][84]},{"locale":"ar-SA","date":b[4][5],"number":b[2][84]},{"locale":"ar-SD","date":b[4][5],"number":b[2][84]},{"locale":"ar-SO","date":b[4][5],"number":b[2][112]},{"locale":"ar-SS","date":b[4][5],"number":b[2][113]},{"locale":"ar-SY","date":b[4][10],"number":b[2][84]},{"locale":"ar-TD","date":b[4][5],"number":b[2][84]},{"locale":"ar-TN","date":b[4][7],"number":b[2][91]},{"locale":"ar-YE","date":b[4][5],"number":b[2][84]},{"locale":"as","date":b[4][14],"number":b[2][127]},{"locale":"as-IN","date":b[4][14],"number":b[2][127]},{"locale":"asa","date":b[4][15],"number":b[2][141]},{"locale":"asa-TZ","date":b[4][15],"number":b[2][141]},{"locale":"ast","date":b[4][16],"number":b[2][155]},{"locale":"ast-ES","date":b[4][16],"number":b[2][155]},{"locale":"az","date":b[4][17],"number":b[2][169]},{"locale":"az-Arab","date":b[4][18],"number":b[2][183]},{"locale":"az-Cyrl","date":b[4][19],"number":b[2][197]},{"locale":"az-Cyrl-AZ","date":b[4][19],"number":b[2][197]},{"locale":"az-Latn","date":b[4][17],"number":b[2][169]},{"locale":"az-Latn-AZ","date":b[4][17],"number":b[2][169]},{"locale":"bas","date":b[4][20],"number":b[2][211]},{"locale":"bas-CM","date":b[4][20],"number":b[2][211]},{"locale":"be","date":b[4][21],"number":b[2][225]},{"locale":"be-BY","date":b[4][21],"number":b[2][225]},{"locale":"bem","date":b[4][22],"number":b[2][239]},{"locale":"bem-ZM","date":b[4][22],"number":b[2][239]},{"locale":"bez","date":b[4][23],"number":b[2][253]},{"locale":"bez-TZ","date":b[4][23],"number":b[2][253]},{"locale":"bg","date":b[4][24],"number":b[2][267]},{"locale":"bg-BG","date":b[4][24],"number":b[2][267]},{"locale":"bm","date":b[4][25],"number":b[2][281]},{"locale":"bm-ML","date":b[4][25],"number":b[2][281]},{"locale":"bm-Nkoo","date":b[4][18],"number":b[2][183]},{"locale":"bn","date":b[4][26],"number":b[2][295]},{"locale":"bn-BD","date":b[4][26],"number":b[2][295]},{"locale":"bn-IN","date":b[4][26],"number":b[2][295]},{"locale":"bo","date":b[4][27],"number":b[2][309]},{"locale":"bo-CN","date":b[4][27],"number":b[2][309]},{"locale":"bo-IN","date":b[4][27],"number":b[2][310]},{"locale":"br","date":b[4][28],"number":b[2][324]},{"locale":"br-FR","date":b[4][28],"number":b[2][324]},{"locale":"brx","date":b[4][29],"number":b[2][338]},{"locale":"brx-IN","date":b[4][29],"number":b[2][338]},{"locale":"bs","date":b[4][30],"number":b[2][352]},{"locale":"bs-Cyrl","date":b[4][31],"number":b[2][366]},{"locale":"bs-Cyrl-BA","date":b[4][31],"number":b[2][366]},{"locale":"bs-Latn","date":b[4][30],"number":b[2][352]},{"locale":"bs-Latn-BA","date":b[4][30],"number":b[2][352]},{"locale":"ca","date":b[4][32],"number":b[2][380]},{"locale":"ca-AD","date":b[4][32],"number":b[2][380]},{"locale":"ca-ES","date":b[4][32],"number":b[2][380]},{"locale":"ca-ES-VALENCIA","date":b[4][32],"number":b[2][380]},{"locale":"ca-FR","date":b[4][32],"number":b[2][381]},{"locale":"ca-IT","date":b[4][32],"number":b[2][380]},{"locale":"ce","date":b[4][33],"number":b[2][395]},{"locale":"ce-RU","date":b[4][33],"number":b[2][395]},{"locale":"cgg","date":b[4][34],"number":b[2][409]},{"locale":"cgg-UG","date":b[4][34],"number":b[2][409]},{"locale":"chr","date":b[4][35],"number":b[2][423]},{"locale":"chr-US","date":b[4][35],"number":b[2][423]},{"locale":"ckb","date":b[4][18],"number":b[2][424]},{"locale":"ckb-IQ","date":b[4][18],"number":b[2][424]},{"locale":"ckb-IR","date":b[4][18],"number":b[2][424]},{"locale":"cs","date":b[4][36],"number":b[2][438]},{"locale":"cs-CZ","date":b[4][36],"number":b[2][438]},{"locale":"cu","date":b[4][18],"number":b[2][439]},{"locale":"cu-RU","date":b[4][18],"number":b[2][439]},{"locale":"cy","date":b[4][37],"number":b[2][453]},{"locale":"cy-GB","date":b[4][37],"number":b[2][453]},{"locale":"da","date":b[4][38],"number":b[2][467]},{"locale":"da-DK","date":b[4][38],"number":b[2][467]},{"locale":"da-GL","date":b[4][39],"number":b[2][467]},{"locale":"dav","date":b[4][40],"number":b[2][481]},{"locale":"dav-KE","date":b[4][40],"number":b[2][481]},{"locale":"de","date":b[4][41],"number":b[2][495]},{"locale":"de-AT","date":b[4][42],"number":b[2][500]},{"locale":"de-BE","date":b[4][41],"number":b[2][495]},{"locale":"de-CH","date":b[4][41],"number":b[2][501]},{"locale":"de-DE","date":b[4][41],"number":b[2][495]},{"locale":"de-LI","date":b[4][41],"number":b[2][502]},{"locale":"de-LU","date":b[4][41],"number":b[2][503]},{"locale":"dje","date":b[4][43],"number":b[2][517]},{"locale":"dje-NE","date":b[4][43],"number":b[2][517]},{"locale":"dsb","date":b[4][44],"number":b[2][531]},{"locale":"dsb-DE","date":b[4][44],"number":b[2][531]},{"locale":"dua","date":b[4][45],"number":b[2][211]},{"locale":"dua-CM","date":b[4][45],"number":b[2][211]},{"locale":"dyo","date":b[4][46],"number":b[2][558]},{"locale":"dyo-SN","date":b[4][46],"number":b[2][558]},{"locale":"dz","date":b[4][47],"number":b[2][572]},{"locale":"dz-BT","date":b[4][47],"number":b[2][572]},{"locale":"ebu","date":b[4][48],"number":b[2][481]},{"locale":"ebu-KE","date":b[4][48],"number":b[2][481]},{"locale":"ee","date":b[4][49],"number":b[2][599]},{"locale":"ee-GH","date":b[4][49],"number":b[2][599]},{"locale":"ee-TG","date":b[4][50],"number":b[2][599]},{"locale":"el","date":b[4][51],"number":b[2][613]},{"locale":"el-CY","date":b[4][51],"number":b[2][613]},{"locale":"el-GR","date":b[4][51],"number":b[2][613]},{"locale":"en-001","date":b[4][52],"number":b[2][281]},{"locale":"en-150","date":b[4][53],"number":b[2][614]},{"locale":"en-AG","date":b[4][52],"number":b[2][615]},{"locale":"en-AI","date":b[4][53],"number":b[2][615]},{"locale":"en-AS","date":b[4][0],"number":b[2][13]},{"locale":"en-AT","date":b[4][53],"number":b[2][616]},{"locale":"en-AU","date":b[4][54],"number":b[2][630]},{"locale":"en-BB","date":b[4][52],"number":b[2][631]},{"locale":"en-BE","date":b[4][55],"number":b[2][614]},{"locale":"en-BI","date":b[4][0],"number":b[2][632]},{"locale":"en-BM","date":b[4][52],"number":b[2][633]},{"locale":"en-BS","date":b[4][52],"number":b[2][634]},{"locale":"en-BW","date":b[4][56],"number":b[2][635]},{"locale":"en-BZ","date":b[4][57],"number":b[2][636]},{"locale":"en-CA","date":b[4][58],"number":b[2][637]},{"locale":"en-CC","date":b[4][53],"number":b[2][638]},{"locale":"en-CH","date":b[4][53],"number":b[2][639]},{"locale":"en-CK","date":b[4][53],"number":b[2][640]},{"locale":"en-CM","date":b[4][53],"number":b[2][281]},{"locale":"en-CX","date":b[4][53],"number":b[2][638]},{"locale":"en-CY","date":b[4][52],"number":b[2][281]},{"locale":"en-DE","date":b[4][53],"number":b[2][641]},{"locale":"en-DG","date":b[4][53],"number":b[2][281]},{"locale":"en-DK","date":b[4][59],"number":b[2][642]},{"locale":"en-DM","date":b[4][52],"number":b[2][615]},{"locale":"en-Dsrt","date":b[4][18],"number":b[2][183]},{"locale":"en-ER","date":b[4][52],"number":b[2][643]},{"locale":"en-FI","date":b[4][60],"number":b[2][211]},{"locale":"en-FJ","date":b[4][52],"number":b[2][644]},{"locale":"en-FK","date":b[4][53],"number":b[2][645]},{"locale":"en-FM","date":b[4][52],"number":b[2][281]},{"locale":"en-GB","date":b[4][61],"number":b[2][281]},{"locale":"en-GD","date":b[4][52],"number":b[2][615]},{"locale":"en-GG","date":b[4][53],"number":b[2][281]},{"locale":"en-GH","date":b[4][52],"number":b[2][56]},{"locale":"en-GI","date":b[4][53],"number":b[2][659]},{"locale":"en-GM","date":b[4][52],"number":b[2][660]},{"locale":"en-GU","date":b[4][0],"number":b[2][13]},{"locale":"en-GY","date":b[4][52],"number":b[2][661]},{"locale":"en-HK","date":b[4][62],"number":b[2][281]},{"locale":"en-IE","date":b[4][63],"number":b[2][281]},{"locale":"en-IL","date":b[4][64],"number":b[2][281]},{"locale":"en-IM","date":b[4][53],"number":b[2][281]},{"locale":"en-IN","date":b[4][65],"number":b[2][675]},{"locale":"en-IO","date":b[4][53],"number":b[2][281]},{"locale":"en-JE","date":b[4][53],"number":b[2][281]},{"locale":"en-JM","date":b[4][52],"number":b[2][676]},{"locale":"en-KE","date":b[4][53],"number":b[2][481]},{"locale":"en-KI","date":b[4][52],"number":b[2][638]},{"locale":"en-KN","date":b[4][52],"number":b[2][615]},{"locale":"en-KY","date":b[4][52],"number":b[2][677]},{"locale":"en-LC","date":b[4][52],"number":b[2][615]},{"locale":"en-LR","date":b[4][52],"number":b[2][678]},{"locale":"en-LS","date":b[4][52],"number":b[2][679]},{"locale":"en-MG","date":b[4][53],"number":b[2][680]},{"locale":"en-MH","date":b[4][0],"number":b[2][13]},{"locale":"en-MO","date":b[4][52],"number":b[2][681]},{"locale":"en-MP","date":b[4][0],"number":b[2][13]},{"locale":"en-MS","date":b[4][53],"number":b[2][615]},{"locale":"en-MT","date":b[4][66],"number":b[2][682]},{"locale":"en-MU","date":b[4][53],"number":b[2][683]},{"locale":"en-MW","date":b[4][52],"number":b[2][684]},{"locale":"en-MY","date":b[4][52],"number":b[2][685]},{"locale":"en-NA","date":b[4][52],"number":b[2][686]},{"locale":"en-NF","date":b[4][53],"number":b[2][638]},{"locale":"en-NG","date":b[4][52],"number":b[2][687]},{"locale":"en-NL","date":b[4][53],"number":b[2][688]},{"locale":"en-NR","date":b[4][53],"number":b[2][638]},{"locale":"en-NU","date":b[4][53],"number":b[2][640]},{"locale":"en-NZ","date":b[4][67],"number":b[2][640]},{"locale":"en-PG","date":b[4][52],"number":b[2][689]},{"locale":"en-PH","date":b[4][52],"number":b[2][690]},{"locale":"en-PK","date":b[4][68],"number":b[2][691]},{"locale":"en-PN","date":b[4][53],"number":b[2][640]},{"locale":"en-PR","date":b[4][0],"number":b[2][13]},{"locale":"en-PW","date":b[4][52],"number":b[2][281]},{"locale":"en-RW","date":b[4][53],"number":b[2][692]},{"locale":"en-SB","date":b[4][52],"number":b[2][693]},{"locale":"en-SC","date":b[4][53],"number":b[2][694]},{"locale":"en-SD","date":b[4][52],"number":b[2][281]},{"locale":"en-SE","date":b[4][69],"number":b[2][695]},{"locale":"en-SG","date":b[4][70],"number":b[2][696]},{"locale":"en-SH","date":b[4][53],"number":b[2][697]},{"locale":"en-SI","date":b[4][53],"number":b[2][614]},{"locale":"en-SL","date":b[4][52],"number":b[2][698]},{"locale":"en-SS","date":b[4][52],"number":b[2][699]},{"locale":"en-SX","date":b[4][53],"number":b[2][700]},{"locale":"en-SZ","date":b[4][52],"number":b[2][701]},{"locale":"en-Shaw","date":b[4][18],"number":b[2][183]},{"locale":"en-TC","date":b[4][52],"number":b[2][281]},{"locale":"en-TK","date":b[4][53],"number":b[2][640]},{"locale":"en-TO","date":b[4][52],"number":b[2][702]},{"locale":"en-TT","date":b[4][52],"number":b[2][703]},{"locale":"en-TV","date":b[4][53],"number":b[2][638]},{"locale":"en-TZ","date":b[4][53],"number":b[2][704]},{"locale":"en-UG","date":b[4][53],"number":b[2][409]},{"locale":"en-UM","date":b[4][0],"number":b[2][13]},{"locale":"en-US","date":b[4][0],"number":b[2][13]},{"locale":"en-VC","date":b[4][52],"number":b[2][615]},{"locale":"en-VG","date":b[4][52],"number":b[2][281]},{"locale":"en-VI","date":b[4][0],"number":b[2][13]},{"locale":"en-VU","date":b[4][52],"number":b[2][705]},{"locale":"en-WS","date":b[4][52],"number":b[2][706]},{"locale":"en-ZA","date":b[4][71],"number":b[2][707]},{"locale":"en-ZM","date":b[4][52],"number":b[2][239]},{"locale":"en-ZW","date":b[4][72],"number":b[2][281]},{"locale":"eo","date":b[4][73],"number":b[2][721]},{"locale":"eo-001","date":b[4][73],"number":b[2][721]},{"locale":"es","date":b[4][74],"number":b[2][735]},{"locale":"es-419","date":b[4][75],"number":b[2][749]},{"locale":"es-AR","date":b[4][76],"number":b[2][750]},{"locale":"es-BO","date":b[4][75],"number":b[2][751]},{"locale":"es-CL","date":b[4][77],"number":b[2][752]},{"locale":"es-CO","date":b[4][78],"number":b[2][753]},{"locale":"es-CR","date":b[4][75],"number":b[2][754]},{"locale":"es-CU","date":b[4][75],"number":b[2][755]},{"locale":"es-DO","date":b[4][79],"number":b[2][757]},{"locale":"es-EA","date":b[4][74],"number":b[2][735]},{"locale":"es-EC","date":b[4][75],"number":b[2][758]},{"locale":"es-ES","date":b[4][74],"number":b[2][735]},{"locale":"es-GQ","date":b[4][74],"number":b[2][759]},{"locale":"es-GT","date":b[4][80],"number":b[2][760]},{"locale":"es-HN","date":b[4][81],"number":b[2][761]},{"locale":"es-IC","date":b[4][74],"number":b[2][735]},{"locale":"es-MX","date":b[4][82],"number":b[2][775]},{"locale":"es-NI","date":b[4][75],"number":b[2][776]},{"locale":"es-PA","date":b[4][83],"number":b[2][781]},{"locale":"es-PE","date":b[4][84],"number":b[2][786]},{"locale":"es-PH","date":b[4][85],"number":b[2][787]},{"locale":"es-PR","date":b[4][86],"number":b[2][788]},{"locale":"es-PY","date":b[4][87],"number":b[2][793]},{"locale":"es-SV","date":b[4][75],"number":b[2][788]},{"locale":"es-US","date":b[4][88],"number":b[2][807]},{"locale":"es-UY","date":b[4][89],"number":b[2][808]},{"locale":"es-VE","date":b[4][90],"number":b[2][822]},{"locale":"et","date":b[4][91],"number":b[2][836]},{"locale":"et-EE","date":b[4][91],"number":b[2][836]},{"locale":"eu","date":b[4][92],"number":b[2][850]},{"locale":"eu-ES","date":b[4][92],"number":b[2][850]},{"locale":"ewo","date":b[4][93],"number":b[2][558]},{"locale":"ewo-CM","date":b[4][93],"number":b[2][558]},{"locale":"fa","date":b[4][94],"number":b[2][877]},{"locale":"fa-AF","date":b[4][95],"number":b[2][877]},{"locale":"fa-IR","date":b[4][94],"number":b[2][877]},{"locale":"ff","date":b[4][96],"number":b[2][558]},{"locale":"ff-CM","date":b[4][96],"number":b[2][558]},{"locale":"ff-GN","date":b[4][96],"number":b[2][896]},{"locale":"ff-MR","date":b[4][97],"number":b[2][897]},{"locale":"ff-SN","date":b[4][96],"number":b[2][558]},{"locale":"fi","date":b[4][98],"number":b[2][911]},{"locale":"fi-FI","date":b[4][98],"number":b[2][911]},{"locale":"fil","date":b[4][99],"number":b[2][925]},{"locale":"fil-PH","date":b[4][99],"number":b[2][925]},{"locale":"fo","date":b[4][100],"number":b[2][939]},{"locale":"fo-DK","date":b[4][100],"number":b[2][940]},{"locale":"fo-FO","date":b[4][100],"number":b[2][939]},{"locale":"fr","date":b[4][101],"number":b[2][954]},{"locale":"fr-BE","date":b[4][102],"number":b[2][955]},{"locale":"fr-BF","date":b[4][101],"number":b[2][954]},{"locale":"fr-BI","date":b[4][101],"number":b[2][956]},{"locale":"fr-BJ","date":b[4][101],"number":b[2][954]},{"locale":"fr-BL","date":b[4][101],"number":b[2][954]},{"locale":"fr-CA","date":b[4][103],"number":b[2][957]},{"locale":"fr-CD","date":b[4][101],"number":b[2][958]},{"locale":"fr-CF","date":b[4][101],"number":b[2][954]},{"locale":"fr-CG","date":b[4][101],"number":b[2][954]},{"locale":"fr-CH","date":b[4][104],"number":b[2][959]},{"locale":"fr-CI","date":b[4][101],"number":b[2][954]},{"locale":"fr-CM","date":b[4][101],"number":b[2][954]},{"locale":"fr-DJ","date":b[4][105],"number":b[2][960]},{"locale":"fr-DZ","date":b[4][105],"number":b[2][961]},{"locale":"fr-FR","date":b[4][101],"number":b[2][954]},{"locale":"fr-GA","date":b[4][101],"number":b[2][954]},{"locale":"fr-GF","date":b[4][101],"number":b[2][954]},{"locale":"fr-GN","date":b[4][101],"number":b[2][962]},{"locale":"fr-GP","date":b[4][101],"number":b[2][954]},{"locale":"fr-GQ","date":b[4][101],"number":b[2][954]},{"locale":"fr-HT","date":b[4][101],"number":b[2][963]},{"locale":"fr-KM","date":b[4][101],"number":b[2][964]},{"locale":"fr-LU","date":b[4][101],"number":b[2][965]},{"locale":"fr-MA","date":b[4][106],"number":b[2][955]},{"locale":"fr-MC","date":b[4][101],"number":b[2][954]},{"locale":"fr-MF","date":b[4][101],"number":b[2][954]},{"locale":"fr-MG","date":b[4][101],"number":b[2][979]},{"locale":"fr-ML","date":b[4][101],"number":b[2][954]},{"locale":"fr-MQ","date":b[4][101],"number":b[2][954]},{"locale":"fr-MR","date":b[4][105],"number":b[2][980]},{"locale":"fr-MU","date":b[4][101],"number":b[2][981]},{"locale":"fr-NC","date":b[4][101],"number":b[2][954]},{"locale":"fr-NE","date":b[4][101],"number":b[2][954]},{"locale":"fr-PF","date":b[4][101],"number":b[2][954]},{"locale":"fr-PM","date":b[4][101],"number":b[2][954]},{"locale":"fr-RE","date":b[4][101],"number":b[2][954]},{"locale":"fr-RW","date":b[4][101],"number":b[2][982]},{"locale":"fr-SC","date":b[4][101],"number":b[2][983]},{"locale":"fr-SN","date":b[4][101],"number":b[2][954]},{"locale":"fr-SY","date":b[4][105],"number":b[2][984]},{"locale":"fr-TD","date":b[4][105],"number":b[2][954]},{"locale":"fr-TG","date":b[4][101],"number":b[2][954]},{"locale":"fr-TN","date":b[4][105],"number":b[2][985]},{"locale":"fr-VU","date":b[4][105],"number":b[2][986]},{"locale":"fr-WF","date":b[4][101],"number":b[2][954]},{"locale":"fr-YT","date":b[4][101],"number":b[2][954]},{"locale":"fur","date":b[4][107],"number":b[2][1000]},{"locale":"fur-IT","date":b[4][107],"number":b[2][1000]},{"locale":"fy","date":b[4][108],"number":b[2][1014]},{"locale":"fy-NL","date":b[4][108],"number":b[2][1014]},{"locale":"ga","date":b[4][109],"number":b[2][1028]},{"locale":"ga-IE","date":b[4][109],"number":b[2][1028]},{"locale":"gd","date":b[4][110],"number":b[2][1042]},{"locale":"gd-GB","date":b[4][110],"number":b[2][1042]},{"locale":"gl","date":b[4][111],"number":b[2][1056]},{"locale":"gl-ES","date":b[4][111],"number":b[2][1056]},{"locale":"gsw","date":b[4][112],"number":b[2][1070]},{"locale":"gsw-CH","date":b[4][112],"number":b[2][1070]},{"locale":"gsw-FR","date":b[4][112],"number":b[2][1070]},{"locale":"gsw-LI","date":b[4][112],"number":b[2][1070]},{"locale":"gu","date":b[4][113],"number":b[2][1084]},{"locale":"gu-IN","date":b[4][113],"number":b[2][1084]},{"locale":"guz","date":b[4][114],"number":b[2][481]},{"locale":"guz-KE","date":b[4][114],"number":b[2][481]},{"locale":"gv","date":b[4][115],"number":b[2][281]},{"locale":"gv-IM","date":b[4][115],"number":b[2][281]},{"locale":"ha","date":b[4][116],"number":b[2][1124]},{"locale":"ha-Arab","date":b[4][18],"number":b[2][183]},{"locale":"ha-GH","date":b[4][116],"number":b[2][1125]},{"locale":"ha-NE","date":b[4][117],"number":b[2][1124]},{"locale":"ha-NG","date":b[4][116],"number":b[2][1124]},{"locale":"haw","date":b[4][118],"number":b[2][423]},{"locale":"haw-US","date":b[4][118],"number":b[2][423]},{"locale":"he","date":b[4][119],"number":b[2][1153]},{"locale":"he-IL","date":b[4][119],"number":b[2][1153]},{"locale":"hi","date":b[4][120],"number":b[2][1167]},{"locale":"hi-IN","date":b[4][120],"number":b[2][1167]},{"locale":"hr","date":b[4][121],"number":b[2][1181]},{"locale":"hr-BA","date":b[4][121],"number":b[2][1182]},{"locale":"hr-HR","date":b[4][121],"number":b[2][1181]},{"locale":"hsb","date":b[4][122],"number":b[2][531]},{"locale":"hsb-DE","date":b[4][122],"number":b[2][531]},{"locale":"hu","date":b[4][123],"number":b[2][1209]},{"locale":"hu-HU","date":b[4][123],"number":b[2][1209]},{"locale":"hy","date":b[4][124],"number":b[2][1223]},{"locale":"hy-AM","date":b[4][124],"number":b[2][1223]},{"locale":"id","date":b[4][125],"number":b[2][1237]},{"locale":"id-ID","date":b[4][125],"number":b[2][1237]},{"locale":"ig","date":b[4][126],"number":b[2][687]},{"locale":"ig-NG","date":b[4][126],"number":b[2][687]},{"locale":"ii","date":b[4][127],"number":b[2][1264]},{"locale":"ii-CN","date":b[4][127],"number":b[2][1264]},{"locale":"is","date":b[4][128],"number":b[2][1278]},{"locale":"is-IS","date":b[4][128],"number":b[2][1278]},{"locale":"it","date":b[4][129],"number":b[2][1292]},{"locale":"it-CH","date":b[4][130],"number":b[2][1293]},{"locale":"it-IT","date":b[4][129],"number":b[2][1292]},{"locale":"it-SM","date":b[4][129],"number":b[2][1292]},{"locale":"iu-Latn","date":b[4][18],"number":b[2][183]},{"locale":"ja","date":b[4][131],"number":b[2][1307]},{"locale":"ja-JP","date":b[4][131],"number":b[2][1307]},{"locale":"jgo","date":b[4][132],"number":b[2][1000]},{"locale":"jgo-CM","date":b[4][132],"number":b[2][1000]},{"locale":"jmc","date":b[4][133],"number":b[2][704]},{"locale":"jmc-TZ","date":b[4][133],"number":b[2][704]},{"locale":"ka","date":b[4][134],"number":b[2][1347]},{"locale":"ka-GE","date":b[4][134],"number":b[2][1347]},{"locale":"kab","date":b[4][135],"number":b[2][1361]},{"locale":"kab-DZ","date":b[4][135],"number":b[2][1361]},{"locale":"kam","date":b[4][136],"number":b[2][481]},{"locale":"kam-KE","date":b[4][136],"number":b[2][481]},{"locale":"kde","date":b[4][137],"number":b[2][704]},{"locale":"kde-TZ","date":b[4][137],"number":b[2][704]},{"locale":"kea","date":b[4][138],"number":b[2][1401]},{"locale":"kea-CV","date":b[4][138],"number":b[2][1401]},{"locale":"khq","date":b[4][139],"number":b[2][517]},{"locale":"khq-ML","date":b[4][139],"number":b[2][517]},{"locale":"ki","date":b[4][140],"number":b[2][481]},{"locale":"ki-KE","date":b[4][140],"number":b[2][481]},{"locale":"kk","date":b[4][141],"number":b[2][1441]},{"locale":"kk-KZ","date":b[4][141],"number":b[2][1441]},{"locale":"kkj","date":b[4][142],"number":b[2][1000]},{"locale":"kkj-CM","date":b[4][142],"number":b[2][1000]},{"locale":"kl","date":b[4][143],"number":b[2][1468]},{"locale":"kl-GL","date":b[4][143],"number":b[2][1468]},{"locale":"kln","date":b[4][144],"number":b[2][481]},{"locale":"kln-KE","date":b[4][144],"number":b[2][481]},{"locale":"km","date":b[4][145],"number":b[2][1495]},{"locale":"km-KH","date":b[4][145],"number":b[2][1495]},{"locale":"kn","date":b[4][146],"number":b[2][1509]},{"locale":"kn-IN","date":b[4][146],"number":b[2][1509]},{"locale":"ko","date":b[4][147],"number":b[2][1523]},{"locale":"ko-KP","date":b[4][147],"number":b[2][1523]},{"locale":"ko-KR","date":b[4][147],"number":b[2][1523]},{"locale":"kok","date":b[4][148],"number":b[2][338]},{"locale":"kok-IN","date":b[4][148],"number":b[2][338]},{"locale":"ks","date":b[4][149],"number":b[2][1550]},{"locale":"ks-IN","date":b[4][149],"number":b[2][1550]},{"locale":"ksb","date":b[4][150],"number":b[2][253]},{"locale":"ksb-TZ","date":b[4][150],"number":b[2][253]},{"locale":"ksf","date":b[4][151],"number":b[2][558]},{"locale":"ksf-CM","date":b[4][151],"number":b[2][558]},{"locale":"ksh","date":b[4][152],"number":b[2][1590]},{"locale":"ksh-DE","date":b[4][152],"number":b[2][1590]},{"locale":"kw","date":b[4][153],"number":b[2][281]},{"locale":"kw-GB","date":b[4][153],"number":b[2][281]},{"locale":"ky","date":b[4][154],"number":b[2][1617]},{"locale":"ky-KG","date":b[4][154],"number":b[2][1617]},{"locale":"lag","date":b[4][155],"number":b[2][1631]},{"locale":"lag-TZ","date":b[4][155],"number":b[2][1631]},{"locale":"lb","date":b[4][156],"number":b[2][1645]},{"locale":"lb-LU","date":b[4][156],"number":b[2][1645]},{"locale":"lg","date":b[4][157],"number":b[2][1659]},{"locale":"lg-UG","date":b[4][157],"number":b[2][1659]},{"locale":"lkt","date":b[4][158],"number":b[2][1673]},{"locale":"lkt-US","date":b[4][158],"number":b[2][1673]},{"locale":"ln","date":b[4][159],"number":b[2][1687]},{"locale":"ln-AO","date":b[4][159],"number":b[2][1688]},{"locale":"ln-CD","date":b[4][159],"number":b[2][1687]},{"locale":"ln-CF","date":b[4][159],"number":b[2][1687]},{"locale":"ln-CG","date":b[4][159],"number":b[2][1687]},{"locale":"lo","date":b[4][160],"number":b[2][1702]},{"locale":"lo-LA","date":b[4][160],"number":b[2][1702]},{"locale":"lrc","date":b[4][161],"number":b[2][1707]},{"locale":"lrc-IQ","date":b[4][162],"number":b[2][1707]},{"locale":"lrc-IR","date":b[4][161],"number":b[2][1707]},{"locale":"lt","date":b[4][163],"number":b[2][1721]},{"locale":"lt-LT","date":b[4][163],"number":b[2][1721]},{"locale":"lu","date":b[4][164],"number":b[2][1735]},{"locale":"lu-CD","date":b[4][164],"number":b[2][1735]},{"locale":"luo","date":b[4][165],"number":b[2][1749]},{"locale":"luo-KE","date":b[4][165],"number":b[2][1749]},{"locale":"luy","date":b[4][166],"number":b[2][1763]},{"locale":"luy-KE","date":b[4][166],"number":b[2][1763]},{"locale":"lv","date":b[4][167],"number":b[2][1777]},{"locale":"lv-LV","date":b[4][167],"number":b[2][1777]},{"locale":"mas","date":b[4][168],"number":b[2][481]},{"locale":"mas-KE","date":b[4][168],"number":b[2][481]},{"locale":"mas-TZ","date":b[4][168],"number":b[2][1791]},{"locale":"mer","date":b[4][169],"number":b[2][481]},{"locale":"mer-KE","date":b[4][169],"number":b[2][481]},{"locale":"mfe","date":b[4][170],"number":b[2][1818]},{"locale":"mfe-MU","date":b[4][170],"number":b[2][1818]},{"locale":"mg","date":b[4][171],"number":b[2][680]},{"locale":"mg-MG","date":b[4][171],"number":b[2][680]},{"locale":"mgh","date":b[4][172],"number":b[2][1845]},{"locale":"mgh-MZ","date":b[4][172],"number":b[2][1845]},{"locale":"mgo","date":b[4][173],"number":b[2][183]},{"locale":"mgo-CM","date":b[4][173],"number":b[2][183]},{"locale":"mk","date":b[4][174],"number":b[2][1872]},{"locale":"mk-MK","date":b[4][174],"number":b[2][1872]},{"locale":"ml","date":b[4][175],"number":b[2][1886]},{"locale":"ml-IN","date":b[4][175],"number":b[2][1886]},{"locale":"mn","date":b[4][176],"number":b[2][1900]},{"locale":"mn-MN","date":b[4][176],"number":b[2][1900]},{"locale":"mn-Mong","date":b[4][18],"number":b[2][183]},{"locale":"mr","date":b[4][177],"number":b[2][1914]},{"locale":"mr-IN","date":b[4][177],"number":b[2][1914]},{"locale":"ms","date":b[4][178],"number":b[2][1928]},{"locale":"ms-Arab","date":b[4][18],"number":b[2][183]},{"locale":"ms-BN","date":b[4][179],"number":b[2][1929]},{"locale":"ms-MY","date":b[4][178],"number":b[2][1928]},{"locale":"ms-SG","date":b[4][178],"number":b[2][1930]},{"locale":"mt","date":b[4][180],"number":b[2][281]},{"locale":"mt-MT","date":b[4][180],"number":b[2][281]},{"locale":"mua","date":b[4][181],"number":b[2][1957]},{"locale":"mua-CM","date":b[4][181],"number":b[2][1957]},{"locale":"my","date":b[4][182],"number":b[2][1971]},{"locale":"my-MM","date":b[4][182],"number":b[2][1971]},{"locale":"mzn","date":b[4][183],"number":b[2][1976]},{"locale":"mzn-IR","date":b[4][183],"number":b[2][1976]},{"locale":"naq","date":b[4][184],"number":b[2][686]},{"locale":"naq-NA","date":b[4][184],"number":b[2][686]},{"locale":"nb","date":b[4][185],"number":b[2][2003]},{"locale":"nb-NO","date":b[4][185],"number":b[2][2003]},{"locale":"nb-SJ","date":b[4][185],"number":b[2][2003]},{"locale":"nd","date":b[4][186],"number":b[2][281]},{"locale":"nd-ZW","date":b[4][186],"number":b[2][281]},{"locale":"ne","date":b[4][187],"number":b[2][2030]},{"locale":"ne-IN","date":b[4][188],"number":b[2][2030]},{"locale":"ne-NP","date":b[4][187],"number":b[2][2030]},{"locale":"nl","date":b[4][189],"number":b[2][2044]},{"locale":"nl-AW","date":b[4][189],"number":b[2][2045]},{"locale":"nl-BE","date":b[4][190],"number":b[2][2046]},{"locale":"nl-BQ","date":b[4][189],"number":b[2][2047]},{"locale":"nl-CW","date":b[4][189],"number":b[2][2048]},{"locale":"nl-NL","date":b[4][189],"number":b[2][2044]},{"locale":"nl-SR","date":b[4][189],"number":b[2][2049]},{"locale":"nl-SX","date":b[4][189],"number":b[2][2048]},{"locale":"nmg","date":b[4][191],"number":b[2][558]},{"locale":"nmg-CM","date":b[4][191],"number":b[2][558]},{"locale":"nn","date":b[4][192],"number":b[2][2076]},{"locale":"nn-NO","date":b[4][192],"number":b[2][2076]},{"locale":"nnh","date":b[4][193],"number":b[2][1000]},{"locale":"nnh-CM","date":b[4][193],"number":b[2][1000]},{"locale":"nus","date":b[4][194],"number":b[2][699]},{"locale":"nus-SS","date":b[4][194],"number":b[2][699]},{"locale":"nyn","date":b[4][195],"number":b[2][409]},{"locale":"nyn-UG","date":b[4][195],"number":b[2][409]},{"locale":"om","date":b[4][196],"number":b[2][2116]},{"locale":"om-ET","date":b[4][196],"number":b[2][2116]},{"locale":"om-KE","date":b[4][197],"number":b[2][2117]},{"locale":"or","date":b[4][198],"number":b[2][2131]},{"locale":"or-IN","date":b[4][198],"number":b[2][2131]},{"locale":"os","date":b[4][199],"number":b[2][2145]},{"locale":"os-GE","date":b[4][199],"number":b[2][2145]},{"locale":"os-RU","date":b[4][199],"number":b[2][2146]},{"locale":"pa","date":b[4][200],"number":b[2][2160]},{"locale":"pa-Arab","date":b[4][201],"number":b[2][2174]},{"locale":"pa-Arab-PK","date":b[4][201],"number":b[2][2174]},{"locale":"pa-Guru","date":b[4][200],"number":b[2][2160]},{"locale":"pa-Guru-IN","date":b[4][200],"number":b[2][2160]},{"locale":"pl","date":b[4][202],"number":b[2][2188]},{"locale":"pl-PL","date":b[4][202],"number":b[2][2188]},{"locale":"prg","date":b[4][18],"number":b[2][183]},{"locale":"prg-001","date":b[4][18],"number":b[2][183]},{"locale":"ps","date":b[4][203],"number":b[2][2202]},{"locale":"ps-AF","date":b[4][203],"number":b[2][2202]},{"locale":"pt","date":b[4][204],"number":b[2][2216]},{"locale":"pt-AO","date":b[4][205],"number":b[2][2230]},{"locale":"pt-BR","date":b[4][204],"number":b[2][2216]},{"locale":"pt-CV","date":b[4][205],"number":b[2][2231]},{"locale":"pt-GW","date":b[4][205],"number":b[2][2232]},{"locale":"pt-MO","date":b[4][206],"number":b[2][2233]},{"locale":"pt-MZ","date":b[4][205],"number":b[2][2234]},{"locale":"pt-PT","date":b[4][205],"number":b[2][2232]},{"locale":"pt-ST","date":b[4][205],"number":b[2][2235]},{"locale":"pt-TL","date":b[4][205],"number":b[2][2232]},{"locale":"qu","date":b[4][207],"number":b[2][2249]},{"locale":"qu-BO","date":b[4][207],"number":b[2][2250]},{"locale":"qu-EC","date":b[4][207],"number":b[2][2251]},{"locale":"qu-PE","date":b[4][207],"number":b[2][2249]},{"locale":"rm","date":b[4][208],"number":b[2][2265]},{"locale":"rm-CH","date":b[4][208],"number":b[2][2265]},{"locale":"rn","date":b[4][209],"number":b[2][2279]},{"locale":"rn-BI","date":b[4][209],"number":b[2][2279]},{"locale":"ro","date":b[4][210],"number":b[2][2293]},{"locale":"ro-MD","date":b[4][211],"number":b[2][2307]},{"locale":"ro-RO","date":b[4][210],"number":b[2][2293]},{"locale":"rof","date":b[4][212],"number":b[2][704]},{"locale":"rof-TZ","date":b[4][212],"number":b[2][704]},{"locale":"root","date":b[4][18],"number":b[2][183]},{"locale":"ru","date":b[4][213],"number":b[2][2334]},{"locale":"ru-BY","date":b[4][213],"number":b[2][2335]},{"locale":"ru-KG","date":b[4][213],"number":b[2][2336]},{"locale":"ru-KZ","date":b[4][213],"number":b[2][2337]},{"locale":"ru-MD","date":b[4][213],"number":b[2][2338]},{"locale":"ru-RU","date":b[4][213],"number":b[2][2334]},{"locale":"ru-UA","date":b[4][214],"number":b[2][2334]},{"locale":"rw","date":b[4][215],"number":b[2][2352]},{"locale":"rw-RW","date":b[4][215],"number":b[2][2352]},{"locale":"rwk","date":b[4][133],"number":b[2][253]},{"locale":"rwk-TZ","date":b[4][133],"number":b[2][253]},{"locale":"sah","date":b[4][216],"number":b[2][439]},{"locale":"sah-RU","date":b[4][216],"number":b[2][439]},{"locale":"saq","date":b[4][217],"number":b[2][481]},{"locale":"saq-KE","date":b[4][217],"number":b[2][481]},{"locale":"sbp","date":b[4][218],"number":b[2][253]},{"locale":"sbp-TZ","date":b[4][218],"number":b[2][253]},{"locale":"se","date":b[4][219],"number":b[2][2405]},{"locale":"se-FI","date":b[4][219],"number":b[2][2405]},{"locale":"se-NO","date":b[4][219],"number":b[2][2405]},{"locale":"se-SE","date":b[4][219],"number":b[2][2406]},{"locale":"seh","date":b[4][220],"number":b[2][2420]},{"locale":"seh-MZ","date":b[4][220],"number":b[2][2420]},{"locale":"ses","date":b[4][221],"number":b[2][517]},{"locale":"ses-ML","date":b[4][221],"number":b[2][517]},{"locale":"sg","date":b[4][222],"number":b[2][2447]},{"locale":"sg-CF","date":b[4][222],"number":b[2][2447]},{"locale":"shi","date":b[4][223],"number":b[2][42]},{"locale":"shi-Latn","date":b[4][224],"number":b[2][42]},{"locale":"shi-Latn-MA","date":b[4][224],"number":b[2][42]},{"locale":"shi-Tfng","date":b[4][223],"number":b[2][42]},{"locale":"shi-Tfng-MA","date":b[4][223],"number":b[2][42]},{"locale":"si","date":b[4][225],"number":b[2][2487]},{"locale":"si-LK","date":b[4][225],"number":b[2][2487]},{"locale":"sk","date":b[4][226],"number":b[2][2501]},{"locale":"sk-SK","date":b[4][226],"number":b[2][2501]},{"locale":"sl","date":b[4][227],"number":b[2][2515]},{"locale":"sl-SI","date":b[4][227],"number":b[2][2515]},{"locale":"smn","date":b[4][228],"number":b[2][2529]},{"locale":"smn-FI","date":b[4][228],"number":b[2][2529]},{"locale":"sn","date":b[4][229],"number":b[2][281]},{"locale":"sn-ZW","date":b[4][229],"number":b[2][281]},{"locale":"so","date":b[4][230],"number":b[2][2556]},{"locale":"so-DJ","date":b[4][230],"number":b[2][2557]},{"locale":"so-ET","date":b[4][230],"number":b[2][2558]},{"locale":"so-KE","date":b[4][231],"number":b[2][2559]},{"locale":"so-SO","date":b[4][230],"number":b[2][2556]},{"locale":"sq","date":b[4][232],"number":b[2][2573]},{"locale":"sq-AL","date":b[4][232],"number":b[2][2573]},{"locale":"sq-MK","date":b[4][233],"number":b[2][2574]},{"locale":"sq-XK","date":b[4][233],"number":b[2][2573]},{"locale":"sr","date":b[4][234],"number":b[2][2588]},{"locale":"sr-Cyrl","date":b[4][234],"number":b[2][2588]},{"locale":"sr-Cyrl-BA","date":b[4][235],"number":b[2][2588]},{"locale":"sr-Cyrl-ME","date":b[4][234],"number":b[2][2588]},{"locale":"sr-Cyrl-RS","date":b[4][234],"number":b[2][2588]},{"locale":"sr-Cyrl-XK","date":b[4][234],"number":b[2][2588]},{"locale":"sr-Latn","date":b[4][236],"number":b[2][2602]},{"locale":"sr-Latn-BA","date":b[4][237],"number":b[2][2602]},{"locale":"sr-Latn-ME","date":b[4][236],"number":b[2][2602]},{"locale":"sr-Latn-RS","date":b[4][236],"number":b[2][2602]},{"locale":"sr-Latn-XK","date":b[4][236],"number":b[2][2602]},{"locale":"sv","date":b[4][238],"number":b[2][2616]},{"locale":"sv-AX","date":b[4][238],"number":b[2][2616]},{"locale":"sv-FI","date":b[4][239],"number":b[2][2616]},{"locale":"sv-SE","date":b[4][238],"number":b[2][2616]},{"locale":"sw","date":b[4][240],"number":b[2][2630]},{"locale":"sw-CD","date":b[4][241],"number":b[2][2644]},{"locale":"sw-KE","date":b[4][240],"number":b[2][2630]},{"locale":"sw-TZ","date":b[4][240],"number":b[2][2630]},{"locale":"sw-UG","date":b[4][240],"number":b[2][2645]},{"locale":"ta","date":b[4][242],"number":b[2][2659]},{"locale":"ta-IN","date":b[4][242],"number":b[2][2659]},{"locale":"ta-LK","date":b[4][243],"number":b[2][2660]},{"locale":"ta-MY","date":b[4][242],"number":b[2][2661]},{"locale":"ta-SG","date":b[4][242],"number":b[2][2662]},{"locale":"te","date":b[4][244],"number":b[2][2676]},{"locale":"te-IN","date":b[4][244],"number":b[2][2676]},{"locale":"teo","date":b[4][245],"number":b[2][409]},{"locale":"teo-KE","date":b[4][245],"number":b[2][2690]},{"locale":"teo-UG","date":b[4][245],"number":b[2][409]},{"locale":"th","date":b[4][246],"number":b[2][2704]},{"locale":"th-TH","date":b[4][246],"number":b[2][2704]},{"locale":"ti","date":b[4][247],"number":b[2][2116]},{"locale":"ti-ER","date":b[4][248],"number":b[2][2731]},{"locale":"ti-ET","date":b[4][247],"number":b[2][2116]},{"locale":"tk","date":b[4][249],"number":b[2][2745]},{"locale":"tk-TM","date":b[4][249],"number":b[2][2745]},{"locale":"to","date":b[4][250],"number":b[2][2759]},{"locale":"to-TO","date":b[4][250],"number":b[2][2759]},{"locale":"tr","date":b[4][251],"number":b[2][2773]},{"locale":"tr-CY","date":b[4][252],"number":b[2][2773]},{"locale":"tr-TR","date":b[4][251],"number":b[2][2773]},{"locale":"twq","date":b[4][253],"number":b[2][517]},{"locale":"twq-NE","date":b[4][253],"number":b[2][517]},{"locale":"tzm","date":b[4][254],"number":b[2][558]},{"locale":"tzm-MA","date":b[4][254],"number":b[2][558]},{"locale":"ug","date":b[4][255],"number":b[2][2813]},{"locale":"ug-CN","date":b[4][255],"number":b[2][2813]},{"locale":"uk","date":b[4][256],"number":b[2][2827]},{"locale":"uk-UA","date":b[4][256],"number":b[2][2827]},{"locale":"ur","date":b[4][257],"number":b[2][2841]},{"locale":"ur-IN","date":b[4][257],"number":b[2][2842]},{"locale":"ur-PK","date":b[4][257],"number":b[2][2841]},{"locale":"uz","date":b[4][258],"number":b[2][2856]},{"locale":"uz-Arab","date":b[4][259],"number":b[2][2870]},{"locale":"uz-Arab-AF","date":b[4][259],"number":b[2][2870]},{"locale":"uz-Cyrl","date":b[4][260],"number":b[2][2884]},{"locale":"uz-Cyrl-UZ","date":b[4][260],"number":b[2][2884]},{"locale":"uz-Latn","date":b[4][258],"number":b[2][2856]},{"locale":"uz-Latn-UZ","date":b[4][258],"number":b[2][2856]},{"locale":"vai","date":b[4][261],"number":b[2][2898]},{"locale":"vai-Latn","date":b[4][262],"number":b[2][2898]},{"locale":"vai-Latn-LR","date":b[4][262],"number":b[2][2898]},{"locale":"vai-Vaii","date":b[4][261],"number":b[2][2898]},{"locale":"vai-Vaii-LR","date":b[4][261],"number":b[2][2898]},{"locale":"vi","date":b[4][263],"number":b[2][2925]},{"locale":"vi-VN","date":b[4][263],"number":b[2][2925]},{"locale":"vo","date":b[4][18],"number":b[2][183]},{"locale":"vo-001","date":b[4][18],"number":b[2][183]},{"locale":"vun","date":b[4][133],"number":b[2][704]},{"locale":"vun-TZ","date":b[4][133],"number":b[2][704]},{"locale":"wae","date":b[4][264],"number":b[2][2939]},{"locale":"wae-CH","date":b[4][264],"number":b[2][2939]},{"locale":"xog","date":b[4][265],"number":b[2][2953]},{"locale":"xog-UG","date":b[4][265],"number":b[2][2953]},{"locale":"yav","date":b[4][266],"number":b[2][558]},{"locale":"yav-CM","date":b[4][266],"number":b[2][558]},{"locale":"yi","date":b[4][267],"number":b[2][183]},{"locale":"yi-001","date":b[4][267],"number":b[2][183]},{"locale":"yo","date":b[4][268],"number":b[2][687]},{"locale":"yo-BJ","date":b[4][269],"number":b[2][687]},{"locale":"yo-NG","date":b[4][268],"number":b[2][687]},{"locale":"zgh","date":b[4][270],"number":b[2][3019]},{"locale":"zgh-MA","date":b[4][270],"number":b[2][3019]},{"locale":"zh","date":b[4][271],"number":b[2][3032]},{"locale":"zh-Hans","date":b[4][271],"number":b[2][3032]},{"locale":"zh-Hans-CN","date":b[4][271],"number":b[2][3032]},{"locale":"zh-Hans-HK","date":b[4][272],"number":b[2][3033]},{"locale":"zh-Hans-MO","date":b[4][273],"number":b[2][3034]},{"locale":"zh-Hans-SG","date":b[4][274],"number":b[2][3035]},{"locale":"zh-Hant","date":b[4][275],"number":b[2][3049]},{"locale":"zh-Hant-HK","date":b[4][276],"number":b[2][3051]},{"locale":"zh-Hant-MO","date":b[4][276],"number":b[2][3052]},{"locale":"zh-Hant-TW","date":b[4][275],"number":b[2][3049]},{"locale":"zu","date":b[4][277],"number":b[2][3066]},{"locale":"zu-ZA","date":b[4][277],"number":b[2][3066]}];addLocaleData(b[5][0]);addLocaleData(b[5][1]);addLocaleData(b[5][2]);addLocaleData(b[5][3]);addLocaleData(b[5][4]);addLocaleData(b[5][5]);addLocaleData(b[5][6]);addLocaleData(b[5][7]);addLocaleData(b[5][8]);addLocaleData(b[5][9]);addLocaleData(b[5][10]);addLocaleData(b[5][11]);addLocaleData(b[5][12]);addLocaleData(b[5][13]);addLocaleData(b[5][14]);addLocaleData(b[5][15]);addLocaleData(b[5][16]);addLocaleData(b[5][17]);addLocaleData(b[5][18]);addLocaleData(b[5][19]);addLocaleData(b[5][20]);addLocaleData(b[5][21]);addLocaleData(b[5][22]);addLocaleData(b[5][23]);addLocaleData(b[5][24]);addLocaleData(b[5][25]);addLocaleData(b[5][26]);addLocaleData(b[5][27]);addLocaleData(b[5][28]);addLocaleData(b[5][29]);addLocaleData(b[5][30]);addLocaleData(b[5][31]);addLocaleData(b[5][32]);addLocaleData(b[5][33]);addLocaleData(b[5][34]);addLocaleData(b[5][35]);addLocaleData(b[5][36]);addLocaleData(b[5][37]);addLocaleData(b[5][38]);addLocaleData(b[5][39]);addLocaleData(b[5][40]);addLocaleData(b[5][41]);addLocaleData(b[5][42]);addLocaleData(b[5][43]);addLocaleData(b[5][44]);addLocaleData(b[5][45]);addLocaleData(b[5][46]);addLocaleData(b[5][47]);addLocaleData(b[5][48]);addLocaleData(b[5][49]);addLocaleData(b[5][50]);addLocaleData(b[5][51]);addLocaleData(b[5][52]);addLocaleData(b[5][53]);addLocaleData(b[5][54]);addLocaleData(b[5][55]);addLocaleData(b[5][56]);addLocaleData(b[5][57]);addLocaleData(b[5][58]);addLocaleData(b[5][59]);addLocaleData(b[5][60]);addLocaleData(b[5][61]);addLocaleData(b[5][62]);addLocaleData(b[5][63]);addLocaleData(b[5][64]);addLocaleData(b[5][65]);addLocaleData(b[5][66]);addLocaleData(b[5][67]);addLocaleData(b[5][68]);addLocaleData(b[5][69]);addLocaleData(b[5][70]);addLocaleData(b[5][71]);addLocaleData(b[5][72]);addLocaleData(b[5][73]);addLocaleData(b[5][74]);addLocaleData(b[5][75]);addLocaleData(b[5][76]);addLocaleData(b[5][77]);addLocaleData(b[5][78]);addLocaleData(b[5][79]);addLocaleData(b[5][80]);addLocaleData(b[5][81]);addLocaleData(b[5][82]);addLocaleData(b[5][83]);addLocaleData(b[5][84]);addLocaleData(b[5][85]);addLocaleData(b[5][86]);addLocaleData(b[5][87]);addLocaleData(b[5][88]);addLocaleData(b[5][89]);addLocaleData(b[5][90]);addLocaleData(b[5][91]);addLocaleData(b[5][92]);addLocaleData(b[5][93]);addLocaleData(b[5][94]);addLocaleData(b[5][95]);addLocaleData(b[5][96]);addLocaleData(b[5][97]);addLocaleData(b[5][98]);addLocaleData(b[5][99]);addLocaleData(b[5][100]);addLocaleData(b[5][101]);addLocaleData(b[5][102]);addLocaleData(b[5][103]);addLocaleData(b[5][104]);addLocaleData(b[5][105]);addLocaleData(b[5][106]);addLocaleData(b[5][107]);addLocaleData(b[5][108]);addLocaleData(b[5][109]);addLocaleData(b[5][110]);addLocaleData(b[5][111]);addLocaleData(b[5][112]);addLocaleData(b[5][113]);addLocaleData(b[5][114]);addLocaleData(b[5][115]);addLocaleData(b[5][116]);addLocaleData(b[5][117]);addLocaleData(b[5][118]);addLocaleData(b[5][119]);addLocaleData(b[5][120]);addLocaleData(b[5][121]);addLocaleData(b[5][122]);addLocaleData(b[5][123]);addLocaleData(b[5][124]);addLocaleData(b[5][125]);addLocaleData(b[5][126]);addLocaleData(b[5][127]);addLocaleData(b[5][128]);addLocaleData(b[5][129]);addLocaleData(b[5][130]);addLocaleData(b[5][131]);addLocaleData(b[5][132]);addLocaleData(b[5][133]);addLocaleData(b[5][134]);addLocaleData(b[5][135]);addLocaleData(b[5][136]);addLocaleData(b[5][137]);addLocaleData(b[5][138]);addLocaleData(b[5][139]);addLocaleData(b[5][140]);addLocaleData(b[5][141]);addLocaleData(b[5][142]);addLocaleData(b[5][143]);addLocaleData(b[5][144]);addLocaleData(b[5][145]);addLocaleData(b[5][146]);addLocaleData(b[5][147]);addLocaleData(b[5][148]);addLocaleData(b[5][149]);addLocaleData(b[5][150]);addLocaleData(b[5][151]);addLocaleData(b[5][152]);addLocaleData(b[5][153]);addLocaleData(b[5][154]);addLocaleData(b[5][155]);addLocaleData(b[5][156]);addLocaleData(b[5][157]);addLocaleData(b[5][158]);addLocaleData(b[5][159]);addLocaleData(b[5][160]);addLocaleData(b[5][161]);addLocaleData(b[5][162]);addLocaleData(b[5][163]);addLocaleData(b[5][164]);addLocaleData(b[5][165]);addLocaleData(b[5][166]);addLocaleData(b[5][167]);addLocaleData(b[5][168]);addLocaleData(b[5][169]);addLocaleData(b[5][170]);addLocaleData(b[5][171]);addLocaleData(b[5][172]);addLocaleData(b[5][173]);addLocaleData(b[5][174]);addLocaleData(b[5][175]);addLocaleData(b[5][176]);addLocaleData(b[5][177]);addLocaleData(b[5][178]);addLocaleData(b[5][179]);addLocaleData(b[5][180]);addLocaleData(b[5][181]);addLocaleData(b[5][182]);addLocaleData(b[5][183]);addLocaleData(b[5][184]);addLocaleData(b[5][185]);addLocaleData(b[5][186]);addLocaleData(b[5][187]);addLocaleData(b[5][188]);addLocaleData(b[5][189]);addLocaleData(b[5][190]);addLocaleData(b[5][191]);addLocaleData(b[5][192]);addLocaleData(b[5][193]);addLocaleData(b[5][194]);addLocaleData(b[5][195]);addLocaleData(b[5][196]);addLocaleData(b[5][197]);addLocaleData(b[5][198]);addLocaleData(b[5][199]);addLocaleData(b[5][200]);addLocaleData(b[5][201]);addLocaleData(b[5][202]);addLocaleData(b[5][203]);addLocaleData(b[5][204]);addLocaleData(b[5][205]);addLocaleData(b[5][206]);addLocaleData(b[5][207]);addLocaleData(b[5][208]);addLocaleData(b[5][209]);addLocaleData(b[5][210]);addLocaleData(b[5][211]);addLocaleData(b[5][212]);addLocaleData(b[5][213]);addLocaleData(b[5][214]);addLocaleData(b[5][215]);addLocaleData(b[5][216]);addLocaleData(b[5][217]);addLocaleData(b[5][218]);addLocaleData(b[5][219]);addLocaleData(b[5][220]);addLocaleData(b[5][221]);addLocaleData(b[5][222]);addLocaleData(b[5][223]);addLocaleData(b[5][224]);addLocaleData(b[5][225]);addLocaleData(b[5][226]);addLocaleData(b[5][227]);addLocaleData(b[5][228]);addLocaleData(b[5][229]);addLocaleData(b[5][230]);addLocaleData(b[5][231]);addLocaleData(b[5][232]);addLocaleData(b[5][233]);addLocaleData(b[5][234]);addLocaleData(b[5][235]);addLocaleData(b[5][236]);addLocaleData(b[5][237]);addLocaleData(b[5][238]);addLocaleData(b[5][239]);addLocaleData(b[5][240]);addLocaleData(b[5][241]);addLocaleData(b[5][242]);addLocaleData(b[5][243]);addLocaleData(b[5][244]);addLocaleData(b[5][245]);addLocaleData(b[5][246]);addLocaleData(b[5][247]);addLocaleData(b[5][248]);addLocaleData(b[5][249]);addLocaleData(b[5][250]);addLocaleData(b[5][251]);addLocaleData(b[5][252]);addLocaleData(b[5][253]);addLocaleData(b[5][254]);addLocaleData(b[5][255]);addLocaleData(b[5][256]);addLocaleData(b[5][257]);addLocaleData(b[5][258]);addLocaleData(b[5][259]);addLocaleData(b[5][260]);addLocaleData(b[5][261]);addLocaleData(b[5][262]);addLocaleData(b[5][263]);addLocaleData(b[5][264]);addLocaleData(b[5][265]);addLocaleData(b[5][266]);addLocaleData(b[5][267]);addLocaleData(b[5][268]);addLocaleData(b[5][269]);addLocaleData(b[5][270]);addLocaleData(b[5][271]);addLocaleData(b[5][272]);addLocaleData(b[5][273]);addLocaleData(b[5][274]);addLocaleData(b[5][275]);addLocaleData(b[5][276]);addLocaleData(b[5][277]);addLocaleData(b[5][278]);addLocaleData(b[5][279]);addLocaleData(b[5][280]);addLocaleData(b[5][281]);addLocaleData(b[5][282]);addLocaleData(b[5][283]);addLocaleData(b[5][284]);addLocaleData(b[5][285]);addLocaleData(b[5][286]);addLocaleData(b[5][287]);addLocaleData(b[5][288]);addLocaleData(b[5][289]);addLocaleData(b[5][290]);addLocaleData(b[5][291]);addLocaleData(b[5][292]);addLocaleData(b[5][293]);addLocaleData(b[5][294]);addLocaleData(b[5][295]);addLocaleData(b[5][296]);addLocaleData(b[5][297]);addLocaleData(b[5][298]);addLocaleData(b[5][299]);addLocaleData(b[5][300]);addLocaleData(b[5][301]);addLocaleData(b[5][302]);addLocaleData(b[5][303]);addLocaleData(b[5][304]);addLocaleData(b[5][305]);addLocaleData(b[5][306]);addLocaleData(b[5][307]);addLocaleData(b[5][308]);addLocaleData(b[5][309]);addLocaleData(b[5][310]);addLocaleData(b[5][311]);addLocaleData(b[5][312]);addLocaleData(b[5][313]);addLocaleData(b[5][314]);addLocaleData(b[5][315]);addLocaleData(b[5][316]);addLocaleData(b[5][317]);addLocaleData(b[5][318]);addLocaleData(b[5][319]);addLocaleData(b[5][320]);addLocaleData(b[5][321]);addLocaleData(b[5][322]);addLocaleData(b[5][323]);addLocaleData(b[5][324]);addLocaleData(b[5][325]);addLocaleData(b[5][326]);addLocaleData(b[5][327]);addLocaleData(b[5][328]);addLocaleData(b[5][329]);addLocaleData(b[5][330]);addLocaleData(b[5][331]);addLocaleData(b[5][332]);addLocaleData(b[5][333]);addLocaleData(b[5][334]);addLocaleData(b[5][335]);addLocaleData(b[5][336]);addLocaleData(b[5][337]);addLocaleData(b[5][338]);addLocaleData(b[5][339]);addLocaleData(b[5][340]);addLocaleData(b[5][341]);addLocaleData(b[5][342]);addLocaleData(b[5][343]);addLocaleData(b[5][344]);addLocaleData(b[5][345]);addLocaleData(b[5][346]);addLocaleData(b[5][347]);addLocaleData(b[5][348]);addLocaleData(b[5][349]);addLocaleData(b[5][350]);addLocaleData(b[5][351]);addLocaleData(b[5][352]);addLocaleData(b[5][353]);addLocaleData(b[5][354]);addLocaleData(b[5][355]);addLocaleData(b[5][356]);addLocaleData(b[5][357]);addLocaleData(b[5][358]);addLocaleData(b[5][359]);addLocaleData(b[5][360]);addLocaleData(b[5][361]);addLocaleData(b[5][362]);addLocaleData(b[5][363]);addLocaleData(b[5][364]);addLocaleData(b[5][365]);addLocaleData(b[5][366]);addLocaleData(b[5][367]);addLocaleData(b[5][368]);addLocaleData(b[5][369]);addLocaleData(b[5][370]);addLocaleData(b[5][371]);addLocaleData(b[5][372]);addLocaleData(b[5][373]);addLocaleData(b[5][374]);addLocaleData(b[5][375]);addLocaleData(b[5][376]);addLocaleData(b[5][377]);addLocaleData(b[5][378]);addLocaleData(b[5][379]);addLocaleData(b[5][380]);addLocaleData(b[5][381]);addLocaleData(b[5][382]);addLocaleData(b[5][383]);addLocaleData(b[5][384]);addLocaleData(b[5][385]);addLocaleData(b[5][386]);addLocaleData(b[5][387]);addLocaleData(b[5][388]);addLocaleData(b[5][389]);addLocaleData(b[5][390]);addLocaleData(b[5][391]);addLocaleData(b[5][392]);addLocaleData(b[5][393]);addLocaleData(b[5][394]);addLocaleData(b[5][395]);addLocaleData(b[5][396]);addLocaleData(b[5][397]);addLocaleData(b[5][398]);addLocaleData(b[5][399]);addLocaleData(b[5][400]);addLocaleData(b[5][401]);addLocaleData(b[5][402]);addLocaleData(b[5][403]);addLocaleData(b[5][404]);addLocaleData(b[5][405]);addLocaleData(b[5][406]);addLocaleData(b[5][407]);addLocaleData(b[5][408]);addLocaleData(b[5][409]);addLocaleData(b[5][410]);addLocaleData(b[5][411]);addLocaleData(b[5][412]);addLocaleData(b[5][413]);addLocaleData(b[5][414]);addLocaleData(b[5][415]);addLocaleData(b[5][416]);addLocaleData(b[5][417]);addLocaleData(b[5][418]);addLocaleData(b[5][419]);addLocaleData(b[5][420]);addLocaleData(b[5][421]);addLocaleData(b[5][422]);addLocaleData(b[5][423]);addLocaleData(b[5][424]);addLocaleData(b[5][425]);addLocaleData(b[5][426]);addLocaleData(b[5][427]);addLocaleData(b[5][428]);addLocaleData(b[5][429]);addLocaleData(b[5][430]);addLocaleData(b[5][431]);addLocaleData(b[5][432]);addLocaleData(b[5][433]);addLocaleData(b[5][434]);addLocaleData(b[5][435]);addLocaleData(b[5][436]);addLocaleData(b[5][437]);addLocaleData(b[5][438]);addLocaleData(b[5][439]);addLocaleData(b[5][440]);addLocaleData(b[5][441]);addLocaleData(b[5][442]);addLocaleData(b[5][443]);addLocaleData(b[5][444]);addLocaleData(b[5][445]);addLocaleData(b[5][446]);addLocaleData(b[5][447]);addLocaleData(b[5][448]);addLocaleData(b[5][449]);addLocaleData(b[5][450]);addLocaleData(b[5][451]);addLocaleData(b[5][452]);addLocaleData(b[5][453]);addLocaleData(b[5][454]);addLocaleData(b[5][455]);addLocaleData(b[5][456]);addLocaleData(b[5][457]);addLocaleData(b[5][458]);addLocaleData(b[5][459]);addLocaleData(b[5][460]);addLocaleData(b[5][461]);addLocaleData(b[5][462]);addLocaleData(b[5][463]);addLocaleData(b[5][464]);addLocaleData(b[5][465]);addLocaleData(b[5][466]);addLocaleData(b[5][467]);addLocaleData(b[5][468]);addLocaleData(b[5][469]);addLocaleData(b[5][470]);addLocaleData(b[5][471]);addLocaleData(b[5][472]);addLocaleData(b[5][473]);addLocaleData(b[5][474]);addLocaleData(b[5][475]);addLocaleData(b[5][476]);addLocaleData(b[5][477]);addLocaleData(b[5][478]);addLocaleData(b[5][479]);addLocaleData(b[5][480]);addLocaleData(b[5][481]);addLocaleData(b[5][482]);addLocaleData(b[5][483]);addLocaleData(b[5][484]);addLocaleData(b[5][485]);addLocaleData(b[5][486]);addLocaleData(b[5][487]);addLocaleData(b[5][488]);addLocaleData(b[5][489]);addLocaleData(b[5][490]);addLocaleData(b[5][491]);addLocaleData(b[5][492]);addLocaleData(b[5][493]);addLocaleData(b[5][494]);addLocaleData(b[5][495]);addLocaleData(b[5][496]);addLocaleData(b[5][497]);addLocaleData(b[5][498]);addLocaleData(b[5][499]);addLocaleData(b[5][500]);addLocaleData(b[5][501]);addLocaleData(b[5][502]);addLocaleData(b[5][503]);addLocaleData(b[5][504]);addLocaleData(b[5][505]);addLocaleData(b[5][506]);addLocaleData(b[5][507]);addLocaleData(b[5][508]);addLocaleData(b[5][509]);addLocaleData(b[5][510]);addLocaleData(b[5][511]);addLocaleData(b[5][512]);addLocaleData(b[5][513]);addLocaleData(b[5][514]);addLocaleData(b[5][515]);addLocaleData(b[5][516]);addLocaleData(b[5][517]);addLocaleData(b[5][518]);addLocaleData(b[5][519]);addLocaleData(b[5][520]);addLocaleData(b[5][521]);addLocaleData(b[5][522]);addLocaleData(b[5][523]);addLocaleData(b[5][524]);addLocaleData(b[5][525]);addLocaleData(b[5][526]);addLocaleData(b[5][527]);addLocaleData(b[5][528]);addLocaleData(b[5][529]);addLocaleData(b[5][530]);addLocaleData(b[5][531]);addLocaleData(b[5][532]);addLocaleData(b[5][533]);addLocaleData(b[5][534]);addLocaleData(b[5][535]);addLocaleData(b[5][536]);addLocaleData(b[5][537]);addLocaleData(b[5][538]);addLocaleData(b[5][539]);addLocaleData(b[5][540]);addLocaleData(b[5][541]);addLocaleData(b[5][542]);addLocaleData(b[5][543]);addLocaleData(b[5][544]);addLocaleData(b[5][545]);addLocaleData(b[5][546]);addLocaleData(b[5][547]);addLocaleData(b[5][548]);addLocaleData(b[5][549]);addLocaleData(b[5][550]);addLocaleData(b[5][551]);addLocaleData(b[5][552]);addLocaleData(b[5][553]);addLocaleData(b[5][554]);addLocaleData(b[5][555]);addLocaleData(b[5][556]);addLocaleData(b[5][557]);addLocaleData(b[5][558]);addLocaleData(b[5][559]);addLocaleData(b[5][560]);addLocaleData(b[5][561]);addLocaleData(b[5][562]);addLocaleData(b[5][563]);addLocaleData(b[5][564]);addLocaleData(b[5][565]);addLocaleData(b[5][566]);addLocaleData(b[5][567]);addLocaleData(b[5][568]);addLocaleData(b[5][569]);addLocaleData(b[5][570]);addLocaleData(b[5][571]);addLocaleData(b[5][572]);addLocaleData(b[5][573]);addLocaleData(b[5][574]);addLocaleData(b[5][575]);addLocaleData(b[5][576]);addLocaleData(b[5][577]);addLocaleData(b[5][578]);addLocaleData(b[5][579]);addLocaleData(b[5][580]);addLocaleData(b[5][581]);addLocaleData(b[5][582]);addLocaleData(b[5][583]);addLocaleData(b[5][584]);addLocaleData(b[5][585]);addLocaleData(b[5][586]);addLocaleData(b[5][587]);addLocaleData(b[5][588]);addLocaleData(b[5][589]);addLocaleData(b[5][590]);addLocaleData(b[5][591]);addLocaleData(b[5][592]);addLocaleData(b[5][593]);addLocaleData(b[5][594]);addLocaleData(b[5][595]);addLocaleData(b[5][596]);addLocaleData(b[5][597]);addLocaleData(b[5][598]);addLocaleData(b[5][599]);addLocaleData(b[5][600]);addLocaleData(b[5][601]);addLocaleData(b[5][602]);addLocaleData(b[5][603]);addLocaleData(b[5][604]);addLocaleData(b[5][605]);addLocaleData(b[5][606]);addLocaleData(b[5][607]);addLocaleData(b[5][608]);addLocaleData(b[5][609]);addLocaleData(b[5][610]);addLocaleData(b[5][611]);addLocaleData(b[5][612]);addLocaleData(b[5][613]);addLocaleData(b[5][614]);addLocaleData(b[5][615]);addLocaleData(b[5][616]);addLocaleData(b[5][617]);addLocaleData(b[5][618]);addLocaleData(b[5][619]);addLocaleData(b[5][620]);addLocaleData(b[5][621]);addLocaleData(b[5][622]);addLocaleData(b[5][623]);addLocaleData(b[5][624]);addLocaleData(b[5][625]);addLocaleData(b[5][626]);addLocaleData(b[5][627]);addLocaleData(b[5][628]);addLocaleData(b[5][629]);addLocaleData(b[5][630]);addLocaleData(b[5][631]);addLocaleData(b[5][632]);addLocaleData(b[5][633]);addLocaleData(b[5][634]);addLocaleData(b[5][635]);addLocaleData(b[5][636]);addLocaleData(b[5][637]);addLocaleData(b[5][638]);addLocaleData(b[5][639]);addLocaleData(b[5][640]);addLocaleData(b[5][641]);addLocaleData(b[5][642]);addLocaleData(b[5][643]);addLocaleData(b[5][644]);addLocaleData(b[5][645]);addLocaleData(b[5][646]);addLocaleData(b[5][647]);addLocaleData(b[5][648]);addLocaleData(b[5][649]);addLocaleData(b[5][650]);addLocaleData(b[5][651]);addLocaleData(b[5][652]);addLocaleData(b[5][653]);addLocaleData(b[5][654]);addLocaleData(b[5][655]);addLocaleData(b[5][656]);addLocaleData(b[5][657]);addLocaleData(b[5][658]);addLocaleData(b[5][659]);addLocaleData(b[5][660]);addLocaleData(b[5][661]);addLocaleData(b[5][662]);addLocaleData(b[5][663]);addLocaleData(b[5][664]);addLocaleData(b[5][665]);addLocaleData(b[5][666]);addLocaleData(b[5][667]);addLocaleData(b[5][668]);addLocaleData(b[5][669]);addLocaleData(b[5][670]);addLocaleData(b[5][671]);addLocaleData(b[5][672]);addLocaleData(b[5][673]);addLocaleData(b[5][674]);addLocaleData(b[5][675]);addLocaleData(b[5][676]);addLocaleData(b[5][677]);addLocaleData(b[5][678]);addLocaleData(b[5][679]);addLocaleData(b[5][680]);addLocaleData(b[5][681]);addLocaleData(b[5][682]);addLocaleData(b[5][683]);addLocaleData(b[5][684]);addLocaleData(b[5][685]);addLocaleData(b[5][686]);addLocaleData(b[5][687]);addLocaleData(b[5][688]);addLocaleData(b[5][689]);addLocaleData(b[5][690]);addLocaleData(b[5][691]);addLocaleData(b[5][692]);addLocaleData(b[5][693]);addLocaleData(b[5][694]);addLocaleData(b[5][695]);addLocaleData(b[5][696]);addLocaleData(b[5][697]);addLocaleData(b[5][698]);addLocaleData(b[5][699]);addLocaleData(b[5][700]);addLocaleData(b[5][701]);addLocaleData(b[5][702]);addLocaleData(b[5][703]);addLocaleData(b[5][704]);addLocaleData(b[5][705]);addLocaleData(b[5][706]);addLocaleData(b[5][707]);addLocaleData(b[5][708]);addLocaleData(b[5][709]);addLocaleData(b[5][710]);addLocaleData(b[5][711]);addLocaleData(b[5][712]);addLocaleData(b[5][713]);addLocaleData(b[5][714]);addLocaleData(b[5][715]);})(IntlPolyfill.__addLocaleData);
};

moduleFactories["node_modules/intl/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/intl/index.js ***/
"use strict";

// Expose `IntlPolyfill` as global to add locale data into runtime later on.
global.IntlPolyfill = require('./lib/core.js'); // Require all locale data for `Intl`. This module will be
// ignored when bundling for the browser with Browserify/Webpack.

require('./locale-data/complete.js'); // hack to export the polyfill as global Intl if needed


if (!global.Intl) {
  global.Intl = global.IntlPolyfill;

  global.IntlPolyfill.__applyLocaleSensitivePrototypes();
} // providing an idiomatic api for the nodejs version of this module


module.exports = global.IntlPolyfill;
};

moduleFactories["node_modules/absol/src/Polyfill/polyfill.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Polyfill/polyfill.js ***/
"use strict";

var _atob = _interopRequireDefault(require("atob"));

var _btoa = _interopRequireDefault(require("btoa"));


if (!('atob' in window)) {
  window.atob = _atob.default;
}

if (!('btoa' in window)) {
  window.btoa = _btoa.default;
}

!function (e, n) {
  "object" == typeof exports && "undefined" != typeof module ? n() : "function" == typeof define && define.amd ? define(n) : n();
}(0, function () {
  "use strict";

  function e(e) {
    var n = this.constructor;
    return this.then(function (t) {
      return n.resolve(e()).then(function () {
        return t;
      });
    }, function (t) {
      return n.resolve(e()).then(function () {
        return n.reject(t);
      });
    });
  }

  function n() {}

  function t(e) {
    if (!(this instanceof t)) throw new TypeError("Promises must be constructed via new");
    if ("function" != typeof e) throw new TypeError("not a function");
    this._state = 0, this._handled = !1, this._value = undefined, this._deferreds = [], u(e, this);
  }

  function o(e, n) {
    for (; 3 === e._state;) e = e._value;

    0 !== e._state ? (e._handled = !0, t._immediateFn(function () {
      var t = 1 === e._state ? n.onFulfilled : n.onRejected;

      if (null !== t) {
        var o;

        try {
          o = t(e._value);
        } catch (f) {
          return void i(n.promise, f);
        }

        r(n.promise, o);
      } else (1 === e._state ? r : i)(n.promise, e._value);
    })) : e._deferreds.push(n);
  }

  function r(e, n) {
    try {
      if (n === e) throw new TypeError("A promise cannot be resolved with itself.");

      if (n && ("object" == typeof n || "function" == typeof n)) {
        var o = n.then;
        if (n instanceof t) return e._state = 3, e._value = n, void f(e);
        if ("function" == typeof o) return void u(function (e, n) {
          return function () {
            e.apply(n, arguments);
          };
        }(o, n), e);
      }

      e._state = 1, e._value = n, f(e);
    } catch (r) {
      i(e, r);
    }
  }

  function i(e, n) {
    e._state = 2, e._value = n, f(e);
  }

  function f(e) {
    2 === e._state && 0 === e._deferreds.length && t._immediateFn(function () {
      e._handled || t._unhandledRejectionFn(e._value);
    });

    for (var n = 0, r = e._deferreds.length; r > n; n++) o(e, e._deferreds[n]);

    e._deferreds = null;
  }

  function u(e, n) {
    var t = !1;

    try {
      e(function (e) {
        t || (t = !0, r(n, e));
      }, function (e) {
        t || (t = !0, i(n, e));
      });
    } catch (o) {
      if (t) return;
      t = !0, i(n, o);
    }
  }

  var c = setTimeout;
  t.prototype["catch"] = function (e) {
    return this.then(null, e);
  }, t.prototype.then = function (e, t) {
    var r = new this.constructor(n);
    return o(this, new function (e, n, t) {
      this.onFulfilled = "function" == typeof e ? e : null, this.onRejected = "function" == typeof n ? n : null, this.promise = t;
    }(e, t, r)), r;
  }, t.prototype["finally"] = e, t.all = function (e) {
    return new t(function (n, t) {
      function o(e, f) {
        try {
          if (f && ("object" == typeof f || "function" == typeof f)) {
            var u = f.then;
            if ("function" == typeof u) return void u.call(f, function (n) {
              o(e, n);
            }, t);
          }

          r[e] = f, 0 == --i && n(r);
        } catch (c) {
          t(c);
        }
      }

      if (!e || "undefined" == typeof e.length) throw new TypeError("Promise.all accepts an array");
      var r = Array.prototype.slice.call(e);
      if (0 === r.length) return n([]);

      for (var i = r.length, f = 0; r.length > f; f++) o(f, r[f]);
    });
  }, t.resolve = function (e) {
    return e && "object" == typeof e && e.constructor === t ? e : new t(function (n) {
      n(e);
    });
  }, t.reject = function (e) {
    return new t(function (n, t) {
      t(e);
    });
  }, t.race = function (e) {
    return new t(function (n, t) {
      for (var o = 0, r = e.length; r > o; o++) e[o].then(n, t);
    });
  }, t._immediateFn = "function" == typeof setImmediate && function (e) {
    setImmediate(e);
  } || function (e) {
    c(e, 0);
  }, t._unhandledRejectionFn = function (e) {
    void 0 !== console && console && console.warn("Possible Unhandled Promise Rejection:", e);
  };

  var l = function () {
    if ("undefined" != typeof self) return self;
    if ("undefined" != typeof window) return window;
    if ("undefined" != typeof global) return global;
    throw Error("unable to locate global object");
  }();

  "Promise" in l ? l.Promise.prototype["finally"] || (l.Promise.prototype["finally"] = e) : l.Promise = t;
});
!function () {
  var vendors = ['ms', 'moz', 'webkit', 'o'];

  for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
  }

  if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) {
    var id = window.setTimeout(function () {
      callback(element);
    }, 1000 / 60);
    return id;
  };
  if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) {
    clearTimeout(id);
  };
}(); //Object

(function () {
  'use strict';

  var ObjectProto = Object.prototype,
      defineGetter = ObjectProto.__defineGetter__,
      defineSetter = ObjectProto.__defineSetter__,
      lookupGetter = ObjectProto.__lookupGetter__,
      lookupSetter = ObjectProto.__lookupSetter__,
      hasOwnProp = ObjectProto.hasOwnProperty;
  var supportDom = true;

  try {
    if (Object.defineProperty) {
      Object.defineProperty(document.createElement('div'), 'theRandomName', {
        set: function () {},
        get: function () {}
      });
    }
  } catch (error) {
    supportDom = false;
  }

  if ((!supportDom || !Object.defineProperty) && defineGetter && defineSetter && lookupGetter && lookupSetter) {
    var originObjetDefineProperty = Object.defineProperty;

    Object.defineProperty = function (obj, prop, descriptor) {
      if (!originObjetDefineProperty || typeof obj.nodeType === "number" && typeof obj.nodeName === "string") {
        if (arguments.length < 3) {
          // all arguments required
          throw new TypeError("Arguments not optional");
        }

        prop += ""; // convert prop to string

        if (hasOwnProp.call(descriptor, "value")) {
          if (!lookupGetter.call(obj, prop) && !lookupSetter.call(obj, prop)) {
            // data property defined and no pre-existing accessors
            obj[prop] = descriptor.value;
          }

          if (hasOwnProp.call(descriptor, "get") || hasOwnProp.call(descriptor, "set")) {
            // descriptor has a value prop but accessor already exists
            throw new TypeError("Cannot specify an accessor and a value");
          }
        }

        if (descriptor.get) {
          defineGetter.call(obj, prop, descriptor.get);
        }

        if (descriptor.set) {
          defineSetter.call(obj, prop, descriptor.set);
        }

        return obj;
      } else {
        return originObjetDefineProperty.call(this, obj, prop, descriptor);
      }
    };

    var originObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;

    Object.getOwnPropertyDescriptor = function (obj, prop) {
      if (!originObjectGetOwnPropertyDescriptor || typeof obj.nodeType === "number" && typeof obj.nodeName === "string") {
        if (arguments.length < 2) {
          // all arguments required
          throw new TypeError("Arguments not optional.");
        }

        prop += ""; // convert prop to string

        var descriptor = {
          configurable: true,
          enumerable: true,
          writable: true
        },
            getter = lookupGetter.call(obj, prop),
            setter = lookupSetter.call(obj, prop);

        if (!hasOwnProp.call(obj, prop)) {
          // property doesn't exist or is inherited
          return descriptor;
        }

        if (!getter && !setter) {
          // not an accessor so return prop
          descriptor.value = obj[prop];
          return descriptor;
        } // there is an accessor, remove descriptor.writable;
        // populate descriptor.get and descriptor.set (IE's behavior)


        delete descriptor.writable;
        descriptor.get = descriptor.set = undefined;

        if (getter) {
          descriptor.get = getter;
        }

        if (setter) {
          descriptor.set = setter;
        }

        return descriptor;
      } else {
        return originObjectGetOwnPropertyDescriptor(obj, prop);
      }
    };
  }

  if (!supportDom || !Object.getOwnPropertyDescriptors) {
    Object.getOwnPropertyDescriptors = function (o) {
      var res = {};

      for (var key in o) {
        res[key] = Object.getOwnPropertyDescriptor(o, key);
      }

      return res;
    };
  }

  if (!supportDom || !Object.defineProperties) {
    Object.defineProperties = function (obj, props) {
      var prop;

      for (prop in props) {
        if (hasOwnProp.call(props, prop)) {
          Object.defineProperty(obj, prop, props[prop]);
        }
      }
    };
  }

  if (typeof Object.assign != 'function') {
    Object.assign = function (target, varArgs) {
      'use strict';

      if (target == null) {
        throw new TypeError('Cannot convert undefined or null to object');
      }

      var to = Object(target);

      for (var index = 1; index < arguments.length; index++) {
        var nextSource = arguments[index];

        if (nextSource != null) {
          for (var nextKey in nextSource) {
            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
              to[nextKey] = nextSource[nextKey];
            }
          }
        }
      }

      return to;
    };
  }
})(); //string


!function () {
  if (!String.prototype.startsWith) {
    String.prototype.startsWith = function (searchString, position) {
      position = position || 0;
      return this.indexOf(searchString, position) === position;
    };
  }

  if (!String.prototype.replaceAll) {
    String.prototype.replaceAll = function () {
      var find = arguments[0];
      if (!find) return this;

      if (typeof find == "string") {
        return this.split(find).join(arguments[1]);
      } else if (find instanceof RegExp) {
        return this.replace(new RegExp(find.source, 'g'), arguments[1]);
      }
    };
  }
}(); //array

!function () {
  if (!Array.prototype.fill) {
    Object.defineProperty(Array.prototype, 'fill', {
      value: function (value) {
        // Steps 1-2.
        if (this == null) {
          throw new TypeError('this is null or not defined');
        }

        var O = Object(this); // Steps 3-5.

        var len = O.length >>> 0; // Steps 6-7.

        var start = arguments[1];
        var relativeStart = start >> 0; // Step 8.

        var k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); // Steps 9-10.

        var end = arguments[2];
        var relativeEnd = end === undefined ? len : end >> 0; // Step 11.

        var final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); // Step 12.

        while (k < final) {
          O[k] = value;
          k++;
        } // Step 13.


        return O;
      }
    });
  }

  if (!Array.prototype.some) {
    Array.prototype.some = function (fun
    /*, thisp */
    ) {
      "use strict";

      if (this == null) throw new TypeError();
      var t = Object(this),
          len = t.length >>> 0;
      if (typeof fun != "function") throw new TypeError();
      var thisp = arguments[1];

      for (var i = 0; i < len; i++) {
        if (i in t && fun.call(thisp, t[i], i, t)) return true;
      }

      return false;
    };
  }
}(); //function

!function () {
  if (!Function.prototype.bind) {
    var ArrayPrototypeSlice = Array.prototype.slice;

    Function.prototype.bind = function (otherThis) {
      if (typeof this !== 'function') {
        // closest thing possible to the ECMAScript 5
        // internal IsCallable function
        throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
      }

      var baseArgs = ArrayPrototypeSlice.call(arguments, 1),
          baseArgsLength = baseArgs.length,
          fToBind = this,
          fNOP = function () {},
          fBound = function () {
        baseArgs.length = baseArgsLength; // reset to default base arguments

        baseArgs.push.apply(baseArgs, arguments);
        return fToBind.apply(fNOP.prototype.isPrototypeOf(this) ? this : otherThis, baseArgs);
      };

      if (this.prototype) {
        // Function.prototype doesn't have a prototype property
        fNOP.prototype = this.prototype;
      }

      fBound.prototype = new fNOP();
      return fBound;
    };
  }
}();
};

moduleFactories["node_modules/absol/src/Code/safeThrow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Code/safeThrow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = safeThrow;

function safeThrow(error) {
  setTimeout(function () {
    window.errorList =window.errorList ||[];
    window.errorList.push(error);
    throw error;
  }, 0);
}
};

moduleFactories["node_modules/absol/src/HTML5/EventEmitter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/EventEmitter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isMouseRight = isMouseRight;
exports.isMouseLeft = isMouseLeft;
exports.hitElement = hitElement;
exports.copyEvent = copyEvent;
exports.copyTouch = copyTouch;
exports.findChangedTouchByIdent = findChangedTouchByIdent;
exports.findTouchByIdent = findTouchByIdent;
exports.default = exports.touchProperties = exports.eventProperties = void 0;

var _safeThrow = _interopRequireDefault(require("../Code/safeThrow"));


function EventEmitter() {
  if (!this._azar_extendEvents) {
    Object.defineProperty(this, '_azar_extendEvents', {
      enumerable: false,
      value: this._azar_extendEvents || {
        supported: {},
        prioritize: {},
        nonprioritize: {}
      }
    });
    Object.defineProperty(this, '__azar_force', {
      value: !(typeof Node === "object" ? this instanceof Node : this && typeof this === "object" && typeof this.nodeType === "number" && typeof this.nodeName === "string"),
      enumerable: false
    });
  }
}

EventEmitter.prototype.defineEvent = function (name) {
  if (name instanceof Array) {
    for (var i = 0; i < name.length; ++i) this._azar_extendEvents.supported[name[i]] = true;
  } else this._azar_extendEvents.supported[name] = true;

  return this;
};

EventEmitter.prototype.isSupportedEvent = function (name) {
  return this.__azar_force || !!this._azar_extendEvents.supported[name];
};

EventEmitter.prototype.emit = function (eventName, data) {
  this.fire.apply(this, arguments);
};

EventEmitter.prototype.fire = function (eventName, data) {
  var others = Array.prototype.slice.call(arguments, 1);

  if (this.isSupportedEvent(eventName)) {
    var listenerList;
    var i;

    if (this._azar_extendEvents.prioritize[eventName]) {
      listenerList = this._azar_extendEvents.prioritize[eventName].slice();

      for (i = 0; i < listenerList.length; ++i) {
        try {
          listenerList[i].wrappedCallback.apply(this, others);
        } catch (e) {
          (0, _safeThrow.default)(e);
        }
      }
    }

    if (this._azar_extendEvents.nonprioritize[eventName]) {
      listenerList = this._azar_extendEvents.nonprioritize[eventName].slice();

      for (i = 0; i < listenerList.length; ++i) {
        try {
          listenerList[i].wrappedCallback.apply(this, others);
        } catch (e) {
          (0, _safeThrow.default)(e);
        }
      }
    }
  } else {
    if (this.dispatchEvent) {
      var event = new Event(eventName);
      data && Object.assign(event, data);
      this.dispatchEvent(event);
    } else throw new Error("Not support event " + eventName);
  }

  return this;
};

EventEmitter.prototype.eventEmittorOnWithTime = function (isOnce, arg0, arg1, arg2) {
  if (typeof arg0 == 'object') {
    for (var key in arg0) {
      this.eventEmittorOnWithTime(isOnce, key, arg0[key]);
    }

    return this;
  } else {
    if (typeof arg1 == 'object') {
      return this.eventEmittorOnWithTime(isOnce, arg0, arg1.callback, arg1.cap);
    } else {
      var eventArr = this._azar_extendEvents[arg2 ? 'prioritize' : 'nonprioritize'][arg0] || [];
      var eventIndex = -1;

      for (var i = 0; i < eventArr.length; ++i) {
        if (eventArr[i].wrappedCallback == arg1) {
          eventIndex = i;
          break;
        }
      }

      if (eventIndex < 0) {
        var event = {
          isOnce: isOnce,
          eventName: arg0,
          callback: arg1,
          cap: !!arg2
        }; //wrappedCallback will be call

        if (isOnce) {
          event.wrappedCallback = function () {
            this.off(event.eventName, event.wrappedCallback, event.cap);
            event.callback.apply(this, arguments);
          };
        } else {
          event.wrappedCallback = event.callback;
        }

        if (!this.isSupportedEvent(arg0)) {
          if (this.addEventListener) {
            this.addEventListener(arg0, event.wrappedCallback, !!arg2);
          } else {
            this.attachEvent('on' + arg0, arg1, !!arg2);
          }
        }

        eventArr.push(event);
        this._azar_extendEvents[arg2 ? 'prioritize' : 'nonprioritize'][arg0] = eventArr;
      } else {
        console.warn("dupplicate event");
      }
    }

    return this;
  }
};

EventEmitter.prototype.on = function (arg0, arg1, arg2) {
  this.eventEmittorOnWithTime(false, arg0, arg1, arg2);
  return this;
};

EventEmitter.prototype.once = function (arg0, arg1, arg2) {
  this.eventEmittorOnWithTime(true, arg0, arg1, arg2);
  return this;
};

EventEmitter.prototype.off = function (arg0, arg1, arg2) {
  if (typeof arg0 == 'object') {
    for (var key in arg0) {
      this.off(key, arg0[key]);
    }

    return this;
  } else {
    if (typeof arg1 == 'object') {
      return this.off(arg0, arg1.callback, arg1.cap);
    } else {
      var eventArr = this._azar_extendEvents[arg2 ? 'prioritize' : 'nonprioritize'][arg0] || [];
      var newEventArray = [];

      for (var i = 0; i < eventArr.length; ++i) {
        var event = eventArr[i];

        if (event.wrappedCallback == arg1) {
          //Dont add to newEventArray
          if (this.isSupportedEvent(arg0)) {} else {
            if (this.removeEventListener) {
              this.removeEventListener(event.eventName, event.wrappedCallback, !!event.cap);
            } else {
              this.detachEvent('on' + event.eventName, event.wrappedCallback, !!event.cap);
            }
          }
        } else {
          newEventArray.push(event);
        }
      }

      this._azar_extendEvents[arg2 ? 'prioritize' : 'nonprioritize'][arg0] = newEventArray;
      return this;
    }
  }
};

var eventProperties = ["altKey", "bubbles", "button", "buttons", "cancelBubble", "cancelable", "clientX", "clientY", "composed", "ctrlKey", "currentTarget", "defaultPrevented", "deltaMode", "deltaX", "deltaY", "deltaZ", "detail", "eventPhase", "explicitOriginalTarget", "isTrusted", "layerX", "layerY", "metaKey", "movementX", "movementY", "mozInputSource", "mozPressure", "offsetX", "offsetY", "originalTarget", "pageX", "pageY", "rangeOffset", "rangeParent", "region", "relatedTarget", "returnValue", "screenX", "screenY", "shiftKey", "srcElement", "target", "timeStamp", "type", "deltaMode", "deltaX", "deltaY", "deltaZ", 'preventDefault'];
exports.eventProperties = eventProperties;
var touchProperties = ['clientX', 'clientY', 'force', 'identifier', 'pageX', 'pageY', 'rotationAngle', 'screenX', 'screenY', 'target'];
exports.touchProperties = touchProperties;

function isMouseRight(event) {
  var isRightMB = false;
  if ("which" in event) // Gecko (Firefox), WebKit (Safari/Chrome) & Opera
    isRightMB = event.which == 3;else if ("button" in event) // IE, Opera
    isRightMB = event.button == 2;
  return isRightMB;
}

function isMouseLeft(event) {
  var isLeftMB = false;
  if ("which" in event) // Gecko (Firefox), WebKit (Safari/Chrome) & Opera
    isLeftMB = event.which == 1;else if ("button" in event) // IE, Opera
    isLeftMB = event.button == 1;
  return isLeftMB;
}

function hitElement(element, event) {
  var current = event.target;

  while (current) {
    if (current == element) return true;
    current = current.parentElement;
  }

  return false;
}

function copyEvent(event, props) {
  var result = {};
  var key, value; //copy native property

  for (var i = 0; i < eventProperties.length; ++i) {
    key = eventProperties[i];
    value = event[key];

    if (value !== undefined) {
      if (typeof value == "function") {
        result[key] = event[key].bind(event);
      } else {
        result[key] = event[key];
      }
    }
  }

  Object.assign(result, event);
  if (props) Object.assign(result, props);

  if (event.changedTouches) {
    result.changedTouches = Array.prototype.map.call(event.changedTouches, function (touch) {
      return copyTouch(touch);
    });
  }

  if (event.touches) {
    result.touches = Array.prototype.map.call(event.touches, function (touch) {
      return copyTouch(touch);
    });
  }

  return result;
}

function copyTouch(touch, props) {
  var result = {};
  var key, value; //copy native property

  for (var i = 0; i < touchProperties.length; ++i) {
    key = touchProperties[i];
    value = touch[key];

    if (value !== undefined) {
      if (typeof value == "function") {
        result[key] = touch[key].bind(touch);
      } else {
        result[key] = touch[key];
      }
    }
  }

  Object.assign(result, touch);
  if (props) Object.assign(result, props);
  return result;
}
/***
 *
 * @param {TouchEvent} event
 * @return {Touch | null}
 */


function findChangedTouchByIdent(event, identifier) {
  if (event.changedTouches) {
    for (var i = 0; i < event.changedTouches.length; ++i) {
      if (event.changedTouches[i].identifier === identifier) {
        return event.changedTouches[i];
      }
    }
  }

  return null;
}
/***
 *
 * @param event
 * @param identifier
 * @return {Touch|null}
 */


function findTouchByIdent(event, identifier) {
  if (event.touches) {
    for (var i = 0; i < event.touches.length; ++i) {
      if (event.touches[i].identifier === identifier) {
        return event.touches[i];
      }
    }
  }

  return null;
}

EventEmitter.isMouseRight = isMouseRight;
EventEmitter.isMouseLeft = isMouseLeft;
EventEmitter.hitElement = hitElement;
EventEmitter.copyEvent = copyEvent;
EventEmitter.eventProperties = eventProperties;
var _default = EventEmitter;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Detector/BrowserRules.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Detector/BrowserRules.js ***/
"use strict";

const external = global.external;
const re_msie = /\b(?:msie |ie |trident\/[0-9].*rv[ :])([0-9.]+)/;
const re_blackberry_10 = /\bbb10\b.+?\bversion\/([\d.]+)/;
const re_blackberry_6_7 = /\bblackberry\b.+\bversion\/([\d.]+)/;
const re_blackberry_4_5 = /\bblackberry\d+\/([\d.]+)/;
const NA_VERSION = "-1";
const DEVICES = [["nokia", function (ua) {
  //  nokia/-1
  if (ua.indexOf("nokia ") !== -1) {
    return /\bnokia ([0-9]+)?/;
  } else {
    return /\bnokia([a-z0-9]+)?/;
  }
}], //Android WP
["samsung", function (ua) {
  if (ua.indexOf("samsung") !== -1) {
    return /\bsamsung(?:[ \-](?:sgh|gt|sm))?-([a-z0-9]+)/;
  } else {
    return /\b(?:sgh|sch|gt|sm)-([a-z0-9]+)/;
  }
}], ["wp", function (ua) {
  return ua.indexOf("windows phone ") !== -1 || ua.indexOf("xblwp") !== -1 || ua.indexOf("zunewp") !== -1 || ua.indexOf("windows ce") !== -1;
}], ["pc", "windows"], ["ipad", "ipad"], // ipod iphone
["ipod", "ipod"], ["iphone", /\biphone\b|\biph(\d)/], ["mac", "macintosh"], ["mi", /\bmi[ \-]?([a-z0-9 ]+(?= build|\)))/], ["hongmi", /\bhm[ \-]?([a-z0-9]+)/], ["aliyun", /\baliyunos\b(?:[\-](\d+))?/], ["meizu", function (ua) {
  return ua.indexOf("meizu") >= 0 ? /\bmeizu[\/ ]([a-z0-9]+)\b/ : /\bm([0-9cx]{1,4})\b/;
}], ["nexus", /\bnexus ([0-9s.]+)/], ["huawei", function (ua) {
  const re_mediapad = /\bmediapad (.+?)(?= build\/huaweimediapad\b)/;

  if (ua.indexOf("huawei-huawei") !== -1) {
    return /\bhuawei\-huawei\-([a-z0-9\-]+)/;
  } else if (re_mediapad.test(ua)) {
    return re_mediapad;
  } else {
    return /\bhuawei[ _\-]?([a-z0-9]+)/;
  }
}], ["lenovo", function (ua) {
  if (ua.indexOf("lenovo-lenovo") !== -1) {
    return /\blenovo\-lenovo[ \-]([a-z0-9]+)/;
  } else {
    return /\blenovo[ \-]?([a-z0-9]+)/;
  }
}], ["zte", function (ua) {
  if (/\bzte\-[tu]/.test(ua)) {
    return /\bzte-[tu][ _\-]?([a-su-z0-9\+]+)/;
  } else {
    return /\bzte[ _\-]?([a-su-z0-9\+]+)/;
  }
}], ["vivo", /\bvivo(?: ([a-z0-9]+))?/], ["htc", function (ua) {
  if (/\bhtc[a-z0-9 _\-]+(?= build\b)/.test(ua)) {
    return /\bhtc[ _\-]?([a-z0-9 ]+(?= build))/;
  } else {
    return /\bhtc[ _\-]?([a-z0-9 ]+)/;
  }
}], ["oppo", /\boppo[_ ]([a-z0-9]+)/], ["konka", /\bkonka[_\-]([a-z0-9]+)/], ["sonyericsson", /\bmt([a-z0-9]+)/], ["coolpad", /\bcoolpad[_ ]?([a-z0-9]+)/], ["lg", /\blg[\-]([a-z0-9]+)/], ["android", /\bandroid\b|\badr\b/], ["blackberry", function (ua) {
  if (ua.indexOf("blackberry") >= 0) {
    return /\bblackberry\s?(\d+)/;
  }

  return "bb10";
}]];
const OS = [["wp", function (ua) {
  if (ua.indexOf("windows phone ") !== -1) {
    return /\bwindows phone (?:os )?([0-9.]+)/;
  } else if (ua.indexOf("xblwp") !== -1) {
    return /\bxblwp([0-9.]+)/;
  } else if (ua.indexOf("zunewp") !== -1) {
    return /\bzunewp([0-9.]+)/;
  }

  return "windows phone";
}], ["windows", /\bwindows nt ([0-9.]+)/], ["macosx", /\bmac os x ([0-9._]+)/], ["ios", function (ua) {
  if (/\bcpu(?: iphone)? os /.test(ua)) {
    return /\bcpu(?: iphone)? os ([0-9._]+)/;
  } else if (ua.indexOf("iph os ") !== -1) {
    return /\biph os ([0-9_]+)/;
  } else {
    return /\bios\b/;
  }
}], ["yunos", /\baliyunos ([0-9.]+)/], ["android", function (ua) {
  if (ua.indexOf("android") >= 0) {
    return /\bandroid[ \/-]?([0-9.x]+)?/;
  } else if (ua.indexOf("adr") >= 0) {
    if (ua.indexOf("mqqbrowser") >= 0) {
      return /\badr[ ]\(linux; u; ([0-9.]+)?/;
    } else {
      return /\badr(?:[ ]([0-9.]+))?/;
    }
  }

  return "android"; //return /\b(?:android|\badr)(?:[\/\- ](?:\(linux; u; )?)?([0-9.x]+)?/;
}], ["chromeos", /\bcros i686 ([0-9.]+)/], ["linux", "linux"], ["windowsce", /\bwindows ce(?: ([0-9.]+))?/], ["symbian", /\bsymbian(?:os)?\/([0-9.]+)/], ["blackberry", function (ua) {
  const m = ua.match(re_blackberry_10) || ua.match(re_blackberry_6_7) || ua.match(re_blackberry_4_5);
  return m ? {
    version: m[1]
  } : "blackberry";
}], ['ie', /\rv\:\/([0-9.]+)/]];
const ENGINE = [["edgehtml", /edge\/([0-9.]+)/], ["trident", re_msie], ["blink", function () {
  return "chrome" in global && "CSS" in global && /\bapplewebkit[\/]?([0-9.+]+)/;
}], ["webkit", /\bapplewebkit[\/]?([0-9.+]+)/], ["gecko", function (ua) {
  const match = ua.match(/\brv:([\d\w.]+).*\bgecko\/(\d+)/);

  if (match) {
    return {
      version: match[1] + "." + match[2]
    };
  }
}], ["presto", /\bpresto\/([0-9.]+)/], ["androidwebkit", /\bandroidwebkit\/([0-9.]+)/], ["coolpadwebkit", /\bcoolpadwebkit\/([0-9.]+)/], ["u2", /\bu2\/([0-9.]+)/], ["u3", /\bu3\/([0-9.]+)/]];
const BROWSER = [['coccoc', /coc_coc_browser\/([0-9.]+)/], // Microsoft Edge Browser, Default browser in Windows 10.
["edge", /edge\/([0-9.]+)/], ["chrome-edge", /chrome.+edg\/([0-9.]+)/], // Sogou.
["sogou", function (ua) {
  if (ua.indexOf("sogoumobilebrowser") >= 0) {
    return /sogoumobilebrowser\/([0-9.]+)/;
  } else if (ua.indexOf("sogoumse") >= 0) {
    return true;
  }

  return / se ([0-9.x]+)/;
}], // Maxthon
["maxthon", function () {
  try {
    if (external && (external.mxVersion || external.max_version)) {
      return {
        version: external.mxVersion || external.max_version
      };
    }
  } catch (ex) {
    /* */
  }

  return /\b(?:maxthon|mxbrowser)(?:[ \/]([0-9.]+))?/;
}], ["micromessenger", /\bmicromessenger\/([\d.]+)/], ["qq", /\bm?qqbrowser\/([0-9.]+)/], ["green", "greenbrowser"], ["tt", /\btencenttraveler ([0-9.]+)/], ["liebao", function (ua) {
  if (ua.indexOf("liebaofast") >= 0) {
    return /\bliebaofast\/([0-9.]+)/;
  }

  if (ua.indexOf("lbbrowser") === -1) {
    return false;
  }

  var version;

  try {
    if (external && external.LiebaoGetVersion) {
      version = external.LiebaoGetVersion();
    }
  } catch (ex) {
    /* */
  }

  return {
    version: version || NA_VERSION
  };
}], ["tao", /\btaobrowser\/([0-9.]+)/], ["coolnovo", /\bcoolnovo\/([0-9.]+)/], ["saayaa", "saayaa"], ["baidu", /\b(?:ba?idubrowser|baiduhd)[ \/]([0-9.x]+)/], ["ie", re_msie], ["mi", /\bmiuibrowser\/([0-9.]+)/], ["opera", function (ua) {
  const re_opera_old = /\bopera.+version\/([0-9.ab]+)/;
  const re_opera_new = /\bopr\/([0-9.]+)/;
  return re_opera_old.test(ua) ? re_opera_old : re_opera_new;
}], ["oupeng", /\boupeng\/([0-9.]+)/], ["yandex", /yabrowser\/([0-9.]+)/], ["ali-ap", function (ua) {
  if (ua.indexOf("aliapp") > 0) {
    return /\baliapp\(ap\/([0-9.]+)\)/;
  } else {
    return /\balipayclient\/([0-9.]+)\b/;
  }
}], ["ali-ap-pd", /\baliapp\(ap-pd\/([0-9.]+)\)/], ["ali-am", /\baliapp\(am\/([0-9.]+)\)/], ["ali-tb", /\baliapp\(tb\/([0-9.]+)\)/], ["ali-tb-pd", /\baliapp\(tb-pd\/([0-9.]+)\)/], ["ali-tm", /\baliapp\(tm\/([0-9.]+)\)/], ["ali-tm-pd", /\baliapp\(tm-pd\/([0-9.]+)\)/], ["uc", function (ua) {
  if (ua.indexOf("ucbrowser/") >= 0) {
    return /\bucbrowser\/([0-9.]+)/;
  } else if (ua.indexOf("ubrowser/") >= 0) {
    return /\bubrowser\/([0-9.]+)/;
  } else if (/\buc\/[0-9]/.test(ua)) {
    return /\buc\/([0-9.]+)/;
  } else if (ua.indexOf("ucweb") >= 0) {
    // `ucweb/2.0` is compony info.
    // `UCWEB8.7.2.214/145/800` is browser info.
    return /\bucweb([0-9.]+)?/;
  } else {
    return /\b(?:ucbrowser|uc)\b/;
  }
}], ["baiduboxapp", function (ua) {
  var back = 0;
  var a;

  if (/ baiduboxapp\//i.test(ua)) {
    a = /([\d+.]+)_(?:diordna|enohpi)_/.exec(ua);

    if (a) {
      a = a[1].split(".");
      back = a.reverse().join(".");
    } else if (a = /baiduboxapp\/([\d+.]+)/.exec(ua)) {
      back = a[1];
    }

    return {
      version: back
    };
  }

  return false;
}], ["oppobrowser", /\boppobrowser\/([0-9.]+)/], ["edge-android", / (?:edga)\/([0-9.]+)/], ["chrome", / (?:chrome|crios|crmo)\/([0-9.]+)/], // Android safari 
["android", function (ua) {
  if (ua.indexOf("android") === -1) {
    return;
  }

  return /\bversion\/([0-9.]+(?: beta)?)/;
}], ["blackberry", function (ua) {
  const m = ua.match(re_blackberry_10) || ua.match(re_blackberry_6_7) || ua.match(re_blackberry_4_5);
  return m ? {
    version: m[1]
  } : "blackberry";
}], ["safari", /\bversion\/([0-9.]+(?: beta)?)(?: mobile(?:\/[a-z0-9]+)?)? safari\//], //  Safari, WebView
["webview", /\bcpu(?: iphone)? os (?:[0-9._]+).+\bapplewebkit\b/], ["firefox", /\bfirefox\/([0-9.ab]+)/], ["nokia", /\bnokiabrowser\/([0-9.]+)/]];
module.exports = {
  device: DEVICES,
  os: OS,
  browser: BROWSER,
  engine: ENGINE,
  re_msie: re_msie
};
};

moduleFactories["node_modules/absol/src/Detector/BrowserDetector.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Detector/BrowserDetector.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.calcBenchmark = calcBenchmark;
exports.default = void 0;

var _BrowserRules = _interopRequireDefault(require("./BrowserRules"));


/**
 *
 * @param {BrowserRules} rulesheet
 */
function BrowserDetector(rulesheet) {
  this.au = global.navigator ? navigator.userAgent || '' : '';
  this.rulesheet = rulesheet;
  this.os = this.detectByRules(this.rulesheet.os);
  this.device = this.detectByRules(this.rulesheet.device);
  this.engine = this.detectByRules(this.rulesheet.engine);
  this.browser = this.detectByRules(this.rulesheet.browser);
  this.isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
  this.isCococ = navigator.userAgent.toLowerCase().indexOf('coc_coc_browser') >= 1;
  this.isSafari = !this.isCococ && navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('win') < 0 && navigator.userAgent.toLowerCase().indexOf('android') < 0; // this.isSafari = /constructor/i.test(window.HTMLElement) || window.safari;

  this.isMobile = navigator.userAgent.indexOf('KFFOWI') > -1 || navigator.userAgent.toLowerCase().indexOf('mobile') > -1;
  this.isMacOSWebView = /Macintosh/.test(this.au) && /AppWebkit/.test(this.au) && !/Safari/.test(this.au);
  this.isChromeIOS = /CriOS\/[\d]+/.test(this.au);
  this.hasTouch = 'ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch || navigator.maxTouchPoints > 0 || window.navigator.msMaxTouchPoints > 0;
  this.isTouchDevice = this.isMobile && this.hasTouch;

  this.supportPassiveEvent = function () {
    var supportsPassiveOption = false;

    try {
      var opts = Object.defineProperty({}, 'passive', {
        get: function () {
          supportsPassiveOption = true;
        }
      });
      window.addEventListener('test', null, opts);
      window.removeEventListener('test', null, opts);
    } catch (e) {}

    return supportsPassiveOption;
  }();

  this.supportGridLayout = typeof document.createElement('div').style.grid === 'string';
  Object.defineProperty(this, 'zoom', {
    get: function () {
      return this.getZoom();
    },
    enumerable: true,
    configurable: false
  });
}

BrowserDetector.prototype.detectByRules = function (rules) {
  var result = {};

  for (var i = 0; i < rules.length; ++i) {
    var rule = rules[i];
    var type = rule[0];
    var rgx = rule[1];

    if (typeof rgx == 'function') {
      rgx = rgx(this.au.toLowerCase());
    }

    if (Object.prototype.toString.call(rgx).indexOf('RegExp') >= 0) {
      var matched = this.au.toLowerCase().match(rgx);

      if (matched) {
        result.type = type;

        if (matched[1]) {
          result.version = matched[1];
        }

        break;
      }
    } else if (typeof rgx == 'string') {
      if (this.au.toLowerCase().indexOf(rgx) >= 0) {
        result.type = type;
      }
    }
  }

  return result;
};

BrowserDetector.prototype.getZoom = function () {
  //todo: wrong on chrome
  var type;

  if ('chrome' in window) {
    type = "chrome";
  } else if (this.isSafari) {
    type = 'safari';
  } else if ('orientation' in window && 'webkitRequestAnimationFrame' in window) {
    type = 'webkitMobile';
  } else if ('webkitRequestAnimationFrame' in window) {
    type = 'webkit';
  }

  switch (type) {
    case 'chrome':
      return Math.round(window.outerWidth / window.innerWidth * 100) / 100;

    case 'safari':
      return Math.round(document.documentElement.clientWidth / window.innerWidth * 100) / 100;

    case 'webkitMobile':
      return (Math.abs(window.orientation) == 90 ? screen.height : screen.width) / window.innerWidth;

    case 'webkit':
      return (() => {
        var important = str => {
          return str.replace(/;/g, " !important;");
        };

        var div = document.createElement('div');
        div.innerHTML = "1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>0";
        div.setAttribute('style', important('font: 100px/1em sans-serif; -webkit-text-size-adjust: none; text-size-adjust: none; height: auto; width: 1em; padding: 0; overflow: visible;'));
        var container = document.createElement('div');
        container.setAttribute('style', important('width:0; height:0; overflow:hidden; visibility:hidden; position: absolute;'));
        container.appendChild(div);
        document.body.appendChild(container);
        var zoom = 1000 / div.clientHeight;
        zoom = Math.round(zoom * 100) / 100;
        document.body.removeChild(container);
        return zoom;
      })();

    default:
      return 1;
  }

  return 1;
};

function calcBenchmark() {
  var now = new Date().getTime();
  var i = 0;

  while (now === new Date().getTime()) {}

  now++;

  while (now === new Date().getTime()) {
    ++i;
  }

  return i;
}

BrowserDetector.prototype.calcBenchmark = calcBenchmark;

var _default = new BrowserDetector(_BrowserRules.default);

exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/JSPath.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/JSPath.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function JSPath(props) {
  this.path = props.path;
}
/**
 *
 * @param {Element} element
 * @returns {Boolean}
 */


JSPath.prototype.match = function (element, query) {
  if (query.id) {
    if (!element.getAttribute || element.getAttribute('id') != query.id) return false;
  }

  if (query.tagName) {
    var matchTag = false;
    if (element._azar_extendTags && element._azar_extendTags[query.tagName]) matchTag = true;
    matchTag = matchTag || (element.tagName || '').toUpperCase() == query.tagName.toUpperCase();
    if (!matchTag) return false;
  }

  if (query.classList) for (var i = 0; i < query.classList.length; ++i) {
    if (!element.classList || !element.classList.contains(query.classList[i])) return false;
  }

  if (query.attributes) {
    for (var key in query.attributes) {
      var value;

      if (element.attr) {
        value = element.attr(key);
        if (value != query.attributes[key]) return false;
      } else if (element.getAttribute) {
        value = element.getAttribute(key);
        if (value != query.attributes[key]) return false;
      }
    }
  }

  return true;
};
/**
 * Warning : still fail in some testcase
 */


JSPath.prototype.findFirst = function (root, onFound) {
  var queue = [{
    e: root,
    i: 0
  }];
  var current;

  while (queue.length > 0) {
    current = queue.shift();
    var isMathed = false;
    var currentElt = current.e;
    var currentI = current.i;

    if (this.match(currentElt, this.path[currentI])) {
      if (this.path[currentI].childCombinate) {
        var trackI = currentI;
        var trackElement = currentElt;
        var isTrackMatch = true;

        while (isTrackMatch && trackI > 0 && this.path[trackI].childCombinate) {
          if (!trackElement.parentNode || !this.match(trackElement.parentNode, this.path[trackI - 1])) {
            isTrackMatch = false;
          } else {
            trackElement = trackElement.parentNode;
            trackI--;
          }
        }

        if (isTrackMatch) isMathed = true;
      } else {
        isMathed = true;
      }
    }

    if (isMathed && currentI + 1 == this.path.length) {
      if (!onFound || onFound && onFound(currentElt)) return currentElt;
    }

    if (currentElt.childNodes) {
      var l = currentElt.childNodes.length;

      for (var i = 0; i < l; ++i) {
        if (currentElt.childNodes[i].tagName) queue.push({
          e: currentElt.childNodes[i],
          i: currentI + (isMathed && currentI + 1 < this.path.length ? 1 : 0)
        });
      }
    }
  }

  return undefined;
};

JSPath.prototype.findAll = function (root, onFound) {
  var res = [];
  var queue = [{
    e: root,
    i: 0
  }];
  var current;

  while (queue.length > 0) {
    current = queue.shift();
    var isMathed = false;
    var currentElt = current.e;
    var currentI = current.i;

    if (this.match(currentElt, this.path[currentI])) {
      if (this.path[currentI].childCombinate) {
        var trackI = currentI;
        var trackElement = currentElt;
        var isTrackMatch = true;

        while (isTrackMatch && trackI > 0 && this.path[trackI].childCombinate) {
          if (!trackElement.parentNode || !this.match(trackElement.parentNode, this.path[trackI - 1])) {
            isTrackMatch = false;
          } else {
            trackElement = trackElement.parentNode;
            trackI--;
          }
        }

        if (isTrackMatch) isMathed = true;
      } else {
        isMathed = true;
      }
    }

    if (isMathed && currentI + 1 == this.path.length) {
      if (!onFound || onFound && onFound(currentElt)) res.push(currentElt);
    }

    if (currentElt.childNodes) {
      var l = currentElt.childNodes.length;

      for (var i = 0; i < l; ++i) {
        if (currentElt.childNodes[i].tagName) queue.push({
          e: currentElt.childNodes[i],
          i: currentI + (isMathed && currentI + 1 < this.path.length ? 1 : 0)
        });
      }
    }
  }

  return res;
};

var identRegex = /[a-zA-Z0-9\-_]+/;
var stringRegex = /"(([^"\\]*|(\\.))*)"/;
var classRegex = new RegExp('\\.' + identRegex.source);
var idRegex = new RegExp('#' + identRegex.source);
var booleanRegex = /true|false/;
var valueRegex = new RegExp(stringRegex.source + '|' + booleanRegex.source);
var attributeRegex = new RegExp('\\[\\s*(' + identRegex.source + ')\\s*(=\\s*(' + valueRegex.source + '))\\]');
var queryRegex = new RegExp(['(', identRegex.source, '|', attributeRegex.source, '|', classRegex.source, '|', idRegex.source, ')+'].join(''));
JSPath.__tagRegex = new RegExp(queryRegex.source + '|\\>', 'g');
JSPath.__tagNameRegex = new RegExp('^' + identRegex.source, 'i');
JSPath.__classRegex = new RegExp(classRegex.source, 'g');
JSPath.__idRegex = new RegExp(idRegex.source, 'i');
JSPath.__attrRegex = new RegExp(attributeRegex.source, 'g');

JSPath.parseQuery = function (s) {
  var tag = {};
  s = s.replace(JSPath.__attrRegex, function (full, name, assign, jsonTextValue) {
    tag.attributes = tag.attributes || {};

    if (assign) {
      tag.attributes[name] = JSON.parse(jsonTextValue);
    } else tag.attributes[name] = true;

    return '';
  });
  var classList = s.match(this.__classRegex);
  var idList = s.match(this.__idRegex);
  var tagList = s.match(this.__tagNameRegex);

  if (idList && idList.length > 0) {
    tag.id = idList[0].substring(1);
  }

  if (tagList && tagList.length > 0) {
    tag.tagName = tagList[0].trim();
  }

  if (classList && classList.length > 0) {
    tag.classList = classList.map(function (s) {
      return s.substring(1);
    });
  }

  return tag;
};
/**
 * @param {String} text
 * @returns {JSPath}
 */


JSPath.compileJSPath = function (text) {
  var tagTexts = text.match(this.__tagRegex) || [''];
  var path = [];
  var childCombinate = false;

  for (var i = 0; i < tagTexts.length; ++i) {
    var s = tagTexts[i];

    if (s == '>') {
      childCombinate = true;
    } else {
      var tag = this.parseQuery(s);
      tag.childCombinate = childCombinate;
      path.push(tag);
      childCombinate = false;
    }
  }

  return new JSPath({
    path: path
  });
};

var _default = JSPath;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/JSMaker/TemplateString.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSMaker/TemplateString.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function TemplateString(props) {
  this.parts = props.parts;
}

TemplateString.prototype.toJSCode = function () {
  return this.parts.map(function (e) {
    if (e.type == TemplateString.TYPE_EXPRESSION) {
      return '(' + e.data + ')';
    } else {
      return JSON.stringify(e.data);
    }
  }).join('+');
};

TemplateString.__partRegex = /(\{\{(([^\}]|(\}[^\}]))*)\}\})|(([^\{]|(\{[^\{]))+)/g;
/**
 *  @param  {String} text 
 */

TemplateString.__matchExpression = function (text) {
  if (text[0] == '{' && text[1] == '{' && text[text.length - 1] == '}' && text[text.length - 2] == '}') {
    return [text, text.substr(2, text.length - 4).trim()];
  } else {
    return false;
  }
};

TemplateString.TYPE_STRING = 0;
TemplateString.TYPE_EXPRESSION = 1;

TemplateString.parse = function (text) {
  text = text + '';
  var matchedParts = text.match(this.__partRegex);

  if (matchedParts) {
    var parts = matchedParts.map(function (e) {
      var matchedExp = this.__matchExpression(e);

      if (matchedExp) {
        return {
          type: this.TYPE_EXPRESSION,
          data: matchedExp[1]
        };
      } else {
        return {
          type: this.TYPE_STRING,
          data: e
        };
      }
    }.bind(this));
    return new TemplateString({
      parts: parts
    });
  } else {
    return new TemplateString({
      parts: []
    });
  }
};

var _default = TemplateString;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/XML/XMLConstant.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/XML/XMLConstant.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var XMLConstant = {
  TYPE_ELEMENT: 1,
  TYPE_TEXT: 3,
  TYPE_COMMENT: 8,
  TYPE_DECLARATION: 16
};
var _default = XMLConstant;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/XML/XMLDeclarationNode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/XML/XMLDeclarationNode.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _XMLConstant = _interopRequireDefault(require("./XMLConstant"));


function XMLDeclaretionNode() {
  this.nodeType = _XMLConstant.default.TYPE_DECLARATION;
  this.parentNode;
  /**
   * @type {String}
   */

  this.tagName = '';
  /**
  * @type {XMLElement}
  */

  this.parentNode;
  this.attributes = {};
}
/**
 * @param {String} name attribute name
 */


XMLDeclaretionNode.prototype.getAttribute = function (name) {
  return this.attributes[name];
};
/**
 * @param {String} name attribute name
 * @param {String} value 
 */


XMLDeclaretionNode.prototype.setAttribute = function (name, value) {
  this.attributes[name] = value;
};
/**
 * @param {String} name attribute name
 */


XMLDeclaretionNode.prototype.removeAttribute = function (name) {
  delete this.attributes[name];
};

XMLDeclaretionNode.prototype.remove = function () {
  if (this.parentNode) {
    this.parentNode.removeChild(this);
  }
};

XMLDeclaretionNode.prototype.toObject = function () {
  return {
    nodeType: this.nodeType,
    tagName: this.tagName,
    attributes: Object.assign({}, this.attributes)
  };
};

var _default = XMLDeclaretionNode;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/XML/XMLClassList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/XML/XMLClassList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/**
 * 
 * @param {XMLElement} xmlNode 
 */
function XMLClassList(xmlNode) {
  this.xmlNode = xmlNode;
}
/**
 * @param {String} name
 * @returns {Boolean}
 */


XMLClassList.prototype.contains = function (name) {
  var className = this.xmlNode.getAttribute('class');

  if (className) {
    var classes = className.trim().split(/\s+/);

    for (var i = 0; i < classes.length; ++i) {
      if (classes[i] == name) return true;
    }

    return false;
  } else return false;
};
/**
 * @param {Number} index
 * @returns {String}
 */


XMLClassList.prototype.item = function (index) {
  var className = this.xmlNode.getAttribute('class');

  if (className) {
    var classes = className.trim().split(/\s+/);
    return classes[index];
  } else return undefined;
};
/**
 * @param {Array<String>} arguments
 */


XMLClassList.prototype.remove = function () {
  var dict = Array.prototype.reduce.call(arguments, function (ac, name) {
    ac[name] = true;
    return ac;
  }, {});
  var className = this.xmlNode.getAttribute('class');

  if (className) {
    var classes = className.trim().split(/\s+/);
    var newClasses = classes.filter(function (name) {
      dict[name];
    });
    this.xmlNode.setAttribute(newClasses.join(' '));
  }
};
/**
 * @param {Array<String>} arguments
 */


XMLClassList.prototype.add = function () {
  var className = this.xmlNode.getAttribute('class') || '';
  var classes = className.trim().split(/\s+/);
  var dict = classes.reduce(function (ac, name) {
    ac[name] = true;
    return ac;
  }, {});

  for (var i = 0; i < arguments.length; ++i) {
    var newClass = arguments[i].trim();
    if (newClass.length == 0) return;

    if (!dict[newClass]) {
      classes.push(newClass);
      dict[newClass] = true;
    }
  }

  this.xmlNode.setAttribute('class', classes.join(' '));
};

var _default = XMLClassList;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/XML/XMLElement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/XML/XMLElement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _XMLClassList = _interopRequireDefault(require("./XMLClassList"));

var _XMLConstant = _interopRequireDefault(require("./XMLConstant"));


function XMLElement() {
  this.nodeType = _XMLConstant.default.TYPE_ELEMENT;
  /**
   * @type {String}
   */

  this.tagName = '';
  /**
   * @type {XMLElement}
   */

  this.parentNode;
  this.attributes = {};
  /**
   * @type {Array} Array of  XMLElement or XMLText
   */

  this.childNodes = [];
  Object.defineProperty(this, 'classList', {
    value: new _XMLClassList.default(this),
    writable: false
  });
}
/**
 * @param {String} name attribute name
 */


XMLElement.prototype.getAttribute = function (name) {
  return this.attributes[name];
};
/**
 * @param {String} name attribute name
 * @param {String} value 
 */


XMLElement.prototype.setAttribute = function (name, value) {
  this.attributes[name] = value;
};
/**
 * @param {String} name attribute name
 */


XMLElement.prototype.removeAttribute = function (name) {
  delete this.attributes[name];
};

XMLElement.prototype.appendChild = function (node) {
  node.remove();
  this.childNodes.push(node);
  node.parentNode = this;
  return node;
};
/**
 * @param {XMLElement} child
 * @returns {XMLElement} removed node
 */


XMLElement.prototype.removeChild = function (child) {
  var result;

  if (this == child.parentNode) {
    var j = 0;

    for (var i = 0; i < this.childNodes.length; ++i) {
      if (child != this.childNodes[i]) {
        this.childNodes[j] = this.childNodes[i];
        ++j;
      } else {
        child.parentNode = undefined;
        result = child;
      }
    }

    while (j > this.childNodes.length) {
      this.childNodes.pop();
    }
  }

  return result;
};
/**
 * @param {XMLElement|XMLText|XMLDeclaretionNode} node
 */


XMLElement.prototype.inserBefore = function (node, child) {
  if (node == child) return;
  var childIndex = -1;

  for (var i = 0; i < this.childNodes.length; ++i) {
    if (this.childNodes[i] == child) {
      childIndex = i;
      break;
    }
  }

  if (childIndex < 0) return;
  node.remove();
  node.parentNode = this;
  this.childNodes.push(null);
  var cIndex = this.childNodes.length - 2;

  while (cIndex >= 0) {
    if (this.childNodes[cIndex] == child) {
      this.childNodes[cIndex + 1] = node;
    } else this.childNodes[cIndex + 1] = this.childNodes[cIndex];
  }
};

XMLElement.prototype.remove = function () {
  if (this.parentNode) {
    this.parentNode.removeChild(this);
  }
};

XMLElement.prototype.toObject = function () {
  return {
    nodeType: this.nodeType,
    tagName: this.tagName,
    attributes: Object.assign({}, this.attributes),
    childNodes: this.childNodes.map(function (child) {
      return child.toObject();
    })
  };
};

var _default = XMLElement;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/XML/XMLTextNode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/XML/XMLTextNode.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _XMLConstant = _interopRequireDefault(require("./XMLConstant"));


function XMLTextNode(data) {
  this.nodeType = _XMLConstant.default.TYPE_TEXT;
  /**
   * @type {XMLNode}
   */

  this.parentNode;
  /**
   * @type {String}
   */

  this.data = data || '';
}

XMLTextNode.prototype.remove = function () {
  if (this.parentNode) {
    this.parentNode.removeChild(this);
  }
};

XMLTextNode.prototype.toObject = function () {
  return {
    nodeType: this.nodeType,
    data: this.data
  };
};

var _default = XMLTextNode;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/XML/XMLCommentNode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/XML/XMLCommentNode.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _XMLConstant = _interopRequireDefault(require("./XMLConstant"));


function XMLCommentNode(data) {
  this.nodeType = _XMLConstant.default.TYPE_COMMENT;
  /**
   * @type {XMLNode}
   */

  this.parentNode;
  /**
   * @type {String}
   */

  this.data = data || '';
}

XMLCommentNode.prototype.remove = function () {
  if (this.parentNode) {
    this.parentNode.removeChild(this);
  }
};

XMLCommentNode.prototype.toObject = function () {
  return {
    nodeType: this.nodeType,
    data: this.data
  };
};

var _default = XMLCommentNode;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/XML/XML.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/XML/XML.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _XMLDeclarationNode = _interopRequireDefault(require("./XMLDeclarationNode"));

var _XMLElement = _interopRequireDefault(require("./XMLElement"));

var _XMLTextNode = _interopRequireDefault(require("./XMLTextNode"));

var _XMLConstant = _interopRequireDefault(require("./XMLConstant"));

var _XMLCommentNode = _interopRequireDefault(require("./XMLCommentNode"));


/**
 * 
 * @param {RegExp} regex 
 */
function getRegexBody(regex) {
  return regex.toString().match(/^\/(.+)\/([gimuy]*)$/)[1];
}

var BEGIN_TAG = 1;
var END_TAG = 2;
var CDATA = 3;
var DECLARATION = 4;
var COMMENT = 5;
var TEXT = 6;
var identRgx = /[^\s\"\r\n\'\!\/=\>\<\]\[\?\+\.]+/;
var spaceRgx = /[\s\r\n]+/;
var stringRgx = /\"(([^\"\\]*|(\\.))*)\"/;
var textRgx = /[^\<\-]+/;
var doctypeOpenRgx = /\<\!DOCTYPE/;
var commentOpenRgx = /\<!\-\-/;
var commentCloseRgx = /\-\-\>/;
var cdataOpenRgx = /\<\!\[CDATA\[/;
var cdataCloseRgx = /\]\]\>/;
var openRgx = /\</;
var openEndTagRgx = /\<\//;
var closeRgx = /\>/;
var shortCloseRgx = /\/\>/;
var declarationOpenRgx = /\<\?/;
var declarationCloseRgx = /\?\>/;
var assignOpRgx = /=/;
var tokenRgxBody = '(' + [spaceRgx, doctypeOpenRgx, declarationOpenRgx, cdataOpenRgx, commentOpenRgx, openEndTagRgx, openRgx, assignOpRgx, stringRgx, commentCloseRgx, identRgx, declarationCloseRgx, shortCloseRgx, closeRgx, cdataCloseRgx, textRgx].map(function (e) {
  return getRegexBody(e);
}).join(')|(') + ')';
var tokenType = {
  space: spaceRgx,
  doctypeOpen: doctypeOpenRgx,
  declarationOpen: declarationOpenRgx,
  cdataOpen: cdataOpenRgx,
  commentOpen: commentOpenRgx,
  openEndTag: openEndTagRgx,
  open: openRgx,
  ident: identRgx,
  assignOp: assignOpRgx,
  string: stringRgx,
  commentClose: commentCloseRgx,
  declarationClose: declarationCloseRgx,
  shortClose: shortCloseRgx,
  close: closeRgx,
  cdataClose: cdataCloseRgx,
  text: textRgx
};
var tokenRgx = new RegExp(tokenRgxBody);
/**
 * 
 * @typedef {Object} Token
 * @property {String} text
 * @property {*} matched
 */

/**
 * 
 * @param {String} text 
 * @returns {Array<Token>}
 */

function xmlTokenize(text) {
  var texts = text.match(new RegExp(tokenRgxBody, 'g'));
  return text.match(new RegExp(tokenRgxBody, 'g')).map(function (tokenText, i) {
    var result = {
      text: tokenText,
      matched: {}
    };

    for (var tType in tokenType) {
      var matched = tokenText.match(tokenType[tType]);

      if (matched) {
        if (matched[0] == tokenText) result.matched[tType] = matched;
      }
    }

    return result;
  });
}
/**
 * @typedef {Object} XMLPaseInfo
 * @property {Array<Token>} tokens
 * @property {Number} type
 * @property {Number} start
 * @property {Number} end
 * @property {Error} error
 * @property {Boolean} closed
 * 
 * 
 * 
 * @typedef {Object} XMLParseNode 
 * @property {XMLPaseInfo} __xml__
 * @property {String} tagName
 * @property {*} attributes
 * @property {String} text
 */

/**
 * 
 * @param {Array<Token>} tokens 
 * @param {Number} i 
 * @returns {XMLParseNode}
 */


function matchAssign(tokens, i) {
  var result = {
    __xml__: {
      start: i
    }
  };
  var cToken;

  if (i < tokens.length) {
    cToken = tokens[i];

    if (cToken.matched['ident']) {
      result.key = cToken.text;
      ++i;

      if (i < tokens.length) {
        cToken = tokens[i];

        if (cToken.matched['space']) {
          ++i;
        }

        if (i < tokens.length) {
          cToken = tokens[i];

          if (cToken.matched['assignOp']) {
            ++i;

            if (i < tokens.length) {
              cToken = tokens[i];

              if (cToken.matched['space']) {
                ++i;
              }

              if (i < tokens.length) {
                cToken = tokens[i];

                if (cToken.matched['string']) {
                  result.value = cToken.matched.string[1];
                  ++i;
                } else {
                  result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected string');
                }
              } else {
                result.__xml__.error = new Error('End of data found, expected ident');
              }
            } else {
              result.__xml__.error = new Error('End of data found, expected ident');
            }
          } else {
            result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected =');
          }
        } else {
          result.__xml__.error = new Error('End of data found, expected =');
        }
      } else {
        result.__xml__.error = new Error('End of data found, expected =');
      }
    } else {
      result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected ident');
    }
  } else {
    result.__xml__.error = new Error('End of data found, expected ident');
  }

  result.__xml__.end = i;
  return result;
}
/**
 * 
 * @param {Array<Token>} tokens 
 * @param {Number} i 
 * @returns {XMLParseNode}
 */


function matchBeginTag(tokens, i) {
  var result = {
    __xml__: {
      type: BEGIN_TAG,
      start: i
    }
  };
  var cToken;

  if (i < tokens.length) {
    cToken = tokens[i];

    if (cToken.matched['open']) {
      ++i;

      if (i < tokens.length) {
        cToken = tokens[i];

        if (cToken.matched['ident']) {
          result.tagName = cToken.text;
          ++i;

          if (i < tokens.length) {
            var finished = false; //when find the close symbol

            while (i < tokens.length) {
              cToken = tokens[i];

              if (cToken.matched['space']) {
                ++i;
              } //skip space between attributes


              if (i < tokens.length) {
                cToken = tokens[i];

                if (cToken.matched['shortClose']) {
                  result.__xml__.closed = true;
                  ++i;
                  finished = true;
                  break;
                } else if (cToken.matched['close']) {
                  result.__xml__.closed = false;
                  ++i;
                  finished = true;
                  break;
                } else if (tokens[i - 1].matched['space']) {
                  var assign = matchAssign(tokens, i);

                  if (!assign.__xml__.error) {
                    result.attributes = result.attributes || {};
                    result.attributes[assign.key] = assign.value;
                    i = assign.__xml__.end;
                  } else if (cToken.matched['ident']) {
                    result.attributes = result.attributes || {};
                    result.attributes[cToken.text] = true; // a flag

                    ++i;
                  } else {
                    //TODO: we can ignore some error here, the same with order Match* function
                    result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected > or indent');
                    break;
                  }
                } else {
                  //TODO: we can ignore some error here
                  result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected > or indent');
                  break;
                }
              } else {
                result.__xml__.error = new Error('End of data found, expected /> or >');
                break;
              }
            }

            if (!finished && !result.__xml__.error) {
              result.__xml__.error = new Error('End of data found, expected /> or >');
            }
          } else {
            result.__xml__.error = new Error('End of data found, expected /> or >');
          }
        } else {
          result.__xml__.error = new Error('Expected indent');
        }
      } else {
        result.__xml__.error = new Error('End of data found, expected indent');
      }

      result.__xml__.end = i;
    } else {
      result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected <');
    }
  } else {
    result.__xml__.error = new Error('End of data found, expected <');
  }

  result.__xml__.end = i;
  return result;
}
/**
 * 
 * @param {Array<Token>} tokens 
 * @param {Number} i 
 * @returns {XMLParseNode}
 */


function matchEndTag(tokens, i) {
  var result = {
    __xml__: {
      type: END_TAG,
      closed: true,
      start: i
    }
  };
  var cToken;

  if (i < tokens.length) {
    cToken = tokens[i];

    if (cToken.matched['openEndTag']) {
      ++i;

      if (i < tokens.length) {
        cToken = tokens[i];

        if (cToken.matched['ident']) {
          result.tagName = cToken.text;
          ++i;

          if (i < tokens.length) {
            var finished = false; //when find the close symbol

            while (i < tokens.length) {
              cToken = tokens[i];

              if (cToken.matched['space']) {
                ++i;
              } //skip space between attributes


              if (i < tokens.length) {
                cToken = tokens[i];

                if (cToken.matched['close']) {
                  ++i;
                  finished = true;
                  break;
                } else if (tokens[i - 1].matched['space']) {
                  var assign = matchAssign(tokens, i);

                  if (!assign.__xml__.error) {
                    result.attributes = result.attributes || {};
                    result.attributes[assign.key] = assign.value;
                    i = assign.__xml__.end;
                  } else if (cToken.matched['ident']) {
                    result.attributes = result.attributes || {};
                    result.attributes[cToken.text] = true; // a flag

                    ++i;
                  } else {
                    result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected > or indent');
                  }
                } else {
                  result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected > or indent');
                }
              } else {
                result.__xml__.error = new Error('End of data found, expected /> or >');
              }
            }

            if (!finished && !result.__xml__.error) {
              result.__xml__.error = new Error('End of data found, expected /> or >');
            }
          } else {
            result.__xml__.error = new Error('End of data found, expected /> or >');
          }
        } else {
          result.__xml__.error = new Error('Expected indent');
        }
      } else {
        result.__xml__.error = new Error('End of data found, expected indent');
      }

      result.__xml__.end = i;
    } else {
      result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected <');
    }
  } else {
    result.__xml__.error = new Error('End of data found, expected <');
  }

  result.__xml__.end = i;
  return result;
}
/**
 * 
 * @param {Array<Token>} tokens 
 * @param {Number} i 
 * @returns {XMLParseNode}
 */


function matchDeclaration(tokens, i) {
  var result = {
    __xml__: {
      type: DECLARATION,
      start: i
    }
  };
  var cToken;

  if (i < tokens.length) {
    cToken = tokens[i];

    if (cToken.matched['declarationOpen']) {
      ++i;

      if (i < tokens.length) {
        cToken = tokens[i];

        if (cToken.matched['ident']) {
          result.tagName = cToken.text;
          ++i;

          if (i < tokens.length) {
            var finished = false; //when find the close symbol

            while (i < tokens.length) {
              cToken = tokens[i];

              if (cToken.matched['space']) {
                ++i;
              } //skip space between attributes


              if (i < tokens.length) {
                cToken = tokens[i];

                if (cToken.matched['declarationClose']) {
                  result.__xml__.closed = false;
                  ++i;
                  finished = true;
                  break;
                } else if (tokens[i - 1].matched['space']) {
                  var assign = matchAssign(tokens, i);

                  if (!assign.__xml__.error) {
                    result.attributes = result.attributes || {};
                    result.attributes[assign.key] = assign.value;
                    i = assign.__xml__.end;
                  } else if (cToken.matched['ident']) {
                    result.attributes = result.attributes || {};
                    result.attributes[cToken.text] = true; // a flag

                    ++i;
                  } else {
                    result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected > or indent');
                  }
                } else {
                  result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected > or indent');
                }
              } else {
                result.__xml__.error = new Error('End of data found, expected /> or >');
              }
            }

            if (!finished && !result.__xml__.error) {
              result.__xml__.error = new Error('End of data found, expected /> or >');
            }
          } else {
            result.__xml__.error = new Error('End of data found, expected /> or >');
          }
        } else {
          result.__xml__.error = new Error('Expected indent');
        }
      } else {
        result.__xml__.error = new Error('End of data found, expected indent');
      }

      result.__xml__.end = i;
    } else {
      result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected <');
    }
  } else {
    result.__xml__.error = new Error('End of data found, expected <');
  }

  result.__xml__.end = i;
  return result;
}
/**
 * 
 * @param {Array<Token>} tokens 
 * @param {Number} i 
 * @returns {XMLParseNode}
 */


function matchCData(tokens, i) {
  var result = {
    __xml__: {
      type: CDATA,
      start: i
    }
  };
  var cToken;

  if (i < tokens.length) {
    cToken = tokens[i];

    if (cToken.matched['cdataOpen']) {
      ++i;
      result.text = '';
      var finished = false;

      while (i < tokens.length) {
        cToken = tokens[i];

        if (cToken.matched['cdataClose']) {
          finished = true;
          ++i;
          break;
        } else {
          result.text += cToken.text;
          ++i;
        }
      }

      if (!finished) {
        result.__xml__.error = new Error('End of data found, expected ]]>');
      }
    } else {
      result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected <![CDATA[');
    }
  } else {
    result.__xml__.error = new Error('End of data found, expected <![CDATA[');
  }

  result.__xml__.end = i;
  return result;
}
/**
 * 
 * @param {Array<Token>} tokens 
 * @param {Number} i 
 * @returns {XMLParseNode}
 */


function matchComment(tokens, i) {
  var result = {
    __xml__: {
      type: COMMENT,
      start: i
    }
  };
  var cToken;

  if (i < tokens.length) {
    cToken = tokens[i];

    if (cToken.matched['commentOpen']) {
      ++i;
      result.text = '';
      var finished = false;

      while (i < tokens.length) {
        cToken = tokens[i];

        if (cToken.matched['commentClose']) {
          finished = true;
          ++i;
          break;
        } else {
          result.text += cToken.text;
          ++i;
        }
      }

      if (!finished) {
        result.__xml__.error = new Error('End of data found, expected -->');
      }
    } else {
      result.__xml__.error = new Error('"' + cToken.text + '"' + 'found, expected <!--');
    }
  } else {
    result.__xml__.error = new Error('End of data found, expected <!--');
  }

  result.__xml__.end = i;
  return result;
}
/**
 * 
 * @param {Token} tokens 
 */


function parseXMLTab(tokens) {
  var tabs = [];
  var i = 0;

  while (i < tokens.length) {
    var comment = matchComment(tokens, i);

    if (!comment.__xml__.error) {
      tabs.push(comment);
      i = comment.__xml__.end;
    } else {
      var declaration = matchDeclaration(tokens, i);

      if (!declaration.__xml__.error) {
        tabs.push(declaration);
        i = declaration.__xml__.end;
      } else {
        var begin = matchBeginTag(tokens, i);

        if (!begin.__xml__.error) {
          tabs.push(begin);
          i = begin.__xml__.end;
        } else {
          var end = matchEndTag(tokens, i);

          if (!end.__xml__.error) {
            tabs.push(end);
            i = end.__xml__.end;
          } else {
            var cdata = matchCData(tokens, i);

            if (!cdata.__xml__.error) {
              tabs.push(cdata);
              i = cdata.__xml__.end;
            } else {
              ++i; //skip
            }
          }
        }
      }
    }
  }

  return tabs;
}
/**
 * 
 * @param {Array<Token>} tokens 
 * @param {Array<XMLParseNode>} tabs 
 * @returns {Array<XMLParseNode>}
 */


function parseXMLText(tokens, tabs) {
  var texts = [];
  var ofs = 0;
  var text;
  var tab;

  for (var i = 0; i < tabs.length; ++i) {
    tab = tabs[i];

    if (tab.__xml__.start > ofs) {
      text = tokens.slice(ofs, tab.__xml__.start).map(function (token) {
        return token.text;
      }).join('').trim();
      if (text.length > 0) texts.push({
        __xml__: {
          type: TEXT,
          tokens: tokens,
          start: ofs,
          end: tab.__xml__.start
        },
        text: text
      });
    }

    ofs = tab.__xml__.end;
  }

  if (ofs < tokens.length) {
    text = tokens.slice(ofs).map(function (token) {
      return token.text;
    }).join('').trim();
    if (text.length > 0) texts.push({
      __xml__: {
        type: TEXT,
        tokens: tokens,
        start: ofs,
        end: tab.__xml__.start
      },
      text: text
    });
  }

  return texts;
}
/**
 * 
 * @param {Array<XMLParseNode>} tabs 
 * @param {Array<XMLParseNode>} texts 
 * @return {Array<XMLParseNode>}  
 */


function mergeNodes(tabs, texts) {
  var nodes = [];
  var choose;
  var iTabs = 0,
      iTexts = 0;
  var diTabs, diTexts;
  var minStart;

  do {
    choose = undefined;
    diTabs = 0, diTexts = 0;
    minStart = 100000000;

    if (iTabs < tabs.length) {
      choose = tabs[iTabs];
      minStart = choose.__xml__.start;
      diTabs = 1;
    }

    if (iTexts < texts.length && texts[iTexts].__xml__.start < minStart) {
      choose = texts[iTexts];
      minStart = choose.__xml__.start;
      diTabs = 0;
      diTexts = 1;
    }

    if (choose) {
      iTexts += diTexts;
      iTabs += diTabs;
      nodes.push(choose);
    }
  } while (choose);

  return nodes;
}
/**
 * 
 * @param {String} text 
 * @return {Array<XMLParseNode>} 
 */


function parseXMLTextToXMLParseNode(text) {
  text = text.trim();
  var tokens = xmlTokenize(text.trim());
  var tabs = parseXMLTab(tokens);
  var texts = parseXMLText(tokens, tabs);
  return mergeNodes(tabs, texts);
}
/**
 * 
 * @param {Array<XMLParseNode>} nodes
 * @returns {Array}
 */


function paresNodesToXMLs(nodes) {
  var node;
  var parentXMLElement = new _XMLElement.default();
  parentXMLElement.tagName = "FAKE_DOCUMENT";

  var assignAttributes = function (node, attributes) {
    Object.keys(attributes).forEach(function (key) {
      node.setAttribute(key, attributes[key]);
    });
  };

  var newXMLNode;

  for (var i = 0; i < nodes.length; ++i) {
    node = nodes[i];
    newXMLNode = undefined;

    switch (node.__xml__.type) {
      case DECLARATION:
        newXMLNode = new _XMLDeclarationNode.default();
        newXMLNode.tagName = node.tagName;
        if (node.attributes) assignAttributes(newXMLNode, node.attributes);
        parentXMLElement.appendChild(newXMLNode);
        break;

      case BEGIN_TAG:
        newXMLNode = new _XMLElement.default();
        newXMLNode.tagName = node.tagName;
        if (node.attributes) assignAttributes(newXMLNode, node.attributes);
        parentXMLElement.appendChild(newXMLNode);
        if (!node.__xml__.closed) parentXMLElement = newXMLNode;
        break;

      case END_TAG:
        if (parentXMLElement && node.tagName == parentXMLElement.tagName) {
          parentXMLElement = parentXMLElement.parentNode;
        } else if (parentXMLElement && (parentXMLElement.tagName == 'img' || parentXMLElement.tagName == 'input')) {
          // image can be not close
          while (parentXMLElement.tagName == 'img' || parentXMLElement.tagName == 'input') {
            parentXMLElement = parentXMLElement.parentNode;
          }

          parentXMLElement = parentXMLElement.parentNode;
        } else {
          throw new Error("Unknown close of tagName " + node.tagName + ', but ' + (parentXMLElement ? parentXMLElement.tagName : "EOF") + ' expected');
        }

        break;

      case TEXT:
        newXMLNode = new _XMLTextNode.default(node.text);
        parentXMLElement.appendChild(newXMLNode);
        break;

      case COMMENT:
        newXMLNode = new _XMLCommentNode.default(node.text);
        parentXMLElement.appendChild(newXMLNode);
        break;
    }
  }

  return parentXMLElement.childNodes.slice().map(function (e) {
    e.remove();
    return e;
  });
}
/**
 * 
 * @param {XMLElement} node 
 */


function makeOpenXMLElementTab(node) {
  var res = '<' + node.tagName;
  var attributesText = Object.keys(node.attributes).map(function (key) {
    var value = node.attributes[key];

    if (value === null) {
      return key;
    } else {
      return key + '=' + '"' + value + '"';
    }
  }).join(' ');

  if (attributesText.length > 0) {
    res += ' ' + attributesText;
  }

  res += '>';
  return res;
}
/**
 * 
 * @param {XMLDeclaretionNode} node 
 */


function makeXMLDeclaretionTab(node) {
  var res = '<?' + node.tagName;
  var attributesText = Object.keys(node.attributes).map(function (key) {
    var value = node.attributes[key];

    if (value === null) {
      return key;
    } else {
      return key + '=' + '"' + value + '"';
    }
  }).join(' ');

  if (attributesText.length > 0) {
    res += ' ' + attributesText;
  }

  res += '?>';
  return res;
}
/**
 * 
 * @param {XMLDeclaretionNode} node 
 */


function makeXMLCommentTab(node) {
  var res = '<!--' + node.data + '-->';
  return res;
}

var XML = {};
/**
 * @param {String} code
 * @returns {Array<XMLElement>}
 */

XML.parseLikeHTML = function (code) {
  var nodes = parseXMLTextToXMLParseNode(code); // console.log('nodes', nodes);

  var xmls = paresNodesToXMLs(nodes);
  return xmls;
};
/**
 * @param {String} code
 * @returns {XMLElement}
 */


XML.parse = function (code) {
  var xmls = this.parseLikeHTML(code);
  if (xmls.length == 0) return undefined;
  var obj = xmls[xmls.length - 1].toObject();
  return obj;
};

XML.DFNodeVisit = function (node, handlers, accumulator) {
  if (!node.childNodes || node.childNodes.length == 0) {
    if (handlers.leaf) handlers.leaf(accumulator, node);
  } else {
    if (handlers.open) handlers.open(accumulator, node);

    for (var i = 0; i < node.childNodes.length; ++i) {
      this.DFNodeVisit(node.childNodes[i], handlers, accumulator);
    }

    if (handlers.close) handlers.close(accumulator, node);
    return accumulator;
  }
};
/**
 * @typedef {Object} XMLBeautifyOption
 * @property {String} indent
 * @property {Number} initDepth 
 */

/**
 * @param {Array<XMLElement>} o 
 * @param {XMLBeautifyOption} beautifyOption 
 * 
 * 
 */


XML.stringify = function (o, beautifyOption) {
  var texts = [];
  var indent = '';
  var lineBreak = '';
  var depth = 0;

  if (beautifyOption) {
    lineBreak = '\n';
    indent = typeof beautifyOption.indent == 'string' ? beautifyOption.indent : '    ';
    depth = beautifyOption.initDepth || 0;
  }

  if (!(o instanceof Array)) {
    o = [o];
  }

  var visitor = {
    open: function (ac, node) {
      var currentLineIndent = ac.lineIndentStack[ac.lineIndentStack.length - 1];
      var openTabText = makeOpenXMLElementTab(node);
      ac.texts.push(currentLineIndent + openTabText);
      ac.lineIndentStack.push(currentLineIndent + ac.indent);
    },
    close: function (ac, node) {
      ac.lineIndentStack.pop();
      var currentLineIndent = ac.lineIndentStack[ac.lineIndentStack.length - 1];
      var endTab = '</' + node.tagName + '>';

      if (node.childNodes.length == 1 && node.childNodes[0].nodeType == _XMLConstant.default.TYPE_TEXT) {
        ac.texts[ac.texts.length - 1] += endTab;
      } else {
        ac.texts.push(currentLineIndent + endTab);
      }
    },
    leaf: function (ac, node) {
      var currentLineIndent = ac.lineIndentStack[ac.lineIndentStack.length - 1];
      var tab;

      if (node.nodeType == _XMLConstant.default.TYPE_TEXT) {
        if (node.parentNode && node.parentNode.childNodes.length == 1) {
          ac.texts[ac.texts.length - 1] += node.data;
        } else {
          ac.texts.push(currentLineIndent + node.data);
        }
      } else if (node.nodeType == _XMLConstant.default.TYPE_ELEMENT) {
        var openTabText = makeOpenXMLElementTab(node);
        var endTab = '</' + node.tagName + '>';
        ac.texts.push(currentLineIndent + openTabText + endTab);
      } else if (node.nodeType == _XMLConstant.default.TYPE_DECLARATION) {
        tab = makeXMLDeclaretionTab(node);
        ac.texts.push(currentLineIndent + tab);
      } else if (node.nodeType == _XMLConstant.default.TYPE_COMMENT) {
        tab = makeXMLCommentTab(node);
        ac.texts.push(currentLineIndent + tab);
      }
    }
  };

  for (var i = 0; i < o.length; ++i) {
    this.DFNodeVisit(o[i], visitor, {
      depth: 0,
      texts: texts,
      lineIndentStack: [''],
      indent: indent
    });
  }

  return texts.join(lineBreak);
};

var _default = XML;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/JSMaker/TemplateXML.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSMaker/TemplateXML.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _XML = _interopRequireDefault(require("../XML/XML"));

var _XMLConstant = _interopRequireDefault(require("../XML/XMLConstant"));

var _TemplateString = _interopRequireDefault(require("./TemplateString"));


function TemplateXML(props) {
  this.xml = props.xml;
}

TemplateXML.prototype._xmlNodeToJSCode = function (node) {
  var body = [];

  if (node.nodeType == _XMLConstant.default.TYPE_ELEMENT) {
    body.push('tag:' + JSON.stringify(node.tagName));
    var attributeKeys = Object.keys(node.attributes).filter(function (x) {
      return x != 'class' && x != 'style' && !x.startsWith('az-');
    });

    if (attributeKeys && attributeKeys.length > 0) {
      body.push('attr: {' + attributeKeys.map(function (key) {
        return JSON.stringify(key) + ': ' + _TemplateString.default.parse(node.attributes[key]).toJSCode();
      }).join(', ') + '}');
    }

    if (node.attributes['az-props']) {
      body.push('props: ' + _TemplateString.default.parse(node.attributes['az-props']).toJSCode());
    }

    if (node.attributes['az-data']) {
      body.push('data: ' + _TemplateString.default.parse(node.attributes['az-data']).toJSCode());
    }

    if (node.attributes.style) {
      var styleSheet = node.attributes.style.split(';').map(function (s) {
        var t = s.split(':').map(function (text) {
          return text.trim();
        });

        if (t.length == 2) {
          return JSON.stringify(t[0]) + ': ' + JSON.stringify(t[1]);
        } else return false;
      }).filter(function (e) {
        return !!e;
      });

      if (styleSheet.length > 0) {
        body.push('style:{' + styleSheet.join(',') + '}');
      }
    }

    if (node.attributes.class) {
      var classList = node.attributes.class.trim().split(/\s+/);
      if (classList.length > 0) body.push('class:' + JSON.stringify(classList));
    }

    if (node.childNodes && node.childNodes.length > 0) {
      var childList = '[' + node.childNodes.filter(function (e) {
        return e.nodeType == _XMLConstant.default.TYPE_ELEMENT || e.nodeType == _XMLConstant.default.TYPE_TEXT;
      }).map(function (e) {
        return this._xmlNodeToJSCode(e);
      }.bind(this)).filter(function (e) {
        return !!e;
      }).join(', ') + ']';
      if (childList && childList.length > 0) body.push('child: ' + childList);
    }
  } else if (node.nodeType == _XMLConstant.default.TYPE_TEXT) {
    body.push('text: ' + _TemplateString.default.parse(node.data).toJSCode());
  } else return undefined;

  var res = '{' + body.join(', ') + '}';
  return res;
};

TemplateXML.prototype.toJSCode = function () {
  var res = this._xmlNodeToJSCode(this.xml);

  return res;
};
/**
 * 
 * @param  {...any} args 
 * @returns {Function}
 */


TemplateXML.compileToFunction = function () {
  var innerCode = 'return ' + this.parse(arguments[arguments.length - 1]).toJSCode() + ';';
  var fParam = Array.prototype.slice.call(arguments, 0, arguments.length - 1);
  fParam.push(innerCode);
  return Function.apply(null, fParam);
};

TemplateXML.parse = function (text) {
  var xml = _XML.default.parse(text);

  if (xml) {
    return new TemplateXML({
      xml: xml
    });
  } else return undefined;
};

var _default = TemplateXML;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/OOP.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/OOP.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var OOP = {};
/**
 * @param {Object} object
 * @param {String} key
 * @param {Function} method
 */

OOP.overrideMethod = function (object, key, method) {
  if (object[key] === undefined) object[key] = method;else {
    var _superMethod = object[key];

    object[key] = function (_superMethod, method) {
      return function () {
        var _super = this.super;
        this.super = _superMethod;
        var result = method.apply(this, arguments);
        this.super = _super;
        return result;
      };
    }(_superMethod, method);
  }
};

OOP.extends = function (object, prototype) {
  // do not use setter, getter
  for (var key in prototype) {
    if (key !== 'constructor' && key !== '__proto__') {
      if (typeof prototype[key] == 'function') {
        OOP.overrideMethod(object, key, prototype[key]);
      } else if (prototype[key] !== undefined && prototype[key] !== null) {
        object[key] = prototype[key]; //just copy
      }
    }
  }
};

OOP.inherit = function (child, parent) {
  // do not use setter, getter
  Object.keys(parent).forEach(function (key) {
    if (key !== 'constructor' && typeof parent[key] == 'function') {
      var superMethod = parent[key];
      var currentMethod = child[key];
      if (!currentMethod) child[key] = superMethod;else {
        child[key] = function () {
          var _super = this.super;
          this.super = superMethod;
          var result = currentMethod.apply(this, arguments);
          this.super = _super;
          return result;
        };
      }
    }
  });
};

OOP.drillProperty = function (topObject, botObject, keyTop, keyBot) {
  if (typeof keyTop == 'string') {
    keyBot = keyBot || keyTop;
    Object.defineProperty(topObject, keyTop, {
      set: function (value) {
        botObject[keyBot] = value;
      },
      get: function () {
        return botObject[keyBot];
      }
    });
  } else {
    if (keyTop instanceof Array) {
      for (var i = 0; i < keyTop.length; ++i) {
        OOP.drillProperty(topObject, botObject, keyTop[i], keyTop[i]);
      }
    } else {
      for (var key in keyTop) {
        OOP.drillProperty(topObject, botObject, key, keyTop[key]);
      }
    }
  }
};

OOP.bindFunctions = function (_this, handlers) {
  var res = {};

  for (var key in handlers) {
    res[key] = handlers[key].bind(_this);
  }

  return res;
};

OOP.inheritCreator = function (parent, child) {
  var i;

  if (child.property) {
    if (parent.property) {
      for (i in parent.property) {
        if (!child.property[i]) child.property[i] = parent.property[i];
      }
    }
  }

  for (i in parent.prototype) {
    if (!child.prototype[i]) {
      child.prototype[i] = parent.prototype[i];
    } else {
      child.prototype[i] = function (superFunction, childFunction) {
        return function () {
          var _super = this.super;
          this.super = superFunction;
          var result = childFunction.apply(this, arguments);
          this.super = _super;
          return result;
        };
      }(parent.prototype[i], child.prototype[i]);
    }
  }
};
/***
 *
 * @param {Function} constructor
 */


OOP.mixClass = function (constructor) {
  var descriptors = {};

  for (var i = 1; i < arguments.length; ++i) {
    Object.assign(descriptors, Object.getOwnPropertyDescriptors(arguments[i].prototype));
  }

  delete descriptors.constructor;
  Object.defineProperties(constructor.prototype, descriptors);
};

var _default = OOP;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/String/getFunctionName.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/String/getFunctionName.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = getFunctionName;

/**
 * 
 * @param {Function} func 
 */
function getFunctionName(func) {
  var ret = func.toString();
  ret = ret.substr('function '.length);
  ret = ret.substr(0, ret.indexOf('('));
  return ret;
}
};

moduleFactories["node_modules/absol/src/HTML5/AElement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/AElement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("./EventEmitter"));

var _BrowserDetector = _interopRequireDefault(require("../Detector/BrowserDetector"));

var _OOP = _interopRequireDefault(require("./OOP"));


/***
 * @augments Node
 * @augments ChildNode
 * @augments ParentNode
 * @augments Element
 * @augments HTMLElement
 * @augments EventEmitter
 * @augments ElementCSSInlineStyle
 * @constructor
 */
function AElement() {
  _EventEmitter.default.call(this);

  this._azar_extendAttributes = this._azar_extendAttributes || {};
  this._azar_extendTags = {};
  this.eventHandler = {};
}

_OOP.default.mixClass(AElement, _EventEmitter.default);

AElement.prototype.init = function (props) {
  Object.assign(this, props || {});
};

AElement.prototype.eventHandler = {};
/***
 * run super-class method
 */

AElement.prototype.super = function () {
  /* nope */
};
/**
 * @typedef {Object} AttributeDefiner
 * @property {Function} set
 * @property {Function} get
 * @property {Function} remove
 *
 * @param {String} key
 * @param {AttributeDefiner} def
 */


AElement.prototype.defineAttribute = function (key, def) {
  this._azar_extendAttributes[key] = def;
};

AElement.prototype.defineAttributes = function (defs) {
  for (var key in defs) {
    this.defineAttribute(key, defs[key]);
  }
};

AElement.prototype.attr = function () {
  if (arguments.length === 1) {
    if (typeof arguments[0] == 'string') {
      if (this._azar_extendAttributes[arguments[0]]) {
        return this._azar_extendAttributes[arguments[0]].get.call(this);
      } else return this.getAttribute(arguments[0]);
    } else {
      for (var key in arguments[0]) {
        this.attr(key, arguments[0][key]);
      }
    }
  } else {
    if (arguments.length == 2) {
      if (arguments[1] === null || arguments[1] === undefined) {
        if (this._azar_extendAttributes[arguments[0]]) {
          this._azar_extendAttributes[arguments[0]].remove.call(this, arguments[1]);
        } else this.removeAttribute(arguments[0]);
      } else {
        if (this._azar_extendAttributes[arguments[0]]) {
          this._azar_extendAttributes[arguments[0]].set.call(this, arguments[1]);
        } else {
          this.setAttribute(arguments[0], arguments[1]);
        }
      }
    }
  }

  return this;
};
/***
 * add style
 * @param {CSSStyleDeclaration|string|{}} arg0
 * @param {string} arg1
 * @returns {this}
 */

/**
 * add style
 * @param {CSSStyleDeclaration|string|{}} arg0
 * @param {string|[]=} arg1
 * @returns {this}
 */


AElement.prototype.addStyle = function (arg0, arg1) {
  if (typeof arg0 == 'string') {
    if (arg0.indexOf('-') >= 0) {
      if (arg1 && arg1.forEach) {
        this.style.setProperty.apply(this.style, [arg0].concat(arg1));
      } else {
        this.style.setProperty(arg0, arg1);
      }
    } else {
      this.style[arg0] = arg1;
    }
  } else {
    for (var key in arg0) this.addStyle(key, arg0[key]);
  }
  return this;
};
/***
 *
 * @param {string|string[]|CSSStyleDeclaration} arg0
 * @returns {this}
 */


AElement.prototype.removeStyle = function (arg0) {
  var key;

  if (arg0.charAt) {
    if (arg0.indexOf('-') >= 0) {
      this.style.removeProperty(arg0);
    } else {
      this.style[arg0] = null;
      delete this.style[arg0];
    }
  } else {
    if (arg0.map && arg0.forEach) {
      for (var i = 0; i < arg0.length; ++i) this.removeStyle(arg0[i]);
    } else {
      for (key in arg0) this.removeStyle(key);
    }
  }

  return this;
};

AElement.prototype.addChild = function (child) {
  if (child.indexOf && child.map && child.forEach) {
    for (var i = 0; i < child.length; ++i) this.appendChild(child[i]);
  } else this.appendChild(child);

  return this;
};

AElement.prototype.addTo = function (parent) {
  if (parent && parent.appendChild) {
    if (parent.addChild) parent.addChild(this);else parent.appendChild(this);
  } else throw Error("Can not append to " + parent + "!");

  return this;
};

AElement.prototype.selfRemove = function () {
  if (this.parentElement) this.parentElement.removeChild(this);
  return this;
};

AElement.prototype.selfReplace = function (newNode) {
  if (this.parentElement) this.parentElement.replaceChild(newNode, this);
  return this;
};

AElement.prototype.clearChild = function () {
  while (this.firstChild) {
    this.removeChild(this.firstChild);
  }

  return this;
};
/**
 *
 * @param {string|Array} className
 * @returns {Boolean}
 */


AElement.prototype.hasClass = function (className) {
  return this.classList.contains(className);
};
/**
 *
 * @param {string|Array} className
 * @returns {this}
 */


AElement.prototype.addClass = function (className) {
  if (className && className.forEach && className.map) {
    for (var i = 0; i < className.length; ++i) this.classList.add(className[i]);
  } else this.classList.add(className);

  return this;
};
/**
 *
 * @param {string|Array} className
 * @returns {this}
 */


AElement.prototype.removeClass = function (className) {
  if (className && className.forEach && className.map) {
    for (var i = 0; i < className.length; ++i) this.classList.remove(className[i]);
  } else this.classList.remove(className);

  return this;
};

AElement.prototype.getComputedStyleValue = function (key) {
  return window.getComputedStyle(this).getPropertyValue(key);
};

AElement.prototype.getFontSize = function () {
  return parseFloat(this.getComputedStyleValue('font-size').replace('px', ''));
};

AElement.prototype.findChildAfter = function (obj) {
  var r = 0;

  for (var i = 0; i < this.childNodes.length; ++i) {
    if (obj == this.childNodes[i]) {
      r = i + 1;
      break;
    }
  }

  if (this.childNodes[r]) return this.childNodes[r];
  return undefined;
};

AElement.prototype.findChildBefore = function (obj) {
  var r = 0;

  for (var i = 0; i < this.childNodes.length; ++i) {
    if (obj == this.childNodes[i]) {
      r = i - 1;
      break;
    }
  }

  if (this.childNodes[r]) return this.childNodes[r];
  return undefined;
};

AElement.prototype.addChildBefore = function (newItem, bf) {
  this.insertBefore(newItem, bf);
  return this;
};

AElement.prototype.addChildAfter = function (newItem, at) {
  var atIdx;

  if (at) {
    atIdx = Array.prototype.indexOf.call(this.childNodes, at);

    if (atIdx >= 0) {
      this.insertBefore(newItem, this.childNodes[atIdx + 1]);
    } else {
      throw new Error("Failed to execute 'addChildAfter' on 'Node': The node before which the new node is to be inserted is not a child of this node.");
    }
  } else {
    this.insertBefore(newItem, this.firstChild);
  }

  return this;
};
/**
 * @returns {DOMRect}
 */


AElement.prototype.getBoundingRecursiveRect = function (depth) {
  if (depth === undefined) depth = 10000;
  var current, next;
  var oo = 1000000;
  var ac = {
    left: oo,
    right: -oo,
    top: oo,
    bottom: -oo,
    width: 0,
    height: 0
  };
  var stacks = [{
    e: this,
    d: 0
  }];

  while (stacks.length > 0) {
    current = stacks.pop();

    if (current.e.getBoundingClientRect) {
      var cRect = current.e.getBoundingClientRect();
      if (!cRect || !(cRect.width || cRect.height || cRect.left || cRect.right)) continue;
      ac.left = Math.min(ac.left, cRect.left);
      ac.top = Math.min(ac.top, cRect.top);
      ac.bottom = Math.max(ac.bottom, cRect.bottom);
      ac.right = Math.max(ac.right, cRect.right);
      ac.height = ac.bottom - ac.top;
      ac.width = ac.right - ac.left;
      var childNodes = current.e.childNodes;

      if (childNodes && childNodes.length > 0 && current.d < depth) {
        for (var i = 0; i < childNodes.length; ++i) {
          next = {
            e: childNodes[i],
            d: current.d + 1
          };
          stacks.push(next);
        }
      }
    }
  }

  return ac;
};
/***
 *
 * @param parent
 * @returns {boolean}
 */


AElement.prototype.isDescendantOf = function (parent) {
  var child = this;

  while (child) {
    if (child === parent) return true;
    child = child.parentNode;
  }

  return false;
};
/*************************** **********************/


AElement.prototype.getCSSRules = function () {
  var sheets = document.styleSheets;
  var ret = [];
  this.matches = this.matches || this.webkitMatchesSelector || this.mozMatchesSelector || this.msMatchesSelector || this.oMatchesSelector;

  for (var i in sheets) {
    if (sheets[i].href) continue; //because can not access, you must clone link node instead

    var rules = sheets[i].rules || sheets[i].cssRules;

    for (var r in rules) {
      if (this.matches(rules[r].selectorText)) {
        ret.push(rules[r]);
      }
    }
  }

  return ret;
};
/***
 * @returns {Promise}
 */

/***
 * WARNING: this function may be unsafe
 */


AElement.prototype.afterDisplayed = function (requestTimesOut) {
  if (!requestTimesOut) requestTimesOut = 24 * 3600 * 33; // var tracer = new Error();

  var current = this;
  return new Promise(function (resolve, reject) {
    function trace() {
      if (requestTimesOut < 0) {// reject(tracer);
        // if (absol.BUILD && absol.BUILD.version == "DEBUG")
        //     console.warn("Element not displayed", trace);
      } else {
        requestTimesOut--;
        var bound = current.getBoundingClientRect();

        if (bound.width > 0 || bound.height > 0) {
          resolve();
        } else {
          setTimeout(trace, 33);
          return;
        }
      }
    }

    trace();
  });
};

!function () {
  var origin = AElement.prototype.on;

  if (_BrowserDetector.default.isSafari && !_BrowserDetector.default.isMobile) {
    AElement.prototype.on = function () {
      if (!this.isSupportedEvent('mouseleave') && arguments[0] == 'mouseleave') {
        this.defineEvent('mouseleave');

        var mouseLeaveEventHandler = function (event) {
          var bound = this.getBoundingClientRect();
          var ok = false;
          ok |= event.clientX < bound.left + 1;
          ok |= event.clientX >= bound.right - 1;
          ok |= event.clientY < bound.top + 1;
          ok |= event.clientY >= bound.bottom - 1;
          if (ok) this.emit('mouseleave', event);
        };

        this.addEventListener('mouseleave', mouseLeaveEventHandler, true);
      }

      origin.apply(this, arguments);
      return this;
    };
  }

  if (_BrowserDetector.default.isFirefox) {
    AElement.prototype.on = function () {
      if (!this.isSupportedEvent('wheel') && arguments[0] == 'wheel') {
        this.defineEvent('wheel');

        var wheelEventHandler = function (oldEvent) {
          //clone event to avoid some lib fix it
          var event = oldEvent.absolEvent;

          if (!event) {
            event = Object.assign({}, oldEvent);

            for (var i = 0; i < AElement.eventProperties.length; ++i) {
              var key = AElement.eventProperties[i];

              if (typeof event[key] == 'function') {
                event[key] = event[key].bind(oldEvent);
              }
            }

            event.preventDefault = function () {
              oldEvent.preventDefault();
            };

            if (!event.mozFixWheelScale) {
              event.mozDeltaY = oldEvent.deltaY;
              event.mozFixWheelScale = true;
              Object.defineProperty(event, 'deltaY', {
                get: function () {
                  return this.mozDeltaY * 100 / 3;
                }
              });
            }

            oldEvent.absolEvent = event;
          }

          this.emit('wheel', event);
        };

        this.addEventListener('wheel', wheelEventHandler);
      }

      origin.apply(this, arguments);
      return this;
    };
  }
}();
AElement.eventProperties = ["altKey", "bubbles", "button", "buttons", "cancelBubble", "cancelable", "clientX", "clientY", "composed", "ctrlKey", "currentTarget", "defaultPrevented", "deltaMode", "deltaX", "deltaY", "deltaZ", "detail", "eventPhase", "explicitOriginalTarget", "isTrusted", "layerX", "layerY", "metaKey", "movementX", "movementY", "mozInputSource", "mozPressure", "offsetX", "offsetY", "originalTarget", "pageX", "pageY", "rangeOffset", "rangeParent", "region", "relatedTarget", "returnValue", "screenX", "screenY", "shiftKey", "srcElement", "target", "timeStamp", "type", "deltaMode", "deltaX", "deltaY", "deltaZ"];
var _default = AElement;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/AElementNS.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/AElementNS.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _AElement = _interopRequireDefault(require("./AElement"));

var _OOP = _interopRequireDefault(require("./OOP"));


/***
 * @augments AElement
 * @augments SVGGraphicsElement
 * @constructor
 */
function AElementNS() {
  _AElement.default.call(this);
}

_AElement.default.prototype.afterAttached = function () {
  if (this.isDescendantOf(document.body)) return Promise.resolve();
  var attachHookElt = this.$attachhook || this.querySelector('.absol-attachhook');

  if (!attachHookElt) {
    var constructor;

    if (this.tagName.toLowerCase() === 'svg' || this.getBBox) {
      attachHookElt = document.createElementNS('http://www.w3.org/2000/svg', 'image');
      attachHookElt.setAttributeNS(null, 'href', '');
      constructor = AElementNS;
    } else {
      attachHookElt = document.createElement('img');
      attachHookElt.src = '';
      constructor = AElementNS;
    }

    attachHookElt.classList.add('absol-attachhook');
    Object.assign(attachHookElt, constructor.prototype);
    constructor.call(attachHookElt);
    attachHookElt.defineEvent('attached');
    this.$attachhook = attachHookElt;
    this.$attachhook.on('error', function (event) {
      if (this.isDescendantOf(document.body)) this.emit('attached', event, this);
    });
    this.appendChild(attachHookElt);
  }

  return new Promise(function (rs) {
    attachHookElt.once('attached', rs);
  });
};

_OOP.default.mixClass(AElementNS, _AElement.default);

AElementNS.prototype.attr = function () {
  if (arguments.length == 1) {
    if (typeof arguments[0] == 'string') {
      if (this._azar_extendAttributes[arguments[0]]) {
        return this._azar_extendAttributes[arguments[0]].get.call(this);
      } else return this.getAttributeNS(null, arguments[0]);
    } else {
      for (var key in arguments[0]) {
        this.attr(key, arguments[0][key]);
      }
    }
  } else {
    if (arguments.length == 2) {
      if (arguments[1] === null || arguments[1] === undefined) {
        if (this._azar_extendAttributes[arguments[0]]) {
          this._azar_extendAttributes[arguments[0]].remove.call(this, arguments[1]);
        } else this.removeAttributeNS(null, arguments[0]);
      } else {
        if (this._azar_extendAttributes[arguments[0]]) {
          this._azar_extendAttributes[arguments[0]].set.call(this, arguments[1]);
        } else {
          this.setAttributeNS(null, arguments[0], arguments[1]);
        }
      }
    }
  }

  return this;
};

var _default = AElementNS;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/ElementNS.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/ElementNS.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _AElementNS = _interopRequireDefault(require("./AElementNS"));


var _default = _AElementNS.default;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/AttachHook.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/AttachHook.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.AttachHook = AttachHook;
exports.default = void 0;

/***
 * @extends AElement
 * @constructor
 */
function AttachHook() {
  this.on('error', function (event) {
    if (!this._attached && this.isDescendantOf(document.body)) {
      this._attached = true;
      this.emit('attached', event, this);
    }
  });
}

AttachHook.render = function (data, domInstance) {
  var attributes = {};
  var tag;

  if (domInstance.defaultTag === 'div') {
    attributes.src = '';
    tag = 'img';
  } else {
    tag = 'image';
    attributes.href = '';
  }

  return domInstance._({
    tag: tag,
    class: 'absol-attachhook',
    extendEvent: ['attached'],
    style: {
      display: 'none'
    },
    attr: attributes,
    props: {
      domInstance: domInstance
    }
  });
};

AttachHook.prototype.resetState = function () {
  this._attached = false;

  if (this.tagName.toLowerCase() === 'img') {
    this.src = '';
  } else {
    this.href = '';
  }
};

AttachHook.property = {
  attached: {
    get: function () {
      return !!this._attached;
    }
  }
};
var _default = AttachHook;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/DomSignal.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/DomSignal.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("./EventEmitter"));

var _AElement = _interopRequireDefault(require("./AElement"));

var _OOP = _interopRequireDefault(require("./OOP"));

var _AttachHook = _interopRequireDefault(require("./AttachHook"));


/***
 *
 * @extends EventEmitter
 * @param {AElement=} attachHookElt
 * @constructor
 */
function DomSignal(attachHookElt) {
  _EventEmitter.default.call(this);

  this.signals = {};
  this.ev_attached = this.ev_attached.bind(this);
  this.$attachhook = attachHookElt || this.createBuildInAttachHook();
  this.$attachhookParent = attachHookElt && attachHookElt.parentElement || null;
  this.$attachhook.on('attached', this.ev_attached);
}

_OOP.default.mixClass(DomSignal, _EventEmitter.default);

DomSignal.prototype.createBuildInAttachHook = function () {
  var elt = document.createElement('img');
  Object.defineProperties(elt, Object.getOwnPropertyDescriptors(_AElement.default.prototype));
  Object.defineProperties(elt, Object.getOwnPropertyDescriptors(_AttachHook.default.prototype));
  Object.defineProperties(elt, _AttachHook.default.property);

  _AElement.default.call(elt);

  elt.setAttribute('src', '');
  elt.defineEvent('attached');

  _AttachHook.default.call(elt);

  return elt;
};

DomSignal.prototype.execSignal = function () {
  var signals = this.signals;

  if (this.$attachhook) {
    this.$attachhook.remove();
    this.$attachhook.resetState();
  }

  this.signals = {};

  for (var name in signals) {
    this.fire.apply(this, [name].concat(signals[name]));
  }
};

DomSignal.prototype.emit = function (name) {
  this.signals[name] = Array.prototype.slice.call(arguments, 1);

  if (!this.$attachhookParent) {
    this.$attachhookParent = document.body;
  }

  if (!this.$attachhook.parentElement) {
    this.$attachhookParent.appendChild(this.$attachhook);
  }
};

DomSignal.prototype.ev_attached = function () {
  this.execSignal();
};

var _default = DomSignal;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/ResizeSystem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/ResizeSystem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _AElement = _interopRequireDefault(require("./AElement"));

var _AElementNS = _interopRequireDefault(require("./AElementNS"));

var _DomSignal = _interopRequireDefault(require("./DomSignal"));


/**
 *
 * @constructor
 */
function ResizeSystem() {
  this.elts = [];
  this.cache = [];
  this.cacheOf = null;
  this.lastResizeTime = 0;
  window.addEventListener('resize', this.update.bind(this));
  this['goDown' + 'AndCache'] = this.goDownAndCache.bind(this);
  this['notify' + 'ToElt'] = this.notifyToElt.bind(this);
  setTimeout(() => {
    this.domSignal = new _DomSignal.default();
    this.domSignal.on('request_update_signal', this.update.bind(this));
  }, 1000);
}
/***
 *
 * @param {AElement | AElementNS} elt
 */


ResizeSystem.prototype.goDownAndCache = function (elt) {
  if (this.notifyToElt(elt)) this.cache.push(elt);

  if (elt.childNodes) {
    Array.prototype.forEach.call(elt.childNodes, this.goDownAndCache);
  }
};

ResizeSystem.prototype.notifyToElt = function (elt) {
  if (typeof elt.requestUpdateSize == 'function') {
    elt.requestUpdateSize();
    return true;
  } else if (typeof elt.updateSize == 'function') {
    elt.updateSize();
    return true;
  } else if (typeof elt.onresize == 'function') {
    elt.onresize();
    return true;
  }
};

ResizeSystem.prototype.update = function () {
  var now = new Date().getTime();

  if (now - 100 > this.lastResizeTime) {
    this.removeTrash();
    this.cache = undefined;
  }

  this.lastResizeTime = now;

  if (this.cacheOf !== null) {
    this.cache = undefined;
    this.cacheOf = null;
  }

  if (this.cache === undefined) {
    this.cache = [];
    this.elts.forEach(this.goDownAndCache);
  } else {
    this.cache.forEach(this.notifyToElt);
  }
};

ResizeSystem.prototype.requestUpdateSignal = function () {
  if (!this.domSignal) return;
  this.domSignal.emit('request_update_signal');
};

ResizeSystem.prototype.removeTrash = function () {
  this.elts = this.elts.filter(function (element) {
    return _AElement.default.prototype.isDescendantOf.call(element, document.body);
  });
};
/***
 *
 * @param  {AElement| AElementNS | Node} fromElt
 * @returns {boolean}
 */


ResizeSystem.prototype.updateUp = function (fromElt) {
  while (fromElt) {
    if (typeof fromElt.requestUpdateSize == 'function') {
      fromElt.requestUpdateSize();
      return true;
    } else if (typeof fromElt.updateSize == 'function') {
      fromElt.updateSize();
      return true;
    } else if (typeof fromElt.onresize == 'function') {
      fromElt.onresize();
      return true;
    }

    fromElt = fromElt.parentElement;
  }
};
/***
 *
 * @param  {AElement| AElementNS | Node} fromElt
 * @returns {boolean}
 */


ResizeSystem.prototype.updateDown = function (fromElt) {
  var now = new Date().getTime();

  if (now - 100 > this.lastResizeTime) {
    this.cache = undefined;
  }

  this.lastResizeTime = now;

  if (this.cacheOf !== fromElt) {
    this.cache = undefined;
    this.cacheOf = fromElt;
  }

  if (this.cache === undefined) {
    this.cache = [];
    this.goDownAndCache(fromElt);
  } else {
    this.cache.forEach(this.notifyToElt);
  }
};
/***
 *
 * @param {AElement| AElementNS | Node} elt
 * @return {boolean}
 */


ResizeSystem.prototype.add = function (elt) {
  for (var i = 0; i < this.elts.length; ++i) if (_AElement.default.prototype.isDescendantOf.call(elt, this.elts[i])) {
    return false;
  }

  this.elts = this.elts.filter(function (e) {
    return !_AElement.default.prototype.isDescendantOf.call(e, elt);
  });
  this.elts.push(elt);
  return true;
};

var _default = new ResizeSystem();

exports.default = _default;
};

moduleFactories["node_modules/absol/src/JSX/attribute.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSX/attribute.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseStyleAttr = parseStyleAttr;
exports.parseClassAttr = parseClassAttr;
exports.parseMeasureValue = parseMeasureValue;

/**
 * 
 * @param {String} text 
 *  @returns {Object}
 */
function parseStyleAttr(text) {
  return text.split(';').map(function (line) {
    var parts = line.split(':');
    if (parts.length < 2) return null;
    var key = parts.shift().trim();
    var value = parts.join(':').trim();
    if (key.length == 0 || value.length == 0) return null;
    return [key, value];
  }).filter(function (it) {
    return it != null;
  }).reduce(function (ac, cr) {
    ac[cr[0]] = cr[1];
    return ac;
  }, {});
}
/**
 * 
 * @param {String} text 
 *  @returns {Array<String>}
 */


function parseClassAttr(text) {
  return text.trim().split(/\s+/);
}
/**
 *
 * @param mValue
 * @returns {{unit: null, value: string}|{unit: string, value: number}|null}
 */


function parseMeasureValue(mValue) {
  if (mValue === 'auto') return {
    unit: null,
    value: 'auto'
  };
  if (mValue === 'match_parent') return {
    unit: null,
    value: 'match_parent'
  };
  var value = NaN;
  var unit = null;
  var matched;

  if (typeof mValue === "number") {
    value = mValue;
    unit = 'px';
  } else if (typeof mValue === "string") {
    matched = mValue.match(/([+-]?([0-9]*[.])?[0-9]+([eE][+-]?[0-9]+)?)(px|%|vw|vh)?/i);

    if (matched) {
      value = parseFloat(matched[1]);
      unit = matched[4];
    }
  }

  if (isNaN(value)) return null;
  unit = unit || 'px';
  return {
    value: value,
    unit: unit
  };
}
};

moduleFactories["node_modules/absol/src/HTML5/Dom.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/Dom.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isDomNode = isDomNode;
exports.activeFullScreen = activeFullScreen;
exports.inactiveFullScreen = inactiveFullScreen;
exports.isFullScreen = isFullScreen;
exports.traceOutBoundingClientRect = traceOutBoundingClientRect;
exports.fontFaceIsLoaded = fontFaceIsLoaded;
exports.getScreenSize = getScreenSize;
exports.waitImageLoaded = waitImageLoaded;
exports.waitIFrameLoaded = waitIFrameLoaded;
exports.imageToCanvas = imageToCanvas;
exports.getScrollSize = getScrollSize;
exports.depthClone = depthClone;
exports.depthCloneWithStyle = depthCloneWithStyle;
exports.copyStyleRule = copyStyleRule;
exports.getSystemFontSize = getSystemFontSize;
exports.getTextNodeBound = getTextNodeBound;
exports.getConstructDescriptor = getConstructDescriptor;
exports.default = exports.deactiveFullScreen = exports.FeatureClass = void 0;

var _JSPath = _interopRequireDefault(require("./JSPath"));

var _OOP = _interopRequireDefault(require("./OOP"));

var _getFunctionName = _interopRequireDefault(require("../String/getFunctionName"));

var _ElementNS = _interopRequireDefault(require("./ElementNS"));

var _AElement = _interopRequireDefault(require("./AElement"));

var _ResizeSystem = _interopRequireDefault(require("./ResizeSystem"));

var _attribute = require("../JSX/attribute");

var _AttachHook = _interopRequireDefault(require("./AttachHook"));


/***
 * @typedef {{"accept-charset":string, "http-equiv": string, accept : string, accesskey : string, action : string, align : string, allow : string, alt : string, async : string, autocapitalize : string, autocomplete : string, autofocus : string, autoplay : string, background : string, bgcolor : string, border : string, buffered : string, capture : string, challenge : string, charset : string, checked : string, cite : string, class : string, code : string, codebase : string, color : string, cols : string, colspan : string, content : string, contenteditable : string, contextmenu : string, controls : string, coords : string, crossorigin : string, csp : string, data : string, "data-*" : string, datetime : string, decoding : string, default : string, defer : string, dir : string, dirname : string, disabled : string, download : string, draggable : string, dropzone : string, enctype : string, enterkeyhint : string, for : string,     form : string, formaction : string, formenctype : string, formmethod : string, formnovalidate : string, formtarget : string, headers : string, height : string, hidden : string, high : string, href : string, hreflang : string, icon : string, id : string, importance : string, integrity : string, intrinsicsize : string, inputmode : string, ismap : string, itemprop : string, keytype : string, kind : string, label : string, lang : string, language : string, loading : string, list : string, loop : string, low : string, manifest : string, max : string, maxlength : string, minlength : string, media : string, method : string, min : string, multiple : string, muted : string, name : string, novalidate : string, open : string, optimum : string, pattern : string, ping : string, placeholder : string, poster : string, preload : string, radiogroup : string, readonly : string, referrerpolicy : string, rel : string, required : string, reversed : string, rows : string, rowspan : string, sandbox : string, scope : string, scoped : string, selected : string, shape : string, size : string, sizes : string, slot : string, span : string, spellcheck : string, src : string, srcdoc : string, srclang : string, srcset : string, start : string, step : string, style : string, summary : string, tabindex : string, target : string, title : string, translate : string, type : string, usemap : string, value : string, width : string, wrap : string, }} AElementAttributeDescriptor
 */

/**
 * @typedef {{"arabic-form":string,"baseline-shift": string, "accent-height": string,  "alignment-baseline": string,  "cap-height": string,  "clip-path": string,  "clip-rule": string,  "color-dinterpolation": string,  "color-interpolation-filters": string,  "color-profile": string,  "color-rendering": string,  "dominant-baseline": string,  "enable-background": string,  "fill-opacity": string,  "fill-rule": string,  "flood-color": string,  "flood-opacity": string,  "font-family": string,  "font-size": string,  "font-size-adjust": string,  "font-stretch": string,  "font-style": string,  "font-variant": string,  "font-weight": string,  "glyph-name": string,  "glyph-orientation-horizontal": string,  "glyph-orientation-vertical": string,  "horiz-adv-x": string,  "horiz-origin-x": string,  "image-rendering": string,  "letter-spacing": string,  "lighting-color": string,  "marker-end": string,  "marker-mid": string,  "marker-start": string,  "overline-position": string,  "overline-thickness": string,  "panose-1": string,  "paint-order": string,  "pointer-events": string,  "rendering-intent": string,  "shape-rendering": string,  "stop-color": string,  "stop-opacity": string,  "strikethrough-position": string,  "strikethrough-thickness": string,  "stroke-dasharray": string,  "stroke-dashoffset": string,  "stroke-linecap": string,  "stroke-linejoin": string,  "stroke-miterlimit": string,  "stroke-opacity": string,  "stroke-width": string,  "text-anchor": string,  "text-decoration": string,  "text-rendering": string,  "transform-origin": string,  "underline-position": string,  "underline-thickness": string,  "unicode-bidi": string,  "unicode-range": string,  "units-per-em": string,  "v-alphabetic": string,  "v-hanging": string,  "v-ideographic": string,  "v-mathematical": string,  "vector-effect": string,  "vert-adv-y": string,  "vert-origin-x": string,  "vert-origin-y": string,  "word-spacing": string,  "writing-mode": string,  "x-height": string,  "xlink:actuate": string,  "xlink:arcrole": string,  "xlink:href": string,  "xlink:role": string,  "xlink:show": string,  "xlink:title": string,  "xlink:type": string,  "xml:base": string,  "xml:lang": string,  "xml:space": string, accumulate:string, additive:string, allowReorder:string, alphabetic:string, amplitude:string, ascent:string, attributeName:string, attributeType:string, autoReverse:string, azimuth:string, baseFrequency:string, baseProfile:string, bbox:string, begin:string, bias:string, by:string, calcMode:string, class:string, clip:string, clipPathUnits:string, color:string, contentScriptType:string, contentStyleType:string, cursor:string, cx:string, cy:string, d:string, decelerate:string, descent:string, diffuseConstant:string, direction:string, display:string, divisor:string, dur:string, dx:string, dy:string, edgeMode:string, elevation:string, end:string, exponent:string, externalResourcesRequired:string, fill:NamedColor|Color|string, filter:string, filterRes:string, filterUnits:string, format:string, from:string, fr:string, fx:string, fy:string, g1:string, g2:string, glyphRef:string, gradientTransform:string, gradientUnits:string, hanging:string, height:string, href:string, hreflang:string, id:string, ideographic:string, in:string, in2:string, intercept:string, k:string, k1:string, k2:string, k3:string, k4:string, kernelMatrix:string, kernelUnitLength:string, kerning:string, keyPoints:string, keySplines:string, keyTimes:string, lang:string, lengthAdjust:string, limitingConeAngle:string, local:string, markerHeight:string, markerUnits:string, markerWidth:string, mask:string, maskContentUnits:string, maskUnits:string, mathematical:string, max:string, media:string, method:string, min:string, mode:string, name:string, numOctaves:string, offset:string, opacity:string, operator:string, order:string, orient:string, orientation:string, origin:string, overflow:string, path:string, pathLength:string, patternContentUnits:string, patternTransform:string, patternUnits:string, ping:string, points:string, pointsAtX:string, pointsAtY:string, pointsAtZ:string, preserveAlpha:string, preserveAspectRatio:string, primitiveUnits:string, r:string, radius:string, referrerPolicy:string, refX:string, refY:string, rel:string, repeatCount:string, repeatDur:string, requiredExtensions:string, requiredFeatures:string, restart:string, result:string, rotate:string, rx:string, ry:string, scale:string, seed:string, slope:string, spacing:string, specularConstant:string, specularExponent:string, speed:string, spreadMethod:string, startOffset:string, stdDeviation:string, stemh:string, stemv:string, stitchTiles:string, string:string, stroke:string, style:string, surfaceScale:string, systemLanguage:string, tabindex:string, tableValues:string, target:string, targetX:string, targetY:string, textLength:string, to:string, transform:string, type:string, u1:string, u2:string, unicode:string, values:string, version:string, viewBox:string, viewTarget:string, visibility:string, width:string, widths:string, x:string, x1:string, x2:string, xChannelSelector:string, y:string, y1:string, y2:string, yChannelSelector:string, z:string, zoomAndPan:string, }}  AElementNSAttributeDescriptor
 */

/***
 * @typedef {{abort:function(event:(UiEvent|Event)):void,afterprint:function(event:Event):void,animationend:function(event:AnimationEvent):void,animationiteration:function(event:AnimationEvent):void,animationstart:function(event:AnimationEvent):void,beforeprint:function(event:Event):void,beforeunload:function(event:(UiEvent|Event)):void,blur:function(event:FocusEvent):void,canplay:function(event:Event):void,canplaythrough:function(event:Event):void,change:function(event:Event):void,click:function(event:MouseEvent):void,contextmenu:function(event:MouseEvent):void,copy:function(event:ClipboardEvent):void,cut:function(event:ClipboardEvent):void,dblclick:function(event:MouseEvent):void,drag:function(event:DragEvent):void,dragend:function(event:DragEvent):void,dragenter:function(event:DragEvent):void,dragleave:function(event:DragEvent):void,dragover:function(event:DragEvent):void,dragstart:function(event:DragEvent):void,drop:function(event:DragEvent):void,durationchange:function(event:Event):void,ended:function(event:Event):void,error:function(event:(ProgressEvent|UiEvent|Event)):void,focus:function(event:FocusEvent):void,focusin:function(event:FocusEvent):void,focusout:function(event:FocusEvent):void,fullscreenchange:function(event:Event):void,fullscreenerror:function(event:Event):void,hashchange:function(event:HashChangeEvent):void,input:function(event:(InputEvent|Event)):void,invalid:function(event:Event):void,keydown:function(event:KeyboardEvent):void,keypress:function(event:KeyboardEvent):void,keyup:function(event:KeyboardEvent):void,load:function(event:(UiEvent|Event)):void,loadeddata:function(event:Event):void,loadedmetadata:function(event:Event):void,loadstart:function(event:ProgressEvent):void,message:function(event:Event):void,mousedown:function(event:MouseEvent):void,mouseenter:function(event:MouseEvent):void,mouseleave:function(event:MouseEvent):void,mousemove:function(event:MouseEvent):void,mouseover:function(event:MouseEvent):void,mouseout:function(event:MouseEvent):void,mouseup:function(event:MouseEvent):void,mousewheel:function(event:WheelEvent):void,offline:function(event:Event):void,online:function(event:Event):void,open:function(event:Event):void,pagehide:function(event:PageTransitionEvent):void,pageshow:function(event:PageTransitionEvent):void,paste:function(event:ClipboardEvent):void,pause:function(event:Event):void,play:function(event:Event):void,playing:function(event:Event):void,popstate:function(event:PopStateEvent):void,progress:function(event:Event):void,ratechange:function(event:Event):void,resize:function(event:(UiEvent|Event)):void,reset:function(event:Event):void,scroll:function(event:(UiEvent|Event)):void,search:function(event:Event):void,seeked:function(event:Event):void,seeking:function(event:Event):void,select:function(event:(UiEvent|Event)):void,show:function(event:Event):void,stalled:function(event:Event):void,storage:function(event:StorageEvent):void,submit:function(event:Event):void,suspend:function(event:Event):void,timeupdate:function(event:Event):void,toggle:function(event:Event):void,touchcancel:function(event:TouchEvent):void,touchend:function(event:TouchEvent):void,touchmove:function(event:TouchEvent):void,touchstart:function(event:TouchEvent):void,transitionend:function(event:TransitionEvent):void,unload:function(event:(UiEvent|Event)):void,volumechange:function(event:Event):void,waiting:function(event:Event):void,wheel:function(event:WheelEvent):void}} AElementEventDescriptor
 */

/***
 * @typedef AbsolConstructDescriptor
 * @property {string | function |null} tag
 * @property {CSSStyleDeclaration} style
 * @property {Array | string} extendEvent
 * @property {Array | string} class
 * @property {AElementAttributeDescriptor|AElementNSAttributeDescriptor} attr
 * @property {string|AElement | AElementNS | AbsolConstructDescriptor | string[] |AElement[] | AElementNS[] | AbsolConstructDescriptor[]} child
 * @property {string} text to create a TextNode, not Element
 * @property {AElement} elt
 * @property {AElementEventDescriptor|{}} on
 * @property {Object} props
 *
 */
var svgCreator = function () {
  var temp = document.createElement('div');
  temp.innerHTML = '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"></svg>';
  var element = temp.childNodes[0];
  var prototypes = Object.getOwnPropertyDescriptors(_AElement.default.prototype);
  Object.defineProperties(element, prototypes);

  _AElement.default.call(element);

  return element;
};
/***
 *
 * @param {*=} option
 * @constructor
 */


function Dom(option) {
  option = option || {};
  this.creator = option.creator || {};
  Object.defineProperties(this.creator, {
    svg: {
      set: function () {//do nothing
      },
      get: function () {
        return svgCreator;
      }
    },
    attachhook: {
      set: function () {//do nothing
      },
      get: function () {
        return _AttachHook.default;
      }
    }
  });
  this['$ '.trim()] = this.$.bind(this);
  this['_ '.trim()] = this._.bind(this);
  this['$' + '$'] = this.$$.bind(this);
  this.buildDom = this._;
}

Dom.prototype.defaultTag = 'div';

Dom.prototype.fromCode = function (code) {
  code = code.trim().replace(/>\s+</gm, '><');
  var temTag = 'div';
  if (code.startsWith('<td') || code.startsWith('<th') && !code.startsWith('<thead')) temTag = 'tr';else if (code.startsWith('<tr')) temTag = 'tbody';else if (code.startsWith('<thead') || code.startsWith('<tbody')) temTag = 'table';
  var tempDiv = document.createElement(temTag);
  tempDiv.innerHTML = code;
  var element = tempDiv.childNodes[0];
  var prototypes = Object.getOwnPropertyDescriptors(_AElement.default.prototype);
  Object.defineProperties(element, prototypes);

  _AElement.default.call(element);

  return element;
};
/**
 * DFS
 * @param {string | AElement} query
 * @param {AElement} root
 * @param {function} onFound - return true to stop find
 * @returns {AElement | AElementNS}
 */


Dom.prototype.$ = function (query, root, onFound) {
  var res;
  if (Dom.isDomNode(query)) res = query;else res = this.select(query, root, onFound);
  if (res) this.attach(res);
  return res;
};
/***
 *
 * @type {function(string, AElement, Function): AElement}
 */


Dom.prototype.selectAttacth = Dom.prototype.$;
/**
 * DFS
 * @param {string} query
 * @param {AElement} root
 * @param {function} onFound - return true to stop find
 */

Dom.prototype.select = function (query, root, onFound) {
  root = root || document.documentElement;

  var matcher = _JSPath.default.compileJSPath(query);

  return matcher.findFirst(root, onFound);
};

var FeatureClass = {
  AElementNS: {
    constructor: _ElementNS.default,
    prototypeKeys: Object.keys(_ElementNS.default.prototype)
  },
  AElement: {
    constructor: _AElement.default,
    prototypeKeys: Object.keys(_AElement.default.prototype)
  }
};
/**
 *
 * @param {AElement | AElementNS } element
 */

exports.FeatureClass = FeatureClass;

Dom.prototype.attach = function (element) {
  if (element.attr) return;
  var feature = element.getBBox && element.tagName !== 'svg' ? FeatureClass.AElementNS : FeatureClass.AElement;
  var elementConstructor = feature.constructor;
  var proto = elementConstructor.prototype;
  var prototypeKeys = feature.prototypeKeys;
  var n = prototypeKeys.length;
  var key;

  for (var i = 0; i < n; ++i) {
    key = prototypeKeys[i];
    element[key] = proto[key];
  }

  Object.assign(element, elementConstructor.prototype);
  elementConstructor.call(element);
};

Dom.prototype.makeNewElement = function (tagName) {
  return document.createElement(tagName);
};

Dom.prototype.makeNewTextNode = function (data) {
  return document.createTextNode(data);
};
/**
 *
 * @param {AbsolConstructDescriptor | string | {} } option
 * @param {boolean=} isInherited
 * @returns {AElementNS| AElement | Text}
 */


Dom.prototype._ = function (option, isInherited) {
  var res;
  var creator;

  if (Dom.isDomNode(option)) {
    res = option;
    option = {};
    /** fix reinit component */

    isInherited = true;
  } else {
    if (option.charAt) {
      option = option.trim();

      if (option[0] === '<') {
        res = this.fromCode(option);
        option = {};
      } else {
        var queryObj = _JSPath.default.parseQuery(option);

        option = {};
        option.tag = queryObj.tagName || this.defaultTag;
        if (queryObj.classList && queryObj.classList.length > 0) option.class = queryObj.classList;
        if (queryObj.id) option.id = queryObj.id;
        if (queryObj.attributes) option.attr = queryObj.attributes;
      }
    }
  }

  if (option.text || option.text === '') {
    //is textNode
    return this.makeNewTextNode(option.text);
  }

  option.tag = option.tag || this.defaultTag;
  creator = option.tag.prototype ? option.tag : this.creator[option.tag];
  if (option.tag.prototype) option.tag = option.tag.tag;

  if (option.elt) {
    res = this._(option.elt);
  } else {
    if (!res) {
      if (creator) {
        if (creator.render) {
          res = creator.render(option.data, this);
        } else {
          res = creator(option.data, this);
        }
      } else {
        res = this.makeNewElement(option.tag);
        Object.assign(res, option.data);
      }
    }
  }

  this.attach(res);

  if (creator) {
    res._azar_extendTags = res._azar_extendTags || {};
    res._azar_extendTags[option.tag] = creator;
    creator.property && Object.defineProperties(res, creator.property);
    creator.prototype && _OOP.default.extends(res, creator.prototype);
    creator.attribute && res.defineAttributes(creator.attribute);

    if (creator.render) {
      if (creator.eventHandler) {
        res.eventHandler = res.eventHandler || {};

        var eventHandler = _OOP.default.bindFunctions(res, creator.eventHandler || creator.prototype.eventHandler);

        for (var eventHandlerKey in eventHandler) {
          if (res.eventHandler[eventHandlerKey]) {
            throw new Error("Same name of eventHandler[" + eventHandlerKey + "]");
          } else {
            res.eventHandler[eventHandlerKey] = eventHandler[eventHandlerKey];
          }
        }
      }

      creator.call(res);
    }
  }

  option.extendEvent && res.defineEvent(option.extendEvent);
  option.attr && res.attr(option.attr);
  option.on && res.on(option.on);
  option.once && res.once(option.once);
  option.class && res.addClass(option.class);
  option.style && res.addStyle(option.style);
  option.id && res.attr('id', option.id);
  if (!isInherited) res.init(option.props);

  if (option.child) {
    option.child = option.child instanceof Array ? option.child : [option.child];

    for (var i = 0; i < option.child.length; ++i) {
      res.addChild(this._(option.child[i], false, true));
    }
  }

  return res;
};
/***
 *
 * @type {function(Object, boolean): AElement}
 */


Dom.prototype.create = Dom.prototype._;
/***
 *
 * @param query
 * @param root
 * @returns {Array<AElement|AElementNS>}
 */

Dom.prototype.$$ = function (query, root) {
  var thisD = this;
  var res = [];
  this.selectAttacth(query, root, function (elt) {
    thisD.attach(elt);
    res.push(elt);
  });
  return res;
};

Dom.prototype.install = function (arg0, arg1) {
  var _this = this;

  if (arguments.length === 1) {
    if (arg0.creator && arg0.create && arg0.select) {
      // is a dom core
      var creator = arg0.creator;
      Object.keys(creator).forEach(function (key) {
        if (key.startsWith('_') || key.startsWith('$')) return;
        var func = creator[key];
        if (typeof func == 'function') if (_this.creator[key] !== func) _this.creator[key] = func;
      });
    } else if (typeof arg0 == 'function') {
      var name = arg0.tag || (0, _getFunctionName.default)(arg0) || arg0.name;

      if (name) {
        this.creator[name.toLowerCase()] = arg0;
      } else {
        console.error('No ident name of creator function', arg0);
      }
    } else if (arg0 instanceof Array) {
      arg0.forEach(function (func) {
        var name = func.tag || (0, _getFunctionName.default)(func) || func.name;

        if (name) {
          _this.creator[name.toLowerCase()] = func;
        }
      });
    } else if (typeof arg0 == 'object') {
      Object.keys(arg0).forEach(function (key) {
        if (key.startsWith('_') || key.startsWith('$')) return;
        var func = arg0[key];
        if (typeof func == 'function') if (_this.creator[key] !== func) _this.creator[key] = func;
      });
    } else {
      console.error('Unknown data', arg0);
    }
  } else if (arguments.length === 2) {
    if (arg0 instanceof Array) {
      if (arg1.creator) arg1 = arg1.creator;
      arg0.forEach(function (key) {
        var func = arg1[key];
        if (typeof func == 'function') if (_this.creator[key] !== func) _this.creator[key] = func;
      });
    } else if (arg0 instanceof RegExp) {
      if (arg1.creator) arg1 = arg1.creator;
      Object.keys(arg1).forEach(function (key) {
        if (key.match(arg0)) {
          var func = arg1[key];
          if (typeof func == 'function') if (_this.creator[key] !== func) _this.creator[key] = func;
        }
      });
    } else if (typeof arg0 == 'string' && arg0.length > 0) {
      if (typeof arg1 == 'function') {
        this.creator[arg0] = arg1;
      } else {
        console.error('arg1 is not a function');
      }
    }
  } else {
    console.error('Invalid param');
  }

  return this;
};
/***
 *
 * @param {String | null} tagName
 */


Dom.prototype.require = function (tagName) {
  return this.creator[tagName] || null;
};
/**
 *
 * @param {*} o
 * @returns {Boolean}
 */


function isDomNode(o) {
  return typeof Node === "object" ? o instanceof Node : o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string";
}

Dom.isDomNode = isDomNode;
/**
 * @param {AElement|Node|HTMLElement} element
 */

function activeFullScreen(element) {
  if (element.requestFullscreen) {
    element.requestFullscreen();
  } else if (element.mozRequestFullScreen) {
    element.mozRequestFullScreen();
  } else if (element.webkitRequestFullscreen) {
    element.webkitRequestFullscreen(_AElement.default.ALLOW_KEYBOARD_INPUT);
  } else if (element.msRequestFullscreen) {
    element.msRequestFullscreen();
  }
}

Dom.activeFullScreen = activeFullScreen;

function inactiveFullScreen() {
  if (document.exitFullscreen) {
    document.exitFullscreen();
  } else if (document.mozCancelFullScreen) {
    document.mozCancelFullScreen();
  } else if (document.webkitExitFullscreen) {
    document.webkitExitFullscreen();
  } else if (document.msExitFullscreen) {
    document.msExitFullscreen();
  }
}

Dom.inactiveFullScreen = inactiveFullScreen; //adapt

var deactiveFullScreen = inactiveFullScreen;
exports.deactiveFullScreen = deactiveFullScreen;
Dom.deactiveFullScreen = deactiveFullScreen;

function isFullScreen() {
  var fullScreenElement = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;
  return !!fullScreenElement;
}

Dom.isFullScreen = isFullScreen;
/**
 * @param {AElement|Node|HTMLElement} current
 * @returns {ClientRect}
 */

function traceOutBoundingClientRect(current) {
  var screenSize = Dom.getScreenSize();
  var left = 0;
  var right = screenSize.width;
  var top = 0;
  var bottom = screenSize.height;

  while (current) {
    var ox = _AElement.default.prototype.getComputedStyleValue.call(current, 'overflow-x') !== "visible";
    var oy = _AElement.default.prototype.getComputedStyleValue.call(current, 'overflow-y') !== "visible";
    var isHtml = current.tagName.toLowerCase() === 'html';

    if (ox || oy || isHtml) {
      var bound;

      if (isHtml) {
        bound = Object.assign({
          left: 0,
          top: 0
        }, getScreenSize());
        bound.bottom = bound.height;
        bound.right = bound.width;
      } else {
        bound = current.getBoundingClientRect();
      }

      if (ox || isHtml) {
        left = Math.max(left, bound.left);
        right = Math.min(right, bound.right);
      }

      if (oy || isHtml) {
        top = Math.max(top, bound.top);
        bottom = Math.min(bottom, bound.bottom);
      }
    }

    if (isHtml) break;
    current = current.parentElement;
  }

  return {
    left: left,
    right: right,
    top: top,
    bottom: bottom,
    width: right - left,
    height: bottom - top
  };
}

Dom.traceOutBoundingClientRect = traceOutBoundingClientRect;
/***
 *
 * @param {string} fontFace
 * @param {number} timeout
 * @returns {Promise<boolean>}
 */

function fontFaceIsLoaded(fontFace, timeout) {
  timeout = timeout || 0;

  var element = this.ShareInstance._({
    tag: 'span',
    style: {
      visibility: 'hidden',
      position: 'fixed',
      top: '-9999px',
      left: '-9999px',
      'font-size': '256px'
    },
    props: {
      innerHTML: "Test string long long long"
    }
  });

  element.addTo(document.body);
  return element.afterAttached().then(function () {
    var lastOffsetWidth = element.getBoundingClientRect().width;
    element.addStyle('font-family', fontFace);
    return new Promise(function (resolve, reject) {
      function check(remainTime) {
        if (remainTime < 0) {
          resolve(false);
          element.selfRemove();
        } else requestAnimationFrame(function () {
          var currentOffsetWidth = element.getBoundingClientRect().width;

          if (currentOffsetWidth != lastOffsetWidth) {
            resolve(true);
            element.selfRemove();
          } else check(remainTime - 10);
        });
      }

      check(timeout);
    });
  });
}

Dom.fontFaceIsLoaded = fontFaceIsLoaded;
/***
 *
 * @returns {{width: number, WIDTH: number, HEIGHT: number, height: number}}
 */

function getScreenSize() {
  var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
  var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
  return {
    WIDTH: width,
    HEIGHT: height,
    width: width,
    height: height
  };
}

Dom.getScreenSize = getScreenSize;
/***
 *
 * @param {HTMLImageElement} img
 * @param {number=} timeout
 * @returns {Promise<void>}
 */

function waitImageLoaded(img, timeout) {
  var isLoaded = true;

  if (!img.complete) {
    isLoaded = false;
  }

  if (img.naturalWidth === 0) {
    isLoaded = false;
  }

  if (isLoaded) return Promise.resolve();
  if (!img.src) return Promise.resolve();
  return new Promise(function (rs) {
    if (img.addEventListener) {
      img.addEventListener('load', rs, false);
      img.addEventListener('error', rs, false);
    } else {
      img.attachEvent('onload', rs, false);
    }

    setTimeout(rs, timeout || 5000);
  }); // No other way of checking: assume it’s ok.
}

Dom.waitImageLoaded = waitImageLoaded;
/***
 *
 * @param {HTMLIFrameElement| Worker} iframe
 * @returns {Promise}
 */

function waitIFrameLoaded(iframe) {
  return new Promise(function (rs, rj) {
    if (document.all) {
      iframe.onreadystatechange = function () {
        if (iframe.readyState === "complete" || iframe.readyState === "loaded") rs();
      };
    } else {
      iframe.onload = rs;
    }

    setTimeout(rs, 5000);
  });
}

Dom.waitIFrameLoaded = waitIFrameLoaded;
/***
 *
 * @param {Image} element
 * @returns {Promise<HTMLCanvasElement>}
 */

function imageToCanvas(element) {
  if (typeof element == 'string') {
    element = Dom.ShareInstance.$(element);
  }

  if (element.tagName.toLowerCase() === 'img') {
    var preRender = Dom.ShareInstance._('div');

    preRender.addStyle({
      position: 'fixed',
      top: '0',
      left: '0',
      zIndex: '-10000',
      opacity: '0'
    }).addTo(document.body);
    var canvas = document.createElement("canvas");
    preRender.addChild(canvas);
    return Dom.waitImageLoaded(element).then(function () {
      canvas.width = element.width;
      canvas.height = element.height;
      var context = canvas.getContext("2d");
      context.drawImage(element, 0, 0);
      preRender.selfRemove();
      return canvas;
    });
  } else {
    throw new Error("AElement must be image");
  }
}

Dom.imageToCanvas = imageToCanvas;
Dom.ShareInstance = new Dom();
Dom.scrollWidthPromise;
Dom.documentReady = new Promise(function (resolve) {
  if (document.body) {
    resolve();
  } else {
    window.addEventListener("load", resolve);
  }
});

function getScrollSize() {
  if (!Dom.scrollWidthPromise) Dom.scrollWidthPromise = new Promise(function (resolve) {
    function prerender() {
      var parent = Dom.ShareInstance._({
        style: {
          'z-index': '-100',
          opacity: '0',
          width: '100px',
          height: '100px',
          overflow: 'scroll',
          top: '0',
          left: '0',
          'box-sizing': 'content-box',
          position: 'fixed'
        }
      }).addTo(document.body);

      var child = Dom.ShareInstance._({
        style: {
          width: '100%',
          height: '100%'
        }
      }).addTo(parent);

      requestAnimationFrame(function () {
        var parentBound = parent.getBoundingClientRect();
        var childBound = child.getBoundingClientRect();
        resolve({
          width: parentBound.width - childBound.width,
          height: parentBound.height - childBound.height
        });
        parent.selfRemove();
      });
    }

    Dom.documentReady.then(prerender);
  });
  return Dom.scrollWidthPromise;
}

Dom.getScrollSize = getScrollSize;
/***
 *
 * @param {(AElement|AElementNS|Node)} originElt
 * @param {function(originElt: (AElement|AElementNS|Node), originElt: (AElement|AElementNS|Node)):void } afterCloneCb
 * @return {AElement|AElementNS|Node}
 */

function depthClone(originElt, afterCloneCb) {
  /***
   *
   * @type {AElement|AElementNS|Node}
   */
  var newElt = originElt.cloneNode(); //no deep

  if (originElt.childNodes) {
    /***
     *
     * @type {(AElement|AElementNS)[]}
     */
    var children = Array.prototype.map.call(originElt.childNodes, function (child) {
      return depthClone(child, afterCloneCb);
    });

    for (var i = 0; i < children.length; ++i) {
      newElt.appendChild(children[i]);
    }
  }

  return afterCloneCb && afterCloneCb(originElt, newElt) || newElt;
}
/***
 *
 * @param originElt
 * @param afterCloneCb
 * @returns {AElement|HTMLElement|Node}
 */


function depthCloneWithStyle(originElt, afterCloneCb) {
  return depthClone(originElt, function (originElt, newElt) {
    if (!originElt.getAttribute && !originElt.getAttributeNS) return;
    copyStyleRule(originElt, newElt);
    afterCloneCb && afterCloneCb(originElt, newElt);
  });
}

Dom.depthClone = depthClone;
Dom.depthCloneWithStyle = depthCloneWithStyle;
/***
 *
 * @param  {AElement|HTMLElement|Node}sourceElt
 * @param  {AElement|HTMLElement|Node} destElt
 * @returns  {AElement|HTMLElement|Node}
 */

function copyStyleRule(sourceElt, destElt) {
  if (!sourceElt.getAttribute && !sourceElt.getAttributeNS) return destElt; //is text node

  if (!destElt.getAttribute && !destElt.getAttributeNS) return destElt; //is text node, nothing to copy

  var cssRules = _AElement.default.prototype.getCSSRules.call(sourceElt);

  var cssKey = cssRules.reduce(function (ac, rule) {
    for (var i = 0; i < rule.style.length; ++i) {
      ac[rule.style[i]] = true;
    }

    return ac;
  }, {});

  for (var key in cssKey) {
    destElt.style[key] = _AElement.default.prototype.getComputedStyleValue.call(sourceElt, key);
  }

  return destElt;
}

Dom.copyStyleRule = copyStyleRule;
/**
 *
 */

function getSystemFontSize() {
  if (window.mobileHost && window.mobileHost.systemFont) {
    return window.mobileHost.systemFont.pointSize;
  }

  var _ = Dom.ShareInstance._;

  var initSpan = Dom.ShareInstance._({
    tag: 'span',
    style: {
      font: 'inherit'
    }
  });

  var appleSpan = Dom.ShareInstance._({
    tag: 'span',
    style: {
      font: '-apple-system-body'
    }
  }).addTo(document.body);

  var renderer = _({
    style: {
      font: 'initial',
      position: 'fixed',
      top: 0,
      left: 0,
      visibility: 'hidden',
      opacity: 0,
      zIndex: -100
    },
    child: [initSpan && appleSpan]
  }).addTo(document.body);

  var appleSize = appleSpan.getFontSize();
  var initSize = initSpan.getFontSize();
  var defaultSize = appleSize !== initSize ? appleSize : initSize;
  renderer.remove();
  return Math.round(defaultSize * 14 / 16);
}

function getTextNodeBound(textNode) {
  if (document.createRange) {
    var range = document.createRange();
    range.selectNodeContents(textNode);

    if (range.getBoundingClientRect) {
      return range.getBoundingClientRect();
    }
  }

  return null;
}

Dom.getTextNodeBound = getTextNodeBound;
/***
 * get absol construct descriptor for HTML element only
 * @param {AElement | Text} elt
 * @returns {AbsolConstructDescriptor}
 */

function getConstructDescriptor(elt) {
  var obj = {};
  obj.tag = elt.tagName.toLowerCase();
  var classAttr = elt.getAttribute('class');
  var classList;
  if (classAttr) classList = (0, _attribute.parseClassAttr)(classAttr);
  if (classList && classList.length > 0) obj.class = classList;
  var styleAttr = elt.getAttribute('style');
  var style;
  if (styleAttr) style = (0, _attribute.parseStyleAttr)(styleAttr);
  var attributes = elt.attributes;
  var attNode;
  var attrName;
  var attrValue;
  var attr = {};
  var on = {};
  var props = {};
  var eventMatch, eventName;
  var propMatch, propName;

  for (var i = 0; i < attributes.length; ++i) {
    attNode = attributes[i];
    attrName = attNode.nodeName;
    attrValue = attNode.nodeValue;
    if (attrName == 'style' || attrName == 'class') continue;
    eventMatch = attrName.match(/^on(.+)/);

    if (eventMatch) {
      eventName = eventMatch[1];
      on[eventName] = new Function('event', 'sender', attrValue);
      continue;
    }

    propMatch = attrName.match(/^prop-(.+)/);

    if (propMatch) {
      propName = propMatch[1];
      props[propName] = attrValue;
      continue;
    }

    attr[attrName] = attrValue;
  }

  var key;

  for (key in style) {
    //style is not empty
    obj.style = style;
    break;
  }

  for (key in attr) {
    obj.attr = attr;
    break;
  }

  for (key in on) {
    obj.on = on;
    break;
  }

  for (key in props) {
    obj.props = props;
    break;
  }

  return obj;
}

Dom.getConstructDescriptor = getConstructDescriptor;

Dom.addToResizeSystem = function (element) {
  _ResizeSystem.default.add(element);
};

Dom.updateResizeSystem = function () {
  _ResizeSystem.default.update();
};

Dom.updateSizeUp = function (fromElt) {
  _ResizeSystem.default.updateUp(fromElt);
};

var _default = Dom;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Color/Color.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Color/Color.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TemplateString = _interopRequireDefault(require("../JSMaker/TemplateString"));


function Color(rgba) {
  this.rgba = rgba.slice();
}
/***
 *
 * @returns {string}
 */


Color.prototype.toHex6 = function () {
  return this.rgba.slice(0, 3).map(function (b) {
    b = b * 255 >> 0;
    return (b < 16 ? '0' : '') + b.toString(16);
  }).join('');
};
/***
 *
 * @returns {string}
 */


Color.prototype.toHex8 = function () {
  return this.rgba.map(function (b) {
    b = b * 255 >> 0;
    return (b < 16 ? '0' : '') + b.toString(16);
  }).join('');
};
/***
 *
 * @returns {string}
 */


Color.prototype.toHex3 = function () {
  return this.rgba.slice(0, 3).map(function (b) {
    b = b * 255 / 17 >> 0;
    return b.toString(16);
  }).join('');
};
/***
 *
 * @returns {string}
 */


Color.prototype.toHex4 = function () {
  return this.rgba.map(function (b) {
    b = b * 255 / 17 >> 0;
    return b.toString(16);
  }).join('');
};
/***
 *
 * @returns {number[]}
 */


Color.prototype.toHSLA = function () {
  return Color.rgbaToHSLA(this.rgba);
};
/***
 *
 * @returns {number[]}
 */


Color.prototype.toHSBA = function () {
  return Color.rgbaToHSBA(this.rgba);
};
/***
 *
 * @returns {number[]}
 */


Color.prototype.toHWBA = function () {
  return Color.rgbaToHWBA(this.rgba);
};
/***
 *
 * @returns {Color}
 */


Color.prototype.getHighContrastColor = function () {
  var hsba = this.toHSBA();
  var h, s, b;
  h = hsba[0] > 0.5 ? hsba[0] - 0.5 : hsba[0] + 0.5;
  s = hsba[1] > 0.5 ? hsba[1] - 0.5 : hsba[1] + 0.5;
  b = hsba[2] > 0.5 ? hsba[2] - 0.5 : hsba[2] + 0.5;
  return Color.fromHSB(h, s, b);
};

Color.prototype.getHightContrastColor = Color.prototype.getHighContrastColor;

Color.prototype.getLuminance = function () {
  var a = this.rgba.slice(0, 3).map(function (v) {
    return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
  });
  return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
};
/***
 *
 * @param {Color} other
 * @returns {number}
 */


Color.prototype.getContrastWith = function (other) {
  var lum1 = this.getLuminance();
  var lum2 = other.getLuminance();
  var brightest = Math.max(lum1, lum2);
  var darkest = Math.min(lum1, lum2);
  return (brightest + 0.05) / (darkest + 0.05);
};
/***
 *
 * @returns {Color}
 */


Color.prototype.getContrastYIQ = function () {
  var r = this.rgba[0] * 255;
  var g = this.rgba[1] * 255;
  var b = this.rgba[2] * 255;
  var yiq = (r * 299 + g * 587 + b * 114) / 1000;
  return yiq >= 128 ? new Color([0, 0, 0, 1]) : new Color([1, 1, 1, 1]);
};
/**
 *
 * @returns {Color}
 */


Color.prototype.clone = function () {
  return new Color(this.rgba.slice());
};
/**
 *
 *  ['rgba', 'rgba', 'rgba({{x[0]*255>>0}}, {{x[1]*255>>0}}, {{x[2]*255>>0}}, {{x[3]}})'],
 *     ['rgb', 'rgba', 'rgb({{x[0]*255>>0}}, {{x[1]*255>>0}}, {{x[2]*255>>0}})'],
 *     ['hsl', 'toHSLA()', 'hsl({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%)'],
 *     ['hsla', 'toHSLA()', 'hsla({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%, {{x[3]}})'],
 *     ['hsb', 'toHSBA()', 'hsb({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%)'],
 *     ['hsba', 'toHSBA()', 'hsba({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%, {{x[3]}})'],
 *     ['hex3', 'toHex3()', '#{{x}}'],
 *     ['hex4', 'toHex4()', '#{{x}}'],
 *     ['hex6', 'toHex6()', '#{{x}}'],
 *     ['hex6', 'toHex8()', '#{{x}}'],
 *     ['hwb', 'toHWBA()', 'hwb({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%)'],
 *     ['hwba', 'toHWBA()', 'hwba({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%, {{x[3]}})']
 */

/****
 *
 * @param {"rgba"|"rgb"|"hsl"|"hsla"|"hsb"|"hsba"|"hex3"|"hex4"|"hex6"|"hex6"|hex8|"hwb"|"hwba"} mode
 * @returns {string}
 */


Color.prototype.toString = function (mode) {
  mode = mode || 'rgba';
  mode = mode.toLocaleLowerCase();
  return Color.templates[mode](this);
};
/***
 *
 * @param notStandard
 * @param {number[]} hsbWeight
 * @returns {Color}
 */


Color.prototype.nearestNamedColor = function (notStandard, hsbWeight) {
  hsbWeight = hsbWeight || [5, 3, 1];
  var hsba = this.toHSBA();
  var bestMatch = null;
  var dist = 1000;
  Object.keys(Color.namedColors).concat(notStandard ? Object.keys(Color.nonStandarNamedColors) : []).forEach(function (name) {
    var c = Color.parse(Color.namedColors[name] || Color.nonStandarNamedColors[name]);
    var cHSBA = c.toHSBA();
    var cDist = Math.abs(hsba[0] - cHSBA[0]) * hsbWeight[0] + Math.abs(hsba[1] - cHSBA[1]) * hsbWeight[1] + Math.abs(hsba[2] - cHSBA[2]) * hsbWeight[2];

    if (cDist < dist) {
      dist = cDist;
      bestMatch = name;
    }
  });
  return bestMatch;
};

Color.templates = [['rgba', 'rgba', 'rgba({{x[0]*255>>0}}, {{x[1]*255>>0}}, {{x[2]*255>>0}}, {{x[3]}})'], ['rgb', 'rgba', 'rgb({{x[0]*255>>0}}, {{x[1]*255>>0}}, {{x[2]*255>>0}})'], ['hsl', 'toHSLA()', 'hsl({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%)'], ['hsla', 'toHSLA()', 'hsla({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%, {{x[3]}})'], ['hsb', 'toHSBA()', 'hsb({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%)'], ['hsba', 'toHSBA()', 'hsba({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%, {{x[3]}})'], ['hex3', 'toHex3()', '#{{x}}'], ['hex4', 'toHex4()', '#{{x}}'], ['hex6', 'toHex6()', '#{{x}}'], ['hex8', 'toHex8()', '#{{x}}'], ['hwb', 'toHWBA()', 'hwb({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%)'], ['hwba', 'toHWBA()', 'hwba({{x[0] * 360}}, {{x[1] * 100}}%, {{x[2] * 100}}%, {{x[3]}})']].reduce(function (ac, cr) {
  ac[cr[0]] = new Function('color', ['var x = color.' + cr[1] + ';', 'return ' + _TemplateString.default.parse(cr[2]).toJSCode() + ';'].join('\n'));
  return ac;
}, {});
Color.regexes = {
  whiteSpace: /\s*/,
  // Match zero or more whitespace characters.
  integer: /(\d{1,3})/,
  // Match integers: 79, 255, etc.
  decimal: /((?:\d+(?:\.\d+)?)|(?:\.\d+))/,
  // Match 129.6, 79, .9, etc.
  percent: /((?:\d+(?:\.\d+)?)|(?:\.\d+))%/,
  // Match 12.9%, 79%, .9%, etc.
  hex3: /^#([a-f0-9])([a-f0-9])([a-f0-9])$/i,
  // Match colors in format #XXXX, e.g. #5123.
  hex4: /^#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])$/i,
  // Match colors in format #XXXXXX, e.g. #b4d455.
  hex6: /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/i,
  // Match colors in format #XXXXXXXX, e.g. #b4d45535.
  hex8: /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/i
};
Color.regexes.percent = new RegExp(Color.regexes.decimal.source + '%');
Color.regexes.rgb = new RegExp(['^rgb\\(', Color.regexes.integer.source, ',', Color.regexes.integer.source, ',', Color.regexes.integer.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i');
Color.regexes.rgbPercent = new RegExp(['^rgb\\(', Color.regexes.percent.source, ',', Color.regexes.percent.source, ',', Color.regexes.percent.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i'); // Match colors in format rgb(R, G, B, A), e.g. rgb(255, 0, 128, 0.25).

Color.regexes.rgba = new RegExp(['^rgba\\(', Color.regexes.integer.source, ',', Color.regexes.integer.source, ',', Color.regexes.integer.source, ',', Color.regexes.decimal.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i'); // Match colors in format rgb(R%, G%, B%, A), e.g. rgb(100%, 0%, 28.9%, 0.5).

Color.regexes.rgbaPercent = new RegExp(['^rgba\\(', Color.regexes.percent.source, ',', Color.regexes.percent.source, ',', Color.regexes.percent.source, ',', Color.regexes.decimal.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i'); // Match colors in format hsla(H, S%, L%), e.g. hsl(100, 40%, 28.9%).

Color.regexes.hsl = new RegExp(['^hsl\\(', Color.regexes.integer.source, '[deg]*', ',', Color.regexes.percent.source, ',', Color.regexes.percent.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i'); // Match colors in format hsla(H, S%, L%, A), e.g. hsla(100, 40%, 28.9%, 0.5).

Color.regexes.hsla = new RegExp(['^hsla\\(', Color.regexes.integer.source, '[deg]*', ',', Color.regexes.percent.source, ',', Color.regexes.percent.source, ',', Color.regexes.decimal.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i'); // Match colors in format hsb(H, S%, B%), e.g. hsb(100, 40%, 28.9%).

Color.regexes.hsb = new RegExp(['^hsb\\(', Color.regexes.integer.source, '[deg]*', ',', Color.regexes.percent.source, ',', Color.regexes.percent.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i'); // Match colors in format hsba(H, S%, B%, A), e.g. hsba(100, 40%, 28.9%, 0.5).

Color.regexes.hsba = new RegExp(['^hsba\\(', Color.regexes.integer.source, '[deg]*', ',', Color.regexes.percent.source, ',', Color.regexes.percent.source, ',', Color.regexes.decimal.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i');
Color.regexes.hwb = new RegExp(['^hwb\\(', Color.regexes.integer.source, '[deg]*', ',', Color.regexes.percent.source, ',', Color.regexes.percent.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i'); // Match colors in format hsba(H, S%, B%, A), e.g. hsba(100, 40%, 28.9%, 0.5).

Color.regexes.hwba = new RegExp(['^hwba\\(', Color.regexes.integer.source, '[deg]*', ',', Color.regexes.percent.source, ',', Color.regexes.percent.source, ',', Color.regexes.decimal.source, '\\)$'].join(Color.regexes.whiteSpace.source), 'i');
/***
 *
 * @param {number} code
 * @param {32|24|16|8} bits
 * @returns {Color}
 */

Color.fromInt = function (code, bits) {
  var r, g, b, a;

  if (bits == 32) {
    b = (code & 0xff) / 255;
    g = ((code & 0xff00) >> 8) / 255;
    r = ((code & 0xff0000) >> 16) / 255;
    a = (code >> 24) / 255;
  } else if (bits == 24) {
    b = (code & 0xff) / 255;
    g = ((code & 0xff00) >> 8) / 255;
    r = ((code & 0xff0000) >> 16) / 255;
    a = 1;
  } else if (bits == 16) {
    b = (code & 0x1f) / 0x1f;
    g = ((code & 0x7e0) >> 5) / 0x3f;
    b = (code >> 10) / 0x1f;
    a = 1;
  } else if (bits == 8) {
    //gray-scale
    b = (code & 0x3) / 0x3;
    g = ((code & 0x1c) >> 2) / 0x7;
    b = (code >> 5) / 0x7;
    a = 1;
  }

  return new Color([r, g, b, a]);
};
/**
 *
 * @param {number} r
 * @param {number} g
 * @param {number} b
 * @returns {Color}
 */


Color.fromRGB = function (r, g, b) {
  return new Color([r, g, b, 1]);
};
/**
 *
 * @param {number} r
 * @param {number} g
 * @param {number} b
 * @param {number} a
 * @returns {Color}
 */


Color.fromRGBA = function (r, g, b, a) {
  return new Color([r, g, b, a]);
};
/***
 *
 * @param {number} h
 * @param {number} s
 * @param {number} l
 * @returns {Color}
 */


Color.fromHSL = function (h, s, l) {
  var rgba = this.hslaToRGBA([h, s, l, 1]);
  return new Color(rgba);
};
/***
 *
 * @param {number} h
 * @param {number} s
 * @param {number} l
 * @param {number} a
 * @returns {Color}
 */


Color.fromHSLA = function (h, s, l, a) {
  var rgba = this.hslaToRGBA([h, s, l, a]);
  return new Color(rgba);
};
/***
 *
 * @param {number} h
 * @param {number} s
 * @param {number} b
 * @returns {Color}
 */


Color.fromHSB = function (h, s, b) {
  var rgba = this.hsbaToRGBA([h, s, b, 1]);
  return new Color(rgba);
};
/***
 *
 * @param {number} h
 * @param {number} s
 * @param {number} b
 * @param {number} a
 * @returns {Color}
 */


Color.fromHSBA = function (h, s, b, a) {
  var rgba = this.hsbaToRGBA([h, s, b, a]);
  return new Color(rgba);
};
/***
 *
 * @param {number} h
 * @param {number} s
 * @param {number} b
 * @returns {Color}
 */


Color.fromHWB = function (h, s, b) {
  var rgba = this.hwbaToRGBA([h, s, b, 1]);
  return new Color(rgba);
};
/***
 *
 * @param {number} h
 * @param {number} s
 * @param {number} b
 * @param {number} a
 * @returns {Color}
 */


Color.fromHWBA = function (h, s, b, a) {
  var rgba = this.hwbaToRGBA([h, s, b, a]);
  return new Color(rgba);
};
/**
 * @param {String} text
 * @returns {Color}
 */


Color.parse = function (text) {
  if (this.namedColors[text]) text = this.namedColors[text];
  if (this.nonStandarNamedColors[text]) text = this.nonStandarNamedColors[text];

  if (this.regexes.hex8.test(text)) {
    return this.fromRGBA.apply(this, this.regexes.hex8.exec(text).slice(1).map(function (v) {
      return parseInt(v, 16) / 255;
    }));
  } else if (this.regexes.hex6.test(text)) {
    return this.fromRGB.apply(this, this.regexes.hex6.exec(text).slice(1).map(function (v) {
      return parseInt(v, 16) / 255;
    }));
  } else if (this.regexes.hex4.test(text)) {
    return this.fromRGBA.apply(this, this.regexes.hex4.exec(text).slice(1).map(function (v) {
      return parseInt(v + v, 16) / 255;
    }));
  } else if (this.regexes.hex3.test(text)) {
    return this.fromRGB.apply(this, this.regexes.hex3.exec(text).slice(1).map(function (v) {
      return parseInt(v + v, 16) / 255;
    }));
  } else if (this.regexes.rgba.test(text)) {
    return this.fromRGBA.apply(this, this.regexes.rgba.exec(text).slice(1).map(function (v, i) {
      return i < 3 ? parseFloat(v, 10) / 255 : parseFloat(v, 10);
    }));
  } else if (this.regexes.rgb.test(text)) {
    return this.fromRGB.apply(this, this.regexes.rgb.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / 255;
    }));
  } else if (this.regexes.rgbPercent.test(text)) {
    return this.fromRGB.apply(this, this.regexes.rgbPercent.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / 100;
    }));
  } else if (this.regexes.rgbaPercent.test(text)) {
    return this.fromRGBA.apply(this, this.regexes.rgbaPercent.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / (i < 3 ? 100 : 1);
    }));
  } else if (this.regexes.hsl.test(text)) {
    return this.fromHSL.apply(this, this.regexes.hsl.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / (i == 0 ? 360 : 100);
    }));
  } else if (this.regexes.hsla.test(text)) {
    return this.fromHSLA.apply(this, this.regexes.hsla.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / (i == 0 ? 360 : i < 3 ? 100 : 1);
    }));
  } else if (this.regexes.hsb.test(text)) {
    return this.fromHSB.apply(this, this.regexes.hsb.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / (i == 0 ? 360 : 100);
    }));
  } else if (this.regexes.hsba.test(text)) {
    return this.fromHSBA.apply(this, this.regexes.hsba.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / (i == 0 ? 360 : i < 3 ? 100 : 1);
    }));
  } else if (this.regexes.hwb.test(text)) {
    return this.fromHWB.apply(this, this.regexes.hwb.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / (i == 0 ? 360 : 100);
    }));
  } else if (this.regexes.hwba.test(text)) {
    return this.fromHWBA.apply(this, this.regexes.hwba.exec(text).slice(1).map(function (v, i) {
      return parseFloat(v, 10) / (i == 0 ? 360 : i < 3 ? 100 : 1);
    }));
  } else {
    throw new Error("Fail to parse " + text);
  }
};
/***
 * @typedef {"aliceblue"|"antiquewhite"|"aqua"|"aquamarine"|"azure"|"beige"|"bisque"|"black"|"blanchedalmond"|"blue"|"blueviolet"|"brown"|"burlywood"|"cadetblue"|"chartreuse"|"chocolate"|"coral"|"cornflowerblue"|"cornsilk"|"crimson"|"cyan"|"darkblue"|"darkcyan"|"darkgoldenrod"|"darkgray"|"darkgreen"|"darkgrey"|"darkkhaki"|"darkmagenta"|"darkolivegreen"|"darkorange"|"darkorchid"|"darkred"|"darksalmon"|"darkseagreen"|"darkslateblue"|"darkslategray"|"darkslategrey"|"darkturquoise"|"darkviolet"|"deeppink"|"deepskyblue"|"dimgray"|"dimgrey"|"dodgerblue"|"firebrick"|"floralwhite"|"forestgreen"|"fuchsia"|"gainsboro"|"ghostwhite"|"gold"|"goldenrod"|"gray"|"green"|"greenyellow"|"grey"|"honeydew"|"hotpink"|"indianred"|"indigo"|"ivory"|"khaki"|"lavender"|"lavenderblush"|"lawngreen"|"lemonchiffon"|"lightblue"|"lightcoral"|"lightcyan"|"lightgoldenrodyellow"|"lightgray"|"lightgreen"|"lightgrey"|"lightpink"|"lightsalmon"|"lightseagreen"|"lightskyblue"|"lightslategray"|"lightslategrey"|"lightsteelblue"|"lightyellow"|"lime"|"limegreen"|"linen"|"magenta"|"maroon"|"mediumaquamarine"|"mediumblue"|"mediumorchid"|"mediumpurple"|"mediumseagreen"|"mediumslateblue"|"mediumspringgreen"|"mediumturquoise"|"mediumvioletred"|"midnightblue"|"mintcream"|"mistyrose"|"moccasin"|"navajowhite"|"navy"|"oldlace"|"olive"|"olivedrab"|"orange"|"orangered"|"orchid"|"palegoldenrod"|"palegreen"|"paleturquoise"|"palevioletred"|"papayawhip"|"peachpuff"|"peru"|"pink"|"plum"|"powderblue"|"purple"|"red"|"rosybrown"|"royalblue"|"saddlebrown"|"salmon"|"sandybrown"|"seagreen"|"seashell"|"sienna"|"silver"|"skyblue"|"slateblue"|"slategray"|"slategrey"|"snow"|"springgreen"|"steelblue"|"tan"|"teal"|"thistle"|"tomato"|"turquoise"|"violet"|"wheat"|"white"|"whitesmoke"|"yellow"|"yellowgreen"|"transparent"} NamedColor
 */


Color.namedColors = {
  aliceblue: '#f0f8ff',
  antiquewhite: '#faebd7',
  aqua: '#00ffff',
  aquamarine: '#7fffd4',
  azure: '#f0ffff',
  beige: '#f5f5dc',
  bisque: '#ffe4c4',
  black: '#000000',
  blanchedalmond: '#ffebcd',
  blue: '#0000ff',
  blueviolet: '#8a2be2',
  brown: '#a52a2a',
  burlywood: '#deb887',
  cadetblue: '#5f9ea0',
  chartreuse: '#7fff00',
  chocolate: '#d2691e',
  coral: '#ff7f50',
  cornflowerblue: '#6495ed',
  cornsilk: '#fff8dc',
  crimson: '#dc143c',
  cyan: '#00ffff',
  darkblue: '#00008b',
  darkcyan: '#008b8b',
  darkgoldenrod: '#b8860b',
  darkgray: '#a9a9a9',
  darkgreen: '#006400',
  darkgrey: '#a9a9a9',
  darkkhaki: '#bdb76b',
  darkmagenta: '#8b008b',
  darkolivegreen: '#556b2f',
  darkorange: '#ff8c00',
  darkorchid: '#9932cc',
  darkred: '#8b0000',
  darksalmon: '#e9967a',
  darkseagreen: '#8fbc8f',
  darkslateblue: '#483d8b',
  darkslategray: '#2f4f4f',
  darkslategrey: '#2f4f4f',
  darkturquoise: '#00ced1',
  darkviolet: '#9400d3',
  deeppink: '#ff1493',
  deepskyblue: '#00bfff',
  dimgray: '#696969',
  dimgrey: '#696969',
  dodgerblue: '#1e90ff',
  firebrick: '#b22222',
  floralwhite: '#fffaf0',
  forestgreen: '#228b22',
  fuchsia: '#ff00ff',
  gainsboro: '#dcdcdc',
  ghostwhite: '#f8f8ff',
  gold: '#ffd700',
  goldenrod: '#daa520',
  gray: '#808080',
  green: '#008000',
  greenyellow: '#adff2f',
  grey: '#808080',
  honeydew: '#f0fff0',
  hotpink: '#ff69b4',
  indianred: '#cd5c5c',
  indigo: '#4b0082',
  ivory: '#fffff0',
  khaki: '#f0e68c',
  lavender: '#e6e6fa',
  lavenderblush: '#fff0f5',
  lawngreen: '#7cfc00',
  lemonchiffon: '#fffacd',
  lightblue: '#add8e6',
  lightcoral: '#f08080',
  lightcyan: '#e0ffff',
  lightgoldenrodyellow: '#fafad2',
  lightgray: '#d3d3d3',
  lightgreen: '#90ee90',
  lightgrey: '#d3d3d3',
  lightpink: '#ffb6c1',
  lightsalmon: '#ffa07a',
  lightseagreen: '#20b2aa',
  lightskyblue: '#87cefa',
  lightslategray: '#778899',
  lightslategrey: '#778899',
  lightsteelblue: '#b0c4de',
  lightyellow: '#ffffe0',
  lime: '#00ff00',
  limegreen: '#32cd32',
  linen: '#faf0e6',
  magenta: '#ff00ff',
  maroon: '#800000',
  mediumaquamarine: '#66cdaa',
  mediumblue: '#0000cd',
  mediumorchid: '#ba55d3',
  mediumpurple: '#9370db',
  mediumseagreen: '#3cb371',
  mediumslateblue: '#7b68ee',
  mediumspringgreen: '#00fa9a',
  mediumturquoise: '#48d1cc',
  mediumvioletred: '#c71585',
  midnightblue: '#191970',
  mintcream: '#f5fffa',
  mistyrose: '#ffe4e1',
  moccasin: '#ffe4b5',
  navajowhite: '#ffdead',
  navy: '#000080',
  oldlace: '#fdf5e6',
  olive: '#808000',
  olivedrab: '#6b8e23',
  orange: '#ffa500',
  orangered: '#ff4500',
  orchid: '#da70d6',
  palegoldenrod: '#eee8aa',
  palegreen: '#98fb98',
  paleturquoise: '#afeeee',
  palevioletred: '#db7093',
  papayawhip: '#ffefd5',
  peachpuff: '#ffdab9',
  peru: '#cd853f',
  pink: '#ffc0cb',
  plum: '#dda0dd',
  powderblue: '#b0e0e6',
  purple: '#800080',
  red: '#ff0000',
  rosybrown: '#bc8f8f',
  royalblue: '#4169e1',
  saddlebrown: '#8b4513',
  salmon: '#fa8072',
  sandybrown: '#f4a460',
  seagreen: '#2e8b57',
  seashell: '#fff5ee',
  sienna: '#a0522d',
  silver: '#c0c0c0',
  skyblue: '#87ceeb',
  slateblue: '#6a5acd',
  slategray: '#708090',
  slategrey: '#708090',
  snow: '#fffafa',
  springgreen: '#00ff7f',
  steelblue: '#4682b4',
  tan: '#d2b48c',
  teal: '#008080',
  thistle: '#d8bfd8',
  tomato: '#ff6347',
  turquoise: '#40e0d0',
  violet: '#ee82ee',
  wheat: '#f5deb3',
  white: '#ffffff',
  whitesmoke: '#f5f5f5',
  yellow: '#ffff00',
  yellowgreen: '#9acd32',
  transparent: '#00000000'
};
Color.nonStandarNamedColors = {
  night: '#0C090A',
  gunmetal: '#2C3539',
  midnight: '#2B1B17',
  charcoal: '#34282C',
  oil: '#3B3131',
  blackcat: '#413839',
  iridium: '#3D3C3A',
  blackeel: '#463E3F',
  blackcow: '#4C4646',
  graywolf: '#504A4B',
  vampiregray: '#565051',
  graydolphin: '#5C5858',
  carbongray: '#625D5D',
  ashgray: '#666362',
  cloudygray: '#6D6968',
  smokeygray: '#726E6D',
  granite: '#837E7C',
  battleshipgray: '#848482',
  graycloud: '#B6B6B4',
  graygoose: '#D1D0CE',
  platinum: '#E5E4E2',
  metallicsilver: '#BCC6CC',
  bluegray: '#98AFC7',
  raven: '#657383',
  jetgray: '#616D7E',
  mistblue: '#646D7E',
  marbleblue: '#566D7E',
  shipcove: '#737CA1',
  mariner: '#4863A0',
  bluejay: '#2B547E',
  biscay: '#2B3856',
  navyblue: '#000080',
  bluewhale: '#342D7E',
  lapisblue: '#15317E',
  denimdarkblue: '#151B8D',
  earthblue: '#0000A0',
  cobaltblue: '#0020C2',
  blueberryblue: '#0041C2',
  sapphireblue: '#2554C7',
  blueeyes: '#1569C7',
  blueorchid: '#1F45FC',
  bluelotus: '#6960EC',
  lightslateblue: '#736AFF',
  windowsblue: '#357EC7',
  glacialblueice: '#368BC1',
  silkblue: '#488AC7',
  blueivy: '#3090C7',
  bluekoi: '#659EC7',
  columbiablue: '#87AFC7',
  babyblue: '#95B9C7',
  oceanblue: '#2B65EC',
  blueribbon: '#306EFF',
  bluedress: '#157DEC',
  butterflyblue: '#38ACEC',
  iceberg: '#56A5EC',
  crystalblue: '#5CB3FF',
  denimblue: '#79BAEC',
  dayskyblue: '#82CAFF',
  jeansblue: '#A0CFEC',
  blueangel: '#B7CEEC',
  pastelblue: '#B4CFEC',
  seablue: '#C2DFFF',
  coralblue: '#AFDCEC',
  robineggblue: '#BDEDFF',
  palebluelily: '#CFECEC',
  water: '#EBF4FA',
  lightslate: '#CCFFFF',
  lightaquamarine: '#93FFE8',
  electricblue: '#9AFEFF',
  cyanoraqua: '#00FFFF',
  tronblue: '#7DFDFE',
  bluezircon: '#57FEFF',
  bluelagoon: '#8EEBEC',
  celeste: '#50EBEC',
  bluediamond: '#4EE2EC',
  tiffanyblue: '#81D8D0',
  cyanopaque: '#92C7C7',
  bluehosta: '#77BFC7',
  northernlightsblue: '#78C7C7',
  jellyfish: '#46C7C7',
  bluegreen: '#7BCCB5',
  macawbluegreen: '#43BFC7',
  seaturtlegreen: '#438D80',
  greenishblue: '#307D7E',
  grayishturquoise: '#5E7D7E',
  beetlegreen: '#4C787E',
  camouflagegreen: '#78866B',
  sagegreen: '#848b79',
  hazelgreen: '#617C58',
  venomgreen: '#728C00',
  ferngreen: '#667C26',
  darkforestgreen: '#254117',
  mediumforestgreen: '#347235',
  seaweedgreen: '#437C17',
  pinegreen: '#387C44',
  junglegreen: '#347C2C',
  shamrockgreen: '#347C17',
  greenonion: '#6AA121',
  clovergreen: '#3EA055',
  greensnake: '#6CBB3C',
  aliengreen: '#6CC417',
  greenapple: '#4CC417',
  kellygreen: '#4CC552',
  zombiegreen: '#54C571',
  froggreen: '#99C68E',
  greenpeas: '#89C35C',
  dollarbillgreen: '#85BB65',
  iguanagreen: '#9CB071',
  avocadogreen: '#B2C248',
  pistachiogreen: '#9DC209',
  saladgreen: '#A1C935',
  hummingbirdgreen: '#7FE817',
  nebulagreen: '#59E817',
  stoplightgogreen: '#57E964',
  algaegreen: '#64E986',
  jadegreen: '#5EFB6E',
  emeraldgreen: '#5FFB17',
  dragongreen: '#6AFB92',
  mintgreen: '#98FF98',
  greenthumb: '#B5EAAA',
  lightjade: '#C3FDB8',
  teagreen: '#CCFB5D',
  slimegreen: '#BCE954',
  harvestgold: '#EDE275',
  sunyellow: '#FFE87C',
  cornyellow: '#FFF380',
  parchment: '#FFFFC2',
  cream: '#FFFFCC',
  blonde: '#FBF6D9',
  champagne: '#F7E7CE',
  vanilla: '#F3E5AB',
  tanbrown: '#ECE5B6',
  peach: '#FFE5B4',
  mustard: '#FFDB58',
  rubberduckyyellow: '#FFD801',
  brightgold: '#FDD017',
  goldenbrown: '#EAC117',
  macaroniandcheese: '#F2BB66',
  saffron: '#FBB917',
  beer: '#FBB117',
  cantaloupe: '#FFA62F',
  beeyellow: '#E9AB17',
  brownsugar: '#E2A76F',
  deeppeach: '#FFCBA4',
  gingerbrown: '#C9BE62',
  schoolbusyellow: '#E8A317',
  fallleafbrown: '#C8B560',
  orangegold: '#D4A017',
  sand: '#C2B280',
  cookiebrown: '#C7A317',
  caramel: '#C68E17',
  brass: '#B5A642',
  camelbrown: '#C19A6B',
  bronze: '#CD7F32',
  tigerorange: '#C88141',
  cinnamon: '#C58917',
  bulletshell: '#AF9B60',
  copper: '#B87333',
  wood: '#966F33',
  oakbrown: '#806517',
  armybrown: '#827B60',
  sandstone: '#786D5F',
  mocha: '#493D26',
  taupe: '#483C32',
  coffee: '#6F4E37',
  brownbear: '#835C3B',
  reddirt: '#7F5217',
  sepia: '#7F462C',
  orangesalmon: '#C47451',
  rust: '#C36241',
  redfox: '#C35817',
  sedona: '#CC6600',
  papayaorange: '#E56717',
  halloweenorange: '#E66C2C',
  pumpkinorange: '#F87217',
  constructionconeorange: '#F87431',
  sunriseorange: '#E67451',
  mangoorange: '#FF8040',
  basketballorange: '#F88158',
  tangerine: '#E78A61',
  beanred: '#F75D59',
  valentinered: '#E55451',
  shockingorange: '#E55B3C',
  scarlet: '#FF2400',
  rubyred: '#F62217',
  ferrarired: '#F70D1A',
  fireenginered: '#F62817',
  lavared: '#E42217',
  lovered: '#E41B17',
  grapefruit: '#DC381F',
  chestnutred: '#C34A2C',
  cherryred: '#C24641',
  mahogany: '#C04000',
  chillipepper: '#C11B17',
  cranberry: '#9F000F',
  redwine: '#990012',
  burgundy: '#8C001A',
  chestnut: '#954535',
  bloodred: '#7E3517',
  sangria: '#7E3817',
  plumpie: '#7D0541',
  velvetmaroon: '#7E354D',
  plumvelvet: '#7D0552',
  rosyfinch: '#7F4E52',
  puce: '#7F5A58',
  dullpurple: '#7F525D',
  khakirose: '#C5908E',
  pinkbow: '#C48189',
  lipstickpink: '#C48793',
  rose: '#E8ADAA',
  rosegold: '#ECC5C0',
  desertsand: '#EDC9AF',
  pigpink: '#FDD7E4',
  cottoncandy: '#FCDFFF',
  pinkbubblegum: '#FFDFDD',
  flamingopink: '#F9A7B0',
  pinkrose: '#E7A1B0',
  pinkdaisy: '#E799A3',
  cadillacpink: '#E38AAE',
  carnationpink: '#F778A1',
  blushred: '#E56E94',
  watermelonpink: '#FC6C85',
  violetred: '#F6358A',
  pinkcupcake: '#E45E9D',
  pinklemonade: '#E4287C',
  neonpink: '#F535AA',
  dimorphothecamagenta: '#E3319D',
  brightneonpink: '#F433FF',
  tulippink: '#C25A7C',
  roguepink: '#C12869',
  burntpink: '#C12267',
  bashfulpink: '#C25283',
  darkcarnationpink: '#C12283',
  violapurple: '#7E587E',
  purpleiris: '#571B7E',
  plumpurple: '#583759',
  purplemonster: '#461B7E',
  purplehaze: '#4E387E',
  eggplant: '#614051',
  grape: '#5E5A80',
  purplejam: '#6A287E',
  purpleflower: '#A74AC7',
  purpleamethyst: '#6C2DC7',
  purplesagebush: '#7A5DC7',
  lovelypurple: '#7F38EC',
  aztechpurple: '#893BFF',
  jasminepurple: '#A23BEC',
  purpledaffodil: '#B041FF',
  tyrianpurple: '#C45AEC',
  crocuspurple: '#9172EC',
  purplemimosa: '#9E7BFF',
  heliotropepurple: '#D462FF',
  purpledragon: '#C38EC7',
  lilac: '#C8A2C8',
  blushpink: '#E6A9EC',
  mauve: '#E0B0FF',
  wisteriapurple: '#C6AEC7',
  blossompink: '#F9B7FF',
  periwinkle: '#E9CFEC',
  lavenderpinocchio: '#EBDDE2',
  lavenderblue: '#E3E4FA',
  pearl: '#FDEEF4',
  milkwhite: '#FEFCFF'
};
/********************** COLOR CONVERTER *******************/

Color.rgbToHex = function (rgb) {
  return '#' + rgb.slice(0, 3).map(function (c) {
    var res = (c * 255 >> 0).toString(16);
    if (res < 10) res = '0' + res;
    return res.toUpperCase();
  }).join('');
};

Color.rgbaToHex = function (rgb) {
  return '#' + rgb.map(function (c) {
    var res = (c * 255 >> 0).toString(16);
    if (res < 10) res = '0' + res;
    return res.toUpperCase();
  }).join('');
};

Color.hsbaToText = function (hsba) {
  return 'hsba(' + (hsba[0] * 360 >> 0) + 'deg, ' + (hsba[1] * 100 >> 0) + '%, ' + (hsba[2] * 100 >> 0) + '%, ' + hsba[3].toFixed(3) + ')';
};

Color.hslaToText = function (hsla) {
  return 'hsla(' + (hsla[0] * 360 >> 0) + 'deg, ' + (hsla[1] * 100 >> 0) + '%, ' + (hsla[2] * 100 >> 0) + '%, ' + hsla[3].toFixed(3) + ')';
};

Color.rgbaToText = function (rgba) {
  return 'rgba(' + (rgba[0] * 255 >> 0) + ', ' + (rgba[1] * 255 >> 0) + ', ' + (rgba[2] * 255 >> 0) + ', ' + rgba[3].toFixed(3) + ')';
};

Color.hsbToText = function (hsba) {
  return 'hsb(' + (hsba[0] * 360 >> 0) + 'deg, ' + (hsba[1] * 100 >> 0) + '%, ' + (hsba[2] * 100 >> 0) + '%)';
};

Color.hslToText = function (hsl) {
  return 'hsl(' + (hsl[0] * 360 >> 0) + 'deg, ' + (hsl[1] * 100 >> 0) + '%, ' + (hsl[2] * 100 >> 0) + '%)';
};

Color.rgbToText = function (rgba) {
  return 'rgb(' + (rgba[0] * 255 >> 0) + ', ' + (rgba[1] * 255 >> 0) + ', ' + (rgba[2] * 255 >> 0) + ')';
};

Color.hsbaToHSLA = function (hsba) {
  var hue = hsba[0];
  var sat = hsba[1];
  var val = hsba[2]; // Calculate lightness.

  var li = (2 - sat) * val / 2; // Convert saturation.

  if (li !== 0) {
    if (li === 1) {
      sat = 0;
    } else if (li < 0.5) {
      sat = sat / (2 - sat);
    } else {
      sat = sat * val / (2 - li * 2);
    }
  } // Hue and alpha stay the same.


  return [hue, sat, li, hsba[3]];
};

Color.hsbaToRGBA = function (hsba) {
  var hue = hsba[0] * 6; // We will split hue into 6 sectors.

  var sat = hsba[1];
  var val = hsba[2];
  var RGBA = [];

  if (sat === 0) {
    RGBA = [val, val, val, hsba[3]]; // Return early if grayscale.
  } else {
    var sector = Math.floor(hue);
    var tint1 = val * (1 - sat);
    var tint2 = val * (1 - sat * (hue - sector));
    var tint3 = val * (1 - sat * (1 + sector - hue));
    var red, green, blue;

    if (sector === 1) {
      // Yellow to green.
      red = tint2;
      green = val;
      blue = tint1;
    } else if (sector === 2) {
      // Green to cyan.
      red = tint1;
      green = val;
      blue = tint3;
    } else if (sector === 3) {
      // Cyan to blue.
      red = tint1;
      green = tint2;
      blue = val;
    } else if (sector === 4) {
      // Blue to magenta.
      red = tint3;
      green = tint1;
      blue = val;
    } else if (sector === 5) {
      // Magenta to red.
      red = val;
      green = tint1;
      blue = tint2;
    } else {
      // Red to yellow (sector could be 0 or 6).
      red = val;
      green = tint3;
      blue = tint1;
    }

    RGBA = [red, green, blue, hsba[3]];
  }

  return RGBA;
};

Color.hslaToHSBA = function (hsla) {
  var hue = hsla[0];
  var sat = hsla[1];
  var li = hsla[2]; // Calculate brightness.

  var val;

  if (li < 0.5) {
    val = (1 + sat) * li;
  } else {
    val = li + sat - li * sat;
  } // Convert saturation.


  sat = 2 * (val - li) / val; // Hue and alpha stay the same.

  return [hue, sat, val, hsla[3]];
};

Color.hslaToRGBA = function (hsla) {
  var hue = hsla[0] * 6; // We will split hue into 6 sectors.

  var sat = hsla[1];
  var li = hsla[2];
  var RGBA = [];

  if (sat === 0) {
    RGBA = [li, li, li, hsla[3]]; // Return early if grayscale.
  } else {
    // Calculate brightness.
    var val;

    if (li < 0.5) {
      val = (1 + sat) * li;
    } else {
      val = li + sat - li * sat;
    } // Define zest.


    var zest = 2 * li - val; // Implement projection (project onto green by default).

    var hzvToRGB = function (hue, zest, val) {
      if (hue < 0) {
        // Hue must wrap to allow projection onto red and blue.
        hue += 6;
      } else if (hue >= 6) {
        hue -= 6;
      }

      if (hue < 1) {
        // Red to yellow (increasing green).
        return zest + (val - zest) * hue;
      } else if (hue < 3) {
        // Yellow to cyan (greatest green).
        return val;
      } else if (hue < 4) {
        // Cyan to blue (decreasing green).
        return zest + (val - zest) * (4 - hue);
      } else {
        // Blue to red (least green).
        return zest;
      }
    }; // Perform projections, offsetting hue as necessary.


    RGBA = [hzvToRGB(hue + 2, zest, val), hzvToRGB(hue, zest, val), hzvToRGB(hue - 2, zest, val), hsla[3]];
  }

  return RGBA;
};

Color.rgbaToHSBA = function (rgba) {
  var red = rgba[0];
  var green = rgba[1];
  var blue = rgba[2];
  var val = Math.max(red, green, blue);
  var chroma = val - Math.min(red, green, blue);
  var hue, sat;

  if (chroma === 0) {
    // Return early if grayscale.
    hue = 0;
    sat = 0;
  } else {
    sat = chroma / val;

    if (red === val) {
      // Magenta to yellow.
      hue = (green - blue) / chroma;
    } else if (green === val) {
      // Yellow to cyan.
      hue = 2 + (blue - red) / chroma;
    } else if (blue === val) {
      // Cyan to magenta.
      hue = 4 + (red - green) / chroma;
    }

    if (hue < 0) {
      // Confine hue to the interval [0, 1).
      hue += 6;
    } else if (hue >= 6) {
      hue -= 6;
    }
  }

  return [hue / 6, sat, val, rgba[3]];
};

Color.rgbaToHSLA = function (rgba) {
  var red = rgba[0];
  var green = rgba[1];
  var blue = rgba[2];
  var val = Math.max(red, green, blue);
  var min = Math.min(red, green, blue);
  var li = val + min; // We will halve this later.

  var chroma = val - min;
  var hue, sat;

  if (chroma === 0) {
    // Return early if grayscale.
    hue = 0;
    sat = 0;
  } else {
    if (li < 1) {
      sat = chroma / li;
    } else {
      sat = chroma / (2 - li);
    }

    if (red === val) {
      // Magenta to yellow.
      hue = (green - blue) / chroma;
    } else if (green === val) {
      // Yellow to cyan.
      hue = 2 + (blue - red) / chroma;
    } else if (blue === val) {
      // Cyan to magenta.
      hue = 4 + (red - green) / chroma;
    }

    if (hue < 0) {
      // Confine hue to the interval [0, 1).
      hue += 6;
    } else if (hue >= 6) {
      hue -= 6;
    }
  }

  return [hue / 6, sat, li / 2, rgba[3]];
};

Color.hwbaToHSBA = function (hwba) {
  return [hwba[0], 1 - hwba[1] / (1 - hwba[2]), 1 - hwba[2], hwba[3]];
};

Color.hsbaToHWBA = function (hsla) {
  return [hsla[0], (1 - hsla[1]) * hsla[2], 1 - hsla[2], hsla[3]];
};

Color.rgbaToHWBA = function (rgba) {
  return this.hsbaToHWBA(this.rgbaToHSBA(rgba));
};

Color.hwbaToRGBA = function (hwba) {
  return this.hsbaToRGBA(this.hwbaToHSBA(hwba));
};

var _default = Color;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/Svg.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/Svg.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.svgToRasterImageUrl = svgToRasterImageUrl;
exports.svgToExportedString = svgToExportedString;
exports.default = void 0;

var _Dom = _interopRequireWildcard(require("./Dom"));

var _ElementNS = _interopRequireDefault(require("./ElementNS"));

var _AElement = _interopRequireDefault(require("./AElement"));

var _Color = _interopRequireDefault(require("../Color/Color"));

var _AttachHook = _interopRequireDefault(require("./AttachHook"));

var _OOP = _interopRequireDefault(require("./OOP"));




/***
 * @extends Dom
 * @param option
 * @constructor
 */
function Svg(option) {
  _Dom.default.call(this, option);

  this.svgNS = "http://www.w3.org/2000/svg";
  Object.defineProperties(this.creator, {
    sattachhook: {
      set: function () {//do nothing
      },
      get: function () {
        return _AttachHook.default;
      }
    }
  });
  delete this.buidDom;
  this.buildSvg = this.create.bind(this);
}

_OOP.default.mixClass(Svg, _Dom.default);

Svg.prototype.defaultTag = 'g';

Svg.prototype.fromCode = function (code) {
  code = code.trim();
  var receptacle = document.createElement('div');
  var element;
  var prototypes;

  if (code.startsWith('<svg')) {
    receptacle.innerHTML = code;
    element = receptacle.childNodes[0];
    prototypes = Object.getOwnPropertyDescriptors(_AElement.default.prototype);
    Object.defineProperties(element, prototypes);

    _AElement.default.call(element);
  } else {
    var svgfragment = '<svg  version="1.1" xmlns="http://www.w3.org/2000/svg">' + code + '</svg>';
    receptacle.innerHTML = '' + svgfragment;
    element = receptacle.childNodes[0].childNodes[0];
    prototypes = Object.getOwnPropertyDescriptors(_ElementNS.default.prototype);
    Object.defineProperties(element, prototypes);

    _ElementNS.default.call(element);
  }

  return element;
};

Svg.prototype.makeNewElement = function (tagName) {
  return document.createElementNS(this.svgNS, tagName);
};

Svg.ShareInstance = new Svg();

Svg.svgToCanvas = function (element) {
  if (typeof element == 'string') {
    element = _Dom.default.ShareInstance.$(element);
  }

  if (element && element.tagName == 'svg') {
    var depthClone = function (originElt) {
      var newElt = originElt.cloneNode(); //no deep

      if (!originElt.getAttributeNS) return newElt; //is text node

      var style = getComputedStyle(originElt);
      var key, value;

      for (var i = 0; i < style.length; ++i) {
        key = style[i];
        value = style.getPropertyValue(key);

        if (value && value.length > 0 && value !== 'auto') {
          newElt.style.setProperty(key, value);
        }
      }

      var children = Array.prototype.map.call(originElt.childNodes, depthClone);

      for (var i = 0; i < children.length; ++i) {
        newElt.appendChild(children[i]);
      }

      return newElt;
    };

    var cloneElement = depthClone(element);

    var renderSpace = _Dom.default.ShareInstance._({
      style: {
        // opacity:0,
        zIndex: -1000,
        position: 'fixed',
        top: 0,
        bottom: 0
      }
    }).addTo(document.body);

    renderSpace.addChild(cloneElement);
    var svgCode = renderSpace.innerHTML;
    renderSpace.clearChild();
    var mBlob = new Blob([svgCode], {
      type: "image/svg+xml;charset=utf-8"
    });
    var src = (URL || webkitURL).createObjectURL(mBlob);

    var image = _Dom.default.ShareInstance._('img');

    image.attr('src', src).addTo(renderSpace);
    var canvas = document.createElement("canvas");
    renderSpace.addChild(canvas);
    return _Dom.default.waitImageLoaded(image).then(function () {
      canvas.width = image.width;
      canvas.height = image.height;
      var context = canvas.getContext("2d");
      context.drawImage(image, 0, 0);
      renderSpace.selfRemove();
      return canvas;
    });
  } else {
    throw new Error('Element must be svg');
  }
};

function svgToRasterImageUrl(element) {
  return Svg.svgToCanvas(element).then(function (canvas) {
    return canvas.toDataURL();
  });
}

Svg.svgToRasterImageUrl = svgToRasterImageUrl;

function svgToExportedString(element) {
  if (typeof element == 'string') {
    element = _Dom.default.ShareInstance.$(element);
  }

  if (element && element.tagName == 'svg') {
    var depthClone = function (originElt) {
      var newElt = originElt.cloneNode(); //no deep

      if (!originElt.getAttributeNS) return newElt; //is text node

      var cssRules = _AElement.default.prototype.getCSSRules.call(originElt);

      var cssKey = cssRules.reduce(function (ac, rule) {
        for (var i = 0; i < rule.style.length; ++i) {
          ac[rule.style[i]] = true;
        }

        return ac;
      }, {});

      for (var key in cssKey) {
        newElt.style[key] = _AElement.default.prototype.getComputedStyleValue.call(originElt, key);
      }

      var children = Array.prototype.map.call(originElt.childNodes, depthClone);

      for (var i = 0; i < children.length; ++i) {
        newElt.appendChild(children[i]);
      }

      return newElt;
    };

    var cloneElement = depthClone(element);

    var renderSpace = _Dom.default.ShareInstance._({
      style: {
        // opacity:0,
        zIndex: -1000,
        position: 'fixed',
        top: 0,
        bottom: 0
      }
    }).addTo(document.body);

    renderSpace.addChild(cloneElement);
    var svgCode = renderSpace.innerHTML;
    renderSpace.selfRemove();
    return svgCode;
  } else {
    throw new Error('Element must be svg');
  }
}

;
Svg.svgToExportedString = svgToExportedString;

function svgToSvgUrl(element) {
  var svg = svgToExportedString(element);
  svg = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' + svg;
  var blob = new Blob([svg], {
    type: 'image/svg+xml'
  });
  var url = URL.createObjectURL(blob);
  return url;
}

Svg.svgToSvgUrl = svgToSvgUrl;
/***
 *
 * @param {AElement|String | {computeStyle?: boolean, elt: AElement, keepBackgroundColor?:boolean,convertSVG?:boolean}} option
 * @return {Promise<unknown>}
 */

_Dom.default.printElement = function (option) {
  var _ = _Dom.default.ShareInstance._;
  var $ = _Dom.default.ShareInstance.$;
  option = option || {};

  if (typeof option == 'string') {
    option = {
      elt: _Dom.default.ShareInstance.$(option)
    };
  } else if (typeof option.elt == 'string') {
    option.elt = $(option.elt);
  } else if (_Dom.default.isDomNode(option)) {
    option = {
      elt: option
    };
  }

  option = Object.assign({
    keepBackgroundColor: true,
    convertSVG: false,
    computeStyle: false
  }, option);

  if (_Dom.default.isDomNode(option.elt)) {
    function afterCloneCb(originElt, newElt) {
      if (!newElt.tagName) return;
      var tagName = newElt.tagName.toLowerCase();
      if (newElt.getBBox && tagName !== 'svg') return;
      var url, img;
      var needCopyStyle = option.computeStyle;
      var needKeepBackgroundColor = option.keepBackgroundColor;

      if (tagName === 'canvas' || tagName === 'svg' && option.convertSVG) {
        if (tagName === "canvas") {
          url = originElt.toDataURL();
        } else {
          url = svgToSvgUrl(originElt);
        }

        img = _({
          tag: 'img',
          props: {
            src: url
          }
        });
        $(newElt).selfReplace(img);
        newElt = img;
        needCopyStyle = true;
      } else if (tagName === 'script') {
        newElt.remove();
      } else if (tagName === 'img') {
        newElt.setAttribute('src', originElt.src);
      } else if (tagName === 'input') {
        if (originElt.getAttribute('type') === 'radio' || originElt.getAttribute('type') === 'checkbox') {
          if (originElt.checked) {
            newElt.setAttribute('checked', true);
          }
        } else if (originElt.getAttribute('type') === 'text' || !originElt.getAttribute('type') || originElt.getAttribute('type') === 'number') {
          newElt.setAttribute('value', originElt.value);
        }
      }

      if (needCopyStyle) {
        (0, _Dom.copyStyleRule)(originElt, newElt);
      }

      if (needKeepBackgroundColor) {
        try {
          var bgColor = _AElement.default.prototype.getComputedStyleValue.call(originElt, 'background-color');

          if (bgColor) {
            bgColor = _Color.default.parse(bgColor);

            if (bgColor.rgba[3] > 0) {
              newElt.style.setProperty('background-color', bgColor.toString('hex8'), 'important');
            }
          }
        } catch (e) {}
      }

      return newElt;
    }

    var newElt = (0, _Dom.depthClone)(option.elt, afterCloneCb);

    var renderSpace = _({
      style: {
        position: 'fixed',
        top: '0',
        left: '0',
        right: '0',
        bottom: '0',
        overflow: 'auto',
        zIndex: '10',
        opacity: '0',
        visibility: 'hidden'
      }
    });

    $('link', document.head, function (elt) {
      var temp = elt.cloneNode(false); //copy absolute url

      temp.setAttribute('href', elt.href);
      renderSpace.addChild(temp);
    });

    if (!option.computeStyle) {
      $('style', document.head, function (elt) {
        if (elt == _Dom.default.$printStyle) return;
        renderSpace.addChild(elt.cloneNode(true));
      });
    }

    renderSpace.addChild(newElt);
    var eltCode = renderSpace.innerHTML;
    renderSpace.clearChild();
    option.title = option.title || ($('title', document.head) || {
      innerHTML: 'absol.js'
    }).innerHTML;
    var htmlCode = ['<ht' + 'ml>', ' <h' + 'ead><title>' + option.title + '</title><meta charset="UTF-8">', '<style>', option.overideStyle ? 'html, body{width:initial !important; height:initial !important; overflow: initial !important; overflow-x: initial !important;overflow-y: initial !important;  }' : '', '@media print {', //still not work
    '    body{', '      -webkit-print-color-adjust: exact;', '       color-adjust: exact;', '    } ', '    div, tr, td, table{', '    }', '  }', 'div, table, tr, td{', '    page-break-inside: initial;', '    page-break-before: avoid;', '    page-break-after: avoid;', '}', option.extendCss || '', '</style>', '</he' + 'ad>', '<bod' + 'y>', eltCode, '<scr' + 'ipt>' + (option.extendScript || '') + '</scri' + 'pt>', //browser parse  script tag fail
    '<scr' + 'ipt>setTimeout(function(){ window.print();},1000);</scri' + 'pt>', //browser parse  script tag fail
    '</bod' + 'y>', '</ht' + 'ml>'].join('\n');
    var blob = new Blob([htmlCode], {
      type: 'text/html; charset=UTF-8'
    });
    renderSpace.addTo(document.body);

    var iframe = _('iframe').attr('src', URL.createObjectURL(blob)).addStyle({
      width: '100%',
      height: '100%'
    }).addTo(renderSpace);

    return new Promise(function (rs, rj) {
      function waitLoad() {
        if (iframe.contentWindow && iframe.contentWindow.document && iframe.contentWindow.document.body) {
          if (typeof option.onLoad == 'function') option.onLoad();
          iframe.contentWindow.focus();
          setTimeout(function () {
            function waitFocusBack() {
              if (!document.hasFocus || document.hasFocus()) {
                renderSpace.remove();
                if (typeof option.onFinish == 'function') option.onFinish();
                rs();
              } else {
                setTimeout(waitFocusBack, 300);
              }
            }

            waitFocusBack();
          }, 4000);
        } else setTimeout(waitLoad, 1000);
      }

      waitLoad();
    });
  } else {
    throw new Error('Invalid param!');
  }
};

var _default = Svg;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Math/random.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/random.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.randomArbitrary = randomArbitrary;
exports.randomInt = randomInt;
exports.randomPick = randomPick;

/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */
function randomArbitrary(min, max) {
  return Math.random() * (max - min) + min;
}
/**
 * Returns a random integer between min (inclusive) and max (inclusive)
 * Using Math.round() will give you a non-uniform distribution!
 */


function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function randomPick(arr) {
  var id = randomInt(0, arr.length - 1);
  return arr[id];
}
};

moduleFactories["node_modules/absol/src/String/stringGenerate.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/String/stringGenerate.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.randomIdent = randomIdent;
exports.parallelMatch = parallelMatch;
exports.randomWord = randomWord;
exports.randomPhrase = randomPhrase;
exports.randomSentence = randomSentence;
exports.randomParagraph = randomParagraph;
exports.ipsumLoremWord = exports.identCharacters = void 0;

var _random = require("../Math/random");

var identCharacters = function () {
  var chars = 'qwertyuiopasdfghjklzxcvbnm';
  chars = chars + chars.toUpperCase();
  var num = '0123456789';
  var spect = '_';
  return (chars + spect + num).split('');
}();

exports.identCharacters = identCharacters;

function randomIdent(length) {
  if (!(length > 0)) length = 4;
  var factor = identCharacters;
  return [factor[Math.random() * (factor.length - 10) >> 0]].concat(Array(length - 1).fill('').map(function () {
    return factor[Math.random() * factor.length >> 0];
  })).join('');
}

function parallelMatch(a, b) {
  var l = Math.min(a.length, b.length);
  var res = 0;

  for (var i = 0; i < l; ++i) {
    if (a[i] == b[i]) ++res;
  }

  return res;
}

var ipsumLoremWord = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt', 'ut', 'labore', 'et', 'dolore', 'magna', 'aliqua', 'enim', 'ad', 'minim', 'veniam', 'quis', 'nostrud', 'exercitation', 'ullamco', 'laboris', 'nisi', 'aliquip', 'ex', 'ea', 'commodo', 'consequat', 'duis', 'aute', 'irure', 'in', 'reprehenderit', 'voluptate', 'velit', 'esse', 'cillum', 'eu', 'fugiat', 'nulla', 'pariatur', 'excepteur', 'sint', 'occaecat', 'cupidatat', 'non', 'proident', 'sunt', 'culpa', 'qui', 'officia', 'deserunt', 'mollit', 'anim', 'id', 'est', 'laborum', 'perspiciatis', 'unde', 'omnis', 'iste', 'natus', 'error', 'voluptatem', 'accusantium', 'doloremque', 'laudantium', 'totam', 'rem', 'aperiam', 'eaque', 'ipsa', 'quae', 'ab', 'illo', 'inventore', 'veritatis', 'quasi', 'architecto', 'beatae', 'vitae', 'dicta', 'explicabo', 'nemo', 'ipsam', 'quia', 'voluptas', 'aspernatur', 'aut', 'odit', 'fugit', 'consequuntur', 'magni', 'dolores', 'eos', 'ratione', 'sequi', 'nesciunt', 'neque', 'porro', 'quisquam', 'dolorem', 'adipisci', 'numquam', 'eius', 'modi', 'tempora', 'incidunt', 'magnam', 'aliquam', 'quaerat', 'minima', 'nostrum', 'exercitationem', 'ullam', 'corporis', 'suscipit', 'laboriosam', 'aliquid', 'commodi', 'consequatur', 'autem', 'vel', 'eum', 'iure', 'quam', 'nihil', 'molestiae', 'illum', 'quo', 'at', 'vero', 'accusamus', 'iusto', 'odio', 'dignissimos', 'ducimus', 'blanditiis', 'praesentium', 'voluptatum', 'deleniti', 'atque', 'corrupti', 'quos', 'quas', 'molestias', 'excepturi', 'occaecati', 'cupiditate', 'provident', 'similique', 'mollitia', 'animi', 'dolorum', 'fuga', 'harum', 'quidem', 'rerum', 'facilis', 'expedita', 'distinctio', 'nam', 'libero', 'tempore', 'sum', 'soluta', 'nobis', 'eligendi', 'optio', 'cumque', 'impedit', 'minus', 'quod', 'maxime', 'placeat', 'facere', 'possimus', 'assumenda', 'repellendus', 'temporibus', 'quibusdam', 'officiis', 'debitis', 'necessitatibus', 'saepe', 'eveniet', 'voluptates', 'repudiandae', 'recusandae', 'itaque', 'earum', 'hic', 'tenetur', 'a', 'sapiente', 'delectus', 'reiciendis', 'voluptatibus', 'maiores', 'alias', 'perferendis', 'doloribus', 'asperiores', 'repellat', 'integer', 'nec', 'praesent', 'cursus', 'ante', 'dapibus', 'diam', 'sem', 'nibh', 'elementum', 'imperdiet', 'sagittis', 'mauris', 'fusce', 'tellus', 'augue', 'semper', 'porta', 'massa', 'vestibulum', 'lacinia', 'arcu', 'eget', 'class', 'aptent', 'taciti', 'sociosqu', 'litora', 'torquent', 'per', 'conubia', 'nostra', 'inceptos', 'himenaeos', 'curabitur', 'sodales', 'ligula', 'dignissim', 'nunc', 'tortor', 'pellentesque', 'aenean', 'scelerisque', 'maecenas', 'mattis', 'convallis', 'tristique', 'proin', 'egestas', 'porttitor', 'morbi', 'lectus', 'risus', 'iaculis', 'luctus', 'ac', 'turpis', 'aliquet', 'metus', 'ullamcorper', 'tincidunt', 'euismod', 'quisque', 'volutpat', 'condimentum', 'urna', 'facilisi', 'fringilla', 'suspendisse', 'potenti', 'feugiat', 'mi', 'sapien', 'etiam', 'ultrices', 'justo', 'lacus', 'pharetra', 'auctor', 'interdum', 'primis', 'faucibus', 'orci', 'posuere', 'cubilia', 'curae', 'molestie', 'dui', 'blandit', 'congue', 'pede', 'facilisis', 'laoreet', 'donec', 'viverra', 'malesuada', 'pulvinar', 'sollicitudin', 'cras', 'nisl', 'felis', 'venenatis', 'ultricies', 'accumsan', 'pretium', 'fermentum', 'nullam', 'purus', 'mollis', 'vivamus', 'consectetuer'];
exports.ipsumLoremWord = ipsumLoremWord;

function randomWord() {
  var arr = ipsumLoremWord;
  var idx = (0, _random.randomInt)(0, arr.length - 1);
  return arr[idx];
}

function randomPhrase(limitLenght) {
  if (!limitLenght) limitLenght = 50;
  var length = Math.ceil(Math.random() * limitLenght / 7);
  return new Array(length).fill(null).map(randomWord).reduce(function (ac, cr) {
    if (ac.length + cr.length < limitLenght) {
      ac.parts.push(cr);
    }

    return ac;
  }, {
    parts: [],
    length: 0
  }).parts.join(' ');
}

function randomSentence(limitLenght) {
  if (!limitLenght) limitLenght = 300;
  var length = Math.ceil(Math.random() * limitLenght / 70);
  var res = new Array(length).fill(null).map(randomPhrase).reduce(function (ac, cr) {
    if (ac.length + cr.length < limitLenght) {
      ac.parts.push(cr);
    }

    return ac;
  }, {
    parts: [],
    length: 0
  }).parts.join(', ');

  if (Math.random() < 0.03) {
    res = res.replace(/\,/i, ':');
  }

  res = res.replace(/^./, function (x) {
    return x.toUpperCase();
  });
  res += '.';
  return res;
}

function randomParagraph(limitLength) {
  if (!limitLength) limitLength = 1000;
  var length = Math.ceil(Math.random() * limitLength / 200);
  return new Array(length).fill(null).map(randomSentence).reduce(function (ac, cr) {
    if (ac.length + cr.length < limitLength) {
      ac.parts.push(cr);
    }

    return ac;
  }, {
    parts: [],
    length: 0
  }).parts.join(' ');
}
};

moduleFactories["node_modules/absol/src/Network/IFrameBridge.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/IFrameBridge.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("../HTML5/EventEmitter"));

var _stringGenerate = require("../String/stringGenerate");

var _safeThrow = _interopRequireDefault(require("../Code/safeThrow"));


var TYPE_WORKER = 'WORKER';
var TYPE_IFRAME = 'IFRAME';
var TYPE_IFRAME_MASTER = 'IFRAME_MASTER';
var TYPE_WORKER_MASTER = 'WORKER_MASTER';
/**
 *
 * @param {Worker|HTMLIFrameElement|WorkerGlobalScope|Window=} host
 */

function IFrameBridge(host) {
  _EventEmitter.default.call(this);
  /***
   *
   * @type {Worker|HTMLIFrameElement|WorkerGlobalScope|Window|WorkerGlobalScope|Window}
   */


  this.host = host || self;
  this.sender = null;
  this.receiver = null;
  this.origin = null;
  this.type = 'NOT_DETECT';
  this.id = "UNSET";
  this.sync = this._detectHost().then(() => this._attach());
  this.__azarResolveCallbacks = {};
  this.__azarRejectCallbacks = {};
}

IFrameBridge.TYPE_WORKER = TYPE_WORKER;
IFrameBridge.TYPE_IFRAME = TYPE_IFRAME;
IFrameBridge.TYPE_IFRAME_MASTER = TYPE_IFRAME_MASTER;
IFrameBridge.TYPE_WORKER_MASTER = TYPE_WORKER_MASTER;

IFrameBridge.prototype._detectHost = function () {
  return new Promise(rs => {
    var iframeLoaded = () => {
      if (this.host.removeEventListener) {
        this.host.removeEventListener("load", iframeLoaded);
      } else {
        this.host.detachEvent("onload", iframeLoaded);
      }

      this.sender = this.host.contentWindow;
      rs();
    };

    if (this.host instanceof Worker) {
      this.type = TYPE_WORKER_MASTER;
      this.sender = this.host;
      this.receiver = this.host;
    } else if (this.host.tagName === 'IFRAME') {
      this.type = TYPE_IFRAME_MASTER;
      this.receiver = self;
      this.id = this.host.src;
      this.origin = '*';

      if (this.host.addEventListener) {
        this.host.addEventListener("load", iframeLoaded);
      } else {
        this.host.attachEvent("onload", iframeLoaded);
      }
    } else if (IFrameBridge.isInIFrame()) {
      this.type = TYPE_IFRAME;
      this.sender = window.parent;
      this.receiver = this.host;
      this.id = location.href;
      this.origin = '*';
    } else if (IFrameBridge.isInWorker()) {
      this.type = TYPE_WORKER;
      this.sender = this.host;
      this.receiver = this.host;
    }

    if (this.sender) rs();
  });
};

IFrameBridge.prototype._attach = function () {
  if (this.receiver.addEventListener) {
    this.receiver.addEventListener("message", this.__azarMessageListener.bind(this), false);
  } else if (this.receiver.attachEvent) {
    this.receiver.attachEvent("onmessage", this.__azarMessageListener.bind(this));
  } else {
    this.receiver.onmessage = this.__azarMessageListener.bind(this);
  }
};

IFrameBridge.fromIFrame = function (iframe) {
  return new IFrameBridge(iframe);
  var host = iframe.contentWindow || iframe.contentDocument;
  var src = iframe.src;
  var rootOrigin = location.origin;
  var iframeOrigin = src.match(/^(http|https):\/\/[^/]+/);

  if (iframeOrigin) {
    iframeOrigin = iframeOrigin[0];
  } else {
    iframeOrigin = rootOrigin;
  }

  if (host) return new IFrameBridge(host, iframeOrigin);else {
    var result = new IFrameBridge(undefined, iframeOrigin);

    var attachedHost = function () {
      var host = iframe.contentWindow || iframe.contentDocument;
      result.attach(host);
    };

    if (iframe.addEventListener) {
      iframe.addEventListener("load", attachedHost);
    } else {
      iframe.attachEvent("onload", attachedHost);
    }

    return result;
  }
};

IFrameBridge.getInstance = function () {
  if (!IFrameBridge.shareInstance) {
    var origin = location.origin;
    var rootOrigin = IFrameBridge.fromIFrame() ? IFrameBridge.getParentUrl().match(/^(http|https):\/\/[^/]+/) : null;

    if (rootOrigin) {
      rootOrigin = rootOrigin[0];
    } else {
      rootOrigin = origin;
    } // IFrameBridge.shareInstance = new IFrameBridge(self, rootOrigin == origin? undefined: "*" || rootOrigin );


    var host = self;
    IFrameBridge.shareInstance = new IFrameBridge(host, rootOrigin);
  }

  return IFrameBridge.shareInstance;
};

Object.defineProperties(IFrameBridge.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
IFrameBridge.prototype.constructor = IFrameBridge;

IFrameBridge.isInIFrame = function () {
  return !IFrameBridge.isInWorker() && top !== self;
};

IFrameBridge.isInWorker = function () {
  return typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
};

IFrameBridge.getParentUrl = function () {
  var parentUrl = window.location != window.parent.location ? document.referrer : document.location.href;
  return parentUrl;
};

IFrameBridge.prototype.__azarMessageListener = function (event) {
  this.__azarHandleData(event.data);
};

IFrameBridge.prototype.__azarHandleData = function (data) {
  if (data.bridgeId !== this.id) return;

  if (data.type) {
    if (data.type == "INVOKE") {
      try {
        var result = this.__azarSelfInvoke(data.name, data.params);

        if (result && typeof result.then == 'function') {
          result.then(function (result) {
            this.__azarResolve(data.taskId, result);
          }.bind(this)).catch(function (err) {
            (0, _safeThrow.default)(err);

            this.__azarResolve(data.taskId, null, err);
          }.bind(this));
        } else {
          this.__azarResolve(data.taskId, result);
        }
      } catch (err) {
        (0, _safeThrow.default)(err);

        this.__azarResolve(data.taskId, null, err);
      }
    } else if (data.type == "INVOKE_RESULT") {
      if (this.__azarResolveCallbacks[data.taskId]) {
        if (data.error) {
          this.__azarRejectCallbacks[data.taskId](data.error);
        } else {
          this.__azarResolveCallbacks[data.taskId](data.result);
        }

        delete this.__azarResolveCallbacks[data.taskId];
        delete this.__azarRejectCallbacks[data.taskId];
      }
    } else if (data.type == "EMIT") {
      this.fire.apply(this, data.params);
    } else this.fire('message', data, this);
  }
};

IFrameBridge.prototype.__azarResolve = function (taskId, result, error) {
  var data = {
    type: "INVOKE_RESULT",
    taskId: taskId,
    result: result,
    error: error,
    bridgeId: this.id
  };

  if (this.origin) {
    this.sender.postMessage(data, this.origin);
  } else {
    this.sender.postMessage(data);
  }
};

IFrameBridge.prototype.__azarSelfInvoke = function (name, params) {
  if (typeof this[name] == 'function') {
    return this[name].apply(this, params);
  } else {
    return this[name];
  }
};

IFrameBridge.prototype.emit = function () {
  var params = [];
  params.push.apply(params, arguments);
  this.sync.then(function () {
    var data = {
      type: "EMIT",
      params: params,
      bridgeId: this.id
    };

    if (this.origin) {
      this.sender.postMessage(data, this.origin);
    } else {
      this.sender.postMessage(data);
    }
  }.bind(this));
  return this;
};

IFrameBridge.prototype.invoke = function (name) {
  var params = [];
  params.push.apply(params, arguments);
  params.shift();
  return this.sync.then(function () {
    var indent = (0, _stringGenerate.randomIdent)(32);
    var data = {
      type: 'INVOKE',
      params: params,
      taskId: indent,
      name: name,
      bridgeId: this.id
    };

    if (this.origin) {
      this.host.postMessage(data, this.origin);
    } else {
      this.host.postMessage(data);
    }

    return new Promise(function (resolve, reject) {
      this.__azarResolveCallbacks[indent] = resolve;
      this.__azarRejectCallbacks[indent] = reject;
    }.bind(this));
  }.bind(this));
};

IFrameBridge.prototype.importScriptURLs = function () {
  return this.invoke.apply(this, ['_receiveScriptURLs'].concat(Array.prototype.slice.call(arguments)));
};

IFrameBridge.prototype.importScript = function (code) {
  var blob = new Blob([code], {
    type: 'application/javascript'
  });
  var url = URL.createObjectURL(blob);
  return this.importScriptURLs(url);
};

IFrameBridge.prototype.createMethod = function (name, fx) {
  this[name] = function () {
    return this.invoke.apply(this, [name].concat(Array.prototype.slice.call(arguments)));
  };

  return this.invoke.apply(this, ['_receiveMethod', name, fx.toString()]);
};

IFrameBridge.prototype._receiveScriptURLs = function () {
  if (self.importScripts) {
    self.importScripts.apply(self, arguments);
  }
};

IFrameBridge.prototype._receiveMethod = function (name, code) {
  this[name] = new Function('return ' + code)();
};

var _default = IFrameBridge;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/JSDocx/templates/document.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSDocx/templates/document.tpl ***/
module.exports = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<w:document\r\n  xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\r\n  xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\"\r\n  xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n  xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"\r\n  xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\r\n  xmlns:ns6=\"http://schemas.openxmlformats.org/schemaLibrary/2006/main\"\r\n  xmlns:c=\"http://schemas.openxmlformats.org/drawingml/2006/chart\"\r\n  xmlns:ns8=\"http://schemas.openxmlformats.org/drawingml/2006/chartDrawing\"\r\n  xmlns:dgm=\"http://schemas.openxmlformats.org/drawingml/2006/diagram\"\r\n  xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"\r\n  xmlns:ns11=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\"\r\n  xmlns:dsp=\"http://schemas.microsoft.com/office/drawing/2008/diagram\"\r\n  xmlns:ns13=\"urn:schemas-microsoft-com:office:excel\"\r\n  xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n  xmlns:v=\"urn:schemas-microsoft-com:vml\"\r\n  xmlns:w10=\"urn:schemas-microsoft-com:office:word\"\r\n  xmlns:ns17=\"urn:schemas-microsoft-com:office:powerpoint\"\r\n  xmlns:odx=\"http://opendope.org/xpaths\"\r\n  xmlns:odc=\"http://opendope.org/conditions\"\r\n  xmlns:odq=\"http://opendope.org/questions\"\r\n  xmlns:odi=\"http://opendope.org/components\"\r\n  xmlns:odgm=\"http://opendope.org/SmartArt/DataHierarchy\"\r\n  xmlns:ns24=\"http://schemas.openxmlformats.org/officeDocument/2006/bibliography\"\r\n  xmlns:ns25=\"http://schemas.openxmlformats.org/drawingml/2006/compatibility\"\r\n  xmlns:ns26=\"http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas\">\r\n  <w:body>\r\n    <w:altChunk r:id=\"htmlChunk\" />\r\n    <w:sectPr>\r\n      <w:pgSz w:w=\"{{ pageSetting.width }}\" w:h=\"{{ pageSetting.height }}\" w:orient=\"{{ pageSetting.orient }}\" />\r\n      <w:pgMar w:top=\"{{ pageSetting.margins.top }}\"\r\n               w:right=\"{{ pageSetting.margins.right }}\"\r\n               w:bottom=\"{{ pageSetting.margins.bottom }}\"\r\n               w:left=\"{{ pageSetting.margins.left }}\"\r\n               w:header=\"{{ pageSetting.margins.header }}\"\r\n               w:footer=\"{{ pageSetting.margins.footer }}\"\r\n               w:gutter=\"{{ pageSetting.margins.gutter }}\"/>\r\n    </w:sectPr>\r\n  </w:body>\r\n</w:document>\r\n";

};

moduleFactories["node_modules/absol/src/JSDocx/templates/mht_document.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSDocx/templates/mht_document.tpl ***/
module.exports = "MIME-Version: 1.0\r\nContent-Type: multipart/related;\r\n    type=\"text/html\";\r\n    boundary=\"----=mhtDocumentPart\"\r\n\r\n\r\n------=mhtDocumentPart\r\nContent-Type: text/html;\r\n    charset=\"utf-8\"\r\nContent-Transfer-Encoding: quoted-printable\r\nContent-Location: file:///C:/fake/document.html\r\n\r\n{{ htmlSource }}\r\n\r\n{{ contentParts }}\r\n\r\n------=mhtDocumentPart--\r\n";

};

moduleFactories["node_modules/absol/src/JSDocx/templates/mht_part.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSDocx/templates/mht_part.tpl ***/
module.exports = "------=mhtDocumentPart\r\nContent-Type: {{ contentType }}\r\nContent-Transfer-Encoding: {{ contentEncoding }}\r\nContent-Location: {{ contentLocation }}\r\n\r\n{{ encodedContent }}\r\n";

};

moduleFactories["node_modules/absol/src/JSDocx/DocxTpl.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSDocx/DocxTpl.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TemplateString = _interopRequireDefault(require("../JSMaker/TemplateString"));

var _document = _interopRequireDefault(require("./templates/document.tpl"));

var _mht_document = _interopRequireDefault(require("./templates/mht_document.tpl"));

var _mht_part = _interopRequireDefault(require("./templates/mht_part.tpl"));


var _default = {
  document: new Function('pageSetting', 'return ' + _TemplateString.default.parse(_document.default).toJSCode()),
  mht_document: new Function('htmlSource', 'contentParts', 'return ' + _TemplateString.default.parse(_mht_document.default).toJSCode()),
  mht_part: new Function('contentType', 'contentEncoding', 'contentLocation', 'encodedContent', 'return ' + _TemplateString.default.parse(_mht_part.default).toJSCode())
};
exports.default = _default;
};

moduleFactories["node_modules/absol/src/JSDocx/assets/content_types.xml"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSDocx/assets/content_types.xml ***/
module.exports = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\r\n  <Default Extension=\"rels\" ContentType=\r\n    \"application/vnd.openxmlformats-package.relationships+xml\" />\r\n  <Override PartName=\"/word/document.xml\" ContentType=\r\n    \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>\r\n  <Override PartName=\"/word/afchunk.mht\" ContentType=\"message/rfc822\"/>\r\n</Types>\r\n";

};

moduleFactories["node_modules/absol/src/JSDocx/assets/rels.xml"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSDocx/assets/rels.xml ***/
module.exports = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n  <Relationship\r\n      Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\"\r\n      Target=\"/word/document.xml\" Id=\"R09c83fafc067488e\" />\r\n</Relationships>\r\n";

};

moduleFactories["node_modules/absol/src/JSDocx/assets/document.xml.rels"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSDocx/assets/document.xml.rels ***/
module.exports = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\r\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\r\n  <Relationship Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk\"\r\n    Target=\"/word/afchunk.mht\" Id=\"htmlChunk\" />\r\n</Relationships>\r\n";

};

moduleFactories["node_modules/absol/src/JSDocx/JSDocx.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSDocx/JSDocx.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _DocxTpl = _interopRequireDefault(require("./DocxTpl"));

var _content_types = _interopRequireDefault(require("./assets/content_types.xml"));

var _rels = _interopRequireDefault(require("./assets/rels.xml"));

var _documentXml = _interopRequireDefault(require("./assets/document.xml.rels"));

var _Dom = _interopRequireDefault(require("../HTML5/Dom"));

var _Svg = _interopRequireDefault(require("../HTML5/Svg"));


var JSZip = window.JSZip;

function JSDocx(props) {
  if (props.blob) this.blob = props.blob;
  if (props.blob) this.buffer = props.buffer;
}

JSDocx.prototype.saveAs = function (fileName) {
  var src;

  if (this.blob) {
    src = (URL || webkitURL).createObjectURL(this.blob);
  } else if (this.buffer) {
    src = "data:application/octet-stream," + encodeURIComponent(this.buffer);
  }

  var element = document.createElement('a');
  element.setAttribute('href', src);
  element.setAttribute('download', fileName);
  element.style.display = 'none';
  document.body.appendChild(element);
  element.click();
  document.body.removeChild(element);
};

JSDocx._prepareImageParts = function (htmlSource) {
  var imageContentParts = [];
  var inlinedSrcPattern = /\"data:(\w+\/\w+);(\w+),(\S+)\"/g;

  var inlinedReplacer = function (match, contentType, contentEncoding, encodedContent) {
    var index = imageContentParts.length;
    var extension = contentType.split('/')[1];
    var contentLocation = "file:///C:/fake/image" + index + "." + extension; // mht_part: new Function('contentType', 'contentEncoding', 'contentLocation', 'encodedContent', 'return ' + TemplateString.parse(mht_pathTpl).toJSCode())

    imageContentParts.push(_DocxTpl.default.mht_part(contentType, contentEncoding, contentLocation, encodedContent));
    return "\"" + contentLocation + "\"";
  };

  if (typeof htmlSource === 'string') {
    if (!/<img/g.test(htmlSource)) {
      return {
        htmlSource: htmlSource,
        imageContentParts: imageContentParts
      };
    }

    htmlSource = htmlSource.replace(inlinedSrcPattern, inlinedReplacer);
    return {
      htmlSource: htmlSource,
      imageContentParts: imageContentParts
    };
  } else {
    throw new Error("Not a valid source provided!");
  }
};

JSDocx._getMHTdocument = function (htmlSource) {
  var imageContentParts, _ref;

  _ref = this._prepareImageParts(htmlSource), htmlSource = _ref.htmlSource, imageContentParts = _ref.imageContentParts;
  htmlSource = htmlSource.replace(/\=/g, '=3D');
  return _DocxTpl.default.mht_document(htmlSource, imageContentParts.join('\n'));
};
/**
 * @param {JSZip} zip
 */


JSDocx._generateDocument = function (zip) {
  return zip.generateAsync({
    type: 'arraybuffer'
  }).then(function (buffer) {
    var props = {};
    if (global.Blob) props.blob = new Blob([buffer], {
      type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    });else if (global.Buffer) props.buffer = new Buffer(new Uint8Array(buffer));else throw new Error("Neither Blob nor Buffer are accessible in this environment. " + "Consider adding Blob.js shim");
    return new JSDocx(props);
  });
};

JSDocx._renderDocumentFile = function (pageSetting) {
  return _DocxTpl.default.document(pageSetting);
};

JSDocx._createPageSetting = function (documentOptions) {
  documentOptions = documentOptions || {};
  var pageSetting = {
    margins: {
      top: 1440,
      right: 1440,
      bottom: 1440,
      left: 1440,
      header: 720,
      footer: 720,
      gutter: 0
    }
  };

  if (documentOptions.orientation == 'landscape') {
    Object.assign(pageSetting, {
      height: 12240,
      width: 15840,
      orient: 'landscape'
    });
  } else {
    Object.assign(pageSetting, {
      width: 12240,
      height: 15840,
      orient: 'portrait'
    });
  }

  if (documentOptions.margins) {
    Object.assign(pageSetting, documentOptions.margins);
  }

  return pageSetting;
};

JSDocx._addFiles = function (zip, htmlSource, pageSetting) {
  zip.file('[Content_Types].xml', _content_types.default);
  zip.folder('_rels').file('.rels', _rels.default);
  zip.folder('word').file('document.xml', _DocxTpl.default.document(pageSetting));
  zip.folder('word').file('document.xml', JSDocx._renderDocumentFile(pageSetting)).file('afchunk.mht', JSDocx._getMHTdocument(htmlSource)).folder('_rels').file('document.xml.rels', _documentXml.default);
  return zip;
};

JSDocx.fromHTMLCode = function (html, options) {
  var zip = new JSZip();

  JSDocx._addFiles(zip, html, JSDocx._createPageSetting(options));

  return JSDocx._generateDocument(zip);
};

JSDocx.fromHTMLElement = function (element, options, getOuter, isWorkingElement) {
  if (typeof element == 'string') {
    element = _Dom.default.ShareInstance.$(element);
  }

  if (!element) throw new Error('@param element must be HTMLElement');
  var preRender;

  if (!isWorkingElement) {
    preRender = _Dom.default.ShareInstance._('div');
    preRender.addStyle({
      position: 'fixed',
      top: '0',
      left: '0',
      zIndex: '-10000',
      opacity: '0'
    }).addTo(document.body);
    Array.prototype.forEach.call(element.childNodes, function (e) {
      if (e.tagName != 'script') preRender.addChild(e.cloneNode(true));
    });
  } else {
    preRender = element;
  }

  _Dom.default.ShareInstance.$('script', preRender, function (e) {
    e.parentElement.removeChild(e);
    return false;
  });

  var imageTask = [];

  _Dom.default.ShareInstance.$('img', preRender, function (e) {
    if (e.src && !e.src.match(/data:/)) {
      var task = _Dom.default.imageToCanvas(e).then(function (canvas) {
        var newSrc = canvas.toDataURL();
        e.src = newSrc;
      });

      imageTask.push(task);
    }

    return false;
  });

  _Dom.default.ShareInstance.$('svg', preRender, function (e) {
    var task = _Svg.default.svgToCanvas(e).then(function (canvas) {
      var newSrc = canvas.toDataURL();

      var image = _Dom.default.ShareInstance._('img');

      image.src = newSrc;

      _Dom.default.ShareInstance.$(e).selfReplace(image);
    });

    imageTask.push(task);
    return false;
  });

  return Promise.all(imageTask).then(function () {
    var code;

    if (getOuter) {
      code = preRender.outerHTML;

      if (!code) {
        var temp = document.createElement('div');
        temp.addChild(preRender);
        code = temp.innerHTML;
      }
    } else {
      code = preRender.innerHTML;
    }

    return JSDocx.fromHTMLCode(code, options);
  });
};

var _default = JSDocx;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Network/Broadcast.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/Broadcast.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("../HTML5/EventEmitter"));

var _stringGenerate = require("../String/stringGenerate");

var _OOP = _interopRequireDefault(require("../HTML5/OOP"));


// it can be replace BroadcastChanel
function Broadcast(channel, id) {
  _EventEmitter.default.call(this);

  this.channel = channel;
  this.id = id || (0, _stringGenerate.randomIdent)(32);
  this._ev_message = this._ev_message.bind(this);
  this._ev_storage = this._ev_storage.bind(this);

  this._init();
}

_OOP.default.mixClass(Broadcast, _EventEmitter.default);

Broadcast.prototype._init = function () {
  if ('BroadcastChannel' in window) {
    this.nativeBroadcastChannel = new BroadcastChannel(this.channel);
    this.nativeBroadcastChannel.onmessage = this._ev_message;
  } else if ('localStorage' in window) {
    if (!('onstorage' in window)) console.warn("Your browser may not support onstorage event.");

    if (window.addEventListener) {
      window.addEventListener('storage', this._ev_storage);
    } else {
      window.attachEvent('onstorage', this._ev_storage);
    }

    this.storageKey = '_broadcast_' + this.channel;
  } else {
    throw new Error("Your browser can not support broadcast!");
  }
};

Broadcast.prototype._ev_storage = function (event) {
  if (event.key == this.storageKey) {
    var data = JSON.parse(event.newValue);
    if (data.sourceId != this.id) this.handleMessData(data.message);
  }
};

Broadcast.prototype._ev_message = function (event) {
  var data = event.data;
  this.handleMessData(data);
};

Broadcast.prototype.handleMessData = function (data) {
  if (data.type == "EMIT") this.fire.apply(this, data.params);
  if (typeof this.onmessage == 'function') this.onmessage(event);
};
/**
 * @param {...Array<*>}
 */


Broadcast.prototype.emit = function () {
  var params = Array.prototype.slice.call(arguments);
  this.postMessage({
    type: "EMIT",
    params,
    sourceId: this.id
  });
};
/**
 * @param {*} message
 */


Broadcast.prototype.postMessage = function (message) {
  if (this.nativeBroadcastChannel) {
    this.nativeBroadcastChannel.postMessage(message);
  } else {
    localStorage.setItem(this.storageKey, JSON.stringify({
      message: message,
      sourceId: this.id
    }));
  }
};

Broadcast.prototype.onmessage = null;

Broadcast.prototype.close = function () {
  if (this.nativeBroadcastChannel) this.nativeBroadcastChannel.close();
};

var _default = Broadcast;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/Text.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/Text.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getTextNodesIn = getTextNodesIn;
exports.setSelectionRangeStart = setSelectionRangeStart;
exports.setSelectionRangeEnd = setSelectionRangeEnd;
exports.setSelectionRange = setSelectionRange;
exports.getTextIn = getTextIn;
exports.textToNodes = textToNodes;
exports.getCaretPosition = getCaretPosition;
exports.setCaretPosition = setCaretPosition;
exports.measureText = measureText;

var _Dom = _interopRequireDefault(require("./Dom"));


function getTextNodesIn(node) {
  var textNodes = [];

  if (node.nodeType == 3) {
    textNodes.push(node);
  } else {
    var children = node.childNodes;

    for (var i = 0, len = children.length; i < len; ++i) {
      textNodes.push.apply(textNodes, getTextNodesIn(children[i]));
    }
  }

  return textNodes;
}
/**
 * 
 * @param {Element} el 
 * @param {Range} range 
 * @param {Number} start 
 * @returns {Number} -1: ok,  ret >= 0(is length of text) : need move to next element
 * 
 */


function setSelectionRangeStart(el, range, start) {
  if (start > 0) {
    if (el.nodeType == Node.TEXT_NODE) {
      var text = el.data;

      if (start <= text.length) {
        range.setStart(el, start);
        return -1;
      } else return text.length;
    }

    if (el.tagName.toLowerCase() == 'br') {
      return 0;
    } else {
      var delta = 0;
      var i = 0;
      var textLength = 0;
      var newLine = false;

      while (delta >= 0 && i < el.childNodes.length) {
        var childElt = el.childNodes[i];

        if (newLine) {
          newLine = false;
          ++textLength;
        }

        delta = setSelectionRangeStart(childElt, range, start - textLength);
        if (delta >= 0) textLength += delta;

        if (childElt.nodeType != Node.TEXT_NODE && (window.getComputedStyle(childElt).display == 'block' || childElt.tagName.toLowerCase() == 'br')) {
          newLine = true;
        }

        ++i;
      }

      if (delta >= 0) return textLength;
      return -1;
    }
  } else {
    range.setStart(el, 0);
    return -1;
  }
}
/**
 * 
 * @param {Element} el 
 * @param {Range} range 
 * @param {Number} end 
 * @returns {Number} -1: ok,  ret >= 0(is length of text) : need move to next element
 * 
 */


function setSelectionRangeEnd(el, range, end) {
  if (end > 0) {
    if (el.nodeType == Node.TEXT_NODE) {
      var text = el.data;

      if (end <= text.length) {
        range.setEnd(el, end);
        return -1;
      } else return text.length;
    }

    if (el.tagName.toLowerCase() == 'br') {
      return 0;
    } else {
      var delta = 0;
      var i = 0;
      var textLength = 0;
      var newLine = false;

      while (delta >= 0 && i < el.childNodes.length) {
        var childElt = el.childNodes[i];

        if (newLine) {
          newLine = false;
          ++textLength;
        }

        delta = setSelectionRangeEnd(childElt, range, end - textLength);
        if (delta >= 0) textLength += delta;

        if (childElt.nodeType != Node.TEXT_NODE && (window.getComputedStyle(childElt).display == 'block' || childElt.tagName.toLowerCase() == 'br')) {
          newLine = true;
        }

        ++i;
      }

      if (delta >= 0) return textLength;
      return -1;
    }
  } else {
    range.setEnd(el, 0);
    return -1;
  }
}

function setSelectionRange(el, start, end) {
  if (document.createRange && window.getSelection) {
    var range = document.createRange();
    range.selectNodeContents(el);
    var delta;

    if (start >= 0) {
      delta = setSelectionRangeStart(el, range, start);
      if (delta >= 0) range.setStart(el, el.childNodes.length);
    } else {
      start = 0;
      range.setStart(el, 0);
    }

    if (end >= start) {
      delta = setSelectionRangeEnd(el, range, end);
      if (delta >= 0) range.setEnd(el, el.childNodes.length);
    }

    var sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);
  } else if (document.selection && document.body.createTextRange) {
    var textRange = document.body.createTextRange();
    textRange.moveToElementText(el);
    textRange.collapse(true);
    textRange.moveEnd("character", end);
    textRange.moveStart("character", start);
    textRange.select();
  }
}

function getTextIn(e) {
  if (e.nodeType == Node.TEXT_NODE) {
    return e.data;
  }

  if (e.tagName && e.tagName.toLowerCase() == 'br') return '';
  var texts = [];
  var newLine = false;

  for (var i = 0; i < e.childNodes.length; ++i) {
    if (newLine) {
      newLine = false;
      texts.push('\n');
    }

    var childElt = e.childNodes[i];
    texts.push(getTextIn(childElt));

    if (childElt.nodeType != Node.TEXT_NODE && (window.getComputedStyle(childElt).display == 'block' || childElt.tagName.toLowerCase() == 'br')) {
      newLine = true;
    }
  }

  return texts.join('');
}

function textToNodes(text) {
  var lines = text.split(/\r?\n/);
  return lines.map(function (text) {
    if (text.length == 0) {
      return _Dom.default.ShareInstance._({
        child: {
          tag: 'br'
        }
      });
    } else {
      return _Dom.default.ShareInstance._({
        child: {
          text: text
        }
      });
    }
  });
}
/*
** Returns the caret (cursor) position of the specified text field (oField).
** Return value range is 0-oField.value.length.
*/


function getCaretPosition(oField) {
  // Initialize
  var iCaretPos = 0; // IE Support

  if (document.selection) {
    // Set focus on the element
    oField.focus(); // To get cursor position, get empty selection range

    var oSel = document.selection.createRange(); // Move selection start to 0 position

    oSel.moveStart('character', -oField.value.length); // The caret position is selection length

    iCaretPos = oSel.text.length;
  } // Firefox support
  else if (oField.selectionStart || oField.selectionStart == '0') iCaretPos = oField.selectionDirection == 'backward' ? oField.selectionStart : oField.selectionEnd; // Return results


  return iCaretPos;
}

function setCaretPosition(oField, caretPos) {
  if (oField.createTextRange) {
    var range = oField.createTextRange();
    range.move('character', caretPos);
    range.select();
  } else {
    if (oField.selectionStart) {
      oField.focus();
      oField.setSelectionRange(caretPos, caretPos);
    } else oField.focus();
  }
}

function measureText(text, font) {
  // re-use canvas object for better performance
  var canvas = measureText.canvas || (measureText.canvas = document.createElement("canvas"));
  var context = canvas.getContext("2d");
  if (font) context.font = font;
  var metrics = context.measureText(text);
  return metrics;
}
};

moduleFactories["node_modules/absol/src/Converter/ext2MineType.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Converter/ext2MineType.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var ext2MineType = {
  "323": "text/h323",
  "*": "application/octet-stream",
  "3g2": "video/3gpp2",
  "3gp": "video/3gpp",
  "7z": "application/x-7z-compressed",
  aac: "audio/aac",
  abw: "application/x-abiword",
  acx: "application/internet-property-stream",
  ai: "application/postscript",
  aif: "audio/x-aiff",
  aifc: "audio/x-aiff",
  aiff: "audio/x-aiff",
  arc: "application/x-freearc",
  asf: "video/x-ms-asf",
  asr: "video/x-ms-asf",
  asx: "video/x-ms-asf",
  au: "audio/basic",
  avi: "video/x-msvideo",
  axs: "application/olescript",
  azw: "application/vnd.amazon.ebook",
  bas: "text/plain",
  bcpio: "application/x-bcpio",
  bin: "application/octet-stream",
  bmp: "image/bmp",
  bz: "application/x-bzip",
  bz2: "application/x-bzip2",
  c: "text/plain",
  cat: "application/vnd.ms-pkiseccat",
  cda: "application/x-cdf",
  cdf: "application/x-netcdf",
  cer: "application/x-x509-ca-cert",
  class: "application/octet-stream",
  clp: "application/x-msclip",
  cmx: "image/x-cmx",
  cod: "image/cis-cod",
  cpio: "application/x-cpio",
  crd: "application/x-mscardfile",
  crl: "application/pkix-crl",
  crt: "application/x-x509-ca-cert",
  csh: "application/x-csh",
  css: "text/css",
  csv: "text/csv",
  dcr: "application/x-director",
  der: "application/x-x509-ca-cert",
  dir: "application/x-director",
  dll: "application/x-msdownload",
  dms: "application/octet-stream",
  doc: "application/msword",
  docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  dot: "application/msword",
  dvi: "application/x-dvi",
  dxr: "application/x-director",
  eot: "application/vnd.ms-fontobject",
  eps: "application/postscript",
  epub: "application/epub+zip",
  etx: "text/x-setext",
  evy: "application/envoy",
  exe: "application/octet-stream",
  fif: "application/fractals",
  flr: "x-world/x-vrml",
  gif: "image/gif",
  gtar: "application/x-gtar",
  gz: "application/gzip",
  h: "text/plain",
  hdf: "application/x-hdf",
  hlp: "application/winhlp",
  hqx: "application/mac-binhex40",
  hta: "application/hta",
  htc: "text/x-component",
  htm: "text/html",
  html: "text/html",
  htt: "text/webviewhtml",
  ico: "image/vnd.microsoft.icon",
  ics: "text/calendar",
  ief: "image/ief",
  iii: "application/x-iphone",
  ins: "application/x-internet-signup",
  isp: "application/x-internet-signup",
  jar: "application/java-archive",
  jfif: "image/pipeg",
  jpe: "image/jpeg",
  jpeg: "image/jpeg",
  jpg: "image/jpeg",
  js: "text/javascript",
  json: "application/json",
  jsonld: "application/ld+json",
  latex: "application/x-latex",
  lha: "application/octet-stream",
  lsf: "video/x-la-asf",
  lsx: "video/x-la-asf",
  lzh: "application/octet-stream",
  m13: "application/x-msmediaview",
  m14: "application/x-msmediaview",
  m3u: "audio/x-mpegurl",
  man: "application/x-troff-man",
  mdb: "application/x-msaccess",
  me: "application/x-troff-me",
  mht: "message/rfc822",
  mhtml: "message/rfc822",
  mid: "audio/midi",
  midi: "audio/midi",
  mjs: "text/javascript",
  mny: "application/x-msmoney",
  mov: "video/quicktime",
  movie: "video/x-sgi-movie",
  mp2: "video/mpeg",
  mp3: "audio/mpeg",
  mp4: "video/mp4",
  mpa: "video/mpeg",
  mpe: "video/mpeg",
  mpeg: "video/mpeg",
  mpg: "video/mpeg",
  mpkg: "application/vnd.apple.installer+xml",
  mpp: "application/vnd.ms-project",
  mpv2: "video/mpeg",
  ms: "application/x-troff-ms",
  msg: "application/vnd.ms-outlook",
  mvb: "application/x-msmediaview",
  nc: "application/x-netcdf",
  nws: "message/rfc822",
  oda: "application/oda",
  odp: "application/vnd.oasis.opendocument.presentation",
  ods: "application/vnd.oasis.opendocument.spreadsheet",
  odt: "application/vnd.oasis.opendocument.text",
  oga: "audio/ogg",
  ogv: "video/ogg",
  ogx: "application/ogg",
  opus: "audio/opus",
  otf: "font/otf",
  p10: "application/pkcs10",
  p12: "application/x-pkcs12",
  p7b: "application/x-pkcs7-certificates",
  p7c: "application/x-pkcs7-mime",
  p7m: "application/x-pkcs7-mime",
  p7r: "application/x-pkcs7-certreqresp",
  p7s: "application/x-pkcs7-signature",
  pbm: "image/x-portable-bitmap",
  pdf: "application/pdf",
  pfx: "application/x-pkcs12",
  pgm: "image/x-portable-graymap",
  php: "application/x-httpd-php",
  pko: "application/ynd.ms-pkipko",
  pma: "application/x-perfmon",
  pmc: "application/x-perfmon",
  pml: "application/x-perfmon",
  pmr: "application/x-perfmon",
  pmw: "application/x-perfmon",
  png: "image/png",
  pnm: "image/x-portable-anymap",
  pot: "application/vnd.ms-powerpoint",
  ppm: "image/x-portable-pixmap",
  pps: "application/vnd.ms-powerpoint",
  ppt: "application/vnd.ms-powerpoint",
  pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
  prf: "application/pics-rules",
  ps: "application/postscript",
  pub: "application/x-mspublisher",
  qt: "video/quicktime",
  ra: "audio/x-pn-realaudio",
  ram: "audio/x-pn-realaudio",
  rar: "application/vnd.rar",
  ras: "image/x-cmu-raster",
  rgb: "image/x-rgb",
  rmi: "audio/mid",
  roff: "application/x-troff",
  rtf: "application/rtf",
  rtx: "text/richtext",
  scd: "application/x-msschedule",
  sct: "text/scriptlet",
  setpay: "application/set-payment-initiation",
  setreg: "application/set-registration-initiation",
  sh: "application/x-sh",
  shar: "application/x-shar",
  sit: "application/x-stuffit",
  snd: "audio/basic",
  spc: "application/x-pkcs7-certificates",
  spl: "application/futuresplash",
  src: "application/x-wais-source",
  sst: "application/vnd.ms-pkicertstore",
  stl: "application/vnd.ms-pkistl",
  stm: "text/html",
  sv4cpio: "application/x-sv4cpio",
  sv4crc: "application/x-sv4crc",
  svg: "image/svg+xml",
  swf: "application/x-shockwave-flash",
  t: "application/x-troff",
  tar: "application/x-tar",
  tcl: "application/x-tcl",
  tex: "application/x-tex",
  texi: "application/x-texinfo",
  texinfo: "application/x-texinfo",
  tgz: "application/x-compressed",
  tif: "image/tiff",
  tiff: "image/tiff",
  tr: "application/x-troff",
  trm: "application/x-msterminal",
  ts: "video/mp2t",
  tsv: "text/tab-separated-values",
  ttf: "font/ttf",
  txt: "text/plain",
  uls: "text/iuls",
  ustar: "application/x-ustar",
  vcf: "text/x-vcard",
  vrml: "x-world/x-vrml",
  vsd: "application/vnd.visio",
  wav: "audio/wav",
  wcm: "application/vnd.ms-works",
  wdb: "application/vnd.ms-works",
  weba: "audio/webm",
  webm: "video/webm",
  webp: "image/webp",
  wks: "application/vnd.ms-works",
  wmf: "application/x-msmetafile",
  woff: "font/woff",
  woff2: "font/woff2",
  wps: "application/vnd.ms-works",
  wri: "application/x-mswrite",
  wrl: "x-world/x-vrml",
  wrz: "x-world/x-vrml",
  xaf: "x-world/x-vrml",
  xbm: "image/x-xbitmap",
  xhtml: "application/xhtml+xml",
  xla: "application/vnd.ms-excel",
  xlc: "application/vnd.ms-excel",
  xlm: "application/vnd.ms-excel",
  xls: "application/vnd.ms-excel",
  xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  xlt: "application/vnd.ms-excel",
  xlw: "application/vnd.ms-excel",
  xml: "application/xml",
  xof: "x-world/x-vrml",
  xpm: "image/x-xpixmap",
  xul: "application/vnd.mozilla.xul+xml",
  xwd: "image/x-xwindowdump",
  z: "application/x-compress",
  zip: "application/zip"
};
var _default = ext2MineType;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Converter/file.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Converter/file.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.blobToFile = blobToFile;
exports.dataURItoBlob = dataURItoBlob;
exports.blobToArrayBuffer = blobToArrayBuffer;
exports.stringToBlob = stringToBlob;

var _ext2MineType = _interopRequireDefault(require("./ext2MineType"));


function blobToFile(theBlob, fileName) {
  return new File([theBlob], fileName);
}

function dataURItoBlob(dataURI) {
  var byteString = atob(dataURI.split(',')[1]);
  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
  var ab = new ArrayBuffer(byteString.length);
  var ia = new Uint8Array(ab);

  for (var i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i);
  }

  var blob = new Blob([ab], {
    type: mimeString
  });
  return blob;
}

function blobToArrayBuffer(blob) {
  var fileReader = new FileReader();
  return new Promise(function (rs) {
    fileReader.onload = function (event) {
      var arrayBuffer = event.target.result;
      rs(arrayBuffer);
    };

    fileReader.readAsArrayBuffer(blob);
  });
}

function stringToBlob(text, type) {
  type = type || 'text/plain';
  var mineTye = type.split('/').length === 2 ? type : _ext2MineType.default[type] || 'text/plain';
  return new Blob([text], {
    type: mineTye
  });
}
};

moduleFactories["node_modules/absol/src/Converter/base64.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Converter/base64.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.base64EncodeUnicode = base64EncodeUnicode;
exports.base64DecodeUnicode = base64DecodeUnicode;
exports.UnicodeBase64Converter = void 0;

function base64EncodeUnicode(str) {
  return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {
    return String.fromCharCode('0x' + p1);
  }));
}

;

function base64DecodeUnicode(str) {
  return decodeURIComponent(atob(str).split('').map(function (c) {
    return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
  }).join(''));
}

var UnicodeBase64Converter = {
  encode: base64EncodeUnicode,
  decode: base64DecodeUnicode
};
exports.UnicodeBase64Converter = UnicodeBase64Converter;
};

moduleFactories["node_modules/absol/src/Time/Alarm.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Time/Alarm.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/**
 * 
 * @param {Date| Number} time 
 * @param {Function} callback 
 */
function Alarm(time, callback) {
  this.LIMIT_TIMEOUT = 2147483647;
  this.callback = callback;
  this.state = "STAND_BY";
  this.timeout = -1;
  if (typeof time == 'number') this.time = time;else this.time = time.getTime();
  this.args = Array.prototype.slice.call(arguments, 2);
  this.tick = this.tick.bind(this);
  if (this.time >= new Date().getTime()) this.start();else this.kill();
}

Alarm.prototype.start = function () {
  if (this.state == 'STAND_BY' || this.state == "PAUSE") {
    this.state = "RUNNING";
    this.tick();
    return true;
  }

  return false;
};

Alarm.prototype.pause = function () {
  if (this.state == "RUNNING") {
    clearTimeout(this.timeout);
    this.timeout = -1;
    this.state = 'PAUSE';
  }
};

Alarm.prototype.tick = function () {
  var now = new Date().getTime();

  if (now >= this.time) {
    this.callback && this.callback.apply(null, this.args);
    this.start = 'FINISH';
  } else {
    var deltaTime = Math.min(this.LIMIT_TIMEOUT, this.time - now);
    this.timeout = setTimeout(this.tick, deltaTime);
    this.state = "RUNNING";
  }
};

Alarm.prototype.kill = function () {
  if (this.state != "FINISH" && this.state != "DEAD") {
    if (this.timeout >= 0) clearTimeout(this.timeout);
    this.state = 'DEAD';
    return true;
  }

  return false;
};

var _default = Alarm;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/Ref.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/Ref.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {T} value
 * @param {*=} type
 * @constructor
 * @template T
 */
function Ref(value, type) {
  this.type = type;
  this.value = value;
}

Ref.prototype.toString = function () {
  return this.value + '';
};
/***
 *
 * @return {T}
 */


Ref.prototype.valueOf = function () {
  return this.value;
};
/***
 *
 * @param {T}value
 */


Ref.prototype.set = function (value) {
  this.value = value;
};
/**
 *
 * @return {T}
 */


Ref.prototype.get = function () {
  return this.value;
};

var _default = Ref;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Network/XHR.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/XHR.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var XHR = {};

XHR.makeHttpObject = function () {
  try {
    return new XMLHttpRequest();
  } catch (error) {}

  try {
    return new ActiveXObject("Msxml2.XMLHTTP");
  } catch (error) {}

  try {
    return new ActiveXObject("Microsoft.XMLHTTP");
  } catch (error) {}

  throw new Error("Could not create HTTP request object.");
};
/***
 * 
 * @param {String} url
 * @param {String} body
 * @param {String} responseType
 * @param {Function} success
 * @param {Function} failure
 * @returns {Promise}
 */


XHR.getRequest = function (url, props, success, failure) {
  return new Promise(function (rs, rj) {
    var request = XHR.makeHttpObject();
    request.open("GET", url, true);
    if (typeof props == 'string') request.responseType = props || '';else if (props && typeof props == 'object') {
      Object.assign(request, props);
    }
    request.send(null);

    request.onreadystatechange = function () {
      if (request.readyState == 4) {
        if (request.status == 200) {
          var response = request.response;
          success && success(response);
          rs(response);
        } else {
          failure && failure(request.status, request.statusText);
          rj(request.status);
        }
      }
    };

    request.onerror = function () {
      failure && failure(request.status, request.statusText);
      rj(new Error(request.status + request.statusText));
    };
  });
};

XHR.postRepquest = function (url, payload, props, headers, success, failure) {
  return new Promise(function (rs, rj) {
    var method = "POST";
    var shouldBeAsync = true;
    var request = XHR.makeHttpObject();

    request.onreadystatechange = function () {
      if (request.readyState == 4) {
        if (request.status == 200) {
          success && success(request.response);
          rs(request.response);
        } else if (failure) {
          failure && failure(request.status, request.statusText);
          rj({
            status: request.status,
            statusText: request.statusText
          });
        }
      }
    };

    request.onerror = function () {
      failure && failure(request.status, request.statusText);
      rj(new Error(request.status + request.statusText));
    };

    request.open(method, url, shouldBeAsync);
    if (typeof props == 'string') request.responseType = props || '';else if (props && typeof props == 'object') {
      Object.assign(request, props);
    }
    headers = headers || {};
    headers["Content-Type"] = headers["Content-Type"] || "application/json;charset=UTF-8";
    Object.keys(headers).forEach(function (key) {
      request.setRequestHeader(key, headers[key]);
    });
    request.send(payload);
  });
};

XHR.request = function (method, url, props, headers, body, successCallback, failureCallback) {
  return new Promise(function (rs, rj) {
    var shouldBeAsync = true;
    var request = new XMLHttpRequest();

    request.onreadystatechange = function () {
      if (request.readyState == 4) {
        if (request.status == 200) {
          successCallback && successCallback(request.response);
          rs(request.response);
        } else {
          failureCallback && failureCallback(request.status, request.statusText);
          rj({
            status: request.status,
            statusText: request.statusText
          });
        }
      }
    };

    request.onerror = function () {
      var error = new Error("Network Error!");
      if (failureCallback) failureCallback(error);
      rj(error);
    };

    request.open(method, url, shouldBeAsync);
    if (typeof props == 'string') request.responseType = props || '';else if (props && typeof props == 'object') {
      Object.assign(request, props);
    }
    headers = headers || {};
    headers["Content-Type"] = headers["Content-Type"] || "application/json;charset=UTF-8";
    Object.keys(headers).forEach(function (key) {
      request.setRequestHeader(key, headers[key]);
    });
    request.send(body);
  });
};

var _default = XHR;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/String/stringFormat.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/String/stringFormat.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.wrapToLines = wrapToLines;
exports.nonAccentVietnamese = nonAccentVietnamese;
exports.pascalCaseToCamelCase = pascalCaseToCamelCase;
exports.kebabCaseToCamelCase = kebabCaseToCamelCase;
exports.underScoreToCamelCase = underScoreToCamelCase;
exports.camelCaseToPascalCase = camelCaseToPascalCase;
exports.underScoreToPascalCase = underScoreToPascalCase;
exports.kebabCaseToPascalCase = kebabCaseToPascalCase;
exports.pascalCaseToKebabCase = pascalCaseToKebabCase;
exports.camelCaseToKebabCase = camelCaseToKebabCase;
exports.underScoreToKebabCase = underScoreToKebabCase;
exports.pascalCaseToUnderScore = pascalCaseToUnderScore;
exports.pascalCaseToUpperUnderScore = pascalCaseToUpperUnderScore;
exports.camelCaseToUnderScore = camelCaseToUnderScore;
exports.camelCaseToUpperUnderScore = camelCaseToUpperUnderScore;
exports.kebabCaseToUnderScore = kebabCaseToUnderScore;
exports.kebabCaseToUpperUnderScore = kebabCaseToUpperUnderScore;
exports.normalizeIdent = normalizeIdent;

/**
 *
 * @param {String} s
 * @param {Number} maxLength
 */
function wrapToLines(s, maxLength) {
  var res = [];
  var currentWord = '';
  var currentLine = '';

  for (var i = 0; i < s.length; ++i) {
    if (s[i].match(/\s/)) {
      if (currentWord.length + currentLine.length >= maxLength) {
        if (currentLine.length > 0) {
          res.push(currentLine.trim());
          currentLine = '';
          currentWord = currentWord.trimLeft() + s[i];
        } else {
          currentLine = currentLine + currentWord;
          res.push(currentLine.trim());
          currentLine = '';
          currentWord = '';
        }
      } else {
        currentLine = currentLine + currentWord;
        currentWord = s[i];
      }
    } else {
      currentWord = currentWord + s[i];
    }
  }

  currentLine = (currentLine + currentWord).trim();
  if (currentLine.length > 0) res.push(currentLine);
  return res;
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function nonAccentVietnamese(s) {
  return s.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a").replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, "A").replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, "e").replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, "E").replace(/ì|í|ị|ỉ|ĩ/g, "i").replace(/Ì|Í|Ị|Ỉ|Ĩ/g, "I").replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, "o").replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, "O").replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, "u").replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, "U").replace(/ỳ|ý|ỵ|ỷ|ỹ/g, "y").replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, "Y").replace(/đ/g, "d").replace(/Đ/g, "D").replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, "").replace(/\u02C6|\u0306|\u031B/g, "");
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function pascalCaseToCamelCase(s) {
  return s.substr(0, 1).toLowerCase() + s.substr(1);
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function kebabCaseToCamelCase(s) {
  return s.replace(/-+([^-])/g, function (full, c) {
    return c.toUpperCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function underScoreToCamelCase(s) {
  return s.replace(/(_+)?([^_]+)/g, function (full, underscore, word) {
    if (underscore) {
      if (word) {
        return word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase();
      } else return '';
    } else {
      return word.toLowerCase();
    }
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function camelCaseToPascalCase(s) {
  return s.substr(0, 1).toUpperCase() + s.substr(1);
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function underScoreToPascalCase(s) {
  return s.replace(/(_+|^)?([^_]+)/g, function (full, underscore, word) {
    return word.substr(0, 1).toUpperCase() + word.substr(1).toLowerCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function kebabCaseToPascalCase(s) {
  return s.replace(/(-+|^)([^-])/g, function (full, u, c) {
    return c.toUpperCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function pascalCaseToKebabCase(s) {
  return s.replace(/[A-Z][^A-Z]*/g, function (full, index) {
    if (index == 0) return full.toLowerCase();
    return '-' + full.toLowerCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function camelCaseToKebabCase(s) {
  return s.replace(/(^|[A-Z])[^A-Z]*/g, function (full, index) {
    if (index == 0) return full.toLowerCase();
    return '-' + full.toLowerCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function underScoreToKebabCase(s) {
  return s.replace(/(^|_+)([^_]+)/g, function (full, score, word, index) {
    if (index == 0) return word.toLowerCase();
    return '-' + word.toLowerCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function pascalCaseToUnderScore(s) {
  return s.replace(/[A-Z][^A-Z]*/g, function (full, index) {
    if (index == 0) return full.toLowerCase();
    return '_' + full.toLowerCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function pascalCaseToUpperUnderScore(s) {
  return s.replace(/[A-Z][^A-Z]*/g, function (full, index) {
    if (index == 0) return full.toUpperCase();
    return '_' + full.toUpperCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function camelCaseToUnderScore(s) {
  return s.replace(/(^|[A-Z])[^A-Z]*/g, function (full, index) {
    if (index == 0) return full.toLowerCase();
    return '_' + full.toLowerCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function camelCaseToUpperUnderScore(s) {
  return s.replace(/(^|[A-Z])[^A-Z]*/g, function (full, index) {
    if (index == 0) return full.toUpperCase();
    return '_' + full.toUpperCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function kebabCaseToUnderScore(s) {
  return s.replace(/(-+|^)([^-]+)/g, function (full, u, word, index) {
    if (index == 0) return word.toLowerCase();
    return '_' + word.toLowerCase();
  });
}
/**
 *
 * @param {String} s
 * @returns {String}
 */


function kebabCaseToUpperUnderScore(s) {
  return s.replace(/(-+|^)([^-]+)/g, function (full, u, word, index) {
    if (index == 0) return word.toUpperCase();
    return '_' + word.toUpperCase();
  });
}
/***
 *
 * @param {String} text
 */


function normalizeIdent(text, opt) {
  var spaces = '_';

  if (opt && 'spaces' in opt) {
    spaces = opt.spaces || '';
  }

  var symbols = '_';

  if (opt && 'symbols' in opt) {
    symbols = opt.symbols || '';
  }

  var startsWithDigit = false;

  if (opt && 'startsWithDigit' in opt) {
    startsWithDigit = opt.startsWithDigit || false;
  }

  var res = nonAccentVietnamese(text);

  if (typeof spaces === "string") {
    res = res.replace(/\s+/g, spaces);
  }

  if (typeof symbols === 'string') {
    if (spaces === '_') res = res.replace(/[^a-zA-Z0-9_$]+/g, symbols);else if (spaces === '-') {
      res = res.replace(/[^a-zA-Z0-9_$\-]+/g, symbols);
    }
  }

  if (!startsWithDigit && res.match(/^[0-9]/)) {
    res = '$' + res;
  }

  return res;
}

String.nonAccentVietnamese = nonAccentVietnamese;

String.prototype.nonAccentVietnamese = function () {
  return String.nonAccentVietnamese(this);
};
};

moduleFactories["node_modules/absol/src/JSX/dom.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSX/dom.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.domVisitor = domVisitor;
exports.parseDom = parseDom;

var _attribute = require("./attribute");

function domVisitor(jsxCode) {
  var visitor = {
    File: function (node, ac) {
      return acept(node.program, ac);
    },
    Program: function (node, ac) {
      ac.child = node.body.map(function (cNode) {
        return acept(cNode, {});
      });
      return ac;
    },
    ExpressionStatement: function (node, ac) {
      return acept(node.expression, ac);
    },
    JSXElement: function (node, ac) {
      acept(node.openingElement, ac);

      if (node.children && node.children.length > 0) {
        ac.child = node.children.map(function (cNode) {
          return acept(cNode, {});
        });
      }

      return ac;
    },
    JSXOpeningElement: function (node, ac) {
      var name = {};
      acept(node.name, name);
      ac.tag = name.value;

      if (node.attributes && node.attributes.length > 0) {
        node.attributes.forEach(function (aNode) {
          var attribute = {};
          acept(aNode, attribute);

          if (attribute.key) {
            if (attribute.key.startsWith('data-')) {
              ac.data = ac.data || {};
              ac.data[attribute.key.replace('data-', '')] = attribute.value;
            } else if (attribute.key.startsWith('prop-')) {
              ac.props = ac.props || {};
              ac.props[attribute.key.replace('prop-', '')] = attribute.value;
            } else if (attribute.key.startsWith('on-')) {
              ac.on = ac.props || {};
              ac.on[attribute.key.replace('on-', '')] = attribute.value;
            } else if (attribute.key == 'style') {
              ac.style = (0, _attribute.parseStyleAttr)(attribute.value);
            } else if (attribute.key == 'class') {
              var classList = (0, _attribute.parseClassAttr)(attribute.value);
              if (classList.length > 0) ac.class = classList;
            } else {
              ac.attr = ac.attr || {};
              ac.attr[attribute.key] = attribute.value;
            }
          }
        }, {});
      }

      return ac;
    },
    JSXIdentifier: function (node, ac) {
      ac.value = node.name;
    },
    JSXAttribute: function (node, ac) {
      var key = {};
      acept(node.name, key);
      ac.key = key.value;
      var value = {};
      acept(node.value, value);
      ac.value = value.value;
      return ac;
    },
    StringLiteral: function (node, ac) {
      ac.value = node.value;
    },
    JSXExpressionContainer: function (node, ac) {
      ac.value = {
        expression: jsxCode.substring(node.expression.start, node.expression.end)
      };
      return ac;
    },
    JSXText: function (node, ac) {
      ac.text = node.value;
      return ac;
    }
  };

  function accept(node, ac) {
    return node && visitor[node.type] && visitor[node.type](node, ac);
  }

  return {
    acept: accept,
    accept: accept,
    visitor: visitor
  };
}
/***
 * @param {String} jsxCode
 */


function parseDom(jsxCode) {
  jsxCode = jsxCode.trim().replace(/>\s+</gm, '><').replace(/<(\/?)(img|input|link|br|meta)([^>]*)>/g, function (sub, end, tag, content) {
    if (end == '/') return '';
    return '<' + tag + content + '/>';
  });
  var ast = babel.parse(jsxCode, {
    plugins: [babel.pluginSyntaxJsx]
  });
  var xmlData = {};
  domVisitor(jsxCode).acept(ast, xmlData);
  if (xmlData.child.length > 1) return xmlData.child;
  return xmlData.child[0];
}
};

moduleFactories["node_modules/absol/src/Code/noop.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Code/noop.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = noop;

function noop() {}

;
};

moduleFactories["node_modules/absol/src/AppPattern/Context.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/Context.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _noop = _interopRequireDefault(require("../Code/noop"));


function Context() {
  /****
   *
   * @type {"CREATE"|"PAUSE"|"RUNNING"|"STANDBY"|"DIE"|"STOP"}
   */
  this.state = "CREATE";
  /**
   * @type {Context}
   */

  this.parent = null;
  /***
   *
   * @type {null|ContextManager}
   */

  this.ctxMng = null;
}
/**
 * @returns {*}
 */


Context.prototype.getContext = function (key) {
  var ctx = this;
  var res;

  while (ctx && !res) {
    if (ctx.ctxMng) {
      res = ctx.ctxMng.get(key);
    }

    ctx = ctx.parent;
  }

  return res;
};
/**
 * @param {string} key
 * @param {*} value
 * @returns {*}
 */


Context.prototype.setContext = function (key, value) {
  return this.getContextManager().set(key, value);
};
/**
 * @returns {ContextManager}
 */


Context.prototype.getContextManager = function () {
  var ctx = this;
  var res;

  while (ctx && !res) {
    if (ctx.ctxMng) {
      res = ctx.ctxMng;
    }

    ctx = ctx.parent;
  }

  return res;
};
/**
 * @param {Context} parent
 */


Context.prototype.attach = function (parent) {
  //stop before attach to new context
  this.stop();
  /**
   * @type {Application}
   */

  this.parent = parent;
  this.onAttached && this.onAttached();
};

Context.prototype.detach = function () {
  this.stop();
  this.onDetached && this.onDetached();
  this.parent = null;
};

Context.prototype.pause = function () {
  if (this.state.match(/RUNNING|PAUSE/)) {
    if (this.state === "RUNNING") {
      this.state = "PAUSE";
      this.onPause && this.onPause();
    }
  } else {
    console.warn(this, "NOT RUNNING");
  }
};

Context.prototype.resume = function () {
  if (!this.state.match(/STANDBY|PAUSE|RUNNING/)) {
    console.warn(this, 'NOT READY!', this.state);
    return;
  }

  if (this.state === "RUNNING") return;
  this.state = "RUNNING";
  this.onResume && this.onResume();
};
/***
 * @param {boolean=} standBy start but waiting for resume()
 */


Context.prototype.start = function (standBy) {
  if (this.state.match(/DIE/)) {
    console.warn(this, 'DIED!');
    return;
  }

  if (this.state.match(/RUNNING/)) return;

  if (this.state.match(/STOP|CREATE/)) {
    this.state = "STANDBY";
    this.onStart && this.onStart();
  }

  if (!standBy && this.state.match(/STANDBY|PAUSE/)) {
    this.resume();
  }
};

Context.prototype.stop = function () {
  if (this.state.match(/STOP|DIE|CREATE/)) return;
  if (this.state.match(/RUNNING/)) this.pause();
  this.state = "STOP";
  this.onStop && this.onStop();
};

Context.prototype.destroy = function () {
  if (this.state.match(/DIE/)) return;
  if (this.state.match(/RUNNING|PAUSE/)) this.stop();
  this.state = "DIE";
  this.onDestroy && this.onDestroy();
};

Context.prototype.onDestroy = _noop.default;
Context.prototype.onStop = _noop.default;
Context.prototype.onStart = _noop.default;
Context.prototype.onResume = _noop.default;
Context.prototype.onPause = _noop.default;
Context.prototype.onDetached = _noop.default;
Context.prototype.onAttached = _noop.default;
var _default = Context;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/Activity.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/Activity.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Context = _interopRequireDefault(require("./Context"));


//NOTE: !impotant : don't make setter, getter for activity, just code like JAVA

/** 
 * @class
 */
function Activity() {
  _Context.default.call(this);
}

Object.defineProperties(Activity.prototype, Object.getOwnPropertyDescriptors(_Context.default.prototype));
Activity.prototype.constructor = Activity;

Activity.prototype.startActivity = function (activity) {
  if (this.parent) {
    this.parent.startActivity(activity);
  } else {}
};

Activity.prototype.finish = function () {
  if (this.parent) {
    this.parent.stopActivity(this);
  } else {}
};

var _default = Activity;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/ContextManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/ContextManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function ContextManager() {
  this.__contextData__ = {};
}
/**
 * @param {String} key
 * @returns {*}
 */


ContextManager.prototype.get = function (key) {
  return this.__contextData__[key];
};
/**
 * @param {String} key
 * @param {*} value
 * @returns {Context}
 */


ContextManager.prototype.set = function (key, value) {
  this.__contextData__[key] = value;
  return this;
};

ContextManager.prototype.assign = function (obj) {
  Object.assign(this.__contextData__, obj);
  return this;
};

ContextManager.prototype.remove = function (key) {
  delete this.__contextData__[key];
  return this;
};

ContextManager.prototype.contains = function (key) {
  return key in this.__contextData__;
};

var _default = ContextManager;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/Application.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/Application.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ContextManager = _interopRequireDefault(require("./ContextManager"));

var _Context = _interopRequireDefault(require("./Context"));


/**
 * @class
 */
function Application() {
  _Context.default.call(this);

  this.activityStack = [];
  /** @type {Activity} */

  this.currentActivity = null;
}

Object.defineProperties(Application.prototype, Object.getOwnPropertyDescriptors(_Context.default.prototype));
Application.prototype.constructor = Application;
/**
 * @param {Activity} activity
 */

Application.prototype.startActivity = function (activity) {
  if (this.currentActivity != null) {
    this.currentActivity.pause();
    this.activityStack.push(this.currentActivity);
  }

  this.currentActivity = activity;
  this.appendChild(activity);
  activity.attach(this);
  this.setContentView(activity.getView(), true);
  activity.start();
};
/**
 * @param {Activity} activity
 */


Application.prototype.stopActivity = function (activity) {
  if (this.currentActivity == activity) {
    if (this.activityStack.length == 0) {//todo
    } else {
      activity.detach();
      this.removeChild(this.currentActivity);
      this.currentActivity = this.activityStack.pop();
      this.setContentView(this.currentActivity.getView());
      this.currentActivity.resume();
    }
  } else {
    console.error("NOT ON TOP ACTIVITY");
  }
};
/**
 * @param {HTMLElement} view
 */


Application.prototype.setContentView = function (view, overlay) {
  throw new Error("Not Implement!");
};

Application.prototype.backToTopActivity = function () {
  while (this.activityStack.length > 0) {
    this.currentActivity.stop();
    this.currentActivity = this.activityStack.pop();
  }

  this.setContentView(this.currentActivity.getView());
  this.currentActivity.resume();
};

var _default = Application;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/VarScope.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/VarScope.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function VarScope(parent) {
  this.parent = parent;
  this.data = {};
}

VarScope.prototype.revoke = function (name) {
  delete this.data[name];
  return this;
};

VarScope.prototype.isDeclared = function (name) {
  return name in this.data;
};
/***
 *
 * @param name
 * @param initValue
 * @param {boolean=} force
 * @return {VarScope}
 */


VarScope.prototype.declare = function (name, initValue, force) {
  if (name in this.data && !force) throw new Error(name + ' is already delared in this scope!');
  this.data[name] = initValue;
  return this;
};

VarScope.prototype.get = function (name) {
  var scope = this.findScope(name);
  if (!scope) throw new Error(name + ' is not declared!');
  return scope.data[name];
};

VarScope.prototype.set = function (name, value) {
  var scope = this.findScope(name);
  if (!scope) throw new Error(name + ' is not declared!');
  scope.data[name] = value;
};

VarScope.prototype.findScope = function (name) {
  var currentScope = this;

  while (currentScope) {
    if (name in currentScope.data) break;
    currentScope = currentScope.parent;
  }

  return currentScope;
};

var _default = VarScope;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/GrandContext.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/GrandContext.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Context = _interopRequireDefault(require("./Context"));

var _ContextManager = _interopRequireDefault(require("./ContextManager"));

var _OOP = _interopRequireDefault(require("../HTML5/OOP"));


/***
 * @extends Context
 * @constructor
 */
function GrandContext() {
  _Context.default.call(this);

  this.ctxMng = new _ContextManager.default();
}

_OOP.default.mixClass(GrandContext, _Context.default);

var _default = GrandContext;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/Fragment.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/Fragment.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ContextManager = _interopRequireDefault(require("./ContextManager"));

var _GrandContext = _interopRequireDefault(require("./GrandContext"));

var _OOP = _interopRequireDefault(require("../HTML5/OOP"));

var _noop = _interopRequireDefault(require("../Code/noop"));


/***
 * @extends GrandContext
 * @constructor
 */
function Fragment() {
  _GrandContext.default.call(this);
}

_OOP.default.mixClass(Fragment, _GrandContext.default);

Fragment.prototype.createView = function () {
  throw new Error("Not implement!");
};

Fragment.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = this.createView() || this.$view;
  if (!this.$view) throw new Error("this.$view must be not null!");
  if (this.onCreated) this.onCreated();
  return this.$view;
};

Fragment.prototype.onCreated = _noop.default;
var _default = Fragment;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Math/Vec2.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/Vec2.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param  {Number} x
 * @param {Number} y
 * @constructor
 */
function Vec2(x, y) {
  this.x = x;
  this.y = y;
}
/***
 *
 * @returns {Vec2}
 */


Vec2.prototype.copy = function () {
  return new Vec2(this.x, this.y);
};
/***
 *
 * @returns {string}
 */


Vec2.prototype.toString = function () {
  return "(" + this.x + ", " + this.y + ")";
};
/***
 *
 * @returns {number}
 */


Vec2.prototype.abs = function () {
  return Math.sqrt(this.x * this.x + this.y * this.y);
};
/***
 *
 * @returns {Vec2}
 */


Vec2.prototype.normalized = function () {
  var l = this.abs();
  if (l == 0) l = 1;
  return this.div(l);
};
/***
 *
 * @param {number} h
 * @returns {Vec2}
 */


Vec2.prototype.mult = function (h) {
  return new Vec2(this.x * h, this.y * h);
};
/***
 *
 * @param {number} h
 * @returns {Vec2}
 */


Vec2.prototype.div = function (h) {
  return new Vec2(this.x / h, this.y / h);
};
/***
 *
 * @param v
 * @returns {number}
 */


Vec2.prototype.dist = function (v) {
  var dx = v.x - this.x;
  var dy = v.y - this.y;
  return Math.sqrt(dx * dx + dy * dy);
};
/***
 *
 * @param {Vec2} v
 * @returns {Vec2}
 */


Vec2.prototype.sub = function (v) {
  return new Vec2(this.x - v.x, this.y - v.y);
};
/***
 *
 * @param {Vec2} v
 * @returns {Vec2}
 */


Vec2.prototype.add = function (v) {
  return new Vec2(this.x + v.x, this.y + v.y);
};
/***
 *
 * @returns {Vec2}
 */


Vec2.prototype.inv = function () {
  return new Vec2(-this.x, -this.y);
};
/***
 *
 * @param {Vec2} v
 * @param {number} h
 * @returns {Vec2}
 */


Vec2.prototype.linear = function (v, h) {
  return new Vec2(this.x * (1 - h) + v.x * h, this.y * (1 - h) + v.y * h);
};
/***
 *
 * @param {Vec2} v1
 * @returns {number}
 */


Vec2.prototype.dot = function (v1) {
  return this.x * v1.x + this.y * v1.y;
};
/***
 *
 * @param {Vec2} v1
 * @returns {number}
 */


Vec2.prototype.cross = function (v1) {
  return this.x * v1.y - this.y * v1.x;
};
/***
 *
 * @returns {number}
 */


Vec2.prototype.direction = function () {
  return Math.atan2(this.y, this.x);
};
/***
 *
 * @param {Number} dx
 * @param {Number} dy
 */


Vec2.prototype.translate = function (dx, dy) {
  return this.add(new Vec2(dx, dy));
};
/****
 *
 * @param {Number} angle - radian
 * @returns {Vec2}
 */


Vec2.prototype.rotate = function (angle) {
  var sinA = Math.sin(angle);
  var cosA = Math.cos(angle);
  var x = this.x * cosA - this.y * sinA;
  var y = this.x * sinA + this.y * cosA;
  return new Vec2(x, y);
};
/***
 *
 * @returns {Vec2}
 */


Vec2.prototype.rotate90 = function () {
  return new Vec2(-this.y, this.x);
};
/***
 *
 * @param {number} angle
 * @returns {Vec2}
 */


Vec2.fromDirection = function (angle) {
  return new Vec2(Math.cos(angle), Math.sin(angle));
};
/***
 *
 * @param x
 * @param y
 * @returns {Vec2}
 */


Vec2.make = function (x, y) {
  if (x instanceof Array) {
    return new Vec2(x[0], x[1]);
  } else if (x instanceof Vec2) {
    return x.copy();
  } else return new Vec2(x, y);
};

var _default = Vec2;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Math/Rectangle.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/Rectangle.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("./Vec2"));


/**
 *
 * @param {Number} x
 * @param {Number} y
 * @param {Number} width
 * @param {Number} height
 */
function Rectangle(x, y, width, height) {
  this.width = width;
  this.height = height;
  this.x = x;
  this.y = y;
}
/**
 *
 * @return {Vec2}
 * @constructor
 */


Rectangle.prototype.A = function () {
  return new _Vec.default(this.x, this.y);
};
/***
 *
 * @return {Vec2}
 * @constructor
 */


Rectangle.prototype.B = function () {
  return new _Vec.default(this.x + this.width, this.y);
};
/***
 *
 * @return {Vec2}
 * @constructor
 */


Rectangle.prototype.C = function () {
  return new _Vec.default(this.x + this.width, this.y + this.height);
};
/***
 *
 * @return {Vec2}
 * @constructor
 */


Rectangle.prototype.D = function () {
  return new _Vec.default(this.x, this.y + this.height);
};
/***
 *
 * @return {number}
 */


Rectangle.prototype.square = function () {
  return this.width * this.height;
};

Rectangle.prototype.nearestPoint = function (arg0, arg1) {
  if (arg1) arg0 = _Vec.default.make(arg0, arg1);
  var res = this.A();
  var mind = res.dist(arg0);
  var d = this.B().dist(arg0);

  if (d < mind) {
    mind = d;
    res = this.B();
  }

  d = this.C().dist(arg0);

  if (d < mind) {
    mind = d;
    res = this.C();
  }

  d = this.D().dist(arg0);

  if (d < mind) {
    mind = d;
    res = this.D();
  }

  return res;
};

Rectangle.prototype.centerPoint = function () {
  return new _Vec.default(this.x + this.width / 2, this.y + this.height / 2);
};
/***
 *
 * @param {Rectangle} r
 * @param {number=} margin
 * @return {boolean}
 */


Rectangle.prototype.isCollapse = function (r, margin) {
  if (!margin) margin = 0;
  return !(this.x >= r.x + r.width + margin || this.y >= r.y + r.height + margin || r.x >= this.x + this.width + margin || r.y >= this.y + this.height + margin);
};
/***
 *
 * @param {Rectangle} r
 * @return {number}
 */


Rectangle.prototype.collapsedSquare = function (r) {
  var collapseRect = this.collapsedRect(r);

  if (collapseRect) {
    return collapseRect.square();
  } else {
    return 0;
  }
};
/***
 *
 * @param {Rectangle} r
 * @return {Rectangle}
 */


Rectangle.prototype.collapsedRect = function (r) {
  var maxX, minX, maxY, minY, width, height;
  minX = Math.max(this.x, r.x);
  minY = Math.max(this.y, r.y);
  maxX = Math.min(this.x + this.width, r.x + r.width);
  maxY = Math.min(this.y + this.height, r.y + r.height);
  width = maxX - minX;
  height = maxY - minY;

  if (width >= 0 && height >= 0) {
    return new Rectangle(minX, minY, width, height);
  }

  return null;
};
/**
 * @param {Rectangle} r
 * @returns {Boolean}
 */


Rectangle.prototype.contains = function (r) {
  return this.x <= r.x && this.y <= r.y && this.x + this.width >= r.x + r.width && this.y + this.height >= r.y + r.height;
};
/**
 * @param {Vec2} p
 * @returns {Boolean}
 */


Rectangle.prototype.containsPoint = function (p) {
  return this.x <= p.x && this.y <= p.y && this.x + this.width >= p.x && this.y + this.height >= p.y;
};
/**
 * @param {Rectangle} other
 * @returns {Rectangle}
 */


Rectangle.prototype.merge = function (other) {
  var left = Math.min(this.x, other.x);
  var top = Math.min(this.y, other.y);
  var right = Math.max(this.x + this.width, other.x + other.width);
  var bottom = Math.max(this.y + this.height, other.y + other.height);
  return new Rectangle(left, top, right - left, bottom - top);
};
/**
 * @returns {Rectangle}
 */


Rectangle.prototype.clone = function () {
  return new Rectangle(this.x, this.y, this.width, this.height);
};
/***
 *
 * @param {Rectangle} r
 */


Rectangle.prototype.equals = function (r) {
  return this.x === r.x && this.y === r.y && this.height === r.height && this.width === r.width;
};
/**
 * @param {Number} x
 * @param {Number} y
 * @param {Number} width
 * @param {Number} height
 * @returns {Rectangle}
 */


Rectangle.make = function (x, y, width, height) {
  return new Rectangle(x, y, width, height);
};
/**
 * @param {Number} x
 * @param {Number} y
 * @param {Number} width
 * @param {Number} height
 * @returns {Rectangle}
 */


Rectangle.makeCenter = function (x, y, width, height) {
  return new Rectangle(x - width / 2, y - height / 2, width, height);
};
/**
 * @param {ClientRect|DOMRect} clientRect
 * @returns {Rectangle}
 */


Rectangle.fromClientRect = function (clientRect) {
  return new Rectangle(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
};
/***
 *
 * @param {Vec2[]} points
 * @returns  {Rectangle}
 */


Rectangle.boundingPoints = function (points) {
  var minX = Infinity,
      minY = Infinity,
      maxX = -Infinity,
      maxY = -Infinity;
  var point;

  for (var i = 0; i < points.length; ++i) {
    point = points[i];
    minX = Math.min(minX, point.x);
    maxX = Math.max(maxX, point.x);
    minY = Math.min(minY, point.y);
    maxY = Math.max(maxY, point.y);
  }

  return new Rectangle(minX, minY, maxX - minX, maxY - minY);
};

var _default = Rectangle;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Math/int.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/int.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.map = map;
exports.sumArr = sumArr;
exports.radianInRange = radianInRange;
exports.distance = distance;
exports.numberToString = numberToString;
exports.numberAutoFixed = numberAutoFixed;
exports.integerZeroPadding = integerZeroPadding;
exports.harmonicMean = harmonicMean;

/**
 *
 * @param {number} x
 * @param {number} l
 * @param {number} h
 * @param {number} L
 * @param {number} H
 * @returns {number}
 */
function map(x, l, h, L, H) {
  return (x - l) / (h - l) * (H - L) + L;
}

function sumArr(arr) {
  var res = 0;

  for (var i = 0; i < arr.length; ++i) res += arr[i];

  return res;
}

function radianInRange(x, start, end) {
  if (start > end) return radianInRange(x, end, start);
  if (x < start) x += Math.PI * 2 * Math.ceil((start - x) / 2 / Math.PI);
  if (x > end) x -= Math.PI * 2 * Math.ceil((x - end) / 2 / Math.PI);
  return x >= start && x <= end;
}

function distance(x0, y0, x1, y1) {
  var dx = x0 - x1;
  var dy = y0 - y1;
  return Math.sqrt(dx * dx + dy * dy);
}
/**
 *
 * @param {Number} numb
 * @param {Number} floatFixed
 * @param {"."|","} decimalSeparator
 * @param {","|"."} thousandsSeparator
 * @param {Number} decimalPadding
 */


function numberToString(numb, floatFixed, decimalSeparator, thousandsSeparator, decimalPadding) {
  if (floatFixed === undefined || floatFixed === null || typeof floatFixed != "number" || isNaN(floatFixed) || floatFixed < -1) floatFixed = -1;
  if (decimalSeparator === undefined || decimalSeparator === null || decimalSeparator != '.' && decimalSeparator != ',') decimalSeparator = '.';
  if (thousandsSeparator === undefined || thousandsSeparator === null || floatFixed >= 0 && thousandsSeparator == decimalSeparator) thousandsSeparator = undefined;
  if (thousandsSeparator != ',' && thousandsSeparator != '.') thousandsSeparator = undefined;
  if (decimalPadding === undefined || decimalPadding === null || typeof decimalPadding != "number" || isNaN(decimalPadding) || decimalPadding < 0) decimalPadding = 0;
  var text = numb.toString();
  var matched = text.match(/[+-]?([0-9]*)(\.([0-9]*))?(e([+-]?[0-9]+))?/);
  var dec = matched[1] || '';
  var real = matched[3] || '';
  var floatPoint = parseInt(matched[5] || '0');
  var decDigits = dec.split('').map(function (d) {
    return parseInt(d);
  });
  var realDigits = real.split('').map(function (d) {
    return parseInt(d);
  });

  while (floatPoint < 0) {
    if (decDigits.length > 0) {
      realDigits.unshift(decDigits.pop());
    } else {
      realDigits.unshift(0);
    }

    floatPoint++;
  }

  while (floatPoint > 0) {
    if (realDigits.length > 0) {
      decDigits.push(realDigits.unshift());
    } else {
      decDigits.push(0);
    }

    floatPoint++;
  }

  var mem = 0,
      i,
      cValue;

  if (floatFixed > realDigits.length) {
    while (realDigits.length < floatFixed) {
      realDigits.push(0);
    }
  } else if (floatFixed < realDigits.length && floatFixed >= 0) {
    i = floatFixed;
    mem = realDigits[i] >= 5 ? 1 : 0;
    realDigits.splice(floatFixed);
    --i;

    while (mem > 0) {
      if (i >= 0) {
        cValue = realDigits[i] + mem;
        realDigits[i] = cValue % 10;
        mem = Math.floor(cValue / 10);
      } else {
        if (decDigits.length + i < 0) decDigits.unshift(0);
        cValue = decDigits[decDigits.length + i] + mem;
        decDigits[decDigits.length + i] = cValue % 10;
        mem = Math.floor(cValue / 10);
      }

      --i;
    }
  }

  while (decDigits.length < decimalPadding) {
    decDigits.unshift(0);
  }

  var decText = numb < 0 ? '-' : '';
  var breadMod = (decDigits.length + 2) % 3;

  if (thousandsSeparator) {
    for (i = 0; i < decDigits.length; ++i) {
      decText += decDigits[i];

      if (i % 3 == breadMod && i + 1 < decDigits.length) {
        decText += thousandsSeparator;
      }
    }
  } else {
    decText += decDigits.join('');
  }

  var realText = realDigits.length == 0 ? '' : decimalSeparator + realDigits.join('');
  return decText + realText;
}

function numberAutoFixed(x, eDelta) {
  eDelta = eDelta || 10;
  eDelta = Math.round(eDelta);
  var e = parseFloat('1e+' + eDelta);
  return Math.round(x * e) / e;
}
/***
 *
 * @param {number} number
 * @param {number} length
 * @returns {string}
 */


function integerZeroPadding(number, length) {
  var res = number + '';

  while (res.length < length) res = '0' + res;

  return res;
}

function harmonicMean(a, b) {
  return 2 / (1 / a + 1 / b);
}
};

moduleFactories["node_modules/absol/src/Math/Arc.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/Arc.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("./Vec2"));

var _int = require("./int");


function Arc(x, y, r, start, end) {
  this.x = x;
  this.y = y;
  this.r = r;
  this.start = start;
  this.end = end;
}

Arc.prototype.isPointInBound = function (p) {
  if ((0, _int.distance)(this.x, this.y, p.x, p.y) > r) return false;
  return (0, _int.radianInRange)(Math.atan2(p.y - this.y, p.x - this.x), start, end);
};

Arc.prototype.isRectInBound = function (rect) {
  return this.isPointInBound(rect.A()) && this.isPointInBound(rect.B()) && this.isPointInBound(rect.C()) && this.isPointInBound(rect.D());
};

Arc.prototype.isRectOutBound = function (rect) {
  return !this.isPointInBound(rect.A()) && !this.isPointInBound(rect.B()) && !this.isPointInBound(rect.C()) && !this.isPointInBound(rect.D());
};

Arc.prototype.isRectCollapse = function (rect) {
  return this.isPointInBound(rect.A()) || this.isPointInBound(rect.B()) || this.isPointInBound(rect.C()) || this.isPointInBound(rect.D());
};

Arc.prototype.centerPoint = function () {
  var mid = (this.start + this.end) / 2;
  var x = this.x + Math.cos(mid) * this.r * 2 / 3;
  var y = this.y + Math.sin(mid) * this.r * 2 / 3;
  return new _Vec.default(x, y);
};

Arc.prototype.centerRoundPoint = function () {
  var mid = (this.start + this.end) / 2;
  var x = this.x + Math.cos(mid) * this.r;
  var y = this.y + Math.sin(mid) * this.r;
  return new _Vec.default(x, y);
};

Arc.make = function (x, y, r, start, end) {
  return new Arc(x, y, r, start, end);
};

var _default = Arc;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Math/NumRange.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/NumRange.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/**
 * 
 * @param {Number} start 
 */
function NumRange(start, length) {
  if (arguments.length == 1) length = 0;else if (arguments.length == 0) {
    length = 0;
    start = 0;
  }
  this.start = start;
  this.length = length;
}
/**
 * @param {Number} num 
 */


NumRange.prototype.contains = function (num) {
  return num >= this.start && num <= this.start + this.length;
};
/**
 * @param {NumRange} other
 * @returns {NumRange}
 */


NumRange.prototype.merge = function (other) {
  var start = Math.min(this.start, other.start);
  var end = Math.max(this.start + this.length, other.start + other.length);
  return new NumRange(start, end - start);
};

NumRange.prototype.centerValue = function () {
  return this.start + this.length / 2;
};
/**
 * @param {NumRange} other
 * @returns {Boolean}
 */


NumRange.prototype.isCollapse = function (other) {
  var start = Math.max(this.start, other.start);
  var end = Math.min(this.start + this.length, other.start + other.length);
  return start <= end;
};
/**
 * @param {NumRange} other
 * @returns {Boolean}
 */


NumRange.prototype.collapsedNumRange = function (other) {
  var start = Math.max(this.start, other.start);
  var end = Math.min(this.start + this.length, other.start + other.length);
  if (start <= end) return new NumRange(start, end - start);
  return null;
};

NumRange.prototype.clone = function () {
  return new NumRange(this.start, this.length);
};

var _default = NumRange;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/Clipboard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/Clipboard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.copyImage = copyImage;
exports.copyText = copyText;
exports.pasteText = pasteText;

function copyImage(src) {
  var ranges, sel;

  if (window.getSelection) {
    sel = window.getSelection(); //backup

    ranges = [];

    for (var i = 0; i < sel.rangeCount; ++i) {
      ranges.push(sel.getRangeAt(i));
    } //copy


    var contentdiv = document.createElement('div');
    var image = document.createElement('img');
    contentdiv.appendChild(image);
    image.src = src;
    contentdiv.contentEditable = true; // contentdiv.style.display = 'none';

    document.body.appendChild(contentdiv);
    var range = document.createRange();
    range.selectNodeContents(image);
    sel.removeAllRanges();
    sel.addRange(range);
    document.execCommand('copy'); // contentdiv.remove();
    //recover

    sel.removeAllRanges();

    for (var i = 0; i < sel.rangeCount; ++i) {
      sel.addRange(ranges[i]);
    }
  } else {
    console.error("Not support copy!"); //not support IE
  }
}

function fallbackCopyTextToClipboard(text) {
  return new Promise(function (resolve, reject) {
    var textArea = document.createElement("textarea");
    textArea.value = text; // Avoid scrolling to bottom

    textArea.style.top = "0";
    textArea.style.left = "0";
    textArea.style.position = "fixed";
    document.body.appendChild(textArea);
    textArea.focus();
    textArea.select();

    try {
      var successful = document.execCommand('copy');

      if (successful) {
        resolve();
      } else {
        reject();
      }
    } catch (err) {
      reject(err);
    }

    document.body.removeChild(textArea);
  });
}

function copyText(text) {
  if (!navigator.clipboard) {
    return fallbackCopyTextToClipboard(text);
  }

  return navigator.clipboard.writeText(text);
}

function fallbackReadTextFromClipboard() {
  return new Promise(function (resolve, reject) {
    var textArea = document.createElement("textarea"); // Avoid scrolling to bottom

    textArea.style.top = "0";
    textArea.style.left = "0";
    textArea.style.position = "fixed";
    document.body.appendChild(textArea);
    textArea.focus();

    try {
      var successful = document.execCommand('paste');

      if (successful) {
        resolve(textArea.value);
      } else {
        reject();
      }
    } catch (err) {
      reject(err);
    }

    document.body.removeChild(textArea);
  });
}

function pasteText() {
  if (navigator.clipboard) {
    return navigator.clipboard.readText();
  } else {
    return fallbackReadTextFromClipboard();
  }
}
};

moduleFactories["node_modules/absol/src/DataStructure/Heap.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/DataStructure/Heap.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.defaultCmp = defaultCmp;
exports.heapDown = heapDown;
exports.heapUp = heapUp;
exports.heapify = heapify;
exports.heapPop = heapPop;
exports.heapPush = heapPush;
exports.default = void 0;

function defaultCmp(x, y) {
  if (x < y) {
    return -1;
  }

  if (x > y) {
    return 1;
  }

  return 0;
}

;
/**
 * 
 * @param {Array} arr 
 * @param {Number} pos 
 * @param {Function} cmp 
 */

function heapDown(arr, pos, cmp) {
  if (!cmp) cmp = defaultCmp;
  var item = arr[pos];
  var endPos = arr.length;
  var childPos = pos << 1 | 1;
  var childRightPos;

  while (childPos < endPos) {
    childRightPos = childPos + 1;

    if (childPos + 1 < endPos && cmp(arr[childPos], arr[childRightPos]) > 0) {
      childPos = childRightPos;
    }

    if (cmp(arr[childPos], item) < 0) {
      arr[pos] = arr[childPos];
      arr[childPos] = item;
      pos = childPos;
      childPos = pos << 1 | 1;
    } else break;
  }
}
/**
 * 
 * @param {Array} arr 
 * @param {Number} pos 
 * @param {Function} cmp 
 */


function heapUp(arr, pos, cmp) {
  if (!cmp) cmp = defaultCmp;
  var item = arr[pos];
  var parPos;

  while (pos > 0) {
    parPos = pos - 1 >> 1;

    if (cmp(arr[parPos], item) > 0) {
      arr[pos] = arr[parPos];
      arr[parPos] = item;
      pos = parPos;
    } else break;
  }
}
/**
 *
 * @param {Array} arr
 * @param {Function} cmp
 */


function heapify(arr, cmp) {
  if (!cmp) cmp = defaultCmp;
  var endPos = arr.length;

  for (var i = 0; i < endPos; ++i) heapUp(arr, i, cmp);
}
/**
 * 
 * @param {Array} arr 
 * @param {Function} cmp 
 */


function heapPop(arr, cmp) {
  if (!cmp) cmp = defaultCmp;
  var item = arr[0];
  var lastItem = arr.pop();

  if (arr.length > 0) {
    arr[0] = lastItem;
    heapDown(arr, 0, cmp);
  }

  return item;
}
/**
 * 
 * @param {Array} arr 
 * @param {*} item
 * @param {Function} cmp 
 */


function heapPush(arr, item, cmp) {
  if (!cmp) cmp = defaultCmp;
  arr.push(item);
  heapUp(arr, arr.length - 1, cmp);
}

function Heap(cmd) {
  this.cmp = cmd || defaultCmp;
  this.arr = [];
}
/**
 * @param {Array} arr
 * @param {Function} cmp
 * @returns {Heap}
 */


Heap.fromArray = function (arr, cmp) {
  var heap = new Heap(cmp);
  heapify(arr);
  heap.arr = arr;
  return heap;
};

Heap.prototype.push = function (x) {
  heapPush(this.arr, x, this.cmp);
  return this;
};

Heap.prototype.pop = function () {
  return heapPop(this.arr, this.cmp);
};

Heap.prototype.peek = function () {
  return this.arr[0];
};

Heap.prototype.contains = function (x) {
  return this.arr.indexOf(x) !== -1;
};

Heap.prototype.clear = function () {
  this.arr.splice(0, this.arr.length);
  return this;
};

Heap.prototype.empty = function () {
  return this.arr.length === 0;
};

Heap.prototype.size = function () {
  return this.arr.length;
};

Heap.prototype.clone = function () {
  var heap;
  heap = new Heap(this.cmp);
  heap.arr = this.arr.slice(0);
  return heap;
};

Heap.prototype.toArray = function () {
  return this.arr.slice(0);
};

Heap.prototype.toSortedArray = function () {
  var res = [];
  var heap = this.clone();

  while (!heap.empty()) res.push(heap.pop());

  return res;
};

Heap.prototype.insert = Heap.prototype.push;
Heap.prototype.top = Heap.prototype.peek;
Heap.prototype.front = Heap.prototype.peek;
Heap.prototype.has = Heap.prototype.contains;
Heap.prototype.copy = Heap.prototype.clone;
var _default = Heap;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Time/datetime.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Time/datetime.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getDefaultFirstDayOfWeek = getDefaultFirstDayOfWeek;
exports.setDefaultFirstDayOfWeek = setDefaultFirstDayOfWeek;
exports.ddmmyyyy = ddmmyyyy;
exports.yyymmdd = yyymmdd;
exports.formatDateString = formatDateString;
exports.formartDateString = formartDateString;
exports.parseDateString = parseDateString;
exports.addDate = addDate;
exports.prevDate = prevDate;
exports.nextDate = nextDate;
exports.weekIndexOf = weekIndexOf;
exports.weekInYear = weekInYear;
exports.beginOfSecond = beginOfSecond;
exports.beginOfMinute = beginOfMinute;
exports.beginOfDay = beginOfDay;
exports.beginOfHour = beginOfHour;
exports.beginOfWeek = beginOfWeek;
exports.addWeek = addWeek;
exports.nextWeek = nextWeek;
exports.prevWeek = prevWeek;
exports.beginOfMonth = beginOfMonth;
exports.beginOfQuarter = beginOfQuarter;
exports.addQuarter = addQuarter;
exports.nextQuarter = nextQuarter;
exports.prevQuarter = prevQuarter;
exports.beginOfYear = beginOfYear;
exports.addYear = addYear;
exports.nextYear = nextYear;
exports.prevYear = prevYear;
exports.compareDate = compareDate;
exports.compareMonth = compareMonth;
exports.compareYear = compareYear;
exports.addMonth = addMonth;
exports.nextMonth = nextMonth;
exports.prevMonth = prevMonth;
exports.daysInMonth = daysInMonth;
exports.parseDateTime = parseDateTime;
exports.formatDateTime = formatDateTime;
exports.implicitDate = implicitDate;
exports.LOCAL_DATE_TIME_FORMAT = exports.LOCAL_DATE_FORMAT = exports.DATE_TIME_TOKEN_RGX = exports.formatTokenRegex = exports.shortMonthNames = exports.monthNames = exports.shortDayNames = exports.dayNames = exports.dateFormatList = exports.dateFormat2LocationList = exports.language2LocalDateFormat = exports.MILLIS_PER_MINUTE = exports.MILLIS_PER_HOUR = exports.MILLIS_PER_DAY = void 0;

var _stringFormat = require("../String/stringFormat");

var _int = require("../Math/int");

var MILLIS_PER_DAY = 24 * 3600000;
exports.MILLIS_PER_DAY = MILLIS_PER_DAY;
var MILLIS_PER_HOUR = 3600000;
exports.MILLIS_PER_HOUR = MILLIS_PER_HOUR;
var MILLIS_PER_MINUTE = 60000;
exports.MILLIS_PER_MINUTE = MILLIS_PER_MINUTE;
var _default_first_day_of_week = 1;

function getDefaultFirstDayOfWeek() {
  return _default_first_day_of_week;
}

function setDefaultFirstDayOfWeek(value) {
  if (isNaN(value) || !isFinite(value)) return;
  value = Math.floor(value) % 7;
  _default_first_day_of_week = value;
}
/**
 *
 * @param {Date} date
 * @returns {String}
 */


function ddmmyyyy(date) {
  return formatDateTime(date, 'dd/MM/yyyy');
}

var language2LocalDateFormat = {
  "af-ZA": "yyyy/mm/dd",
  "am-ET": "d/m/yyyy",
  "ar-AE": "dd/mm/yyyy",
  "ar-BH": "dd/mm/yyyy",
  "ar-DZ": "dd-mm-yyyy",
  "ar-EG": "dd/mm/yyyy",
  "ar-IQ": "dd/mm/yyyy",
  "ar-JO": "dd/mm/yyyy",
  "ar-KW": "dd/mm/yyyy",
  "ar-LB": "dd/mm/yyyy",
  "ar-LY": "dd/mm/yyyy",
  "ar-MA": "dd-mm-yyyy",
  "ar-OM": "dd/mm/yyyy",
  "ar-QA": "dd/mm/yyyy",
  "ar-SA": "dd/mm/yy",
  "ar-SY": "dd/mm/yyyy",
  "ar-TN": "dd-mm-yyyy",
  "ar-YE": "dd/mm/yyyy",
  "arn-CL": "dd-mm-yyyy",
  "as-IN": "dd-mm-yyyy",
  "az-Cyrl-AZ": "dd.mm.yyyy",
  "az-Latn-AZ": "dd.mm.yyyy",
  "ba-RU": "dd.mm.yy",
  "be-BY": "dd.mm.yyyy",
  "bg-BG": "dd.m.yyyy",
  "bn-BD": "dd-mm-yy",
  "bn-IN": "dd-mm-yy",
  "bo-CN": "yyyy/m/d",
  "br-FR": "dd/mm/yyyy",
  "bs-Cyrl-BA": "d.m.yyyy",
  "bs-Latn-BA": "d.m.yyyy",
  "ca-ES": "dd/mm/yyyy",
  "co-FR": "dd/mm/yyyy",
  "cs-CZ": "d.m.yyyy",
  "cy-GB": "dd/mm/yyyy",
  "da-DK": "dd-mm-yyyy",
  "de-AT": "dd.mm.yyyy",
  "de-CH": "dd.mm.yyyy",
  "de-DE": "dd.mm.yyyy",
  "de-LI": "dd.mm.yyyy",
  "de-LU": "dd.mm.yyyy",
  "dsb-DE": "d. m. yyyy",
  "dv-MV": "dd/mm/yy",
  "el-GR": "d/m/yyyy",
  "en-029": "mm/dd/yyyy",
  "en-AU": "d/mm/yyyy",
  "en-BZ": "dd/mm/yyyy",
  "en-CA": "dd/mm/yyyy",
  "en-GB": "dd/mm/yyyy",
  "en-IE": "dd/mm/yyyy",
  "en-IN": "dd-mm-yyyy",
  "en-JM": "dd/mm/yyyy",
  "en-MY": "d/m/yyyy",
  "en-NZ": "d/mm/yyyy",
  "en-PH": "m/d/yyyy",
  "en-SG": "d/m/yyyy",
  "en-TT": "dd/mm/yyyy",
  "en-US": "m/d/yyyy",
  "en-ZA": "yyyy/mm/dd",
  "en-ZW": "m/d/yyyy",
  "es-AR": "dd/mm/yyyy",
  "es-BO": "dd/mm/yyyy",
  "es-CL": "dd-mm-yyyy",
  "es-CO": "dd/mm/yyyy",
  "es-CR": "dd/mm/yyyy",
  "es-DO": "dd/mm/yyyy",
  "es-EC": "dd/mm/yyyy",
  "es-ES": "dd/mm/yyyy",
  "es-GT": "dd/mm/yyyy",
  "es-HN": "dd/mm/yyyy",
  "es-MX": "dd/mm/yyyy",
  "es-NI": "dd/mm/yyyy",
  "es-PA": "mm/dd/yyyy",
  "es-PE": "dd/mm/yyyy",
  "es-PR": "dd/mm/yyyy",
  "es-PY": "dd/mm/yyyy",
  "es-SV": "dd/mm/yyyy",
  "es-US": "m/d/yyyy",
  "es-UY": "dd/mm/yyyy",
  "es-VE": "dd/mm/yyyy",
  "et-EE": "d.mm.yyyy",
  "eu-ES": "yyyy/mm/dd",
  "fa-IR": "mm/dd/yyyy",
  "fi-FI": "d.m.yyyy",
  "fil-PH": "m/d/yyyy",
  "fo-FO": "dd-mm-yyyy",
  "fr-BE": "d/mm/yyyy",
  "fr-CA": "yyyy-mm-dd",
  "fr-CH": "dd.mm.yyyy",
  "fr-FR": "dd/mm/yyyy",
  "fr-LU": "dd/mm/yyyy",
  "fr-MC": "dd/mm/yyyy",
  "fy-NL": "d-m-yyyy",
  "ga-IE": "dd/mm/yyyy",
  "gd-GB": "dd/mm/yyyy",
  "gl-ES": "dd/mm/yy",
  "gsw-FR": "dd/mm/yyyy",
  "gu-IN": "dd-mm-yy",
  "ha-Latn-NG": "d/m/yyyy",
  "he-IL": "dd/mm/yyyy",
  "hi-IN": "dd-mm-yyyy",
  "hr-BA": "d.m.yyyy.",
  "hr-HR": "d.m.yyyy",
  "hsb-DE": "d. m. yyyy",
  "hu-HU": "yyyy. mm. dd.",
  "hy-AM": "dd.mm.yyyy",
  "id-ID": "dd/mm/yyyy",
  "ig-NG": "d/m/yyyy",
  "ii-CN": "yyyy/m/d",
  "is-IS": "d.m.yyyy",
  "it-CH": "dd.mm.yyyy",
  "it-IT": "dd/mm/yyyy",
  "iu-Cans-CA": "d/m/yyyy",
  "iu-Latn-CA": "d/mm/yyyy",
  "ja-JP": "yyyy/mm/dd",
  "ka-GE": "dd.mm.yyyy",
  "kk-KZ": "dd.mm.yyyy",
  "kl-GL": "dd-mm-yyyy",
  "km-KH": "yyyy-mm-dd",
  "kn-IN": "dd-mm-yy",
  "ko-KR": "yyyy-mm-dd",
  "kok-IN": "dd-mm-yyyy",
  "ky-KG": "dd.mm.yy",
  "lb-LU": "dd/mm/yyyy",
  "lo-LA": "dd/mm/yyyy",
  "lt-LT": "yyyy.mm.dd",
  "lv-LV": "yyyy.mm.dd.",
  "mi-NZ": "dd/mm/yyyy",
  "mk-MK": "dd.mm.yyyy",
  "ml-IN": "dd-mm-yy",
  "mn-MN": "yy.mm.dd",
  "mn-Mong-CN": "yyyy/m/d",
  "moh-CA": "m/d/yyyy",
  "mr-IN": "dd-mm-yyyy",
  "ms-BN": "dd/mm/yyyy",
  "ms-MY": "dd/mm/yyyy",
  "mt-MT": "dd/mm/yyyy",
  "nb-NO": "dd.mm.yyyy",
  "ne-NP": "m/d/yyyy",
  "nl-BE": "d/mm/yyyy",
  "nl-NL": "d-m-yyyy",
  "nn-NO": "dd.mm.yyyy",
  "nso-ZA": "yyyy/mm/dd",
  "oc-FR": "dd/mm/yyyy",
  "or-IN": "dd-mm-yy",
  "pa-IN": "dd-mm-yy",
  "pl-PL": "yyyy-mm-dd",
  "prs-AF": "dd/mm/yy",
  "ps-AF": "dd/mm/yy",
  "pt-BR": "d/m/yyyy",
  "pt-PT": "dd-mm-yyyy",
  "qut-GT": "dd/mm/yyyy",
  "quz-BO": "dd/mm/yyyy",
  "quz-EC": "dd/mm/yyyy",
  "quz-PE": "dd/mm/yyyy",
  "rm-CH": "dd/mm/yyyy",
  "ro-RO": "dd.mm.yyyy",
  "ru-RU": "dd.mm.yyyy",
  "rw-RW": "m/d/yyyy",
  "sa-IN": "dd-mm-yyyy",
  "sah-RU": "mm.dd.yyyy",
  "se-FI": "d.m.yyyy",
  "se-NO": "dd.mm.yyyy",
  "se-SE": "yyyy-mm-dd",
  "si-LK": "yyyy-mm-dd",
  "sk-SK": "d. m. yyyy",
  "sl-SI": "d.m.yyyy",
  "sma-NO": "dd.mm.yyyy",
  "sma-SE": "yyyy-mm-dd",
  "smj-NO": "dd.mm.yyyy",
  "smj-SE": "yyyy-mm-dd",
  "smn-FI": "d.m.yyyy",
  "sms-FI": "d.m.yyyy",
  "sq-AL": "yyyy-mm-dd",
  "sr-Cyrl-BA": "d.m.yyyy",
  "sr-Cyrl-CS": "d.m.yyyy",
  "sr-Cyrl-ME": "d.m.yyyy",
  "sr-Cyrl-RS": "d.m.yyyy",
  "sr-Latn-BA": "d.m.yyyy",
  "sr-Latn-CS": "d.m.yyyy",
  "sr-Latn-ME": "d.m.yyyy",
  "sr-Latn-RS": "d.m.yyyy",
  "sv-FI": "d.m.yyyy",
  "sv-SE": "yyyy-mm-dd",
  "sw-KE": "m/d/yyyy",
  "syr-SY": "dd/mm/yyyy",
  "ta-IN": "dd-mm-yyyy",
  "te-IN": "dd-mm-yy",
  "tg-Cyrl-TJ": "dd.mm.yy",
  "th-TH": "d/m/yyyy",
  "tk-TM": "dd.mm.yy",
  "tn-ZA": "yyyy/mm/dd",
  "tr-TR": "dd.mm.yyyy",
  "tt-RU": "dd.mm.yyyy",
  "tzm-Latn-DZ": "dd-mm-yyyy",
  "ug-CN": "yyyy-m-d",
  "uk-UA": "dd.mm.yyyy",
  "ur-PK": "dd/mm/yyyy",
  "uz-Cyrl-UZ": "dd.mm.yyyy",
  "uz-Latn-UZ": "dd/mm yyyy",
  "vi-VN": "dd/mm/yyyy",
  "wo-SN": "dd/mm/yyyy",
  "xh-ZA": "yyyy/mm/dd",
  "yo-NG": "d/m/yyyy",
  "zh-CN": "yyyy/m/d",
  "zh-HK": "d/m/yyyy",
  "zh-MO": "d/m/yyyy",
  "zh-SG": "d/m/yyyy",
  "zh-TW": "yyyy/m/d",
  "zu-ZA": "yyyy/mm/dd"
};
exports.language2LocalDateFormat = language2LocalDateFormat;
var dateFormat2LocationList = Object.keys(language2LocalDateFormat).reduce(function (ac, cr) {
  ac[language2LocalDateFormat[cr]] = ac[language2LocalDateFormat[cr]] || [];
  ac[language2LocalDateFormat[cr]].push(cr);
  return ac;
}, {});
exports.dateFormat2LocationList = dateFormat2LocationList;
var dateFormatList = Object.keys(dateFormat2LocationList);
/**
 *
 * @param {Date} date
 * @returns {String}
 */

exports.dateFormatList = dateFormatList;

function yyymmdd(date) {
  return formatDateTime(date, 'yyyy/MM/dd');
}

var dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
exports.dayNames = dayNames;
var shortDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
exports.shortDayNames = shortDayNames;
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
exports.monthNames = monthNames;
var shortMonthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
exports.shortMonthNames = shortMonthNames;
var formatTokenRegex = /([,.\-\/])|([a-zA-Z0-9]+)/g; //more

exports.formatTokenRegex = formatTokenRegex;
var DATE_TIME_TOKEN_RGX = /([^\s.\/:\-,]+)|([.\/:\-,]+)/i;
/**
 *
 * @param {Date} date
 * @param {String=} format
 * @returns {String}
 */

exports.DATE_TIME_TOKEN_RGX = DATE_TIME_TOKEN_RGX;

function formatDateString(date, format) {
  format = format || 'dd/mm/yyyy';
  var dt = date.getDate();
  var day = date.getDay();
  var month = date.getMonth();
  var year = date.getFullYear();
  return format.replace(formatTokenRegex, function (x) {
    switch (x) {
      case "dddd":
        return dayNames[day];

      case "ddd":
        return shortDayNames[day];

      case "dd":
        return dt < 10 ? '0' + dt : '' + dt;

      case "d":
        return '' + dt;

      case "mmmm":
        return monthNames[month];

      case "mmm":
        return shortMonthNames[month];

      case "mm":
        return month + 1 < 10 ? '0' + (month + 1) : '' + (month + 1);

      case "m":
        return '' + (month + 1);

      case 'yy':
        return (year + '').match(/..$/)[0];

      case 'yyyy':
        return year + '';

      default:
        return x;
    }
  });
}

var LOCAL_DATE_FORMAT = function () {
  var d = new Date(2021, 4, 4);
  var s = d.toLocaleDateString();
  var fm = s.replace(new RegExp(DATE_TIME_TOKEN_RGX.source, 'g'), function (token) {
    switch (token) {
      case '2021':
        return 'yyyy';

      case '5':
        return 'M';

      case '05':
        return 'MM';

      case '4':
        return 'd';

      case '04':
        return 'dd';

      default:
        return token;
    }
  });
  return fm;
}();

exports.LOCAL_DATE_FORMAT = LOCAL_DATE_FORMAT;

var LOCAL_DATE_TIME_FORMAT = function () {
  var d = new Date(2021, 4, 4, 6, 7, 3);
  var s = d.toLocaleString();
  var fm = s.replace(new RegExp(DATE_TIME_TOKEN_RGX.source, 'g'), function (token) {
    switch (token) {
      case '2021':
        return 'yyyy';

      case '5':
        return 'M';

      case '05':
        return 'MM';

      case '4':
        return 'd';

      case '04':
        return 'dd';

      case '06':
        if (new Date(2021, 4, 4, 18, 7, 3).toLocaleString().indexOf(18) >= 0) return 'HH';
        return 'hh';

      case '6':
        return 'h';

      case '07':
        return 'mm';

      case '7':
        return 'm';

      case '03':
        return 'ss';

      case '3':
        return 's';

      case 'AM':
        return 'a';

      default:
        return token;
    }
  });
  return fm;
}();

exports.LOCAL_DATE_TIME_FORMAT = LOCAL_DATE_TIME_FORMAT;

function formartDateString() {
  window.ALogger.warn("spelled incorrectly: formartDateString");
  return formatDateString.apply(null, arguments);
}
/**
 *
 * @param {String} text
 * @param {String} format
 * @returns {Date}
 */


function parseDateString(text, format) {
  text = (0, _stringFormat.nonAccentVietnamese)(text).toLowerCase();
  format = (0, _stringFormat.nonAccentVietnamese)(format).toLowerCase();
  var textTokens = text.match(formatTokenRegex) || [];
  var formatTokens = format.match(formatTokenRegex) || [];
  var year = new Date().getFullYear();
  var month = 0;
  var day = 1;
  var n = Math.min(textTokens.length, formatTokens.length);
  var textToken;
  var formatToken;

  for (var i = 0; i < n; ++i) {
    textToken = textTokens[i];
    formatToken = formatTokens[i];

    switch (formatToken) {
      case "dd":
        day = parseInt(textToken);
        break;

      case "d":
        day = parseInt(textToken);
        break;

      case "mmmm":
        month = monthNames.indexOf(textToken.substr(0, 1).toUpperCase() + textToken.substr(1).toLowerCase());
        break;

      case "mmm":
        month = shortMonthNames.indexOf(textToken.substr(0, 1).toUpperCase() + textToken.substr(1).toLowerCase());
        break;

      case "mm":
      case 'MM':
        month = parseInt(textToken) - 1;
        break;

      case "m":
      case 'M':
        month = parseInt(textToken) - 1;
        break;

      case 'yy':
        year = Math.floor(new Date().getFullYear() / 100) * 100 + parseInt(textToken);
        break;

      case 'yyyy':
        year = parseInt(textToken);
        break;

      default:
        if (textToken !== formatToken) throw new Error('Unexpected token ' + textToken);
    }
  }

  if (isNaN(year)) throw new Error('Invalid year');

  if (isNaN(month) && month !== -1) {
    throw new Error('Invalid month');
  } else {
    month = Math.max(0, Math.min(11, month));
  }

  if (!isNaN(day)) {
    day = Math.max(1, Math.min(31, day));

    if (!isNaN(month)) {
      day = Math.min(daysInMonth(2000, month), day);
      if (!isNaN(year)) day = Math.min(daysInMonth(year, month), day);
    }
  } else {
    throw new Error('Invalid day');
  }

  return new Date(year, month, day);
}
/***
 *
 * @param date
 * @param {number} delta - must be a integer
 * @param {boolean=} gmt
 * @returns {Date}
 */


function addDate(date, delta, gmt) {
  delta = Math.round(delta);
  var res = beginOfDay(date, gmt);

  if (gmt) {
    res.setUTCDate(date.getUTCDate() + delta);
  } else {
    res.setDate(date.getDate() + delta);
  }

  return beginOfDay(res, gmt);
}
/**
 * @param {Date} date
 * @param {boolean=} gmt
 * @return {Date}
 */


function prevDate(date, gmt) {
  return addDate(date, -1, gmt);
}
/**
 * @param {Date} date
 * @param {boolean=} gmt
 * @return {Date}
 */


function nextDate(date, gmt) {
  return addDate(date, 1, gmt);
}
/****
 *
 * @param {Date} date
 * @param {boolean=} gmt
 * @param {number=} startDayOfWeek
 * @returns {number}
 */


function weekIndexOf(date, gmt, startDayOfWeek) {
  if (typeof startDayOfWeek !== "number") startDayOfWeek = getDefaultFirstDayOfWeek();
  var by = beginOfYear(date, gmt);
  var byw = beginOfWeek(by, gmt, startDayOfWeek);
  var bw = beginOfWeek(date, gmt, startDayOfWeek);

  if (compareYear(by, bw) > 0) {
    return weekIndexOf(bw, gmt, startDayOfWeek);
  }

  var i = compareYear(byw, by) < 0 ? -1 : 0;
  return Math.floor(compareDate(date, byw, gmt) / 7) + i;
}
/***
 *
 * @param {number} year
 * @param {number} weekIdx
 * @param {boolean=} gmt
 * @param {number=} startDayOfWeek
 * @returns {Date}
 */


function weekInYear(year, weekIdx, gmt, startDayOfWeek) {
  if (typeof startDayOfWeek !== "number") startDayOfWeek = getDefaultFirstDayOfWeek();
  var bg = new Date(year, 0, 1);
  if (gmt) bg.setUTCHours(0);
  var byw = beginOfWeek(bg, gmt, startDayOfWeek);
  var d = compareYear(bg, byw) > 0 ? MILLIS_PER_DAY * 7 : 0;
  return new Date(byw.getTime() + d + weekIdx * 7 * MILLIS_PER_DAY);
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at xx:xx:xx:00
 */


function beginOfSecond(date, gmt) {
  var res = new Date(date.getTime());
  if (gmt) res.setUTCMilliseconds(0);else res.setMilliseconds(0);
  return res;
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at xx:xx:00
 */


function beginOfMinute(date, gmt) {
  var res = new Date(date.getTime());
  if (gmt) res.setUTCSeconds(0, 0);else res.setSeconds(0, 0);
  return res;
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at 00:00
 */


function beginOfDay(date, gmt) {
  var res = new Date(date.getTime());
  if (gmt) res.setUTCHours(0, 0, 0, 0);else res.setHours(0, 0, 0, 0);
  return res;
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at xx:00
 */


function beginOfHour(date, gmt) {
  var res = new Date(date.getTime());
  if (gmt) res.setUTCMinutes(0, 0, 0);else res.setMinutes(0, 0, 0);
  return res;
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @param {number=} startDayOfWeek default:0
 * @return {Date} date at 00:00
 */


function beginOfWeek(date, gmt, startDayOfWeek) {
  if (typeof startDayOfWeek !== "number") startDayOfWeek = getDefaultFirstDayOfWeek();
  var res = beginOfDay(date, gmt);

  while ((gmt ? res.getUTCDay() : res.getDay()) !== startDayOfWeek) {
    res = prevDate(res, gmt);
  }

  return res;
}
/***
 *
 * @param {Date} date
 * @param {number} delta
 * @param {boolean=} gmt
 */


function addWeek(date, delta, gmt) {
  date = beginOfWeek(date, gmt);
  delta = Math.round(delta);
  return addDate(date, delta * 7, gmt);
}
/****
 *
 * @param {Date} date
 * @param {boolean=} gmt
 * @returns {Date}
 */


function nextWeek(date, gmt) {
  return addWeek(date, 1, gmt);
}
/****
 *
 * @param {Date} date
 * @param {boolean=} gmt
 * @returns {Date}
 */


function prevWeek(date, gmt) {
  return addWeek(date, -1, gmt);
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at 00:00 AM
 */


function beginOfMonth(date, gmt) {
  var m = gmt ? date.getUTCMonth() : date.getMonth();
  var y = gmt ? date.getUTCFullYear() : date.getFullYear();
  var res = new Date();
  if (gmt) res.setUTCFullYear(y, m, 1);else res.setFullYear(y, m, 1);
  return beginOfDay(res, gmt);
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at 00:00 AM
 */


function beginOfQuarter(date, gmt) {
  var y = gmt ? date.getUTCFullYear() : date.getFullYear();
  var m = gmt ? date.getUTCMonth() : date.getMonth();
  m = Math.floor(m / 3) * 3;
  var res = new Date();
  if (gmt) res.setUTCFullYear(y, m, 1);else res.setFullYear(y, m, 1);
  return beginOfDay(res, gmt);
}
/***
 *
 * @param {Date} date
 * @param {number=} delta
 * @param {boolean=} gmt
 */


function addQuarter(date, delta, gmt) {
  delta = Math.round(delta);
  date = beginOfQuarter(date, gmt);
  return addMonth(date, delta * 3, gmt);
}
/***
 *
 * @param {Date} date
 * @param {boolean=} gmt
 * @returns {Date}
 */


function nextQuarter(date, gmt) {
  date = beginOfQuarter(date);
  return nextMonth(nextMonth(nextMonth(date, gmt), gmt), gmt);
}
/***
 *
 * @param {Date} date
 * @param {boolean=} gmt
 * @returns {Date}
 */


function prevQuarter(date, gmt) {
  date = beginOfQuarter(date, gmt);
  return prevMonth(prevMonth(prevMonth(date, gmt), gmt), gmt);
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at 00:00 AM
 */


function beginOfYear(date, gmt) {
  var y = gmt ? date.getUTCFullYear() : date.getFullYear();
  var res = new Date();
  if (gmt) res.setUTCFullYear(y, 0, 1);else res.setFullYear(y, 0, 1);
  return beginOfDay(res, gmt);
}
/**
 * @param {Date} date
 * @param {number} delta
 * @param {Boolean=} gmt default:false
 * @return {Date} date at 00:00 AM
 */


function addYear(date, delta, gmt) {
  delta = Math.round(delta);
  var y = gmt ? date.getUTCFullYear() : date.getFullYear();
  var res = new Date();
  if (gmt) res.setUTCFullYear(y + delta, 0, 1);else res.setFullYear(y + delta, 0, 1);
  return beginOfDay(res, gmt);
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at 00:00 AM
 */


function nextYear(date, gmt) {
  return addYear(date, 1, gmt);
}
/**
 * @param {Date} date
 * @param {Boolean=} gmt default:false
 * @return {Date} date at 00:00 AM
 */


function prevYear(date, gmt) {
  return addYear(date, -1, gmt);
}
/**
 * @param {Date} date0
 * @param {Date} date1
 * @param {Boolean=} gmt default:false
 * @return {number}
 */


function compareDate(date0, date1, gmt) {
  date0 = beginOfDay(date0, gmt);
  date1 = beginOfDay(date1, gmt); //Date(1975, 5, 12) has 1 hour extend

  return Math.floor((date0.getTime() - date1.getTime()) / 86400000);
}
/**
 * @param {Date} date0
 * @param {Date} date1
 * @param {Boolean=} gmt default:false
 * @return {number}
 */


function compareMonth(date0, date1, gmt) {
  var m0 = gmt ? date0.getUTCMonth() : date0.getMonth();
  var y0 = gmt ? date0.getUTCFullYear() : date0.getFullYear();
  var m1 = gmt ? date1.getUTCMonth() : date1.getMonth();
  var y1 = gmt ? date1.getUTCFullYear() : date1.getFullYear();
  return (y0 - y1) * 12 + (m0 - m1);
}
/***
 *
 * @param {Date} date0
 * @param {Date} date1
 * @param {boolean=}gmt
 * @returns {number}
 */


function compareYear(date0, date1, gmt) {
  var y0 = gmt ? date0.getUTCFullYear() : date0.getFullYear();
  var y1 = gmt ? date1.getUTCFullYear() : date1.getFullYear();
  return y0 - y1;
}
/**
 *
 * @param {Date} date
 * @param {number} delta
 * @param {boolean=} gmt
 * @returns {Date}
 */


function addMonth(date, delta, gmt) {
  var res = beginOfMonth(date, gmt);

  if (gmt) {
    res.setUTCMonth(res.getUTCMonth() + delta);
  } else {
    res.setMonth(res.getMonth() + delta);
  }

  return beginOfDay(res, gmt);
}
/**
 *
 * @param {Date} date
 * @param {boolean=} gmt
 * @returns {Date}
 */


function nextMonth(date, gmt) {
  return addMonth(date, 1, gmt);
}
/**
 *
 * @param {Date} date
 * @param {boolean=} gmt
 * @returns {Date}
 */


function prevMonth(date, gmt) {
  return addMonth(date, -1, gmt);
}
/**
 *
 * @param {Number} year
 * @param {Number} month
 * @returns {Number}
 */


function daysInMonth(year, month) {
  var start = new Date(year, month, 1);
  var end = nextMonth(start);
  return compareDate(end, start);
}
/****
 *
 * @param text
 * @param format support d, M, Y, Q
 * @param {*=} opt
 * @returns {Date}
 */


function parseDateTime(text, format, opt) {
  opt = Object.assign({
    startDayOfWeek: 0
  }, opt);
  var tokenMap = {};
  var txtRgx = new RegExp(DATE_TIME_TOKEN_RGX.source, 'g');
  var fmRgx = new RegExp(DATE_TIME_TOKEN_RGX.source, 'g');
  var tkMatched, fmMatched;
  tkMatched = txtRgx.exec(text);
  fmMatched = fmRgx.exec(format);
  var tkText, fmText;

  while (tkMatched && fmMatched) {
    tkText = tkMatched[0];
    fmText = fmMatched[0];

    switch (fmText) {
      case 'd':
      case 'dd':
        tokenMap.day = parseInt(tkText, 10);
        break;

      case 'w':
      case 'ww':
        tokenMap.week = parseInt(tkText, 10) - 1;
        break;

      case 'M':
      case 'MM':
        tokenMap.month = parseInt(tkText, 10) - 1;
        break;

      case 'y':
      case 'yyyy':
        tokenMap.year = parseInt(tkText, 10);
        break;

      case 'h':
      case 'hh':
      case 'H':
      case 'HH':
        tokenMap.hour = parseInt(tkText, 10);
        break;

      case 'm':
      case 'mm':
        tokenMap.minute = parseInt(tkText, 10);
        break;

      case 'a':
        if (tkText === 'AM' || tkText === 'PM') tokenMap.period = tkText;else throw new Error('Invalid period(a):' + tkText);
        break;

      case 'Q':
      case 'QQ':
        tokenMap.month = (parseInt(tkText, 10) - 1) * 3;
        break;

      default:
        if (tkText !== fmText) {
          throw new Error('Unexpected token ' + JSON.stringify(tkText) + ' at ' + tkMatched.index + ', expected ' + fmText);
        }

    }

    tkMatched = txtRgx.exec(text);
    fmMatched = fmRgx.exec(format);
  }

  if (tokenMap.period) {
    if (tokenMap.period === 'AM' && tokenMap.hour === 12) tokenMap.hour = 0;else if (tokenMap.period === "PM" && tokenMap.hour < 12) tokenMap.hour += 12;
  }

  var paramNames = ['year', 'month', 'day', 'hour', 'minute', 'second'];
  var paramShortNames = ['y', 'M', 'd', 'h', 'm', 's'];
  var paramDefaultValues = [new Date().getFullYear(), 0, 1, 0, 0, 0];
  var resParam = paramDefaultValues.slice();
  var paramList = paramNames.reduce(function (ac, cr, i) {
    var sN = paramShortNames[i];

    if (cr in tokenMap) {
      ac += sN;
    }

    return ac;
  }, '');
  var paramName;

  for (var i = 0; i < paramNames.length; ++i) {
    paramName = paramNames[i];
    resParam[i] = tokenMap[paramName] === undefined ? paramDefaultValues[i] : tokenMap[paramName];
  }

  var weekDate;

  if ('week' in tokenMap && !isNaN(tokenMap.week)) {
    weekDate = weekInYear(resParam[0], tokenMap.week, false, opt.startDayOfWeek);
    resParam[1] = weekDate.getMonth();
    resParam[2] = weekDate.getDate();
  }

  switch (paramList) {
    case 'hm':
      resParam.splice(1, 2, new Date().getMonth(), new Date().getDate());
      break;
  }

  return new Date(resParam[0], resParam[1], resParam[2], resParam[3], resParam[4], resParam[5]);
}
/***
 *
 * @param {Date} date
 * @param {string} format
 * @param {*=} opt
 * @return {string}
 */


function formatDateTime(date, format, opt) {
  opt = Object.assign({
    startDayOfWeek: 0
  }, opt);
  var fmRgx = new RegExp(DATE_TIME_TOKEN_RGX.source, 'g');
  return format.replace(fmRgx, function (s) {
    var res = s;

    switch (s) {
      case 'd':
      case 'dd':
        res = (0, _int.integerZeroPadding)(date.getDate(), s.length);
        break;

      case 'w':
      case 'ww':
        res = (0, _int.integerZeroPadding)(weekIndexOf(date, false, opt.startDayOfWeek || 0) + 1, s.length);
        break;

      case 'M':
      case 'MM':
        res = (0, _int.integerZeroPadding)(date.getMonth() + 1, s.length);
        break;

      case 'MMM':
        res = shortMonthNames[date.getMonth()];
        break;

      case 'MMMM':
        res = monthNames[date.getMonth()];
        break;

      case 'y':
      case 'yyyy':
        res = (0, _int.integerZeroPadding)(date.getFullYear(), s.length);
        break;

      case 'yy':
        res = (0, _int.integerZeroPadding)(date.getFullYear() % 100, s.length);
        break;

      case 'a':
        res = date.getHours() < 12 ? "AM" : "PM";
        break;

      case "H":
      case 'HH':
        res = (0, _int.integerZeroPadding)(date.getHours(), s.length);
        break;

      case 'h':
      case 'hh':
        res = (0, _int.integerZeroPadding)(1 + (date.getHours() - 1) % 12, s.length);
        break;

      case 'm':
      case 'mm':
        res = (0, _int.integerZeroPadding)(date.getMinutes(), s.length);
        break;

      case 'Q':
      case 'QQ':
        res = (0, _int.integerZeroPadding)(Math.floor(date.getMonth() / 3) + 1, s.length);
        break;
    }

    return res;
  });
}

var number = [/[+-]?\d+$/, matched => new Date(parseInt(matched[0]))];
var reISO = [/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/, matched => new Date(matched[0])];
var reMsAjax = [/^\/Date\((d|-|.*)\)[\/|\\]$/, matched => new Date(parseInt(matched[1]))];
var reString = [/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s+([a-zA-Z]{3})\s+[\d\s:]+GMT[\d+]+\s*\([^)]+\)$/, matched => new Date(matched[0])];

function implicitDate(o) {
  var res = null;

  if (o instanceof Date) {
    res = new Date(o.getTime());
  } else if (typeof o === "number") {
    res = new Date(o);
  } else if (typeof o === 'string') {
    [reString, reISO, reMsAjax, number].some(rule => {
      var matched = o.match(rule[0]);

      if (matched) {
        res = rule[1](matched);
        return true;
      }

      return false;
    });
  }

  if (res && isNaN(res.getTime())) res = null;
  return res;
}
};

moduleFactories["node_modules/absol/src/AppPattern/CMDRunner.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/CMDRunner.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function CMDRunner(_this, commands) {
  this._this = _this;
  this.commands = {};
  this.assign(commands);
}

CMDRunner.prototype.has = function (cmdName) {
  return !!this.commands[cmdName];
};

CMDRunner.prototype.add = function (cmdName, handler) {
  this.commands[cmdName] = handler;
  return this;
};

CMDRunner.prototype.remove = function (cmdName) {
  delete this.commands[cmdName];
  return this;
};

CMDRunner.prototype.assign = function (obj) {
  for (var cmdName in obj) {
    if (typeof obj[cmdName] == 'function') {
      this.add(cmdName, obj[cmdName]);
    }
  }
};

CMDRunner.prototype.invoke = function () {
  if (this.commands[arguments[0]]) {
    var args = Array.prototype.slice.call(arguments, 1);
    return this.commands[arguments[0]].apply(this._this, args);
  } else {
    throw new Error('No command: ' + arguments[0]);
  }
};

var _default = CMDRunner;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/Element.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/Element.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _AElement = _interopRequireDefault(require("./AElement"));


var _default = _AElement.default;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Cookie/CookieStore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Cookie/CookieStore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _base = require("../Converter/base64");

function CookieStore(converter) {
  this.converter = converter || _base.UnicodeBase64Converter;
}

CookieStore.prototype.isEnabled = function () {
  var cookieEnabled = !!navigator.cookieEnabled; //if not IE4+ nor NS6+

  if (typeof navigator.cookieEnabled == "undefined" && !cookieEnabled) {
    document.cookie = "testcookie_enabled";
    cookieEnabled = document.cookie.indexOf("testcookie_enabled") != -1;
  }

  return cookieEnabled;
};

CookieStore.prototype.secure = function () {
  document.cookie = "secure";
};

CookieStore.prototype.get = function (key) {
  var bkey = this.converter.encode(key).replace(/=/g, '_');
  var pairs = document.cookie.split(';').map(function (text) {
    return text.split('=');
  }).filter(function (pair) {
    return pair[0].trim() == bkey;
  });

  if (pairs.length > 0) {
    if (pairs[0].length > 1) {
      var bvalue = pairs[0][1];
      return this.converter.decode(bvalue.replace(/_/g, '=').trim());
    } else {
      return true;
    }
  } else return undefined;
};

CookieStore.prototype.set = function (key, value) {
  var bkey = this.converter.encode(key);
  var bvalue = this.converter.encode(value);
  document.cookie = bkey.replace(/=/g, '_') + "=" + bvalue.replace(/=/g, '_');
};

var _default = new CookieStore();

exports.default = _default;
};

moduleFactories["node_modules/absol/src/Cookie/parseCookieString.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Cookie/parseCookieString.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = parseCookieString;

/***
 *
 * @param {string} text
 * @return {{}}
 */
function parseCookieString(text) {
  return text.split(/\s*;\s*/).reduce(function (ac, item) {
    var tokens = item.split('=');
    var name = (tokens.shift() || '').trim();
    if (!name) return ac;
    var value = (tokens.shift() || '').trim();
    if (!value) value = true;
    ac[name] = value;
    return ac;
  }, {});
}
};

moduleFactories["node_modules/absol/src/Math/Mat3.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/Mat3.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("./Vec2"));


function Mat3(data) {
  this.data = data || Array(6).fill(0);
}

Mat3.identity = function () {
  return new Mat3([1, 0, 0, 0, 1, 0, 0, 0, 1]);
};
/**
 *
 * @returns {Mat3|null}
 */


Mat3.prototype.invert = function () {
  var a = this.data;
  var out = Array(9);
  var a00 = a[0],
      a01 = a[1],
      a02 = a[2];
  var a10 = a[3],
      a11 = a[4],
      a12 = a[5];
  var a20 = a[6],
      a21 = a[7],
      a22 = a[8];
  var b01 = a22 * a11 - a12 * a21;
  var b11 = -a22 * a10 + a12 * a20;
  var b21 = a21 * a10 - a11 * a20; // Calculate the determinant

  var det = a00 * b01 + a01 * b11 + a02 * b21;
  if (!det) return null;
  det = 1.0 / det;
  out[0] = b01 * det;
  out[1] = (-a22 * a01 + a02 * a21) * det;
  out[2] = (a12 * a01 - a02 * a11) * det;
  out[3] = b11 * det;
  out[4] = (a22 * a00 - a02 * a20) * det;
  out[5] = (-a12 * a00 + a02 * a10) * det;
  out[6] = b21 * det;
  out[7] = (-a21 * a00 + a01 * a20) * det;
  out[8] = (a11 * a00 - a01 * a10) * det;
  return new Mat3(out);
};
/**
 *
 * @param {Vec2} v
 * @return {Mat3}
 */


Mat3.prototype.translate = function (v) {
  var out = Array(9);
  var a = this.data;
  var a00 = a[0],
      a01 = a[1],
      a02 = a[2];
  var a10 = a[3],
      a11 = a[4],
      a12 = a[5];
  var a20 = a[6],
      a21 = a[7],
      a22 = a[8];
  var x = v.x,
      y = v.y;
  out[0] = a00;
  out[1] = a01;
  out[2] = a02;
  out[3] = a10;
  out[4] = a11;
  out[5] = a12;
  out[6] = x * a00 + y * a10 + a20;
  out[7] = x * a01 + y * a11 + a21;
  out[8] = x * a02 + y * a12 + a22;
  return new Mat3(out);
};
/**
 *
 * @param {Mat3} mat
 * @returns {Mat3}
 */


Mat3.prototype.multiply = function (mat) {
  var a = this.data;
  var b = mat.data;
  var a00 = a[0],
      a01 = a[1],
      a02 = a[2];
  var a10 = a[3],
      a11 = a[4],
      a12 = a[5];
  var a20 = a[6],
      a21 = a[7],
      a22 = a[8];
  var b00 = b[0],
      b01 = b[1],
      b02 = b[2];
  var b10 = b[3],
      b11 = b[4],
      b12 = b[5];
  var b20 = b[6],
      b21 = b[7],
      b22 = b[8];
  var out = Array(9);
  out[0] = b00 * a00 + b01 * a10 + b02 * a20;
  out[1] = b00 * a01 + b01 * a11 + b02 * a21;
  out[2] = b00 * a02 + b01 * a12 + b02 * a22;
  out[3] = b10 * a00 + b11 * a10 + b12 * a20;
  out[4] = b10 * a01 + b11 * a11 + b12 * a21;
  out[5] = b10 * a02 + b11 * a12 + b12 * a22;
  out[6] = b20 * a00 + b21 * a10 + b22 * a20;
  out[7] = b20 * a01 + b21 * a11 + b22 * a21;
  out[8] = b20 * a02 + b21 * a12 + b22 * a22;
  return new Mat3(out);
};
/***
 *
 * @param {Number} rad
 * @return {Mat3}
 */


Mat3.prototype.rotate = function (rad) {
  var a = this.data;
  var a00 = a[0],
      a01 = a[1],
      a02 = a[2];
  var a10 = a[3],
      a11 = a[4],
      a12 = a[5];
  var a20 = a[6],
      a21 = a[7],
      a22 = a[8];
  var s = Math.sin(rad);
  var c = Math.cos(rad);
  var out = Array(9);
  out[0] = c * a00 + s * a10;
  out[1] = c * a01 + s * a11;
  out[2] = c * a02 + s * a12;
  out[3] = c * a10 - s * a00;
  out[4] = c * a11 - s * a01;
  out[5] = c * a12 - s * a02;
  out[6] = a20;
  out[7] = a21;
  out[8] = a22;
  return new Mat3(out);
};
/***
 *
 * @param {Vec2} v
 * @returns {Mat3}
 */


Mat3.prototype.scale = function (v) {
  var x = v.x;
  var y = v.y;
  var out = Array(9);
  out[0] = x * a[0];
  out[1] = x * a[1];
  out[2] = x * a[2];
  out[3] = y * a[3];
  out[4] = y * a[4];
  out[5] = y * a[5];
  out[6] = a[6];
  out[7] = a[7];
  out[8] = a[8];
  return new Mat3(out);
};
/***
 *
 * @return {Mat3}
 */


Mat3.prototype.transpose = function () {
  var a = this.data;
  var out = Array(9);
  out[0] = a[0];
  out[1] = a[3];
  out[2] = a[6];
  out[3] = a[1];
  out[4] = a[4];
  out[5] = a[7];
  out[6] = a[2];
  out[7] = a[5];
  out[8] = a[8];
  return new Mat3(out);
};
/**
 *
 * @param {Vec2}v
 */


Mat3.prototype.apply2DTransform = function (v) {
  var a = this.data;
  var x0 = v.x;
  var y0 = v.y;
  var x = x0 * a[0] + y0 * a[3] + a[6];
  var y = x0 * a[1] + y0 * a[4] + a[7];
  return new _Vec.default(x, y);
};

var _default = Mat3;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/LanguageSystem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/LanguageSystem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.textNodeLanguageChangeHandler = textNodeLanguageChangeHandler;
exports.elementLanguageChangeHandler = elementLanguageChangeHandler;
exports.default = exports.LangSys = void 0;

var _ResizeSystem = _interopRequireDefault(require("./ResizeSystem"));

var _safeThrow = _interopRequireDefault(require("../Code/safeThrow"));


/***
 * @typedef LanguageSystemExtension
 * @property {function(key: string, code?: string): (string | null)} getText
 */

/****
 *
 * @constructor
 */
function LanguageSystem() {
  this.data = {};
  this.code = navigator.language || navigator.userLanguage;
  /***
   *
   * @type {LanguageSystemExtension[]}
   * @private
   */

  this._extensions = [];
}

LanguageSystem.prototype.notifyLanguageChange = function () {
  var sizeChange = false;

  function visit(elt) {
    if (elt.onlanguagechange) {
      try {
        elt.onlanguagechange();
        sizeChange = true;
      } catch (err) {
        (0, _safeThrow.default)(err);
      }

      if (elt.childNodes && elt.childNodes.length > 0) {
        Array.prototype.forEach.call(elt.childNodes, visit);
      }
    }
  }

  visit(document.body);
  if (sizeChange) _ResizeSystem.default.update();
};
/***
 *
 * @param {ChildNode | Text | HTMLElement | Element} node
 */


LanguageSystem.prototype.bind = function (node, key) {
  if (node.nodeType === 1) {
    this.bindTextNode(node, key);
  } else if (node.nodeType === 3) {
    this.bindElement(node, key);
  }
};
/***
 *
 * @param {Text | {__as_language_key: string}} node
 * @param {string} key
 */


LanguageSystem.prototype.bindTextNode = function (node, key) {
  node.__as_language_key = key;
  node.onlanguagechange = textNodeLanguageChangeHandler;
};
/***
 *
 * @param {ChildNode | HTMLElement | Element | {__as_language_key: string}} node
 * @param {string} key
 */


LanguageSystem.prototype.bindElement = function (node, key) {
  node.__as_language_key = key;
  node.onlanguagechange = elementLanguageChangeHandler;
};
/***
 *
 * @param {string} key
 * @param {string} [code]
 */


LanguageSystem.prototype.getText = function (key, code) {
  var code = code || this.code;
  var res;
  var ex;

  for (var i = this._extensions.length - 1; i >= 0; --i) {
    ex = this._extensions[i];
    res = ex.getText && ex.getText.apply(ex, arguments);
    if (res) break;
  }

  if (!res) {
    res = this.data[code] && this.data[code][key];
  }

  return res || null;
};
/***
 *
 * @param {LanguageSystemExtension} ex
 */


LanguageSystem.prototype.addExtension = function (ex) {
  this._extensions.push(ex);
};

var LangSys = new LanguageSystem();
exports.LangSys = LangSys;

function textNodeLanguageChangeHandler() {
  if (this.__as_language_key) {
    var newText = LangSys.getText(this.__as_language_key);

    if (newText && newText.trim) {
      this.data = newText;
    }
  }
}

function elementLanguageChangeHandler() {
  if (this.__as_language_key) {
    var newText = LangSys.getText(this.__as_language_key);

    if (newText && newText.trim) {
      var textNode;

      for (var i = 0; i < this.childNodes.length; ++i) {
        if (this.childNodes[i].nodeType === 1) {
          textNode = this.childNodes[i];
          break;
        }
      }

      if (!textNode) {
        textNode = document.createTextNode('');
      }

      textNode.data = newText;
    }
  }
}

var _default = LangSys;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Code/FlagManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Code/FlagManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("../HTML5/EventEmitter"));

var _OOP = _interopRequireDefault(require("../HTML5/OOP"));


/***
 * @extends EventEmitter
 * @constructor
 */
function FlagManager() {
  _EventEmitter.default.call(this);

  this.flag = {};
  this.readSetting();
}

_OOP.default.mixClass(FlagManager, _EventEmitter.default);

FlagManager.prototype.STORE_KEY = "ABSOL_FLAG";

FlagManager.prototype.readSetting = function () {
  var flagText = localStorage.getItem(this.STORE_KEY) || '{}';
  var newFlag = {};

  try {
    newFlag = JSON.parse(flagText);
  } catch (err) {}

  this.applyFlag(newFlag);
};

FlagManager.prototype.applyFlag = function (newFlag, save) {
  var changed = [];
  Object.keys(Object.assign({}, this.flag, newFlag)).forEach(function (key) {
    if (key in window) {
      if (key in newFlag) {
        if (window[key] !== newFlag[key]) {
          window[key] = newFlag[key];
          changed.push(key);
        }
      } else {
        changed.push(key);
        delete window[key];
      }
    } else {
      if (key in newFlag) {
        if (window[key] !== newFlag[key]) {
          window[key] = newFlag[key];
          changed.push(key);
        }
      }
    }
  });
  this.flag = newFlag;
  if (save) this.saveSetting();

  if (changed.length > 0) {
    this.emit('change', {
      type: 'change',
      target: this,
      keys: changed
    });
  }
};

FlagManager.prototype.saveSetting = function () {
  localStorage.setItem(this.STORE_KEY, JSON.stringify(this.flag));
};
/***
 *
 * @param {string} key
 * @param {boolean=} value
 */


FlagManager.prototype.add = function (key, value) {
  if (!key || typeof key != 'string') return;
  if (key in this.flag) return;

  if (typeof value != "boolean") {
    value = !!window[key];
  }

  this.flag[key] = value;
  window[key] = value;
  this.saveSetting();
  this.emit('change', {
    type: 'change',
    target: this,
    keys: [key]
  });
};

FlagManager.prototype.set = function (key, value) {
  if (!key || typeof key != 'string') return;

  if (typeof value != "boolean") {
    value = !!window[key];
  }

  var changed = false;
  this.flag[key] = value;

  if (window[key] !== value) {
    changed = true;
  }

  this.saveSetting();

  if (changed) {
    this.emit('change', {
      type: 'change',
      target: this,
      keys: [key]
    });
  }
};

FlagManager.prototype.remove = function (key) {
  if (key in this.flag) {
    delete window[key];
    delete this.flag[key];
    this.emit('change', {
      type: 'change',
      target: this,
      keys: [key]
    });
  }
};

var _default = new FlagManager();

exports.default = _default;
};

moduleFactories["node_modules/absol/src/Code/ALogger.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Code/ALogger.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FlagManager = _interopRequireDefault(require("./FlagManager"));

var _noop = _interopRequireDefault(require("./noop"));


_FlagManager.default.add('ABSOL_DEBUG', false);

function ALogger() {
  _FlagManager.default.on('change', this._updateProto.bind(this));

  this._updateProto();
}

ALogger.prototype._updateProto = function () {
  ['log', 'table', 'table', 'error', 'warn'].forEach(function (name) {
    var cFunction = window['ABSOL_DEBUG'] ? console[name] && console[name].bind(console) : _noop.default;
    this[name] = cFunction || _noop.default;
  }.bind(this));
};

ALogger.prototype.log = _noop.default;
ALogger.prototype.table = _noop.default;
ALogger.prototype.error = _noop.default;
ALogger.prototype.warn = _noop.default;
(window || global).ALogger = new ALogger();
var _default = ALogger;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/ObservableArray.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/ObservableArray.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("../HTML5/EventEmitter"));


/***
 * @augments EventEmitter
 * @extends Array
 * @constructor
 */
function ObservableArray(array) {
  _EventEmitter.default.call(this);

  Object.defineProperty(this, '_array', {
    configurable: false,
    enumerable: false,
    value: array
  });

  this._makeArrIndex(0, array.length);
}

Object.defineProperty(ObservableArray.prototype, 'unshift', {
  enumerable: false,
  value: function () {
    var newItems = Array.prototype.slice.call(arguments);
    var cN = this._array.length;

    this._makeArrIndex(cN, this._array.length + newItems.length);

    this._array.unshift.apply(this._array, newItems);

    this.emit("additem", {
      target: this,
      items: newItems,
      type: 'additem',
      offset: 0,
      action: 'unshift'
    }, this);
  }
});
Object.defineProperty(ObservableArray.prototype, 'shift', {
  enumerable: false,
  value: function () {
    var res = undefined;

    if (this._array.length > 0) {
      res = this._array.shift();

      this._removeIndex(this._array.length);

      this.emit("removeitem", {
        target: this,
        type: 'additem',
        offset: 0,
        action: 'shift',
        items: [res],
        item: res
      }, this);
    }

    return res;
  }
});
Object.defineProperty(ObservableArray.prototype, 'push', {
  enumerable: false,
  value: function () {
    var newItems = Array.prototype.slice.call(arguments);
    var cN = this._array.length;

    this._makeArrIndex(this._array.length, this._array.length + newItems.length);

    this._array.push.apply(this._array, newItems);

    this.emit("additem", {
      target: this,
      items: newItems,
      type: 'additem',
      offset: cN,
      action: 'push'
    }, this);
  }
});
Object.defineProperty(ObservableArray.prototype, 'pop', {
  enumerable: false,
  value: function () {
    var res = undefined;

    if (this._array.length > 0) {
      res = this._array.pop();

      this._removeIndex(this._array.length);

      this.emit("removeitem", {
        target: this,
        type: 'additem',
        offset: this._array.length,
        action: 'shift',
        items: [res],
        item: res
      }, this);
    }

    return res;
  }
});
Object.defineProperty(ObservableArray.prototype, 'replace', {
  enumerable: false,
  value: function (offset, items) {
    for (var i = 0; i < items.length && offset < this._array.length; ++i, ++offset) {
      this._array[offset] = items[i];
    }
  }
});
Object.defineProperty(ObservableArray.prototype, 'toJSON', {
  enumerable: false,
  value: function () {
    return this._array;
  }
});
Object.defineProperty(ObservableArray.prototype, 'valueOf', {
  enumerable: false,
  value: function () {
    return this._array;
  }
});
Object.defineProperty(ObservableArray.prototype, '_makeArrIndex', {
  enumerable: false,
  value: function (cN, nN) {
    var i;

    if (nN > cN) {
      for (i = cN; i < nN; ++i) this._defineIndex(i);
    } else {
      for (i = cN - 1; i >= nN; --i) this._removeIndex(i);
    }
  }
});
/***
 *
 * @param {number} idx
 * @private
 */

Object.defineProperty(ObservableArray.prototype, '_defineIndex', {
  enumerable: false,
  value: function (idx) {
    if (!(idx in this)) {
      Object.defineProperty(this, idx, {
        set: function (value) {
          var oldValue = this._array[idx];
          this._array[idx] = value;
          this.emit('setitem', {
            type: 'setitem',
            target: this,
            oldValue: oldValue,
            vale: value,
            offset: idx
          }, this);
        },
        get: function () {
          return this._array[idx];
        },
        configurable: true,
        enumerable: true
      });
    }
  }
});
Object.defineProperty(ObservableArray.prototype, '_removeIndex', {
  enumerable: false,
  value: function (idx) {
    delete this[idx];
  }
});
Object.defineProperty(ObservableArray.prototype, 'splice', {
  enumerable: false,
  value: function (index, howMany) {
    var res = [];
    var newItems = Array.prototype.slice.call(arguments, 2);
    index = index == null ? 0 : index < 0 ? this._array.length + index : index;
    howMany = howMany == null ? this._array.length - index : howMany > 0 ? howMany : 0;

    if (howMany > 0) {
      this._makeArrIndex(this._array.length, this._array.length - howMany);

      res = this._array.splice(index, howMany);

      if (newItems.length > 0) {
        if (res.length > 0) {
          this.emit('replaceitem', {
            type: 'replaceitem',
            offset: index,
            oldItems: res,
            newItems: newItems,
            target: this,
            action: 'splice'
          }, this);
        } else {
          this.emit('additem', {
            type: 'additem',
            offset: index,
            items: newItems,
            target: this
          }, this);
        }
      } else {
        if (res.length > 0) {
          this.emit('removeitem', {
            target: this,
            type: 'additem',
            offset: 0,
            action: 'splice',
            items: res
          }, this);
        }
      }
    }

    return res;
  }
});
Object.defineProperty(ObservableArray.prototype, 'length', {
  set: function (value) {
    var n = Number(value);
    var length = this._array.length;

    if (n % 1 === 0 && n >= 0) {
      if (n < length) {
        this.splice(n);
      } else if (n > length) {
        this.push.apply(this, new Array(n - length));
      }
    } else {
      throw new RangeError("Invalid array length");
    }

    this._array.length = n;
  },
  get: function () {
    return this._array.length;
  }
});
Object.getOwnPropertyNames(Array.prototype).forEach(function (name) {
  if (!(name in ObservableArray.prototype)) {
    Object.defineProperty(ObservableArray.prototype, name, {
      configurable: false,
      enumerable: false,
      writable: false,
      value: Array.prototype[name]
    });
  }
});
Object.getOwnPropertyNames(_EventEmitter.default.prototype).forEach(function (name) {
  if (!(name in ObservableArray.prototype)) {
    Object.defineProperty(ObservableArray.prototype, name, {
      configurable: false,
      enumerable: false,
      writable: false,
      value: _EventEmitter.default.prototype[name]
    });
  }
});
var _default = ObservableArray;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/ObservableStruct.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/ObservableStruct.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("../HTML5/EventEmitter"));


/***
 * @extends EventEmitter
 * @param {Object} o
 * @constructor
 */
function ObservableStruct(o) {
  _EventEmitter.default.call(this);

  Object.defineProperty(this, '__o__', {
    configurable: false,
    enumerable: false,
    value: o
  });

  for (var key in o) this.defineProperty(key);
}

Object.defineProperty(ObservableStruct.prototype, 'defineProperty', {
  configurable: false,
  enumerable: false,
  writable: false,

  /***
   *
   * @param {string} name
   * @param {*=} value
   */
  value: function (name, value) {
    if (!(name in this)) {
      Object.defineProperty(this, name, {
        set: function (value) {
          var oldValue = this.__o__[name];
          this.__o__[name] = value;
          this.emit('setproperty', {
            type: 'setproperty',
            target: this,
            oldValue: oldValue,
            vale: value,
            name: name
          }, this);
        },
        get: function () {
          return this.__o__[name];
        },
        configurable: true,
        enumerable: true
      });
    }
  }
});
Object.getOwnPropertyNames(_EventEmitter.default.prototype).forEach(function (name) {
  if (!(name in ObservableStruct.prototype)) {
    Object.defineProperty(ObservableStruct.prototype, name, {
      configurable: false,
      enumerable: false,
      writable: false,
      value: _EventEmitter.default.prototype[name]
    });
  }
});
var _default = ObservableStruct;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/circuit/CCBlock.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/circuit/CCBlock.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _stringGenerate = require("../../String/stringGenerate");

var _safeThrow = _interopRequireDefault(require("../../Code/safeThrow"));


/***
 *
 * @param {{id?:string}=} opt
 * @constructor
 */
function CCBlock(opt) {
  opt = opt || {};
  this.id = opt.id || (0, _stringGenerate.randomIdent)(16);
  Object.defineProperty(this, '__cc_listener__', {
    enumerable: false,
    configurable: true,
    writable: false,
    value: {}
  });
  Object.defineProperty(this, '__cc_line_list_by_id__', {
    enumerable: false,
    configurable: true,
    writable: false,
    value: {}
  });
}
/***
 *
 * @param {string} pinName
 * @param {function} listener
 * @return {CCBlock}
 */


CCBlock.prototype.pinOn = function (pinName, listener) {
  var cbList;

  if (this.__cc_listener__[pinName]) {
    cbList = this.__cc_listener__[pinName];
  } else {
    cbList = [];
    this.__cc_listener__[pinName] = cbList;
  }

  if (cbList.indexOf(listener) < 0) {
    cbList.push(listener);
  } else {
    console.warn("Duplicate pin listener!");
  }

  return this;
};

CCBlock.prototype.pinOff = function (pinName, listener) {
  if (!this.__cc_listener__[pinName]) return this;
  var cbList = this.__cc_listener__[pinName];
  var cbIdx = cbList.indexOf(listener);

  if (cbIdx >= 0) {
    cbList.splice(cbIdx);
  }

  return this;
};

CCBlock.prototype.pinFire = function (pinName) {
  if (!this.__cc_listener__[pinName]) return this;

  var cbList = this.__cc_listener__[pinName].slice();

  var args = Array.prototype.slice.call(arguments, 1);
  if (args.length === 0 && this.pinHandlers[pinName] && this.pinHandlers[pinName].get && cbList.length > 0) args.push(this.pinGetValue(pinName));

  for (var i = 0; i < cbList.length; ++i) {
    try {
      cbList[i].apply(this, args);
    } catch (e) {
      (0, _safeThrow.default)(e);
    }
  }
};

CCBlock.prototype.pinFireAll = function () {
  var pinNames = Object.keys(this.pinHandlers);
  var pinName;

  for (var i = 0; i < pinNames.length; ++i) {
    pinName = pinNames[i];
    if (this.pinHandlers[pinName] && this.pinHandlers[pinName].get) this.pinFire(pinName);
  }
};

CCBlock.prototype.pinReceives = function (pinName) {
  var args = Array.prototype.slice.call(arguments, 1);

  if (this.pinHandlers[pinName] && this.pinHandlers[pinName].receives) {
    this.pinHandlers[pinName].receives.apply(this, args);
  }
};

CCBlock.prototype.pinGetValue = function (pinName) {
  var args = Array.prototype.slice.call(arguments, 1);

  if (this.pinHandlers[pinName] && this.pinHandlers[pinName].get) {
    return this.pinHandlers[pinName].get.apply(this, args);
  }

  return undefined;
};

CCBlock.prototype.pinGetDescriptor = function (pinName) {
  var args = Array.prototype.slice.call(arguments, 1);
  var descriptor = this.pinHandlers[pinName] && this.pinHandlers[pinName].descriptor;

  if (descriptor) {
    if (typeof descriptor === "function") return this.pinHandlers[pinName].get.apply(this, args);
    return descriptor;
  }

  return undefined;
};

Object.defineProperty(CCBlock.prototype, 'pinLines', {
  get: function () {
    var lineList = this.__cc_line_list_by_id__;
    return Object.keys(lineList).map(function (id) {
      return lineList[id];
    });
  }
});
CCBlock.prototype.pinHandlers = {};
var _default = CCBlock;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/circuit/CCLine.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/circuit/CCLine.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _stringGenerate = require("../../String/stringGenerate");

/***
 *
 * @param {CCBlock} u
 * @param {string} uPinName
 * @param {CCBlock} v
 * @param {string} vPinName
 * @param {boolean=} twoWay
 * @param {{id?:string}=} opt
 * @constructor
 */
function CCLine(u, uPinName, v, vPinName, twoWay, opt) {
  opt = opt || {};
  twoWay = !!twoWay;
  Object.defineProperty(this, 'id', {
    enumerable: true,
    writable: false,
    value: opt.id || (0, _stringGenerate.randomIdent)(32)
  });
  Object.defineProperty(this, 'u', {
    enumerable: true,
    writable: false,
    value: u
  });
  Object.defineProperty(this, 'v', {
    enumerable: true,
    writable: false,
    value: v
  });
  Object.defineProperty(this, 'uPinName', {
    enumerable: true,
    writable: false,
    value: uPinName
  });
  Object.defineProperty(this, 'vPinName', {
    enumerable: true,
    writable: false,
    value: vPinName
  });
  Object.defineProperty(this, 'twoWay', {
    enumerable: true,
    writable: false,
    value: twoWay
  });
  this.vToU = this.vToU.bind(this);
  this.uToV = this.uToV.bind(this);
  this.u.pinOn(this.uPinName, this.uToV);
  if (this.twoWay) this.v.pinOn(this.vPinName, this.vToU);
  this.u.__cc_line_list_by_id__[this.id] = this;
  this.v.__cc_line_list_by_id__[this.id] = this;
}

CCLine.prototype.remove = function () {
  this.u.pinOff(this.uPinName, this.uToV);
  if (this.twoWay) this.v.pinOff(this.vPinName, this.vToU);
  delete this.u.__cc_line_list_by_id__[this.id];
  delete this.v.__cc_line_list_by_id__[this.id];
};

CCLine.prototype.uToV = function () {
  var args = [this.vPinName].concat(Array.prototype.slice.call(arguments));
  this.v.pinReceives.apply(this.v, args);
};

CCLine.prototype.vToU = function () {
  var args = [this.uPinName].concat(Array.prototype.slice.call(arguments));
  this.u.pinReceives.apply(this.u, args);
};

var _default = CCLine;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Network/FileSaver.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/FileSaver.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.fileExist = fileExist;
exports.saveAs = saveAs;
exports.saveTextAs = saveTextAs;

var _BrowserDetector = _interopRequireDefault(require("../Detector/BrowserDetector"));


/***
 * @typedef {{revokeTimeout?: number, autoBom?:boolean }} FileSaverOpts
 *
 */
function fileExist(url) {
  var xhr = new XMLHttpRequest();
  xhr.open('HEAD', url, true);
  return new Promise(function (resolve) {
    xhr.onreadystatechange = function () {
      if (this.readyState === 4) {
        resolve(xhr.status === 200);
      }
    };

    xhr.onerror = function (err) {};

    xhr.send();
  });
}
/***
 *
 * @param url
 * @param name
 * @param {FileSaverOpts} opts
 */


function download(url, name, opts) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', url);
  xhr.responseType = 'blob';

  xhr.onload = function () {
    saveAs(xhr.response, name, opts);
  };

  xhr.onerror = function () {
    console.error('Could not download: ' + url);
  };

  xhr.send(null);
}

function bom(blob, opts) {
  if (typeof opts === undefined) opts = {
    autoBom: false
  };else if (typeof opts !== 'object') opts = {
    autoBom: !opts
  };

  if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
    return new Blob([String.fromCharCode(0xFEFF), blob], {
      type: blob.type
    });
  }

  return blob;
}

function corsEnabled(url) {
  var xhr = new XMLHttpRequest();
  return new Promise(function (resolve) {
    xhr.onload = function () {
      resolve(xhr.status >= 200 && xhr.status < 299);
    };

    xhr.onerror = function () {
      resolve(xhr.status >= 200 && xhr.status < 299);
    };

    xhr.open('HEAD', url, true);
    xhr.send();
  });
}

function click(node) {
  try {
    node.dispatchEvent(new MouseEvent('click'));
  } catch (e) {
    var evt = document.createEvent('MouseEvents');
    evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);
    node.dispatchEvent(evt);
  }
}

function normalSaveAs(blob, name, opts) {
  var URL = window.URL || window.webkitURL;
  var a = document.createElement('a');
  name = name || blob.name || 'download';
  a.download = name;
  a.rel = 'noopener';

  if (typeof blob === 'string') {
    a.href = blob;

    if (a.origin !== location.origin) {
      corsEnabled(a.href).then(function (result) {
        if (result) {
          download(blob, name, opts);
        } else {
          a.target = '_blank';
          click(a);
        }
      });
    } else {
      click(a);
    }
  } else {
    a.href = URL.createObjectURL(blob);
    setTimeout(function () {}, opts && opts.revokeTimeout || 4E4);
    setTimeout(function () {
      click(a);
    }, 0);
  }
}

function msSaveAs(blob, name, opts) {
  name = name || blob.name || 'download';

  if (typeof blob === 'string') {
    corsEnabled(blob).then(function (result) {
      if (result) {
        download(blob, name, opts);
      } else {
        var a = document.createElement('a');
        a.href = blob;
        a.target = '_blank';
        setTimeout(function () {
          click(a);
        });
      }
    });
  } else {
    navigator.msSaveOrOpenBlob(bom(blob, opts), name);
  }
}

function popupSaveAs(blob, name, opts, popup) {
  if (typeof blob === 'string') {
    download(blob, name, opts);
    return;
  }

  popup = popup || open('', '_blank');

  if (popup) {
    popup.document.title = name || 'download';
    popup.document.body.innerText = "downloading...";
  }

  name = name || blob.name || 'download';
  blob.name = name;
  var force = blob.type === 'application/octet-stream';
  var isSafari = _BrowserDetector.default.isSafari;
  var isChromeIOS = _BrowserDetector.default.isChromeIOS;
  var isMacOSWebView = _BrowserDetector.default.isMacOSWebView;
  var isSafariUnder13 = _BrowserDetector.default.browser.type === 'safari' && parseFloat(_BrowserDetector.default.browser.version) < 13;

  if ((!isChromeIOS || force && isSafari || isMacOSWebView) && typeof FileReader !== 'undefined' & !isSafariUnder13) {
    var reader = new FileReader();

    reader.onloadend = function () {
      var url = reader.result;
      url = isChromeIOS ? url : url.replace(/^data:[^;]*/, 'data:attachment/file');
      if (popup) popup.location.href = url;else location = url;
      popup = null;
    };

    reader.readAsDataURL(blob);
  } else {
    var URL = window.URL || window.webkitURL;
    var url = URL.createObjectURL(blob);
    if (popup) popup.location.href = url;else location.href = url;
    popup = null;
    setTimeout(function () {
      URL.revokeObjectURL(blob);
    }, opts && opts.revokeTimeout || 4E4);
  }
}
/***
 *
 * @param {string  | File | Blob}blob
 * @param {string=} name
 * @param {Object=} opts
 * @param {Object=} popup
 */


function saveAs(blob, name, opts, popup) {
  if (typeof window !== "object" || window !== self) {
    console.error("FileSaver is not support!");
  } else if ('wkSaveAs' in navigator) {
    navigator.wkSaveAs(blob, name, opts);
  } else if ('download' in HTMLAnchorElement.prototype && !_BrowserDetector.default.isMacOSWebView) {
    normalSaveAs(blob, name, opts);
  } else if ('msSaveOrOpenBlob' in navigator) {
    msSaveAs(blob, name, opts);
  } else {
    setTimeout(function () {
      popupSaveAs(blob, name, opts, popup);
    }, 100);
  }
}

function saveTextAs(text, name, opts) {
  var blob = new Blob([text], {
    type: 'text/plain'
  });
  saveAs(blob, name, opts);
}
};

moduleFactories["node_modules/absol/src/Network/RemoteThread.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/RemoteThread.tpl ***/
module.exports = "function safeThrow(error) {\r\n    setTimeout(function () {\r\n        throw  error;\r\n    }, 0);\r\n}\r\n\r\nfunction EventEmitter() {\r\n    if (!this._azar_extendEvents) {\r\n        Object.defineProperty(this, '_azar_extendEvents', {\r\n            enumerable: false,\r\n            value: this._azar_extendEvents || { supported: {}, prioritize: {}, nonprioritize: {} }\r\n        });\r\n        Object.defineProperty(this, '__azar_force', {\r\n            value: true,\r\n            enumerable: false\r\n        });\r\n    }\r\n}\r\n\r\n\r\nEventEmitter.prototype.defineEvent = function (name) {\r\n    if (name instanceof Array) {\r\n        for (var i = 0; i < name.length; ++i)\r\n            this._azar_extendEvents.supported[name[i]] = true;\r\n    }\r\n    else\r\n        this._azar_extendEvents.supported[name] = true;\r\n    return this;\r\n};\r\n\r\nEventEmitter.prototype.isSupportedEvent = function (name) {\r\n    return true;\r\n};\r\n\r\n\r\nEventEmitter.prototype.emit = function (eventName, data) {\r\n    this.fire.apply(this, arguments);\r\n};\r\n\r\nEventEmitter.prototype.fire = function (eventName, data) {\r\n    var others = Array.prototype.slice.call(arguments, 1);\r\n    if (this.isSupportedEvent(eventName)) {\r\n        var listenerList;\r\n        var i;\r\n        if (this._azar_extendEvents.prioritize[eventName]) {\r\n            listenerList = this._azar_extendEvents.prioritize[eventName].slice();\r\n            for (i = 0; i < listenerList.length; ++i) {\r\n                try {\r\n                    listenerList[i].wrappedCallback.apply(this, others);\r\n                } catch (e) {\r\n                   safeThrow(e);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (this._azar_extendEvents.nonprioritize[eventName]) {\r\n            listenerList = this._azar_extendEvents.nonprioritize[eventName].slice();\r\n            for (i = 0; i < listenerList.length; ++i) {\r\n                try {\r\n                    listenerList[i].wrappedCallback.apply(this, others);\r\n                } catch (e) {\r\n                    safeThrow(e);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        if (this.dispatchEvent) {\r\n            var event = new Event(eventName);\r\n            data && Object.assign(event, data);\r\n            this.dispatchEvent(event);\r\n        }\r\n        else\r\n            throw new Error(\"Not support event \" + eventName);\r\n    }\r\n    return this;\r\n};\r\n\r\n\r\nEventEmitter.prototype.eventEmittorOnWithTime = function (isOnce, arg0, arg1, arg2) {\r\n    if (typeof arg0 == 'object') {\r\n        for (var key in arg0) {\r\n            this.eventEmittorOnWithTime(isOnce, key, arg0[key]);\r\n        }\r\n        return this;\r\n    }\r\n    else {\r\n        if (typeof arg1 == 'object') {\r\n            return this.eventEmittorOnWithTime(isOnce, arg0, arg1.callback, arg1.cap);\r\n        }\r\n        else {\r\n            var eventArr = this._azar_extendEvents[arg2 ? 'prioritize' : 'nonprioritize'][arg0] || [];\r\n            var eventIndex = -1;\r\n            for (var i = 0; i < eventArr.length; ++i) {\r\n                if (eventArr[i].wrappedCallback == arg1) {\r\n                    eventIndex = i;\r\n                    break;\r\n                }\r\n            }\r\n            if (eventIndex < 0) {\r\n                var event = { isOnce: isOnce, eventName: arg0, callback: arg1, cap: !!arg2 };\r\n                //wrappedCallback will be call\r\n                if (isOnce) {\r\n                    event.wrappedCallback = function () {\r\n                        event.callback.apply(this, arguments);\r\n                        this.off(event.eventName, event.wrappedCallback, event.cap);\r\n                    };\r\n                }\r\n                else {\r\n                    event.wrappedCallback = event.callback;\r\n                }\r\n\r\n                if (!this.isSupportedEvent(arg0)) {\r\n                    if (this.addEventListener) {\r\n                        this.addEventListener(arg0, event.wrappedCallback, !!arg2);\r\n                    }\r\n                    else {\r\n                        this.attachEvent('on' + arg0, arg1, !!arg2);\r\n                    }\r\n                }\r\n\r\n                eventArr.push(event);\r\n                this._azar_extendEvents[arg2 ? 'prioritize' : 'nonprioritize'][arg0] = eventArr;\r\n            }\r\n            else {\r\n                console.warn(\"dupplicate event\");\r\n            }\r\n\r\n        }\r\n        return this;\r\n    }\r\n};\r\n\r\n\r\nEventEmitter.prototype.on = function (arg0, arg1, arg2) {\r\n    this.eventEmittorOnWithTime(false, arg0, arg1, arg2);\r\n    return this;\r\n};\r\n\r\n\r\nEventEmitter.prototype.once = function (arg0, arg1, arg2) {\r\n    this.eventEmittorOnWithTime(true, arg0, arg1, arg2);\r\n    return this;\r\n};\r\n\r\nEventEmitter.prototype.off = function (arg0, arg1, arg2) {\r\n    if (typeof arg0 == 'object') {\r\n        for (var key in arg0) {\r\n            this.off(key, arg0[key]);\r\n        }\r\n        return this;\r\n    }\r\n    else {\r\n        if (typeof arg1 == 'object') {\r\n            return this.off(arg0, arg1.callback, arg1.cap);\r\n        }\r\n        else {\r\n            var eventArr = this._azar_extendEvents[arg2 ? 'prioritize' : 'nonprioritize'][arg0] || [];\r\n            var newEventArray = [];\r\n            for (var i = 0; i < eventArr.length; ++i) {\r\n                var event = eventArr[i];\r\n                if (event.wrappedCallback == arg1) {\r\n                    //Dont add to newEventArray\r\n                    if (this.isSupportedEvent(arg0)) {\r\n                    }\r\n                    else {\r\n                        if (this.removeEventListener) {\r\n                            this.removeEventListener(event.eventName, event.wrappedCallback, !!event.cap);\r\n                        }\r\n                        else {\r\n                            this.detachEvent('on' + event.eventName, event.wrappedCallback, !!event.cap);\r\n                        }\r\n                    }\r\n                }\r\n                else {\r\n                    newEventArray.push(event);\r\n                }\r\n            }\r\n            this._azar_extendEvents[arg2 ? 'prioritize' : 'nonprioritize'][arg0] = newEventArray;\r\n            return this;\r\n        }\r\n    }\r\n\r\n};\r\n\r\n\r\nvar TYPE_WORKER = 'WORKER';\r\n\r\n/**\r\n *\r\n * @param {Worker|HTMLIFrameElement|WorkerGlobalScope|Window=} host\r\n */\r\nfunction IFrameBridge(host) {\r\n    EventEmitter.call(this);\r\n    /***\r\n     *\r\n     * @type {Worker|HTMLIFrameElement|WorkerGlobalScope|Window|WorkerGlobalScope|Window}\r\n     */\r\n    this.host = host || self;\r\n    this.sender = null;\r\n    this.receiver = null;\r\n    this.origin = null;\r\n    this.type = 'NOT_DETECT';\r\n    this.id = \"UNSET\";\r\n\r\n    this.sync = this._detectHost().then(() => this._attach());\r\n\r\n    this.__azarResolveCallbacks = {};\r\n    this.__azarRejectCallbacks = {};\r\n}\r\n\r\nIFrameBridge.prototype._detectHost = function () {\r\n          this.type = TYPE_WORKER;\r\n          this.sender = this.host;\r\n          this.receiver = this.host;\r\n          return Promise.resolve();\r\n};\r\n\r\n\r\nIFrameBridge.prototype._attach = function () {\r\n    if (this.receiver.addEventListener) {\r\n        this.receiver.addEventListener(\"message\", this.__azarMessageListener.bind(this), false);\r\n    }\r\n    else if (this.receiver.attachEvent) {\r\n        this.receiver.attachEvent(\"onmessage\", this.__azarMessageListener.bind(this));\r\n    }\r\n    else {\r\n        this.receiver.onmessage = this.__azarMessageListener.bind(this);\r\n    }\r\n};\r\n\r\n\r\nIFrameBridge.getInstance = function () {\r\n    if (!IFrameBridge.shareInstance) {\r\n        var origin = location.origin;\r\n        var rootOrigin = IFrameBridge.getParentUrl().match(/^(http|https):\\/\\/[^/]+/);\r\n        if (rootOrigin) {\r\n            rootOrigin = rootOrigin[0];\r\n        }\r\n        else {\r\n            rootOrigin = origin;\r\n        }\r\n\r\n        // IFrameBridge.shareInstance = new IFrameBridge(self, rootOrigin == origin? undefined: \"*\" || rootOrigin );\r\n        var host = self;\r\n        IFrameBridge.shareInstance = new IFrameBridge(host, rootOrigin);\r\n    }\r\n    return IFrameBridge.shareInstance;\r\n};\r\n\r\n\r\nObject.defineProperties(IFrameBridge.prototype, Object.getOwnPropertyDescriptors(EventEmitter.prototype));\r\nIFrameBridge.prototype.constructor = IFrameBridge;\r\n\r\n\r\nIFrameBridge.getParentUrl = function () {\r\n    var parentUrl = (window.location != window.parent.location)\r\n        ? document.referrer\r\n        : document.location.href;\r\n    return parentUrl;\r\n};\r\n\r\nIFrameBridge.prototype.__azarMessageListener = function (event) {\r\n    this.__azarHandleData(event.data);\r\n};\r\n\r\n\r\nIFrameBridge.prototype.__azarHandleData = function (data) {\r\n    if (data.bridgeId !== this.id) return;\r\n    if (data.type) {\r\n        if (data.type == \"INVOKE\") {\r\n            try {\r\n                var result = this.__azarSelfInvoke(data.name, data.params);\r\n                if (result && typeof result.then == 'function') {\r\n                    result.then(function (result) {\r\n                        this.__azarResolve(data.taskId, result);\r\n                    }.bind(this))\r\n                        .catch(function (err) {\r\n                            safeThrow(err);\r\n                            this.__azarResolve(data.taskId, null, err);\r\n                        }.bind(this));\r\n                }\r\n                else {\r\n                    this.__azarResolve(data.taskId, result);\r\n                }\r\n            } catch (err) {\r\n                safeThrow(err);\r\n                this.__azarResolve(data.taskId, null, err);\r\n            }\r\n        }\r\n        else if (data.type == \"INVOKE_RESULT\") {\r\n            if (this.__azarResolveCallbacks[data.taskId]) {\r\n                if (data.error) {\r\n                    this.__azarRejectCallbacks[data.taskId](data.error);\r\n                }\r\n                else {\r\n                    this.__azarResolveCallbacks[data.taskId](data.result);\r\n                }\r\n                delete this.__azarResolveCallbacks[data.taskId];\r\n                delete this.__azarRejectCallbacks[data.taskId];\r\n            }\r\n        }\r\n        else if (data.type == \"EMIT\") {\r\n            this.fire.apply(this, data.params);\r\n        }\r\n        else this.fire('message', data, this);\r\n    }\r\n};\r\n\r\n\r\nIFrameBridge.prototype.__azarResolve = function (taskId, result, error) {\r\n    var data = {\r\n        type: \"INVOKE_RESULT\",\r\n        taskId: taskId,\r\n        result: result,\r\n        error: error,\r\n        bridgeId: this.id\r\n    };\r\n\r\n    if (this.origin) {\r\n        this.sender.postMessage(data, this.origin);\r\n    }\r\n    else {\r\n        this.sender.postMessage(data);\r\n    }\r\n};\r\n\r\n\r\nIFrameBridge.prototype.__azarSelfInvoke = function (name, params) {\r\n    if (typeof this[name] == 'function') {\r\n        return this[name].apply(this, params);\r\n    }\r\n    else {\r\n        return this[name];\r\n    }\r\n};\r\n\r\n\r\nIFrameBridge.prototype.emit = function () {\r\n    var params = [];\r\n    params.push.apply(params, arguments);\r\n    this.sync.then(function () {\r\n        var data = {\r\n            type: \"EMIT\",\r\n            params: params,\r\n            bridgeId: this.id\r\n        };\r\n        if (this.origin) {\r\n            this.sender.postMessage(data, this.origin);\r\n        }\r\n        else {\r\n            this.sender.postMessage(data);\r\n        }\r\n    }.bind(this));\r\n    return this;\r\n};\r\n\r\n\r\nIFrameBridge.prototype.invoke = function (name) {\r\n    var params = [];\r\n    params.push.apply(params, arguments);\r\n    params.shift();\r\n    return this.sync.then(function () {\r\n        var indent = randomIdent(32);\r\n        var data = {\r\n            type: 'INVOKE',\r\n            params: params,\r\n            taskId: indent,\r\n            name: name,\r\n            bridgeId: this.id\r\n        };\r\n        if (this.origin) {\r\n            this.host.postMessage(data, this.origin);\r\n        }\r\n        else {\r\n            this.host.postMessage(data);\r\n        }\r\n        return new Promise(function (resolve, reject) {\r\n            this.__azarResolveCallbacks[indent] = resolve;\r\n            this.__azarRejectCallbacks[indent] = reject;\r\n        }.bind(this));\r\n    }.bind(this));\r\n};\r\n\r\nIFrameBridge.prototype.importScriptURLs = function () {\r\n    return this.invoke.apply(this, ['_receiveScriptURLs'].concat(Array.prototype.slice.call(arguments)));\r\n};\r\n\r\nIFrameBridge.prototype.importScript = function (code) {\r\n    var blob = new Blob([code], { type: 'application/javascript' });\r\n    var url = URL.createObjectURL(blob);\r\n    return this.importScriptURLs(url);\r\n};\r\n\r\n\r\nIFrameBridge.prototype.createMethod = function (name, fx) {\r\n    this[name] = function () {\r\n        return this.invoke.apply(this, [name].concat(Array.prototype.slice.call(arguments)));\r\n    };\r\n    return this.invoke.apply(this, ['_receiveMethod', name, fx.toString()]);\r\n};\r\n\r\n\r\nIFrameBridge.prototype._receiveScriptURLs = function () {\r\n    if (self.importScripts) {\r\n        self.importScripts.apply(self, arguments);\r\n    }\r\n};\r\n\r\n\r\nIFrameBridge.prototype._receiveMethod = function (name, code) {\r\n    this[name] = (new Function('return ' + code))();\r\n};\r\n\r\n\r\nvar IFrameBridge_prototype_descriptors = Object.getOwnPropertyDescriptors(IFrameBridge.prototype);\r\ndelete IFrameBridge_prototype_descriptors.constructor;\r\n\r\nObject.defineProperties(self, IFrameBridge_prototype_descriptors);\r\nIFrameBridge.call(self, self);";

};

moduleFactories["node_modules/absol/src/Network/Thread.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/Thread.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _IFrameBridge = _interopRequireDefault(require("./IFrameBridge"));

var _OOP = _interopRequireDefault(require("../HTML5/OOP"));

var _RemoteThread = _interopRequireDefault(require("./RemoteThread.tpl"));


/***
 *
 * @param {{methods?:Object, extendCode: string}} opt
 * @constructor
 */
function Thread(opt) {
  this.worker = new Worker(this._makeCodeUrl(opt));

  _IFrameBridge.default.call(this, this.worker);

  this._attachClientMethods(opt.methods);
}

Thread.prototype._makeCodeUrl = function (opt) {
  var code = [this._makeLibCode(opt.libs), _RemoteThread.default, this._makeMethodCode(opt.methods), this._makePropCode(opt.props), opt.extendCode || ''].join('\n\n');
  var blob = new Blob([code], {
    type: 'application/javascript'
  });
  var url = URL.createObjectURL(blob);
  return url;
};

Thread.prototype._makePropCode = function (props) {
  if (!props) return '';
  return 'Object.assign(self, ' + JSON.stringify(props) + ');';
};

Thread.prototype._makeLibCode = function (libs) {
  if (!libs) return '';
  return libs.map(function (lib) {
    return 'self.importScripts(' + JSON.stringify(lib) + ');';
  }).join('\n');
};

Thread.prototype._makeMethodCode = function (methods) {
  if (!methods) return '';
  return Object.keys(methods).map(function (key) {
    var fx = methods[key];

    if (typeof fx === "function") {
      fx = fx.toString();
      return 'self[' + JSON.stringify(key) + '] = ' + fx;
    }
  }).join('\n\n');
};

Thread.prototype._attachClientMethods = function (methods) {
  if (!methods) return '';
  Object.keys(methods).reduce(function (ac, name) {
    ac[name] = function () {
      return this.invoke.apply(this, [name].concat(Array.prototype.slice.call(arguments)));
    };

    return ac;
  }, this);
};

_OOP.default.mixClass(Thread, _IFrameBridge.default);

var _default = Thread;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/JSMaker/generator.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/JSMaker/generator.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.generateJSVariable = generateJSVariable;
exports.copyJSVariable = copyJSVariable;
exports.replaceDateStringJSVariable = replaceDateStringJSVariable;
exports.isJSVariableEqual = isJSVariableEqual;

function generateJSVariable(obj, indent) {
  indent = indent || '';
  var childIndent = indent + '    ';

  if (obj === null) {
    return 'null';
  } else if (obj instanceof Date) {
    return 'new Date(' + obj.getTime() + ')';
  } else if (obj instanceof Array) {
    if (obj.length === 0) return '[]';
    return '[\n' + obj.map(function (it) {
      return childIndent + generateJSVariable(it, childIndent);
    }).join(',\n') + '\n' + indent + ']';
  } else if (obj instanceof Error) {
    return generateJSVariable({
      message: obj.message,
      stack: obj.stack
    });
  } else if (typeof obj === 'object') {
    var keys = Object.keys(obj);
    if (keys.length === 0) return '{}';
    return '{\n' + keys.map(function (key) {
      var value = obj[key];
      if (!key.match(/^[a-zA-Z_$]([a-zA-Z_0-9$]*)$/)) key = JSON.stringify(key);
      return childIndent + key + ': ' + generateJSVariable(value, childIndent);
    }).join(',\n') + '\n' + indent + '}';
  } else if (obj === undefined) {
    return 'undefined';
  } else {
    return JSON.stringify(obj);
  }
}
/***
 *
 * @param o
 * @param {Array<{test, replace}>| null=} replacers
 * @returns {*}
 */


function copyJSVariable(o, replacers) {
  var replacer;

  if (replacers && replacers.length > 0) {
    replacer = replacers.find(rp => {
      return rp.test.apply(rp, [o].concat(Array.prototype.slice.call(arguments, 2)));
    });

    if (replacer) {
      return replacer.replace.apply(replacer, [o].concat(Array.prototype.slice.call(arguments, 2)));
    }
  }

  if (o === null) return null;
  if (o === undefined) return undefined;
  var type = typeof o;
  if (type === "boolean") return o;
  if (o instanceof Date || typeof o.getTime === "function") return new Date(o.getTime());
  if (type === "number") return o;
  if (type === "string") return o + '';

  if (typeof o.map === "function") {
    return o.map((it, i) => copyJSVariable(it, replacers, i, o));
  }

  if (type === "object" && o.constructor === Object) {
    return Object.keys(o).reduce((ac, cr) => {
      ac[cr] = copyJSVariable(o[cr], replacers, cr, o);
      return ac;
    }, {});
  }

  return o;
}

function replaceDateStringJSVariable(o) {
  return copyJSVariable(o, [{
    test: x => {
      return typeof x === "string" && x.match(/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s+([a-zA-Z]{3})\s+[\d\s:]+GMT[\d+]+\s*\([^)]+\)$/) && !isNaN(new Date(x).getTime());
    },
    replace: x => new Date(x)
  }]);
}
/***
 *
 * @param a
 * @param b
 * @return {boolean}
 */


function isJSVariableEqual(a, b) {
  if (a === b) return true; //1

  var tA = typeof a;
  var tB = typeof b;
  if (tA !== tB) return false; //2

  if (!a !== !b) return false;
  if (tA === 'string') return false; //because 1 & 2

  if (tA === "number") {
    if (isNaN(a) && isNaN(b)) return true; //because 2

    return false; //because 1
  }

  var aIsDate = a instanceof Date;
  var bIsDate = b instanceof Date;
  if (aIsDate !== bIsDate) return false;
  if (aIsDate) return isJSVariableEqual(a.getTime(), b.getTime());
  var aIsArray = a instanceof Array;
  var bIsArray = a instanceof Array;
  if (aIsArray !== bIsArray) return false;
  var i;

  if (aIsArray) {
    if (a.length !== b.length) return false;

    for (i = 0; i < a.length; ++i) {
      if (!isJSVariableEqual(a[i], b[i])) return false;
    }

    return true;
  } //object


  if (a.equals) return a.equals(b);
  var aKeys = Object.keys(a);
  var bKeys = Object.keys(b);
  aKeys.sort();
  bKeys.sort();
  if (!isJSVariableEqual(aKeys, bKeys)) return false;

  for (i = 0; i < aKeys.length; ++i) {
    if (!isJSVariableEqual(a[aKeys[i]], b[aKeys[i]])) return false;
  }

  return true;
}
};

moduleFactories["node_modules/absol/src/AppPattern/ShareConfiguration.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/ShareConfiguration.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _safeThrow = _interopRequireDefault(require("../Code/safeThrow"));


function ShareConfiguration() {
  Object.defineProperty(this, 'data', {
    value: {},
    enumerable: true,
    writable: false
  });
  Object.defineProperty(this, '__listener__', {
    value: {},
    enumerable: false,
    writable: false
  });
}
/***
 *
 * @param {string} key
 * @param {*|undefined} value
 */


ShareConfiguration.prototype.set = function (key, value) {
  var prev = this.data[key];
  this.data[key] = value;

  if (value !== prev) {
    this.emit(key, value, this);
  }

  return this;
};

ShareConfiguration.prototype.emit = function (key) {
  var args = Array.prototype.slice.call(arguments, 1);
  var self = this;

  if (this.__listener__[key]) {
    this.__listener__[key].slice().forEach(function (f) {
      try {
        f.apply(self, args);
      } catch (err) {
        (0, _safeThrow.default)(err);
      }
    });
  }

  return this;
};
/***
 *
 * @param {string|Object} key
 * @param {function=}listener
 * @return {ShareConfiguration}
 */


ShareConfiguration.prototype.on = function (key, listener) {
  if (typeof key === "string") {
    if (!this.__listener__[key]) this.__listener__[key] = [];

    if (this.__listener__[key].indexOf(listener) < 0) {
      this.__listener__[key].push(listener);
    }
  } else if (typeof key === "object") {
    for (var key1 in key) {
      this.on(key1, key[key1]);
    }
  }

  return this;
};
/***
 *
 * @param {string|Object} key
 * @param {function=}listener
 * @return {ShareConfiguration}
 */


ShareConfiguration.prototype.off = function (key, listener) {
  if (typeof key === "string" && this.__listener__[key]) {
    var idx = this.__listener__[key].indexOf(listener);

    if (idx >= 0) {
      this.__listener__[key].splice(idx, 1);
    }
  } else if (typeof key === "object") {
    for (var key1 in key) {
      this.off(key1, key[key1]);
    }
  }

  return this;
};
/***
 *
 * @param {string} key
 * @param {*=} defaultValue
 * @return {*}
 */


ShareConfiguration.prototype.get = function (key, defaultValue) {
  return this.data[key];
};

ShareConfiguration.prototype.contains = function (key) {
  return this.data[key] === undefined;
};

ShareConfiguration.instance = new ShareConfiguration();
var _default = ShareConfiguration;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/DataStructure/Array.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/DataStructure/Array.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.arrayUnique = arrayUnique;
exports.arrayRemoveNone = arrayRemoveNone;
exports.arrayIntersection = arrayIntersection;
exports.arrayIsSubset = arrayIsSubset;
exports.arrayCompare = arrayCompare;
exports.arrayShuffle = arrayShuffle;

/***
 *
 * @param {(string|number|boolean|null)[]} arr
 * @returns {(string|number|boolean|null)[]}
 */
function arrayUnique(arr) {
  var dict = {};
  return arr.reduce(function (ac, cr) {
    var key = typeof cr + '//' + cr;
    if (key in dict) return ac;
    ac.push(cr);
    dict[key] = true;
    return ac;
  }, []);
}
/***
 *
 * @param {[]}arr
 * @return {[]}
 */


function arrayRemoveNone(arr) {
  return arr.filter(function (c) {
    return c !== null && c !== undefined;
  });
}

function arrayIntersection(a1, a2) {
  var dict1 = a1.reduce((ac, cr) => {
    ac[typeof cr + cr] = true;
    return ac;
  }, {});
  var dict2 = a2.reduce((ac, cr) => {
    ac[typeof cr + cr] = true;
    return ac;
  }, {});
  var dictAdded = {};
  var res = [];
  var i, k, x;

  for (i = 0; i < a1.length; ++i) {
    x = a1[i];
    k = typeof x + x;

    if (dict1[k] && dict2[k] && !dictAdded[k]) {
      res.push(x);
      dictAdded[k] = true;
    }
  }

  for (i = 0; i < a2.length; ++i) {
    x = a2[i];
    k = typeof x + x;

    if (dict1[k] && dict2[k] && !dictAdded[k]) {
      res.push(x);
      dictAdded[k] = true;
    }
  }

  return res;
}

function arrayIsSubset(childArr, parentArr) {
  if (!(childArr instanceof Array) || !(parentArr instanceof Array)) return false;
  var dict2 = parentArr.reduce((ac, cr) => {
    ac[typeof cr + cr] = true;
    return ac;
  }, {});
  var res = true;
  var n = childArr.length;
  var k;

  for (var i = 0; i < n; ++i) {
    k = typeof childArr[i] + childArr[i];

    if (!dict2[k]) {
      res = false;
      break;
    }
  }

  return res;
}
/***
 *
 * @param {[]}a1
 * @param {[]}a2
 * @param {boolean=} order
 * @returns {boolean}
 */


function arrayCompare(a1, a2, order) {
  if (a1 === a2) return true;
  if (!a1 || !a2) return false;
  if (a1.length !== a2.length) return false;
  if (!a1.sort || !a2.sort) return false;

  if (!order) {
    a1.sort();
    a2.sort();
  }

  var n = a1.length;

  for (var i = 0; i < n; ++i) {
    if (a1[i] !== a2[i]) return false;
  }

  return true;
}
/***
 *
 * @param {Array} arr
 */


function arrayShuffle(arr) {
  var temp;
  var j;

  for (var i = 0; i < arr.length; ++i) {
    j = Math.floor(Math.random() * arr.length);

    if (i !== j) {
      temp = arr[i];
      arr[i] = arr[j];
      arr[j] = temp;
    }
  }
}
};

moduleFactories["node_modules/absol/src/Network/url.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/url.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.resolveUrl = resolveUrl;

/***
 *
 * @param {string} current
 * @param {string} target
 * @return {string}
 */
function resolveUrl(current, target) {
  current = current.trim();
  target = target.trim();
  if (target.match(/[a-z]+:\/\//)) return target;
  var origin = current.match(/^[a-z]+:\/\/[a-zA-Z0-9._]+(:[0-9]+)?/);
  if (origin) origin = origin[0];
  var cPath = current.replace(/^[a-z]+:\/\/[a-zA-Z0-9._]+(:[0-9]+)?/, '');
  if (target.startsWith('/')) return origin ? origin + target : target;
  var cParts = cPath.split('/');
  cParts.pop();
  var tParts = target.split('/');
  var t; //todo: normal current

  while (tParts.length > 0) {
    t = tParts.shift().trim();

    if (t === '..') {
      cParts.pop();
    } else if (t !== '.' && t.length > 0) {
      cParts.push(t);
    }
  }

  if (origin) {
    if (cParts[0].length === 0) cParts.shift();
    cParts.unshift(origin);
  }

  return cParts.join('/');
}
};

moduleFactories["node_modules/absol/src/Network/remoteRequireNodeAsync.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/remoteRequireNodeAsync.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = remoteRequireNodeAsync;

var _url = require("./url");

function remoteRequireNodeAsync(filename, entry) {
  var moduleCache = {};
  var factors = {};
  var resources = {};

  function getFileName(path) {
    return path.split('/').pop();
  }

  function getExtension(fileName) {
    return fileName.split('.').slice(1).pop() || null;
  }

  function require(currentLoc, fn) {
    var fullPath = (0, _url.resolveUrl)(currentLoc, fn);
    if (factors[fullPath + '.js']) fullPath = fullPath + '.js';
    var filename = getFileName(fullPath); //__filename

    var module = moduleCache[fullPath];

    if (!module) {
      if (factors[fullPath]) {
        module = {
          'exports': {}
        };
        moduleCache[fullPath] = module;
        factors[fullPath](require.bind(null, fullPath), module, module.exports, (0, _url.resolveUrl)(fullPath, '.'), filename, window);
      } else {
        throw new Error("Could not find module :" + fullPath);
      }
    }

    return module.exports;
  }

  function findAllRequire(s) {
    var regex0 = /[^a-zA-Z_.0-9]require\s*\([^\)]+\)/gm;
    var regex1 = /require\s*\([^)]+\)/gm;
    var regex2 = /\([^)]+\)/gm;
    var es = s.match(regex0);
    if (!es) return [];
    return es.map(function (s) {
      s = s.match(regex1)[0];
      s = s.match(regex2)[0];
      s = s.replace(/['"()]/gm, '');
      if (!getExtension(getFileName(s))) s += '.js';
      return s;
    });
  }

  function fetchResource(fullPath) {
    if (resources[fullPath]) return Promise.resolve();
    var resource = {};
    resources[fullPath] = resource;
    var ext = getExtension(getFileName(fullPath));
    resource.sync = fetch(fullPath, {
      cache: "no-cache"
    }).then(res => res.text()).then(text => {
      resource.text = text;

      switch (ext) {
        case 'js':
          factors[fullPath] = new Function('require', 'module', 'exports', '__dir', '__filename', 'global', text);
          break;

        case 'json':
          factors[fullPath] = true;
          moduleCache[fullPath] = {
            exports: JSON.parse(text)
          };
          break;

        default:
          factors[fullPath] = true;
          moduleCache[fullPath] = {
            exports: text
          };
      }

      var requiredNodes;

      if (ext === 'js') {
        requiredNodes = findAllRequire(text);
        var syncs = requiredNodes.map(ident => fetchResource((0, _url.resolveUrl)(fullPath, ident)));
        return Promise.all(syncs);
      }
    });
    return resource.sync;
  }

  var absoluteEntry = location.href;

  function requireCode(filename, entry, fileList) {
    if (!fileList) fileList = {};
    if (!entry) entry = absoluteEntry;
    var fullPath = (0, _url.resolveUrl)(entry, filename);

    if (fileList[fullPath] === 'pending') {
      return Promise.resolve();
    } else if (fileList[fullPath] !== undefined && fileList[fullPath] !== 'pending') {
      return Promise.resolve();
    }

    fileList[fullPath] = true;
    fileList[fullPath] = 'pending';
    return fetch(fullPath, {
      cache: "no-cache"
    }).then(res => res.text()).then(text => {
      fileList[fullPath] = text;
      var requirePath = findAllRequire(text);
      var waitCode = requirePath.map(function (e) {
        return requireCode(e, fullPath, fileList);
      });
      return Promise.all(waitCode).then(function () {
        return fileList;
      });
    });
  }

  if (!entry) entry = absoluteEntry;
  if (!getExtension(filename)) filename += '.js';
  var fullPath = (0, _url.resolveUrl)(entry, filename);
  return fetchResource(fullPath).then(() => {
    return require('', fullPath);
  });
}
};

moduleFactories["node_modules/absol/src/Math/Polygon.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/Polygon.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("./Vec2"));


/***
 *
 * @param {Vec2[]} vertices
 * @constructor
 */
function Polygon(vertices) {
  this.vertices = vertices;
}
/***
 *
 * @param {Vec2} P
 * @returns {-1|0|1}
 */


Polygon.prototype.pointLocalIn = function (P) {
  var A = this.vertices[this.vertices.length - 1];
  var B;
  var AB, PA, PB;
  var t, x;
  var count = 0;

  for (var i = 0; i < this.vertices.length; ++i) {
    B = this.vertices[i];
    PA = A.sub(P);
    PB = B.sub(P);

    if (PA.cross(PB) === 0 && PA.dot(PB) <= 0) {
      return 0;
    }

    AB = B.sub(A);

    if (A.y !== B.y) {
      t = -PA.y / AB.y;
      x = A.x + AB.x * t;

      if (t >= 0 && t < 1 && x > P.x) {
        count++;
      }
    }

    A = B;
  }

  return count % 2 === 1 ? 1 : -1;
};

Polygon.prototype.getPathString = function () {
  var vts = this.vertices;
  var res = 'M' + vts[0].x + ' ' + vts[0].y;

  for (var i = 1; i < vts.length; ++i) {
    res += 'L' + vts[i].x + ' ' + vts[i].y;
  }

  res += 'z';
  return res;
};

Polygon.make = function (vertices) {
  return new Polygon(vertices);
};

var _default = Polygon;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/HTML5/DynamicCSS.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/HTML5/DynamicCSS.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function DynamicCSS() {
  this.elt = document.createElement('style');
  this.data = {};
  this.state = 'STANDBY';
  this.start();
}
/**
 *
 * @returns {this}
 */


DynamicCSS.prototype.commit = function () {
  this.elt.innerHTML = Object.keys(this.data).map(ruleQuery => {
    var rule = this.data[ruleQuery];
    return [ruleQuery + ' {', '    ' + Object.keys(rule).map(name => name + ': ' + rule[name] + ';').join('\n'), '}'].join('\n');
  }).join('\n\n');
  return this;
};

DynamicCSS.prototype.start = function () {
  if (this.state !== 'STANDBY' && this.state !== 'STOP') return;
  this.state = 'RUNNING';
  document.head.appendChild(this.elt);
  return this;
};

DynamicCSS.prototype.stop = function () {
  if (this.state !== 'RUNNING') return;
  this.elt.remove();
  return this;
};

DynamicCSS.prototype.destroy = function () {
  this.stop();
  if (this.state !== 'STOP') return;
  this.elt = null;
  return this;
};
/***
 *
 * @param {string} ruleQuery
 * @param {string} name
 * @param {string} value
 * @returns {this}
 */


DynamicCSS.prototype.setProperty = function (ruleQuery, name, value) {
  this.data[ruleQuery] = this.data[ruleQuery] || {};
  this.data[ruleQuery][name] = value;
  return this;
};
/**
 *
 * @param ruleQuery
 * @param name
 * @returns {*|undefined}
 */


DynamicCSS.prototype.getProperty = function (ruleQuery, name) {
  var rule = this.data[ruleQuery];
  return rule ? rule[name] : undefined;
};
/***
 *
 * @param ruleQuery
 * @param property
 * @returns {DynamicCSS}
 */


DynamicCSS.prototype.removeProperty = function (ruleQuery, property) {
  var rule = this.data[ruleQuery];
  if (rule) delete rule[property];
  return this;
};
/***
 *
 * @param ruleQuery
 * @param {object} properties
 * @returns {this}
 */


DynamicCSS.prototype.setRule = function (ruleQuery, properties) {
  this.data[ruleQuery] = Object.assign({}, properties);
  return this;
};
/***
 *
 * @param ruleQuery
 * @param {object} properties
 * @returns {this}
 */


DynamicCSS.prototype.modifyRule = function (ruleQuery, properties) {
  this.data[ruleQuery] = Object.assign(this.data[ruleQuery] || {}, properties);
  return this;
};
/***
 *
 * @param {string} ruleQuery
 * @returns {object}
 */


DynamicCSS.prototype.getRule = function (ruleQuery) {
  return this.data[ruleQuery];
};
/**
 *
 * @param {string} ruleQuery
 * @returns {this}
 */


DynamicCSS.prototype.removeRule = function (ruleQuery) {
  delete this.data[ruleQuery];
  return this;
};
/***
 *
 * @param {object} rules
 * @returns {this}
 */


DynamicCSS.prototype.setRules = function (rules) {
  Object.keys(rules).forEach(key => this.setRule(key, rules[key]));
  return this;
};

DynamicCSS.prototype.getRules = function () {
  return this.data;
};

DynamicCSS.prototype.modifyRules = function (rules) {
  Object.keys(rules).forEach(key => this.modifyRule(key, rules[key]));
  return this;
};

var _default = DynamicCSS;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Pharse/DPTokenizer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Pharse/DPTokenizer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function DPTokenizer(opt) {
  opt = opt || {};
  if (opt.elementRegexes) this.elementRegexes = opt.elementRegexes;

  this._combineTokenRegex();
}

DPTokenizer.prototype.elementRegexes = [['string', /("(?:[^"\\]|\\.)*?")|('(?:[^'\\]|\\.)*?')/], ['number', /[+-]?(\d+([.]\d*)?([eE][+-]?\d+)?|[.]\d+([eE][+-]?\d+)?)/], ['word', /[_a-zA-Z][_a-zA-Z0-9]*/], ['dsymbol', /\+\+|--/], ['symbol', /[^\s_a-zA-Z0-9]/], ['skip', /[\s\r\n]+/]];

DPTokenizer.prototype._combineTokenRegex = function () {
  var tokenRegexSource = this.elementRegexes.map(function (cr) {
    return '(' + cr[1].source + ')';
  }).join('|');
  this.tokenRegex = new RegExp(tokenRegexSource, 'g');
  this.groupIndexOfTypes = this.elementRegexes.slice(0, this.elementRegexes.length - 1).reduce(function (ac, cr) {
    var subGroupLength = new RegExp(cr[1].source + '|.').exec('a').length;
    ac.push(ac[ac.length - 1] + subGroupLength);
    return ac;
  }, [1]);
  this.types = this.elementRegexes.reduce(function (ac, cr) {
    ac[cr[0]] = cr;
    return ac;
  }, {});
};

DPTokenizer.prototype.tokenize = function (source) {
  var regex = new RegExp(this.tokenRegex.source, 'g');
  var elementRegexes = this.elementRegexes;
  var groupIndexOfTypes = this.groupIndexOfTypes;
  var res = [];
  var matched = regex.exec(source);
  var type, i;

  while (matched) {
    type = null;

    for (i = 0; i < groupIndexOfTypes.length; ++i) {
      if (matched[groupIndexOfTypes[i]]) {
        type = elementRegexes[i][0];
      }
    }

    res.push({
      type: type,
      content: matched[0],
      start: matched.index,
      end: matched.index + matched[0].length
    });
    matched = regex.exec(source);
  }

  return res;
};

var _default = DPTokenizer;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Pharse/DPParseInstance.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Pharse/DPParseInstance.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parsedNodeToAST = parsedNodeToAST;
exports.parsedNodeToASTChain = parsedNodeToASTChain;
exports.default = void 0;

var _Heap = _interopRequireDefault(require("../DataStructure/Heap"));


var TARGET = 0;
var RULE = 1;
var PASSED = 2;
var LENGTH = 3;
var TRACK = 4;
/***
 * @param {string} target
 * @param {Rule|null} rule
 * @param {number} passed
 * @param {number} length
 * @param {[]} track
 *
 * @returns {*[]}
 */

function mkItem(target, rule, passed, length, track) {
  return [target, rule, passed, length, track];
}

function indexingItem(item) {
  return item[TARGET] + '*' + item[PASSED] + '*' + item[LENGTH];
}
/****
 *
 * @param {DPParser} parser
 * @param {string || []} source
 * @param {string} target
 * @constructor
 */


function DPParseInstance(parser, source, target) {
  this.target = target;
  this.parser = parser;
  this.targets = parser.targets;
  this.rules = parser.rules;
  this.tokenTypes = parser.tokenizer.types;
  this.error = null;
  this.source = source;

  if (typeof source === "string") {
    this.tokens = parser.tokenizer.tokenize(source).filter(function (tk) {
      return tk.type !== 'skip';
    });
  } else if (source instanceof Array) {
    this.tokens = source;
  } else {
    throw new Error("Invalid source, source must be string or array of token");
  }

  this.tokenIdx = 0;
  this.priQueue = new _Heap.default(this._cmpFunction);
  this.maxSize = 0;
  this.expectedArr = [];
  this.parsedNode = null;
  this.ast = null;

  this._dp();

  this._trackBack();

  if (this.parsedNode) {
    this._calcAST();
  } else {
    this._findError();
  }
}

DPParseInstance.prototype._dp = function () {
  while (this.tokenIdx < this.tokens.length) {
    this._nextToken();
  }
};

DPParseInstance.prototype._cmpFunction = function (a, b) {
  return a[1] - b[1];
};

DPParseInstance.prototype._nextToken = function () {
  var idx = this.tokenIdx++;
  var token = this.tokens[idx];
  this.priQueue.push(mkItem('.' + token.type, null, 1, 1, [null, token]));
  this.priQueue.push(mkItem('_' + token.content, null, 1, 1, [null, token]));
  var expected = {};
  var pushed = {};
  var itemIndex;
  this.expectedArr.push(expected);
  var cur, next;
  var i, j, rule;
  var prevExpectedList, prevRule;
  var prevExpectedItem;

  while (this.priQueue.size() > 0) {
    this.maxSize = Math.max(this.maxSize, this.priQueue.size());
    cur = this.priQueue.pop();

    for (i = 0; i < this.rules.length; ++i) {
      rule = this.rules[i];

      if (rule.elements[0] === cur[TARGET]) {
        if (rule.elements.length === 1) {
          next = mkItem(rule.target, rule, cur[PASSED], cur[LENGTH], [null, cur]);
          itemIndex = indexingItem(next);

          if (pushed) {
            pushed[itemIndex] = true;
            this.priQueue.push(next);
          }

          expected['^'] = expected['^'] || [];
          expected['^'].push(next);
        } else {
          next = mkItem(rule.target, rule, 1, cur[LENGTH], [null, cur]);
          expected[rule.elements[1]] = expected[rule.elements[1]] || [];
          expected[rule.elements[1]].push(next);
        }
      }
    }

    prevExpectedList = this.expectedArr[idx - cur[LENGTH]] && this.expectedArr[idx - cur[LENGTH]][cur[TARGET]];

    if (prevExpectedList) {
      for (j = 0; j < prevExpectedList.length; ++j) {
        prevExpectedItem = prevExpectedList[j];
        prevRule = prevExpectedItem[RULE];
        next = mkItem(prevRule.target, prevRule, prevExpectedItem[PASSED] + 1, prevExpectedItem[LENGTH] + cur[LENGTH], [prevExpectedItem, cur]);

        if (prevExpectedItem[PASSED] + 1 === prevRule.elements.length) {
          itemIndex = indexingItem(next);

          if (pushed) {
            pushed[itemIndex] = true;
            this.priQueue.push(next);
          }

          expected['^'] = expected['^'] || [];
          expected['^'].push(next); //[rule index, passed, length]
        } else {
          expected[prevRule.elements[prevExpectedItem[PASSED] + 1]] = expected[prevRule.elements[prevExpectedItem[PASSED] + 1]] || [];
          expected[prevRule.elements[prevExpectedItem[PASSED] + 1]].push(next);
        }
      }
    }
  }
};

DPParseInstance.prototype._trackBack = function () {
  var expectedAr = this.expectedArr;

  function visit(target, start, length) {
    var node = {
      type: target,
      start: start,
      end: start + length
    };
    var matchedItem = null;
    var expected = expectedAr[start + length - 1];
    if (!expected) return null;
    var itemList = expected['^'];
    if (!itemList) return null;
    var item;

    if (itemList) {
      for (var j = 0; j < itemList.length; ++j) {
        item = itemList[j];

        if (item[TARGET] === target) {
          if (item[LENGTH] === length) {
            matchedItem = item;
          }
        }
      }
    }

    if (!matchedItem) {
      return null;
    }

    node.rule = matchedItem[RULE];
    var childItem = [];
    var cTrack = matchedItem[TRACK];
    var right, left;

    while (cTrack) {
      left = cTrack[0];
      right = cTrack[1];
      childItem.unshift(right);
      cTrack = left && left[TRACK];
    }

    var ac = childItem.reduce(function (ac, item) {
      if (typeof item[TRACK][1].type === "string") {
        ac.child.push(item[TRACK][1]);
        ac.start += 1;
      } else {
        ac.child.push(visit(item[TARGET], ac.start, item[LENGTH]));
        ac.start += item[LENGTH];
      }

      return ac;
    }, {
      start: start,
      child: []
    });
    node.children = ac.child;
    node.end = ac.start;
    return node;
  }

  this.parsedNode = visit(this.target, 0, this.expectedArr.length);
};

DPParseInstance.prototype._findError = function () {
  function cmp(a, b) {
    return b.i - a.i;
  }

  var queue = new _Heap.default(cmp);
  var doneArr = Array(this.expectedArr.length).fill(null).map(function () {
    return {};
  });
  this.expectedArr.forEach(function (ex, i) {
    for (var k in ex) {
      ex[k].forEach(function (it) {
        var target = it[TARGET];
        var done = doneArr[i - it[LENGTH] + 1];
        done[target] = done[target] || [];
        done[target].push(it);
      });
    }
  });
  var d = {};
  queue.push({
    t: this.target,
    i: 0
  });
  d[this.target + '/' + 0] = true;
  var cr, next;
  var nextIdent;
  var item;
  var hasNewExpected;

  while (queue.size() > 0) {
    cr = queue.pop();

    if (cr.i >= doneArr.length) {
      if (!this.error || this.error.tokenIdx < cr.i || this.error.type !== "expected") {
        this.error = {
          tokenIdx: cr.i,
          type: 'expected',
          expectedToken: []
        };
      }

      if (cr.t[0] === '_' || cr.t[0] === '.') {
        this.error.expectedToken.push(cr.t);
      }

      continue;
    }

    hasNewExpected = false;

    if (doneArr[cr.i][cr.t]) {
      doneArr[cr.i][cr.t].forEach(function (item) {
        if (item[PASSED] < item[RULE].elements.length) {
          next = {
            i: cr.i + item[LENGTH],
            t: item[RULE].elements[item[PASSED]]
          };
          nextIdent = next.t + '/' + next.i;
          hasNewExpected = true;

          if (!d[nextIdent]) {
            d[nextIdent] = true;
            queue.push(next);
          }
        }
      });
    }

    this.rules.forEach(function (rule) {
      if (rule.target === cr.t) {
        next = {
          i: cr.i,
          t: rule.elements[0]
        };
        nextIdent = next.t + '/' + next.i;

        if (!d[nextIdent]) {
          d[nextIdent] = true;
          queue.push(next);
        }
      }
    });

    if (!hasNewExpected) {
      if (!this.error || this.error.tokenIdx < cr.i) {
        this.error = {
          tokenIdx: cr.i,
          type: 'unexpected'
        };
      }
    }
  }

  if (this.error.type === 'expected') {
    this.error.message = 'Expected: ' + this.error.expectedToken.map(function (t) {
      if (t[0] === '.') return t.substring(1);
      if (t[0] === '_') return JSON.stringify(t.substring(1));
    }).join(', ');
  } else if (this.error.type === 'unexpected') {
    this.error.message = 'Unexpected token ' + (this.tokens[this.error.tokenIdx].content || JSON.stringify(this.tokens[this.error.tokenIdx]));
  }
};

DPParseInstance.prototype._calcAST = function () {
  this.ast = this.parsedNode.rule.toAST(this.parsedNode);
};

function parsedNodeToAST(parsedNode) {
  return parsedNode.rule.toAST(parsedNode);
}

function parsedNodeToASTChain(parsedNode) {
  return parsedNode.rule.toASTChain(parsedNode);
}

var _default = DPParseInstance;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Pharse/DPParser.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Pharse/DPParser.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _DPTokenizer = _interopRequireDefault(require("./DPTokenizer"));

var _DPParseInstance = _interopRequireDefault(require("./DPParseInstance"));


/***
 * @typedef Rule
 * @property {string} target
 * @property {string[]} elements
 */

/***
 *
 * @param opt
 * @constructor
 */
function DPParser(opt) {
  opt = opt || {};

  if (opt.rules) {
    this.rules = opt.rules;
  }

  this.targets = {};
  this.tokenizer = new _DPTokenizer.default(opt);
  this.computeTarget();
}
/****
 * @type {Rule[]}
 */


DPParser.prototype.rules = [];

DPParser.prototype.computeTarget = function () {
  this.rules.reduce(function (ac, rule) {
    var target = ac[rule.target];

    if (!target) {
      target = {
        rules: []
      };
      ac[rule.target] = target;
    }

    target.rules.push(rule);
    return ac;
  }, this.targets);
};
/***
 *
 * @param {string|[]}source
 * @param target
 * @returns {DPParseInstance}
 */


DPParser.prototype.parse = function (source, target) {
  return new _DPParseInstance.default(this, source, target);
};

var _default = DPParser;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/SCLang/SCGrammar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/SCLang/SCGrammar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _DPParseInstance = require("../Pharse/DPParseInstance");

/*********************************
 * EXPRESSION
 */
var operatorOrder = {
  'NOT': 4,
  '!': 4,
  '*': 5,
  '/': 5,
  'MOD': 5,
  '%': 5,
  '+': 6,
  '-': 6,
  '<': 9,
  '>': 9,
  '<=': 9,
  '>=': 9,
  '==': 9,
  '!=': 9,
  'AND': 14,
  '&&': 14,
  'OR': 15,
  '||': 15,
  'XOR': 15
};
var elementRegexes = [['string', /("(?:[^"\\]|\\.)*?")|('(?:[^'\\]|\\.)*?')/], ['number', /(\d+([.]\d*)?([eE][+-]?\d+)?|[.]\d+([eE][+-]?\d+)?)/], ['word', /[_a-zA-Z][_a-zA-Z0-9]*/], ['skip', /([\s\r\n]+)|(\/\/[^\n]*)|(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)/], ['dsymbol', /\+\+|--|==|!=|<=|>=/], ['tsymbol', /\.\.\./], ['symbol', /[^\s_a-zA-Z0-9]/]];
var rules = [];
rules.push({
  target: 'null',
  elements: ['_null'],
  toAST: function (parsedNode) {
    return {
      type: 'NullLiteral'
    };
  }
});
rules.push({
  target: 'ident',
  elements: ['.word'],
  toAST: function (parsedNode) {
    return {
      type: 'Identifier',
      name: parsedNode.children[0].content
    };
  }
});
rules.push({
  target: 'args_list',
  elements: ['exp'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  },
  toASTChain: function (parsedNode) {
    return [(0, _DPParseInstance.parsedNodeToAST)(parsedNode)];
  }
});
rules.push({
  target: 'args_list',
  elements: ['args_list', '_,', 'exp'],
  toASTChain: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[0]).concat((0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2]));
  }
});
rules.push({
  target: 'function_callee',
  elements: ['ident'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'function_callee',
  elements: ['mem_exp'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'function_call',
  elements: ['function_callee', '_(', 'args_list', '_)'],
  toAST: function (parsedNode) {
    return {
      type: 'CallExpression',
      arguments: parsedNode.children[2].rule.toASTChain(parsedNode.children[2]),
      callee: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])
    };
  }
});
rules.push({
  target: 'function_call',
  elements: ['function_callee', '_(', '_)'],
  toAST: function (parsedNode) {
    return {
      type: 'CallExpression',
      arguments: [],
      callee: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])
    };
  }
});
rules.push({
  target: 'new_expression',
  elements: ['_new', 'function_call'],
  toAST: function (parsedNode) {
    var callAst = (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]);
    return {
      type: 'NewExpression',
      arguments: callAst.arguments,
      callee: callAst.callee
    };
  }
});
rules.push({
  target: 'exp',
  elements: ['new_expression'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'exp',
  elements: ['null'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'exp',
  elements: ['ident'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'number',
  elements: ['.number'],
  toAST: function (parsedNode) {
    return {
      type: 'NumericLiteral',
      value: parseFloat(parsedNode.children[0].content)
    };
  }
});
rules.push({
  target: 'string',
  elements: ['.string'],
  toAST: function (parsedNode) {
    var content = parsedNode.children[0].content;
    if (content[0] === "'") content = '"' + content.substring(1, content.length - 1).replace(/["]/g, '\\"') + '"';
    return {
      type: 'StringLiteral',
      value: JSON.parse(content)
    };
  }
});
rules.push({
  target: 'boolean',
  elements: ['_true'],
  toAST: function (parsedNode) {
    return {
      type: 'BooleanLiteral',
      value: true
    };
  }
});
rules.push({
  target: 'boolean',
  elements: ['_false'],
  toAST: function (parsedNode) {
    return {
      type: 'BooleanLiteral',
      value: false
    };
  }
});
rules.push({
  target: 'exp',
  elements: ['number'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'exp',
  elements: ['string'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'exp',
  elements: ['boolean'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
['+', '-', '*', '/', '%', '&&', '||', 'XOR', '==', '!=', '<', '>', '>=', '<='].forEach(function (op) {
  rules.push({
    target: 'bin_op',
    elements: ['_' + op],
    toAST: function (parsedNode) {
      return {
        type: "BinaryOperator",
        content: op
      };
    }
  });
});
rules.push({
  target: 'exp',
  elements: ['exp', 'bin_op', 'exp'],
  toASTChain: function (parseNode) {
    var res = [];

    if (parseNode.children[0].rule === this) {
      res = res.concat(this.toASTChain(parseNode.children[0]));
    } else {
      res.push((0, _DPParseInstance.parsedNodeToAST)(parseNode.children[0]));
    }

    res.push(parseNode.children[1].children[0]);

    if (parseNode.children[2].rule === this) {
      res = res.concat(this.toASTChain(parseNode.children[2]));
    } else {
      res.push((0, _DPParseInstance.parsedNodeToAST)(parseNode.children[2]));
    }

    return res;
  },
  toAST: function (parsedNode) {
    var chain = this.toASTChain(parsedNode);
    var stack = [];
    var item;
    var newNode;

    while (chain.length > 0) {
      item = chain.shift();

      if (item.content in operatorOrder) {
        while (stack.length >= 3 && operatorOrder[stack[stack.length - 2].content] <= operatorOrder[item.content]) {
          newNode = {
            type: 'BinaryExpression'
          };
          newNode.right = stack.pop();
          newNode.operator = stack.pop();
          newNode.left = stack.pop();
          stack.push(newNode);
        }
      }

      stack.push(item);
    }

    while (stack.length >= 3) {
      newNode = {
        type: 'BinaryExpression'
      };
      newNode.right = stack.pop();
      newNode.operator = stack.pop();
      newNode.left = stack.pop();
      stack.push(newNode);
    }

    return stack.pop();
  }
});
rules.push({
  target: 'exp',
  elements: ['function_call'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'bracket_group',
  elements: ['_(', 'exp', '_)'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]);
  }
});
rules.push({
  target: 'exp',
  elements: ['bracket_group'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
}); // rules.push({
//     target: 'exp',
//     elements: ['_(', 'exp', '_)'],
//     toAST: function (parsedNode) {
//         return parsedNodeToAST(parsedNode.children[1]);
//     }
// });

['+', '-', '!'].forEach(function (op) {
  ['number', 'bracket_group', 'ident', 'function_call', 'mem_exp', 'unary_exp'].forEach(function (arg) {
    rules.push({
      target: 'unary_exp',
      elements: ['_' + op, arg],
      toAST: function (parsedNode) {
        return {
          type: 'UnaryExpression',
          argument: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
          operator: {
            type: 'UnaryOperator',
            content: op
          }
        };
      }
    });
  });
});
rules.push({
  target: 'exp',
  elements: ['unary_exp'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'mem_exp',
  elements: ['ident', '_.', 'ident'],
  toAST: function (parsedNode) {
    return {
      type: "MemberExpression",
      computed: false,
      object: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      property: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'mem_exp',
  elements: ['ident', '_[', 'exp', '_]'],
  toAST: function (parsedNode) {
    return {
      type: "MemberExpression",
      computed: true,
      object: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      property: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'mem_exp',
  elements: ['new_expression', '_.', 'ident'],
  toAST: function (parsedNode) {
    return {
      type: "MemberExpression",
      computed: false,
      object: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      property: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'mem_exp',
  elements: ['new_expression', '_[', 'exp', '_]'],
  toAST: function (parsedNode) {
    return {
      type: "MemberExpression",
      computed: true,
      object: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      property: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'mem_exp',
  elements: ['mem_exp', '_.', 'ident'],
  toAST: function (parsedNode) {
    return {
      type: "MemberExpression",
      computed: false,
      object: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      property: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'mem_exp',
  elements: ['mem_exp', '_[', 'exp', '_]'],
  toAST: function (parsedNode) {
    return {
      type: "MemberExpression",
      computed: true,
      object: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      property: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'mem_exp',
  elements: ['bracket_group', '_.', 'ident'],
  toAST: function (parsedNode) {
    return {
      type: "MemberExpression",
      computed: false,
      object: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      property: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'mem_exp',
  elements: ['bracket_group', '_[', 'exp', '_]'],
  toAST: function (parsedNode) {
    return {
      type: "MemberExpression",
      computed: true,
      object: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      property: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'exp',
  elements: ['mem_exp'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'object_exp',
  elements: ['_{', '_}'],
  toAST: function (parsedNode) {
    return {
      type: 'ObjectExpression',
      properties: []
    };
  }
});
rules.push({
  target: 'object_exp',
  elements: ['_{', 'object_property_list', '_}'],
  toAST: function (parsedNode) {
    return {
      type: 'ObjectExpression',
      properties: (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[1])
    };
  }
});
rules.push({
  target: 'exp',
  elements: ['object_exp'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'object_property',
  elements: ['ident', '_:', 'exp'],
  toAST: function (parsedNode) {
    return {
      type: 'ObjectProperty',
      key: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      value: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'object_property',
  elements: ['string', '_:', 'exp'],
  toAST: function (parsedNode) {
    return {
      type: 'ObjectProperty',
      key: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      value: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'object_property_list',
  elements: ['object_property'],
  toASTChain: function (parsedNode) {
    return [(0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])];
  }
});
rules.push({
  target: 'object_property_list',
  elements: ['object_property_list', '_,', 'object_property'],
  toASTChain: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[0]).concat([(0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'exp',
  elements: ['array_exp'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'array_exp',
  elements: ['_[', '_]'],
  toAST: function (parsedNode) {
    return {
      type: "ArrayExpression",
      elements: []
    };
  }
});
rules.push({
  target: 'array_exp',
  elements: ['_[', 'array_item_list', '_]'],
  toAST: function (parsedNode) {
    return {
      type: "ArrayExpression",
      elements: (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[1])
    };
  }
});
rules.push({
  target: 'array_item_list',
  elements: ['exp'],
  toASTChain: function (parsedNode) {
    return [(0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])];
  }
});
rules.push({
  target: 'array_item_list',
  elements: ['array_item_list', '_,', 'exp'],
  toASTChain: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[0]).concat([(0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])]);
  }
});
/**********************************************************************************************************************/

/**************FOR QUICK PARSING***********************/

rules.push({
  target: 'exp',
  elements: ['.constance'],
  toAST: function (parsedNode) {
    return parsedNode.children[0];
  },
  toASTChain: function (parsedNode) {
    return [parsedNode.children[0]];
  }
});
/***********************************************************************************************************************/

rules.push({
  target: 'generic_type',
  elements: ['ident'],
  toAST: function (parsedNode) {
    return {
      type: 'GenericType',
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])
    };
  }
});
rules.push({
  target: 'linked_type',
  elements: ['_linktype', 'exp'],
  toAST: function (parsedNode) {
    return {
      type: 'LinkedType',
      address: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1])
    };
  }
});
rules.push({
  target: 'var_type',
  elements: ['generic_type'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'var_type',
  elements: ['linked_type'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
/*
rules.push({
    target: 'var_type',
    elements: ['ident', '<', 'var_type', '>']
});

rules.push({
    target: 'var_type',
    elements: ['ident', '<', '.string', '>']
});
*/

rules.push({
  target: 'type_annotation',
  elements: ['_:', 'var_type'],
  toAST: function (parsedNode) {
    return {
      type: 'TypeAnnotation',
      typeAnnotation: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1])
    };
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'variable_declaration',
  elements: ['_var', 'ident', 'type_annotation', '_;'],
  toAST: function (parsedNode) {
    return {
      type: 'VariableDeclaration',
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      typeAnnotation: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'variable_declaration',
  elements: ['_var', 'ident', '_;'],
  toAST: function (parsedNode) {
    return {
      type: 'VariableDeclaration',
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1])
    };
  }
});
rules.push({
  target: 'variable_declaration',
  elements: ['_var', 'ident', '_=', 'exp', '_;'],
  toAST: function (parsedNode) {
    return {
      type: 'VariableDeclaration',
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      init: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[3])
    };
  }
});
rules.push({
  target: 'variable_declaration',
  elements: ['_var', 'ident', 'type_annotation', '_=', 'exp', '_;'],
  toAST: function (parsedNode) {
    return {
      type: 'VariableDeclaration',
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      typeAnnotation: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2]),
      init: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[4])
    };
  }
}); //todo

rules.push({
  target: 'expression_statement',
  elements: ['function_call', '_;'],
  toAST: function (parsedNode) {
    return {
      type: 'ExpressionStatement',
      expression: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])
    };
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'assign_statement',
  elements: ['ident', '_=', 'exp', '_;'],
  toAST: function (parseNode) {
    return {
      type: 'AssignStatement',
      left: (0, _DPParseInstance.parsedNodeToAST)(parseNode.children[0]),
      right: (0, _DPParseInstance.parsedNodeToAST)(parseNode.children[2])
    };
  }
});
rules.push({
  target: 'assign_statement',
  elements: ['mem_exp', '_=', 'exp', '_;'],
  toAST: function (parseNode) {
    return {
      type: 'AssignStatement',
      left: (0, _DPParseInstance.parsedNodeToAST)(parseNode.children[0]),
      right: (0, _DPParseInstance.parsedNodeToAST)(parseNode.children[2])
    };
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'if_statement_1',
  elements: ['_if', '_(', 'exp', '_)', 'statement'],
  toAST: function (parsedNode) {
    return {
      type: 'IfStatement',
      test: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2]),
      consequent: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[4])
    };
  }
});
rules.push({
  target: 'if_statement_2',
  elements: ['if_statement_1', '_else', 'statement'],
  toAST: function (parsedNode) {
    var ast = (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
    ast.alternate = (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2]);
    return ast;
  }
});
rules.push({
  target: 'statement',
  elements: ['if_statement_1'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'statement',
  elements: ['if_statement_2'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'for_count_statement',
  elements: ['_for', 'ident', '_from', 'exp', '_to', 'exp', 'block_statement'],
  toAST: function (parsedNode) {
    return {
      type: 'ForCountStatement',
      for: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      from: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[3]),
      to: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[5]),
      body: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[6])
    };
  }
});
rules.push({
  target: 'for_of_statement',
  elements: ['_for', 'ident', '_of', 'exp', 'block_statement'],
  toAST: function (parsedNode) {
    return {
      type: 'ForOfStatement',
      for: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      of: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[3]),
      body: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[4])
    };
  }
});
rules.push({
  target: 'for_in_statement',
  elements: ['_for', 'ident', '_in', 'exp', 'block_statement'],
  toAST: function (parsedNode) {
    return {
      type: 'ForInStatement',
      for: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      in: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[3]),
      body: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[4])
    };
  }
});
rules.push({
  target: 'iterable_range',
  elements: ['iterable_range_limit', '_...', 'iterable_range_limit']
});
rules.push({
  target: 'iterable_range_limit',
  elements: ['.number']
});
rules.push({
  target: 'iterable_range_limit',
  elements: ['ident']
});
/**********************************************************************************************************************/

rules.push({
  target: 'while_statement',
  elements: ['_while', 'bracket_group', 'statement'],
  toAST: function (parsedNode) {
    return {
      type: 'WhileStatement',
      test: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      body: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])
    };
  }
});
rules.push({
  target: 'statement',
  elements: ['while_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'do_while_statement',
  elements: ['_do', 'statement', '_while', 'bracket_group', '_;'],
  toAST: function (parsedNode) {
    return {
      type: 'DoWhileStatement',
      test: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[3]),
      body: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1])
    };
  }
});
rules.push({
  target: 'statement',
  elements: ['do_while_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'break_statement',
  elements: ['_break', '_;'],
  toAST: function (parsedNode) {
    return {
      type: 'BreakStatement'
    };
  }
});
rules.push({
  target: 'statement',
  elements: ['break_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'block_statement',
  elements: ['_{', '_}'],
  toAST: function (parsedNode) {
    return {
      type: 'BlockStatement',
      body: []
    };
  }
});
rules.push({
  target: 'block_statement',
  elements: ['_{', 'statement_arr', '_}'],
  toAST: function (parsedNode) {
    return {
      type: 'BlockStatement',
      body: (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[1])
    };
  }
});
rules.push({
  target: 'statement',
  elements: ['variable_declaration'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'statement',
  elements: ['block_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'statement',
  elements: ['expression_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'statement',
  elements: ['for_count_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'statement',
  elements: ['for_in_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'statement',
  elements: ['for_of_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'statement',
  elements: ['assign_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'statement_arr',
  elements: ['statement'],
  toASTChain: function (parsedNode) {
    return [(0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])];
  }
});
rules.push({
  target: 'statement_arr',
  elements: ['statement_arr', 'statement'],
  toASTChain: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[0]).concat([(0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1])]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'function_arguments_declaration',
  elements: ['_(', '_)'],
  toASTChain: function (parsedNode) {
    return [];
  }
});
rules.push({
  target: 'function_arguments_declaration',
  elements: ['_(', 'argument_declaration_list', '_)'],
  toASTChain: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[1]);
  }
});
rules.push({
  target: 'argument_declaration',
  elements: ['ident', 'type_annotation'],
  toAST: function (parsedNode) {
    return {
      type: "ArgumentDeclaration",
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]),
      typeAnnotation: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1])
    };
  }
});
rules.push({
  target: 'argument_declaration',
  elements: ['ident'],
  toAST: function (parsedNode) {
    return {
      type: "ArgumentDeclaration",
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])
    };
  }
});
rules.push({
  target: 'argument_declaration_list',
  elements: ['argument_declaration'],
  toASTChain: function (parsedNode) {
    return [(0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0])];
  }
});
rules.push({
  target: 'argument_declaration_list',
  elements: ['argument_declaration_list', '_,', 'argument_declaration'],
  toASTChain: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[0]).concat([(0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[2])]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'return_statement',
  elements: ['_return', 'exp', '_;'],
  toAST: function (parsedNode) {
    return {
      type: "ReturnStatement",
      argument: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1])
    };
  }
});
rules.push({
  target: 'return_statement',
  elements: ['_return', '_;'],
  toAST: function (parsedNode) {
    return {
      type: "ReturnStatement"
    };
  }
});
rules.push({
  target: 'statement',
  elements: ['return_statement'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
/**********************************************************************************************************************/

rules.push({
  target: 'function_declare',
  elements: ['_function', 'ident', 'function_arguments_declaration', 'type_annotation', 'block_statement'],
  toAST: function (parsedNode) {
    return {
      type: 'FunctionDeclaration',
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      params: (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[2]),
      returnType: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[3]),
      body: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[4])
    };
  }
});
rules.push({
  target: 'function_declare',
  elements: ['_function', 'ident', 'function_arguments_declaration', 'block_statement'],
  toAST: function (parsedNode) {
    return {
      type: 'FunctionDeclaration',
      id: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[1]),
      params: (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[2]),
      body: (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[3])
    };
  }
});
rules.push({
  target: 'statement',
  elements: ['function_declare'],
  toAST: function (parsedNode) {
    return (0, _DPParseInstance.parsedNodeToAST)(parsedNode.children[0]);
  }
});
rules.push({
  target: 'program',
  elements: ['statement_arr'],
  toAST: function (parsedNode) {
    return {
      type: "Program",
      body: (0, _DPParseInstance.parsedNodeToASTChain)(parsedNode.children[0])
    };
  }
});
var _default = {
  elementRegexes: elementRegexes,
  rules: rules,
  operatorOrder: operatorOrder
};
exports.default = _default;
};

moduleFactories["node_modules/absol/src/SCLang/SCParser.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/SCLang/SCParser.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _DPParser = _interopRequireDefault(require("../Pharse/DPParser"));

var _SCGrammar = _interopRequireDefault(require("./SCGrammar"));


/***
 * @type {DPParser}
 */
var SCParser = new _DPParser.default(_SCGrammar.default);
var _default = SCParser;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/SCLang/SCOperatorExecutor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/SCLang/SCOperatorExecutor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.OperatorExecutor = OperatorExecutor;
exports.default = void 0;

function OperatorExecutor() {
  this.oFXYs = {};
  this.oFXs = {};
}
/***
 *
 * @param {string} operator
 * @param {function(x, y, next: function):void} fxy
 */


OperatorExecutor.prototype.addBinaryOperator = function (operator, fxy) {
  if (!this.oFXYs[operator]) this.oFXYs[operator] = [];
  this.oFXYs[operator].unshift(fxy);
};
/***
 *
 * @param {string} operator
 * @param {function(x,  next: function):void} fx
 */


OperatorExecutor.prototype.addUnaryOperator = function (operator, fx) {
  if (!this.oFXs[operator]) this.oFXs[operator] = [];
  this.oFXs[operator].unshift(fx);
};

OperatorExecutor.prototype.executeBinaryOperator = function (operator, x, y) {
  var fXYs = this.oFXYs[operator];
  var i, next;

  if (fXYs) {
    i = -1;

    next = () => {
      ++i;
      if (i >= fXYs.length) throw {
        message: 'Could not match any function for operator' + operator,
        x: x,
        y: y
      };
      return fXYs[i](x, y, next);
    };

    return next();
  } else {
    throw {
      message: 'Could not find operate: ' + operator
    };
  }
};

OperatorExecutor.prototype.executeUnaryOperator = function (operator, x) {
  var fXs = this.oFXs[operator];
  var i, next;

  if (fXs) {
    i = -1;

    next = () => {
      ++i;
      if (i >= fXs.length) throw {
        message: 'Could not match any function for operator' + operator,
        x: x
      };
      return fXs[i](x, next);
    };

    return next();
  } else {
    throw {
      message: 'Could not find operate: ' + operator
    };
  }
};
/***
 * @type {OperatorExecutor}
 */


var SCOperatorExecutor = new OperatorExecutor();
var _default = SCOperatorExecutor;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/SCLang/SCOperators.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/SCLang/SCOperators.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ADD = ADD;
exports.SUB = SUB;
exports.MUL = MUL;
exports.DIV = DIV;
exports.MOD = MOD;
exports.NEGATIVE = NEGATIVE;
exports.POSITIVE = POSITIVE;
exports.NOT = NOT;
exports.LESS_THAN = LESS_THAN;
exports.MORE_THAN = MORE_THAN;
exports.EQUAL = EQUAL;
exports.LESS_AND_EQUAL = LESS_AND_EQUAL;
exports.MORE_AND_EQUAL = MORE_AND_EQUAL;
exports.NOT_EQUAL = NOT_EQUAL;

var _datetime = require("../Time/datetime");

var _SCOperatorExecutor = _interopRequireDefault(require("./SCOperatorExecutor"));


function ADD(a, b) {
  var type_a = typeof a;
  var type_b = typeof b;

  if (type_a === "number") {
    if (type_b === "number" || type_b === 'string') return a + b;
  }

  if (type_a === "undefined" && type_b === "undefined") return undefined;

  if (type_a === 'string') {
    if (type_b === "string") return a + b;
    if (b instanceof Date) return a + (0, _datetime.formatDateTime)(b, 'dd/MM/yyyy');
    if (type_b === "number") return a + b;
  }

  if (a instanceof Date) {
    if (type_b === 'number') {
      return new Date(a.getTime() + _datetime.MILLIS_PER_DAY * b);
    } else if (type_b === 'string') {
      return (0, _datetime.formatDateTime)(a, 'dd/MM/yyyy') + b;
    }
  }

  if (a.add && a.constructor === b.constructor) return a.add(b);
  console.error("Can not add: ", a, b);
  return NaN;
}

_SCOperatorExecutor.default.addBinaryOperator('+', ADD);

function SUB(a, b) {
  var type_a = typeof a;
  var type_b = typeof b;

  if (type_a === "number" && type_b === "number") {
    return a - b;
  }

  if (type_a === "undefined" && type_b === "undefined") return undefined;

  if (a instanceof Date) {
    if (type_b === 'number') {
      return new Date(a.getTime() - _datetime.MILLIS_PER_DAY * b);
    }
  }

  if (a.sub && a.constructor === b.constructor) return a.sub(b);
  console.error("Can not sub: ", a, b);
  return NaN;
}

_SCOperatorExecutor.default.addBinaryOperator('-', SUB);

function MUL(a, b) {
  var type_a = typeof a;
  var type_b = typeof b;

  if (type_a === "number" && type_b === "number") {
    return a * b;
  }

  if (type_a === "undefined" && type_b === "undefined") return undefined;

  if (type_a === "string" && type_b === "number") {
    return a.repeat(b);
  }

  console.error("Can not mul: ", a, b);
  return NaN;
}

_SCOperatorExecutor.default.addBinaryOperator('*', MUL);

function DIV(a, b) {
  var type_a = typeof a;
  var type_b = typeof b;

  if (type_a === "number" && type_b === "number") {
    return a / b;
  }

  if (type_a === "undefined" && type_b === "undefined") return undefined;
  console.error("Can not div: ", a, b);
  return NaN;
}

_SCOperatorExecutor.default.addBinaryOperator('/', DIV);

function MOD(x, m) {
  return x % m;
}

_SCOperatorExecutor.default.addBinaryOperator('%', MOD);

function NEGATIVE(x) {
  return -x;
}

_SCOperatorExecutor.default.addUnaryOperator('-', NEGATIVE);

function POSITIVE(x) {
  return x;
}

_SCOperatorExecutor.default.addUnaryOperator('+', POSITIVE);

function NOT(x) {
  return !x;
}

_SCOperatorExecutor.default.addUnaryOperator('!', NOT);

function LESS_THAN(a, b) {
  if (a instanceof Date) a = a.getTime();
  if (b instanceof Date) b = b.getTime();
  return a < b;
}

_SCOperatorExecutor.default.addBinaryOperator('<', LESS_THAN);

function MORE_THAN(a, b) {
  if (a instanceof Date) a = a.getTime();
  if (b instanceof Date) b = b.getTime();
  return a > b;
}

_SCOperatorExecutor.default.addBinaryOperator('>', MORE_THAN);

function EQUAL(a, b) {
  if (a instanceof Date) a = a.getTime();
  if (b instanceof Date) b = b.getTime();
  return a === b;
}

_SCOperatorExecutor.default.addBinaryOperator('==', EQUAL);

function LESS_AND_EQUAL(a, b) {
  if (a instanceof Date) a = a.getTime();
  if (b instanceof Date) b = b.getTime();
  return a <= b;
}

_SCOperatorExecutor.default.addBinaryOperator('<=', LESS_AND_EQUAL);

function MORE_AND_EQUAL(a, b) {
  if (a instanceof Date) a = a.getTime();
  if (b instanceof Date) b = b.getTime();
  return a >= b;
}

_SCOperatorExecutor.default.addBinaryOperator('>=', MORE_AND_EQUAL);

function NOT_EQUAL(a, b) {
  if (a instanceof Date) a = a.getTime();
  if (b instanceof Date) b = b.getTime();
  return a != b;
}

_SCOperatorExecutor.default.addBinaryOperator('!=', NOT_EQUAL);
};

moduleFactories["node_modules/absol/src/AppPattern/Const.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/Const.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {T} value
 * @param {*=} type
 * @constructor
 * @template T
 */
function Const(value, type) {
  this.value = value;
  this.type = type;
}

Const.prototype.toString = function () {
  return this.value + '';
};
/***
 *
 * @return {T}
 */


Const.prototype.valueOf = function () {
  return this.value;
};
/**
 *
 * @return {T}
 */


Const.prototype.get = function () {
  return this.value;
};

var _default = Const;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/SCLang/SCScope.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/SCLang/SCScope.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Ref = _interopRequireDefault(require("../AppPattern/Ref"));

var _Const = _interopRequireDefault(require("../AppPattern/Const"));


/***
 *
 * @param {SCScope=} parent
 * @constructor
 */
function SCScope(parent) {
  this.parent = parent;
  /***
   *
   * @type {Object<string, Ref|Const>}
   */

  this.data = {};
}

SCScope.prototype.set = function (name, value) {
  var ref = this.findRef(name);
  if (!ref) throw new Error('"' + name + '" was not declared!');

  if (ref.set) {
    ref.set(value);
  } else {
    throw new Error('"' + name + '" defined with const cannot be modified!');
  }
};

SCScope.prototype.get = function (name) {
  var ref = this.findRef(name);
  if (!ref) throw new Error('"' + name + '" was not declared!');
  return ref.get();
};

SCScope.prototype.declareConst = function (name, value, force, type) {
  if (name in this.data && !force) throw new Error("Cannot redefine variable, " + name + " is already declared!");
  this.data[name] = new _Const.default(value, type);
};

SCScope.prototype.declareVar = function (name, value, force, type) {
  if (name in this.data && !force) throw new Error("Cannot redefine variable, " + name + " is already declared!");
  this.data[name] = new _Ref.default(value, type);
};

SCScope.prototype.revoke = function (name) {
  delete this.data[name];
};
/***
 *
 * @param {string} name
 * @return {Ref|Const|null}
 */


SCScope.prototype.findRef = function (name) {
  return this.data[name] || this.parent && this.parent.findRef(name) || null;
};
/***
 *
 * @param {string} name
 * @return {SCScope|null}
 */


SCScope.prototype.findScope = function (name) {
  if (this.data[name]) return this;
  if (this.parent) return this.parent.findScope(name);
  return null;
};

var _default = SCScope;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/SCLang/SCCodeGenerator.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/SCLang/SCCodeGenerator.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SCCodeHighlightingGenerator = SCCodeHighlightingGenerator;
exports.generateSCCode = generateSCCode;
exports.generateSCHighlightPreviewCode = generateSCHighlightPreviewCode;
exports.default = void 0;

var _SCGrammar = _interopRequireDefault(require("./SCGrammar"));

var _OOP = _interopRequireDefault(require("../HTML5/OOP"));


/***
 *
 * @constructor
 */
function SCCodeGenerator() {}

SCCodeGenerator.prototype.accept = function (node) {
  if (!node) return '/*TODO*/';
  var visitor = this.visitors[node.type];

  if (visitor) {
    try {
      return this.visitors[node.type].apply(this, arguments);
    } catch (e) {
      console.error(e, node);
    }
  } else {
    return '[' + node.type + ']'; // throw { message: 'Can not handle ', node: node };
  }
};

SCCodeGenerator.prototype.generate = function (ast) {
  return this.accept(ast);
};
/***
 *
 * @type {Object<string, function>}
 */


SCCodeGenerator.prototype.visitors = {
  Program: function (node) {
    return node.body.map(st => this.accept(st)).join('\n');
  },
  FunctionDeclaration: function (node) {
    var bodyCode = this.accept(node.body);
    var argsCode = node.params.map(arg => this.accept(arg)).join(', ');
    return `function ${node.id.name}(${argsCode}) ${bodyCode}`;
  },
  ArgumentDeclaration: function (node) {
    var res = node.id.name;
    var typeText;
    if (node.typeAnnotation) typeText = this.accept(node.typeAnnotation);
    if (typeText && typeText !== 'any') res += ': ' + typeText;
    return res;
  },
  TypeAnnotation: function (node) {
    return this.accept(node.typeAnnotation);
  },
  GenericType: function (node) {
    var typeText = this.accept(node.id);

    if (node.typeParameters && node.typeParameters.length > 0) {
      typeText += '<';
      typeText += node.typeParameters.map(it => this.accept(it)).join(', ');
      typeText += '>';
    }

    return typeText;
  },
  LinkedType: function (node) {
    return 'linktype ' + this.accept(node.address);
  },
  Identifier: function (node) {
    return node.name;
  },
  VariableDeclaration: function (node) {
    var res = 'var ' + node.id.name;
    var typeText;
    if (node.typeAnnotation) typeText = this.accept(node.typeAnnotation);
    if (typeText && typeText !== 'any') res += ': ' + typeText;
    if (node.init) res += ' = ' + this.accept(node.init);
    res += ';';
    return res;
  },
  BlockStatement: function (node) {
    var bodyCode = node.body.map(it => this.accept(it)).join('\n');

    if (bodyCode.length > 0) {
      bodyCode = bodyCode.split('\n').map(r => '    ' + r).join('\n');
    }

    return ['{', bodyCode, '}'].join('\n');
  },
  AssignStatement: function (node) {
    return this.accept(node.left) + ' = ' + this.accept(node.right) + ';';
  },
  BooleanLiteral: function (node) {
    return node.value ? 'true' : 'false';
  },
  NullLiteral: function (node) {
    return "null";
  },
  NewExpression: function (node) {
    var res = 'new ';

    if (node.callee.type === 'Identifier' || node.callee.type === 'MemberExpression') {
      res += this.accept(node.callee);
    } else {
      res += '(' + this.accept(node.callee) + ')';
    }

    res += '(';
    res += node.arguments.map(arg => this.accept(arg)).join(', ');
    res += ')';
    return res;
  },
  CallExpression: function (node) {
    var res = '';

    if (node.callee && (node.callee.type === 'Identifier' || node.callee.type === 'MemberExpression')) {
      res += this.accept(node.callee);
    } else {
      res += '(' + this.accept(node.callee) + ')';
    }

    res += '(';
    res += node.arguments.map(arg => this.accept(arg)).join(', ');
    res += ')';
    return res;
  },
  MemberExpression: function (node) {
    var res = '';

    if (node.object.type === 'Identifier' || node.object.type === 'MemberExpression') {
      res += this.accept(node.object);
    } else {
      res += '(' + this.accept(node.object) + ')';
    }

    if (node.computed) {
      res += '[';
      res += this.accept(node.property);
      res += ']';
    } else {
      res += '.';
      res += this.accept(node.property);
    }

    return res;
  },
  IfStatement: function (node) {
    var res = 'if (';
    res += this.accept(node.test);
    res += ') ';
    res += this.accept(node.consequent);

    if (node.alternate) {
      res += '\nelse ';
      res += this.accept(node.alternate);
    }

    return res;
  },
  WhileStatement: function (node) {
    var res = 'while (';
    res += this.accept(node.test);
    res += ') ';
    res += this.accept(node.body);
    return res;
  },
  ForCountStatement: function (node) {
    var res = ['for', this.accept(node.for), 'from', this.accept(node.from), 'to', this.accept(node.to)].join(' ') + ' ';
    res += this.accept(node.body);
    return res;
  },
  ForOfStatement: function (node) {
    var res = ['for', this.accept(node.for), 'of', this.accept(node.of)].join(' ') + ' ';
    res += this.accept(node.body);
    return res;
  },
  ForInStatement: function (node) {
    var res = ['for', this.accept(node.for), 'in', this.accept(node.in)].join(' ') + ' ';
    res += this.accept(node.body);
    return res;
  },
  BreakStatement: function () {
    return 'break;';
  },
  ReturnStatement: function (node) {
    if (node.argument) return 'return ' + this.accept(node.argument) + ';';
    return 'return;';
  },
  BinaryExpression: function (node) {
    var callOrderOf = snode => {
      if (!snode) return 100;

      if (snode.type === 'BinaryExpression') {
        return Math.max(_SCGrammar.default.operatorOrder[snode.operator.content], callOrderOf(snode.right), callOrderOf(snode.right));
      } else if (snode.type === 'UnaryExpression') return -1;else return -2;
    };

    var operatorContent = node.operator.content;
    var cOrder = _SCGrammar.default.operatorOrder[operatorContent];
    var left = this.accept(node.left);
    var right = this.accept(node.right);
    var leftOrder = callOrderOf(node.left);
    var rightOrder = callOrderOf(node.right);
    if (leftOrder > cOrder) left = '(' + left + ')';
    if (rightOrder >= cOrder) right = '(' + right + ')';
    return [left, operatorContent, right].join(' ');
  },
  UnaryExpression: function (node) {
    var res = node.operator.content;

    if (node.argument && node.argument.type === 'BinaryExpression') {
      res += '(' + this.accept(node.argument) + ')';
    } else {
      res += this.accept(node.argument);
    }

    return res;
  },
  ExpressionStatement: function (node) {
    return this.accept(node.expression) + ';';
  },
  NumericLiteral: function (node) {
    if (typeof node.value === "number") return node.value.toString();
    return '0';
  },
  StringLiteral: function (node) {
    return JSON.stringify(node.value);
  },
  ArrayExpression: function (node) {
    var res = '[';
    var elementTexts = node.elements.map(arg => this.accept(arg));
    var needWrap = elementTexts.some(et => {
      return et.length > 60;
    });

    if (needWrap) {
      res += '\n';
      res += elementTexts.join(',\n').split('\n').map(t => '    ' + t).join('\n');
      res += '\n';
    } else {
      res += elementTexts.join(', ');
    }

    res += ']';
    return res;
  },
  ObjectProperty: function (node) {
    return this.accept(node.key) + ': ' + this.accept(node.value);
  },
  ObjectExpression: function (node) {
    var res = '{';
    var propertyTexts = node.properties.map(arg => this.accept(arg));
    var needWrap = propertyTexts.some(et => {
      return et.length > 60;
    });

    if (needWrap) {
      res += '\n';
      res += propertyTexts.join(',\n').split('\n').map(t => '    ' + t).join('\n');
      res += '\n';
    } else {
      res += propertyTexts.join(', ');
    }

    res += '}';
    return res;
  }
};
var _default = SCCodeGenerator;
/***
 * @extends SCCodeGenerator
 * @constructor
 */

exports.default = _default;

function SCCodeHighlightingGenerator() {
  SCCodeGenerator.apply(this, arguments);
}

_OOP.default.mixClass(SCCodeHighlightingGenerator, SCCodeGenerator);

SCCodeHighlightingGenerator.prototype.accept = function (node) {
  if (!node) return '/*TODO*/';
  var visitor = this.visitors[node.type];

  if (visitor) {
    try {
      return `<div class="sclang-node sclang-${node.type}${node.error ? ' sclang-error' : ''}"${node.error ? 'title=' + JSON.stringify(node.error) : ''}>${this.visitors[node.type].apply(this, arguments)}</div>`;
    } catch (e) {
      console.error(e, node);
    }
  } else {
    return '[' + node.type + ']'; // throw { message: 'Can not handle ', node: node };
  }
};

SCCodeHighlightingGenerator.prototype.visitors = Object.assign({}, SCCodeGenerator.prototype.visitors, {
  IfStatement: function (node) {
    var res = '<span class="sclang-keyword">if</span> (';
    res += this.accept(node.test);
    res += ') ';
    res += this.accept(node.consequent);

    if (node.alternate) {
      res += '\n<span class="sclang-keyword">else</span> ';
      res += this.accept(node.alternate);
    }

    return res;
  },
  FunctionDeclaration: function (node) {
    var bodyCode = this.accept(node.body);
    var argsCode = node.params.map(arg => this.accept(arg)).join(', ');
    return `<span class="sclang-keyword">function</span> ${node.id.name}(${argsCode}) ${bodyCode}`;
  },
  ForCountStatement: function (node) {
    var res = ['<span class="sclang-keyword">for</span>', this.accept(node.for), '<span class="sclang-keyword">from</span>', this.accept(node.from), '<span class="sclang-keyword">to</span>', this.accept(node.to)].join(' ') + ' ';
    res += this.accept(node.body);
    return res;
  },
  ForOfStatement: function (node) {
    var res = ['<span class="sclang-keyword">for</span>', this.accept(node.for), '<span class="sclang-keyword">of</span>', this.accept(node.of)].join(' ') + ' ';
    res += this.accept(node.body);
    return res;
  },
  ForInStatement: function (node) {
    var res = ['<span class="sclang-keyword">for</span>', this.accept(node.for), '<span class="sclang-keyword">in</span>', this.accept(node.in)].join(' ') + ' ';
    res += this.accept(node.body);
    return res;
  },
  VariableDeclaration: function (node) {
    var res = '<span class="sclang-keyword">var</span> ' + node.id.name;
    var typeText;
    if (node.typeAnnotation) typeText = this.accept(node.typeAnnotation);
    if (typeText && typeText !== 'any') res += ': ' + typeText;
    if (node.init) res += ' = ' + this.accept(node.init);
    res += ';';
    return res;
  },
  LinkedType: function (node) {
    return '<span class="sclang-keyword">linktype</span>&nbsp;' + this.accept(node.address);
  }
});

SCCodeHighlightingGenerator.prototype.generate = function (ast) {
  var text = this.accept(ast);
  return text.split('\n').map(text => {
    return text.replace(/^\s+/, full => {
      return `<span>${'&nbsp;'.repeat(full.length)}</span>`;
    });
  }).join('<br>');
};

function generateSCCode(ast) {
  var generator = new SCCodeGenerator();
  return generator.generate(ast);
}

function generateSCHighlightPreviewCode(ast) {
  var generator = new SCCodeHighlightingGenerator();
  return generator.generate(ast);
}
};

moduleFactories["node_modules/absol/src/SCLang/SCProgramInstance.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/SCLang/SCProgramInstance.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.SCDynamicLibScope = exports.SCStaticLibScope = void 0;

require("./SCOperators");

var _SCOperatorExecutor = _interopRequireDefault(require("./SCOperatorExecutor"));

var _SCScope = _interopRequireDefault(require("./SCScope"));

var _stringGenerate = require("../String/stringGenerate");

var _SCCodeGenerator = require("./SCCodeGenerator");

var _ext2MineType = _interopRequireDefault(require("../Converter/ext2MineType"));


var SCStaticLibScope = new _SCScope.default();
exports.SCStaticLibScope = SCStaticLibScope;
var SCDynamicLibScope = new _SCScope.default(SCStaticLibScope);
exports.SCDynamicLibScope = SCDynamicLibScope;

function SCProgramInstance(ast, env) {
  env = env || {};

  if (env instanceof _SCScope.default) {
    this.global = env;
  } else {
    this.global = new _SCScope.default(SCDynamicLibScope);
    Object.keys(env).forEach(key => {
      this.global.declareConst(key, env[key]);
    });
  }

  this.topScope = this.global;
  this.stack = [{
    scope: this.global
  }];
  this.ast = ast;
}

SCProgramInstance.prototype.exec = function () {
  return this.accept(this.ast);
};

SCProgramInstance.prototype.accept = function (node) {
  var visitor = this.visitors[node.type];

  if (visitor) {
    return this.visitors[node.type].apply(this, arguments); // try {
    //
    // } catch (e) {
    //     console.error(e, node)
    // }
  } else {
    throw this.makeError("NotHandle", 'Can not handle node type ' + node && node.type, node);
  }
};

SCProgramInstance.prototype.makeError = function (type, message, node) {
  var err = {};

  var copy = o => {
    if (!o) return o;

    if (o instanceof Array) {
      return o.map(e => copy(e));
    }

    if (o instanceof Date) return new Date(o.getTime());
    if (o.constructor === Object) return Object.keys(o).reduce((ac, key) => {
      ac[key] = copy(o[key]);
      return ac;
    }, o === node ? {
      error: message || type || true
    } : {});
    return o;
  };

  err.ast = copy(this.ast);
  err.message = message;
  err.errorNode = node;
  err._shown = false;
  Object.defineProperty(err, 'SHOW_ERROR', {
    enumerable: false,
    get: function () {
      if (this._shown) return;
      this._shown = true;
      var text = (0, _SCCodeGenerator.generateSCHighlightPreviewCode)(this.ast);
      var html = `<html><head><title>Error</title>
<style> 
 .sclang-Program {
    font-family: Consolas, serif;
    white-space: pre-wrap;
    line-height: 1.5;
}
.sclang-keyword {
    color: #2C82FF;
}
.sclang-node {
    display: inline;
}
 .sclang-error {
    animation: 1s linear infinite condemned_blink_effect;
 }
 


@keyframes condemned_blink_effect {
  0% {
    background-color: transparent;
  }
  50% {
    background-color: transparent;
  }
  51% {
     background-color: #f76868;
  }
  100% {
      background-color: #f76868;
  }
}
.sclang-CallExpression > .sclang-MemberExpression:first-child > .sclang-Identifier:last-child,
.sclang-CallExpression > .sclang-Identifier:first-child{
    color: #41a01b;
}</style></head><body>${text}</body></html>`;
      var blob = new Blob([html], {
        type: _ext2MineType.default.html
      });
      var url = URL.createObjectURL(blob);
      window.open(url, '_blank');
      setTimeout(() => {
        URL.revokeObjectURL(url);
      }, 4000);
      return true;
    }
  });
  return err;
};

SCProgramInstance.prototype.getRefOf = function (name) {
  return this.topScope.findRef(name);
};

SCProgramInstance.prototype.isFunctionReturned = function () {
  var topStack = this.stack[this.stack.length - 1];

  if (topStack.isFunctionReturned) {
    return topStack.isFunctionReturned();
  }

  return false;
};

SCProgramInstance.prototype.functionReturn = function (res) {
  var topStack = this.stack[this.stack.length - 1];

  if (topStack.functionReturn) {
    return topStack.functionReturn(res);
  }
};

SCProgramInstance.prototype.isLoopBroken = function () {
  var topStack = this.stack[this.stack.length - 1];

  if (topStack.loop && topStack.loop.length > 0) {
    // console.log(topStack.loop[topStack.loop.length - 1].isBroken());
    return topStack.loop[topStack.loop.length - 1].isBroken();
  }

  return false;
};

SCProgramInstance.prototype.loopPush = function (holder) {
  var topStack = this.stack[this.stack.length - 1];
  topStack.loop = topStack.loop || [];
  topStack.loop.push(holder);
};

SCProgramInstance.prototype.loopPop = function () {
  var topStack = this.stack[this.stack.length - 1];
  topStack.loop.pop();
};

SCProgramInstance.prototype.loopBreak = function () {
  var topStack = this.stack[this.stack.length - 1];
  topStack.loop[topStack.loop.length - 1].break();
};

SCProgramInstance.prototype.visitors = {
  Program: function (node) {
    var i = 0;
    var statements = node.body;
    var returnWith;
    var res = new Promise(rs => returnWith = rs);

    var runStep = () => {
      var statement;
      var sResult;

      while (i < statements.length) {
        statement = statements[i++];
        sResult = this.accept(statement);

        if (sResult && sResult.then) {
          sResult.then(runStep);
          return;
        }
      }

      returnWith(0);
    };

    runStep();
    return res;
  },
  BooleanLiteral: function (node) {
    return node.value;
  },
  BlockStatement: function (node) {
    var i = 0;
    var statements = node.body;
    var returnWith;
    var resolved = false;
    var result = undefined;
    var sync = new Promise(rs => {
      returnWith = res => {
        resolved = true;
        result = res;
        rs(res);
      };
    });

    var runStep = () => {
      var statement;
      var sResult;

      while (i < statements.length && !this.isFunctionReturned() && !this.isLoopBroken()) {
        statement = statements[i++];
        sResult = this.accept(statement);

        if (sResult && sResult.then) {
          sResult.then(runStep);
          return;
        }
      }

      returnWith(0);
    };

    runStep();

    if (resolved) {
      return this.result;
    } else return sync;
  },
  ExpressionStatement: function (node) {
    return this.accept(node.expression);
  },
  VariableDeclaration: function (node) {
    var initValue = null;

    if (node.init) {
      initValue = this.accept(node.init, 'const');
    }

    if (initValue && initValue.then) {
      return initValue.then(result => {
        this.topScope.declareVar(node.id.name, result);
      });
    } else {
      this.topScope.declareVar(node.id.name, initValue);
    }
  },
  ArrayExpression: function (node) {
    var res = [];
    var resolved = false;
    var resolve;
    var sync = new Promise(rs => {
      resolve = () => {
        resolved = true;
        rs(res);
      };
    });
    var elements = node.elements;
    var i = 0;

    var doStep = () => {
      var eResult;

      while (i < elements.length) {
        eResult = this.accept(elements[i++], 'const');

        if (eResult && eResult.then) {
          eResult.then(item => {
            res.push(item);
            doStep();
          });
          return;
        } else {
          res.push(eResult);
        }
      }

      resolve();
    };

    doStep();

    if (resolved) {
      return res;
    } else {
      return sync;
    }
  },
  ForCountStatement: function (node) {
    var idRef = this.accept(node.for, 'ref');
    var from = this.accept(node.from, 'const');
    var to = this.accept(node.to, 'const');
    var result;
    var resolved = false;
    var resolveWith;
    var sync = new Promise(function (rs) {
      resolveWith = res => {
        result = res;
        resolved = true;
        rs(res);
      };
    });
    var i = from;

    var runStep = () => {
      while (i <= to) {
        idRef.set(i);
        ++i;
        var stResult = this.accept(node.body);

        if (stResult && stResult.then) {
          stResult.then(runStep);
          return;
        }
      }

      resolveWith(0);
    };

    runStep();

    if (resolved) {
      return result;
    } else {
      return sync;
    }
  },
  WhileStatement: function (node) {
    var resolved = false;
    var resolve;
    var sync = new Promise(rs => {
      resolve = () => {
        resolved = true;
        rs(undefined);
      };
    });
    this.loopPush({
      break: () => {
        resolved = true;
      },
      isBroken: () => {
        return resolved;
      }
    });
    var state = 0;

    var doStep = () => {
      var sResult;

      while (!resolved) {
        if (this.isFunctionReturned()) {
          resolve();
          return;
        }

        if (state === 0) {
          sResult = this.accept(node.test, 'const');
          state = 1;
        } else {
          sResult = this.accept(node.body);
          state = 0;
        }

        if (sResult && typeof sResult.then === "function") {
          sResult.then(sResult => {
            if (state === 0 || sResult) {
              doStep();
            } else {
              resolve();
            }
          });
          return;
        } else {
          if (state === 1 && !sResult) {
            resolve();
          }
        }
      }
    };

    doStep();

    if (resolved) {
      this.loopPop();
      return undefined;
    } else {
      return sync.then(() => this.loopPop());
    }
  },
  DoWhileStatement: function (node) {
    var resolved = false;
    var resolve;
    var sync = new Promise(rs => {
      resolve = () => {
        resolved = true;
        rs(undefined);
      };
    });
    var state = 1;

    var doStep = () => {
      var sResult;

      while (!resolved) {
        if (state === 0) {
          sResult = this.accept(node.test, 'const');
          state = 1;
        } else {
          sResult = this.accept(node.body);
          state = 0;
        }

        if (sResult && typeof sResult.then === "function") {
          sResult.then(sResult => {
            if (state === 0 || sResult) {
              doStep();
            } else {
              resolve();
            }
          });
          return;
        } else {
          if (state === 1 && !sResult) {
            resolve();
          }
        }
      }
    };

    doStep();

    if (resolved) {
      return undefined;
    } else {
      return sync;
    }
  },
  ForOfStatement: function (node) {
    var valRef = this.accept(node.for, 'ref');
    var of = this.accept(node.of, 'const');
    var values;
    var result;
    var resolved = false;
    var resolveWith;
    var sync = new Promise(function (rs) {
      resolveWith = res => {
        result = res;
        resolved = true;
        rs(res);
      };
    });
    var i = 0;

    var runStep = () => {
      while (i < values.length) {
        valRef.set(values[i]);
        ++i;
        var stResult = this.accept(node.body);

        if (stResult && stResult.then) {
          stResult.then(runStep);
          return;
        }
      }

      resolveWith(0);
    };

    if (of.then) of.then(value => {
      of = value;
      values = of instanceof Array ? of : Object.values(value);
      runStep();
    });else {
      values = of instanceof Array ? of : Object.values(value);
      runStep();
    }

    if (resolved) {
      return result;
    } else {
      return sync;
    }
  },
  ForInStatement: function (node) {
    var valRef = this.accept(node.for, 'ref');
    var inObj = this.accept(node.in, 'const');
    var keys;
    var result;
    var resolved = false;
    var resolveWith;
    var sync = new Promise(function (rs) {
      resolveWith = res => {
        result = res;
        resolved = true;
        rs(res);
      };
    });
    var i = 0;

    var runStep = () => {
      while (i < keys.length) {
        valRef.set(keys[i]);
        ++i;
        var stResult = this.accept(node.body);

        if (stResult && stResult.then) {
          stResult.then(runStep);
          return;
        }
      }

      resolveWith(0);
    };

    if (inObj.then) inObj.then(value => {
      inObj = value;
      keys = Object.keys(inObj);
      runStep();
    });else {
      keys = Object.keys(inObj);
      runStep();
    }

    if (resolved) {
      return result;
    } else {
      return sync;
    }
  },
  AssignStatement: function (node) {
    var leftRef = this.accept(node.left, 'ref');
    var right = this.accept(node.right, 'const');
    leftRef.set(right);
  },
  IfStatement: function (node) {
    var test = this.accept(node.test);

    if (test && typeof test.then === 'function') {
      return test.then(test => {
        if (test) {
          return this.accept(node.consequent);
        } else if (node.alternate) {
          return this.accept(node.alternate);
        }
      });
    } else {
      if (test) {
        return this.accept(node.consequent);
      } else if (node.alternate) {
        return this.accept(node.alternate);
      }
    }
  },
  // CallExpression: function (node){
  //     var funcRef;
  //     var object = null;
  //     var func = null;
  //     if (node.callee.type === 'Identifier'){
  //         funcRef = this.topScope.get(node.callee.name);
  //     }
  //     else {
  //         console.log(node.callee)
  //     }
  //
  //Vả
  // },
  NullLiteral: function (node) {
    return null;
  },
  NumericLiteral: function (node) {
    return node.value;
  },
  StringLiteral: function (node) {
    return node.value;
  },
  BinaryExpression: function (node) {
    var leftValue = this.accept(node.left, 'const');
    var rightValue = this.accept(node.right, 'const');
    var sync = [];

    if (leftValue && leftValue.then) {
      sync.push(leftValue);
      leftValue.then(result => leftValue = result);
    }

    if (rightValue && rightValue.then) {
      sync.push(rightValue);
      rightValue.then(result => rightValue = result);
    }

    if (sync.length === 0) {
      return _SCOperatorExecutor.default.executeBinaryOperator(node.operator.content, leftValue, rightValue);
    } else {
      return Promise.all(sync).then(u => {
        return _SCOperatorExecutor.default.executeBinaryOperator(node.operator.content, leftValue, rightValue);
      });
    }
  },
  UnaryExpression: function (node) {
    var arg = this.accept(node.argument, 'const');

    if (arg && arg.then) {
      return arg.then(value => _SCOperatorExecutor.default.executeUnaryOperator(node.operator.content, value));
    } else {
      return _SCOperatorExecutor.default.executeUnaryOperator(node.operator.content, arg);
    }
  },
  Identifier: function (node, type) {
    var ref;

    if (type === 'const') {
      ref = this.getRefOf(node.name);

      if (ref) {
        return ref.get();
      } else {
        throw this.makeError("NotDeclare", "", node);
      }
    } else if (type === 'ref') {
      ref = this.getRefOf(node.name);

      if (ref) {
        return ref;
      } else {
        this.makeError("NotDeclare", "", node);
      }
    }

    return node.name;
  },
  CallExpression: function (node) {
    var calleeFunction;
    var object = null;
    var ref;

    if (node.callee.type === "Identifier") {
      ref = this.getRefOf(node.callee.name);
      calleeFunction = ref.get();
    } else if (node.callee.type === 'MemberExpression') {
      ref = this.accept(node.callee);
      calleeFunction = ref.get();
      object = ref.object;
    }

    var argumentValues = node.arguments.map(exp => {
      return this.accept(exp, 'const');
    });
    var sync = [];
    argumentValues.forEach((arg, i) => {
      if (arg && arg.then) {
        sync.push(arg.then(result => {
          argumentValues[i] = result;
        }));
      }
    });

    if (sync.length > 0) {
      return Promise.all(sync).then(() => {
        if (!calleeFunction) {
          throw {
            message: 'Undefined function ' + (0, _SCCodeGenerator.generateSCCode)(node.callee),
            ast: node
          };
        }

        return calleeFunction.apply(object, argumentValues);
      });
    } else {
      if (!calleeFunction) {
        throw {
          message: 'Undefined function ' + (0, _SCCodeGenerator.generateSCCode)(node.callee),
          ast: node
        };
      }

      return calleeFunction.apply(object, argumentValues);
    }
  },
  NewExpression: function (node) {
    var calleeFunction;
    var ref;

    if (node.callee.type === "Identifier") {
      ref = this.getRefOf(node.callee.name);
      calleeFunction = ref.get();
    } else if (node.callee.type === 'MemberExpression') {
      ref = this.accept(node.callee);
      calleeFunction = ref.get();
    }

    var argumentValues = node.arguments.map(exp => {
      return this.accept(exp, 'const');
    });
    var code = `return new clazz(${argumentValues.map((u, i) => `args[${i}]`).join(', ')});`;
    var f = new Function('clazz', 'args', code);
    return f(calleeFunction, argumentValues);
  },
  MemberExpression: function (node, type) {
    var object = this.accept(node.object, 'const');
    var key;

    if (node.property.type === 'Identifier' && !node.computed) {
      key = node.property.name;
    } else {
      key = this.accept(node.property, 'const');
    }

    if (key && key.then) {
      return key.then(key => {
        if (!object) {
          throw {
            message: 'Can not access ' + JSON.stringify(key) + ' from ' + (0, _SCCodeGenerator.generateSCCode)(node.object)
          };
        }

        if (type === 'const') return object[key];
        return {
          set: function (value) {
            return object[key] = value;
          },
          get: function () {
            return object[key];
          },
          object: object
        };
      });
    } else {
      if (type === 'const') return object[key];
      return {
        set: function (value) {
          return object[key] = value;
        },
        get: function () {
          return object[key];
        },
        object: object
      };
    }
  },
  ObjectProperty: function (node) {
    var res = {};
    var key = this.accept(node.key);
    var value = this.accept(node.value, 'const');

    if (value && typeof value.then === 'function') {
      return value.then(value => {
        res[key] = value;
        return res;
      });
    } else {
      res[key] = value;
    }

    return res;
  },
  ObjectExpression: function (node) {
    var res = {};
    var resolved = false;
    var resolve;
    var sync = new Promise(rs => {
      resolve = () => {
        resolved = true;
        rs(res);
      };
    });
    var i = 0;
    var properties = node.properties;

    var doStep = () => {
      var pResult;

      while (i < properties.length) {
        pResult = this.accept(properties[i++]);

        if (pResult && typeof pResult.then === "function") {
          pResult.then(pO => {
            Object.assign(res, pO);
          });
          return;
        } else {
          Object.assign(res, pResult);
        }
      }

      resolve();
    };

    doStep();

    if (resolved) {
      return res;
    } else {
      return sync;
    }
  },
  FunctionDeclaration: function (node) {
    var self = this; //todo: overloading

    var functionName = node.id.name;

    function f() {
      var scope = new _SCScope.default(self.topScope);
      var result = undefined;
      var resolved = false;

      var functionReturn = res => {
        resolved = true;
        result = res;
      };

      var isFunctionReturned = () => {
        return resolved;
      };

      self.stack.push({
        scope: scope,
        functionReturn: functionReturn,
        isFunctionReturned: isFunctionReturned
      });
      self.topScope = scope;

      for (var i = 0; i < node.params.length; ++i) {
        scope.declareVar(node.params[i].id.name, arguments[i]);
      }

      scope.declareVar('arguments', arguments);
      var res = self.accept(node.body);

      if (res && typeof res.then === "function") {
        return res.then(res => {
          if (self.stack[self.stack.length - 1].scope === scope) {
            self.stack.pop();
            self.topScope = self.stack[self.stack.length - 1].scope;
            return result;
          } else {
            throw new Error('EngineError: Bug in stack!');
          }
        });
      } else {
        if (self.stack[self.stack.length - 1].scope === scope) {
          self.stack.pop();
          self.topScope = self.stack[self.stack.length - 1].scope;
          return result;
        } else {
          throw new Error('EngineError: Bug in stack!');
        }
      }
    }

    var code = `return function ${functionName}(${node.params.map(pr => pr.id.name || (0, _stringGenerate.randomIdent)(5)).join(',')}) { return f.apply(this, arguments); }`;
    var func = new Function('f', code)(f);
    this.topScope.declareVar(functionName, func);
    return func;
  },
  BreakStatement: function (node) {
    this.loopBreak();
  },
  ReturnStatement: function (node) {
    var res = undefined;

    if (node.argument) {
      res = this.accept(node.argument, 'const');
    }

    if (res && res.then) {
      res.then(res => {
        this.functionReturn(res);
      });
    } else {
      this.functionReturn(res);
    }
  }
};
var _default = SCProgramInstance;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Network/XLoader.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Network/XLoader.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.loadScript = loadScript;
exports.isImageURLAllowCrossOrigin = isImageURLAllowCrossOrigin;
exports.default = void 0;
var XLoader = {};

function loadScript(url, onComplete, onError) {
  return new Promise(function (resolve, reject) {
    var script = document.createElement("script");
    script.type = "text/javascript";

    if (script.readyState) {
      //IE
      script.onreadystatechange = function () {
        if (script.readyState === "loaded" || script.readyState === "complete") {
          script.onreadystatechange = null;
          onComplete && onComplete();
          resolve();
        }
      };
    } else {
      //Others
      script.onload = function () {
        script.onload = null;
        script.onerror = null;
        onComplete && onComplete();
        resolve();
      };

      script.onerror = function () {
        script.onerror = null;
        script.onload = null;
        script.remove();
        onError && onError();
        reject();
      };
    }

    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
  });
}

XLoader.loadScript = loadScript;

function isImageURLAllowCrossOrigin(url) {
  return new Promise((rs, rj) => {
    url = url || '';

    if (url.startsWith('data:') || url.startsWith('blob:')) {
      rs(true);
      return;
    }

    var img = new Image(); // img.crossOrigin = "anonymous";

    img.onload = function () {
      var canvas = document.createElement('canvas');
      canvas.width = 10;
      canvas.height = 10;
      var ctx = canvas.getContext("2d");
      ctx.drawImage(this, 0, 0);

      try {
        ctx.getImageData(0, 0, 10, 10);
        rs(true);
      } catch (err) {
        rs(false);
      }
    };

    img.onerror = function (event) {
      rj(event.error || event);
    };

    img.src = url;
  });
}

var _default = XLoader;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Print/PrintSerialHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Print/PrintSerialHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.computePrintAttr = computePrintAttr;
exports.default = void 0;

var _Rectangle = _interopRequireDefault(require("../Math/Rectangle"));

var _Svg = _interopRequireWildcard(require("../HTML5/Svg"));

var _Dom = _interopRequireWildcard(require("../HTML5/Dom"));

var _attribute = require("../JSX/attribute");

var _XLoader = require("../Network/XLoader");

var _noop = _interopRequireDefault(require("../Code/noop"));




var _ = _Dom.default.ShareInstance._;
var $ = _Dom.default.ShareInstance.$;
var $$ = _Dom.default.ShareInstance.$$;

function computePrintAttr(elt) {
  var style = getComputedStyle(elt);
  var fontSize = elt.getFontSize();
  var lineHeight = style.getPropertyValue('line-height');
  if (lineHeight === 'normal') lineHeight = 1.2;else lineHeight = parseFloat(lineHeight.replace('px', '')) / fontSize;
  if (!isNaN(lineHeight)) lineHeight = 1.2;
  var fontWeight = style.getPropertyValue('font-weight');
  var fontStyle = fontWeight === '400' ? 'normal' : 'bold';
  var dirs = ['top', 'right', 'bottom', 'left'];
  var paddingStyle = dirs.map(dir => (0, _attribute.parseMeasureValue)(style.getPropertyValue('padding-' + dir)));
  var borderWidthStyle = dirs.map(dir => (0, _attribute.parseMeasureValue)(style.getPropertyValue('border-' + dir + '-width')));

  var contentBound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

  contentBound.x += paddingStyle[3].value + borderWidthStyle[3].value;
  contentBound.y += paddingStyle[0].value + borderWidthStyle[0].value;
  contentBound.width += paddingStyle[1].value + borderWidthStyle[1].value + paddingStyle[3].value + borderWidthStyle[3].value;
  contentBound.height += paddingStyle[2].value + borderWidthStyle[2].value + paddingStyle[0].value + borderWidthStyle[0].value;
  return {
    contentBound: contentBound,
    whiteSpace: style.getPropertyValue('white-space'),
    style: {
      color: style.getPropertyValue('color'),
      fontFamily: style.getPropertyValue('font-family'),
      fontStyle: fontStyle,
      lineHeight: lineHeight,
      fontSize: fontSize,
      align: style.getPropertyValue('text-align')
    }
  };
}
/***
 *
 * @type {PSHandler[]}
 */


var PrintSerialHandlers = [];
PrintSerialHandlers.push({
  id: 'TextNode',
  match: elt => elt.nodeType === Node.TEXT_NODE,
  exec: (printer, text, scope, stack, accept) => {
    var O = printer.O;
    var elt = text.parentElement;

    var bound = _Rectangle.default.fromClientRect((0, _Dom.getTextNodeBound)(text));

    if (bound.width === 0) return;
    var printAttr = computePrintAttr(elt);
    var txt = text.data;
    var y = -Infinity;
    var c;
    var range;
    var parts = [];
    var cPart;
    var j;
    var delta = printAttr.style.lineHeight * printAttr.style.fontSize / 3;
    var rect;
    var i = 0;

    while (i < txt.length) {
      c = txt[i];

      if (!c.match(/[\s\n]/)) {
        j = i + 1;

        while (j < txt.length) {
          c = txt[j];

          if (c.match(/[\s\n]/)) {
            break;
          } else {
            ++j;
          }
        }

        range = document.createRange();
        range.setStart(text, i);
        range.setEnd(text, j);
        rect = _Rectangle.default.fromClientRect(range.getBoundingClientRect());

        if (Math.abs(rect.y - y) < delta) {
          cPart.end = j;
          cPart.rect = cPart.rect.merge(rect);
        } else {
          cPart = {
            start: i,
            end: j,
            rect: rect
          };
          y = rect.y;
          parts.push(cPart);
        }

        i = j;
      } else {
        ++i;
      }
    }

    parts.forEach(part => {
      rect = part.rect;
      rect.x -= O.x;
      rect.y -= O.y;
      rect.width += printAttr.style.fontSize * 1000;
      var lineTxt = txt.substring(part.start, part.end);

      if (printAttr.whiteSpace === 'normal') {
        lineTxt = lineTxt.replace(/[\s\n]+/g, ' ');
      }

      delete printAttr.style.align; //text-node bound

      printer.text(lineTxt, rect, printAttr.style);
    });
  }
});
PrintSerialHandlers.push({
  id: 'Border',
  match: (elt, scope, stack) => {
    if (scope.isDeclared('borderStyle')) return false;
    var style = getComputedStyle(elt);
    var borderColor = style.getPropertyValue('border-color');
    var borderStyle = style.getPropertyValue('border-style');
    var borderWidth = style.getPropertyValue('border-width');
    var borderRadius = style.getPropertyValue('border-radius');
    if (borderStyle === 'none' || borderWidth === '0px') return false;
    scope.declare('borderStyle', {
      width: parseFloat(borderWidth.replace('px', '')),
      radius: (0, _attribute.parseMeasureValue)(borderRadius),
      color: borderColor
    });
    return true;
  },
  exec: (printer, elt, scope, stack, accept) => {
    var borderStyle = scope.get('borderStyle');

    var bound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    var rect = bound.clone();
    var strokeWidth = borderStyle.width;

    if (elt.tagName === 'TD' || elt.tagName === 'TH') {
      rect.x -= printer.O.x;
      rect.y -= printer.O.y;
    } else {
      rect.x -= printer.O.x - strokeWidth / 2;
      rect.y -= printer.O.y - strokeWidth / 2;
      rect.width -= strokeWidth;
      rect.height -= strokeWidth;
    }

    var radius = borderStyle.radius;
    var rounded;

    if (radius) {
      switch (radius.unit) {
        case '%':
          rounded = [radius.value * rect.width / 100, radius.value * rect.height / 100];
          break;

        case 'px':
          rounded = radius.value;
          break;
      }
    }

    printer.rect(rect, {
      stroke: borderStyle.color,
      rounded: rounded,
      strokeWidth: strokeWidth
    });
    return true;
  }
});
PrintSerialHandlers.push({
  id: 'BackgroundImage',
  match: (elt, scope, stack) => {
    return elt.getComputedStyleValue('background-image') !== 'none';
  },
  exec: (printer, elt, scope, stack, accept) => {
    var style = getComputedStyle(elt);
    var backgroundSize = style.getPropertyValue('background-size');
    var url = style.getPropertyValue('background-image').trim().replace('url("', '').replace('")', '');

    var rect = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    rect.x -= printer.O.x;
    rect.y -= printer.O.y;
    var borderRadius = ['top-left', 'top-right', 'bottom-right', 'bottom-left'].map(key => (0, _attribute.parseMeasureValue)(style.getPropertyValue('border-' + key + '-radius')));
    var image = (0, _XLoader.isImageURLAllowCrossOrigin)(url).then(result => {
      /***
       *
       * @type {HTMLCanvasElement}
       */
      var canvas = document.createElement('canvas');
      var width = rect.width;
      var height = rect.height;
      canvas.width = width;
      canvas.height = height;
      var image = new Image();
      image.crossOrigin = 'anonymous';
      image.src = result ? url : 'https://absol.cf/crossdownload.php?file=' + encodeURIComponent(url);
      var ctx = canvas.getContext('2d');
      var isRect = borderRadius.every(x => x.value === 0);
      var x, y, r;
      var eclipses = [];
      var points = [];

      if (!isRect) {
        r = borderRadius[0];
        x = r.unit === '%' ? r.value / 100 * width : r.value;
        y = 0;
        points.push([x, y]);
        r = borderRadius[1];
        x = r.unit === '%' ? (1 - r.value / 100) * width : width - r.value;
        points.push([x, y]);

        if (r.value > 0) {
          y = r.unit === '%' ? r.value / 100 * height : r.value;
          eclipses.push([x, y, width - x, y, 0, -Math.PI / 2, 0]);
          x = width;
          points.push([x, y]);
        } else {
          x = width;
        }

        r = borderRadius[2];
        y = r.unit === '%' ? (1 - r.value / 100) * height : height - r.value;
        points.push([x, y]);

        if (r.value > 0) {
          x = r.unit === '%' ? (1 - r.value / 100) * width : width - r.value;
          eclipses.push([x, y, width - x, height - y, 0, 0, Math.PI / 2]);
          y = height;
          points.push([x, y]);
        } else {
          y = height;
        }

        r = borderRadius[3];
        x = r.unit === '%' ? r.value / 100 * width : r.value;
        points.push([x, y]);

        if (r.value > 0) {
          y = r.unit === '%' ? (1 - r.value / 100) * height : height - r.value;
          eclipses.push([x, y, x, height - y, 0, Math.PI / 2, Math.PI]);
          x = 0;
          points.push([x, y]);
        } else {
          x = 0;
        }

        r = borderRadius[0];
        y = r.unit === '%' ? r.value / 100 * height : r.value;
        points.push([x, y]);

        if (r.value > 0) {
          x = r.unit === '%' ? r.value / 100 * width : r.value;
          eclipses.push([x, y, x, y, 0, Math.PI, Math.PI * 3 / 2]);
        }

        ctx.beginPath();
        points.forEach((p, i) => {
          if (i === 0) ctx.moveTo(p[0], p[1]);else ctx.lineTo(p[0], p[1]);
        });
        ctx.closePath();
        ctx.fillStyle = 'red';
        ctx.fill();
        eclipses.forEach(e => {
          ctx.beginPath();
          ctx.ellipse(e[0], e[1], e[2], e[3], e[4], e[5], e[6]);
          ctx.fill();
        });
        ctx.globalCompositeOperation = 'source-in';
      }

      return new Promise(rs => {
        image.onload = function () {
          var scale;
          var nW;
          var nH; //todo: handle more

          switch (backgroundSize) {
            case 'cover':
              scale = Math.max(width / image.naturalWidth, height / image.height);
              nW = image.naturalWidth * scale;
              nH = image.naturalHeight * scale;
              ctx.drawImage(image, 0, 0, nW, nH);
              break;

            case 'auto':
            default:
              ctx.drawImage(image, 0, 0);
          }

          rs(canvas);
        };

        image.onerror = function () {
          console.error('can not load ', image.src);
          rs(null);
        };
      });
    }).catch(err => {
      console.error(err);
    });
    printer.image(image, rect);
    return true;
  }
});
PrintSerialHandlers.push({
  id: 'MDI_FA',
  match: (elt, scope, stack) => elt.classList && (elt.classList.contains('mdi') || elt.classList.contains('fab') || elt.classList.contains('far') || elt.classList.contains('fas') || elt.classList.contains('material-icons')),
  exec: (printer, elt, scope, stack, accept) => {
    var style = elt.classList.contains('material-icons') ? getComputedStyle(elt) : getComputedStyle(elt, '::before');
    var content = elt.classList.contains('material-icons') ? elt.innerHTML : style.getPropertyValue('content');
    content = content.replace('"', '');
    var font = style.getPropertyValue('font');

    var rect = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    if (rect.width * rect.height === 0) return;
    var canvas = document.createElement('canvas');
    canvas.width = rect.width;
    canvas.height = rect.height;
    var ctx = canvas.getContext('2d');
    ctx.font = font;
    ctx.textBaseline = "top";
    rect.x -= printer.O.x;
    rect.y -= printer.O.y;
    ctx.fillStyle = style.getPropertyValue('color');
    ctx.fillText(content, 0, 0);
    printer.image(canvas, rect);
  }
});
PrintSerialHandlers.push({
  id: 'Img',
  match: elt => elt.tagName && elt.tagName.toLowerCase() === 'img' && elt.src && elt.naturalWidth,
  exec: (printer, elt, scope, stack, accept) => {
    var bound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    if (bound.width === 0) return;
    var rect = bound.clone();
    rect.x -= printer.O.x;
    rect.y -= printer.O.y;
    printer.image(elt, rect);
  }
});
PrintSerialHandlers.push({
  id: 'Canvas',
  match: elt => elt.tagName && elt.tagName.toLowerCase() === 'canvas',
  exec: (printer, elt, scope, stack, accept) => {
    var bound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    if (bound.width === 0) return;
    var rect = bound.clone();
    rect.x -= printer.O.x;
    rect.y -= printer.O.y;
    printer.image(elt, rect);
  }
});
PrintSerialHandlers.push({
  id: 'SVG',
  match: elt => elt.tagName && elt.tagName.toLowerCase() === 'svg',
  exec: (printer, elt, scope, stack, accept) => {
    var bound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    if (bound.width === 0) return;
    var rect = bound.clone();
    rect.x -= printer.O.x;
    rect.y -= printer.O.y;

    var res = _Svg.default.svgToCanvas(elt.__origin__).catch(err => {
      console.error(err);
    });

    res.elt = elt;
    printer.image(res, rect);
  }
});
PrintSerialHandlers.push({
  id: 'TextInput',
  match: (elt, scope, stack) => {
    return elt.tagName === 'INPUT' && (elt.attr('type') === 'text' || elt.attr('type') === 'number');
  },
  exec: (printer, elt, scope, stack, accept) => {
    var O = printer.O;
    var style = getComputedStyle(elt);
    var paddingLeft = (0, _attribute.parseMeasureValue)(style.getPropertyValue('padding-left'));
    var paddingTop = (0, _attribute.parseMeasureValue)(style.getPropertyValue('padding-top'));
    var paddingBottom = (0, _attribute.parseMeasureValue)(style.getPropertyValue('padding-bottom'));
    var borderLeftWidth = (0, _attribute.parseMeasureValue)(style.getPropertyValue('border-left-width'));
    var borderTopWidth = (0, _attribute.parseMeasureValue)(style.getPropertyValue('border-top-width'));
    var borderBottomWidth = (0, _attribute.parseMeasureValue)(style.getPropertyValue('border-top-width'));

    var rect = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    var fontSize = elt.getFontSize();
    var lineHeight = style.getPropertyValue('line-height');
    if (lineHeight === 'normal') lineHeight = 1.2;else lineHeight = parseFloat(lineHeight.replace('px', '')) / fontSize;
    if (!isNaN(lineHeight)) lineHeight = 1.2;
    var fontWeight = style.getPropertyValue('font-weight');
    var fontStyle = fontWeight === '400' ? 'normal' : 'bold';
    rect.width = 700;
    rect.x += borderLeftWidth.value + paddingLeft.value - O.x;
    rect.height -= borderTopWidth.value + borderBottomWidth.value + paddingTop.value + paddingBottom.value;
    rect.y += borderTopWidth.value + paddingTop.value - O.y;
    var centerY = rect.centerPoint().y;
    rect.y = centerY - fontSize * lineHeight / 2;
    rect.height = fontSize * lineHeight;
    printer.text(elt.value, rect, {
      fontFamily: style.getPropertyValue('font-family'),
      fontStyle: fontStyle,
      fontSize: fontSize,
      lineHeight: lineHeight
    });
  }
});
PrintSerialHandlers.push({
  id: '*',
  match: () => true,
  exec: (printer, elt, scope, stack, accept) => {
    if (elt.getComputedStyleValue('display') === 'none') return;

    if (elt.childNodes) {
      Array.prototype.forEach.call(elt.childNodes, child => accept(child));
    }
  }
});
var _default = PrintSerialHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Print/PrintSerializer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Print/PrintSerializer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VarScope = _interopRequireDefault(require("../AppPattern/VarScope"));

var _Dom = _interopRequireWildcard(require("../HTML5/Dom"));

var _Rectangle = _interopRequireDefault(require("../Math/Rectangle"));

var _PrintSerialHandlers = _interopRequireDefault(require("./PrintSerialHandlers"));

var _XLoader = require("../Network/XLoader");

var _noop = _interopRequireDefault(require("../Code/noop"));




/***
 * @typedef {Object} PSHandler
 * @property {string} id
 * @property {function(elt:AElement, scope: VarScope, stack:Array<AElement>):boolean} match
 * @property {function(printer: PaperPrinter,elt:AElement|Text, scope: VarScope, stack:Array<{elt: AElement|Text, scope:VarScope}>, accept: function():void):(boolean|void)} exec - return true if run other handle
 *
 */

/***
 *
 * @constructor
 */
function PrintSerializer() {
  /***
   * @type {Array<PSHandler>}
   */
  this.handlers = this.handlers.slice();
}

PrintSerializer.prototype.handlers = _PrintSerialHandlers.default;
/***
 *
 * @param {PaperPrinter} printer
 * @param {AElement|AElementNS|Text} elt
 * @param {VarScope} scope
 * @param {Array<{elt: AElement|Text, scope:VarScope}>} stack
 */

PrintSerializer.prototype.accept = function (printer, elt, scope, stack) {
  if (elt.nodeType === Node.ELEMENT_NODE) _Dom.default.ShareInstance.$(elt);
  var handler;
  var matched, cont;

  for (var i = 0; (!matched || cont) && i < this.handlers.length; ++i) {
    handler = this.handlers[i];
    matched = handler.match(elt, scope, stack);

    if (matched) {
      cont = handler.exec(printer, elt, scope, stack, elt1 => {
        this.accept(printer, elt1, new _VarScope.default(scope), stack.concat([{
          elt: elt,
          scope: scope
        }]));
      });
    }
  }
};

PrintSerializer.prototype.serialize = function (elt, printer, onProcess) {
  var sync = [];
  var processInfo = {
    state: 'RENDER_DOM',
    total: {
      all: 0,
      text: 0,
      image: 0
    },
    dom: {
      text: 0,
      image: 0
    },
    onProcess: () => {
      onProcess && onProcess(processInfo);
    }
  };
  printer.processInfo = processInfo;
  var contentChild = (0, _Dom.depthClone)(elt, (originElt, copyElt) => {
    copyElt.__idx__ = processInfo.total.all;
    copyElt.__origin__ = originElt;
    processInfo.total.all++;
    var parent, fontWeight, style;
    var done = false;

    if (originElt.nodeType === Node.TEXT_NODE) {
      processInfo.total.text++;
      sync.push(new Promise(rs => {
        setTimeout(() => {
          parent = originElt.parentElement;

          if (!copyElt.__fontWeight__) {
            style = getComputedStyle(parent);
            fontWeight = parseInt(style.getPropertyValue('font-weight')); //not support other style

            copyElt.__fontWeight__ = fontWeight;

            if (fontWeight <= 400) {
              copyElt.parentElement.style.setProperty('font-weight', 'normal');
            } else if (fontWeight > 400) {
              copyElt.parentElement.style.setProperty('font-weight', 'bold');
            }

            processInfo.dom.text++;
          }

          processInfo.dom.text++;
          rs();
        }, 0);
      }));
    } else if (originElt.tagName && originElt.tagName.toLowerCase() === 'canvas') {
      copyElt.getContext('2d').drawImage(originElt, 0, 0);
    } else if (originElt.tagName === 'IMG' && !originElt.classList.contains('absol-attachhook') && originElt.src) {
      processInfo.total.image++;
      sync.push((0, _XLoader.isImageURLAllowCrossOrigin)(originElt.src).then(result => {
        var newElt;

        if (!result) {
          newElt = copyElt.cloneNode();
          newElt.__idx__ = copyElt.__idx__;
          newElt.__origin__ = copyElt.__origin__;
          newElt.src = 'https://absol.cf/crossdownload.php?file=' + encodeURIComponent(originElt.src);
          copyElt.parentElement.replaceChild(newElt, copyElt);
          return (0, _Dom.waitImageLoaded)(newElt, 10000).then(() => {
            if (!done) {
              processInfo.dom.image++;
              processInfo.onProcess();
              done = true;
            }
          });
        } else {
          return (0, _Dom.waitImageLoaded)(copyElt, 10000).then(() => {
            if (!done) {
              processInfo.dom.image++;
              processInfo.onProcess();
              done = true;
            }
          });
        }
      }, err => {
        console.error(err);

        if (!done) {
          processInfo.dom.image++;
          processInfo.onProcess();
          done = true;
        }
      }));
    } else if (originElt.tagName === 'INPUT') {
      copyElt.value = originElt.value;
    }
  });

  var content = _Dom.default.ShareInstance._({
    style: {
      width: 794 - 57 * 2 + 'px',
      //WIDTH: 1123 - 57*2
      display: 'inline-block',
      overflow: 'visible'
    },
    class: 'as-printer-content',
    child: contentChild
  });

  var scroller = _Dom.default.ShareInstance._({
    class: 'as-printer',
    style: {
      'text-size-adjust': 'none',
      '-webkit-text-size-adjust': 'none',
      '-moz-text-size-adjust': 'none',
      '-ms-text-size-adjust': 'none',
      position: 'fixed',
      top: '10px',
      bottom: '10px',
      left: '10px',
      overflow: 'scroll',
      width: '794px',
      // maxWidth: '90vw',
      background: 'white',
      // zIndex: 1000,
      opacity: '0',
      zIndex: '-100',
      visibility: 'hidden',
      pointerEvents: 'none'
    },
    child: content
  }).addTo(document.body);

  sync.push(new Promise(rs => {
    setTimeout(rs, 50);
  }));
  return Promise.all(sync).then(() => {
    processInfo.state = "SERIALIZE";
    processInfo.onProcess();
    printer.O = _Rectangle.default.fromClientRect(content.getBoundingClientRect()).A();
    this.accept(printer, content, new _VarScope.default(), []);
  }).then(() => {
    scroller.remove();
    processInfo.onProcess = _noop.default;
    return printer;
  });
};
/***
 *
 * @param {PSHandler} handler
 * @returns {this}
 */


PrintSerializer.prototype.addHandler = function (handler) {
  this.handlers.unshift(handler);
  return this;
};
/***
 *
 * @param {PSHandler} handler
 * @param {string} bf
 * @returns {this}
 */


PrintSerializer.prototype.addHandlerBefore = function (handler, bf) {
  var idx = this.handlers.findIndex(value => value.id === bf);

  if (idx >= 0) {
    this.handlers.splice(idx, 0, handler);
  }

  return this;
};
/***
 *
 * @param {PSHandler} handler
 * @param {string} at
 * @returns {this}
 */


PrintSerializer.prototype.addHandlerAfter = function (handler, at) {
  var idx = this.handlers.findIndex(value => value.id === at);

  if (idx >= 0) {
    this.handlers.splice(idx + 1, 0, handler);
  }

  return this;
};
/***
 *
 * @param {Array<PSHandler>} handlers
 * @returns {this}
 */


PrintSerializer.prototype.addHandlers = function (handlers) {
  this.handlers.unshift.apply(this.handlers, handlers);
  return this;
};
/***
 *
 * @param {string} id
 * @returns {this}
 */


PrintSerializer.prototype.removeHandler = function (id) {
  var idx = this.handlers.findIndex(value => value.id === id);

  if (idx >= 0) {
    this.handlers.splice(idx, 1);
  }

  return this;
};
/***
 *
 * @param {string} id
 * @returns {PSHandler|null}
 */


PrintSerializer.prototype.getHandler = function (id) {
  var idx = this.handlers.findIndex(value => value.id === id);

  if (idx >= 0) {
    return this.handlers[idx];
  }

  return null;
};

var _default = PrintSerializer;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Print/PaperPrinter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Print/PaperPrinter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _XLoader = require("../Network/XLoader");

var _Color = _interopRequireDefault(require("../Color/Color"));

var _AElement = _interopRequireDefault(require("../HTML5/AElement"));

var _Vec = _interopRequireDefault(require("../Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("../Math/Rectangle"));

var _generator = require("../JSMaker/generator");


var fontIdOf = fontName => {
  if (fontName.toLowerCase().indexOf('arial') >= 0) return 'arial';
  if (fontName.toLowerCase().indexOf('times') >= 0) return 'times';
  if (fontName === "Material Design Icons") return 'MDI_6_7_96';
  return fontName;
};

var P2D = 72 / 96;

var color2RGB255 = color => {
  try {
    color = _Color.default.parse(color + '');
    return color.rgba.slice(0, 3).map(x => x * 255 >> 0);
  } catch (e) {
    return null;
  }
};

function PaperPrinter(opt) {
  this.opt = Object.assign({
    size: 'a4',
    margin: {
      top: 57,
      left: 57,
      bottom: 57,
      right: 57
    }
  }, opt);
  this.objects = [];
  this.processInfo = {};
}

PaperPrinter.prototype.share = {
  jsPDFUrl: 'https://absol.cf/vendor/jspdf.umd.js',
  jsPDF: null,
  readySync: null,
  fonts: [{
    url: 'https://absol.cf/vendor/fonts/arial.ttf',
    fileName: 'arial.ttf',
    name: 'arial',
    style: 'normal'
  }, {
    url: 'https://absol.cf/vendor/fonts/arialbd.ttf',
    fileName: 'arialbd.ttf',
    name: 'arial',
    style: 'bold'
  }, {
    url: 'https://absol.cf/vendor/fonts/ariali.ttf',
    fileName: 'ariali.ttf',
    name: 'arial',
    style: 'italic'
  }, {
    url: 'https://absol.cf/vendor/fonts/arialbi.ttf',
    fileName: 'arialbi.ttf',
    name: 'arial',
    style: 'bold_italic'
  }, {
    url: 'https://absol.cf/vendor/fonts/times.ttf',
    fileName: 'times.ttf',
    name: 'times',
    style: 'normal'
  }, {
    url: 'https://absol.cf/vendor/fonts/timesbd.ttf',
    fileName: 'timesbd.ttf',
    name: 'times',
    style: 'bold'
  }, {
    url: 'https://absol.cf/vendor/fonts/timesi.ttf',
    fileName: 'timesi.ttf',
    name: 'times',
    style: 'italic'
  }, {
    url: 'https://absol.cf/vendor/fonts/timesbi.ttf',
    fileName: 'timesbi.ttf',
    name: 'times',
    style: 'bold_italic'
  }]
};

PaperPrinter.prototype.ready = function () {
  var sync;

  if (!this.share.readySync) {
    sync = this.share.fonts.map(font => {
      return fetch(font.url).then(res => res.blob()).then(blob => {
        var reader = new window.FileReader();
        return new Promise(rs => {
          reader.onload = function () {
            rs(this.result);
          };

          reader.readAsDataURL(blob);
        });
      }).then(b64Url => {
        var idx = b64Url.indexOf('base64,');
        return b64Url.substring(idx + 'base64,'.length);
      }).then(b64 => {
        font.content = b64;
      });
    });

    if (window.jsPDF) {
      this.share.jsPDF = window.jsPDF;
    } else {
      sync.push((0, _XLoader.loadScript)(this.share.jsPDFUrl).then(() => {
        this.share.jsPDF = window.jsPDF;
      }));
    }

    this.share.readySync = Promise.all(sync);
  }

  return this.share.readySync;
};
/***
 *
 * @param {string} text
 * @param {Vec2 | Rectangle} pos
 * @param {Object=}style
 */


PaperPrinter.prototype.text = function (text, pos, style) {
  this.objects.push({
    type: 'text',
    pos: pos,
    text: text,
    style: style || {}
  });
  return this;
};
/***
 *
 * @param {string} text
 * @param {Vec2} start
 * @param {Vec2} end
 * @param {Object=}style
 */


PaperPrinter.prototype.line = function (start, end, style) {
  this.objects.push({
    type: 'line',
    start: start,
    end: end,
    style: style || {}
  });
  return this;
};
/***
 *
 * @param {Rectangle}rect
 * @param {Object=}style
 */


PaperPrinter.prototype.rect = function (rect, style) {
  this.objects.push({
    type: 'rect',
    rect: rect,
    style: style || {}
  });
};
/***
 *
 * @param {HTMLCanvasElement|AElement |Image} image
 * @param {Rectangle}rect
 * @param {Object=}style
 */


PaperPrinter.prototype.image = function (image, rect, style) {
  this.objects.push({
    type: 'image',
    rect: rect,
    style: style || {},
    image: image
  });
  return this;
};

PaperPrinter.prototype.boundOf = function (objectData) {
  return this.measures[objectData.type](objectData);
};

PaperPrinter.prototype.exportAsPDF = function (onProcess) {
  var processInfo = (0, _generator.copyJSVariable)(this.processInfo);
  processInfo.pdf = {
    all: this.objects.length,
    done: 0
  };
  processInfo.state = 'LOAD_LIB';

  processInfo.onProcess = () => {
    onProcess && onProcess(processInfo);
  };

  return this.ready().then(() => {
    processInfo.state = 'RENDER_PDF';
    var doc = new jspdf.jsPDF({
      orientation: 'p',
      unit: 'px',
      format: 'a4',
      putOnlyUsedFonts: true,
      floatPrecision: 16,
      dpi: 300,
      hotfixes: ["px_scaling"]
    });
    this.share.fonts.forEach(font => {
      doc.addFileToVFS(font.fileName, font.content);
      doc.addFont(font.fileName, font.name, font.style);
    });
    var objectHolders = this.objects.map((o, i) => {
      var bound = this.boundOf(o);
      return {
        i: i,
        o: o,
        y: bound.y,
        height: bound.height
      };
    });
    objectHolders.sort((a, b) => a.y - b.y);
    var pageContentWidth = 794 - 57 * 2;
    var pageContentHeight = 1123 - 57 * 2;
    var pages = objectHolders.reduce((ac, cr) => {
      var page = ac[ac.length - 1];

      if (cr.height > pageContentHeight) {
        page.holders.push(cr);
      } else {
        if (cr.y + cr.height - page.y > pageContentHeight) {
          page = {
            y: cr.y,
            holders: [cr]
          };
          ac.push(page);
        } else {
          page.holders.push(cr);
        }
      }

      return ac;
    }, [{
      holders: [],
      y: 0
    }]);
    var sync = Promise.resolve();
    pages.forEach(page => {
      page.holders.sort((a, b) => a.i - b.i);
      page.objects = page.holders.map(h => h.o);
    });
    pages.forEach((page, i) => {
      sync = sync.then(() => {
        if (i > 0) {
          doc.addPage();
        }

        doc.setPage(i + 1);
        page.O = new _Vec.default(this.opt.margin.left, this.opt.margin.top - page.y);
        var syn2 = Promise.resolve();
        page.objects.forEach(obj => {
          var type = obj.type;
          syn2 = syn2.then(() => {
            var res = this.pdfHandlers[type](page, doc, obj);
            processInfo.pdf.done++;
            processInfo.onProcess();
            return res;
          });
        });
        syn2 = syn2.then(() => {
          doc.setTextColor(0, 0, 0);
          doc.setFontSize(14 * P2D);
          doc.setFont('helvetica', 'normal');
          doc.text(i + 1 + '/' + pages.length, 794 - 20, 1123 - 20, {
            align: 'right'
          });
        });
        return syn2;
      });
    }); //width: 794px;margin 57
    //     /*height: 1056px;*/

    return sync.then(() => doc);
  });
};

PaperPrinter.prototype.pdfHandlers = {
  text: function (context, doc, data) {
    var fontFamily = data.style.fontFamily;
    var lineHeight = data.style.lineHeight || 1.2;
    var color = color2RGB255(data.style.color) || [0, 0, 0];
    doc.setTextColor(color[0], color[1], color[2]);
    var fontSize = data.style.fontSize || 14;
    var textPos = data.pos.A().add(context.O);
    doc.setLineHeightFactor(lineHeight);
    doc.setFontSize(fontSize * P2D);
    doc.setFont(fontIdOf(fontFamily), data.style.fontStyle);
    var style = {
      baseline: 'top',
      maxWidth: data.pos.width
    };

    if (data.style.align) {
      //todo: check align
      style.align = {
        start: 'left',
        end: 'right',
        center: 'center'
      }[data.style.align] || 'left';
    }

    doc.text(data.text, textPos.x, textPos.y + fontSize * (lineHeight - 1) / 2, style);
  },
  rect: function (context, doc, data) {
    var fillColor = null;
    var strokeColor = null;
    var strokeWidth = data.style.strokeWidth || 1;
    var rounded = data.style.rounded;
    if (typeof rounded === "number") rounded = [rounded, rounded];

    if (data.style.fill) {
      fillColor = color2RGB255(data.style.fill);
    }

    if (data.style.stroke) {
      strokeColor = color2RGB255(data.style.stroke);
    }

    if (fillColor) doc.setFillColor(fillColor[0], fillColor[1], fillColor[2]);

    if (strokeColor) {
      doc.setLineWidth(strokeWidth);
      doc.setDrawColor(strokeColor[0], strokeColor[1], strokeColor[2]);
    }

    var flat = 'F';
    if (strokeColor && fillColor) flat = 'FD';else if (strokeColor) flat = 'S';else if (fillColor) flat = 'F';else return;
    var O = context.O;
    var A = data.rect.A().add(O);

    if (rounded) {
      doc.roundedRect(A.x, A.y, data.rect.width, data.rect.height, rounded[0], rounded[1], flat);
    } else {
      doc.rect(A.x, A.y, data.rect.width, data.rect.height, flat);
    }
  },
  line: function (context, doc, data) {
    var fillColor = null;
    var strokeColor = null;
    var strokeWidth = data.style.strokeWidth || 1;

    if (data.style.stroke) {
      strokeColor = color2RGB255(data.style.stroke);
    }

    if (strokeColor) {
      doc.setLineWidth(strokeWidth);
      doc.setDrawColor(strokeColor[0], strokeColor[1], strokeColor[2]);
    }

    var flat = 'S';
    var O = context.O;
    var A = data.start.add(O);
    var B = data.end.add(O);
    doc.line(A.x, A.y, B.x, B.y, flat);
  },
  image: function (context, doc, data) {
    var handleImage = image => {
      if (!image) return;
      var rect = data.rect.clone();
      rect.x += context.O.x;
      rect.y += context.O.y;
      doc.addImage(image, 'PNG', rect.x, rect.y, rect.width, rect.height);
    };

    if (data.image.then) {
      return data.image.then(handleImage).catch(err => {});
    } else return handleImage(data.image);
  }
};
PaperPrinter.prototype.measures = {
  rect: data => {
    return data.rect;
  },
  text: data => {
    return data.pos;
  },
  image: data => {
    return data.rect;
  },
  line: data => {
    return _Rectangle.default.boundingPoints([data.start, data.end]);
  }
};
var _default = PaperPrinter;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Print/printer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Print/printer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.downloadAsPDF = downloadAsPDF;
Object.defineProperty(exports, "PrintSerializer", {
  enumerable: true,
  get: function () {
    return _PrintSerializer.default;
  }
});
Object.defineProperty(exports, "PaperPrinter", {
  enumerable: true,
  get: function () {
    return _PaperPrinter.default;
  }
});
exports.ShareSerializer = void 0;

var _Dom = _interopRequireDefault(require("../HTML5/Dom"));

var _PrintSerializer = _interopRequireDefault(require("./PrintSerializer"));

var _PaperPrinter = _interopRequireDefault(require("./PaperPrinter"));

var _FileSaver = require("../Network/FileSaver");


var ShareSerializer = new _PrintSerializer.default();
/***
 *
 * @param elt
 * @param fileName
 * @param {function(processInfo):void=} onProcess
 * @returns {Promise<*>}
 */

exports.ShareSerializer = ShareSerializer;

function downloadAsPDF(elt, fileName, onProcess) {
  elt = _Dom.default.ShareInstance.$(elt);
  var serializer = ShareSerializer;
  var printer = new _PaperPrinter.default();
  return serializer.serialize(elt, printer, onProcess).then(printer => printer.exportAsPDF(onProcess)).then(doc => {
    (0, _FileSaver.saveAs)(doc.output('blob'), fileName);
  });
}
};

moduleFactories["node_modules/absol/src/Math/measurements.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Math/measurements.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.feetToMeter = feetToMeter;
exports.meterToFeet = meterToFeet;
exports.meterToInch = meterToInch;
exports.mileToMeter = mileToMeter;
exports.meterToMile = meterToMile;
exports.meterToYard = meterToYard;
exports.yardToMeter = yardToMeter;
exports.pointToDot = pointToDot;
exports.dotToPoint = dotToPoint;
exports.pxToCentimeter = pxToCentimeter;
exports.centimeterToPx = centimeterToPx;
exports.PAGE_SIZE_IN_POINT = exports.PAGE_SIZE_IN_DOT = void 0;

function feetToMeter(ft) {
  return ft / 3.28084;
}

function meterToFeet(mt) {
  return mt * 3.28084;
}

function meterToInch(mt) {
  return mt * 39.3701;
}

function mileToMeter(ml) {
  return ml * 1609.34;
}

function meterToMile(ml) {
  return ml / 1609.34;
}

function meterToYard(mt) {
  return mt * 1.09361;
}

function yardToMeter(yd) {
  return yd / 1.09361;
}

function pointToDot(p) {
  return p * 72 / 96;
}

function dotToPoint(d) {
  return d * 96 / 72;
}

function pxToCentimeter(px) {}

function centimeterToPx(cm) {
  return meterToInch(cm / 100) * 96;
}

var PAGE_SIZE_IN_DOT = {
  a0: [2383.94, 3370.39],
  a1: [1683.78, 2383.94],
  a2: [1190.55, 1683.78],
  a3: [841.89, 1190.55],
  a4: [595.28, 841.89],
  a5: [419.53, 595.28],
  a6: [297.64, 419.53],
  a7: [209.76, 297.64],
  a8: [147.4, 209.76],
  a9: [104.88, 147.4],
  a10: [73.7, 104.88],
  b0: [2834.65, 4008.19],
  b1: [2004.09, 2834.65],
  b2: [1417.32, 2004.09],
  b3: [1000.63, 1417.32],
  b4: [708.66, 1000.63],
  b5: [498.9, 708.66],
  b6: [354.33, 498.9],
  b7: [249.45, 354.33],
  b8: [175.75, 249.45],
  b9: [124.72, 175.75],
  b10: [87.87, 124.72],
  c0: [2599.37, 3676.54],
  c1: [1836.85, 2599.37],
  c2: [1298.27, 1836.85],
  c3: [918.43, 1298.27],
  c4: [649.13, 918.43],
  c5: [459.21, 649.13],
  c6: [323.15, 459.21],
  c7: [229.61, 323.15],
  c8: [161.57, 229.61],
  c9: [113.39, 161.57],
  c10: [79.37, 113.39],
  dl: [311.81, 623.62],
  letter: [612, 792],
  "government-letter": [576, 756],
  legal: [612, 1008],
  "junior-legal": [576, 360],
  ledger: [1224, 792],
  tabloid: [792, 1224],
  "credit-card": [153, 243]
};
exports.PAGE_SIZE_IN_DOT = PAGE_SIZE_IN_DOT;
var PAGE_SIZE_IN_POINT = Object.keys(PAGE_SIZE_IN_DOT).reduce((ac, key) => {
  ac[key] = PAGE_SIZE_IN_DOT[key].map(d => dotToPoint(d));
  return ac;
}, {});
exports.PAGE_SIZE_IN_POINT = PAGE_SIZE_IN_POINT;
};

moduleFactories["node_modules/absol/src/Converter/QRCode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Converter/QRCode.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function QR8bitByte(data) {
  this.mode = QRMode.MODE_8BIT_BYTE;
  this.data = data;
  this.parsedData = []; // Added to support UTF-8 Characters

  for (var i = 0, l = this.data.length; i < l; i++) {
    var byteArray = [];
    var code = this.data.charCodeAt(i);

    if (code > 0x10000) {
      byteArray[0] = 0xF0 | (code & 0x1C0000) >>> 18;
      byteArray[1] = 0x80 | (code & 0x3F000) >>> 12;
      byteArray[2] = 0x80 | (code & 0xFC0) >>> 6;
      byteArray[3] = 0x80 | code & 0x3F;
    } else if (code > 0x800) {
      byteArray[0] = 0xE0 | (code & 0xF000) >>> 12;
      byteArray[1] = 0x80 | (code & 0xFC0) >>> 6;
      byteArray[2] = 0x80 | code & 0x3F;
    } else if (code > 0x80) {
      byteArray[0] = 0xC0 | (code & 0x7C0) >>> 6;
      byteArray[1] = 0x80 | code & 0x3F;
    } else {
      byteArray[0] = code;
    }

    this.parsedData.push(byteArray);
  }

  this.parsedData = Array.prototype.concat.apply([], this.parsedData);

  if (this.parsedData.length !== this.data.length) {
    this.parsedData.unshift(191);
    this.parsedData.unshift(187);
    this.parsedData.unshift(239);
  }
}

QR8bitByte.prototype.getLength = function () {
  return this.parsedData.length;
};

QR8bitByte.prototype.write = function (buffer) {
  for (var i = 0, l = this.parsedData.length; i < l; i++) {
    buffer.put(this.parsedData[i], 8);
  }
};

function QRCodeModel(typeNumber, errorCorrectLevel) {
  this.typeNumber = typeNumber;
  this.errorCorrectLevel = errorCorrectLevel;
  this.modules = null;
  this.moduleCount = 0;
  this.dataCache = null;
  this.dataList = [];
}

QRCodeModel.prototype.addData = function (data) {
  var newData = new QR8bitByte(data);
  this.dataList.push(newData);
  this.dataCache = null;
};

QRCodeModel.prototype.isDark = function (row, col) {
  if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {
    throw new Error(row + "," + col);
  }

  return this.modules[row][col];
};

QRCodeModel.prototype.getModuleCount = function () {
  return this.moduleCount;
};

QRCodeModel.prototype.make = function () {
  this.makeImpl(false, this.getBestMaskPattern());
};

QRCodeModel.prototype.makeImpl = function (test, maskPattern) {
  this.moduleCount = this.typeNumber * 4 + 17;
  this.modules = new Array(this.moduleCount);

  for (var row = 0; row < this.moduleCount; row++) {
    this.modules[row] = new Array(this.moduleCount);

    for (var col = 0; col < this.moduleCount; col++) {
      this.modules[row][col] = null;
    }
  }

  this.setupPositionProbePattern(0, 0);
  this.setupPositionProbePattern(this.moduleCount - 7, 0);
  this.setupPositionProbePattern(0, this.moduleCount - 7);
  this.setupPositionAdjustPattern();
  this.setupTimingPattern();
  this.setupTypeInfo(test, maskPattern);

  if (this.typeNumber >= 7) {
    this.setupTypeNumber(test);
  }

  if (this.dataCache == null) {
    this.dataCache = QRCodeModel.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);
  }

  this.mapData(this.dataCache, maskPattern);
};

QRCodeModel.prototype.setupPositionProbePattern = function (row, col) {
  for (var r = -1; r <= 7; r++) {
    if (row + r <= -1 || this.moduleCount <= row + r) continue;

    for (var c = -1; c <= 7; c++) {
      if (col + c <= -1 || this.moduleCount <= col + c) continue;

      if (0 <= r && r <= 6 && (c == 0 || c == 6) || 0 <= c && c <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c && c <= 4) {
        this.modules[row + r][col + c] = true;
      } else {
        this.modules[row + r][col + c] = false;
      }
    }
  }
};

QRCodeModel.prototype.getBestMaskPattern = function () {
  var minLostPoint = 0;
  var pattern = 0;

  for (var i = 0; i < 8; i++) {
    this.makeImpl(true, i);
    var lostPoint = QRUtil.getLostPoint(this);

    if (i == 0 || minLostPoint > lostPoint) {
      minLostPoint = lostPoint;
      pattern = i;
    }
  }

  return pattern;
};

QRCodeModel.prototype.setupTimingPattern = function () {
  for (var r = 8; r < this.moduleCount - 8; r++) {
    if (this.modules[r][6] != null) {
      continue;
    }

    this.modules[r][6] = r % 2 == 0;
  }

  for (var c = 8; c < this.moduleCount - 8; c++) {
    if (this.modules[6][c] != null) {
      continue;
    }

    this.modules[6][c] = c % 2 == 0;
  }
};

QRCodeModel.prototype.setupPositionAdjustPattern = function () {
  var pos = QRUtil.getPatternPosition(this.typeNumber);

  for (var i = 0; i < pos.length; i++) {
    for (var j = 0; j < pos.length; j++) {
      var row = pos[i];
      var col = pos[j];

      if (this.modules[row][col] != null) {
        continue;
      }

      for (var r = -2; r <= 2; r++) {
        for (var c = -2; c <= 2; c++) {
          if (r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0) {
            this.modules[row + r][col + c] = true;
          } else {
            this.modules[row + r][col + c] = false;
          }
        }
      }
    }
  }
};

QRCodeModel.prototype.setupTypeNumber = function (test) {
  var bits = QRUtil.getBCHTypeNumber(this.typeNumber);

  for (var i = 0; i < 18; i++) {
    var mod = !test && (bits >> i & 1) == 1;
    this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
  }

  for (var i = 0; i < 18; i++) {
    var mod = !test && (bits >> i & 1) == 1;
    this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
  }
};

QRCodeModel.prototype.setupTypeInfo = function (test, maskPattern) {
  var data = this.errorCorrectLevel << 3 | maskPattern;
  var bits = QRUtil.getBCHTypeInfo(data);

  for (var i = 0; i < 15; i++) {
    var mod = !test && (bits >> i & 1) == 1;

    if (i < 6) {
      this.modules[i][8] = mod;
    } else if (i < 8) {
      this.modules[i + 1][8] = mod;
    } else {
      this.modules[this.moduleCount - 15 + i][8] = mod;
    }
  }

  for (var i = 0; i < 15; i++) {
    var mod = !test && (bits >> i & 1) == 1;

    if (i < 8) {
      this.modules[8][this.moduleCount - i - 1] = mod;
    } else if (i < 9) {
      this.modules[8][15 - i - 1 + 1] = mod;
    } else {
      this.modules[8][15 - i - 1] = mod;
    }
  }

  this.modules[this.moduleCount - 8][8] = !test;
};

QRCodeModel.prototype.mapData = function (data, maskPattern) {
  var inc = -1;
  var row = this.moduleCount - 1;
  var bitIndex = 7;
  var byteIndex = 0;

  for (var col = this.moduleCount - 1; col > 0; col -= 2) {
    if (col == 6) col--;

    while (true) {
      for (var c = 0; c < 2; c++) {
        if (this.modules[row][col - c] == null) {
          var dark = false;

          if (byteIndex < data.length) {
            dark = (data[byteIndex] >>> bitIndex & 1) == 1;
          }

          var mask = QRUtil.getMask(maskPattern, row, col - c);

          if (mask) {
            dark = !dark;
          }

          this.modules[row][col - c] = dark;
          bitIndex--;

          if (bitIndex == -1) {
            byteIndex++;
            bitIndex = 7;
          }
        }
      }

      row += inc;

      if (row < 0 || this.moduleCount <= row) {
        row -= inc;
        inc = -inc;
        break;
      }
    }
  }
};

QRCodeModel.PAD0 = 0xEC;
QRCodeModel.PAD1 = 0x11;

QRCodeModel.createData = function (typeNumber, errorCorrectLevel, dataList) {
  var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
  var buffer = new QRBitBuffer();

  for (var i = 0; i < dataList.length; i++) {
    var data = dataList[i];
    buffer.put(data.mode, 4);
    buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));
    data.write(buffer);
  }

  var totalDataCount = 0;

  for (var i = 0; i < rsBlocks.length; i++) {
    totalDataCount += rsBlocks[i].dataCount;
  }

  if (buffer.getLengthInBits() > totalDataCount * 8) {
    throw new Error("code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")");
  }

  if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
    buffer.put(0, 4);
  }

  while (buffer.getLengthInBits() % 8 != 0) {
    buffer.putBit(false);
  }

  while (true) {
    if (buffer.getLengthInBits() >= totalDataCount * 8) {
      break;
    }

    buffer.put(QRCodeModel.PAD0, 8);

    if (buffer.getLengthInBits() >= totalDataCount * 8) {
      break;
    }

    buffer.put(QRCodeModel.PAD1, 8);
  }

  return QRCodeModel.createBytes(buffer, rsBlocks);
};

QRCodeModel.createBytes = function (buffer, rsBlocks) {
  var offset = 0;
  var maxDcCount = 0;
  var maxEcCount = 0;
  var dcdata = new Array(rsBlocks.length);
  var ecdata = new Array(rsBlocks.length);

  for (var r = 0; r < rsBlocks.length; r++) {
    var dcCount = rsBlocks[r].dataCount;
    var ecCount = rsBlocks[r].totalCount - dcCount;
    maxDcCount = Math.max(maxDcCount, dcCount);
    maxEcCount = Math.max(maxEcCount, ecCount);
    dcdata[r] = new Array(dcCount);

    for (var i = 0; i < dcdata[r].length; i++) {
      dcdata[r][i] = 0xff & buffer.buffer[i + offset];
    }

    offset += dcCount;
    var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
    var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
    var modPoly = rawPoly.mod(rsPoly);
    ecdata[r] = new Array(rsPoly.getLength() - 1);

    for (var i = 0; i < ecdata[r].length; i++) {
      var modIndex = i + modPoly.getLength() - ecdata[r].length;
      ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0;
    }
  }

  var totalCodeCount = 0;

  for (var i = 0; i < rsBlocks.length; i++) {
    totalCodeCount += rsBlocks[i].totalCount;
  }

  var data = new Array(totalCodeCount);
  var index = 0;

  for (var i = 0; i < maxDcCount; i++) {
    for (var r = 0; r < rsBlocks.length; r++) {
      if (i < dcdata[r].length) {
        data[index++] = dcdata[r][i];
      }
    }
  }

  for (var i = 0; i < maxEcCount; i++) {
    for (var r = 0; r < rsBlocks.length; r++) {
      if (i < ecdata[r].length) {
        data[index++] = ecdata[r][i];
      }
    }
  }

  return data;
};

var QRMode = {
  MODE_NUMBER: 1 << 0,
  MODE_ALPHA_NUM: 1 << 1,
  MODE_8BIT_BYTE: 1 << 2,
  MODE_KANJI: 1 << 3
};
var QRErrorCorrectLevel = {
  L: 1,
  M: 0,
  Q: 3,
  H: 2
};
var QRMaskPattern = {
  PATTERN000: 0,
  PATTERN001: 1,
  PATTERN010: 2,
  PATTERN011: 3,
  PATTERN100: 4,
  PATTERN101: 5,
  PATTERN110: 6,
  PATTERN111: 7
};
var QRUtil = {
  PATTERN_POSITION_TABLE: [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]],
  G15: 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0,
  G18: 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0,
  G15_MASK: 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1,
  getBCHTypeInfo: function (data) {
    var d = data << 10;

    while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
      d ^= QRUtil.G15 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15);
    }

    return (data << 10 | d) ^ QRUtil.G15_MASK;
  },
  getBCHTypeNumber: function (data) {
    var d = data << 12;

    while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
      d ^= QRUtil.G18 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18);
    }

    return data << 12 | d;
  },
  getBCHDigit: function (data) {
    var digit = 0;

    while (data != 0) {
      digit++;
      data >>>= 1;
    }

    return digit;
  },
  getPatternPosition: function (typeNumber) {
    return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
  },
  getMask: function (maskPattern, i, j) {
    switch (maskPattern) {
      case QRMaskPattern.PATTERN000:
        return (i + j) % 2 === 0;

      case QRMaskPattern.PATTERN001:
        return i % 2 === 0;

      case QRMaskPattern.PATTERN010:
        return j % 3 === 0;

      case QRMaskPattern.PATTERN011:
        return (i + j) % 3 === 0;

      case QRMaskPattern.PATTERN100:
        return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0;

      case QRMaskPattern.PATTERN101:
        return i * j % 2 + i * j % 3 === 0;

      case QRMaskPattern.PATTERN110:
        return (i * j % 2 + i * j % 3) % 2 === 0;

      case QRMaskPattern.PATTERN111:
        return (i * j % 3 + (i + j) % 2) % 2 === 0;

      default:
        throw new Error("bad maskPattern:" + maskPattern);
    }
  },
  getErrorCorrectPolynomial: function (errorCorrectLength) {
    var a = new QRPolynomial([1], 0);

    for (var i = 0; i < errorCorrectLength; i++) {
      a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
    }

    return a;
  },
  getLengthInBits: function (mode, type) {
    if (1 <= type && type < 10) {
      switch (mode) {
        case QRMode.MODE_NUMBER:
          return 10;

        case QRMode.MODE_ALPHA_NUM:
          return 9;

        case QRMode.MODE_8BIT_BYTE:
          return 8;

        case QRMode.MODE_KANJI:
          return 8;

        default:
          throw new Error("mode:" + mode);
      }
    } else if (type < 27) {
      switch (mode) {
        case QRMode.MODE_NUMBER:
          return 12;

        case QRMode.MODE_ALPHA_NUM:
          return 11;

        case QRMode.MODE_8BIT_BYTE:
          return 16;

        case QRMode.MODE_KANJI:
          return 10;

        default:
          throw new Error("mode:" + mode);
      }
    } else if (type < 41) {
      switch (mode) {
        case QRMode.MODE_NUMBER:
          return 14;

        case QRMode.MODE_ALPHA_NUM:
          return 13;

        case QRMode.MODE_8BIT_BYTE:
          return 16;

        case QRMode.MODE_KANJI:
          return 12;

        default:
          throw new Error("mode:" + mode);
      }
    } else {
      throw new Error("type:" + type);
    }
  },
  getLostPoint: function (qrCode) {
    var moduleCount = qrCode.getModuleCount();
    var lostPoint = 0;

    for (var row = 0; row < moduleCount; row++) {
      for (var col = 0; col < moduleCount; col++) {
        var sameCount = 0;
        var dark = qrCode.isDark(row, col);

        for (var r = -1; r <= 1; r++) {
          if (row + r < 0 || moduleCount <= row + r) {
            continue;
          }

          for (var c = -1; c <= 1; c++) {
            if (col + c < 0 || moduleCount <= col + c) {
              continue;
            }

            if (r == 0 && c == 0) {
              continue;
            }

            if (dark == qrCode.isDark(row + r, col + c)) {
              sameCount++;
            }
          }
        }

        if (sameCount > 5) {
          lostPoint += 3 + sameCount - 5;
        }
      }
    }

    for (var row = 0; row < moduleCount - 1; row++) {
      for (var col = 0; col < moduleCount - 1; col++) {
        var count = 0;
        if (qrCode.isDark(row, col)) count++;
        if (qrCode.isDark(row + 1, col)) count++;
        if (qrCode.isDark(row, col + 1)) count++;
        if (qrCode.isDark(row + 1, col + 1)) count++;

        if (count == 0 || count == 4) {
          lostPoint += 3;
        }
      }
    }

    for (var row = 0; row < moduleCount; row++) {
      for (var col = 0; col < moduleCount - 6; col++) {
        if (qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6)) {
          lostPoint += 40;
        }
      }
    }

    for (var col = 0; col < moduleCount; col++) {
      for (var row = 0; row < moduleCount - 6; row++) {
        if (qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col)) {
          lostPoint += 40;
        }
      }
    }

    var darkCount = 0;

    for (var col = 0; col < moduleCount; col++) {
      for (var row = 0; row < moduleCount; row++) {
        if (qrCode.isDark(row, col)) {
          darkCount++;
        }
      }
    }

    var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
    lostPoint += ratio * 10;
    return lostPoint;
  }
};
var QRMath = {
  glog: function (n) {
    if (n < 1) {
      throw new Error("glog(" + n + ")");
    }

    return QRMath.LOG_TABLE[n];
  },
  gexp: function (n) {
    while (n < 0) {
      n += 255;
    }

    while (n >= 256) {
      n -= 255;
    }

    return QRMath.EXP_TABLE[n];
  },
  LOG_TABLE: new Array(256)
};

QRMath.EXP_TABLE = function () {
  var arr = Array(256);
  var i;

  for (i = 0; i < 8; ++i) {
    arr[i] = 1 << i;
  }

  for (i = 8; i < 256; ++i) {
    arr[i] = arr[i - 4] ^ arr[i - 5] ^ arr[i - 6] ^ arr[i - 8];
  }

  return arr;
}();

QRMath.LOG_TABLE = function () {
  var arr = Array(256).fill(0);

  for (var i = 0; i < 255; i++) {
    arr[QRMath.EXP_TABLE[i]] = i;
  }

  return arr;
}();

function QRPolynomial(num, shift) {
  if (num.length == undefined) {
    throw new Error(num.length + "/" + shift);
  }

  var offset = 0;

  while (offset < num.length && num[offset] == 0) {
    offset++;
  }

  this.num = new Array(num.length - offset + shift);

  for (var i = 0; i < num.length - offset; i++) {
    this.num[i] = num[i + offset];
  }
}

QRPolynomial.prototype.get = function (index) {
  return this.num[index];
};

QRPolynomial.prototype.getLength = function () {
  return this.num.length;
};

QRPolynomial.prototype.multiply = function (e) {
  var num = new Array(this.getLength() + e.getLength() - 1);

  for (var i = 0; i < this.getLength(); i++) {
    for (var j = 0; j < e.getLength(); j++) {
      num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
    }
  }

  return new QRPolynomial(num, 0);
};

QRPolynomial.prototype.mod = function (e) {
  if (this.getLength() - e.getLength() < 0) {
    return this;
  }

  var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0));
  var num = new Array(this.getLength());

  for (var i = 0; i < this.getLength(); i++) {
    num[i] = this.get(i);
  }

  for (var i = 0; i < e.getLength(); i++) {
    num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
  }

  return new QRPolynomial(num, 0).mod(e);
};

function QRRSBlock(totalCount, dataCount) {
  this.totalCount = totalCount;
  this.dataCount = dataCount;
}

QRRSBlock.RS_BLOCK_TABLE = [[1, 26, 19], [1, 26, 16], [1, 26, 13], [1, 26, 9], [1, 44, 34], [1, 44, 28], [1, 44, 22], [1, 44, 16], [1, 70, 55], [1, 70, 44], [2, 35, 17], [2, 35, 13], [1, 100, 80], [2, 50, 32], [2, 50, 24], [4, 25, 9], [1, 134, 108], [2, 67, 43], [2, 33, 15, 2, 34, 16], [2, 33, 11, 2, 34, 12], [2, 86, 68], [4, 43, 27], [4, 43, 19], [4, 43, 15], [2, 98, 78], [4, 49, 31], [2, 32, 14, 4, 33, 15], [4, 39, 13, 1, 40, 14], [2, 121, 97], [2, 60, 38, 2, 61, 39], [4, 40, 18, 2, 41, 19], [4, 40, 14, 2, 41, 15], [2, 146, 116], [3, 58, 36, 2, 59, 37], [4, 36, 16, 4, 37, 17], [4, 36, 12, 4, 37, 13], [2, 86, 68, 2, 87, 69], [4, 69, 43, 1, 70, 44], [6, 43, 19, 2, 44, 20], [6, 43, 15, 2, 44, 16], [4, 101, 81], [1, 80, 50, 4, 81, 51], [4, 50, 22, 4, 51, 23], [3, 36, 12, 8, 37, 13], [2, 116, 92, 2, 117, 93], [6, 58, 36, 2, 59, 37], [4, 46, 20, 6, 47, 21], [7, 42, 14, 4, 43, 15], [4, 133, 107], [8, 59, 37, 1, 60, 38], [8, 44, 20, 4, 45, 21], [12, 33, 11, 4, 34, 12], [3, 145, 115, 1, 146, 116], [4, 64, 40, 5, 65, 41], [11, 36, 16, 5, 37, 17], [11, 36, 12, 5, 37, 13], [5, 109, 87, 1, 110, 88], [5, 65, 41, 5, 66, 42], [5, 54, 24, 7, 55, 25], [11, 36, 12], [5, 122, 98, 1, 123, 99], [7, 73, 45, 3, 74, 46], [15, 43, 19, 2, 44, 20], [3, 45, 15, 13, 46, 16], [1, 135, 107, 5, 136, 108], [10, 74, 46, 1, 75, 47], [1, 50, 22, 15, 51, 23], [2, 42, 14, 17, 43, 15], [5, 150, 120, 1, 151, 121], [9, 69, 43, 4, 70, 44], [17, 50, 22, 1, 51, 23], [2, 42, 14, 19, 43, 15], [3, 141, 113, 4, 142, 114], [3, 70, 44, 11, 71, 45], [17, 47, 21, 4, 48, 22], [9, 39, 13, 16, 40, 14], [3, 135, 107, 5, 136, 108], [3, 67, 41, 13, 68, 42], [15, 54, 24, 5, 55, 25], [15, 43, 15, 10, 44, 16], [4, 144, 116, 4, 145, 117], [17, 68, 42], [17, 50, 22, 6, 51, 23], [19, 46, 16, 6, 47, 17], [2, 139, 111, 7, 140, 112], [17, 74, 46], [7, 54, 24, 16, 55, 25], [34, 37, 13], [4, 151, 121, 5, 152, 122], [4, 75, 47, 14, 76, 48], [11, 54, 24, 14, 55, 25], [16, 45, 15, 14, 46, 16], [6, 147, 117, 4, 148, 118], [6, 73, 45, 14, 74, 46], [11, 54, 24, 16, 55, 25], [30, 46, 16, 2, 47, 17], [8, 132, 106, 4, 133, 107], [8, 75, 47, 13, 76, 48], [7, 54, 24, 22, 55, 25], [22, 45, 15, 13, 46, 16], [10, 142, 114, 2, 143, 115], [19, 74, 46, 4, 75, 47], [28, 50, 22, 6, 51, 23], [33, 46, 16, 4, 47, 17], [8, 152, 122, 4, 153, 123], [22, 73, 45, 3, 74, 46], [8, 53, 23, 26, 54, 24], [12, 45, 15, 28, 46, 16], [3, 147, 117, 10, 148, 118], [3, 73, 45, 23, 74, 46], [4, 54, 24, 31, 55, 25], [11, 45, 15, 31, 46, 16], [7, 146, 116, 7, 147, 117], [21, 73, 45, 7, 74, 46], [1, 53, 23, 37, 54, 24], [19, 45, 15, 26, 46, 16], [5, 145, 115, 10, 146, 116], [19, 75, 47, 10, 76, 48], [15, 54, 24, 25, 55, 25], [23, 45, 15, 25, 46, 16], [13, 145, 115, 3, 146, 116], [2, 74, 46, 29, 75, 47], [42, 54, 24, 1, 55, 25], [23, 45, 15, 28, 46, 16], [17, 145, 115], [10, 74, 46, 23, 75, 47], [10, 54, 24, 35, 55, 25], [19, 45, 15, 35, 46, 16], [17, 145, 115, 1, 146, 116], [14, 74, 46, 21, 75, 47], [29, 54, 24, 19, 55, 25], [11, 45, 15, 46, 46, 16], [13, 145, 115, 6, 146, 116], [14, 74, 46, 23, 75, 47], [44, 54, 24, 7, 55, 25], [59, 46, 16, 1, 47, 17], [12, 151, 121, 7, 152, 122], [12, 75, 47, 26, 76, 48], [39, 54, 24, 14, 55, 25], [22, 45, 15, 41, 46, 16], [6, 151, 121, 14, 152, 122], [6, 75, 47, 34, 76, 48], [46, 54, 24, 10, 55, 25], [2, 45, 15, 64, 46, 16], [17, 152, 122, 4, 153, 123], [29, 74, 46, 14, 75, 47], [49, 54, 24, 10, 55, 25], [24, 45, 15, 46, 46, 16], [4, 152, 122, 18, 153, 123], [13, 74, 46, 32, 75, 47], [48, 54, 24, 14, 55, 25], [42, 45, 15, 32, 46, 16], [20, 147, 117, 4, 148, 118], [40, 75, 47, 7, 76, 48], [43, 54, 24, 22, 55, 25], [10, 45, 15, 67, 46, 16], [19, 148, 118, 6, 149, 119], [18, 75, 47, 31, 76, 48], [34, 54, 24, 34, 55, 25], [20, 45, 15, 61, 46, 16]];

QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) {
  var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);

  if (rsBlock == undefined) {
    throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
  }

  var length = rsBlock.length / 3;
  var list = [];

  for (var i = 0; i < length; i++) {
    var count = rsBlock[i * 3 + 0];
    var totalCount = rsBlock[i * 3 + 1];
    var dataCount = rsBlock[i * 3 + 2];

    for (var j = 0; j < count; j++) {
      list.push(new QRRSBlock(totalCount, dataCount));
    }
  }

  return list;
};

QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) {
  switch (errorCorrectLevel) {
    case QRErrorCorrectLevel.L:
      return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];

    case QRErrorCorrectLevel.M:
      return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];

    case QRErrorCorrectLevel.Q:
      return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];

    case QRErrorCorrectLevel.H:
      return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];

    default:
      return undefined;
  }
};

function QRBitBuffer() {
  this.buffer = [];
  this.length = 0;
}

QRBitBuffer.prototype.get = function (index) {
  var bufIndex = Math.floor(index / 8);
  return (this.buffer[bufIndex] >>> 7 - index % 8 & 1) === 1;
};

QRBitBuffer.prototype.put = function (num, length) {
  for (var i = 0; i < length; i++) {
    this.putBit((num >>> length - i - 1 & 1) === 1);
  }
};

QRBitBuffer.prototype.getLengthInBits = function () {
  return this.length;
};

QRBitBuffer.prototype.putBit = function (bit) {
  var bufIndex = Math.floor(this.length / 8);

  if (this.buffer.length <= bufIndex) {
    this.buffer.push(0);
  }

  if (bit) {
    this.buffer[bufIndex] |= 0x80 >>> this.length % 8;
  }

  this.length++;
};

var QRCodeLimitLength = [[17, 14, 11, 7], [32, 26, 20, 14], [53, 42, 32, 24], [78, 62, 46, 34], [106, 84, 60, 44], [134, 106, 74, 58], [154, 122, 86, 64], [192, 152, 108, 84], [230, 180, 130, 98], [271, 213, 151, 119], [321, 251, 177, 137], [367, 287, 203, 155], [425, 331, 241, 177], [458, 362, 258, 194], [520, 412, 292, 220], [586, 450, 322, 250], [644, 504, 364, 280], [718, 560, 394, 310], [792, 624, 442, 338], [858, 666, 482, 382], [929, 711, 509, 403], [1003, 779, 565, 439], [1091, 857, 611, 461], [1171, 911, 661, 511], [1273, 997, 715, 535], [1367, 1059, 751, 593], [1465, 1125, 805, 625], [1528, 1190, 868, 658], [1628, 1264, 908, 698], [1732, 1370, 982, 742], [1840, 1452, 1030, 790], [1952, 1538, 1112, 842], [2068, 1628, 1168, 898], [2188, 1722, 1228, 958], [2303, 1809, 1283, 983], [2431, 1911, 1351, 1051], [2563, 1989, 1423, 1093], [2699, 2099, 1499, 1139], [2809, 2213, 1579, 1219], [2953, 2331, 1663, 1273]];
/**
 * Get the type by string length
 *
 * @private
 * @param {String} sText
 * @param {Number} nCorrectLevel
 * @return {Number} type
 */

function _getTypeNumber(sText, nCorrectLevel) {
  var nType = 1;

  var length = _getUTF8Length(sText);

  for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
    var nLimit = 0;

    switch (nCorrectLevel) {
      case QRErrorCorrectLevel.L:
        nLimit = QRCodeLimitLength[i][0];
        break;

      case QRErrorCorrectLevel.M:
        nLimit = QRCodeLimitLength[i][1];
        break;

      case QRErrorCorrectLevel.Q:
        nLimit = QRCodeLimitLength[i][2];
        break;

      case QRErrorCorrectLevel.H:
        nLimit = QRCodeLimitLength[i][3];
        break;
    }

    if (length <= nLimit) {
      break;
    } else {
      nType++;
    }
  }

  if (nType > QRCodeLimitLength.length) {
    throw new Error("Too long data");
  }

  return nType;
}

function _getUTF8Length(sText) {
  var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
  return replacedText.length + (replacedText.length != sText ? 3 : 0);
}

function QRCode(opt) {
  this.opt = {
    width: 255,
    height: 255,
    typeNumber: 4,
    correctLevel: QRErrorCorrectLevel.H
  };

  if (typeof opt === 'string') {
    this.opt.text = opt;
  } else Object.assign(this.opt, opt);

  if (this.opt.text) {
    this.makeCode(this.opt.text);
  }
}
/**
 * Make the QRCode
 *
 * @param {String} sText link data
 */


QRCode.prototype.makeCode = function (sText) {
  this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this.opt.correctLevel), this.opt.correctLevel);

  this._oQRCode.addData(sText);

  this._oQRCode.make();
};

QRCode.prototype.getBitmap = function () {
  var n = this._oQRCode.getModuleCount();

  return Array(n).fill(null).map((u, i) => Array(n).fill(null).map((u, j) => this._oQRCode.isDark(i, j)));
};
/**
 * @name QRCode.CorrectLevel
 */


QRCode.CorrectLevel = QRErrorCorrectLevel;
var _default = QRCode;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./Polyfill/polyfill");

var _EventEmitter = _interopRequireDefault(require("./HTML5/EventEmitter"));

var _BrowserDetector = _interopRequireDefault(require("./Detector/BrowserDetector"));

var _JSPath = _interopRequireDefault(require("./HTML5/JSPath"));

var _TemplateString = _interopRequireDefault(require("./JSMaker/TemplateString"));

var _TemplateXML = _interopRequireDefault(require("./JSMaker/TemplateXML"));

var _Dom = _interopRequireWildcard(require("./HTML5/Dom"));

var _Svg = _interopRequireDefault(require("./HTML5/Svg"));

var _OOP = _interopRequireDefault(require("./HTML5/OOP"));

var _XML = _interopRequireDefault(require("./XML/XML"));

var _Color = _interopRequireDefault(require("./Color/Color"));

var _IFrameBridge = _interopRequireDefault(require("./Network/IFrameBridge"));

var _JSDocx = _interopRequireDefault(require("./JSDocx/JSDocx"));

var _Broadcast = _interopRequireDefault(require("./Network/Broadcast"));

var text = _interopRequireWildcard(require("./HTML5/Text"));

var file = _interopRequireWildcard(require("./Converter/file"));

var base64 = _interopRequireWildcard(require("./Converter/base64"));

var _Alarm = _interopRequireDefault(require("./Time/Alarm"));

var _Ref = _interopRequireDefault(require("./AppPattern/Ref"));

var _XHR = _interopRequireDefault(require("./Network/XHR"));

var stringGenerate = _interopRequireWildcard(require("./String/stringGenerate"));

var stringFormat = _interopRequireWildcard(require("./String/stringFormat"));

var jsxdom = _interopRequireWildcard(require("./JSX/dom"));

var jsxattribute = _interopRequireWildcard(require("./JSX/attribute"));

var _Activity = _interopRequireDefault(require("./AppPattern/Activity"));

var _Context = _interopRequireDefault(require("./AppPattern/Context"));

var _ContextManager = _interopRequireDefault(require("./AppPattern/ContextManager"));

var _Application = _interopRequireDefault(require("./AppPattern/Application"));

var _VarScope = _interopRequireDefault(require("./AppPattern/VarScope"));

var _Fragment = _interopRequireDefault(require("./AppPattern/Fragment"));

var _Rectangle = _interopRequireDefault(require("./Math/Rectangle"));

var _Arc = _interopRequireDefault(require("./Math/Arc"));

var _NumRange = _interopRequireDefault(require("./Math/NumRange"));

var clipboard = _interopRequireWildcard(require("./HTML5/Clipboard"));

var _Heap = _interopRequireDefault(require("./DataStructure/Heap"));

var datetime = _interopRequireWildcard(require("./Time/datetime"));

var _CMDRunner = _interopRequireDefault(require("./AppPattern/CMDRunner"));

var _Element = _interopRequireDefault(require("./HTML5/Element"));

var _AElementNS = _interopRequireDefault(require("./HTML5/AElementNS"));

var _DomSignal = _interopRequireDefault(require("./HTML5/DomSignal"));

var _CookieStore = _interopRequireDefault(require("./Cookie/CookieStore"));

var _parseCookieString = _interopRequireDefault(require("./Cookie/parseCookieString"));

var _ResizeSystem = _interopRequireDefault(require("./HTML5/ResizeSystem"));

var _Vec = _interopRequireDefault(require("./Math/Vec2"));

var _Mat = _interopRequireDefault(require("./Math/Mat3"));

var _LanguageSystem = _interopRequireDefault(require("./HTML5/LanguageSystem"));

var int = _interopRequireWildcard(require("./Math/int"));

var _ALogger = _interopRequireDefault(require("./Code/ALogger"));

var _FlagManager = _interopRequireDefault(require("./Code/FlagManager"));

var _ObservableArray = _interopRequireDefault(require("./AppPattern/ObservableArray"));

var _ObservableStruct = _interopRequireDefault(require("./AppPattern/ObservableStruct"));

var _CCBlock = _interopRequireDefault(require("./AppPattern/circuit/CCBlock"));

var _CCLine = _interopRequireDefault(require("./AppPattern/circuit/CCLine"));

var FileSaver = _interopRequireWildcard(require("./Network/FileSaver"));

var _Thread = _interopRequireDefault(require("./Network/Thread"));

var _generator = require("./JSMaker/generator");

var _ShareConfiguration = _interopRequireDefault(require("./AppPattern/ShareConfiguration"));

var _safeThrow = _interopRequireDefault(require("./Code/safeThrow"));

var array = _interopRequireWildcard(require("./DataStructure/Array"));

var _remoteRequireNodeAsync = _interopRequireDefault(require("./Network/remoteRequireNodeAsync"));

var _Polygon = _interopRequireDefault(require("./Math/Polygon"));

var _DynamicCSS = _interopRequireDefault(require("./HTML5/DynamicCSS"));

var _SCParser = _interopRequireDefault(require("./SCLang/SCParser"));

var _SCProgramInstance = _interopRequireWildcard(require("./SCLang/SCProgramInstance"));

var _SCOperatorExecutor = _interopRequireDefault(require("./SCLang/SCOperatorExecutor"));

var _Const = _interopRequireDefault(require("./AppPattern/Const"));

var _SCScope = _interopRequireDefault(require("./SCLang/SCScope"));

var _SCCodeGenerator = _interopRequireWildcard(require("./SCLang/SCCodeGenerator"));

var printer = _interopRequireWildcard(require("./Print/printer"));

var measurements = _interopRequireWildcard(require("./Math/measurements"));

var _QRCode = _interopRequireDefault(require("./Converter/QRCode"));




var absol = {
  int: int,
  array: array,
  safeThrow: _safeThrow.default,
  Rectangle: _Rectangle.default,
  ResizeSystem: _ResizeSystem.default,
  Arc: _Arc.default,
  Polygon: _Polygon.default,
  NumRange: _NumRange.default,
  CookieStore: _CookieStore.default,
  parseCookieString: _parseCookieString.default,
  CMDRunner: _CMDRunner.default,
  ContextManager: _ContextManager.default,
  Application: _Application.default,
  Fragment: _Fragment.default,
  VarScope: _VarScope.default,
  Context: _Context.default,
  Activity: _Activity.default,
  Element: _Element.default,
  ElementNS: _AElementNS.default,
  AElement: _Element.default,
  AElementNS: _AElementNS.default,
  DomSignal: _DomSignal.default,
  JSPath: _JSPath.default,
  TemplateString: _TemplateString.default,
  TemplateXML: _TemplateXML.default,
  Dom: _Dom.default,
  Svg: _Svg.default,
  BrowserDetector: _BrowserDetector.default,
  OOP: _OOP.default,
  XML: _XML.default,
  Color: _Color.default,
  EventEmitter: _EventEmitter.default,
  JSZip: window.JSZip,
  IFrameBridge: _IFrameBridge.default,
  JSDocx: _JSDocx.default,
  Broadcast: _Broadcast.default,
  text: text,
  file: file,
  base64: base64,
  Alarm: _Alarm.default,
  coreDom: _Dom.default.ShareInstance,
  coreSvg: _Svg.default.ShareInstance,
  require: function (tagName) {
    return this.coreDom.require(tagName) || this.coreSvg.require(tagName);
  },
  domCreator: _Dom.default.ShareInstance.creator,
  svgCreator: _Dom.default.ShareInstance.creator,
  _: _Dom.default.ShareInstance._,
  $: _Dom.default.ShareInstance.$,
  $$: _Dom.default.ShareInstance.$$,
  _svg: _Svg.default.ShareInstance._,
  $svg: _Svg.default.ShareInstance.$,
  Ref: _Ref.default,
  Const: _Const.default,
  XHR: _XHR.default,
  string: Object.assign({}, stringFormat, stringGenerate),
  jsx: {
    dom: jsxdom,
    attribute: jsxattribute
  },
  QRCode: _QRCode.default,
  clipboard: clipboard,
  dataStructure: {
    Heap: _Heap.default
  },
  datetime: datetime,
  Vec2: _Vec.default,
  Mat3: _Mat.default,
  LanguageSystem: _LanguageSystem.default,
  ALogger: _ALogger.default,
  FlagManager: _FlagManager.default,
  ObservableArray: _ObservableArray.default,
  ObservableStruct: _ObservableStruct.default,
  circuit: {
    CCBlock: _CCBlock.default,
    CCLine: _CCLine.default
  },
  FileSaver,
  Thread: _Thread.default,
  generateJSVariable: _generator.generateJSVariable,
  copyJSVariable: _generator.copyJSVariable,
  normalizeIdent: stringFormat.normalizeIdent,
  replaceDateStringJSVariable: _generator.replaceDateStringJSVariable,
  remoteNodeRequireAsync: _remoteRequireNodeAsync.default,
  shareConfiguration: _ShareConfiguration.default.instance,
  DynamicCSS: _DynamicCSS.default,
  getSystemFontSize: _Dom.getSystemFontSize,
  sclang: {
    'SCParser': _SCParser.default,
    'SCProgramInstance': _SCProgramInstance.default,
    'SCOperatorExecutor': _SCOperatorExecutor.default,
    'SCStaticLibScope': _SCProgramInstance.SCStaticLibScope,
    'SCDynamicLibScope': _SCProgramInstance.SCDynamicLibScope,
    'SCScope': _SCScope.default,
    'SCCodeGenerator': _SCCodeGenerator.default,
    generateSCCode: _SCCodeGenerator.generateSCCode,
    generateSCHighlightPreviewCode: _SCCodeGenerator.generateSCHighlightPreviewCode
  },
  printer: printer,
  measurements: measurements
};
var _default = absol;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/absol.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/absol.js ***/
"use strict";

var _ = _interopRequireDefault(require("."));

var _AElement = _interopRequireDefault(require("./HTML5/AElement"));

var _AElementNS = _interopRequireDefault(require("./HTML5/AElementNS"));


//for old plugin
_.default['HTML' + 'El' + 'ement'.toLowerCase()] = _.default.Element;
_.default.dom = _.default.Dom;
_.default.event = _.default.EventEmitter;
_.default.Event = _.default.EventEmitter;
_.default.color = _.default.Color;
_.default.documentReady = _.default.Dom.documentReady;
window.AComp = _.default.AComp;
window.PhotoSwipeViewer = _.default.PhotoSwipeViewer;
window.IFrameBridge = _.default.IFrameBridge;
window.absol = _.default;
var mapKeys = {
  ShareDom: 'coreDom',
  ShareDomCreator: 'domCreator',
  ShareSvgC: 'coreSvgCreator',
  ShareSvgCreator: 'svgCreator',
  ShareCreator: 'domCreator'
};
_.default.logData = [];

_.default.log = function () {
  _.default.logData.push([new Error('TraceError')].concat(Array.prototype.slice.call(arguments)));
};

Object.keys(mapKeys).forEach(function (key) {
  var valueKey = mapKeys[key];
  Object.defineProperty(_.default, key, {
    get: function () {
      if (!this['__warn' + key + '__']) {
        this['__warn' + key + '__'] = true;

        _.default.log("use " + valueKey + ' instead of ' + key);
      }

      return this[valueKey];
    }
  });
});
/**
 * @deprecated
 * @param {string|Array} className
 * @returns {Boolean}
 */

_AElement.default.prototype.containsClass = function (className) {
  if (className.forEach && className.map) {
    for (var i = 0; i < className.length; ++i) if (!this.classList.containsClass(className[i])) return false;

    return true;
  } else return this.classList.contains(className);
};
/**
 * @deprecated
 * @param {string|Array} className
 * @returns {Boolean}
 */


_AElementNS.default.prototype.containsClass = _AElement.default.prototype.containsClass;
};

moduleFactories["node_modules/absol-vietnamese/CommonWords.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vietnamese/CommonWords.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = ["a", "a dua", "a hoàn", "a phiến", "a tòng", "à", "ả", "ả đào", "ả giang hồ", "á", "á-căn-đình", "á khẩu", "á khôi", "á kim", "á rập", "ạ", "ác", "ác cảm", "ác chiến", "ác mộng", "ác nghiệt", "ác phụ", "ác tà", "ác tâm", "ác thú", "ách", "ạch", "ai", "ai ai", "ai điếu", "ai oán", "ải", "ải quan", "ái", "ái ân", "ái hữu", "ái khanh", "ái lực", "ái mộ", "ái nam ái nữ", "ái ngại", "ái nhĩ lan", "ái phi", "ái quốc", "ái tình", "am", "am hiểu", "am pe", "ảm đạm", "ám", "ám ảnh", "ám chỉ", "ám hại", "ám hiệu", "ám muội", "ám sát", "ám tả", "ám thị", "an", "an ba ni", "an bài", "an cư", "an dưỡng", "an nghỉ", "an ninh", "an phận", "an táng", "an tâm", "an toàn", "an ủi", "an vị", "án", "án mạng", "án ngữ", "án phí", "án sát", "án thư", "án tử hình", "ang", "ang áng", "áng", "anh", "anh ánh", "anh dũng", "anh đào", "anh em", "anh hùng", "anh linh", "anh tài", "anh thư", "anh tuấn", "ảnh", "ảnh ảo", "ảnh hưởng", "ảnh lửa", "ánh", "ánh đèn", "ánh nắng", "ánh sáng", "ao", "ao ước", "ào", "ào ào", "ào ạt", "ảo", "ảo ảnh", "ảo giác", "ảo mộng", "ảo não", "ảo thuật", "ảo tưởng", "ảo tượng", "áo", "áo choàng", "áo dài", "áo giáp", "áo gối", "áo mưa", "áo ngủ", "áo quan", "áo quần", "áo sơ mi", "áp", "áp bức", "áp dụng", "áp đảo", "áp đặt", "áp giải", "áp lực", "áp suất", "áp tải", "áp tới", "át", "au", "áy náy", "ắc qui", "ăm ắp", "ẵm", "ăn", "ăn bám", "ăn bận", "ăn bốc", "ăn bớt", "ăn cá", "ăn cánh", "ăn cắp", "ăn chay", "ăn chắc", "ăn chơi", "ăn cỗ", "ăn cơm", "ăn cơm tháng", "ăn cưới", "ăn cướp", "ăn giải", "ăn gian", "ăn giỗ", "ăn hại", "ăn hiếp", "ăn hoa hồng", "ăn hỏi", "ăn hối lộ", "ăn không", "ăn khớp", "ăn kiêng", "ăn lãi", "ăn lan", "ăn lương", "ăn mày", "ăn nằm", "ăn năn", "ăn nhịp", "ăn nói", "ăn ở", "ăn quịt", "ăn sống", "ăn sương", "ăn tạp", "ăn tết", "ăn tham", "ăn thề", "ăn thua", "ăn thử", "ăn thừa", "ăn tiệc", "ăn tiền", "ăn tiêu", "ăn trộm", "ăn uống", "ăn vạ", "ăn vụng", "ăn xén", "ăn xổi", "ăn ý", "ẳng ẳng", "ắp", "ắt", "âm", "âm ấm", "âm ba", "âm cung", "âm cực", "âm dương", "âm đạo", "âm điệu", "âm giải", "âm hạch", "âm hành", "âm hộ", "âm hồn", "âm hưởng", "âm ỉ", "âm lượng", "âm mao", "âm mưu", "âm nang", "âm nhạc", "âm phủ", "âm sắc", "âm thầm", "âm thần", "âm thoa", "âm tín", "âm u", "âm vận", "âm vật", "ầm", "ầm ĩ", "ẩm", "ẩm thấp", "ẩm thực", "ấm", "ấm áp", "ấm chén", "ấm cúng", "ấm no", "ân", "ân ái", "ân cần", "ân hận", "ân huệ", "ân nghĩa", "ân nhân", "ân oán", "ân tình", "ân xá", "ẩn", "ẩn dật", "ẩn náu", "ẩn sỉ", "ẩn ý", "ấn", "ấn chỉ", "ấn định", "ấn hành", "ấn loát", "ấn quán", "ấn tín", "ấn tượng", "ấp", "ấp ủ", "ập", "âu", "âu châu", "âu phục", "âu sầu", "âu yếm", "ẩu", "ẩu đả", "ấu", "ấu trĩ", "ấu trùng", "ấy", "ba", "ba ba", "ba bó một giạ", "ba chân bốn cẳng", "ba chìm bảy nổi", "ba cọc ba đồng ba dò", "ba đào", "ba gai", "ba hoa", "ba láp", "ba lăng nhăng", "ba lê", "ba lô", "ba phải", "ba quân", "ba que", "ba rọi", "ba sinh", "ba trợn", "ba tư", "bà", "bà chằng", "bà chủ", "bà con", "bà cụ", "bà đỡ", "bà phước", "bà vãi", "bả", "bả vai", "bã", "bá", "bá âm", "bá cáo", "bá chủ", "bá hộ", "bá láp", "bá quan", "bá quyền", "bá tánh", "bá tước", "bá vương", "bạ", "bạ ai", "bác", "bác ái", "bác bẻ", "bác cổ", "bác học", "bác sĩ", "bác vật", "bạc", "bạc ác", "bạc hà", "bạc hạnh", "bạc nghĩa", "bạc nhạc", "bạc nhược", "bạc phận", "bạc tình", "bách", "bách bộ", "bách hợp", "bách khoa", "bách nghệ", "bách niên giai lão", "bách phân", "bách thảo", "bách thú", "bách tính", "bạch", "bạch cầu", "bạch cúc", "bạch cung", "bạch dương", "bạch đàn", "bạch đinh", "bạch huyết", "bạch kim", "bạch lạp", "bạch ngọc", "bạch tuộc", "bạch tuyết", "bạch yến", "bài", "bài bác", "bài báo", "bài ca", "bài diễn văn", "bài học", "bài làm", "bài luận", "bài thơ", "bài tiết", "bài vị", "bài xích", "bãi", "bãi biển", "bãi bỏ", "bãi chức", "bãi cỏ", "bãi công", "bãi nại", "bãi sa mạc", "bãi tha ma", "bãi trường", "bái", "bái biệt", "bái đáp", "bái phục", "bái tạ", "bái yết", "bại", "bại hoại", "bại lộ", "bại sản", "bại tẩu", "bại trận", "bại vong", "bám", "bám riết", "ban", "ban ân", "ban bố", "ban công", "ban đầu", "ban đêm", "ban giám khảo", "ban hành", "ban khen", "ban ngày", "ban phát", "ban phước", "ban thưởng", "bàn", "bàn bạc", "bàn cãi", "bàn chải", "bàn cờ", "bàn giao", "bàn mổ", "bàn tán", "bàn tay", "bàn thờ", "bàn tính", "bàn tọa", "bản", "bản án", "bản cáo trạng", "bản chất", "bản đồ", "bản đồ lưu thông", "bản hát", "bản in", "bản kịch", "bản lãnh", "bản lề", "bản năng", "bản ngã", "bản quyền", "bản sao", "bản sắc", "bản thảo", "bản tính", "bản tóm tắt", "bản văn", "bản vị", "bản xứ", "bán", "bán buôn", "bán cầu", "bán chịu", "bán dạo", "bán đảo", "bán kết", "bán khai", "bán kính", "bán lẻ", "bán nam bán nữ", "bán nguyệt", "bán nguyệt san", "bán niên", "bán thân", "bán tín bán nghi", "bán tự động", "bạn", "bạn cũ", "bạn đọc", "bạn đời", "bạn học", "bạn lòng", "bạn thân", "bang", "bang giao", "bang trợ", "bang trưởng", "bàng", "bàng hoàng", "bàng quan", "bàng thính", "bảng", "bảng danh dự", "bảng đen", "bảng hiệu", "báng", "báng bổ", "banh", "bành", "bành trướng", "bành voi", "bảnh", "bảnh bao", "bánh", "bánh bao", "bánh lái", "bánh mì", "bánh tráng", "bao", "bao bì", "bao biện", "bao bọc", "bao dung", "bao giấy", "bao giờ", "bao gồm", "bao hàm", "bao la", "bao lơn", "bao nhiêu", "bao quanh", "bao tay", "bao thơ", "bao tử", "bao vây", "bào", "bào chế", "bào chữa", "bào thai", "bảo", "bảo an", "bảo chứng", "bảo đảm", "bảo hiểm", "bảo hòa", "bảo hộ", "bảo mật", "bảo quản", "bảo tàng", "bảo thủ", "bảo trợ", "bảo vệ", "bão", "bão tuyết", "báo", "báo cáo", "báo chí", "báo động", "báo hiếu", "báo hiệu", "báo hỷ", "báo oán", "báo ơn", "báo thức", "báo trước", "báo ứng", "bạo", "bạo bệnh", "bạo chúa", "bạo động", "bạo hành", "bạo lực", "bạo ngược", "bạo phát", "bát", "bát âm", "bát hương", "bát ngát", "bát nháo", "bạt", "bạt đãi", "bạt mạng", "bạt ngàn", "bàu", "báu vật", "bay", "bay bướm", "bay hơi", "bay lên", "bay nhảy", "bày", "bày biện", "bày đặt", "bày tỏ", "bảy", "bắc", "bắc bán cầu", "bắc cực", "băm", "bằm vằm", "bặm", "băn khoăn", "bắn", "bắn phá", "bắn tin", "băng", "băng bó", "băng ca", "băng dương", "băng điểm", "băng hà", "băng huyết", "băng keo", "băng sơn", "bằng", "bằng an", "bằng chứng", "bằng hữu", "bằng lòng", "bẵng", "bắp", "bắp cải", "bắp chân", "bắp đùi", "bắt", "bắt bẻ", "bắt bí", "bắt bớ", "bắt buộc", "bắt chước", "bắt cóc", "bắt đầu", "bắt giam", "bắt nạt", "bắt phạt", "bắt rễ", "bắt tay", "bắt vạ", "bặt", "bặt tăm", "bặt thiệp", "bấc", "bậc", "bầm", "bẩm", "bẩm sinh", "bẩm tính", "bấm", "bấm bụng", "bấm chuông", "bần", "bần cùng", "bần thần", "bần tiện", "bẩn", "bẩn chật", "bấn", "bận", "bận lòng", "bâng khuâng", "bâng quơ", "bấp bênh", "bập bẹ", "bập bềnh", "bất", "bất bạo động", "bất biến", "bất bình", "bất chính", "bất công", "bất diệt", "bất đắc chí", "bất đắc dĩ", "bất định", "bất đồng", "bất động", "bất hạnh", "bất hảo", "bất hòa", "bất hợp lý", "bất hợp pháp", "bất hủ", "bất khuất", "bất lợi", "bất lực", "bất lương", "bất ngờ", "bất nhân", "bất tiện", "bất tỉnh", "bất trắc", "bất tường", "bật", "bật lửa", "bâu", "bầu", "bầu rượu", "bầu tâm sự", "bầu trời", "bấu", "bây", "bây bẩy", "bây giờ", "bầy", "bầy hầy", "bẩy", "bẫy", "bấy lâu", "bậy", "be", "be be", "bè", "bẻ", "bẻ vụn", "bẽ", "bẽ bàng", "bé", "bé tí", "bẹ", "bẻm", "bèn", "bẽn lẽn", "bén", "bén mảng", "bén mùi", "bẹn", "beo", "bèo", "bèo bọt", "béo", "béo bở", "bép xép", "bẹp", "bét", "bét nhè", "bê", "bê tha", "bê trễ", "bề", "bề bộn", "bề cao", "bề thế", "bề trên", "bể", "bể ái", "bể bơi", "bể dâu", "bễ", "bế", "bế mạc", "bế tắc", "bệ", "bệ hạ", "bệ rạc", "bệ vệ", "bệch", "bên", "bên bị", "bên nguyên", "bền", "bền chí", "bền vững", "bến đò", "bến tàu", "bến xe", "bện", "bênh", "bênh vực", "bềnh bồng", "bếp", "bếp núc", "bết", "bệt", "bêu", "bêu xấu", "bệu", "bi", "bi ai", "bi ca", "bi đát", "bi kịch", "bi quan", "bi tráng", "bì", "bì bõm", "bỉ", "bỉ mặt", "bỉ vận", "bí", "bí ẩn", "bí mật.", "bí quyết", "bí thư", "bị", "bị chú", "bị động", "bị lừa", "bị thịt", "bị thương", "bia", "bia miệng", "bìa", "bịa", "bích chương", "bích ngọc", "bịch", "biếc", "biếm", "biếm họa", "biên", "biên bản", "biên giới", "biên lai", "biên tập", "biền biệt", "biển", "biển lận", "biển thủ", "biến", "biến chất", "biến chứng", "biến cố", "biến động", "biến thể", "biến thiên", "biện bạch", "biện chứng", "biện hộ", "biện minh", "biện pháp", "biếng", "biếng nhác", "biết", "biết ơn", "biết ý", "biệt", "biệt danh", "biệt hiệu", "biệt kích", "biệt ly", "biệt tài", "biệt thự", "biệt xứ", "biểu", "biểu diễn", "biểu hiện", "biểu lộ", "biểu ngữ", "biểu quyết", "biểu tình", "biếu", "bìm bìm", "bím tóc", "bịn rịn", "binh", "binh bị", "binh biến", "binh chủng", "binh lực", "binh pháp", "binh sĩ", "binh xưởng", "bình", "bình an", "bình dân", "bình đẳng", "bình định", "bình luận", "bình minh", "bình nguyên", "bình phục", "bình thản", "bình thường", "bình tĩnh", "bỉnh bút", "bịnh", "bịnh căn", "bịnh chứng", "bịnh dịch", "bịnh học", "bịnh nhân", "bịnh viện", "bịnh xá", "bịp", "bít", "bít tất", "bịt", "bịt bùng", "bìu", "bìu dái", "bĩu môi", "bíu", "bò", "bò cạp", "bò sát", "bỏ", "bỏ bê", "bỏ dở", "bỏ đói", "bỏ hoang", "bỏ lỡ", "bỏ phí", "bỏ phiếu", "bỏ trốn", "bỏ tù", "bỏ xứ", "bõ", "bõ công", "bõ cơn giận", "bó", "bó buộc", "bó gối", "bó lúa", "bó thân", "bọ", "bọ chét", "bọ hung", "bọ ngựa", "bọ rầy", "bóc", "bóc lột", "bóc vảy", "bọc", "bói", "bói cá", "bom", "bom đạn", "bom hóa học", "bom khinh khí", "bom nguyên tử", "bỏm bẻm", "bõm", "bon bon", "bòn", "bòn mót", "bón", "bọn", "bong", "bong bóng", "bong gân", "bòng", "bõng", "bóng", "bóng bảy", "bóng cá", "bóng dáng", "bóng đèn", "bóng gió", "bóng loáng", "bóng trăng", "bọng đái", "boong", "bóp", "bóp còi", "bóp nghẹt", "bót", "bọt", "bọt biển", "bô", "bô lão", "bồ", "bồ câu", "bồ hóng", "bồ liễu", "bồ nhìn", "bổ", "bổ dưỡng", "bổ ích", "bổ nhiệm", "bổ sung", "bố", "bố cáo", "bố cục", "bố mẹ", "bố trí", "bộ", "bộ chỉ huy", "bộ dạng", "bộ điệu", "bộ đồ", "bộ đội", "bộ hạ", "bộ hành", "bộ lạc", "bộ máy", "bộ mặt", "bộ phận", "bộ sách", "bốc", "bốc cháy", "bốc hơi", "bốc khói", "bốc thuốc", "bộc lộ", "bộc phát", "bôi", "bôi bẩn", "bôi trơn", "bồi", "bồi dưỡng", "bồi hồi", "bồi thường", "bổi", "bối rối", "bội", "bội bạc", "bội phản", "bội tín", "bôm", "bôn ba", "bồn", "bồn chồn", "bồn hoa", "bổn phận", "bốn", "bốn phương", "bộn", "bông", "bông đùa", "bông lông", "bông lơn", "bồng", "bồng bột", "bồng lai", "bổng", "bổng lộc", "bỗng", "bốp", "bộp chộp", "bột", "bột phát", "bơ", "bơ phờ", "bơ vơ", "bờ", "bờ bến", "bờ biển", "bờ đê", "bờ sông", "bở", "bỡ ngỡ", "bợ", "bơi", "bơi ngửa", "bơi xuồng", "bởi", "bởi thế", "bới", "bới tác", "bơm", "bờm", "bờm xờm", "bợm", "bỡn cợt", "bớt", "bu", "bù", "bù xú", "bú", "bú dù", "bụ", "bùa", "bùa yêu", "búa", "bục", "bùi", "bùi ngùi", "bùi nhùi", "bụi", "bụi bặm", "bụm miệng", "bùn", "bủn rủn", "bủn xỉn", "bún", "bung xung", "bùng cháy", "bùng nổ", "bủng", "búng", "bụng", "bụng nhụng", "buộc", "buộc tội", "buổi", "buồm", "buôn", "buôn lậu", "buồn", "buồn bực", "buồn cười", "buồn rầu", "buồn thảm", "buông", "buông tha", "buồng", "buồng hoa", "buồng the", "buồng trứng", "buốt", "buột", "buột miệng", "búp", "búp bê", "bút", "bút ký", "bút pháp", "bụt", "bư", "bự", "bừa", "bừa bãi", "bửa", "bữa", "bựa", "bức", "bức bách", "bức thư", "bức tranh", "bực bội", "bực tức", "bưng", "bưng bít", "bừng", "bứng", "bước", "bước đường", "bước ngoặt", "bước tiến", "bươi", "bưởi", "bươm bướm", "bướng", "bươu", "bướu", "bướu cổ", "bứt", "bứt rứt", "bưu chính", "bưu cục", "bưu điện", "bưu kiện", "bưu phí", "bưu tá", "bưu thiếp", "bưu tín viên", "ca", "ca bô", "ca cao", "ca dao", "ca khúc", "ca kịch", "ca kỹ", "ca lô", "ca ngợi", "ca nhạc", "ca nô", "ca ri", "ca rốt", "ca trù", "ca tụng", "ca vũ", "cà", "cà chua", "cà độc dược", "cà kheo", "cà khịa", "cà lăm", "cà nhắc", "cà phê", "cà rá", "cà rem", "cà sa", "cà vạt", "cả", "cả gan", "cả nể", "cả ngày", "cả quyết", "cả thảy", "cá", "cá biển", "cá biệt", "cá bống", "cá chép", "cá con", "cá đồng", "cá đuối", "cá gỗ", "cá hộp", "cá kho", "cá mập", "cá mè", "cá mòi", "cá muối", "cá ngựa", "cá nhân", "cá ông", "cá sấu", "cá thể", "cá thu", "cá tính", "cá trê", "cá tươi", "cá ươn", "cạ", "các", "cách", "cách biệt", "cách cấu tạo", "cách chức", "cách ly", "cách mạng", "cách mạng xã hội", "cách ngôn", "cách thức", "cai", "cai quản", "cai thần", "cai thợ", "cai trị", "cài", "cài cửa", "cải", "cải biên", "cải cách", "cải chính", "cải dạng", "cải danh", "cải hóa", "cải hối", "cải táng", "cải tạo", "cải tiến", "cải tổ", "cải tử hoàn sinh", "cãi", "cãi bướng", "cãi lộn", "cái", "cái ghẻ", "cái thế anh hùng", "cam", "cam chịu", "cam đoan", "cam kết", "cam lòng", "cam phận", "cam thảo", "cam tuyền", "cảm", "cảm động", "cảm giác", "cảm hóa", "cảm hoài", "cảm hứng", "cảm mến", "cảm phục", "cảm quan", "cảm thấy", "cảm tình", "cảm tử", "cảm tưởng", "cảm ứng", "cảm xúc", "cám", "cám cảnh", "cám dỗ", "cám ơn", "cạm bẫy", "can", "can án", "can chi", "can đảm", "can phạm", "can qua", "can thiệp", "can trường", "càn", "càn quét", "càn rỡ", "cản", "cản trở", "cán", "cán bộ", "cán cân", "cán chổi", "cán sự", "cán viết", "cạn", "càng", "cảng", "cáng", "cáng đáng", "canh", "canh cánh", "canh gác", "canh giữ", "canh khuya", "canh nông", "canh tác", "canh tân", "canh tuần", "cành", "cành nanh", "cảnh", "cảnh báo", "cảnh binh", "cảnh cáo", "cảnh giác", "cảnh huống", "cảnh ngộ", "cảnh sát", "cảnh sắc", "cảnh tỉnh", "cảnh tượng", "cánh", "cánh bèo", "cánh cửa", "cánh đồng", "cánh khuỷ", "cánh mũi", "cánh quạt gió", "cánh sinh", "cánh tay", "cạnh", "cạnh khóe", "cạnh tranh", "cao", "cao áp", "cao bay xa chạy", "cao bồi", "cao cả", "cao cấp", "cao cường", "cao danh", "cao đẳng", "cao độ", "cao hứng", "cao kiến", "cao lâu", "cao lương", "cao ly", "cao minh", "cao ngạo", "cao nguyên", "cao quý", "cao siêu", "cao su", "cao tăng", "cao thế", "cao thủ", "cao thượng", "cao ủy", "cao vọng", "cao xạ", "cào", "cào cào", "cảo bản", "cáo", "cáo biệt", "cáo bịnh", "cáo cấp", "cáo chung", "cáo giác", "cáo lỗi", "cáo mật", "cáo phó", "cáo thị", "cáo tội", "cáo trạng", "cáo từ", "cạo", "cạo giấy", "cáp", "cạp", "cạp chiếu", "cát", "cát cánh", "cát hung", "cát tường", "cạt tông", "cau", "cau có", "cau mày", "càu nhàu", "cáu", "cáu kỉnh", "cáu tiết", "caught", "cay", "cay đắng", "cay độc", "cay nghiệt", "cày", "cày bừa", "cày cấy", "cáy", "cạy", "cạy cửa", "cắc kè", "cặc", "căm", "căm căm", "căm hờn", "căm thù", "cằm", "cắm trại", "cặm", "cặm cụi", "căn", "căn bản", "căn cơ", "căn cứ", "căn cước", "căn dặn", "căn nguyên", "căn tính", "căn vặn", "cằn cỗi", "cằn nhằn", "cắn", "cắn câu", "cắn cỏ", "cắn răng", "cắn rứt", "cắn xé", "cặn", "cặn bã", "cặn kẽ", "căng", "căng thẳng", "cẳng", "cẳng tay", "cắng đắng", "cắp", "cặp", "cặp bến", "cặp đôi", "cặp kè", "cặp vợ chồng", "cắt", "cắt bỏ", "cắt bớt", "cắt cứ", "cắt đặt", "cắt may", "cắt ngang", "cắt nghĩa", "cắt thuốc", "cắt xén", "câm", "câm họng", "cầm", "cầm ca", "cầm cái", "cầm canh", "cầm cập", "cầm chắc", "cầm chừng", "cầm cự", "cầm đầu", "cầm giữ", "cầm lái", "cầm lòng", "cầm máu", "cầm quyền", "cầm sắt", "cầm thú", "cầm tù", "cẩm", "cẩm chướng", "cẩm lai", "cẩm nang", "cẩm nhung", "cẩm thạch", "cẩm tú", "cấm", "cấm chỉ", "cấm cố", "cấm cửa", "cấm dán giấy", "cấm địa", "cấm khẩu", "cấm kỵ", "cấm lịnh", "cấm thành", "cấm vào", "cấm vận", "cân", "cân bàn", "cân bằng", "cân đối", "cân não", "cân nhắc", "cân xứng", "cần", "cần cù", "cần kiệm", "cần kíp", "cần mẫn", "cần thiết", "cần vụ", "cần xé", "cẩn", "cẩn bạch", "cẩn mật", "cẩn thẩn", "cấn", "cấn thai", "cận", "cận chiến", "cận đại", "cận thị", "cận vệ", "cấp", "cấp báo", "cấp bằng", "cấp cứu", "cấp dưỡng", "cấp hiệu", "cấp thời", "cấp tiến", "cập kê", "cất", "cất đi", "cất giấu", "cất hàng", "cất nhà", "cất nhắc", "cất tiếng", "cật", "cật lực", "cật một", "cật vấn", "câu chấp", "câu chuyện", "câu đố", "câu đối", "câu hỏi", "câu lạc bộ", "câu thúc", "cầu", "cầu an", "cầu cạnh", "cầu chì", "cầu chứng", "cầu cứu", "cầu hôn", "cầu nguyện", "cầu thủ", "cầu tiêu", "cầu tự", "cầu vồng", "cầu xin", "cẩu", "cẩu thả", "cấu", "cấu tạo", "cấu thành", "cậu", "cây", "cây cỏ", "cây còi", "cây dù", "cây nến", "cây số", "cây viết", "cây xăng", "cấy", "cậy", "cậy thế", "cha", "cha đỡ đầu", "cha ghẻ", "cha mẹ", "cha sở", "chà", "chà là", "chà xát", "chả", "chả giò", "chác", "chạch", "chai", "chài", "chải", "chải chuốt", "chải đầu", "chàm", "chạm", "chạm trán", "chan chứa", "chán", "chán ghét", "chán nản", "chán vạn", "chạn", "chang chang", "chàng", "chàng hảng", "chàng hiu", "chạng vạng", "chanh", "chanh chua", "chánh", "chánh án", "chánh phạm", "chạnh lòng", "chao", "chào", "chào mời", "chảo", "chão", "cháo", "chạo", "chạp", "chát", "chát tai", "chau mày", "cháu", "cháu chắt", "chay", "chày", "chảy", "chảy máu", "chảy rửa", "cháy", "cháy túi", "chạy", "chạy chọt", "chạy chữa", "chạy đua", "chạy mất", "chạy thoát", "chắc", "chắc mẩm", "chắc nịch", "chăm", "chăm chú", "chăm nom", "chăm sóc", "chằm", "chằm chằm", "chặm", "chăn", "chăn gối", "chăn nuôi", "chẵn", "chắn", "chắn bùn", "chắn xích", "chăng", "chăng lưới", "chăng màn", "chằng", "chằng chịt", "chẳng", "chẳng bõ", "chẳng hạn", "chẳng may", "chẳng những", "chẳng thà", "chặng", "chắp", "chắp nhặt", "chặp", "chắt", "chắt bóp", "chặt", "chặt chẽ", "châm", "châm biếm", "châm ngôn", "chấm", "chấm dứt", "chấm phá", "chậm", "chậm chạp", "chậm tiến", "chân", "chân dung", "chân lý", "chân tài", "chân thành.", "chân tình", "chân trời", "chân tướng", "chần", "chần chừ", "chẩn", "chẩn bịnh", "chẩn mạch", "chẩn y viện", "chấn áp", "chấn chỉnh", "chấn động", "chấn hưng", "chận", "chận đứng", "chấp", "chấp chính", "chấp hành", "chấp nhận", "chấp thuận", "chập choạng", "chập chờn", "chập chững", "chất", "chất chứa", "chất độc", "chất khí", "chất kích thích", "chất phác", "chất vấn", "chật", "chật vật", "châu", "châu báu", "châu chấu", "châu thổ", "chầu", "chầu chực", "chầu trời", "chậu", "chầy", "chấy", "che", "che chở", "che đậy", "che phủ", "chè", "chè chén", "chẻ", "chẻ hoe", "ché", "chém", "chém giết", "chen", "chen chúc", "chèn", "chèn ép", "chẽn", "chén", "chén cơm", "cheo", "cheo cưới", "cheo leo", "chèo", "chèo chống", "chéo", "chéo áo", "chép", "chẹt", "chê", "chê bai", "chê cười", "chế", "chế biến", "chế độ", "chế giễu", "chế ngự", "chế nhạo", "chế tác", "chế tạo", "chếch", "chếch choáng", "chêm", "chễm chệ", "chênh", "chênh lệch", "chênh vênh", "chểnh mảng", "chệnh choạng", "chết", "chết đuối", "chết giấc", "chết tươi", "chi", "chi bằng", "chi đoàn", "chi phí", "chi phiếu", "chi phối", "chi tiết", "chì", "chỉ", "chỉ đạo", "chỉ định", "chỉ huy", "chỉ rõ", "chỉ tay", "chỉ thị", "chỉ trích", "chí", "chí ác", "chí chết", "chí công", "chí hiếu", "chí hướng", "chí khí", "chí lý", "chí tuyến", "chí yếu", "chị", "chị bộ", "chia", "chia lìa", "chia ly", "chìa", "chìa khóa", "chĩa", "chích", "chích ngừa", "chiếc", "chiếc bóng", "chiêm", "chiêm bái", "chiêm bao", "chiêm ngưỡng", "chiếm", "chiếm đoạt", "chiếm giữ", "chiên", "chiến", "chiến bại", "chiến bào", "chiến binh", "chiến dịch", "chiến đấu", "chiến hào", "chiến hữu", "chiến khu", "chiến lược", "chiến sĩ", "chiến thắng", "chiến thuật", "chiến tranh", "chiến trận", "chiến trường", "chiêng", "chiết", "chiết khấu", "chiết quang", "chiết trung", "chiết tự", "chiêu", "chiêu bài", "chiêu đãi", "chiêu mộ", "chiều", "chiều chuộng", "chiều ý", "chiếu", "chiếu chỉ", "chiếu cố", "chiếu khán", "chiếu lệ", "chim", "chim chuột", "chim muông", "chim xanh", "chìm", "chín", "chín chắn", "chín mối", "chín nhừ", "chỉnh", "chỉnh lý", "chĩnh", "chíp", "chít", "chít khăn", "chịt", "chịu", "chịu đầu hàng", "chịu khó", "chịu nhục", "chịu tang", "chịu thua", "chịu tội", "cho", "cho biết", "cho mượn", "cho phép", "chõ", "chó", "chó chết", "chó sói", "chóa mắt", "choạc", "choán", "choàng", "choảng", "choáng", "choáng óc", "choáng váng", "choắc", "chọc", "chọc ghẹo", "chọc giận", "chóe", "chòi", "chòi canh", "chõi", "chói", "chói mắt", "chọi", "chòm", "chỏm", "chọn", "chọn lọc", "chong", "chong chóng", "chòng chành", "chòng chọc", "chòng ghẹo", "chõng", "chóng", "chóng vánh", "chóp chóp", "chót", "chót vót", "chỗ", "chốc", "chốc nữa", "chồi", "chồi rễ", "chổi", "chối", "chối từ", "chồm", "chôn", "chồn", "chốn", "chông", "chông gai", "chồng", "chồng ngồng", "chổng", "chổng gọng", "chống", "chống chế", "chống chỏi", "chống trả", "chốp", "chộp", "chốt", "chột dạ", "chột mắt", "chờ", "chờ chết", "chờ xem", "chở", "chở khách", "chớ", "chợ", "chợ trời", "chơi", "chơi ác", "chơi bời", "chơi chữ", "chơi đĩ", "chới với", "chơm chởm", "chớm", "chớm nở", "chờn vờn", "chớp", "chớp mắt", "chớp nhoáng", "chớt nhả", "chợt", "chợt nhớ", "chu cấp", "chu đáo", "chu kỳ", "chu vi", "chủ", "chủ bút", "chủ đề", "chủ lực", "chủ mưu", "chủ nghĩa", "chủ nhiệm", "chủ quan", "chủ quyền", "chủ tịch", "chủ trì", "chủ trương", "chủ yếu", "chú", "chú giải", "chú ý", "chua", "chua cay", "chua xót", "chùa", "chúa", "chuẩn", "chuẩn bị", "chuẩn đích", "chuẩn xác", "chuẩn y", "chúc", "chúc mừng", "chúc thư", "chúc từ", "chục", "chui", "chùi", "chúi", "chum", "chùm", "chùm hoa", "chụm", "chùn", "chùn chụt", "chung", "chung cuộc", "chung kết", "chung thủy", "chung tình", "chùng", "chủng", "chủng đậu", "chủng loại", "chủng viện", "chúng", "chúng nó", "chúng sinh", "chuốc", "chuộc", "chuộc tội", "chuôi", "chuỗi", "chuỗi ngày", "chuối", "chuôm", "chuồn", "chuồn chuồn", "chuông", "chuông cáo phó", "chuồng", "chuồng trại", "chuồng xí", "chuộng", "chuốt", "chuột", "chuột rút", "chụp", "chụp ảnh", "chụp lấy", "chút", "chút đỉnh", "chùy", "chuyên", "chuyên cần", "chuyên chính", "chuyên gia", "chuyên trách", "chuyền", "chuyển", "chuyển dịch", "chuyển động", "chuyển hướng", "chuyển tiếp", "chuyến", "chuyến bay", "chuyến trước", "chuyện", "chuyện phiếm", "chuyện tình", "chư hầu", "chư tướng", "chừ", "chữ", "chữ cái", "chữ hán", "chữ ký", "chữ tắt", "chữ trinh", "chứ", "chưa", "chưa bao giờ", "chừa", "chửa", "chửa hoang", "chữa", "chữa bịnh", "chứa", "chứa chan", "chứa đựng", "chức", "chức nghiệp", "chức quyền", "chức vụ", "chực", "chực sẵn", "chửi", "chửi thề", "chưng", "chưng bày", "chưng hửng", "chừng", "chừng mực", "chững chạc", "chứng", "chứng bịnh", "chứng chỉ", "chứng kiến", "chứng minh", "chứng nhân", "chứng nhận", "chứng thư", "chước", "chương", "chương trình", "chường", "chưởng ấn", "chưởng khế", "chưởng lý", "chướng", "chướng ngại", "chướng tai", "co", "co bóp", "co giãn", "co rút", "cò", "cò mồi", "cỏ", "cỏ khô", "có", "có ăn", "có chồng", "có chửa", "có hiếu", "có ích", "có lẽ", "có lý", "có nghĩa", "có thể", "có vẻ", "cọ", "cọ xát", "cóc", "cọc", "cọc cằn", "cọc chèo", "coi", "coi chừng", "coi rẻ", "còi", "còi xương", "cõi", "cõi đời", "cõi trên", "cói", "còm", "con", "con bạc", "con bịnh", "con cờ", "con điếm", "con đỡ đầu", "con hoang", "con ma", "con ngươi", "con ở", "con số", "con thú", "con tin", "con vụ", "còn", "còn nữa", "còn trinh", "cỏn con", "cong", "cong queo", "còng", "còng cọc", "cõng", "cóng", "cọng", "cóp", "cọp", "cót két", "cọt kẹt", "cọt xê", "cô", "cô dâu", "cô đơn", "cô hồn", "cô lập", "cô nhi", "cô quả", "cô quạnh", "cô thôn", "cổ", "cổ điển", "cổ động", "cổ học", "cổ hủ", "cổ mộ", "cổ nhân", "cổ phần", "cổ phiếu", "cổ tích", "cổ truyền", "cổ trướng", "cổ võ", "cỗ", "cỗ quan tài", "cố", "cố chấp", "cố định", "cố đô", "cố gắng", "cố hương", "cố hữu", "cố nhân", "cố quốc", "cố sát", "cố tri", "cố vấn", "cốc", "cộc", "cộc cằn", "cộc lốc", "côi cút", "cồi", "cỗi", "cối", "cối xay", "cội", "cồm cộm", "cốm", "cộm", "côn", "côn đồ", "côn trùng", "cồn", "cồn cát", "công", "công an", "công bố", "công chính", "công chúa", "công chúng", "công danh", "công dân", "công đoàn", "công giáo", "công hàm", "công ích", "công khai", "công luân", "công luận", "công lực", "công lý", "công nghệ", "công nghiệp", "công nhân", "công nhận", "công pháp", "công quĩ", "công tác", "công thức", "công thương", "công trái", "công ty", "công văn", "công xã", "công xuất", "công xưởng", "cồng", "cồng kềnh", "cổng", "cống", "cống hiến", "cộng", "cộng hòa", "cộng sản", "cộng tác", "cốt", "cốt nhục", "cốt truyện", "cột", "cột cờ", "cột trụ", "cơ", "cơ bản", "cơ cực", "cơ giới", "cơ hội", "cơ mưu", "cơ nghiệp", "cơ quan", "cơ sở", "cơ thể", "cờ", "cờ bạc", "cờ tướng", "cỡ", "cớ", "cơi", "cởi", "cởi mở", "cơm", "cơm đen", "cơm nước", "cơn mưa", "cợt", "cu", "cu li", "cù", "cù lao", "củ", "củ soát", "củ vấn", "cũ", "cú", "cú pháp", "cú vọ", "cụ", "cụ thể", "cua", "của", "của cải", "của hối lộ", "của lạ", "cúc", "cúc dục", "cục", "cục diện", "cục mịch", "cục tẩy", "cùi", "cùi chỏ", "củi", "cũi", "cúi", "cùm", "cúm", "cúm núm", "cụm", "cun cút", "cùn", "cung", "cung cầu", "cung khai", "cung nữ", "cung phi", "cùng", "cùng khổ", "cùng tận", "củng", "củng cố", "cũng", "cúng", "cuộc", "cuộc đời", "cuồi", "cuối", "cuối cùng", "cuội", "cuỗm", "cuồn cuộn", "cuốn", "cuốn gói", "cuộn", "cuồng", "cuồng nhiệt", "cuồng tín", "cuống", "cuống cuồng", "cúp", "cụp", "cút", "cụt", "cụt hứng", "cư", "cư dân", "cư xử", "cử", "cử hành", "cử nhân", "cử tri", "cữ", "cứ", "cứ điểm", "cự", "cự tuyệt", "cưa", "cửa", "cửa ải", "cửa hàng", "cửa mình", "cửa sổ", "cứa", "cựa", "cực", "cực điểm", "cực hình", "cưng", "cứng", "cứng cỏi", "cước", "cước phí", "cười", "cười chê", "cười gượng", "cười ngạo", "cười tình", "cưới", "cườm", "cương", "cương lĩnh", "cương quyết", "cương trực", "cường", "cường đạo", "cường độ", "cường quốc", "cường tráng", "cưỡng", "cưỡng bức", "cưỡng dâm", "cưỡng đoạt", "cướp", "cướp biển", "cứt", "cứt đái", "cứt ráy", "cứt xu", "cưu", "cưu mang", "cừu", "cừu địch", "cừu hận", "cửu", "cửu chương", "cửu tuyền", "cứu", "cứu cánh", "cứu tinh", "cứu trợ", "cứu xét", "cựu", "cựu chiến binh", "cựu kháng chiến", "cựu thời", "cựu trào", "cựu truyền", "da", "da bọc qui đầu", "da cam", "da che mắt ngựa", "da dẻ", "da diết", "da láng", "da liễu", "da mồi", "da người", "da thịt", "da thuộc", "dã", "dã cầm", "dã chiến", "dã dượi", "dã man", "dã nhân", "dã tâm", "dã thú", "dã tràng", "dạ", "dạ dày", "dạ hội", "dạ quang", "dạ vũ", "dạ yến", "dai", "dai dẳng", "dài", "dài dòng", "dải", "dải đất", "dãi", "dái", "dại", "dại dột", "dám", "dạm", "dạm bán", "dạm vợ", "dan díu", "dàn", "dàn cảnh", "dàn hòa", "dàn xếp", "dán", "dạn", "dạn mặt", "dang", "dang dở", "dáng", "dáng điệu", "dạng", "danh", "danh dự", "danh hiệu", "danh lam", "danh lợi", "danh mục", "danh nghĩa", "danh ngôn", "danh phẩm", "danh phận", "danh sách", "danh thiếp", "danh từ", "danh vọng", "dành", "dành dành", "dành giật", "dành riêng", "dao", "dao cạo", "dao động", "dao găm", "dao mổ", "dao xếp", "dạo", "dạo ấy", "dát", "dạt", "day", "dày", "dày đặc", "dãy", "dạy", "dạy bảo", "dạy tư", "dăm", "dằm", "dặm", "dặm trường", "dằn", "dằn lòng", "dặn", "dặn bảo", "dằng", "dằng co", "dằng dặc", "dắt", "dắt díu", "dâm", "dâm bụt", "dâm dật", "dâm đãng", "dâm loạn", "dâm ô", "dâm phụ", "dâm thư", "dầm", "dầm dề", "dân", "dân biểu", "dân ca", "dân chủ", "dân chúng", "dân công", "dân cư", "dân luật", "dân quân", "dân quê", "dân quyền", "dân sinh", "dân sự", "dân tị nạn", "dân tộc", "dân vận", "dần", "dần dần", "dẫn", "dẫn chứng", "dẫn dầu", "dẫn điện", "dẫn đô", "dẫn nhiệt", "dẫn thủy nhập điền", "dấn", "dâng", "dấp", "dập", "dập dềnh", "dập dìu", "dật", "dật dục", "dật sĩ", "dật sử", "dâu", "dâu cao su", "dâu gia", "dầu", "dầu cá", "dầu hắc", "dầu hỏa", "dầu mỏ", "dầu phọng", "dầu thơm", "dầu thực vật", "dấu", "dấu chấm", "dấu chấm phẩy", "dấu chấm than", "dấu chân", "dấu cộng", "dấu hiệu", "dấu nặng", "dấu ngã", "dấu ngoặc", "dấu phẩy", "dấu sắc", "dấu tay", "dấu thánh giá", "dấu vết", "dây", "dây cáp", "dây chuyền", "dây cương", "dây dưa", "dây giày", "dây kẽm gai", "dây leo", "dây lưng", "dây tây", "dây xích", "dẫy dụa", "dấy", "dấy binh", "dấy loạn", "dậy", "dậy men", "dậy thì", "dè", "dè dặt", "dè xẻn", "dẻ", "dẻo", "dẻo dai", "dẻo sức", "dép", "dẹp", "dẹp loạn", "dẹp tan", "dê", "dê cụ", "dể ngươi", "dễ", "dễ bảo", "dễ bể", "dễ chịu", "dễ coi", "dễ dãi", "dễ dàng", "dễ ghét", "dễ thương", "dế", "dệt", "dệt gấm", "di", "di bút", "di chúc", "di chuyển", "di cư", "di dân", "di động", "di hài", "di họa", "di sản", "di tích", "di trú", "di truyền", "di vật", "dì", "dì ghẻ", "dì phước", "dỉ", "dĩ", "dĩ nhiên", "dĩ vãng", "dí nát", "dị", "dị chất", "dị chủng", "dị dạng", "dị đoan", "dị kỳ", "dị nghị", "dị nhân", "dị thường", "dị vật", "dĩa", "dĩa bay", "dịch", "dịch giả", "dịch hạch", "dịch tả", "dịch tễ", "diệc", "diêm", "diêm đài", "diêm vương", "diễm lệ", "diễm phúc", "diễm tình", "diễn", "diễn dịch", "diễn đàn", "diễn đạt", "diễn giả", "diễn giải", "diễn tả", "diễn thuyết", "diễn văn", "diễn viên", "diện", "diện mạo", "diện tích", "diện tiền", "diệt", "diệt chủng", "diệt khuẩn", "diệt vong", "diều", "diều hâu", "diễu binh", "diệu", "diệu vợi", "dìm", "dinh", "dinh dưỡng", "dinh điền", "dính", "dính dáng", "dịp", "dìu", "dìu dắt", "dìu dặt", "dịu", "dịu dàng", "do", "do dự", "do thái", "do thám", "dò", "dò hỏi", "dò xét", "dọa", "dọa nạt", "doanh", "doanh lợi", "doanh nghiệp", "doanh trại", "dóc", "dọc", "dọc đường", "doi", "dõi", "dom", "dòm", "dòm chừng", "dòm ngó", "dòn", "dọn", "dọn đường", "dọn sạch", "dong dỏng", "dòng", "dòng họ", "dòng nước", "dõng dạc", "dỗ", "dỗ ngọt", "dốc", "dốc chí", "dồi", "dồi dào", "dối", "dối trá", "dội", "dồn", "dồn dập", "dông", "dông dài", "dộng", "dốt", "dốt đặc", "dột", "dơ", "dơ dáng", "dở", "dở hơi", "dở ra", "dỡ", "dớ dẩn", "dơi", "dời", "dợn", "dớp", "du", "du côn", "du dương", "du đãng", "du hành", "du khách", "du kích", "du lịch", "du mục", "du ngoạn", "du thuyền", "du xuân", "dù", "dụ", "dụ dỗ", "dua nịnh", "dục", "dục tình", "dục vọng", "dùi", "dùi cui", "dụi tắt", "dun rủi", "dung dị", "dung dịch", "dung hòa", "dung nhan", "dung thân", "dung thứ", "dung túng", "dùng", "dùng dằng", "dũng", "dũng cảm", "dũng mãnh", "dũng sĩ", "dụng", "dụng cụ", "dụng ý", "duỗi", "duy", "duy nhứt", "duy tân", "duy trì", "duy vật", "duyên", "duyên cớ", "duyên hải", "duyên kiếp", "duyệt", "duyệt binh", "duyệt y", "dư", "dư âm", "dư giả", "dư luận", "dữ", "dữ kiện", "dữ tợn", "dứ", "dự", "dự án", "dự định", "dự đoán", "dự thi", "dự toán", "dự trù", "dưa", "dưa hấu", "dưa leo", "dừa", "dứa", "dựa", "dựa trên", "dưng", "dừng", "dừng lại", "dửng dưng", "dửng mỡ", "dựng", "dựng đứng", "dược", "dược học", "dược liệu", "dược sĩ", "dưới", "dương", "dương bản", "dương cầm", "dương lịch", "dương liễu", "dương tính", "dương vật", "dường", "dường nào", "dưỡng", "dưỡng bịnh", "dưỡng đường", "dưỡng sinh", "dượng", "dượt", "dứt", "dứt khoát", "dứt tình", "đa", "đa âm", "đa bào", "đa cảm", "đa dâm", "đa diện", "đa dục", "đa giác", "đa hôn", "đa mang", "đa mưu", "đa nghi", "đa nguyên", "đa sầu", "đa số", "đa thần giáo", "đa thê", "đa thức", "đa tình", "đà", "đà điểu", "đả", "đả đảo", "đả kích", "đả thương", "đã", "đã đành", "đã lâu", "đá", "đá bóng", "đá hoa", "đá hoa cương", "đá lửa", "đá mài", "đá vàng", "đá vôi", "đạc", "đạc điền", "đai", "đài", "đài kỷ niệm", "đài thọ", "đãi", "đãi ngộ", "đái", "đái dầm", "đại", "đại chiến", "đại chúng", "đại cương", "đại diện", "đại hạn", "đại học", "đại lục", "đại ý", "đam mê", "đàm đạo", "đàm luận", "đàm phán", "đàm thoại", "đảm", "đảm bảo", "đảm đương", "đảm nhận", "đám", "đám cháy", "đám cưới", "đám ma", "đạm", "đạm bạc", "đan", "đàn", "đàn áp", "đàn bà", "đàn bầu", "đàn hồi", "đàn ông", "đản", "đạn", "đạn dược", "đạn đạo", "đang", "đảng", "đảng bộ", "đáng", "đáng kể", "đáng sợ", "đành lòng", "đánh", "đánh bại", "đánh bạn", "đánh bóng", "đánh đổi", "đánh đu", "đánh đuổi", "đánh giá", "đánh lừa", "đánh thuế", "đánh thức", "đánh vần", "đao", "đào", "đào binh", "đào hoa", "đào ngũ", "đào tạo", "đảo", "đảo chánh", "đảo điên", "đảo ngược", "đáo", "đáo lý", "đạo", "đạo đức", "đạo luật", "đạo nghĩa", "đáp", "đáp lễ", "đạp", "đạp đổ", "đạt", "đau", "đau buồn", "đau đớn", "đau khổ", "đau lòng", "đay", "đay nghiến", "đày", "đày đọa", "đáy", "đắc chí", "đắc thắng", "đắc tội", "đặc", "đặc biệt", "đặc phái viên", "đặc tính", "đắm", "đắm đuối", "đẵn", "đắn đo", "đăng", "đăng cai", "đăng ký", "đăng quang", "đăng ten", "đằng", "đẳng", "đẳng áp", "đẳng cấp", "đẳng thức", "đẳng trương", "đắng", "đắp", "đắp đập", "đắt", "đặt", "đặt tên", "đâm", "đâm liều", "đầm", "đầm ấm", "đầm lầy", "đẫm", "đấm", "đấm bóp", "đậm", "đậm đà", "đần", "đập", "đất", "đất bồi", "đất liền", "đâu", "đầu", "đầu bếp", "đầu cơ", "đầu đảng", "đầu đề", "đầu độc", "đầu phiếu", "đấu", "đấu bò", "đấu giá", "đấu khẩu", "đấu lý", "đấu tranh", "đấu trường", "đậu", "đậu cô ve", "đậu đũa", "đậu khấu", "đậu mùa", "đậu nành", "đậu phụ", "đây", "đầy", "đầy ắp", "đầy dẫy", "đầy đủ", "đẩy", "đẩy ngã", "đẫy", "đấy", "đậy", "đe", "đe dọa", "đè", "đè nén", "đẻ", "đem", "đem lại", "đem về", "đen", "đen tối", "đèn", "đèn điện", "đèn ống", "đèn pin", "đèn vách", "đèn xếp", "đèn xì", "đeo", "đeo đuổi", "đèo", "đèo bồng", "đẽo", "đẹp", "đẹp lòng", "đẹp mắt", "đét", "đê hèn", "đề", "đề cử", "đề nghị", "đề phòng", "để", "để dành", "để ý", "đế quốc", "đế vương", "đệ đơn", "đệ trình", "đệ tử", "đêm", "đêm nay", "đêm ngày", "đếm", "đệm", "đền", "đền tội", "đến", "đến tuổi", "đều", "đều nhau", "đểu", "đi", "đi bộ", "đi chơi", "đi dạo", "đi làm", "đi ngủ", "đi trốn", "đi vắng", "đì", "đĩ", "đìa", "địa", "địa cầu", "địa chỉ", "địa đạo", "địa điểm", "địa lý học", "địa ngục", "địa tầng", "địa vị", "đích", "đích danh", "đinh", "đinh ốc", "đình", "đình chiến", "đình công", "đỉnh", "đĩnh", "đính", "đính hôn", "định", "định bụng", "định cư", "định hướng", "định luật", "định lý", "định mạng", "định nghĩa", "định tính", "định vị", "đít", "địt", "đìu hiu", "đo", "đo ván", "đò", "đỏ", "đỏ tươi", "đó", "đọ", "đọa đày", "đoái tưởng", "đoan", "đoan chính", "đoàn", "đoàn kết", "đoàn thể", "đoàn tụ", "đoàn viên", "đoản kiếm", "đoán", "đoán trước", "đoạn", "đoạn trường", "đoạn tuyệt", "đoạt", "đoạt chức", "đọc", "đòi", "đòi tiền", "đói", "đọi", "đom đóm", "đòn", "đòn cân", "đòn dông", "đòn tay", "đón", "đón tiếp", "đong", "đóng", "đóng khung", "đóng thuế", "đọng", "đọt", "đô hộ", "đô thị", "đô vật", "đồ", "đồ ăn", "đồ bỏ", "đồ chơi", "đồ đạc", "đồ nghề", "đồ tể", "đổ", "đổ máu", "đỗ", "đỗ quyên", "đố", "độ", "độ thân", "đốc công", "độc", "độc giả", "độc hại", "độc lập", "độc nhất", "độc tài", "độc thân", "đôi", "đôi co", "đôi khi", "đồi", "đồi bại", "đổi", "đổi chác", "đổi thay", "đổi tiền", "đỗi", "đối", "đối diện", "đối lập", "đối ngoại", "đối nội", "đối phó", "đội", "đốm", "đồn", "đồn trú", "đốn", "độn", "độn thổ", "độn vai", "đông", "đông đảo", "đông đúc", "đông y", "đồng", "đồng âm", "đồng bộ", "đồng chí", "đồng lõa", "đồng nghĩa", "đồng tiền", "đồng tử", "đồng vị", "đồng ý", "đống", "động", "động cơ", "động đào", "động đất", "động tác", "động vật", "động viên", "đốt", "đột", "đột kích", "đột xuất", "đờ", "đờ đẫn", "đỡ", "đỡ đầu", "đợ", "đời", "đời đời", "đời nào", "đời sống", "đới", "đợi", "đờm", "đơn", "đơn sơ", "đơn vị", "đớn hèn", "đớp", "đợt", "đu", "đu đưa", "đủ", "đủ ăn", "đụ", "đua", "đua đòi", "đùa", "đùa cợt", "đùa nghịch", "đũa", "đúc", "đúc kết", "đục", "đui", "đùi", "đùm", "đun", "đụn", "đúng", "đúng giờ", "đụng", "đuốc", "đuôi", "đuổi", "đuổi kịp", "đuổi theo", "đúp", "đút", "đút lót", "đụt mưa", "đưa", "đưa đón", "đưa đường", "đưa tin", "đưa tình", "đứa bé", "đức tính", "đực", "đừng", "đứng", "đứng vững", "đứng yên", "đựng", "được", "được quyền", "đười ươi", "đương chức", "đương cục", "đương đầu", "đương nhiên", "đường", "đường bộ", "đường cấm", "đường đời", "đường trường", "đường về", "đứt", "đứt tay", "e", "e dè", "e lệ", "e ngại", "e rằng", "è cổ", "em", "em chồng", "em dâu", "em gái", "em họ", "ém", "ém nhẹm", "én", "eo", "eo biển", "eo đất", "eo éo", "eo hẹp", "eo lưng", "èo uột", "ẻo lả", "ẽo ẹt", "éo le", "ẹo", "ép", "ép buộc", "ép duyên", "ép liễu nài hoa", "ép lòng", "ép nài", "ép uổng", "ẹp", "ê", "ê a", "ê ẩm", "ê chề", "ê hề", "ê răng", "ề à", "ế", "ế chồng", "ếch", "ếch nhái", "êm", "êm ả", "êm ái", "êm ấm", "êm dịu", "êm đềm", "êm tai", "êm thấm", "ếm", "ềnh", "ễnh", "ễnh ương", "ga", "ga ra", "ga tô", "gà", "gà chọi", "gà đồng", "gà giò", "gà lôi", "gà mái", "gà mái ghẹ", "gà mờ", "gà rừng", "gà tây", "gà thiến", "gà trống", "gả", "gã", "gá", "gạ", "gạ gẫm", "gác", "gác bỏ", "gác chuông", "gác dan", "gác lửng", "gác xép", "gạc", "gạch", "gạch đít", "gạch nối", "gạch ống", "gai", "gai góc", "gai mắt", "gai ốc", "gài", "gài bẫy", "gài cửa", "gãi", "gái", "gái điếm", "gái giang hồ", "gái góa", "gái nhảy", "gái tơ", "gain", "gan", "gan bàn chân", "gan dạ", "gan góc", "gan lì", "gàn", "gán", "gạn cặn", "gạn hỏi", "gang", "ganh đua", "ganh ghét", "gánh", "gánh hát", "gào", "gào thét", "gáo", "gạo", "gạo nếp", "gạt", "gạt lệ", "gạt nợ", "gàu", "gàu ròng", "gay cấn", "gay gắt", "gay go", "gảy đàn", "gãy", "gãy đổ", "gáy", "gáy sách", "găm", "gặm", "gặm nhấm", "gắn", "gắn bó", "gắn liền", "găng", "gắng", "gắng sức", "gắp", "gặp", "gặp gỡ", "gặp may", "gặp mặt", "gặp nạn", "gặp nhau", "gắt", "gắt gỏng", "gặt", "gầm", "gầm ghè", "gầm thét", "gẫm", "gấm", "gân", "gân cốt", "gần", "gần đây", "gần gũi", "gần xa", "gấp", "gấp bội", "gấp đôi", "gấp khúc", "gập ghềnh", "gật", "gấu", "gấu chó", "gấu mèo", "gấu ngựa", "gây", "gây dựng", "gây nợ", "gây sự", "gây thù", "gầy", "gầy còm", "gầy đét", "gầy gò", "gầy guộc", "gầy yếu", "gậy", "ghe", "ghè", "ghẻ", "ghẻ lạnh", "ghé", "ghẹ", "ghen", "ghen ghét", "ghen tỵ", "ghẹo", "ghép", "ghét", "ghê", "ghê tởm", "ghế", "ghế bành", "ghế dài", "ghế đẩu", "ghế điện", "ghếch", "ghềnh", "ghi", "ghi âm", "ghi chép", "ghi nhập", "ghi nhớ", "ghì", "ghiền", "ghim", "ghìm", "gì", "gỉ", "gia", "gia cảnh", "gia công", "gia đình", "gia nhập", "gia phả", "gia sản", "gia súc", "gia tài", "gia tăng", "gia tốc", "gia truyền", "gia vị", "già", "già dặn", "già lam", "giả", "giả bộ", "giả danh", "giả dối", "giả định", "giả mạo", "giả sử", "giả thuyết", "giã", "giã độc", "giã từ", "giá", "giá buốt", "giá cả", "giá chợ đen", "giá thị trường", "giạ", "giác", "giác mạc", "giác ngộ", "giác quan", "giác thư", "giai âm", "giai cấp", "giai đoạn", "giai nhân", "giải", "giải cứu", "giải khát", "giải khuây", "giải nghĩa", "giải nhiệt", "giải pháp", "giải phẫu", "giải phóng", "giải quyết", "giải tán", "giải thể", "giải thích", "giải tỏa", "giải trí", "giãi bày", "giam", "giảm", "giảm nhẹ", "giảm sút", "giảm thuế", "giảm tội", "giám định", "giám đốc", "giám khảo", "giám mục", "giám ngục", "giám sát", "giám thị", "giạm", "gian", "gian dâm", "gian dối", "gian xảo", "giàn", "giản dị", "giản lược", "giản tiện", "giãn", "gián", "gián điệp", "gián tiếp", "giang", "giang hồ", "giang mai", "giang sơn", "giảng", "giảng đường", "giảng giải", "giảng sư", "giáng", "giáng sinh", "giành", "giao", "giao cấu", "giao chiến", "giao dịch", "giao hợp", "giao hưởng", "giao hữu", "giao phó", "giao thiệp", "giao thông", "giao thời", "giao thừa", "giảo", "giảo quyệt", "giáo", "giáo án", "giáo cụ", "giáo dân", "giáo dục", "giáo đầu", "giáo điều", "giáo đường", "giáo hoàng", "giáo khoa", "giáo phái", "giáo sĩ", "giáo sinh", "giáo sư", "giáo viên", "giáp", "giáp mặt", "giàu", "giày", "giày vò", "giãy", "giãy chết", "giặc", "giặc biển", "giặc cướp", "giặc giã", "giẵm", "giặm", "giằn", "giằn vặt", "giăng", "giăng lưới", "giằng", "giằng co", "giắt", "giặt", "giấc", "giấc mơ", "giấc ngủ", "giâm", "giầm", "giấm", "giậm", "giần", "giận", "giận dữ", "giập", "giật", "giật gân", "giật lùi", "giấu", "giậu", "giây", "giấy", "giấy bạc", "giấy biên lai", "giấy chứng chỉ", "giấy dầu", "giấy in", "giấy khai sanh", "giấy khai tử", "giấy má", "giấy phép", "giấy than", "giấy thông hành", "giấy vệ sinh", "giẻ", "gièm", "gieo", "gieo rắc", "giẹo", "giẹp", "giền", "giêng", "giếng", "giết", "giết hại", "giết thịt", "giễu", "giễu cợt", "gìn", "gìn giữ", "giò", "giỏ", "gió", "gió bảo", "gió lốc", "gió lùa", "gió mùa", "gió nồm", "gióc", "giòi", "giỏi", "giọi", "giòn", "giong", "giong ruổi", "giỏng", "giỏng tai", "gióng", "giọng", "giọng kim", "giọng lưỡi", "giọng nói", "giọng thổ", "giọt", "giọt máu", "giọt mưa", "giọt nước", "giọt sương", "giỗ", "giồi", "giội", "giống", "giống loài", "giống người", "giống nòi", "giơ", "giờ", "giờ đây", "giờ giấc", "giờ làm thêm", "giờ phút", "giờ rãnh", "giới", "giới hạn", "giới thiệu", "giới tính", "giới từ", "giờn", "giởn tóc gáy", "giỡn", "giũ", "giũa", "giục", "giùi", "giúi", "giụi mắt", "giun", "giun đất", "giun đũa", "giun kim", "giúp", "giúp ích", "giữ", "giữ chỗ", "giữ kín", "giữ lời", "giữ sức khỏe", "giữ trật tự", "giữa", "giữa trưa", "giương", "giương buồm", "giương mắt", "giường", "giựt", "giựt mình", "go", "gò", "gò bó", "gò má", "gõ", "góa", "góa bụa", "góc", "gỏi", "gói", "gọi", "gọi điện thoại", "gom", "gòn", "gọn gàng", "gọng", "góp", "góp mặt", "góp nhặt", "góp phần", "góp sức", "góp vốn", "gót", "gọt", "gồ", "gồ ghề", "gỗ", "gốc", "gối", "gội", "gôm", "gồm", "gôn", "gông", "gồng", "gộp vào", "gột", "gột rửa", "gờ", "gở", "gỡ", "gỡ rối", "gởi", "gởi gắm", "gợi", "gờm", "gớm", "gợn", "gợt", "gù", "gù lưng", "gục", "gùi", "guốc", "guồng", "gút", "gừ", "gửi", "gửi gắm", "gừng", "gươm", "gườm", "gượm", "gương", "gương mẫu", "gượng", "gượng dậy", "gượng nhẹ", "ha", "ha ha", "hà", "hà bá", "hà hiếp", "hà khắc", "hà mã", "hà tất", "hà tiện", "hả", "hả giận", "há", "há hốc", "hạ", "hạ bộ", "hạ cánh", "hạ cấp", "hạ chí", "hạ cố", "hạ du", "hạ giá", "hạ giọng", "hạ lệnh", "hạ lịnh", "hạ mình", "hạ thủy", "hạc", "hách", "hạch", "hạch nhân", "hạch sách", "hai", "hai lòng", "hai vợ chồng", "hài", "hài cốt", "hài hòa", "hài hước", "hài kịch", "hài lòng", "hải", "hải âu", "hải cảng", "hải cẩu", "hải đảo", "hải đăng", "hải hà", "hải lưu", "hải lý", "hải mả", "hải ngoại", "hải phận", "hải quan", "hải quân", "hải tặc", "hải vị", "hải yến", "hãi", "hái", "hại", "ham", "ham mê", "ham muốn", "hàm", "hàm hồ", "hàm số", "hàm súc", "hãm", "hãm hại", "hám", "hạm", "hạm đội", "han", "hàn", "hàn gắn", "hàn sĩ", "hàn the", "hàn thử biểu", "hàn vi", "hãn", "hãn hữu", "hán học", "hạn", "hạn chế", "hạn hán", "hạn hẹp", "hang", "hàng", "hàng đầu", "hàng giậu", "hàng hải", "hàng hóa", "hàng không", "hàng lậu", "hàng loạt", "hàng ngày", "hàng ngũ", "hàng rào", "hàng tháng", "hàng tuần", "hàng xóm", "hãng", "háng", "hạng", "hạng người", "hanh", "hanh thông", "hành", "hành chánh", "hành động", "hành hạ", "hành hình", "hành khách", "hành khất", "hành lạc", "hành lang", "hành lý", "hành pháp", "hành quân", "hành tây", "hành trình", "hành tung", "hành văn", "hành vi", "hãnh diện", "hãnh tiến", "hạnh", "hạnh kiểm", "hạnh ngộ", "hạnh phúc", "hao", "hao hụt", "hao mòn", "hao tổn", "hào", "hào hiệp", "hào hoa", "hào hùng", "hào hứng", "hào khí", "hào kiệt", "hào nhoáng", "hào phóng", "hào quang", "hảo", "hảo hán", "hảo tâm", "hão", "háo", "háo hức", "hạo nhiên", "hạp", "hát", "hát xiệc", "hạt", "hạt lệ", "hạt tiêu", "hàu", "hay", "hay lây", "hãy", "hãy còn", "háy", "hắc", "hắc ín", "hặc", "hăm", "hăm hở", "hằm hằm", "hằn", "hằn học", "hẳn", "hắn", "hăng", "hăng hái", "hằng", "hằng hà sa số", "hằng số", "hắt", "hắt hiu", "hắt hơi", "hắt hủi", "hâm", "hâm hấp", "hâm mộ", "hầm", "hầm mỏ", "hầm mộ", "hầm trú ẩn", "hẩm", "hẩm hiu", "hân hạnh", "hân hoan", "hận", "hấp", "hấp dẫn", "hấp hối", "hấp hơi", "hấp tấp", "hấp thụ", "hất", "hất hủi", "hầu", "hầu bao", "hầu cận", "hầu chuyện", "hầu hạ", "hầu hết", "hẩu", "hậu", "hậu môn", "hậu phương", "hậu quả", "hậu sản", "hậu thế", "hậu thuẫn", "hậu tố", "hậu trường", "hậu vận", "hẩy", "he", "hè", "hé môi", "hé mở", "hé nắng", "hé răng", "hẹ", "hèm", "hẻm", "hen", "hèn", "hèn hạ", "hèn mạt", "hèn mọn", "hèn nhát", "hèn yếu", "hẹn", "hẹn hò", "heo", "heo hút", "heo nái", "heo quay", "hèo", "hẻo lánh", "héo", "héo hắt", "hẹp", "hẹp lượng", "hét", "hề", "hể hả", "hễ", "hệ", "hệ quả", "hệ thống", "hệ trọng", "hếch", "hếch hoác", "hếch mồm", "hên", "hến", "hết", "hết hồn", "hết hơi", "hết lòng", "hết sức", "hếu", "hỉ nọ", "hỉ nự", "hí", "hí hoáy", "hí trường", "hia", "hích", "hịch", "hiềm nghi", "hiềm oán", "hiểm", "hiểm ác", "hiểm độc", "hiểm họa", "hiểm nghèo", "hiếm", "hiên", "hiên ngang", "hiền", "hiền hòa", "hiền sĩ", "hiền triết", "hiền từ", "hiển hách", "hiển nhiên", "hiến", "hiến chương", "hiến pháp", "hiện", "hiện diện", "hiện đại", "hiện hành", "hiện hình", "hiện nay", "hiện tại", "hiện thân", "hiện thực", "hiện tình", "hiện trạng", "hiện tượng", "hiện vật", "hiếng", "hiếp", "hiếp dâm", "hiệp", "hiệp định", "hiệp đồng", "hiệp hội", "hiệp thương", "hiệp ước", "hiểu", "hiểu biết", "hiểu lầm", "hiếu", "hiếu chiến", "hiếu đễ", "hiếu kỳ", "hiếu thảo", "hiệu", "hiệu chính", "hiệu đính", "hiệu lệnh", "hiệu lực", "hiệu nghiệm", "hiệu quả", "hiệu số", "hiệu suất", "hiệu trưởng", "hình dáng", "hình dạng", "hình dung", "hình học", "hình như", "hình thể", "hỉnh", "híp", "hít", "hiu quạnh", "ho", "ho gà", "ho hen", "ho lao", "hò", "hò la", "hò reo", "họ", "họ hàng", "hoa", "hoa hậu", "hoa hiên", "hoa hoét", "hoa hồng", "hoa kỳ", "hoa lệ", "hoa liễu", "hoa lợi", "hoa mỹ", "hoa quả", "hoa tiêu", "hòa", "hòa bình", "hòa giải", "hòa hợp", "hòa khí", "hòa nhã", "hòa nhạc", "hòa nhịp", "hòa tan", "hòa thuận", "hỏa", "hỏa châu", "hỏa diệm sơn", "hỏa hoạn", "hỏa lực", "hỏa pháo", "hỏa táng", "hỏa tiễn", "hỏa xa", "hóa", "hóa chất", "hóa đơn", "hóa giá", "hóa học", "hóa thạch", "hóa trang", "họa", "họa báo", "họa đồ", "họa mi", "họa sĩ", "hoạch định", "hoài", "hoài cổ", "hoài nghi", "hoài niệm", "hoài vọng", "hoại", "hoại thư", "hoan hỉ", "hoan hô", "hoan lạc", "hoàn", "hoàn cảnh", "hoàn cầu", "hoàn mỹ", "hoàn tất", "hoàn thành", "hoàn thiện", "hoàn toàn", "hoàn vũ", "hoãn", "hoán chuyển", "hoán dụ", "hoán vị", "hoạn", "hoạn nạn", "hoang", "hoang dại", "hoang dâm", "hoang đường", "hoang mang", "hoang phế", "hoang phí", "hoang tàn", "hoang vu", "hoàng", "hoàng cung", "hoàng gia", "hoàng hôn", "hoàng oanh", "hoàng thân", "hoàng thượng", "hoàng tộc", "hoàng tử", "hoảng", "hoảng hốt", "hoảng sợ", "hoành hành", "hoành tráng", "hoạnh tài", "hoạt bát", "hoạt động", "hoạt họa", "hoắc", "hoặc", "hoắt", "hóc", "hóc búa", "học", "học bổng", "học đường", "học giả", "học lực", "học phí", "học thuyết", "học thức", "học trò", "học viên", "học viện", "học xá", "hòe", "hoi hóp", "hỏi", "hỏi cung", "hỏi dò", "hỏi han", "hỏi tiền", "hói", "hòm", "hòn", "hòn bi", "hòn dái", "hong", "hỏng", "hóng mát", "họng", "hóp", "họp", "hót", "hô", "hô hấp", "hồ", "hồ đồ", "hồ nghi", "hồ sơ", "hồ tắm", "hổ", "hổ phách", "hổ thẹn", "hỗ trợ", "hố", "hộ", "hộ chiếu", "hộ khẩu", "hộ lý", "hộ thân", "hộ tịch", "hộ tống", "hộ vệ", "hốc", "hốc hác", "hộc", "hôi", "hôi hám", "hôi thối", "hồi", "hồi âm", "hồi giáo", "hồi hộp", "hồi kí", "hồi sinh", "hồi tỉnh", "hồi tưởng", "hối", "hối đoái", "hối hận", "hối lộ", "hội", "hội chẩn", "hội chợ", "hội chứng", "hội đồng", "hội nghị", "hội ngộ", "hội viên", "hôm", "hôm nay", "hôn", "hôn mê", "hồn", "hồn nhiên", "hỗn độn", "hỗn láo", "hông", "hồng", "hồng hào", "hồng nhan", "hồng phúc", "hồng tâm", "hồng thập tự", "hộp", "hộp thư", "hốt hoảng", "hột", "hơ", "hờ", "hở", "hớ", "hơi", "hơi thở", "hời", "hơn", "hơn thiệt", "hờn dỗi", "hờn giận", "hớn hở", "hớp", "hợp", "hợp âm", "hợp chất", "hợp đồng", "hợp kim", "hợp lí", "hợp lực", "hợp lưu", "hợp pháp", "hợp tác xã", "hợp thức hóa", "hớt", "hủ tục", "hũ", "hú", "hú hí", "hụ", "hùa", "huân chương", "huấn luyện", "húc", "huệ", "hủi", "hun", "hun đúc", "hùn", "hung", "hung ác", "hung dữ", "hung phạm", "hung thần", "hung tin", "hung tợn", "hùng biện", "hùng cường", "hùng tráng", "hùng vĩ", "húp", "hụp", "hút", "hụt", "huy chương", "huy động", "huy hiệu", "huy hoàng", "hủy", "hủy bỏ", "hủy diệt", "hủy hoại", "huyên náo", "huyền", "huyền bí", "huyền diệu", "huyễn", "huyễn hoặc", "huyện", "huyết", "huyết áp", "huyết bạch", "huyết cầu", "huyết dụ", "huyết quản", "huyệt", "huynh", "huynh đệ", "huỳnh quang", "huýt", "hư", "hư danh", "hư hại", "hư không", "hư thân", "hư vô", "hứa", "hứa hẹn", "hứa hôn", "hưng phấn", "hưng thịnh", "hứng", "hứng thú", "hứng tình", "hương", "hương liệu", "hương lửa", "hương nhu", "hương thơm", "hương vị", "hưởng", "hưởng ứng", "hướng", "hướng dẫn", "hướng thiện", "hươu", "hưu chiến", "hưu trí", "hữu", "hữu cơ", "hữu dụng", "hữu hạn", "hữu ích", "hữu tình", "hữu ý", "hy hữu", "hy sinh", "hy vọng", "hý họa", "i tờ", "ì", "ì ạch", "ị", "ỉa", "ích", "ích kỷ", "ích lợi", "im", "im lặng", "im lìm", "im phăng phắc", "ỉm", "in", "in máy", "inh ỏi", "inh tai", "ình", "ít", "ít có", "ít hơn", "ít khi", "ít lâu nay", "ít nhiều", "ít nhứt", "ít nói", "ít nữa", "ít ỏi", "ỉu", "ka ki", "ka li", "ke", "kẻ", "kẻ cắp", "kẻ cướp", "kẻ trộm", "kẽ", "kẽ hở", "ké", "kem", "kèm", "kẽm", "kẽm gai", "kém", "kèn", "kén", "kẻng", "keo", "keo kiệt", "kèo", "kéo", "kéo bè", "kéo co", "kéo cưa", "kéo dài", "kéo lê", "kéo lưới", "kẹo", "kép", "kép hát", "kẹp", "kẹp tóc", "két", "kẹt", "kê", "kê khai", "kề", "kể", "kế", "kế hoạch", "kế thừa", "kế tiếp", "kế toán", "kế tục", "kế vị", "kệ", "kềm", "kên kên", "kênh", "kềnh", "kết án", "kết duyên", "kết giao", "kết hôn", "kết hợp", "kết luận", "kết nạp", "kết quả", "kết thúc", "kêu", "kêu gọi", "kêu la", "kêu nài", "kêu oan", "kêu vang", "kha khá", "khả ái", "khả năng", "khả nghi", "khả ố", "khả quan", "khả thi", "khá", "khá giả", "khá tốt", "khác", "khác gì", "khác thường", "khác xa", "khạc", "khách", "khách hàng", "khách khứa", "khách quan", "khách sạn", "khách sáo", "khai", "khai báo", "khai bút", "khai hỏa", "khai hóa", "khai sanh", "khai thác", "khai trừ", "khai trương", "khai tử", "khải hoàn", "khải hoàn ca", "khái niệm", "khái quát", "kham", "kham khổ", "khảm", "khám", "khám nghiệm", "khám phá", "khám xét", "khan", "khan hiếm", "khán", "khán đài", "khán giả", "khang trang", "khảng khái", "kháng", "kháng án", "kháng chiến", "kháng sinh", "khánh", "khánh chúc", "khánh kiệt", "khánh thành", "khánh tiết", "khao", "khao khát", "khảo", "khảo cổ", "khảo cứu", "khảo hạch", "khảo sát", "khạp", "khát", "khát máu", "khát vọng", "kháu", "khay", "khắc", "khắc khoải", "khắc khổ", "khẳm", "khắm", "khăn", "khằn", "khăng", "khăng khít", "khẳng định", "khắp", "khắt khe", "khấc", "khâm liệm", "khâm phục", "khẩn cấp", "khẩn trương", "khấn", "khất", "khất nợ", "khâu", "khẩu", "khẩu cái", "khẩu cung", "khẩu độ", "khẩu hiệu", "khẩu phần", "khẩu trang", "khẩu vị", "khấu", "khấu đầu", "khấu hao", "khấu trừ", "khe", "khe khắt", "khẽ", "khen", "khen ngợi", "khéo", "khép", "khét", "khê", "khế", "khệnh khạng", "khêu", "khêu gợi", "khều", "khi", "khi trước", "khỉ", "khí", "khí cầu", "khí chất", "khí cốt", "khí cụ", "khí động học", "khí giới", "khí hậu", "khí hậu học", "khí lực", "khí phách", "khí quản", "khí quyển", "khí tượng", "khía", "khích động", "khích lệ", "khiêm nhường", "khiếm diện", "khiếm nhã", "khiển trách", "khiến", "khiêng", "khiếp", "khiếp nhược", "khiếp sợ", "khiêu dâm", "khiêu khích", "khiêu vũ", "khiếu", "khiếu nại", "khiếu tố", "khinh", "khinh bạc", "khinh bỉ", "khinh khí", "khinh khí cầu", "khinh thường", "khít", "kho", "kho tàng", "khó", "khó chịu", "khó coi", "khó khăn", "khó lòng", "khó nghĩ", "khó nhọc", "khoa", "khoa học", "khoa trương", "khỏa thân", "khóa", "khóa học", "khóa luận", "khóa tay", "khoác", "khoai", "khoai nước", "khoai sọ", "khoai tây", "khoái", "khoái cảm", "khoái lạc", "khoan", "khoan dung", "khoan hồng", "khoan thai", "khoan thứ", "khoản", "khoản đãi", "khoang", "khoảng", "khoảng khoát", "khoáng chất", "khoáng đạt", "khoáng hóa", "khoáng sản", "khoáng vật học", "khoanh", "khoảnh khắc", "khóc", "khoe", "khỏe mạnh", "khóe", "khoét", "khỏi", "khói", "khom", "khóm", "khô", "khô héo", "khô mực", "khổ", "khổ dịch", "khổ hạnh", "khổ hình", "khổ não", "khổ sai", "khổ sở", "khổ tâm", "khố", "khốc liệt", "khôi hài", "khôi ngô", "khôi phục", "khối", "khối lượng", "khối óc", "khôn", "khôn khéo", "khôn ngoan", "khốn khổ", "khốn nỗi", "không", "không bao giờ", "không chiến", "không chừng", "không dám", "không gian", "không hề", "không kể", "không khí", "không lực", "không nhận", "không phận", "không quân", "không sao", "không thể", "khổng giáo", "khổng lồ", "khống chế", "khờ", "khơi", "khởi công", "khởi hành", "khởi xướng", "khớp", "khu giải phóng", "khu trừ", "khua", "khuân", "khuất phục", "khuây khỏa", "khuấy", "khúc", "khúc chiết", "khúc khích", "khúc khuỷu", "khúc xạ", "khuê các", "khuếch đại", "khuếch khoác", "khuếch tán", "khuếch trương", "khui", "khúm núm", "khung", "khùng", "khủng bố", "khủng hoảng", "khủng khiếp", "khuôn", "khuôn khổ", "khuôn mặt", "khuôn mẫu", "khuôn sáo", "khuy", "khuy bấm", "khủy", "khuya", "khuyên", "khuyên bảo", "khuyên can", "khuyên giải", "khuyển", "khuyến cáo", "khuyến khích", "khuyết", "khuyết điểm", "khuynh", "khuynh đảo", "khuynh hướng", "khử trùng", "khứ hồi", "khứa", "khước từ", "khứu", "kì", "kì kèo", "kí lô", "kị sĩ", "kia", "kích", "kích động", "kích thích", "kích thích tố", "kích thước", "kịch", "kịch bản", "kịch câm", "kịch liệt", "kiêm", "kiềm", "kiềm chế", "kiềm tỏa", "kiểm", "kiểm duyệt", "kiểm soát", "kiếm", "kiếm hiệp", "kiên cố", "kiên định", "kiên gan", "kiên nhẫn", "kiên quyết", "kiên trinh", "kiến", "kiến hiệu", "kiến nghị", "kiến thiết", "kiến thức", "kiến trúc", "kiện", "kiện tướng", "kiêng", "kiêng nể", "kiếp", "kiếp trước", "kiết", "kiệt quệ", "kiệt sức", "kiêu", "kiêu căng", "kiều dân", "kiều diễm", "kiểu", "kiểu mẫu", "kiệu", "kim", "kim anh", "kim bằng", "kim khí", "kim loại", "kim ngân", "kim ô", "kim tự tháp", "kín", "kín hơi", "kinh", "kinh dị", "kinh doanh", "kinh điển", "kinh đô", "kinh hoàng", "kinh ngạc", "kinh nghiệm", "kinh nguyệt", "kinh tế", "kinh tế học", "kinh thánh", "kinh tuyến", "kình", "kính", "kính chúc", "kính hiển vi", "kính phục", "kính yêu", "kíp", "kíp nổ", "kịp", "kỳ", "kỳ ảo", "kỳ công", "kỳ cục", "kỳ cựu", "kỳ dị", "kỳ diệu", "kỳ đà", "kỳ giông", "kỳ ngộ", "kỳ quan", "kỳ thi", "kỳ thị", "kỷ cương", "kỷ luật", "kỷ lục", "kỷ nguyên", "kỷ niệm", "kỹ", "kỹ nghệ", "kỹ nữ", "kỹ sư", "kỹ thuật", "kỹ viện", "ký", "ký giả", "ký hiệu", "ký họa", "ký kết", "ký ninh", "ký sinh", "ký sự", "ký thác", "ký túc xá", "ký ức", "kỵ", "la", "la bàn", "la cà", "la đà", "la đơn", "la hét", "la liệt", "la mắng", "la ó", "la tinh", "là", "là là", "lả", "lả lơi", "lả tả", "lá", "lá bài", "lá cải", "lá chắn", "lá cờ", "lá lách", "lá mía", "lá sách", "lá thăm", "lạ", "lạ đời", "lạ kỳ", "lạ lùng", "lạ mặt", "lạ thường", "lác", "lác đác", "lạc", "lạc đà", "lạc đề", "lạc điệu", "lạc hậu", "lạc loài", "lạc lõng", "lạc quan", "lạc thú", "lách", "lách cách", "lách tách", "lạch", "lạch bạch", "lạch cạch", "lạch đạch", "lai", "lai giống", "lai lịch", "lai rai", "lai vãng", "lài", "lải", "lải nhải", "lãi", "lái", "lái buôn", "lái đò", "lái xe", "lại", "lại cái", "lại sức", "lam", "lam chướng", "lam lũ", "lam nham", "làm", "làm ăn", "làm bạn", "làm bậy", "làm biếng", "làm cho", "làm chủ", "làm chứng", "làm cỏ", "làm công", "làm dáng", "làm dấu", "làm dịu", "làm dữ", "làm đĩ", "làm giả", "làm giàu", "làm hỏng", "làm khoán", "làm lại", "làm lành", "làm loạn", "làm mẫu", "làm nhục", "làm phiền", "làm quen", "làm tiền", "làm xong", "lạm dụng", "lạm phát", "lan", "lan can", "lan tràn", "làn", "làn sóng", "lang", "lang bạt", "lang băm", "lang ben", "lang thang", "làng", "lảng", "lảng tránh", "lảng vảng", "lãng mạn", "lãng phí", "lãng quên", "lãng tử", "láng", "láng giềng", "lạng", "lanh lẹ", "lành", "lành lặn", "lãnh", "lãnh chúa", "lãnh đạm", "lãnh đạo", "lãnh địa", "lãnh hải", "lãnh hội", "lãnh sự", "lãnh thổ", "lánh", "lánh mặt", "lánh nạn", "lánh xa", "lạnh", "lạnh lẽo", "lạnh lùng", "lạnh người", "lạnh nhạt", "lao", "lao công", "lao đao", "lao động", "lao khổ", "lao phiền", "lao tâm", "lao tù", "lao xao", "lảo đảo", "lão", "lão bà", "lão bộc", "lão giáo", "lão luyện", "lão suy", "láo", "láo nháo", "lạp xưởng", "lát", "lát nữa", "lạt", "lau", "lau chùi", "làu", "làu bàu", "láu cá", "láu lỉnh", "lay", "lay chuyển", "lay động", "lay ơn", "lảy cò", "láy", "lạy", "lắc", "lắc lư", "lăm le", "lắm", "lắm tiền", "lăn", "lăn lộn", "lăn tay", "lằn", "lặn", "lăng", "lăng kính", "lăng loàn", "lăng mạ", "lăng nhục", "lăng quăng", "lăng tẩm", "lăng trụ", "lăng xăng", "lằng nhằng", "lẳng lơ", "lẵng", "lắng", "lắng tai", "lặng", "lặng lẽ", "lặng ngắt", "lắp", "lắt nhắt", "lặt vặt", "lâm", "lâm bệnh", "lâm chung", "lâm nạn", "lâm thời", "lầm", "lầm bầm", "lầm lạc", "lầm lẫn", "lầm lỗi", "lầm lỳ", "lầm than", "lẩm bẩm", "lẩm cẩm", "lẫm liệt", "lấm chấm", "lấm lét", "lấm tấm", "lân", "lân cận", "lân quang", "lân tinh", "lần", "lần hồi", "lần lượt", "lẩn", "lẩn quẩn", "lẩn quất", "lẩn tránh", "lẩn vào", "lẫn", "lẫn lộn", "lấn", "lận đận", "lâng lâng", "lấp", "lấp lánh", "lấp liếm", "lấp ló", "lập", "lập chí", "lập công", "lập dị", "lập kỷ lục", "lập mưu", "lập nghiệp", "lập pháp", "lập trường", "lập tức", "lật", "lật đật", "lật đổ", "lật nhào", "lật tẩy", "lâu", "lâu đài", "lâu đời", "lâu la", "lầu", "lầu xanh", "lậu", "lây", "lây lất", "lầy", "lầy lội", "lầy nhầy", "lẫy lừng", "lấy", "lấy cớ", "lấy cung", "lấy lệ", "lấy lòng", "lấy xuống", "le", "le le", "le lói", "lè nhè", "lẻ", "lẻ loi", "lẻ tẻ", "lẽ", "lẽ phải", "lẽ ra", "lẽ sống", "lẽ thường tình", "lé", "lẹ", "lem", "lém", "len", "lèn", "lén", "lén lút", "leng keng", "leo", "leo lẻo", "leo lét", "leo trèo", "lèo tèo", "lẻo", "lẽo", "lẽo đẽo", "lẹo", "lép", "lép xẹp", "lẹt đẹt", "lê", "lê thê", "lề", "lề đường", "lề lối", "lề mề", "lề thói", "lể", "lễ", "lễ bái", "lễ độ", "lễ giáo", "lễ nghi", "lễ nghĩa", "lễ phép", "lễ phục", "lễ vật", "lệ", "lệ luật", "lệ phí", "lệ thuộc", "lên", "lên án", "lên đường", "lên giá", "lên lớp", "lên mặt", "lên men", "lênh đênh", "lênh láng", "lềnh bềnh", "lệnh", "lều", "lếu láo", "lì", "lí lắc", "lị", "lìa", "lịch", "lịch lãm", "lịch sử", "lịch sự", "liếc", "liêm khiết", "liêm sỉ", "liếm", "liệm", "liên bang", "liên bộ", "liên can", "liên doanh", "liên đoàn", "liên hệ", "liên hiệp", "liên hiệp quốc", "liên hợp", "liên khu", "liên lạc", "liên quan", "liên tiếp", "liên tỉnh", "liên tưởng", "liền", "liền bên", "liền tay", "liễn", "liến thoắng", "liểng xiểng", "liệng", "liếp", "liệt", "liệt dương", "liệt giường", "liệt kê", "liệt sĩ", "liều", "liều lĩnh", "liều lượng", "liễu", "liệu", "liệu pháp", "lim", "lim dim", "lịm", "linh", "linh cảm", "linh đình", "linh hồn", "linh thiêng", "linh tinh", "linh tính", "lình", "lính", "lính quýnh", "lịnh", "líp", "lít", "lịu", "lo", "lo buồn", "lo liệu", "lo sợ", "lò", "lò hỏa táng", "lò kò", "lò xo", "ló", "lọ", "lọ lem", "loa", "lòa", "lõa lồ", "lõa xõa", "lóa", "loạc choạc", "loài", "loại", "loại bỏ", "loại trừ", "loan báo", "loán", "loạn", "loạn dâm", "loạn lạc", "loạn luân", "loạn thị", "loạn trí", "loang", "loãng", "loáng thoáng", "loanh quanh", "loạt", "lóc", "lọc", "lọc lõi", "lọc lừa", "loe", "loe loét", "loe toe", "lòe", "lòe loẹt", "lóe", "loét", "loi choi", "loi ngoi", "loi nhoi", "lòi", "lòi tói", "lõi đời", "lòm", "lõm", "lon", "lọn", "long", "long lanh", "long não", "long trọng", "lòng", "lòng dân", "lòng heo", "lòng lang dạ thú", "lòng nhân", "lòng sông", "lòng tốt", "lỏng", "lóng", "lóng ngóng", "lọng", "lót", "lót ổ", "lọt", "lọt lòng", "lô", "lô cốt", "lỗ", "lỗ đít", "lỗ mãng", "lỗ rún", "lỗ tai", "lố", "lố lăng", "lộ", "lộ diện", "lộ trình", "lộc", "lôi", "lôi cuốn", "lôi thôi", "lồi", "lỗi", "lỗi thời", "lối", "lội", "lốm đốm", "lồn", "lộn", "lộn xộn", "lông", "lông mày", "lông mi", "lồng", "lồng lộng", "lộng lẫy", "lộng quyền", "lốp", "lột", "lột mặt nạ", "lơ", "lơ mơ", "lờ", "lờ đờ", "lỡ", "lời", "lời hứa", "lời khuyên", "lời thề", "lời tựa", "lợi", "lợi dụng", "lợi tức", "lởm chởm", "lợm giọng", "lờn", "lớn", "lợn", "lớp", "lớp lang", "lợp", "lợt", "lu", "lũ", "lú", "lùa", "lúa", "lúa mì", "lúa thóc", "lụa", "luân chuyển", "luân lạc", "luân lý", "luẩn quẩn", "luận án", "luận đề", "luận điệu", "luận văn", "luật", "luật gia", "luật học", "luật khoa", "luật lao động", "luật sư", "lúc", "lúc lắc", "lục", "lục địa", "lục đục", "lục vấn", "lui", "lủi", "lủi thủi", "lùn", "lún", "lụn bại", "lung lạc", "lung lay", "lủng", "lủng củng", "lũng đoạn", "lúng túng", "luộc", "luôn", "luồn", "luồn cúi", "luồng", "luồng điện", "luồng tư tưởng", "luống cuống", "lụp xụp", "lụt", "lũy", "lũy tiến", "luyến ái", "luyện", "luyện thi", "lữ điếm", "lữ khách", "lừa", "lừa đảo", "lửa", "lứa", "lựa", "lực", "lực lưỡng", "lực lượng", "lực sĩ", "lưng", "lừng lẫy", "lửng lơ", "lược", "lược đồ", "lược khảo", "lược thuật", "lười biếng", "lưỡi", "lưỡi gươm", "lưỡi khoan", "lưỡi lê", "lưới", "lưới nhện", "lưới tình", "lườm", "lượm", "lươn", "lươn lẹo", "lượn", "lương", "lương khô", "lương tâm", "lương thiện", "lương thực", "lưỡng lự", "lưỡng quyền", "lượng", "lượng thứ", "lướt", "lượt", "lưu", "lưu danh", "lưu đày", "lưu động", "lưu hành", "lưu lạc", "lưu luyến", "lưu manh", "lưu tâm", "lưu thông", "lưu vong", "lưu vực", "lựu", "lựu đạn", "ly", "ly biệt", "ly bôi", "ly dị", "ly hương", "ly tán", "ly tâm", "lý", "lý do", "lý giải", "lý hóa", "lý lịch", "lý luận", "lý thuyết", "lý trí", "lý tưởng", "ma", "ma cà bông", "ma cà rồng", "ma cô", "ma dút", "ma két", "ma lem", "ma lực", "ma men", "ma quỷ", "ma túy", "mà", "mà cả", "mả", "mã", "mã hóa", "mã lực", "mã não", "mã phu", "mã tấu", "mã thượng", "má", "má đào", "mạ", "mạ bạc", "mạ điện", "mạ vàng", "mác", "mạc", "mách", "mạch", "mạch lạc", "mạch máu", "mạch nha", "mai", "mai hoa", "mai mái", "mai mối", "mai phục", "mai sau", "mai táng", "mài", "mài miệt", "mải", "mãi dâm", "mãi mãi", "mái", "mái chèo", "mái hiên", "mái tóc", "man", "man di", "man mác", "man rợ", "man trá", "màn", "màn ảnh", "màn bạc", "mãn", "mãn nguyện", "mạn", "mang", "mang máng", "mang tiếng", "màng", "màng nhĩ", "màng trinh", "mảng", "mãng cầu", "mãng xà", "máng", "mạng", "mạng bạc", "mạng lưới", "mạng mỡ", "mạng nhện", "manh", "manh mối", "manh nha", "manh tâm", "mành", "mảnh mai", "mãnh liệt", "mãnh thú", "mánh lới", "mạnh", "mạnh dạn", "mạnh khỏe", "mao quản", "mào", "mạo hiểm", "mạo nhận", "mát", "mạt", "mạt cưa", "mạt sát", "mạt vận", "mau", "mau chóng", "mau mắn", "màu", "màu mè", "màu mỡ", "màu sắc", "máu", "máu tham", "may", "may mà", "may mắn", "may sẵn", "mày", "máy", "máy chữ", "máy giặt", "máy in", "máy tính", "mắc", "mắc cỡ", "mắc lừa", "mắc nợ", "mặc", "mặc cảm", "mặc dầu", "mặc dù", "mặc niệm", "mặc sức", "mắm", "mặn", "mặn nồng", "măng", "măng cụt", "măng đô", "măng tây", "mắng", "mắt", "mắt cá", "mắt lưới", "mặt", "mặt hàng", "mặt nạ", "mặt phẳng", "mặt tiền", "mặt trăng", "mặt trận", "mâm", "mầm", "mầm non", "mân mê", "mẫn cán", "mận", "mấp máy", "mấp mé", "mấp mô", "mập", "mập mạp", "mập mờ", "mất", "mất cắp", "mất dạy", "mất mùa", "mất ngủ", "mất tích", "mất trí", "mật", "mật độ", "mật khu", "mật lệnh", "mật mã", "mật mía", "mật ong", "mật vụ", "mâu thuẫn", "mẫu", "mẫu đơn", "mẫu giáo", "mẫu hệ", "mẫu mã", "mẫu số", "mấu", "mậu dịch", "mây", "me", "mè", "mẻ", "mé", "mẹ", "men", "men sứ", "men tình", "meo", "mèo", "méo", "mẹo", "mép", "mét", "mê", "mê lộ", "mê ly", "mê man", "mê mê", "mê muội", "mê sảng", "mê tín", "mềm", "mềm mỏng", "mền", "mến", "mến phục", "mênh mông", "mệt", "mệt mỏi", "mếu", "mì", "mí mắt", "mị dân", "mỉa mai", "mía", "miên man", "miền", "miễn", "miễn cưỡng", "miễn dịch", "miễn phí", "miễn thuế", "miễn thứ", "miễn trừ", "miếng", "miệng", "miệng lưỡi", "miệt mài", "miêu tả", "miếu", "mỉm cười", "mím", "mìn", "minh bạch", "minh châu", "minh họa", "minh mẫn", "mình", "mistake", "mít", "mò", "mỏ", "mỏ neo", "mỏ vàng", "mỏ vịt", "mõ", "móc", "móc sắt", "mọc", "mọc răng", "moi", "mọi", "mõm", "mòn", "món", "mong", "mong manh", "mỏng", "mỏng tanh", "móng tay", "móng vuốt", "mót", "mọt", "mô", "mô hình", "mô phạm", "mô phỏng", "mô tả", "mô tô", "mô tơ", "mồ", "mồ côi", "mồ hôi", "mổ", "mổ xẻ", "mộ bia", "mộ chí", "mộ địa", "mộ phần", "mộc mạc", "môi", "môi giới", "mồi", "mỗi", "mối", "mối tình", "môn", "môn bài", "môn đệ", "môn học", "môn phái", "mông", "mông quạnh", "mộng", "mộng du", "mộng mị", "mốt", "một", "một chút", "một vài", "mơ", "mơ hồ", "mơ mộng", "mơ tưởng", "mơ ước", "mờ", "mở", "mở đầu", "mở màn", "mở mang", "mở mắt", "mở miệng", "mỡ", "mớ", "mời", "mới", "mơn trớn", "mu", "mù", "mù mịt", "mủ", "mũ", "mua", "mua bán", "mua chuộc", "mua sắm", "mua vui", "mùa", "mùa màng", "múa", "múa võ", "mục đích", "mục đồng", "mục kích", "mục kỉnh", "mục lục", "mục tiêu", "mui", "mùi", "mùi soa", "mùi vị", "mũi", "mũi tên", "muỗi", "muối", "muốn", "muộn", "mưa", "mửa", "mực", "mừng", "mướn", "mượn", "mưu", "mưu sinh", "mỹ lệ", "mỹ nữ", "mỹ thuật", "mỹ vị", "mỹ ý", "na", "na ná", "na pan", "na tri", "nả", "nã", "ná", "ná cao su", "nạc", "nách", "nách lá", "nai", "nai lưng", "nài", "nài nỉ", "nải", "nái", "nam", "nam châm", "nam cực", "nam nữ", "nam tính", "nám", "nạm", "nan", "nan giải", "nản", "nạn", "nạn nhân", "nang", "nàng", "nàng dâu", "nàng hầu", "nàng tiên", "nạng", "nanh", "nanh ác", "nanh sấu", "nanh vuốt", "nao lòng", "nao núng", "nào", "não", "não nùng", "náo nhiệt", "nạo", "nạo óc", "nạo vét", "nạp", "nạp thuế", "nát", "nát nhàu", "nát óc", "nạt nộ", "nay", "này", "nảy", "nảy ra", "nạy", "năm", "năm học", "năm mươi", "nằm", "nằm mê", "nằm ngủ", "nằm vạ", "nắm", "nắm xương", "nắn", "năng lực", "năng lượng", "năng nổ", "năng suất", "nắng", "nắng ráo", "nặng", "nặng lời", "nặng mùi", "nặng nề", "nặng nhọc", "nặng tình", "nắp", "nấc", "nấm", "nâng", "nâng đỡ", "nấp", "nâu", "nấu ăn", "nẻ", "né", "né tránh", "needly", "nem", "ném", "nén", "nén giận", "nén lòng", "neo", "nẻo", "nép", "nẹp", "nét", "nề hà", "nể", "nêm", "nếm", "nệm", "nên", "nền", "nền móng", "nền nếp", "nền tảng", "nêu", "nếu", "nếu không", "nga", "nga văn", "ngà", "ngà ngà say", "ngà voi", "ngả", "ngả lưng", "ngả mũ", "ngả nghiêng", "ngã", "ngã nước", "ngạc nhiên", "ngách", "ngai", "ngài", "ngái ngủ", "ngại", "ngại ngùng", "ngàn", "ngán", "ngạn", "ngạn ngữ", "ngang", "ngang hàng", "ngang ngửa", "ngang nhiên", "ngang trái", "ngáng", "ngành ngọn", "ngảnh cổ", "ngạnh", "ngao", "ngào", "ngào ngạt", "ngáo", "ngạo", "ngạo mạn", "ngạo nghễ", "ngáp", "ngạt", "ngạt hơi", "ngạt ngào", "ngay", "ngay cả", "ngay đơ", "ngay khi", "ngay thẳng", "ngay thật", "ngày", "ngày công", "ngày giỗ", "ngày giờ", "ngày lễ", "ngày mai", "ngày mùa", "ngày nay", "ngày ngày", "ngày sinh", "ngày tháng", "ngày xưa", "ngáy", "ngắm", "ngăn", "ngăn cấm", "ngăn nắp", "ngắn", "ngắt", "ngặt nghèo", "ngâm", "ngâm nga", "ngầm", "ngẫm", "ngấm", "ngậm", "ngậm ngùi", "ngân", "ngân hà", "ngân hàng", "ngân khoản", "ngân phiếu", "ngân quỹ", "ngân sách", "ngần ngại", "ngần ngừ", "ngẩn ngơ", "ngập", "ngập ngừng", "ngất ngưởng", "ngẫu hứng", "ngẫu nhiên", "ngây dại", "ngây ngất", "ngây thơ", "nghe", "nghe lén", "nghẹn", "nghẹn ngào", "nghèo", "nghèo hèn", "nghèo nàn", "nghèo túng", "nghẹt mũi", "nghề", "nghệ", "nghệ nhân", "nghệ sĩ", "nghệ thuật", "nghển", "nghênh chiến", "nghênh tân", "nghi", "nghi thức", "nghi vấn", "nghỉ", "nghỉ việc", "nghĩ", "nghị định", "nghị hòa", "nghị luận", "nghị lực", "nghị quyết", "nghị sĩ", "nghĩa", "nghĩa địa", "nghĩa vụ", "nghịch", "nghịch cảnh", "nghiêm", "nghiêm cấm", "nghiêm khắc", "nghiêm trọng", "nghiên cứu", "nghiền", "nghiến", "nghinh", "nghinh chiến", "nghinh ngang", "ngỏ", "ngõ", "ngõ hẻm", "ngó", "ngoài", "ngoài đường", "ngoài ra", "ngoại giao", "ngoại ngữ", "ngoại ô", "ngoại quốc", "ngoại thương", "ngoạm", "ngoan", "ngoan cố", "ngoan ngoãn", "ngoạn mục", "ngoằn ngèo", "ngọc", "ngọc lan", "ngọc trai", "ngòi", "ngòi viết", "ngói", "ngon", "ngón chân", "ngọn", "ngọn ngành", "ngọt", "ngô", "ngộ độc", "ngộ nhận", "ngốc", "ngôi", "ngồi", "ngồi ì", "ngồi tù", "ngôn ngữ", "ngôn từ", "ngông cuồng", "ngỗng", "ngơ ngác", "ngờ", "ngỡ", "ngu", "ngu dân", "ngủ", "ngũ", "ngũ quan", "ngũ vị", "ngụ", "ngụ ngôn", "ngục", "nguội", "nguồn", "nguồn gốc", "nguy hiểm", "nguy nga", "ngụy trang", "nguyên chất", "nguyên nhân", "nguyên tắc", "nguyên tử", "nguyện vọng", "nguyệt cầm", "ngư phủ", "ngữ pháp", "ngứa", "ngựa", "ngựa cái", "ngựa ô", "ngực", "ngừng", "ngược đãi", "người", "người đẹp", "người điên", "người ta", "người yêu", "ngưỡng mộ", "ngượng", "ngượng nghịu", "ngưu", "nha", "nha khoa", "nha phiến", "nha sĩ", "nhà", "nhà ăn", "nhà bác học", "nhà báo", "nhà bè", "nhà bếp", "nhà chứa", "nhà ga", "nhà hàng", "nhà in", "nhà khách", "nhà lãnh đạo", "nhà máy", "nhà nghề", "nhà nước", "nhà riêng", "nhà tang", "nhà táng", "nhà tắm", "nhà thơ", "nhà thờ", "nhà thương", "nhà trọ", "nhà văn", "nhà xuất bản", "nhã nhặn", "nhá nhem", "nhạc", "nhai", "nhài", "nhái", "nhàm", "nhám", "nhan sắc", "nhàn", "nhàn du", "nhàn nhã", "nhãn", "nhãn cầu", "nhãn hiệu", "nhãn khoa", "nhãn lực", "nhạn", "nhang", "nhanh", "nhanh chóng", "nhanh nhẹn", "nhanh trí", "nhánh", "nhạo", "nhát", "nhạt", "nhau", "nhàu", "nhay", "nhảy", "nhảy dù", "nhảy sào", "nhảy vọt", "nhảy xa", "nháy", "nhắc", "nhắc lại", "nhắc nhở", "nhằm", "nhắm", "nhắm hướng", "nhăn", "nhăn mặt", "nhăn nheo", "nhăn nhíu", "nhăn nhó", "nhẵn nhụi", "nhặng", "nhắp", "nhặt", "nhân", "nhân ái", "nhân bản", "nhân cách", "nhân chứng", "nhân công", "nhân danh", "nhân dân", "nhân dịp", "nhân đạo", "nhân đức", "nhân hậu", "nhân khẩu", "nhân loại", "nhân tạo", "nhân từ", "nhân viên", "nhẫn", "nhẫn nại", "nhẫn tâm", "nhấn mạnh", "nhận", "nhận biết", "nhận chìm", "nhận định", "nhận lời", "nhận mặt", "nhận ra", "nhận thức", "nhập khẩu", "nhập ngũ", "nhất", "nhất định", "nhất quán", "nhất quyết", "nhất trí", "nhật báo", "nhật ký", "nhật thực", "nhậu", "nhẹ", "nhẹ dạ", "nheo nhóc", "nhện", "nhi đồng", "nhi khoa", "nhì", "nhì nhằng", "nhì nhèo", "nhĩ", "nhí", "nhí nhảnh", "nhị", "nhị trùng âm", "nhiễm bịnh", "nhiễm sắc", "nhiệm kỳ", "nhiệm mầu", "nhiệm vụ", "nhiên liệu", "nhiếp ảnh", "nhiệt độ", "nhiệt liệt", "nhiệt lượng", "nhiều", "nhiều lời", "nhiều tiền", "nhiễu nhương", "nhìn", "nhìn nhận", "nhìn thấy", "nhịn đói", "nhịn nhục", "nhỉnh", "nhíp", "nhịp", "nho", "nho gia", "nho giáo", "nho học", "nho nhã", "nho nhỏ", "nho sĩ", "nhỏ", "nhỏ nhặt", "nhỏ nhẻ", "nhỏ nhẹ", "nhỏ nhen", "nhọc nhằn", "nhóm", "nhón gót", "nhọn", "nhổ cỏ", "nhổ răng", "nhồi bột", "nhồi sọ", "nhôm", "nhộn", "nhộn nhịp", "nhông", "nhồng", "nhộng", "nhốt", "nhột", "nhơ", "nhơ nhuốc", "nhờ", "nhớ", "nhớ nhà", "nhớt", "nhu cầu", "nhu động", "nhu mì", "nhu nhược", "nhũ dịch", "nhũ tương", "nhuận trường", "nhục", "nhục dục", "nhục đậu khấu", "nhục hình", "nhục mạ", "nhục nhã", "nhục thể", "nhuệ khí", "nhún nhường", "nhung", "nhúng", "nhuộm", "như", "như thế", "như vầy", "như vậy", "nhử", "nhựa", "nhựa sống", "nhức", "nhức răng", "nhưng", "nhược điểm", "nhường lại", "nhường nhịn", "nhượng bộ", "ni cô", "ni lông", "ni tơ", "nỉ", "nia", "nĩa", "ních", "niêm", "niêm luật", "niêm phong", "niêm yết", "niềm nở", "niên", "niên đại", "niên giám", "niêu thiếu", "nín", "nín khóc", "nịnh hót", "níu", "no", "nỏ", "nó", "nọc", "nói", "nói bậy", "nói chuyện", "nói dối", "nói đùa", "nói giùm", "nói lái", "nói láo", "nói lắp", "nói lên", "nói liều", "nói lóng", "nói năng", "nói quanh", "nói thật", "non nước", "nón", "nóng", "nóng lòng", "nô đùa", "nô lệ", "nổ", "nổ súng", "nồi", "nổi", "nổi giận", "nổi tiếng", "nối", "nối nghiệp", "nội bộ", "nội các", "nội chiến", "nội chính", "nội công", "nội dung", "nội địa", "nội động từ", "nội gián", "nội hóa", "nội khóa", "nội thương", "nội tiết", "nội trợ", "nội trú", "nội vụ", "nôm", "nông", "nông cạn", "nông dân", "nông sản", "nồng hậu", "nồng nàn", "nốt", "nơ", "nở", "nỡ to", "nợ", "nơi", "nới", "nơm", "nụ", "nụ cười", "nùi", "núi", "núi lửa", "núi non", "núm", "núm vú", "nung", "nung nấu", "nũng nịu", "nuôi", "nuôi dưỡng", "nuôi nấng", "nuôi tầm", "nuông chiều", "nuốt", "nuốt chửng", "nuốt giận", "núp", "nút", "nữ", "nữ công", "nữ giới", "nữ hoàng", "nữ sinh", "nữ tính", "nữ trang", "nửa", "nửa đêm", "nửa tá", "nữa", "nựng", "nước", "nước da", "nước đá", "nước hoa", "nước uống", "nương", "nương náu", "nướng", "nứt", "nứt ra", "o", "o bế", "ó", "oa oa", "oa trữ", "òa", "oác oác", "oách", "oai", "oai danh", "oai hùng", "oai linh", "oai nghiêm", "oai oái", "oai vệ", "oải", "oái ăm", "oan", "oan cừu", "oan hồn", "oan nghiệt", "oan trái", "oan uổng", "oán", "oán ghét", "oán giận", "oán hận", "oán than", "oán trách", "oanh kích", "oanh liệt", "oằn", "oắt", "oắt con", "óc", "óc châm biếm", "ọc", "ọc ạch", "oi", "oi ả", "oi bức", "oi khói", "oi nồng", "oi nước", "ói", "ói máu", "om", "om sòm", "òm ọp", "ong", "ong mật", "ong nghệ", "ong thợ", "ong vò vẽ", "ỏng bụng", "ỏng ẹo", "óng ả", "óng ánh", "ót", "ô", "ô chữ", "ô danh", "ô hay", "ô hô", "ô hợp", "ô nhiễm", "ô nhục", "ô tô", "ô trọc", "ô uế", "ồ", "ồ ạt", "ổ", "ổ bi", "ổ chuột", "ổ gà", "ổ khóa", "ổ kiến", "ổ mối", "ốc", "ốc xà cừ", "ôi", "ổi", "ối", "ôm", "ôm ấp", "ôm chân", "ôm đồm", "ồm ộp", "ốm", "ốm yếu", "ôn", "ôn đới", "ôn hòa", "ôn tập", "ôn tồn", "ồn", "ổn", "ổn định", "ông", "ông bà", "ông tổ", "ông tướng", "ông vãi", "ống", "ống chân", "ống chỉ", "ống điếu", "ống khói", "ống nhòm", "ống tiêm", "ống trời", "ốp", "ốt dột", "ơ", "ở", "ở đời", "ở riêng", "ở trọ", "ớ", "ợ", "ới", "ỡm ờ", "ơn", "ớn", "ớn lạnh", "ớt", "pha", "pha lê", "pha trò", "phà", "phá", "phá án", "phá bĩnh", "phá đám", "phá giá", "phá hại", "phá hoại", "phá hủy", "phá kỷ lục", "phá phách", "phá quấy", "phá rối", "phá sản", "phá thai", "phá trinh", "phác", "phác họa", "phách", "phách lối", "phai", "phải", "phải biết", "phải cách", "phải chăng", "phải đạo", "phải lẽ", "phải lòng", "phải quấy", "phái", "phái bộ", "phái đẹp", "phái đoàn", "phái viên", "phàm", "phàm phu", "phàm tục", "phạm", "phạm nhân", "phạm pháp", "phạm trù", "phạm vi", "phàn nàn", "phản", "phản ánh", "phản chiếu", "phản công", "phản dân chủ", "phản đề", "phản đối", "phản động", "phản nghịch", "phản ứng", "phản xạ", "phán", "phán quyết", "phang", "phảng phất", "phanh", "phanh phui", "phanh thây", "phao", "phao tin", "pháo", "pháo binh", "pháo bông", "pháo đài", "pháo kích", "pháp", "pháp chế", "pháp lí", "pháp lịnh", "pháp luật", "phát", "phát biểu", "phát đạt", "phát giác", "phát hành", "phát minh", "phát ngôn", "phát thanh", "phát xít", "phạt", "phẳng", "phẳng lặng", "phẳng lì", "phẳng phiu", "phẩm", "phẩm chất", "phẩm giá", "phẩm hạnh", "phẩm vật", "phân", "phân biệt", "phân bón", "phân cấp", "phân chất", "phân chia", "phân công", "phân giải", "phân loại", "phân ly", "phân số", "phân tích", "phân tử", "phân ưu", "phần", "phần thưởng", "phấn", "phấn chấn", "phấn đấu", "phấn hoa", "phấn khởi", "phấn nộ", "phận sự", "phất", "phất phơ", "phật", "phật tử", "phe", "phe cánh", "phe đảng", "phe phái", "phè phỡn", "phen", "phèn", "phèng la", "phép", "phép lạ", "phép tính", "phê bình", "phê chuẩn", "phế bỏ", "phế nhân", "phế phẩm", "phế tật", "phế truất", "phế vật", "phệ", "phễu", "phi", "phi cảng", "phi công", "phi cơ", "phi đội", "phi hành đoàn", "phi lý", "phi thường", "phì nhiêu", "phỉ báng", "phí phạm", "phí tổn", "phía", "phía trước", "phích nước", "phịch", "phiếm du", "phiếm luận", "phiếm thần", "phiên", "phiên âm", "phiên dịch", "phiền", "phiền hà", "phiền lòng", "phiền muộn", "phiền nhiễu", "phiền phức", "phiến", "phiến loạn", "phiện", "phiêu lưu", "phiếu", "phiếu xuất", "phim", "phím", "phỉnh gạt", "pho tượng", "phò", "phò mã", "phó", "phó bản", "phó mát", "phó thác", "phó từ", "phong", "phong bì", "phong cảnh", "phong dao", "phong kiến", "phong lan", "phong nhã", "phong phú", "phong tỏa", "phong trào", "phòng", "phòng ăn", "phòng bệnh", "phòng bị", "phòng dịch", "phòng đợi", "phòng không", "phòng ngự", "phòng ngừa", "phòng thí nghiệm", "phòng xa", "phỏng", "phỏng đoán", "phỏng tác", "phỏng vấn", "phóng", "phóng đãng", "phóng thích", "phóng uế", "phóng viên", "phóng xạ", "phô trương", "phổ biến", "phổ thông", "phố", "phôi pha", "phôi thai", "phổi", "phồng", "phơi", "phơi bày", "phơi phới", "phu", "phu mỏ", "phu nhân", "phu thê", "phù du", "phù hợp", "phù phép", "phù phiếm", "phù rễ", "phù sa", "phù thủy", "phủ", "phủ đầu", "phủ định", "phủ nhận", "phủ quyết", "phũ", "phũ phàng", "phú nông", "phú quí", "phú thương", "phụ", "phụ âm", "phụ bạc", "phụ cấp", "phụ dịch", "phụ huynh", "phụ khoa", "phụ lái", "phụ lục", "phụ nữ", "phụ tá", "phụ thân", "phụ trách", "phụ trương", "phụ tùng", "phúc", "phúc đức", "phúc trình", "phục", "phục dịch", "phục kích", "phục sinh", "phục viên", "phun", "phung phí", "phụng", "phụng dưỡng", "phụng sự", "phút", "phức tạp", "phương", "phương châm", "phương diện", "phương pháp", "phương thuốc", "phương thức", "phương tiện", "phương trình", "phường", "phượng", "pin", "qua", "qua đời", "qua loa", "qua lọc", "qua ngày", "qua quít", "quà", "quà cáp", "quà sáng", "quà tặng", "quả", "quả cảm", "quả cân", "quả cật", "quả đấm", "quả đất", "quả quyết", "quả tang", "quá", "quá cố", "quá độ", "quá khứ", "quá trình", "quạ", "quai hàm", "quái dị", "quái vật", "quan điểm", "quan hệ", "quan niệm", "quan sát", "quan tài", "quan trọng", "quản", "quản đốc", "quản gia", "quản lý", "quản ngại", "quản thúc", "quản trị", "quán", "quán quân", "quán tính", "quán trọ", "quán xuyến", "quang", "quang cảnh", "quang đãng", "quang học", "quang minh", "quang phổ", "quang tuyến", "quang vinh", "quàng", "quàng xiên", "quảng cáo", "quảng đại", "quảng trường", "quãng", "quáng", "quáng gà", "quanh", "quanh co", "quanh quẩn", "quanh quất", "quành", "quánh", "quạnh hiu", "quạnh quẽ", "quào", "quát", "quát mắng", "quạt", "quay", "quay cóp", "quay cuồng", "quay đơ", "quay phim", "quay quắt", "quảy", "quắc", "quắc thước", "quắm", "quặm", "quăn", "quăn queo", "quằn", "quằn quại", "quắn", "quặn", "quăng", "quặng", "quắp", "quặp", "quắt", "quắt quéo", "quặt", "quặt quẹo", "quân", "quân bị", "quân bình", "quân ca", "quân cảng", "quân cảnh", "quân chính", "quân chủ", "quân công", "quân dịch", "quân địch", "quân đoàn", "quân đội", "quân hàm", "quân hiệu", "quân khu", "quân kỳ", "quân lệnh", "quân lính", "quân luật", "quân lực", "quân nhân", "quân pháp", "quân phiệt", "quân quản", "quân sĩ", "quân số", "quân sư", "quân sự", "quân tử", "quân y", "quần", "quần áo", "quần chúng", "quần đảo", "quần thần", "quần tụ", "quần vợt", "quẩn", "quẫn bách", "quẫn trí", "quấn", "quấn quít", "quận", "quận chúa", "quận công", "quận trưởng", "quận vương", "quầng", "quất", "quất hồng bì", "quật", "quật cường", "quật khởi", "quây", "quây quần", "quầy", "quấy", "quấy nhiễu", "quấy rầy", "quấy rối", "quậy", "que", "que đan", "que hàn", "què", "què quặt", "quẻ", "quen", "quen biết", "quen thói", "quèn", "queo", "quéo", "quẹo", "quét", "quét dọn", "quét tước", "quẹt", "quê", "quê hương", "quê mùa", "quê người", "quế", "quên", "quên lãng", "quết", "quết trần", "quệt", "qui", "qui chế", "qui định", "qui mô", "qui trình", "qui ước", "quì", "quỉ", "quỉ quyệt", "quỉ thuật", "quĩ", "quĩ đạo", "quĩ tích", "quí", "quí khách", "quí phái", "quí tộc", "quí vật", "quị", "quít", "quịt", "quốc", "quốc ca", "quốc công", "quốc dân", "quốc doanh", "quốc gia", "quốc giáo", "quốc hội", "quốc huy", "quốc hữu hóa", "quốc khánh", "quốc kỳ", "quốc lộ", "quốc ngữ", "quốc phòng", "quốc tế", "quốc tịch", "quốc văn", "quốc xã", "quơ", "quở", "quở trách", "quyên", "quyên sinh", "quyền", "quyền bính", "quyền hạn", "quyền hành", "quyền lợi", "quyền lực", "quyền thuật", "quyền uy", "quyển", "quyến luyến", "quyến rũ", "quyến thuộc", "quyết", "quyết chiến", "quyết định", "quyết liệt", "quyết tâm", "quyết toán", "quỳnh", "quỳnh tương", "ra", "ra dáng", "ra đi", "ra đời", "ra hiệu", "ra lịnh", "ra mắt", "ra mặt", "ra oai", "ra rả", "ra rìa", "ra sức", "ra tòa", "ra vẻ", "rá", "rạ", "rác", "rạc", "rạc cẳng", "rách", "rách rưới", "rạch", "rạch ròi", "rải", "rải rác", "rải rắc", "rái cá", "ram", "rám nắng", "rạm", "rán", "rạn", "rạn nứt", "rang", "ràng", "ràng buộc", "rạng rỡ", "ranh", "ranh con", "ranh giới", "ranh ma", "ranh mãnh", "rành", "rành mạch", "rảnh", "rảnh mắt", "rảnh rang", "rảnh tay", "rãnh", "rao", "rào", "ráo", "ráo riết", "rạo rực", "ráp", "rạp", "rạp hát", "rát", "rau", "rày", "ráy tai", "rắc", "rắc rối", "rắn", "rắn chắc", "rắn dọc dưa", "rắn hổ lửa", "rắn hổ mang", "rắn lục", "răng", "răng cửa", "răng giả", "răng khôn", "răng nanh", "rằng", "rặng", "râm", "râm bụt", "rầm rì", "rầm rộ", "rậm", "rần rần", "rận", "rập", "rập rờn", "rất", "rất mực", "râu", "rầu", "rây", "rầy", "rầy rà", "rẫy", "rè", "rẻ", "rẽ", "rèm", "ren", "rèn", "rèn luyện", "reo", "réo", "rét", "rê", "rể", "rễ", "rế", "rên", "rên xiết", "rệp", "rết", "rêu", "rêu rao", "rì rào", "rỉ", "ria", "rìa", "rỉa", "riêng", "riêu cua", "rịn", "ring", "rình", "rịt", "rìu", "rỏ", "rõ", "rõ ràng", "rọ", "róc", "róc rách", "rọc", "roi", "roi da", "rọi", "rón rén", "rong", "rong chơi", "rong huyết", "ròng", "ròng rọc", "rót", "rô", "rồ", "rổ", "rỗ", "rồi", "rỗi", "rối", "rối loạn", "rối ren", "rối rít", "rối trí", "rốn", "rồng", "rỗng", "rống", "rộng", "rộng lớn", "rộng lượng", "rộng thênh thang", "rốt cuộc", "rơ", "rờ", "rợ", "rơi", "rơi lệ", "rơi rớt", "rời", "rời rã", "rời rạc", "rơm", "rơm rác", "rớt", "ru", "ru ngủ", "rủ rê", "rũ", "rũ rượi", "rú", "rùa", "rủa", "rũa", "rúc", "rục", "rục rịch", "rủi", "run", "run sợ", "rung", "rung động", "rùng mình", "rùng rợn", "rụng", "rụng rời", "ruốc", "ruồi", "ruồng bỏ", "ruồng rẫy", "ruộng", "ruộng đất", "ruộng muối", "ruộng nương", "ruột", "ruột gà", "ruột già", "ruột non", "ruột thừa", "rút", "rút lui", "rút ngắn", "rụt", "rụt rè", "rửa", "rửa ảnh", "rửa nhục", "rửa tội", "rữa", "rựa", "rực rỡ", "rưng rưng", "rừng", "rừng rậm", "rước", "rước khách", "rưỡi", "rưới", "rườm rà", "rướm", "rương", "rường cột", "rượt", "rượt theo", "rượu", "rượu bia", "rượu chát", "rượu đế", "rượu vang", "sa", "sa bàn", "sa chân", "sa cơ", "sa đà", "sa đề", "sa đọa", "sa lầy", "sa mạc", "sa ngã", "sa sầm", "sa sẩy", "sa sút", "sa thải", "sà", "sà lan", "sà lúp", "sả", "sá", "sá bao", "sá chi", "sá gì", "sá kể", "sạ", "sách", "sách giáo khoa", "sách lược", "sách nhiễu", "sách trắng", "sách vở", "sạch", "sạch bong", "sạch mắt", "sạch sẽ", "sạch trơn", "sạch trụi", "sai", "sai bảo", "sai biệt", "sai lạc", "sai lầm", "sai ngoa", "sai sót", "sai số", "sai trái", "sài lang", "sải", "sải cánh", "sái", "sam", "sàm báng", "sàm nịnh", "sám hối", "sạm", "san bằng", "san định", "san hô", "san sát", "san sẻ", "sàn", "sàn sàn", "sản", "sản hậu", "sản khoa", "sản lượng", "sản nghiệp", "sản phẩm", "sản sinh", "sản vật", "sản xuất", "sán", "sán dây", "sán lá", "sán lãi", "sán xơ mít", "sạn", "sang", "sang ngang", "sang sảng", "sang số", "sang tay", "sang tên", "sang trọng", "sàng", "sàng lọc", "sảng", "sảng khoái", "sáng", "sáng bóng", "sáng chế", "sáng choang", "sáng chói", "sáng dạ", "sáng kiến", "sáng lập", "sáng loáng", "sáng mắt", "sáng ngời", "sáng rực", "sáng sớm", "sáng sủa", "sáng suốt", "sáng tác", "sáng tai", "sáng tạo", "sáng trưng", "sáng ý", "sanh", "sành", "sành sỏi", "sánh", "sánh bước", "sánh duyên", "sánh vai", "sao", "sao bản", "sao băng", "sao chép", "sao cho", "sao chổi", "sao đành", "sao hôm", "sao mai", "sao tẩm", "sao tua", "sào", "sào huyệt", "sào sạo", "sáo", "sáo sậu", "sạo", "sap", "sáp", "sáp nhập", "sat", "sát", "sát cánh", "sát hạch", "sát hại", "sát khí", "sát nhân", "sát sạt", "sát sinh", "sát trùng", "sạt nghiệp", "sau", "sau đó", "sau hết", "sau lưng", "sau này", "sau rốt", "sáu", "sáu mươi", "say", "say đắm", "say mê", "say sưa", "sắc", "sắc bén", "sắc cạnh", "sắc chỉ", "sắc chiếu", "sắc đẹp", "sắc lệnh", "sắc mặt", "sắc sảo", "sắc thái", "sặc", "sặc sỡ", "sặc sụa", "săm", "săm lốp", "sắm", "sắm sửa", "sắm vai", "sặm màu", "săn", "săn bắn", "săn bắt", "săn sóc", "sẵn", "sẵn có", "sẵn dịp", "sẵn lòng", "sẵn sàng", "sắn", "sắn dây", "săng", "sằng sặc", "sắp", "sắp chữ", "sắp đặt", "sắp hàng", "sắp xếp", "sắt", "sắt son", "sắt tây", "sâm", "sâm banh", "sâm cầm", "sầm", "sầm uất", "sẩm tối", "sẫm", "sấm", "sấm ngôn", "sấm sét", "sậm sựt", "sân", "sân bay", "sân bóng", "sân cỏ", "sân khấu", "sân si", "sân vận động", "sần", "sần sùi", "sẩn", "sấn", "sấn sổ", "sấp", "sấp mặt", "sấp ngửa", "sập", "sâu", "sâu cay", "sâu độc", "sâu kín", "sâu mọt", "sâu róm", "sâu sắc", "sầu", "sầu khổ", "sầu muộn", "sầu thảm", "sấu", "sây sát", "sầy", "sẩy", "sẩy chân", "sẩy tay", "sẩy thai", "sấy", "sậy", "se", "sẻ", "sẽ", "sẽ hay", "séc", "sém", "sen", "sẹo", "sét", "sề", "sệ", "sệ nệ", "sên", "sểnh", "sểnh tay", "sệt", "sếu", "si", "si tình", "sì", "sỉ", "sỉ nhục", "sĩ diện", "sĩ phu", "sĩ quan", "sĩ số", "sĩ tốt", "sĩ tử", "sịch", "siểm nịnh", "siêng", "siêng năng", "siết", "siêu", "siêu âm", "siêu cường", "siêu đẳng", "siêu nhân", "siêu nhiên", "siêu phàm", "siêu thanh", "siêu tự nhiên", "sinh", "sinh dục", "sinh dưỡng", "sinh đôi", "sinh động", "sinh hạ", "sinh hóa học", "sinh hoạt", "sinh học", "sinh kế", "sinh khí", "sinh lực", "sinh lý", "sinh lý học", "sinh mệnh", "sinh nhật", "sinh quán", "sinh ra", "sinh sản", "sinh sắc", "sinh sống", "sinh sự", "sinh thái học", "sinh thời", "sinh tố", "sinh tồn", "sinh trưởng", "sinh tử", "sinh vật", "sinh vật học", "sinh viên", "sình", "sình lầy", "sính", "sít", "sít sao", "so", "so bì", "so le", "so sánh", "sò", "sọ", "sọ dừa", "soán đoạt", "soạn", "soạn giả", "soạn thảo", "soát", "sóc", "sọc", "soi", "soi xét", "sỏi", "sõi", "sói", "sóm sém", "sọm", "son", "son sắt", "son trẻ", "song", "song hành", "song hỉ", "song le", "song mã", "song phương", "song song", "song thân", "song toàn", "sòng", "sòng bạc", "sòng phẳng", "sóng", "sóng gió", "sóng sánh", "sóng sượt", "soóc", "sót", "sọt", "sô cô la", "sô vanh", "sồ", "sổ", "sổ lông", "sổ lồng", "sổ sách", "sổ tay", "sỗ sàng", "số", "số bị chia", "số chia", "số đông", "số hạng", "số học", "số liệu", "số lượng", "số một", "số tử vi", "sôi", "sôi gan", "sôi nổi", "sôi sục", "sồi", "sồn sồn", "sồn sột", "sông", "sông ngòi", "sông núi", "sổng", "sống", "sống chết", "sống còn", "sống sít", "sống sót", "sống sượng", "sống thừa", "sống trâu", "sộp", "sốt", "sốt dẻo", "sốt rét", "sốt ruột", "sốt sắng", "sốt vó", "sột soạt", "sơ", "sơ bộ", "sơ cấp", "sơ đồ", "sơ giao", "sơ hở", "sơ khai", "sơ khảo", "sơ lược", "sơ mi", "sơ qua", "sơ sinh", "sơ suất", "sơ tán", "sơ thẩm", "sơ ý", "sờ", "sờ mó", "sờ sờ", "sở", "sở cầu", "sở đoản", "sở hữu", "sở khanh", "sở nguyện", "sở tại", "sở thích", "sở thú", "sở trường", "sớ", "sợ", "sợ hãi", "sởi", "sợi", "sớm", "sớm hôm", "sớm mai", "sớm tối", "sơn", "sơn ca", "sơn cốc", "sơn dầu", "sơn dương", "sơn hào", "sơn khê", "sơn mài", "sơn nhân", "sơn thần", "sơn thủy", "sờn", "sờn lòng", "sởn", "sởn mởn", "sớt", "stand.", "stick", "su hào", "su su", "sú", "sụ", "sủa", "suất", "súc", "súc sắc", "súc sinh", "súc tích", "súc vật", "sục", "sục sạo", "sui", "sùi", "sùi sụt", "sủi bọt", "sum họp", "sum sê", "sum vầy", "sụm", "sún", "sụn", "sung", "sung công", "sung huyết", "sung mãn", "sung sức", "sung sướng", "sung túc", "sùng", "sùng bái", "sùng đạo", "sùng kính", "sủng ái", "súng", "súng cao su", "súng cối", "súng lục", "súng ngắn", "súng trường", "suối", "suối vàng", "suôn", "suôn sẻ", "suông", "suồng sã", "suốt", "suốt đời", "súp de", "sụp", "sụp đổ", "sút", "sút kém to", "sụt", "suy", "suy biến", "suy di", "suy diễn", "suy đồi", "suy luận", "suy lý", "suy nghĩ", "suy nhược", "suy rộng ra", "suy suyển", "suy tàn", "suy thoái", "suy tôn", "suy xét", "suy yếu", "suyễn", "suýt", "suýt nữa", "suýt soát", "sư", "sư cụ", "sư đệ", "sư huynh", "sư phạm", "sư phó", "sư phụ", "sư trưởng", "sư tử", "sử", "sử dụng", "sử gia", "sử học", "sử ký", "sử lược", "sử sách", "sứ", "sứ đoàn", "sứ giả", "sứ mệnh", "sứ quán", "sự", "sự cố", "sự kiện", "sự nghiệp", "sự thể", "sự thế", "sự thực", "sự tích", "sự vật", "sự việc", "sửa", "sửa chữa", "sửa đổi", "sửa sang", "sửa soạn", "sữa", "sứa", "sức", "sức ép", "sức khỏe", "sức lực", "sức mạnh", "sức nặng", "sức sống", "sức vóc", "sực nức", "sưng", "sưng húp", "sừng", "sừng sỏ", "sừng sững", "sửng", "sửng cồ", "sửng sốt", "sững", "sững sờ", "sưởi", "sưởi nắng", "sườn", "sương", "sương giá", "sương mù", "sướng", "sướng mắt", "sượng", "sượng mặt", "sướt", "sứt", "sứt môi", "sưu tầm", "sưu tập", "sưu thuế", "ta", "ta thán", "tà", "tà dâm", "tà dương", "tà khí", "tà ma", "tà tâm", "tà thuật", "tà thuyết", "tà vẹt", "tả", "tả chân", "tả đạo", "tả khuynh", "tả ngạn", "tả thực", "tả tơi", "tã", "tá", "tá dược", "tá điền", "tá lý", "tá tràng", "tạ", "tạ thế", "tác dụng", "tác động", "tác giả", "tác hại", "tác loạn", "tác nhân", "tác phẩm", "tác phong", "tác phúc", "tác quái", "tác thành", "tạc", "tạc dạ", "tạc đạn", "tách", "tách bạch", "tạch", "tai", "tai ác", "tai ách", "tai biến", "tai hại", "tai họa", "tai nạn", "tai quái", "tai tiếng", "tai ương", "tài", "tài cán", "tài chính", "tài công", "tài đức", "tài giảm", "tài giỏi", "tài hoa", "tài khóa", "tài khoản", "tài liệu", "tài lực", "tài mạo", "tài năng", "tài nghệ", "tài nguyên", "tài phiệt", "tài sản", "tài sắc", "tài tình", "tài trí", "tài tử", "tài vụ", "tài xế", "tài xỉu", "tải", "tãi", "tái", "tái bản", "tái bút", "tái cử", "tái diễn", "tái giá", "tái hồi", "tái hợp", "tái ngũ", "tái phạm", "tái phát", "tái sản xuất", "tái sinh", "tái tạo", "tái thế", "tại", "tại chỗ", "tại chức", "tại đào", "tại gia", "tại ngũ", "tại sao", "tại tâm", "tại vì", "tam", "tam bản", "tam cấp", "tam đại", "tam điểm", "tam đoạn luận", "tam giác", "tam giáo", "tam suất", "tam thất", "tam thể", "tam tòng", "tam tộc", "tám", "tám mươi", "tạm", "tạm biệt", "tạm bợ", "tạm thời", "tạm trú", "tạm ứng", "tạm ước", "tan", "tan hoang", "tan nát", "tan rã", "tan tác", "tan tành", "tan vỡ", "tàn", "tàn ác", "tàn bạo", "tàn binh", "tàn dư", "tàn hại", "tàn hương", "tàn khốc", "tàn lụi", "tàn nhang", "tàn nhẫn", "tàn phá", "tàn phế", "tàn sát", "tàn tạ", "tàn tật", "tàn tệ", "tàn tích", "tản bộ", "tản cư", "tản mạn", "tản mát", "tản văn", "tán", "tán loạn", "tán thành", "tán thưởng", "tán tỉnh", "tán tụng", "tang", "tang chế", "tang chứng", "tang lễ", "tang phục", "tang thương", "tang tích", "tang tóc", "tang vật", "tàng hình", "tàng tàng", "tàng trữ", "tảng", "tảng lờ", "tảng sáng", "tạng", "tạng phủ", "tanh", "tanh bành", "tanh hôi", "tánh", "tạnh", "tạnh ráo", "tao", "tao đàn", "tao ngộ", "tao nhã", "tào lao", "tảo", "tảo ngộ", "tảo thanh", "táo", "táo bạo", "táo gan", "táo tác", "tạo", "tạo giao", "tạo hình", "tạo hóa", "tạo lập", "tạo thành", "táp", "tạp", "tạp chất", "tạp chí", "tạp kỹ", "tạp lục", "tạp nhạp", "tạp vụ", "tát", "tạt", "tạt tai", "tàu", "tàu chiến", "tàu chợ", "tàu cuốc", "tàu hỏa", "tàu ngầm", "tàu sân bay", "tàu thủy", "tay", "tay áo", "tay lái", "tay nải", "tay ngang", "tay quay", "tay sai", "tay thợ", "tay trắng", "tay trên", "tay trong", "tay vịn", "tày", "tày đình", "tày trời", "táy máy", "tắc", "tắc kè", "tắc nghẽn", "tắc trách", "tắc xi", "tăm", "tăm hơi", "tăm tích", "tằm", "tắm", "tắm giặt", "tắm nắng", "tắm rửa", "tằn tiện", "tăng", "tăng cường", "tăng lữ", "tăng ni", "tằng tịu", "tằng tổ", "tằng tôn", "tặng", "tặng phẩm", "tặng thưởng", "tắt", "tắt hơi", "tắt kinh", "tắt thở", "tấc", "tấc lòng", "tâm", "tâm can", "tâm đắc", "tâm địa", "tâm giao", "tâm hồn", "tâm linh", "tâm lý", "tâm lý học", "tâm não", "tâm nhĩ", "tâm phúc", "tâm sự", "tâm thành", "tâm thần", "tâm thất", "tâm tình", "tâm tính", "tâm trạng", "tâm trí", "tâm tư", "tầm", "tầm bậy", "tầm gửi", "tầm nã", "tầm phào", "tầm tã", "tầm thường", "tầm vóc", "tầm vông", "tầm xích", "tầm xuân", "tẩm", "tẩm bổ", "tẩm quất", "tấm", "tấm bé", "tân binh", "tân hôn", "tân khách", "tân kỳ", "tân lang", "tân ngữ", "tân thời", "tân tiến", "tân trào", "tân xuân", "tần ngần", "tần số", "tần tảo", "tẩn mẩn", "tấn", "tấn công", "tấn phong", "tận", "tận cùng", "tận dụng", "tận hiểu", "tận hưởng", "tận lực", "tận tâm", "tận thế", "tận tình", "tận tụy", "tâng bốc", "tầng", "tầng lớp", "tấp nập", "tập", "tập đoàn", "tập hậu", "tập hợp", "tập huấn", "tập kết", "tập kích", "tập luyện", "tập quán", "tập san", "tập sự", "tập tành", "tập thể", "tập trung", "tập tục", "tất", "tất cả", "tất nhiên", "tất tả", "tất yếu", "tật", "tật bệnh", "tẩu", "tẩu mã", "tẩu tán", "tẩu thoát", "tấu", "tậu", "tây", "tây bắc", "tây cung", "tây học", "tây nam", "tây phương", "tẩy", "tẩy chay", "tẩy não", "tẩy trừ", "tấy", "te", "tè", "tẻ", "tẽ", "té", "té ra", "tem", "tem phiếu", "tem tép", "tém", "ten", "teng beng", "teo", "tẹo", "tép", "tét", "tẹt", "tê", "tê bại", "tê giác", "tê mê", "tê tê", "tê thấp", "tề tựu", "tễ", "tế", "tế bào", "tế bào chất", "tế độ", "tế nhị", "tế thế", "tệ", "tệ bạc", "tệ đoan", "tệ hại", "tệ tục", "tệ xá", "tếch", "têm", "tên", "tên gọi", "tên hiệu", "tên lửa", "tên thánh", "tên tục", "tênh", "tết", "tếu", "tha", "tha hóa", "tha hồ", "tha ma", "tha thứ", "thà", "thả", "thả cửa", "thả dù", "thả lỏng", "thả rong", "thác", "thạc sĩ", "thách", "thách thức", "thạch", "thạch anh", "thạch bản", "thạch cao", "thạch lựu", "thạch nhũ", "thạch sùng", "thạch tùng", "thai", "thai nghén", "thải", "thải hồi", "thái", "thái ấp", "thái bình", "thái cực", "thái dương", "thái độ", "thái giám", "thái hậu", "thái quá", "thái thượng hoàng", "thái tử", "thái y", "tham", "tham chiến", "tham chính", "tham gia", "tham khảo", "tham luận", "tham mưu", "tham nhũng", "tham quan", "tham sinh", "tham tài", "tham tàn", "tham thiền", "tham vọng", "thảm", "thảm cảnh", "thảm hại", "thảm họa", "thảm khốc", "thảm sát", "thảm thiết", "thảm thương", "thám", "thám hiểm", "thám thính", "thám tử", "than", "than bùn", "than cám", "than chì", "than củi", "than ôi", "than phiền", "than xỉ", "thản nhiên", "thán phục", "thán từ", "thang", "thang máy", "thảng hoặc", "tháng", "tháng ngày", "tháng tháng", "thanh", "thanh bạch", "thanh bình", "thanh cảnh", "thanh danh", "thanh đạm", "thanh giáo", "thanh kiếm", "thanh la", "thanh lịch", "thanh liêm", "thanh minh", "thanh nhàn", "thanh nữ", "thanh quản", "thanh tao", "thanh tâm", "thanh thản", "thanh thiên", "thanh thoát", "thanh tịnh", "thanh toán", "thanh tra", "thanh trừng", "thanh vắng", "thanh vân", "thành", "thành công", "thành danh", "thành đạt", "thành hình", "thành hôn", "thành kiến", "thành kính", "thành lũy", "thành ngữ", "thành niên", "thành phẩm", "thành phần", "thành phố", "thành quả", "thành sự", "thành tâm", "thành thạo", "thành thân", "thành thị", "thành thử", "thành tích", "thành tựu", "thành văn", "thành viên", "thành ý", "thảnh thơi", "thánh", "thánh ca", "thánh chỉ", "thánh cung", "thánh đản", "thánh địa", "thánh đường", "thánh giá", "thánh nhân", "thánh sư", "thánh thi", "thánh thượng", "thạnh", "thao", "thao diễn", "thao láo", "thao luyện", "thao lược", "thao tác", "thao trường", "thao túng", "thảo", "thảo luận", "thảo mộc", "thảo nguyên", "tháo", "tháo dạ", "tháo lui", "tháo vát", "thạo", "tháp", "tháp canh", "tháp ngà", "thạp", "thau", "tháu", "thay", "thay chân", "thay đổi", "thay mặt", "thay phiên", "thay vì", "thảy", "thắc mắc", "thắc thỏm", "thăm", "thăm dò", "thăm viếng", "thẳm", "thắm", "thằn lằn", "thăng", "thăng bằng", "thăng hoa", "thăng thiên", "thăng tiến", "thăng trầm", "thằng bờm", "thằng cha", "thẳng", "thẳng cánh", "thẳng đứng", "thẳng giấc", "thẳng góc", "thẳng tay", "thẳng thắn", "thẳng thừng", "thắng", "thắng cảnh", "thắng lợi", "thắng thế", "thắng trận", "thặng dư", "thắp", "thắt", "thắt chặt", "thắt cổ", "thắt lưng", "thâm", "thâm ảo", "thâm cung", "thâm độc", "thâm giao", "thâm hiểm", "thâm kín", "thâm nhập", "thâm niên", "thâm tâm", "thâm thùng", "thâm tình", "thâm trầm", "thâm ý", "thầm", "thầm lặng", "thẩm", "thẩm định", "thẩm mỹ", "thẩm mỹ học", "thẩm phán", "thẩm quyền", "thẩm vấn", "thẫm", "thấm", "thấm nhuần", "thấm thía", "thấm thoát", "thậm chí", "thân", "thân ái", "thân cận", "thân danh", "thân hành", "thân hình", "thân hữu", "thân mật", "thân mến", "thân phận", "thân thể", "thân thế", "thân thiện", "thân thiết", "thân thuộc", "thần", "thần bí", "thần chú", "thần diệu", "thần đồng", "thần học", "thần hồn", "thần kinh", "thần kỳ", "thần linh", "thần lực", "thần phục", "thần quyền", "thần sạ", "thần sắc", "thần thánh", "thần thoại", "thần thông", "thần tình", "thần tốc", "thần tượng", "thẩn thơ", "thận", "thận trọng", "thấp", "thấp hèn", "thấp thoáng", "thập ác", "thập cẩm", "thập kỷ", "thập phân", "thập phương", "thập toàn", "thập tự", "thất bại", "thất bát", "thất cách", "thất chí", "thất đức", "thất hiếu", "thất học", "thất kinh", "thất lạc", "thất lễ", "thất nghiệp", "thất nhân tâm", "thất phu", "thất sách", "thất sắc", "thất sủng", "thất thân", "thất thế", "thất thố", "thất thủ", "thất thường", "thất tiết", "thất tín", "thất tình", "thất trận", "thất truyền", "thất ước", "thất vận", "thất vọng", "thất ý", "thật", "thật thà", "thầu", "thầu dầu", "thầu khoán", "thấu", "thấu đáo", "thấu kính", "thây", "thây ma", "thầy", "thầy bói", "thầy chùa", "thầy dòng", "thầy giáo", "thầy ký", "thầy phán", "thầy pháp", "thầy thuốc", "thầy tu", "thầy tướng", "thấy", "the", "the thé", "thè", "thè lè", "thẻ", "thẻ bài", "thèm", "thèm khát", "thèm muốn", "then", "then chốt", "thẹn", "thẹn mặt", "thẹn thùng", "theo", "theo dõi", "theo đuổi", "theo gương", "thèo lẻo", "thẹo", "thép", "thẹp", "thét", "thê", "thê lương", "thê thảm", "thề", "thề bồi", "thề nguyền", "thể", "thể cách", "thể chất", "thể chế", "thể diện", "thể dục", "thể hiện", "thể lệ", "thể lực", "thể nghiệm", "thể tất", "thể thao", "thể theo", "thể thống", "thể tích", "thế", "thế cục", "thế gian", "thế giới", "thế giới quan", "thế hệ", "thế kỷ", "thế lực", "thế nào", "thế phẩm", "thế sự", "thế thái", "thế thì", "thế tộc", "thế tục", "thế ước", "thế vận hội", "thêm", "thêm bớt", "thềm", "thênh thang", "thếp", "thết", "thêu", "thêu thùa", "thều thào", "thi", "thi công", "thi cử", "thi đua", "thi hành", "thi hào", "thi hứng", "thi nhân", "thi pháp", "thi sĩ", "thi thể", "thi thố", "thi tứ", "thi vị", "thì", "thì giờ", "thì phải", "thì thào", "thì thầm", "thì thọt", "thí", "thí dụ", "thí điểm", "thí mạng", "thí nghiệm", "thí sinh", "thị", "thị chính", "thị dân", "thị giác", "thị hiếu", "thị lực", "thị sảnh", "thị thực", "thị tộc", "thị trấn", "thị trường", "thị trưởng", "thị xã", "thìa", "thích", "thích đáng", "thích hợp", "thích khách", "thích nghi", "thích thú", "thích ứng", "thích ý", "thiếc", "thiên", "thiên can", "thiên chúa", "thiên chúa giáo", "thiên cổ", "thiên đỉnh", "thiên định", "thiên đô", "thiên đường", "thiên hạ", "thiên hướng", "thiên kiến", "thiên lôi", "thiên mệnh", "thiên nga", "thiên nhiên", "thiên sứ", "thiên tai", "thiên tài", "thiên tạo", "thiên thần", "thiên thể", "thiên thời", "thiên tính", "thiên tuế", "thiên tử", "thiên văn học", "thiên vị", "thiền", "thiền gia", "thiền môn", "thiển", "thiển ý", "thiến", "thiện", "thiện cảm", "thiện chí", "thiện chiến", "thiện nghệ", "thiện tâm", "thiện xạ", "thiện ý", "thiêng liêng", "thiếp", "thiệp", "thiết", "thiết bì", "thiết giáp", "thiết kế", "thiết lập", "thiết mộc", "thiết tha", "thiết thân", "thiết thực", "thiết yếu", "thiệt", "thiệt hại", "thiệt mạng", "thiêu", "thiêu hủy", "thiêu thân", "thiều quang", "thiểu não", "thiểu số", "thiếu", "thiếu hụt", "thiếu máu", "thiếu nhi", "thiếu phụ", "thiếu sinh quân", "thiếu sót", "thiếu tá", "thiếu tướng", "thiếu úy", "thím", "thinh", "thình", "thình lình", "thỉnh", "thỉnh cầu", "thỉnh giáo", "thỉnh nguyện", "thỉnh thị", "thỉnh thoảng", "thính", "thính giả", "thính giác", "thịnh", "thịnh đạt", "thịnh hành", "thịnh nộ", "thịnh soạn", "thịnh thế", "thịnh tình", "thịnh trị", "thịnh vượng", "thíp", "thịt", "thiu", "thiu thối", "thò", "thò lò", "thỏ", "thỏ thẻ", "thọ", "thoa", "thỏa", "thỏa chí", "thỏa đáng", "thỏa hiệp", "thỏa lòng", "thỏa mãn", "thỏa thích", "thỏa thuận", "thóa mạ", "thoai thoải", "thoải mái", "thoái hóa", "thoái thác", "thoảng", "thoáng qua", "thoát nợ", "thoát thân", "thoạt tiên", "thoăn thoắt", "thóc gạo", "thọc", "thoi", "thỏi", "thói", "thói quen", "thói tục", "thon", "thong dong", "thòng", "thọt", "thô", "thô bỉ", "thô sơ", "thô tục", "thổ", "thổ dân", "thổ lộ", "thổ nhưỡng", "thổ phỉ", "thổ tinh", "thôi", "thôi miên", "thôi thúc", "thổi", "thổi phồng", "thối", "thối nát", "thôn", "thôn dã", "thôn nữ", "thôn quê", "thôn tính", "thồn", "thổn thức", "thông", "thông báo", "thông cảm", "thông cáo", "thông dụng", "thông điệp", "thông đồng", "thông lệ", "thông minh", "thông qua", "thông số", "thông tấn xã", "thông thạo", "thông thường", "thông tin", "thông tục", "thống chế", "thống đốc", "thống khổ", "thống lĩnh", "thống nhất", "thống trị", "thộp", "thốt", "thốt nốt", "thơ", "thơ ấu", "thờ", "thờ ơ", "thở", "thở dài", "thớ", "thợ", "thợ bạc", "thợ cạo", "thợ cưa", "thợ điện", "thợ đúc", "thợ hàn", "thợ lặn", "thợ may", "thợ máy", "thợ mộc", "thợ rèn", "thợ sơn", "thời bình", "thời cơ", "thời đại", "thời gian", "thời khóa biểu", "thời kỳ", "thời sự", "thời tiết", "thời trang", "thời vụ", "thơm", "thơm tho", "thu", "thu dọn", "thu gom", "thu hoạch", "thu hồi", "thu hút", "thu lượm", "thu nhập", "thu thanh", "thu xếp", "thù địch", "thù lao", "thù oán", "thủ bút", "thủ công", "thủ đô", "thủ lĩnh", "thủ phạm", "thủ quân", "thủ quỹ", "thủ thuật", "thủ thư", "thủ tiêu", "thủ trưởng", "thủ tục", "thủ tướng", "thú", "thú nhận", "thú vị", "thú vui", "thụ động", "thụ phấn", "thụ thai", "thụ tinh", "thua", "thua thiệt", "thuần", "thuần hóa", "thuần khiết", "thuần lý", "thuần nhất", "thuần phát", "thuần phong mỹ tục", "thuần thục", "thuần túy", "thuận", "thuận tiện", "thuật", "thuật ngữ", "thúc bách", "thúc dục", "thúc ép", "thúc thủ", "thuê", "thuế", "thuế thân", "thui thủi", "thụi", "thủm", "thun", "thung lũng", "thùng", "thùng thư", "thủng", "thúng", "thúng mủng", "thuốc", "thuốc bắc", "thuốc bổ", "thuốc cao", "thuốc dán", "thuốc độc", "thuốc lá", "thuốc lào", "thuốc mê", "thuốc muối", "thuốc nam", "thuốc ngủ", "thuốc nhuộm", "thuốc phiện", "thuốc tẩy", "thuộc", "thuộc địa", "thuộc tính", "thuổng", "thuở", "thút thít", "thụt", "thụt lùi", "thùy mị", "thủy chung", "thủy điện", "thủy động lực học", "thủy ngân", "thủy sư đô đốc", "thủy thủ", "thủy tinh", "thủy tổ", "thủy triều", "thuyên chuyển", "thuyền", "thuyền chài", "thuyền thúng", "thuyền trưởng", "thuyết", "thuyết giáo", "thuyết phục", "thuyết trình", "thư", "thư ký", "thư lại", "thư phòng", "thư sinh", "thư thả", "thư thái", "thư tín", "thư từ", "thư viện", "thử", "thử thách", "thứ", "thứ bậc", "thứ trưởng", "thứ tự", "thứ yếu", "thưa", "thưa kiện", "thưa thớt", "thừa", "thừa hành", "thừa hưởng", "thừa kế", "thừa nhận", "thừa số", "thừa thãi", "thức", "thức dậy", "thức tỉnh", "thực", "thực chất", "thực dân", "thực dụng", "thực đơn", "thực hành", "thực hiện", "thực nghiệm", "thực quyền", "thực ra", "thực sự", "thực tại", "thực tập", "thực tế", "thực thể", "thực trạng", "thực từ", "thực vật học", "thừng", "thước", "thước dây", "thước kẻ", "thược dược", "thương", "thương cảm", "thương gia", "thương hại", "thương lượng", "thương mại", "thương nhớ", "thương số", "thương tâm", "thương tích", "thương tổn", "thương vụ", "thường", "thường khi", "thường ngày", "thường nhật", "thường niên", "thường thường", "thường trực", "thường xuyên", "thưởng", "thưởng thức", "thượng cấp", "thượng đẳng", "thượng đế", "thượng đỉnh", "thượng hạng", "thượng khách", "thượng nghị viện", "thượng phẩm", "thượng sách", "thượng sĩ", "thượng tầng", "thượng tầng kiến trúc", "thượng tọa", "thượng tướng", "thượng uyển", "thượng võ", "ti hí", "ti tiện", "ti toe", "tì", "tì mẩn", "tì vết", "tỉ mỉ", "tỉ tê", "tí chút", "tí hon", "tí nữa", "tí tách", "tí teo", "tí ti", "tí tị", "tí xíu", "tị nạn", "tia", "tỉa", "tía", "tía tô", "tích", "tích cực", "tích phân", "tích trữ", "tịch liêu", "tịch thu", "tiếc", "tiếc rẻ", "tiệc", "tiệc rượu", "tiệc trà", "tiêm", "tiềm lực", "tiềm tàng", "tiềm thức", "tiếm", "tiệm", "tiệm ăn", "tiên", "tiên cảnh", "tiên đề", "tiên đoán", "tiên nga", "tiên nữ", "tiên phong", "tiên quyết", "tiên tiến", "tiên tri", "tiền", "tiền bạc", "tiền cọc", "tiền của", "tiền đề", "tiền định", "tiền đồ", "tiền lẻ", "tiền mặt", "tiền nhân", "tiền phong", "tiền sử", "tiền tệ", "tiền tiêu", "tiền trạm", "tiền tuyến", "tiễn", "tiễn biệt", "tiến", "tiến bộ", "tiến độ", "tiến hành", "tiến sĩ", "tiến thoái", "tiến tới", "tiến trình", "tiện", "tiện nghi", "tiện tay", "tiếng", "tiếng động", "tiếng lóng", "tiếng nói", "tiếng tăm", "tiếng vang", "tiếp", "tiếp cận", "tiếp chuyện", "tiếp đãi", "tiếp đón", "tiếp giáp", "tiếp kiến", "tiếp nhận", "tiếp nối", "tiếp quản", "tiếp tân", "tiếp theo", "tiếp thu", "tiếp tục", "tiếp viện", "tiết", "tiết diện", "tiết kiệm", "tiết lộ", "tiết mục", "tiệt trùng", "tiêu", "tiêu biểu", "tiêu chuẩn", "tiêu cực", "tiêu diệt", "tiêu dùng", "tiêu đề", "tiêu điểm", "tiêu điều", "tiêu độc", "tiêu hao", "tiêu hóa", "tiêu tan", "tiêu thụ", "tiêu vong", "tiêu xài", "tiều tụy", "tiểu ban", "tiểu bang", "tiểu đoàn", "tiểu đội", "tiểu học", "tiểu luận", "tiểu nhân", "tiểu quy mô", "tiểu sử", "tiểu thuyết", "tiểu thừa", "tiểu tiện", "tiểu trừ", "tiểu tư sản", "tiểu xảo", "tiếu lâm", "tim", "tìm", "tìm hiểu", "tím", "tin", "tin cậy", "tin đồn", "tin vịt", "tín dụng", "tín hiệu", "tín nhiệm", "tín phiếu", "tinh bột", "tinh cầu", "tinh chất", "tinh chế", "tinh dầu", "tinh dịch", "tinh giản", "tinh hoa", "tinh hoàn", "tinh khiết", "tinh nhuệ", "tinh tế", "tinh thần", "tinh tú", "tinh vi", "tình", "tình cảm", "tình cờ", "tình hình", "tình nguyện", "tình nhân", "tình thật", "tình thế", "tình tiết", "tình trạng", "tình ý", "tình yêu", "tỉnh", "tỉnh dậy", "tỉnh lỵ", "tỉnh táo", "tĩnh dưỡng", "tĩnh học", "tĩnh tại", "tĩnh tọa", "tính", "tính cách", "tính chất", "tính khí", "tính nết", "tính toán", "tính từ", "tít", "tít mù", "tịt", "to", "to béo", "to lớn", "to patch", "to tát", "to tướng", "tò mò", "tò vò", "tỏ", "tỏ ra", "tỏ tường", "tỏ vẻ", "tòa án", "tòa nhà", "tòa soạn", "tỏa", "tọa đàm", "tọa độ", "tọa hưởng", "tọa lạc", "tọa thiền", "toạc", "toan", "toan tính", "toàn", "toàn bộ", "toàn diện", "toàn lực", "toàn phần", "toàn quốc", "toàn quyền", "toàn thể", "toán", "toán học", "toang hoác", "tóc", "tóc mai", "tóc tơ", "tóe", "toét", "toi", "toi mạng", "tỏi", "tỏi tây", "tom góp", "tõm", "tóm", "tóm lại", "tóm tắt", "tòn tèn", "tòng phạm", "tòng quân", "tọng", "tóp tép", "tọt", "tô", "tô điểm", "tô vẽ", "tổ", "tổ chức", "tổ hợp", "tổ quốc", "tổ tiên", "tố cáo", "tố giác", "tố khổ", "tố tụng", "tốc", "tốc độ", "tốc hành", "tốc ký", "tộc", "tôi", "tôi tớ", "tồi", "tồi tệ", "tối", "tối cao", "tối đa", "tối hậu thư", "tối mịt", "tối nghĩa", "tối tân", "tối thiểu", "tội", "tội ác", "tội phạm", "tội vạ", "tôm", "tôm he", "tôm hùm", "tôn", "tôn chỉ", "tôn giáo", "tôn nghiêm", "tôn sùng", "tôn ti", "tôn trọng", "tồn kho", "tồn tại", "tổn hại", "tổn thất", "tổn thương", "tốn", "tốn kém", "tông tích", "tổng bí thư", "tổng cộng", "tổng đài", "tổng hành dinh", "tổng hội", "tổng hợp", "tổng kết", "tổng quát", "tổng số", "tổng tham mưu", "tổng tuyển cử", "tống biệt", "tống cổ", "tống giam", "tống ngục", "tốp", "tốt", "tốt bụng", "tốt lành", "tốt mã", "tốt nghiệp", "tốt số", "tốt tiếng", "tột đỉnh", "tột độ", "tơ", "tơ hồng", "tơ tưởng", "tờ", "tớ", "tơi bời", "tới", "tới lui", "tợn", "tợp", "tra", "tra cứu", "tra khảo", "trà", "trả", "trả đũa", "trả hàng", "trả lời", "trả thù", "trác táng", "trác tuyệt", "trạc", "trách", "trách mắng", "trách nhiệm", "trai", "trai trẻ", "trải", "trải qua", "trái", "trái khoáy", "trái mùa", "trái nghĩa", "trái phép", "trái xoan", "trại", "tràm", "trảm", "trám", "trạm", "tràn", "tràn trề", "trán", "trang", "trang bị", "trang điểm", "trang hoàng", "trang nghiêm", "trang sức", "trang trí", "trang trọng", "tràng giang đại hải", "tráng", "tráng lệ", "tráng miệng", "trạng thái", "tranh", "tranh cãi", "tranh cử", "tranh đua", "tranh luận", "tranh thủ", "tránh", "tránh tiếng", "trao", "trao đổi", "trao tay", "trào", "trào lưu", "trào phúng", "tráo trở", "tráp", "trát", "trau chuốt", "trau dồi", "trắc", "trắc bá diệp", "trắc địa học", "trắc nghiệm", "trặc", "trăm", "trăn", "trăn trở", "trằn trọc", "trăng", "trăng gió", "trắng", "trắng bạch", "trắng dã", "trắng đục", "trắng ngà", "trắng ngần", "trắng tay", "trắng toát", "trắng trợn", "trâm", "trầm", "trầm hương", "trầm mặc", "trầm trọng", "trân", "trân châu", "trân trọng", "trần", "trần gian", "trần tình", "trần trụi", "trần truồng", "trấn an", "trấn áp", "trấn giữ", "trấn tĩnh", "trận", "trận địa", "trận tuyến", "trâng tráo", "trập trùng", "trật", "trật tự", "trâu", "trâu bò", "trâu nước", "trầu", "trấu", "trầy", "tre", "trẻ", "trẻ con", "trẻ trung", "trẻ tuổi", "treo", "treo giải", "trèo", "trèo trẹo", "tréo ngoe", "trẹo", "trẹo hàm", "trét", "trể", "trễ", "trễ nải", "trên", "trệt", "trêu", "trêu ngươi", "trêu tức", "tri ân", "tri giác", "tri kỷ", "tri thức", "trì dộn", "trì hoãn", "trí", "trí khôn", "trí lực", "trí nhớ", "trí óc", "trí thức", "trí tuệ", "trị", "trị giá", "trị sự", "trị tội", "trị vì", "trích", "trích dẫn", "trịch thượng", "triền miên", "triển lãm", "triển vọng", "triện", "triết gia", "triết học", "triệt để", "triệt hạ", "triệt tiêu", "triều đại", "triều đình", "triều nghi", "triều thần", "triệu", "triệu phú", "triệu tập", "trinh bạch", "trinh nữ", "trinh tiết", "trình", "trình báo", "trình diễn", "trình diện", "trình độ", "trình tự", "trịnh trọng", "trìu mến", "tro", "trò", "trò chơi", "trò chuyện", "trò đùa", "trò hề", "trò vui", "trỏ", "tróc", "trọc", "trói", "trói buộc", "tròm trèm", "tròn", "tròn trịa", "tròn vo", "trọn", "trong", "trong khi", "trong sạch", "trong sáng", "trong suốt", "trong vòng", "tròng trành", "trọng", "trọng âm", "trọng đại", "trọng điểm", "trọng lưc", "trọng lượng", "trọng tài", "trọng tải", "trọng thưởng", "trọng yếu", "trót lọt", "trổ", "trôi", "trôi chảy", "trôi giạt", "trồi", "trỗi dậy", "trội", "trộm", "trộm nghĩ", "trốn", "trộn", "trông", "trông cậy", "trông chờ", "trông coi", "trông ngóng", "trồng", "trống", "trống canh", "trống không", "trống trải", "trơ", "trơ tráo", "trơ trọi", "trơ trụi", "trở", "trở giọng", "trở gót", "trở lại", "trở mặt", "trở nên", "trở ngại", "trở về", "trở xuống", "trớ trêu", "trợ cấp", "trợ động từ", "trợ lý", "trợ thủ", "trời", "trời ơi", "trơn", "trơn tru", "trớn", "trợn", "trớt", "trợt", "tru tréo", "trù bị", "trù chân", "trù tính", "trù trừ", "trú ẩn", "trú ngụ", "trụ", "truân chuyên", "truất phế", "trúc đào", "trục", "trục trặc", "trục xuất", "trùm", "trung", "trung bình", "trung cấp", "trung du", "trung đoàn", "trung đội", "trung gian", "trung hòa", "trung khu", "trung lập", "trung niên", "trung sĩ", "trung tá", "trung tâm", "trung thành", "trung thu", "trung thực", "trung tuần", "trung ương", "trung văn", "trùng dương", "trùng hợp", "trùng lập", "trùng tu", "trũng", "trúng", "trúng cử", "trúng số", "trúng tủ", "trúng tuyển", "truông", "trút", "truy đuổi", "truy kích", "truy nã", "truy nguyên", "truy tố", "trụy lạc", "truyền", "truyền bá", "truyền cảm", "truyền hình", "truyền thanh", "truyền thống", "truyền thụ", "truyền thuyết", "truyện", "truyện ký", "trừ", "trừ diệt", "trừ khử", "trừ phi", "trữ", "trữ tình", "trứ danh", "trưa", "trực", "trực giác", "trực giao", "trực khuẩn", "trực quan", "trực thăng", "trực tiếp", "trực tràng", "trưng bày", "trưng dụng", "trưng thu", "trừng", "trừng phạt", "trừng trị", "trứng", "trứng cá", "trứng nước", "trước", "trước đây", "trước khi", "trước mặt", "trước nhất", "trước tiên", "trườn", "trương", "trường", "trường ca", "trường đua", "trường học", "trường hợp", "trường kỷ", "trường phái", "trường thọ", "trưởng", "trưởng ga", "trưởng khoa", "trưởng phòng", "trưởng thành", "trượt", "trượt tuyết", "trừu tượng", "tu", "tu dưỡng", "tu hú", "tu huýt", "tu mi", "tu sửa", "tu thân", "tu từ", "tu viện", "tù", "tù binh", "tù hãm", "tù túng", "tù và", "tủ chè", "tủ kính", "tủ lạnh", "tủ sách", "tụ điện", "tụ họp", "tua", "túa", "tuân lệnh", "tuân thủ", "tuần báo", "tuần dương hạm", "tuần hành", "tuần lễ", "tuần tra", "tuấn kiệt", "tuấn tú", "túc cầu", "túc hạ", "túc trực", "tục", "tục huyền", "tục lệ", "tục ngữ", "tục tằn", "tục tĩu", "tủi thân", "túi", "túi tham", "tum húp", "tùm", "tũm", "túm", "tụm", "tun hút", "tủn mủn", "tung", "tung tích", "tung tóe", "tùng bách", "tùng tiệm", "túng quẫn", "túng thế", "tụng niệm", "tuổi", "tuổi thọ", "tuổi thơ", "tuổi trẻ", "tuôn", "tuồng như", "tuốt", "tuột", "tuy", "tuy nhiên", "tuy rằng", "tuy thế", "tùy", "tùy bút", "tùy thân", "tùy theo", "tùy thích", "tùy tùng", "tùy viên", "tủy", "tụy", "tuyên bố", "tuyên dương", "tuyên ngôn", "tuyên truyền", "tuyền đài", "tuyển", "tuyển dụng", "tuyển mộ", "tuyến", "tuyết", "tuyệt", "tuyệt chủng", "tuyệt diệu", "tuyệt đối", "tuyệt luân", "tuyệt tác", "tuyệt tích", "tuyệt vọng", "tuyệt vời", "tư", "tư bản", "tư cách", "tư chất", "tư duy", "tư hữu", "tư lệnh", "tư liệu", "tư lợi", "tư pháp", "tư sản", "tư thế", "tư thù", "tư thục", "tư tưởng", "tư vấn", "từ", "từ bi", "từ biệt", "từ bỏ", "từ chối", "từ điển", "từ điển học", "từ nguyên", "từ nối", "từ pháp", "từ thiện", "từ thông", "từ tính", "từ tốn", "từ vựng", "từ vựng học", "tử cung", "tử lộ", "tử ngữ", "tử sĩ", "tử tế", "tử thần", "tử trận", "tử vi", "tứ chi", "tứ đức", "tứ giác", "tứ khoái", "tứ phía", "tứ quý", "tứ tuần", "tứ tung", "tự cao", "tự cấp", "tự chủ", "tự do", "tự đắc", "tự động", "tự động hóa", "tự giác", "tự hào", "tự học", "tự lập", "tự lực", "tự nguyện", "tự nhiên", "tự phát", "tự phong", "tự quyết", "tự sát", "tự thú", "tự tiện", "tự tin", "tự trị", "tự trọng", "tự túc", "tự xưng", "tự ý", "tựa", "tựa hồ", "tức cười", "tức giận", "tức là", "tức thì", "tức tốc", "tưng bừng", "từng", "từng trải", "tước", "tước đoạt", "tươi", "tươi cười", "tươi tắn", "tưới", "tươm tất", "tương đắc", "tương đối", "tương đương", "tương lai", "tương quan", "tương trợ", "tương tư", "tương ứng", "tường", "tường tận", "tường thuật", "tưởng", "tưởng nhớ", "tưởng tượng", "tướng", "tướng mạo", "tượng", "tượng hình", "tượng trưng", "tửu điếm", "tửu sắc", "ty", "tỳ", "tỷ", "tỷ giá", "tỷ lệ", "tỷ số", "tỷ trọng", "u", "u ám", "u ẩn", "u hồn", "u ơ", "u ran", "u sầu", "u tịch", "u uất", "ù", "ủ", "ủ dột", "ủ ê", "ủ rũ", "ú ớ", "ú ụ", "ùa", "ủa", "úa", "uẩn khúc", "uất hận", "uất ức", "ục ịch", "uể oải", "uế khí", "ủi", "úi", "úi chà", "um tùm", "ùm", "ung", "ung dung", "ung nhọt", "ung thư", "ủng", "ủng hộ", "úng", "uốn", "uốn nắn", "uốn quanh", "uống", "úp", "úp mở", "út", "ụt ịt", "uy danh", "uy hiếp", "uy lực", "uy nghi", "uy phong", "uy quyền", "uy thế", "uy tín", "ủy ban", "ủy mị", "ủy quyền", "ủy thác", "ủy viên", "úy lạo", "uỵch", "uyên bác", "uyên thâm", "uyển chuyển", "ứ", "ứ đọng", "ứ huyết", "ưa", "ưa nhìn", "ứa", "ức", "ức chế", "ực", "ưng", "ưng thuận", "ửng hồng", "ứng biến", "ứng dụng", "ứng đáp", "ứng khẩu", "ứng phó", "ứng thí", "ước", "ước chừng", "ước định", "ước độ", "ước hẹn", "ước lượng", "ước mong", "ước mơ", "ước muốn", "ước vọng", "ướm", "ươn", "ươn hèn", "ưỡn ẹo", "ương ngạnh", "ướp", "ướp lạnh", "ướt", "ướt át", "ướt đẫm", "ưu ái", "ưu điểm", "ưu phiền", "ưu sầu", "ưu tiên", "ưu việt", "va", "va li", "va ni", "và", "vả", "vả lại", "vá", "vá víu", "vạ", "vác", "vạc", "vạc dầu", "vách", "vạch", "vạch trần", "vai", "vai trò", "vài", "vải", "vại", "vàm", "van", "van nài", "van xin", "vãn", "vãn hồi", "ván", "vạn", "vạn năng", "vạn sự", "vạn thọ", "vạn vật", "vang", "vang lừng", "vàng", "vàng anh", "vàng khè", "vàng mười", "vàng son", "vàng tây", "vàng y", "vãng lai", "váng", "vành", "vành đai", "vành tai", "vào", "vào hùa", "vào khoảng", "vạt", "vay", "vảy", "váy", "vằm", "văn bằng", "văn cảnh", "văn chương", "văn đàn", "văn hóa", "văn học", "văn kiện", "văn minh", "văn phong", "văn phòng", "văn phòng phẩm", "văn thơ", "văn vật", "văn vẻ", "vắn", "vặn", "vặn hỏi", "văng", "vẳng", "vắng", "vắng vẻ", "vắt", "vắt óc", "vặt", "vặt vãnh", "vân", "vân vân", "vân vê", "vần", "vần thơ", "vẩn đục", "vẫn", "vấn", "vấn đáp", "vấn đề", "vấn vít", "vận", "vận chuyển", "vận hành", "vận tải", "vận tốc", "vâng", "vâng lời", "vấp", "vất vả", "vật", "vật chất", "vật liệu", "vật lý học", "vật thể", "vẩu", "vây", "vây cánh", "vầy", "vẫy", "vấy", "vấy vá", "vậy", "vậy mà", "vậy thì", "ve", "ve sầu", "ve vẩy", "vè", "vẻ", "vẻ vang", "vẽ", "vé", "vén", "vẹn toàn", "vẹn vẽ", "vèo", "véo", "véo von", "vét", "vẹt", "vê", "về", "về hưu", "vế", "vệ", "vệ binh", "vệ sinh", "vệ tinh", "vênh", "vênh váo", "vểnh", "vết", "vết thương", "vệt", "vi khuẩn", "vi ô lông", "vi phạm", "vi ta min", "vi vút", "vì", "vì sao", "vì thế", "vỉ", "vĩ đại", "vĩ độ", "vĩ tuyến", "ví", "ví như", "ví thử", "vị", "vị chi", "vị giác", "vị kỷ", "vị lai", "vị ngữ", "vị tha", "vị trí", "vỉa", "vỉa hè", "việc", "việc làm", "viêm", "viên chức", "viền", "viễn cảnh", "viễn thông", "viện", "viện cớ", "viện lý", "viện trợ", "viếng thăm", "viết", "việt kiều", "việt vị", "vịn", "vinh dự", "vinh hạnh", "vinh quang", "vĩnh cửu", "vĩnh viễn", "vịnh", "vít", "vịt", "vò", "vò võ", "vỏ", "võ", "võ nghệ", "vó", "vó câu", "vóc dáng", "voi", "vòi", "vòi voi", "vòm", "vòm canh", "vong ân", "vong linh", "vòng", "vòng hoa", "vòng kiềng", "vòng quanh", "vòng vèo", "võng", "võng mạc", "vọng", "vọng gác", "vọng tưởng", "vót", "vọt", "vô biên", "vô bổ", "vô căn cứ", "vô chủ", "vô cơ", "vô cực", "vô danh", "vô định", "vô độ", "vô giá", "vô hại", "vô hiệu", "vô hình", "vô ích", "vô loại", "vô lương tâm", "vô lý", "vô nghĩa", "vô phép", "vô sản", "vô sinh", "vô số", "vô sự", "vô tận", "vô thần", "vô thừa nhận", "vô tình", "vô tội", "vô tư", "vô tư lự", "vô vị", "vô ý thức", "vồ vập", "vỗ", "vỗ béo", "vỗ tay", "vỗ về", "vốc", "vôi", "vôi vữa", "vội", "vội vã", "vồn vã", "vốn", "vống", "vơ", "vờ", "vờ vịt", "vở kịch", "vỡ", "vỡ lòng", "vỡ mủ", "vỡ nợ", "vớ", "vớ vẩn", "vợ", "vợ bé", "với", "vờn", "vớt", "vợt", "vu khống", "vu oan", "vu qui", "vu vơ", "vù", "vũ", "vũ bão", "vũ đài", "vũ khúc", "vũ nữ", "vũ trụ", "vú", "vú em", "vụ", "vụ lợi", "vua", "vui", "vùi", "vun", "vun trồng", "vụn", "vụn vặt", "vung", "vùng", "vùng vằng", "vùng vẫy", "vũng", "vụng", "vuông", "vuốt", "vuốt ve", "vụt", "vừa", "vừa lòng", "vừa lúc", "vừa mới", "vừa tầm", "vữa", "vựa", "vực", "vừng", "vững", "vững bền", "vững chắc", "vươn", "vườn", "vườn bách thú", "vườn cây", "vượn", "vương", "vương vãi", "vương vấn", "vương víu", "vướng", "vượng", "vượt", "vứt", "xa", "xa cách", "xa hoa", "xa lạ", "xa lánh", "xa lộ", "xa xăm", "xa xỉ", "xà", "xà beng", "xà bông", "xà cừ", "xà lách", "xà lan", "xà lim", "xà nhà", "xả", "xả thân", "xã", "xã giao", "xã hội", "xã hội chủ nghĩa", "xã hội học", "xã luận", "xã tắc", "xá", "xá tội", "xạ hương", "xạ kích", "xạ thủ", "xác", "xác đáng", "xác định", "xác nhận", "xác thực", "xác xơ", "xách", "xài", "xám", "xám mặt", "xám xịt", "xán lạn", "xanh", "xanh biếc", "xanh lá cây", "xanh lơ", "xanh xao", "xao động", "xao lãng", "xao xuyến", "xào", "xào xạc", "xảo", "xảo quyệt", "xáo trộn", "xạo", "xát", "xay", "xảy ra", "xăm", "xăm mình", "xắn", "xăng", "xẵng", "xắt", "xấc", "xấc xược", "xâm chiếm", "xâm lược", "xâm nhập", "xâm phạm", "xấp xỉ", "xâu", "xâu xé", "xấu", "xấu hổ", "xấu nết", "xấu số", "xấu xa", "xấu xí", "xây", "xây dựng", "xây mặt", "xây xẩm", "xe bò", "xe buýt", "xe cam nhông", "xe cộ", "xe cứu thương", "xe du lịch", "xe đạp", "xe điện", "xe đò", "xe gắn máy", "xe hỏa", "xe tang", "xe tắc xi", "xẻ", "xé", "xem", "xem xét", "xen", "xén", "xéo", "xẹo", "xẹp", "xét đoán", "xét hỏi", "xét xử", "xê dịch", "xê xích", "xế", "xếch", "xếp", "xếp đặt", "xếp hàng", "xếp thứ tự", "xi", "xi lanh", "xi líp", "xi măng", "xi rô", "xì", "xì gà", "xì xào", "xỉ", "xí nghiệp", "xỉa", "xích", "xích đạo", "xích đu", "xích mích", "xiếc", "xiêm y", "xiên", "xiềng", "xiết", "xiêu", "xiêu lòng", "xiêu vẹo", "xin", "xin lỗi", "xinê", "xinh", "xinh đẹp", "xịt", "xìu", "xỉu", "xíu", "xo", "xỏ", "xó", "xoa", "xoã", "xoá", "xoài", "xoàn", "xoay", "xoay quanh", "xoay xở", "xoáy", "xoăn", "xoắn xít", "xóc", "xoè", "xoi", "xoi mói", "xóm", "xóm giềng", "xong", "xong xuôi", "xót", "xót dạ", "xô", "xô bồ", "xô đẩy", "xô viết", "xổ", "xổ số", "xốc", "xốc vác", "xốc xếch", "xối", "xối xả", "xôn xao", "xông", "xốp", "xơ", "xơ xác", "xờ", "xới", "xu", "xu hướng", "xu nịnh", "xu thế", "xu thời", "xù", "xú uế", "xua đuổi", "xuân", "xuân phân", "xuân thu", "xuất", "xuất bản", "xuất cảng", "xuất chinh", "xuất chúng", "xuất dương", "xuất giá", "xuất hành", "xuất hiện", "xuất phát", "xuất sắc", "xuất thân", "xuất trình", "xuất xứ", "xúc", "xúc cảm", "xúc động", "xúc giác", "xúc phạm", "xúc tiến", "xúc xích", "xúc xiểm", "xuề xòa", "xui", "xủi bọt", "xum họp", "xúm", "xung đột", "xung khắc", "xung phong", "xung yếu", "xuôi", "xuôi chiều", "xuôi dòng", "xuôi vần", "xuồng", "xuổng", "xuống", "xụt xùi", "xuyên", "xuyên tạc", "xuyến", "xúyt", "xúyt xoát", "xử", "xử hòa", "xử lý", "xử sự", "xử thế", "xử trảm", "xử trí", "xử tử", "xứ", "xứ sở", "xưa", "xưa kia", "xức dầu", "xưng danh", "xưng hô", "xưng tội", "xứng đáng", "xước", "xương", "xương cốt", "xương rồng", "xương sống", "xương sườn", "xương xẩu", "xưởng", "xướng", "xướng danh", "y", "y học", "y khoa", "y nguyên", "y phục", "y sĩ", "y tá", "y tế", "y viện", "ỷ", "ý", "ý chí", "ý định", "ý kiến", "ý muốn", "ý nghĩ", "ý nghĩa", "ý niệm", "ý thức", "ý tưởng", "ý vị", "yểm", "yểm hộ", "yểm trợ", "yếm", "yếm dãi", "yếm thế", "yên", "yên lặng", "yên ổn", "yên trí", "yến", "yến tiệc", "yêng hùng", "yết", "yết hầu", "yết kiến", "yết thị", "yêu", "yêu cầu", "yêu chuộng", "yêu dấu", "yêu kiều", "yêu ma", "yêu sách", "yêu thuật", "yêu tinh", "yểu", "yểu điệu", "yếu", "yếu điểm", "yếu đuối", "yếu lược", "yếu nhân", "yếu tố"];
exports.default = _default;
};

moduleFactories["node_modules/absol-vietnamese/UncommonWords.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vietnamese/UncommonWords.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = ["a ha", "à uôm", "ác bá", "ác khẩu", "ác là", "ác liệt", "ác miệng", "ác mó", "ác mô ni ca", "ác ôn", "ác quỷ", "ác tính", "ác ý", "ai đời", "ai nấy", "ái chà", "an giấc", "an hưởng", "an khang", "An Nam", "an nhàn", "an thần", "an toạ", "an trí", "án treo", "áng chừng", "anh ách", "anh chị", "anh hùng ca", "anh hùng chủ nghĩa", "anh minh", "anh nuôi", "anh quân", "ảo thị", "ảo vọng", "áo cánh", "áo khách", "áo khoác", "áo lá", "áo lặn", "áo lót", "áo tế", "áo thụng", "áo tơi", "áo trấn thủ", "áo vệ sinh", "áp chảo", "áp chế", "áy", "ăn chặn", "ăn chẹt", "ăn da", "ăn diện", "ăn đong", "ăn đường", "ăn đứt", "ăn giá", "ăn học", "ăn làm", "ăn lời", "ăn mảnh", "ăn mặc", "ăn mặn", "ăn mòn", "ăn mừng", "ăn người", "ăn rỗi", "ăn vã", "ăn xin", "ẳng", "ắng họng", "âm giai", "âm học", "âm khí", "âm lịch", "âm luật", "âm thanh", "âm ti", "âm tiết", "âm vị", "âm vị học", "âm vị học", "ầm à ầm ừ", "ầm à ầm ừ", "ầm ầm", "ầm ừ", "ẩm ướt", "ấm ách", "ấm ớ", "ấm tích", "ấm ứ", "ấm ức", "ậm à", "ậm à ậm ạch", "ậm à ậm ạch", "ậm à ậm ừ", "ậm à ậm ừ", "ậm ạch", "ậm ờ", "ân giảm", "ẩn cư", "ẩn dụ", "ẩn hiện", "ẩn nấp", "ẩn sĩ", "ẩn số", "ẩn tình", "ẩn tướng", "ấn bản", "ấn Độ giáo", "ấn học", "ấn kiếm", "ấn loát phẩm", "ấn loát phẩm", "ấn phẩm", "ấp a ấp úng", "ấp úng", "ất", "âu ca", "âu hoá", "âu hóa", "âu là", "ấu trĩ viên", "ấu trĩ viên", "ẩy", "ba bảy", "ba bị", "ba chỉ", "ba cùng", "ba đầu sáu tay", "ba đờ xuy", "ba gác", "ba giăng", "ba lá", "ba lơn", "ba mươi", "ba ngày", "ba ngôi", "ba tháng", "ba tiêu", "ba vạ", "ba xuân", "bà ba", "bà bô", "bà chị", "bà cô", "bà cốt", "bà đồng", "bà gia", "bà giằn", "bà hoàng", "bà la môn", "bà lớn", "bà mụ", "bà nhạc", "bà trẻ", "bà xờ", "bả lả", "bá nghiệp", "bác cổ thông kim", "bạc bẽo", "bạc đãi", "bạc màu", "bạc mệnh", "bạc phau", "bạc phơ", "bách bổ", "bách chiến", "bách chu niên", "bách công", "bách hoá", "bách hóa", "bách khoa toàn thư", "bách sinh", "bách tán", "bách thanh", "bách thắng", "bạch biến", "bạch chỉ", "bạch đái", "bạch đầu quân", "bạch đậu khấu", "bạch hầu", "bạch huyết cầu", "bạch huyết cầu", "bạch nhật", "bạch phiến", "bạch quả", "bạch tạng", "bạch thỏ", "bạch thoại", "bai", "bài bạc", "bài bản", "bài bây", "bài binh bố trận", "bài bình luận", "bài giải", "bài hát", "bài khoá", "bài lá", "bài mục", "bài ngà", "bài ngoại", "bài tập", "bài thuốc", "bài toán", "bài trí", "bài trừ", "bài vở", "bài xuất", "bải hoải", "bãi binh", "bãi bồi", "bãi cá", "bãi chăn thả", "bãi chiến", "bãi chợ", "bãi khoá", "bãi miễn", "bãi tập", "bãi thải", "bãi thị", "bãi thực", "bãi triều", "bái lĩnh", "bái thần giáo", "bái tổ", "bái vật giáo", "bái vọng", "bại binh", "bại liệt", "bại quân", "bại tướng", "bám trụ", "ban chiều", "ban long", "ban mai", "ban nãy", "ban ơn", "ban sáng", "ban sơ", "ban tặng", "ban thứ", "ban trưa", "bàn ăn", "bàn chân", "bàn chông", "bàn cuốc", "bàn dân thiên hạ", "bàn dân thiên hạ", "bàn đạp", "bàn đèn", "bàn định", "bàn độc", "bàn ghế", "bàn giấy", "bàn hoàn", "bàn là", "bàn luận", "bàn lùi", "bàn mảnh", "bàn phím", "bàn ra", "bàn ren", "bàn soạn", "bàn thạch", "bàn thấm", "bàn tròn", "bàn xoa", "bản bộ", "bản chức", "bản doanh", "bản địa", "bản đồ học", "bản đồ học", "bản đúc", "bản gốc", "bản in thử", "bản kẽm", "bản kê", "bản lai", "bản làng", "bản lĩnh", "bản mệnh", "bản ngữ", "bản nháp", "bản quán", "bản tâm", "bản thân", "bản thể", "bản thể học", "bản thể học", "bản tin", "bản triều", "bản vị chủ nghĩa", "bán bình nguyên", "bán cấp", "bán chác", "bán chính thức", "bán công khai", "bán công khai", "bán dẫn", "bán đấu giá", "bán đấu giá", "bán đứng", "bán mạng", "bán nguyên âm", "bán nguyên âm", "bán non", "bán phong kiến", "bán phụ âm", "bán quân sự", "bán quân sự", "bán rao", "bán sỉ", "bán sơn địa", "bán thành phẩm", "bán tháo", "bán thấm", "bán xon", "bán xới", "bán ý thức", "bạn bầy", "bạn bè", "bạn đường", "bạn hàng", "bạn hữu", "bạn vàng", "bang tá", "bàng bạc", "bàng hệ", "bàng quang", "bảng lảng", "bảng màu", "bảng nhãn", "bảng vàng", "bành bạch", "bành bạnh", "bành tô", "bảnh chọe", "bảnh mắt", "bảnh trai", "bánh bàng", "bánh bèo", "bánh bích quy", "bánh bò", "bánh bỏng", "bánh chả", "bánh chay", "bánh chè", "bánh chưng", "bánh đa", "bánh đa nem", "bánh đà", "bánh khảo", "bánh khoai", "bánh khoái", "bánh mật", "bánh nếp", "bánh ngọt", "bánh nướng", "bánh phồng", "bánh phồng tôm", "bánh phồng tôm", "bánh phở", "bánh quế", "bánh quy", "bánh rán", "bánh răng", "bánh tày", "bánh tẻ", "bánh tét", "bánh tôm", "bánh trái", "bánh vẽ", "bánh xe", "bánh xèo", "bánh xốp", "bạnh", "bao cấp", "bao che", "bao chiếm", "bao lăm", "bao phủ", "bao quát", "bao tải", "bao thầu", "bao trùm", "bào ảnh", "bào chế học", "bào chế học", "bào hao", "bào ngư", "bảo an binh", "bảo an binh", "bảo ban", "bảo bối", "bảo dưỡng", "bảo hành", "bảo hoàng", "bảo kiếm", "bảo lãnh", "bảo lĩnh", "bảo lưu", "bảo mẫu", "bảo nô", "bảo quốc", "bảo sanh", "bảo tàng học", "bảo tàng học", "bảo toàn", "bảo tồn", "bảo tồn bảo tàng", "bảo vật", "bão bùng", "bão cát", "bão hoà", "bão hòa", "bão rớt", "bão táp", "bão tố", "báo an", "báo ảnh", "báo ân", "báo cáo viên", "báo cáo viên", "báo cô", "báo công", "báo danh", "báo đáp", "báo đền", "báo giới", "báo hại", "báo mộng", "báo phục", "báo quán", "báo quốc", "báo tang", "báo thù", "báo tiệp", "báo tử", "báo vụ viên", "báo xuân", "báo yên", "bạo chính", "bạo dạn", "bạo gan", "bạo nghịch", "bạo phổi", "bạo quân", "bạo tàn", "bát bửu", "bát chậu", "bát chiết yêu", "bát cú", "bát đĩa", "bát giác", "bát giới", "bát mẫu", "bát phẩm", "bát phố", "bát quái", "bát sách", "bát tiên", "bát trân", "bát tuần", "bạt chúng", "bạt hồn", "bạt hơi", "bạt tai", "bạt tê", "bạt thiệp", "bạt tử", "bạt vía", "bàu bạu", "bàu nhàu", "báu", "bay biến", "bay bổng", "bay chuyền", "bay la", "bay lượn", "bay màu", "bay mùi", "bày chuyện", "bày trò", "bày vai", "bày vẽ", "Bắc bán cầu", "bắc bậc", "bắc cầu", "Bắc đẩu", "Bắc đẩu bội tinh", "Bắc đẩu bội tinh", "bắc nam", "bắc thuộc", "bắc vĩ tuyến", "băm vằm", "băm viên", "bằm", "bằn bặt", "bẳn", "bẳn tính", "bắn tỉa", "bắn tiếng", "băng chuyền", "băng đảo", "băng giá", "băng hà học", "băng hà học", "băng nguyên", "băng nhân", "băng phiến", "băng tải", "băng tâm", "băng tích", "băng tuyết", "bằng bặn", "bằng cấp", "bằng chân", "bằng cớ", "bằng cứ", "bằng địa", "bằng không", "bằng nào", "bằng như", "bằng phẳng", "bằng sắc", "bằng thừa", "bằng vai", "bắng nhắng", "bặng nhặng", "bắp cày", "bắp cơ", "bắp ngô", "bắp tay", "bắp thịt", "bắp vế", "bắt ấn", "bắt cái", "bắt chẹt", "bắt chợt", "bắt chuyện", "bắt đền", "bắt ép", "bắt gặp", "bắt giọng", "bắt lính", "bắt lỗi", "bắt mạch", "bắt nét", "bắt nọn", "bắt nợ", "bắt phu", "bắt quyết", "bắt sống", "bắt thăm", "bắt thóp", "bắt tội", "bắt tréo", "bặt tin", "bậc cửa", "bậc thầy", "bẩm báo", "bẩm chất", "bẫm", "bấm độn", "bấm gan", "bấm giờ", "bấm ngọn", "bấm nút", "bấm quẻ", "bấm tay", "bậm", "bần bách", "bần bật", "bần cố", "bần cố nông", "bần cố nông", "bần cùng hoá", "bần cùng hóa", "bần cùng hoá", "bần cùng hóa", "bần đạo", "bần hàn", "bần huyết", "bần nông", "bần sĩ", "bần tăng", "bẩn mình", "bẩn thẩn bần thần", "bẩn thẩn bần thần", "bẩn thỉu", "bận bịu", "bận tâm", "bấp ba bấp bênh", "bập", "bập bà bập bềnh", "bập bà bập bõm", "bập bà bập bùng", "bập bênh", "bập bõm", "bập bồng", "bập bỗng", "bập bùng", "bất an", "bất bằng", "bất bình đẳng", "bất bình đẳng", "bất can thiệp", "bất can thiệp", "bất cần", "bất cẩn", "bất cập", "bất chấp", "bất chợt", "bất cố liêm sỉ", "bất cố liêm sĩ", "bất cộng đái thiên", "bất cứ", "bất đồ", "bất động sản", "bất động sản", "bất giác", "bất hiếu", "bất hợp hiến", "bất hợp tác", "bất hợp thời", "bất kể", "bất khả tri", "bất kham", "bất lịch sự", "bất luận", "bất ly thân", "bất mãn", "bất minh", "bất nghĩa", "bất nhã", "bất nhẫn", "bất nhất", "bất nhật", "bất như ý", "bất nhược", "bất phương trình", "bất quá", "bất tài", "bất tận", "bất tất", "bất thuận", "bất thường", "bất trị", "bất trung", "bất túc", "bất tuyệt", "bất tử", "bất tương xâm", "bất tương xâm", "bất xâm phạm", "bất ý", "bật đèn xanh", "bầu bán", "bầu bạn", "bầu bậu", "bầu bí", "bầu bĩnh", "bầu cử", "bầu dục", "bầu đoàn", "bầu giác", "bấu véo", "bấu víu", "bậu", "bây chừ", "bây dai", "bây nhiêu", "bầy nhầy", "bầy tôi", "bẫy cò ke", "bấy", "bấy bá", "bấy chầy", "bấy chừ", "bấy giờ", "bấy nay", "bấy nhiêu", "bậy bạ", "be bé", "be bét", "bè bạn", "bè bè", "bè cánh", "bè đảng", "bè đôi", "bè lũ", "bè mọn", "bè nhè", "bè phái", "bẻ bai", "bẻ ghi", "bẻ họe", "bẻ khục", "bẻ lái", "bẻ mặt", "bé bỏng", "bé con", "bé dại", "bé miệng", "bé nhỏ", "bé tị", "bem", "bẻm mép", "bèn bẹt", "bén hơi", "beng", "béng", "beo béo", "bèo cái", "bèo cám", "bèo dâu", "bèo Nhật Bản", "bèo nhèo", "bèo ong", "bèo tấm", "bèo Tây", "bẻo lẻo", "béo bệu", "béo ị", "béo lăn", "béo lẳn", "béo mắt", "béo mẫm", "béo mập", "béo mỡ", "béo ngậy", "béo quay", "bẹo", "bẹp rúm", "bẹp tai", "bét be", "bét nhé", "bét ra", "bẹt", "bê bết", "bê bối", "bề bề", "bề dài", "bề dọc", "bề mặt", "bề ngang", "bề ngoài", "bề sâu", "bề tôi", "bể cạn", "bể hoạn", "bể khổ", "bế giảng", "bế quan toả cảng", "bế quan tỏa cảng", "bệ kiến", "bệ ngọc", "bệ phóng", "bệ rồng", "bệ tì", "bên cạnh", "bên có", "bên dưới", "bên ngoài", "bên ngoại", "bên nợ", "bên trên", "bên trong", "bền bỉ", "bền chặt", "bền gan", "bền màu", "bến", "bến lội", "bến nước", "bến phà", "bềnh", "bềnh bệch", "bệnh", "bệnh binh", "bệnh căn học", "bệnh căn học", "bệnh chứng", "bệnh hoạn", "bệnh nhân", "bệnh tật", "bệnh viện", "bếp nước", "bêu diếu", "bêu nắng", "bêu riếu", "bều bệu", "bệu rệch", "bi ba bi bô", "bi bô", "bi cảm", "bi chí", "bi đông", "bi hài kịch", "bi hài kịch", "bi hùng", "bi khúc", "bi thảm", "bi thiết", "bi thương", "bì bà bì bõm", "bì bạch", "bì bẹt", "bì bì", "bì bọp", "bì phu", "bì sì", "bì thư", "bì tiên", "bỉ báng", "bỉ nhân", "bỉ ổi", "bỉ thử", "bỉ vỏ", "bĩ", "bí beng", "bí danh", "bí đái", "bí hiểm", "bí mật", "bí tỉ", "bí truyền", "bị can", "bị cáo", "bị gậy", "bị sị", "bị trị", "bị vong lục", "bịa đặt", "bích", "bích báo", "bích hoạ", "biên ải", "biên cảnh", "biên chép", "biên chế", "biên cương", "biên dịch", "biên đạo", "biên độ", "biên đội", "Biên Hoà", "biên khu", "biên nhận", "biên niên", "biên phòng", "biên soạn", "biên tập viên", "biên tập viên", "biên thùy", "biên ủy", "biền", "biển cả", "biển khơi", "biển tiến", "biến áp", "biến âm", "biến báo", "biến cách", "biến cảm", "biến chuyển", "biến dạng", "biến dị", "biến diễn", "biến đổi", "biến hình", "biến hoá", "biến hóa", "biến loạn", "biến ngôi", "biến nhiệt", "biến phân", "biến sắc", "biến tấu", "biến thái", "biến thế", "biến tính", "biến tố", "biến trở", "biến tướng", "biện", "biện bác", "biện chứng pháp", "biện chứng pháp", "biện giải", "biện luận", "biện thuyết", "biêng biếc", "biếng ăn", "biếng chơi", "biết bao", "biết bụng", "biết chừng", "biết chừng nào", "biết chừng nào", "biết dường nào", "biết đâu", "biết đâu chừng", "biết đâu chừng", "biết điều", "biết mấy", "biết mùi", "biết tay", "biết thân", "biết thế", "biệt dược", "biệt đãi", "biệt động đội", "biệt lập", "biệt ngữ", "biệt nhãn", "biệt phái", "biệt số", "biệt tăm", "biệt thị", "biệt thức", "biệt tích", "biệt tin", "biểu bì", "biểu cảm", "biểu diển", "biểu dương", "biểu đạt", "biểu đồ", "biểu đồng tình", "biểu kiến", "biểu mô", "biểu sinh", "biểu thị", "biểu thức", "biểu tượng", "biếu xén", "bìm", "bìm bịp", "bím", "binh bộ", "binh công xưởng", "binh công xưởng", "binh cơ", "binh dịch", "binh đao", "binh đoàn", "binh gia", "binh hỏa", "binh họa", "binh khí", "binh khố", "binh lính", "binh mã", "binh ngũ", "binh nhất", "binh nhì", "binh nhu", "binh phí", "binh phục", "binh quyền", "binh thuyền", "binh thư", "binh tình", "binh vận", "binh vụ", "bình bán", "bình bầu", "bình bịch", "bình bồng", "bình cầu", "bình chân", "bình chú", "bình công", "bình dị", "bình địa", "bình điện", "Bình Định", "bình độ", "bình giá", "bình hành", "bình hương", "bình khang", "bình lặng", "bình lưu", "bình nghị", "bình nhật", "bình ổn", "bình phẩm", "bình phong", "bình phóng", "bình phương", "bình quân", "bình quyền", "bình sinh", "bình tâm", "bình thủy", "bình thường hoá", "bình thường hoá", "bình tích", "bình tình", "bình trị", "bình tươi", "bình vôi", "bình yên", "bĩnh", "bính", "bính bong", "bính boong", "bịp bợm", "bít tất tay", "bít tất tay", "bịt mắt", "bịt miệng", "bìu díu", "bĩu", "Blowing dust and wind.", "bo bo", "bo siết", "bò dái", "bò mộng", "bò tót", "bò u", "bò xạ", "bỏ bà", "bỏ bẵng", "bỏ bễ", "bỏ bố", "bỏ bớt", "bỏ bùa", "bỏ bừa", "bỏ cha", "bỏ chạy", "bỏ đi", "bỏ đời", "bỏ hóa", "bỏ học", "bỏ không", "bỏ liều", "bỏ lò", "bỏ lửng", "bỏ mạng", "bỏ mặc", "bỏ mất", "bỏ mẹ", "bỏ mình", "bỏ mứa", "bỏ ngỏ", "bỏ ngũ", "bỏ nhỏ", "bỏ ống", "bỏ qua", "bỏ quá", "bỏ quên", "bỏ rẻ", "bỏ rọ", "bỏ rơi", "bỏ sót", "bỏ thăm", "bỏ thầu", "bỏ thây", "bỏ thõng", "bỏ túi", "bỏ về", "bỏ vốn", "bỏ xa", "bỏ xác", "bỏ xó", "bỏ xừ", "bõ bèn", "bõ ghét", "bõ già", "bọ bạc", "bọ cạp", "bọ chó", "bọ dừa", "bọ gậy", "bọ xít", "bọc hậu", "bọc sắt", "bỏi", "bom bay", "bom bi", "bom lân tinh", "bom nổ chậm", "bom từ trường", "bòm bõm", "bon", "bon chen", "bòn của", "bòn đãi", "bòn rút", "bòng bong", "bòng chanh", "bỏng", "bỏng rạ", "bóng vía", "bọng", "bọng ong", "boong boong", "bóp bụng", "bóp chẹt", "bóp chết", "bóp cổ", "bóp họng", "bóp mắt", "bóp méo", "bóp miệng", "bóp mồm", "bóp mũi", "bóp nặn", "bóp óc", "bóp trán", "bọp", "bọt mép", "bô bô", "bồ bịch", "bồ các", "bồ cào", "bồ cắt", "bồ chao", "bồ côi", "bồ công anh", "bồ công anh", "bồ đài", "bồ đề", "bồ hòn", "bồ kếp", "bồ nông", "bồ quân", "bồ tát", "bồ tạt", "bổ chính", "bổ chửng", "bổ củi", "bổ cứu", "bổ dụng", "bổ đề", "bổ khuyết", "bổ nghĩa", "bổ ngữ", "bổ nhào", "bổ nháo", "bổ nhoài", "bổ trợ", "bổ túc", "bổ vây", "bổ xuyết", "bỗ bã", "bố cái", "bố chánh", "bố chính", "bố cu", "bố đĩ", "bố già", "bố kinh", "bố láo", "bố lếu", "bố nuôi", "bố phòng", "bố phượu", "bố ráp", "bố thí", "bố trận", "bố vờ", "bộ ba", "bộ binh", "bộ cánh", "bộ chính trị", "bộ chính trị", "bộ đàm", "bộ điều", "bộ hình", "bộ học", "bộ hộ", "bộ lại", "bộ lễ", "bộ lòng", "bộ lông", "bộ môn", "bộ não", "bộ nhớ", "bộ óc", "bộ sậu", "bộ tham mưu", "bộ tham mưu", "bộ thuộc", "bộ tịch", "bộ triệt âm", "bộ trưởng", "bộ tư lệnh", "bộ tướng", "bốc dỡ", "bốc đồng", "bốc hoả", "bốc hỏa", "bốc lôi", "bốc mả", "bốc mộ", "bốc mùi", "bốc rời", "bốc vác", "bộc bạch", "bộc phá", "bộc trực", "bộc tuệch", "bộc tuệch bộc toạc", "bôi bác", "bôi đen", "bôi nhọ", "bôi vôi", "bồi bếp", "bồi bổ", "bồi bút", "bồi đắp", "bồi hoàn", "bồi tế", "bồi thẩm", "bồi tích", "bồi trúc", "bồi tụ", "bổi hổi bồi hồi", "bối cảnh", "bội chi", "bội chung", "bội giáo", "bội hoàn", "bội hoạt", "bội nghĩa", "bội nhiễm", "bội ơn", "bội phát", "bội phần", "bội số", "bội thề", "bội thu", "bội thực", "bội tinh", "bội ước", "bôm bốp", "bồm", "bồm bộp", "bôn", "bôn tập", "bôn tẩu", "bốn bên", "bốn biển", "bốn chân", "bộn bề", "bộn rộn", "bông băng", "bông gòn", "bông lau", "bông phèng", "bồng bế", "bồng bềnh", "bồng lai tiên cảnh", "bồng súng", "bổng ngoại", "bỗng chốc", "bỗng dưng", "bỗng đâu", "bỗng không", "bỗng nhiên", "bống", "bộng", "bộng ong", "bốp chát", "bộp", "bốt", "bột giặt", "bột khởi", "bột ngọt", "bột nhão", "bột tan", "bơ thờ", "bờ bụi", "bờ cõi", "bờ giậu", "bờ hè", "bờ lu dông", "bờ rào", "bờ thửa", "bờ vùng", "bớ", "bơi bướm", "bơi chèo", "bơi chó", "bơi đứng", "bơi ếch", "bơi lội", "bơi sải", "bơi trải", "bơi vũ trang", "bời", "bời bời", "bới móc", "bới việc", "bới xấu", "bơm đẩy", "bơm hút", "bơm tiêm", "bờm xơm", "bơn", "bơn bớt", "bờn bợt", "bợn", "bớp", "bợp", "bớt miệng", "bớt tay", "bớt xén", "bớt xớ", "bợt", "bù đắp", "bù đầu", "bù hao", "bù khú", "bù lại", "bù lỗ", "bù lu bù loa", "bù lu bù loa", "bù nhìn", "bù trì", "bù trừ", "bù xù", "bủ", "bụ bẫm", "bụ sữa", "bùa bả", "bùa chú", "bùa mê", "bủa", "bủa vây", "bục mình", "bùi tai", "bụi đời", "bụi hồng", "bụi rậm", "bụi trần", "bùm bụp", "bủm", "bụm", "bùn dơ", "bùn lầy", "bung", "bung bủng", "bung búng", "bùng", "bùng bục", "bùng bùng", "bùng nhùng", "bủng beo", "bụng chân", "bụng cóc", "bụng dạ", "bụng dưới", "bụng phệ", "buộc lòng", "buồi", "buổi chiều", "buổi sáng", "buổi tối", "buổi trưa", "buồm lái", "buồm mũi", "buôn bạc", "buôn bán", "buôn buốt", "buôn cất", "buôn người", "buôn tiền", "buồn bã", "buồn lòng", "buồn ngủ", "buồn nôn", "buồn phiền", "buồn rượi", "buồn tẻ", "buồn tênh", "buồn thiu", "buồn tình", "buông lỏng", "buông miệng", "buông tay", "buông trôi", "buông tuồng", "buông xõng", "buông xuôi", "buồng đào", "buồng giấy", "buồng không", "buồng khuê", "buồng lái", "buồng máy", "buồng tối", "bụp", "bụt mọc", "buýt", "bứ", "bứ bự", "bứ cổ", "bứ họng", "bừa bộn", "bừa cào", "bừa chữ nhi", "bừa chữ nhi", "bừa đĩa", "bữa chén", "bữa cổ", "bữa tiệc", "bứa", "bức bối", "bức cung", "bức hại", "bức hiếp", "bức hôn", "bức rút", "bức thiết", "bức tử", "bức xạ", "bức xạ kế", "bức xạ kế", "bức xúc", "bực", "bực dọc", "bực mình", "bưng biền", "bừng bừng", "bước đầu", "bước đi", "bước hụt", "bước lướt", "bước nhảy vọt", "bưởi đào", "bưởi đường", "bươm", "bướm", "bướm ong", "bươn", "bương", "bướng bỉnh", "bướu giáp", "bướu gù", "bưu ảnh", "bưu phẩm", "bửu bối", "ca cẩm", "ca hát", "ca lâu", "ca múa", "ca nhi", "ca nương", "ca ra", "ca rô", "ca sĩ", "ca vịnh", "ca vũ kịch", "ca vũ kịch", "ca xướng", "cà cộ", "cà cuống", "cà cưỡng", "cà dái dê", "cà gỉ", "cà gĩ", "cà kê", "cà khổ", "cà là mèng", "cà lơ", "cà mèng", "cà niễng", "cà rà", "cà rịch cà tang", "cà rốt", "cà rỡn", "cà rùng", "cà thọt", "cà tím", "cà tưng", "cà tửng", "cả bì", "cả đến", "cả thẹn", "cả tiếng", "cả tin", "cá biệt hoá", "cá biệt hoá", "cá bột", "cá bơn", "cá chày", "cá cháy", "cá chim", "cá chuối", "cá chuồn", "cá dưa", "cá đao", "cá đối", "cá gáy", "cá giếc", "cá heo", "cá lăng", "cá lóc", "cá lờn bơn", "cá lờn bơn", "cá măng", "cá ngừ", "cá nhám", "cá nhân chủ nghĩa", "cá nhân chủ nghĩa", "cá nheo", "cá nhụ", "cá nóc", "cá nước", "cá nược", "cá phèn", "cá quả", "cá rô", "cá rô Phi", "cá rô phi", "cá rô Phi", "cá rô phi", "cá rô thia", "cá song", "cá sộp", "cá tầm", "cá thia", "cá thờn bơn", "cá tính hoá", "cá tràu", "cá trích", "cá trôi", "cá vàng", "cá voi", "cá vược", "các vị", "cạc cạc", "cách bức", "cách điện", "cách điện hóa", "cách điệu hoá", "cách điệu hoá", "cách mạng hoá", "cách mạng hoá", "cách nhật", "cách quãng", "cách rách", "cách tân", "cách thủy", "cách trở", "cách xa", "cạch", "cai đầu dài", "cai sữa", "cai tổng", "cai tuần", "cải bắp", "cải bẹ", "cải biến", "cải cay", "cải củ", "cải dầu", "cải giá", "cải hoa", "cải lương", "cải mả", "cải nhiệm", "cải quá", "cải thiện", "cải tội danh", "cải trang", "cải trắng", "cải xoong", "cãi cọ", "cãi lẽ", "cãi vã", "cái đã", "cái giấm", "cam chanh", "cam đường", "cam giấy", "cam lộ", "cam sành", "cam tâm", "cam tẩu mã", "cảm hàn", "cảm khái", "cảm kích", "cảm lạnh", "cảm mạo", "cảm nắng", "cảm nghĩ", "cảm nhiễm", "cảm ơn", "cảm phong", "cảm quang", "cảm tạ", "cảm thán", "cảm thông", "cảm thụ", "cảm thương", "cảm tính", "cám hấp", "cạm", "can cớ", "can dự", "can gián", "can hệ", "can ke", "can ngăn", "càn khôn", "càn quấy", "cạn lời", "cạn túi", "càng hay", "canh cách", "canh cải", "canh chầy", "canh cửi", "canh gà", "canh giấm", "canh phòng", "canh riêu", "canh tàn", "canh thiếp", "canh ti", "cành cạch", "cành chiết", "cành ghép", "cành giâm", "cành la", "cành lá", "cành nhánh", "cảnh bị", "cảnh giới", "cảnh phông", "cảnh quan", "cảnh tình", "cảnh trí", "cảnh vật", "cảnh vệ", "cánh buồm", "cánh cam", "cánh cung", "cánh cứng", "cánh đều", "cánh gà", "cánh gián", "cánh giống", "cánh hẩu", "cánh hoa", "cánh khác", "cánh kiến", "cánh kiến trắng", "cánh kiến trắng", "cánh màng", "cánh môi", "cánh nửa", "cánh phấn", "cánh quạt", "cánh quân", "cánh sẻ", "cánh sen", "cánh thẳng", "cánh trả", "cánh úp", "cánh vảy", "cao ban long", "Cao Bằng", "cao dày", "cao đài", "cao đẹp", "cao điểm", "cao đỉnh", "cao độ kế", "cao độ kế", "cao đường", "cao giá", "cao học", "cao hổ cốt", "cao kế", "cao khiết", "cao lộc", "cao lớn", "cao ngất", "cao nghều", "cao ngồng", "cao nhã", "cao niên", "cao ốc", "cao phân tử", "cao ráo", "cao sản", "cao sang", "cao sĩ", "cao số", "cao sơn", "cao tay", "cao tần", "cao tầng", "cao thâm", "cao tốc", "cao trào", "cao vút", "cao xa", "cao xanh", "cào bằng", "cảo", "cảo luận", "cảo táng", "cáo bạch", "cáo già", "cáo hồi", "cáo hưu", "cáo lão", "cáo lui", "cáo tạ", "cáo tri", "cáp treo", "cạp nia", "cạp nong", "cát bá", "cát căn", "cát cứ", "cát đằng", "cát két", "cát nhật", "cát táng", "cát tuyến", "cát vần", "càu cạu", "cảu nhảu", "cáu bẳn", "cáu bẩn", "cáu cặn", "cáu ghét", "cáu sườn", "cay chua", "cay cú", "cay cực", "cay sè", "cày ải", "cày cục", "cày dầm", "cạy cục", "cắc", "cắc cớ", "căm gan", "căm ghét", "căm giận", "căm phẫn", "căm tức", "cắm", "cắm cổ", "cắm cúi", "cắm đất", "cắm đầu", "cắm mốc", "cắm ruộng", "cắm sừng", "căn bệnh", "căn cớ", "căn cứ địa", "căn cứ địa", "căn do", "căn hộ", "căn số", "căn thức", "cằn", "cằn cọc", "cẳn nhẳn", "cắn chỉ", "cắn màu", "cắn trắt", "cắn trộm", "căng óc", "cằng chân", "cẳng chân", "cắp đít", "cắp nách", "cặp ba lá", "cặp chì", "cặp díp", "cặp kèm", "cặp lồng", "cặp mạch", "cặp nhiệt", "cặp thai", "cặp tóc", "cắt băng", "cắt cổ", "cắt cụt", "cắt cử", "cắt khúc", "cắt lần", "cắt lời", "cắt lượt", "cắt ngắn", "cắt ruột", "cắt tiết", "cấc", "cấc lấc", "câm mồm", "cầm bằng", "cầm bút", "cầm càng", "cầm chân", "cầm chầu", "cầm cố", "cầm hạc", "cầm hơi", "cầm nắm", "cầm như", "cầm quân", "cầm thư", "cầm tinh", "cầm trịch", "cẩm bào", "cẩm châu", "cấm binh", "cấm cẳn", "cấm cung", "cấm dục", "cấm đoán", "cấm phòng", "cấm vệ", "cân đai", "cân đĩa", "cân đo", "cân hơi", "cân kẹo", "cân lực", "cân móc hàm", "cân nặng", "cân quắc", "cân ta", "cân tây", "cân thiên bình", "cân thư", "cân trẻ em", "cần cấp", "cần câu", "cần cẩu", "cần dùng", "cần lao", "cần sa", "cần ta", "cần tây", "cần trục", "cần vẹt", "cần vương", "cần yếu", "cẩn cáo", "cẩn tắc", "cẩn thận", "cẩn trọng", "cận địa", "cận huống", "cận kim", "cận lai", "cận lâm sàng", "cận nhật", "cận nhiệt đới", "cận thần", "cận xích đạo", "câng", "câng câng", "cẫng", "cấp bách", "cấp bậc", "cấp bộ", "cấp cao", "cấp phát", "cấp phí", "cấp tốc", "cập", "cập kèm", "cập kênh", "cất binh", "cất bước", "cất cánh", "cất cao", "cất chức", "cất công", "cất cơn", "cất dọn", "cất đầu", "cất giọng", "cất mả", "cất miệng", "cất mộ", "cất quân", "cất quyền", "cất vó", "cật sức", "câu", "câu cú", "câu dầm", "câu đầu", "câu giam", "câu kéo", "câu kết", "câu liêm", "câu lưu", "câu nệ", "câu nói", "câu rê", "câu rút", "câu vắt", "cầu ao", "cầu bơ cầu bất", "cầu cạn", "cầu chúc", "cầu chui", "cầu cống", "cầu danh", "cầu dao", "cầu duyên", "cầu đảo", "cầu đường", "cầu hàng không", "cầu hiền", "cầu hoà", "cầu hòa", "cầu hồn", "cầu khẩn", "cầu khấn", "cầu kinh", "cầu lông", "cầu may", "cầu mắt", "cầu phao", "cầu phong", "cầu phương", "cầu quay", "cầu siêu", "cầu tài", "cầu tàu", "cầu thang", "cầu thân", "cầu toàn", "cầu treo", "cầu trượt", "cầu vai", "cầu viện", "cầu vinh", "cầu vòng", "cẩu trệ", "cấu âm", "cấu chí", "cấu kiện", "cấu trúc", "cấu tứ", "cấu tượng", "cấu véo", "cấu xé", "cậu ấm", "cây bông", "cây bút", "cây cối", "cây nêu", "cây nước", "cây thịt", "cây xanh", "cầy", "cầy giông", "cầy hương", "cầy móc cua", "cầy móc cua", "cậy cục", "cha anh", "cha cả", "cha chả", "cha chú", "cha cố", "cha đẻ", "cha nuôi", "cha ông", "cha xứ", "chà đạp", "chả bù", "chả chớt", "chả là", "chả rán", "chả viên", "chạ", "chạc", "chai bố", "chai dạn", "chài bài", "chài lưới", "chái", "chạm chìm", "chạm cốc", "chạm cữ", "chạm mặt", "chạm ngõ", "chạm nọc", "chạm trổ", "chạm vía", "chan", "chan chan", "chan chán", "chan chát", "chan hoà", "chán ăn", "chán bứ", "chán chê", "chán chết", "chán chưa", "chán chường", "chán đời", "chán ngán", "chán ngắt", "chán ngấy", "chán phè", "chán tai", "chàng trai", "chạng", "chanh chòi", "chanh cốm", "chanh đào", "chanh yên", "chành", "chành bành", "chánh chủ khảo", "chánh hội", "chánh sứ", "chánh tổng", "chánh văn phòng", "chạnh", "chao đảo", "chao đèn", "chao ôi", "chào đón", "chào đời", "chào hàng", "chào hỏi", "chào mào", "chào mừng", "cháo ám", "cháo hoa", "cháo quẩy", "chạo rạo", "chát xít", "chạt", "chau", "chảu", "cháu dâu", "cháu đích tôn", "cháu ngoại", "cháu nội", "cháu rể", "chay tịnh", "chày cối", "chày kình", "chảy rữa", "chảy thây", "cháy bùng", "cháy đen", "cháy sém", "chạy chợ", "chạy điện", "chạy giấy", "chạy hiệu", "chạy làng", "chạy loạn", "chạy quanh", "chạy rà", "chạy rông", "chạy tang", "chạy theo", "chạy tiền", "chạy ùa", "chạy vạy", "chạy việc", "chạy vụt", "chắc chắn", "chắc chân", "chắc dạ", "chắc hẳn", "chắc lép", "chặc", "Chăm", "chăm bón", "chăm chắm", "chăm chỉ", "chăm chút", "chăm lo", "chằm chặp", "chằm vằm", "chăn chiếu", "chăn dắt", "chăn thả", "chằn tinh", "chẵn lẻ", "chặn", "chặn đầu", "chặn đứng", "chặn giấy", "chặn hậu", "chặn họng", "chặn tay", "chăng nữa", "chằng chéo", "chẳng ai", "chẳng bao giờ", "chẳng bao lâu nữa", "chẳng bằng", "chẳng bù", "chẳng cần", "chẳng chi", "chẳng cứ", "chẳng dè", "chẳng gì", "chẳng hề", "chẳng hề gì", "chẳng hề gì", "chẳng là", "chẳng lẽ", "chẳng nề", "chẳng nữa", "chẳng qua", "chẳng quản", "chẳng ra gì", "chẳng sao", "chẳng trách", "chẳng vừa", "chắp vá", "chắt chiu", "chậc", "châm chích", "châm chọc", "châm chước", "châm cứu", "chầm", "chầm bập", "chầm chậm", "chầm chập", "chẩm", "chấm chấm", "chấm công", "chấm hết", "chấm hỏi", "chấm lửng", "chấm mút", "chấm phần", "chấm phẩy", "chấm phết", "chấm than", "chậm rãi", "chậm trễ", "chân chấu", "chân chỉ", "chân chỉ hạt bột", "chân chỉ hạt bột", "chân chính", "chân đất", "chân giả", "chân giá trị", "chân giá trị", "chân giò", "chân không", "chân khớp", "chân kính", "chân mây", "chân như", "chân phương", "chân quỳ", "chân rết", "chân tay", "chân tâm", "chân thật", "chân thực", "chân trắng", "chân truyền", "chân tu", "chân vạc", "chân vịt", "chân xác", "chẩn bần", "chẩn bệnh", "chẩn đoán", "chẩn trị", "chấn", "chấn song", "chấn thương", "chấn tử", "chấp bút", "chấp cha chấp chới", "chấp chới", "chấp kinh", "chấp nê", "chấp nhặt", "chấp nhất", "chập", "chập chà chập choạng", "chập chà chập chờn", "chập tối", "chất béo", "chất cha chất chưởng", "chất cháy", "chất chưởng", "chất dẻo", "chất đạm", "chất đốt", "chất khoáng", "chất liệu", "chất lỏng", "chất lượng", "chất lưu", "chất nổ", "chất rắn", "chất xám", "chật chà chật chưỡng", "chật chội", "chật chưỡng", "chật hẹp", "châu mai", "chầu rìa", "chầu văn", "chẩu", "chẫu chàng", "chẫu chuộc", "chấu", "chây", "chây lười", "che giấu", "che lấp", "chè hạt", "chè hương", "chè lá", "chè mạn", "chè nụ", "chẽ", "chem chép", "chèm chẹp", "chen lấn", "chèn lấn", "chẹn", "cheo chéo", "chèo bẻo", "chèo kéo", "chèo queo", "chéo go", "chét", "chê chán", "chê trách", "chế dục", "chế định", "chế phẩm", "chệch", "chệch choạc", "chễm chện", "chếnh choáng", "chết cha", "chết chóc", "chết chửa", "chết điếng", "chết đứng", "chết mệt", "chết xác", "chi bộ", "chi chít", "chi cục", "chi dùng", "chi điếm", "chi li", "chi tiêu", "chi viện", "chì chiết", "chỉ bảo", "chỉ dẫn", "chỉ dụ", "chỉ điểm", "chỉ giáo", "chỉ huy phó", "chỉ huy phó", "chỉ huy trưởng", "chỉ huy trưởng", "chỉ nam", "chỉ số", "chỉ thiên", "chỉ tiêu", "chỉ trỏ", "chỉ vẽ", "chí cha chí chát", "chí chát", "chí choé", "chí ít", "chí nguyện", "chí nguyện quân", "chí nguyện quân", "chí sĩ", "chí thiết", "chí thú", "chí tình", "chí tôn", "chí tử", "chị em", "chị hằng", "chia cắt", "chia li", "chia phôi", "chia rẽ", "chia sẻ", "chia tay", "chia xẻ", "chìa vôi", "chiêm chiếp", "chiêm nghiệm", "chiêm tinh học", "chiêm tinh học", "chiếm cứ", "chiếm đóng", "chiếm hữu", "chiếm lĩnh", "chiền", "chiền chiện", "chiến công", "chiến cụ", "chiến cuộc", "chiến hạm", "chiến lợi phẩm", "chiến lũy", "chiến sự", "chiến thuyền", "chiến tích", "chiến tuyến", "chiến xa", "chiếp", "chiết xuất", "chiết yêu", "chiêu an", "chiêu binh", "chiêu đãi sở", "chiêu đãi sở", "chiêu hiền", "chiêu hồi", "chiêu hồn", "chiểu", "chiếu bóng", "chiếu điện", "chim chích", "chim chóc", "chim gáy", "chim ngói", "chim ri", "chim sâu", "chim sẻ", "chìm đắm", "chìm nghỉm", "chín cây", "chín mé", "chín muồi", "chín suối", "chinh chiến", "chinh phạt", "chinh phu", "chinh phụ", "chinh phục", "chình", "chỉnh đốn", "chỉnh hình", "chỉnh huấn", "chỉnh lưu", "chỉnh tề", "chỉnh thể", "chĩnh chện", "chính", "chính biến", "chính chuyên", "chính đảng", "chính đáng", "chính phủ", "chính quy", "chính quy hoá", "chính quyền", "chính sách", "chính tả", "chính thể", "chính thức", "chính thức hoá", "chính trị", "chính trị gia", "chính trị phạm", "chính trị viên", "chít chít", "chíu chít", "chịu đực", "chịu đựng", "chịu phép", "chịu trống", "cho hay", "cho nên", "chò", "chỏ", "chó biển", "chó đểu", "chó má", "chó săn", "chóa", "choai", "choài", "choãi", "choái", "choang", "choáng lộn", "choắt", "chọc lét", "chọc tiết", "chọc tức", "choé", "choẹt", "choi choi", "choi chói", "chói loà", "chói lọi", "chọi gà", "chòm sao", "chòm xóm", "chõm", "chõm chọe", "chon von", "chỏn hỏn", "chọn lựa", "chong chong", "chòng", "chỏng chơ", "chỏng gọng", "chỏng kềnh", "chỏng lỏn", "chóng mặt", "chòong", "chóp", "chóp bu", "chóp chép", "chốc chốc", "chốc lát", "chối cãi", "chôm chôm", "chồm chỗm", "chồm hỗm", "chôn cất", "chôn chân", "chồn lòng", "chông chênh", "chồng chất", "chồng chéo", "chổng kềnh", "chống chếnh", "chống chọi", "chống cự", "chống đối", "chống đỡ", "chột", "chơ chỏng", "chơ vơ", "chờ đợi", "chớ chi", "chớ hề", "chớ kể", "chợ búa", "chợ chiều", "chợ đen", "chợ phiên", "chơi đùa", "chơi gái", "chơi ngang", "chơi trèo", "chơi trội", "chơi vơi", "chơm chớp", "chờm", "chớp bóng", "chợp", "chợp mắt", "chu", "chu chuyển", "chu du", "chu tất", "chu toàn", "chu trình", "Chu Văn An", "chủ bài", "chủ biên", "chủ chiến", "chủ chốt", "chủ đạo", "chủ đích", "chủ định", "chủ động", "chủ hoà", "chủ hộ", "chủ hôn", "chủ khảo", "chủ ngữ", "chủ nhân", "chủ nhân ông", "chủ nhân ông", "chủ nhật", "chủ nô", "chủ nợ", "chủ quản", "chủ sự", "chủ tâm", "chủ thầu", "chủ thể", "chủ tịch đoàn", "chủ tịch đoàn", "chủ toạ", "chủ tướng", "chủ xướng", "chủ ý", "chú dẫn", "chú mày", "chú mình", "chú mục", "chú tâm", "chú thích", "chú trọng", "chua chát", "chua ngoa", "chua ngọt", "chùa chiền", "chúa công", "chúa nhật", "chúa tể", "chúa trời", "chuẩn chi", "chuẩn hoá", "chuẩn mực", "chuẩn mực hoá", "chuẩn mực hoá", "chuẩn tướng", "chuẩn úy", "chúc thọ", "chúc tụng", "chuệch choạc", "chui luồn", "chui rúc", "chúi đầu", "chúi mũi", "chum chúm", "chũm", "chũm chọe", "chúm", "chúm chím", "chun", "chũn chĩn", "chung chạ", "chung chung", "chung cục", "chung đúc", "chung đụng", "chung quanh", "chung quy", "chung thẩm", "chung thân", "chủng tộc", "chúng mình", "chúng ta", "chúng tôi", "chuồi", "chuối hoa", "chuối sợi", "chuội", "chuồng tiêu", "chuột bạch", "chuột chù", "chuột chũi", "chuột cống", "chuột đồng", "chuột lang", "chuột nhắt", "chụp đèn", "chụp mũ", "chút chít", "chút ít", "chút xíu", "chụt", "chuyên chế", "chuyên chở", "chuyên chú", "chuyên dùng", "chuyên đề", "chuyên hoá", "chuyên khảo", "chuyên khoa", "chuyên môn", "chuyên môn hoá", "chuyên môn hoá", "chuyên ngành", "chuyên nghiệp", "chuyên tâm", "chuyên tu", "chuyên viên", "chuyển bánh", "chuyển biên", "chuyển biến", "chuyển bụng", "chuyển chữ", "chuyển dạ", "chuyển di", "chuyển đạt", "chuyển giao", "chuyển hoá", "chuyển khoản", "chuyển ngành", "chuyển ngữ", "chuyển nhượng", "chuyển tự", "chuyển vần", "chuyển vị", "chuyện trò", "chuyện vãn", "chư", "chữ bát", "chữ chi", "chữ điền", "chữ nghĩa", "chữ ngũ", "chữ nhật", "chữ nho", "chữ nôm", "chữ quốc ngữ", "chữ số", "chứ lại", "chứ lị", "chưa chừng", "chưa hề", "chữa chạy", "chữa thẹn", "chứa chấp", "chứa chất", "chức danh", "chức dịch", "chức năng", "chức phận", "chức sắc", "chức trách", "chức tước", "chức vị", "chửi bới", "chửi mắng", "chửi rủa", "chưng cất", "chưng diện", "chừng nào", "chừng như", "chửng", "chững", "chứng bệnh", "chứng cớ", "chứng cứ", "chứng dẫn", "chứng giám", "chứng khoán", "chứng minh thư", "chứng minh thư", "chứng tá", "chứng thực", "chứng tỏ", "chứng từ", "chưởi", "chườm", "chưởng bạ", "chướng khí", "chướng ngại vật", "chướng ngại vật", "chượp", "co giật", "co kéo", "co quắp", "co ro", "co vòi", "cò cò", "cò con", "cò cử", "cò cưa", "cò ke", "cò kè", "cò rò", "cỏ bạc đầu", "cỏ cây", "cỏ chân nhện", "cỏ chân nhện", "cỏ cú", "cỏ gà", "cỏ gấu", "cỏ gianh", "cỏ lào", "cỏ mần trầu", "cỏ mật", "cỏ rả", "cỏ sâu róm", "cỏ vê", "cỏ voi", "có của", "có điều", "có hậu", "có học", "có khi", "có mang", "có mặt", "có nhân", "có thai", "có tình", "có tuổi", "cóc cách", "cóc khô", "cóc nhảy", "cóc tía", "cọc cạch", "coi bộ", "coi nhẹ", "coi sóc", "coi thường", "còi cọc", "cõi bờ", "còm cõi", "còm cọm", "còm nhom", "con bé", "con bệnh", "con buôn", "con cà con kê", "con cái", "con chạch", "con cháu", "con chiên", "con con", "con cón", "con đen", "con đỏ", "con em", "con gái", "con giai", "con lắc", "con mẹ", "con mọn", "con một", "con người", "con nhà", "con nít", "con nợ", "con nước", "con rối", "con rơi", "con so", "con tạo", "con tính", "con trai", "còn lại", "còn như", "còn xơi", "cọn", "cong cóc", "cong cớn", "cong đuôi", "cuốc", "d-ộng từ", "d-ộng từ", "d-ộng từ", "d-ộng từ", "d-ộng từ", "d-ộng từ", "d-ộng từ", "d-ộng từ", "dành dụm", "dảnh", "Dao", "dao ăn", "dao bài", "dao bào", "dao bầu", "dao cau", "dao cày", "dao cầu", "dao ngôn", "dao nhíp", "dao pha", "dao phay", "dao quắm", "dao rựa", "dào", "dào dạt", "dạo bước", "dạo gót", "dạt dào", "dàu dàu", "day dứt", "dày cộm", "dày công", "dày dạn", "dày dặn", "dảy", "dạy dỗ", "dạy đời", "dạy học", "dạy kèm", "dạy kê", "dạy khôn", "dặc dặc", "dặm hồng", "dặm khơi", "dặm liễu", "dặm nghìn", "dặm phần", "dăn", "dăn deo", "dăn dúm", "dằn dỗi", "dằn mặt", "dặn dò", "dăng", "dằng dai", "dặng hắng", "dắt bóng", "dắt dẫn", "dắt dây", "dắt gái", "dắt mũi", "dặt", "dặt dìu", "dâm bôn", "dâm dấp", "dâm dục", "dâm họa", "dâm ngôn", "dâm tà", "dấm", "dậm dật", "dân bẹp", "dân binh", "dân cày", "dân chài", "dân chính", "dân chủ hóa", "dân chủ hóa", "dân cử", "dân dã", "dân dấn", "dân doanh", "dân dụng", "dân đen", "dân gian", "dân làng", "dân lập", "dân nghèo", "dân nguyện", "dân phong", "dân phòng", "dân quốc", "dân số", "dân tâm", "dân thầy", "dân thợ", "dân thường", "dân tình", "dân tộc chủ nghĩa", "dân tộc chủ nghĩa", "dân tộc hoá", "dân tộc học", "dân tộc học", "dân tộc tính", "dân tộc tính", "dân trí", "dân túy", "dân vệ", "dân y", "dân ý", "dần dà", "dẫn cưới", "dẫn dụ", "dẫn đầu", "dẫn độ", "dẫn đường", "dẫn giải", "dẫn hỏa", "dẫn xác", "dẫn xuất", "dấn bước", "dấn thân", "dấn vốn", "dận", "dấp da dấp dính", "dấp dính", "dấp giọng", "dập tắt", "dập vùi", "dật sí", "dâu bể", "dâu con", "dâu rượu", "dâu tằm", "dâu tây", "dầu ăn", "dầu cao", "dầu con hổ", "dầu con hổ", "dầu cù là", "dầu dãi", "dầu hôi", "dầu khí", "dầu lòng", "dầu mỡ", "dầu nhờn", "dầu sao", "dầu ta", "dầu tây", "dầu thánh", "dầu vậy", "dầu xăng", "dẫu", "dẫu rằng", "dẫu sao", "dấu ấn", "dấu gạch ngang", "dấu gạch nối", "dấu giáng", "dấu hai chấm", "dấu hoa thị", "dấu hoa thị", "dấu hỏi", "dấu huyền", "dấu lăn tay", "dấu lược", "dấu mũ", "dấu ngoặc đơn", "dấu ngoặc kép", "dấu ngoặc vuông", "dấu niêm", "dấu nối", "dấu than", "dấu thánh", "dấu thăng", "dấu thị thực", "dấu tích", "dậu", "dây bọc", "dây câu", "dây chằng", "dây chun", "dây cót", "dây cung", "dây dẫn", "dây dọi", "dây dợ", "dây đất", "dây điện", "dây mũi", "dây mực", "dây nói", "dây oan", "dây phơi", "dây sống", "dây thép", "dây thép gai", "dây tóc", "dây tơ hồng", "dấy nghĩa", "dấy quân", "dậy đất", "dậy mùi", "de", "dè bỉu", "dè chừng", "dè dụm", "dè đâu", "dè sẻn", "dẽ", "dẽ dàng", "dẽ gà", "dẽ giun", "dẽ tính", "dé", "dèn dẹt", "deo", "deo dẻo", "dẻo chân", "dẻo dang", "dẻo mồm", "dẻo quẹo", "dẹt", "dê diếu", "dễ chừng", "dễ gì", "dễ hiểu", "dễ nghe", "dễ ngươi", "dễ ợt", "dễ sợ", "dễ thường", "dễ tính", "dế dũi", "dền", "dềnh", "dềnh dang", "dềnh dàng", "dệt kim", "di cảo", "di căn", "di chỉ", "di chiếu", "di chứng", "di cốt", "di dịch", "di dưỡng", "di hại", "di hận", "di huấn", "di lụy", "di mệnh", "di ngôn", "di tản", "di tặng", "di tật", "di thực", "di tinh", "di truyền học", "di truyền học", "di xú", "dĩ chí", "dí", "dí dỏm", "dị bản", "dị dưỡng", "dị đồng", "dị giáo", "dị hình", "dị hóa", "dị hướng", "dị tật", "dị tộc", "dị tướng", "dị ứng", "dịch âm", "dịch bản", "dịch giọng", "dịch hoàn", "dịch mã", "dịch tễ học", "dịch tễ học", "dịch thuật", "dịch vị", "dịch vụ", "diếc", "diêm dân", "diêm dúa", "diêm điền", "diêm phủ", "diêm sinh", "diêm tiêu", "diềm", "diềm bâu", "diễm sử", "diễn âm", "diễn biến", "diễn ca", "diễn cảm", "diễn đài", "diễn đơn", "diễn giảng", "diễn nghĩa", "diễn tập", "diễn tấu", "diễn tiến", "diễn từ", "diễn xuất", "diện đàm", "diện kiến", "diếp", "diếp cá", "diếp xoăn", "diệp", "diệp lục", "diệp thạch", "diệt cỏ", "diệt sinh", "diệt sinh thái", "diệt sinh thái", "diệt trừ", "diệt xã hội", "diều mướp", "diễu", "diễu võ dương oai", "diệu kế", "diệu võ dương oai", "dim", "dím", "dinh cơ", "dinh dính", "dinh lũy", "dĩnh ngộ", "dính dấp", "dính kết", "dính líu", "dính mép", "dính ngón", "díp", "dìu dịu", "díu", "dịu giọng", "dịu hiền", "dịu ngọt", "do đó", "dò dẫm", "dó", "doa", "doá", "dọa dẫm", "doãi", "doạng", "doanh điền", "doanh số", "doanh thu", "doành", "dọc dưa", "dọc dừa", "dọc mùng", "dòi", "dọi", "dòm dỏ", "dóm", "dón", "dọn ăn", "dọn bàn", "dọn dẹp", "dọn hàng", "dong", "dong riềng", "dòng chảy", "dòng châu", "dòng dõi", "dòng điện", "dòng giống", "dòng tên", "dòng thuần", "dỏng", "dõng", "dọng", "dọp", "dô", "dô ta", "dỗ dành", "dỗ mồi", "dốc đứng", "dốc ngược", "dốc ống", "dốc túi", "dôi", "dỗi", "dối dá", "dồn nén", "dốn", "dông tố", "dốt nát", "dột nát", "dơ bẩn", "dơ dáy", "dơ đời", "dở bữa", "dở chừng", "dở dang", "dở người", "dở òm", "dở tay", "dớ da dớ dẩn", "dợ", "dơi muỗi", "dơi quạ", "dơi quỷ", "dời chân", "dời gót", "dởm", "du canh", "du cư", "du học", "du học sinh", "du học sinh", "du lãm", "du nhập", "du thủ du thực", "du thủ du thực", "du thuyết", "du xích", "dù dì", "dù rằng", "dù sao", "dục anh đường", "dục năng", "dùi đục", "dũi", "dúi", "dụi", "dúm", "dúm dó", "dụm", "dun", "dún", "dung", "dung lượng", "dung mạo", "dung môi", "dung nạp", "dung nham", "dung quang", "dung sai", "dung tha", "dung tích", "dung tục", "dũng khí", "dũng tướng", "dúng", "dụng binh", "dụng công", "dụng tâm", "dụng võ", "duốc", "duối", "duy cảm", "duy danh", "duy linh", "duy ngã", "duy nhất", "duy tâm", "duy tâm luận", "Duy Tân", "duy trí", "duy vật luận", "duy ý chí", "duyên dáng", "duyên do", "duyên giang", "duyên nợ", "duyên phận", "duyên số", "dư ba", "dư dả", "dư dật", "dư đảng", "dư địa chí", "dư hạ", "dư thừa", "dừ", "dử", "dữ da", "dữ dội", "dữ đòn", "dữ liệu", "dự báo", "dự bị", "dự chi", "dự khuyết", "dự kiến", "dự liệu", "dự luật", "dự mưu", "dự phòng", "dự thảo", "dự thẩm", "dự thính", "dự thu", "dự tính", "dự trữ", "dự ứng lực", "dưa chuột", "dưa đỏ", "dưa góp", "dưa hành", "dưa hồng", "dưa lê", "dưa món", "dưa muối", "dưa tây", "dừa cạn", "dừa nước", "dứa dại", "dựa dẫm", "dức", "dứng", "dược điển", "dược khoa", "dược phẩm", "dược phòng", "dược tá", "dược thảo", "dược tính", "dương cực", "dương danh", "dương gian", "dương mai", "dương thế", "dương xỉ", "dường như", "dưỡng bệnh", "dưỡng dục", "dưỡng khí", "dưỡng lão", "dưỡng lão viện", "dưỡng lão viện", "dưỡng mẫu", "dưỡng nữ", "dưỡng phụ", "dưỡng sức", "dưỡng thai", "dưỡng thần", "dưỡng trấp", "dướng", "dứt điểm", "đa âm tiết", "đa bội", "đa canh", "đa cực", "đa dạng", "đa đa", "đa đinh", "đa đoan", "đa hình", "đa hộc", "đa huyết", "đa khoa", "đa liên", "đa nghĩa", "đa phần", "đa phu", "đa phương", "đa quốc gia", "đa sinh tố", "đa sự", "đa tạ", "đa tài", "đa thọ", "đa tiết", "đa trị", "đa túc", "đà đận", "Đà Lạt", "Đà Nẵng", "đả động", "đả đớt", "đả phá", "đả thông", "đã đời", "đã giận", "đã khát", "đã là", "đã rồi", "đã thèm", "đã vậy", "đá bảng", "đá bọt", "đá cuội", "đá dăm", "đá đít", "đá đưa", "đá gà", "đá giăm", "đá lat", "đá màu", "đá nam châm", "đá ngầm", "đá nhám", "đá ong", "đá phấn", "đá phiến", "đá tai mèo", "đá thử vàng", "đách", "đai ốc", "đai truyền", "đài các", "đài điếm", "đài gương", "đãi đằng", "đãi nghĩa", "đái đường", "đái nhắt", "đái tật", "đái tháo", "đái tội", "đại bác", "đại bại", "đại bản doanh", "đại bàng", "đại biến", "đại biện", "đại biểu", "đại binh", "đại cà sa", "đại châu", "đại chiến công", "đại chiến công", "đại chúng hóa", "đại chúng hóa", "đại công nghiệp", "đại công nghiệp", "đại công phu", "đại công phu", "đại cục", "đại danh", "đại doanh", "đại dương", "đại đảm", "đại đăng khoa", "đại gia", "đại gia đình", "đại gia đình", "đại gia súc", "đại gia súc", "đại gian ác", "đại gian hùng", "đại hàn", "đại hình", "đại hội", "đại hội đồng", "đại hội đồng", "đại hồng phúc", "đại hồng thủy", "đại hùng tinh", "đại mạch", "đại não", "đại náo", "đại ngàn", "đại nghị", "đại nghịch", "đại ngôn", "đại nguyên soái", "đại nhân", "đại nho", "đại số", "đại số học", "đại sứ", "đại sứ quán", "đại sự", "đại tu", "đại từ", "đại tự", "đam", "đàm", "đàm suyến", "đảm đang", "đảm nhiệm", "đảm phụ", "đám bạc", "đám đông", "đám rước", "đám tang", "đan lát", "đan quế", "đan tâm", "đan trì", "đàn anh", "đàn cò", "đàn địch", "đàn đúm", "đàn em", "đàn hương", "đàn nguyệt", "đàn nhị", "đàn ống", "đàn tam thập lục", "đàn thập lục", "đàn tràng", "đàn tranh", "đản bạch", "đạn ghém", "đang khi", "đang tay", "đang tâm", "đang thì", "đàng", "đàng điếm", "đàng hoàng", "đàng xa", "đảng cương", "đảng phái", "đảng phí", "đảng sử", "đảng tịch", "đảng tính", "đảng trị", "đảng trưởng", "đãng tính", "đãng trí", "đáng đời", "đáng giá", "đáng kiếp", "đáng lẽ", "đáng số", "đáng tiền", "đáng tội", "đanh", "đanh thép", "đành", "đành dạ", "đành đạch", "đành hanh", "đành phận", "đành rằng", "đành vậy", "đánh bả", "đánh bạc", "đánh bài", "đánh bạo", "đánh bạt", "đánh bắt", "đánh bật", "đánh bẫy", "đánh bò cạp", "đánh cá", "đánh cắp", "đánh chác", "đánh chén", "đánh cuộc", "đánh dây thép", "đánh đai", "đánh đàng xa", "đánh đắm", "đánh đập", "đánh điện", "đánh đòn", "đánh đổ", "đánh đố", "đánh đôi", "đánh đồng", "đánh đống", "đánh động", "đánh đơn", "đánh đùng", "đánh đụng", "đánh giặc", "đánh giậm", "đánh gió", "đánh giờ", "đánh gục", "đánh hỏng", "đánh hôi", "đánh hơi", "đánh kem", "đánh lộng", "đánh máy", "đánh môi", "đánh ngã", "đánh nhau", "đánh nhịp", "đánh phấn", "đánh tháo", "đánh thắng", "đánh thốc", "đánh thông", "đánh thuốc độc", "đánh thuốc mê", "đánh tiếng", "đánh tráo", "đánh trống", "đánh trống lảng", "đánh trống lảng", "đánh trống lấp", "đánh trống lấp", "đánh trống ngực", "đánh trống ngực", "đánh trượt", "đánh úp", "đánh vảy", "đánh vật", "đánh võ", "đánh võng", "đánh vỡ", "đánh xe", "đao binh", "đao kiếm", "đao phủ", "đao thương", "đào bới", "đào kép", "đào kiểm", "đào lộn hột", "đào lộn hột", "đào luyện", "đào mỏ", "đào nguyên", "đào nhiệm", "đào nương", "đào sâu", "đào tẩu", "đào thải", "đảo chính", "đảo lộn", "đảo ngói", "đảo vũ", "đáo đầu", "đáo nhiệm", "đạo chích", "đạo cô", "đạo diễn", "đạo đức học", "đạo đức học", "đạo giáo", "đạo hàm", "đạo hữu", "đạo mạo", "đạo ôn", "đạo tặc", "đáp án", "đáp số", "đáp từ", "đáp ứng", "đạp bằng", "đạp mái", "đạp thanh", "đạt lai lạt ma", "đau bão", "đau bụng", "đau đáu", "đau đầu", "đau đẻ", "đau mắt", "đau nau", "đau ốm", "đau xót", "đay đảy", "đày ải", "đày tớ", "đắc cử", "đắc dụng", "đắc đạo", "đắc địa", "đắc lợi", "đắc lực", "đắc nhân tâm", "đắc sách", "đắc thế", "đắc ý", "đặc ân", "đặc cách", "đặc công", "đặc điểm", "đặc hiệu", "đặc hữu", "đặc khu", "đặc kịt", "đặc lợi", "đặc phí", "đặc quyền", "đặc san", "đặc sản", "đặc sắc", "đặc sệt", "đặc sứ", "đặc thù", "đặc thù hóa", "đặc thù hóa", "đặc vụ", "đặc xá", "đăm", "đăm chiêu", "đăm đăm", "đằm", "đằm thắm", "đắm mình", "đắm say", "đằn", "đặn", "đăng bạ", "đăng đài", "đăng đàn", "đăng đắng", "đăng đồ", "đăng đối", "đăng khoa", "đăng tải", "đăng trình", "đằng ấy", "đằng đẵng", "đằng hắng", "đằng la", "đằng này", "đằng thằng", "đằng trương", "đằng vân", "đẳng cấu", "đẳng hướng", "đẳng lập", "đắng cay", "đắng nghét", "đặng", "đắp điếm", "đắp đổi", "đắt chồng", "đắt đỏ", "đắt hàng", "đắt khách", "đắt lời", "đặt bày", "đặt chuyện", "đặt cọc", "đặt để", "đặt điều", "đặt giá", "đặt hàng", "đặt lưng", "đặt tiền", "đặt vòng", "đâm bổ", "đâm bông", "đâm chồi", "đâm đầu", "đâm hông", "đâm ra", "đâm sầm", "đầm đìa", "đẫm máu", "đấm đá", "đấm họng", "đấm mõm", "đậm đặc", "đậm nét", "đần độn", "đấng", "đập lại", "đập tan", "đập tràn", "đập vỡ", "đất bãi", "đất cát", "đất hiếm", "đất hoang", "đất hứa", "đất khách", "đất màu", "đất mùn", "đất nặng", "đất nhẹ", "đất nung", "đất nước", "đất sét", "đất sứ", "đâu có", "đâu dám", "đâu đâu", "đâu đây", "đâu đấy", "đâu nào", "đầu bò", "đầu cánh", "đầu cầu", "đầu đàn", "đầu đạn", "đầu đơn", "đầu gà", "đầu gió", "đầu gối", "đầu hàng", "đầu hôm", "đầu lòng", "đầu mặt", "đầu mấu", "đầu não", "đầu nậu", "đầu óc", "đầu ối", "đầu quân", "đầu rau", "đầu rìu", "đầu ruồi", "đầu sai", "đầu sỏ", "đầu tay", "đầu thai", "đầu thú", "đầu tiên", "đầu xanh", "đẩu", "đấu dịu", "đấu đá", "đấu giao hữu", "đấu gươm", "đấu loại", "đấu pháp", "đấu thầu", "đấu thủ", "đấu tố", "đấu trí", "đấu xảo", "đây đẩy", "đây đó", "đây này", "đầy ặp", "đầy bụng", "đầy cữ", "đầy đặn", "đầy đẫy", "đầy hơi", "đầy ói", "đầy ối", "đầy phè", "đầy rẫy", "đầy ruột", "đầy tháng", "đầy tớ", "đầy tràn", "đầy tuổi", "đẩy đưa", "đẩy lùi", "đẩy mạnh", "đẫy đà", "đẫy giấc", "đẫy túi", "đậy điệm", "đe loi", "đẻ hoang", "đẻ non", "đẻ rơi", "đem lòng", "đem sang", "đem thân", "đem theo", "đen bạc", "đen đen", "đen đét", "đen đỏ", "đen đủi", "đen giòn", "đen nghịt", "đen ngòm", "đen nhánh", "đen sì", "đèn bão", "đèn bấm", "đèn chiếu", "đèn chớp", "đèn đất", "đèn đỏ", "đèn đóm", "đèn đuốc", "đèn măng sông", "đèn sách", "đèn treo", "đèn trời", "đèn xanh", "đẹn", "đèo bòng", "đèo đẽo", "đèo hàng", "đẽo gọt", "đéo", "đẹp duyên", "đẹp đẽ", "đẹp đôi", "đẹp lão", "đẹp mã", "đẹp mặt", "đẹp trai", "đẹp ý", "đẹt", "đê", "đê điều", "đê mạt", "đê mê", "đê nhục", "đê quai", "đê tiện", "đề án", "đề bạt", "đề cao", "đề cập", "đề cương", "đề dẫn", "đề dụ", "đề đạt", "đề đốc", "đề hình", "đề huề", "đề kháng", "đề khởi", "đề lại", "đề mục", "đề tài", "đề tặng", "đề từ", "đề tựa", "đề vịnh", "đề xuất", "để bụng", "để chế", "để cho", "để của", "để kháng", "để không", "để lòng", "để lộ", "để mà", "để mắt", "để mặt", "để tang", "đế", "đế chế", "đế đô", "đế hiệu", "đế kinh", "đế vị", "đệ", "đếch", "đêm hôm", "đêm khuya", "đêm tối", "đêm trắng", "đêm trường", "đếm chác", "đếm xỉa", "đệm đàn", "đền bồi", "đền bù", "đền chùa", "đền đài", "đền đáp", "đền mạng", "đền ơn", "đền rồng", "đến cùng", "đến điều", "đến giờ", "đến ngày", "đến nỗi", "đến nơi", "đến tháng", "đến thế", "đến thì", "đềnh đoàng", "đểnh đoảng", "đễnh đoãng", "đệp", "đều đặn", "đều đều", "đểu cáng", "đểu giả", "đi biệt", "đi bộ đội", "đi bộ đội", "đi cầu", "đi chân", "đi chân đất", "đi củi", "đi đái", "đi đày", "đi đất", "đi đêm", "đi đôi", "đi đời", "đi đứng", "đi giải", "đi khỏi", "đi kiết", "đi lại", "đi lính", "đi nằm", "đi nghỉ", "đi ngoài", "đi qua", "đi ra", "đi sâu", "đi tả", "đi tắt", "đi tây", "đi tiêu", "đi tiểu", "đi tơ", "đi tu", "đi tù", "đi tuần", "đi tướt", "đi văng", "đi vòng", "đì đẹt", "đì đùng", "đĩ bợm", "đĩ điếm", "đĩ đực", "đĩ miệng", "đĩ rạc", "đĩ thõa", "đĩ tính", "đĩ trai", "đỉa", "đĩa", "địa bạ", "địa bàn", "địa bộ", "địa các", "địa chánh", "địa chấn", "địa chấn học", "địa chấn học", "địa chấn kế", "địa chấn kế", "địa chấn ký", "địa chất", "địa chi", "địa chí", "địa chính", "địa chủ", "địa cực", "địa danh", "địa dư", "địa đầu", "địa đồ", "địa giới", "địa hóa học", "địa mạo", "địa ốc", "địa ốc ngân hàng", "địa phương", "địa sinh", "địa thế", "địa từ", "địa vực", "địa y", "đích đáng", "đích mẫu", "đích thân", "đích thị", "đích thực", "đích tôn", "đích xác", "địch", "địch hậu", "địch họa", "địch quân", "địch thủ", "điếc", "điểm", "điếm", "điên", "điên cuồng", "điên dại", "điên điển", "điên khùng", "điên loạn", "điên rồ", "điên tiết", "điền", "điển", "điển tích", "điện", "điện thoại", "điện thoại viên", "điện tích", "điện từ", "điện từ học", "điện tử", "điện tử học", "điệp", "điêu", "điêu trá", "điều", "điều khoản", "điều kiện", "điều luật", "điều tra", "điều ước", "điếu", "điệu", "đinh ba", "đinh bạ", "đinh ghim", "đinh hương", "đinh khuy", "đình bản", "đình chỉ", "đình cứu", "đình hoãn", "đình huỳnh", "đình khôi", "đình nguyên", "đình thần", "đình thí", "đỉnh chung", "đĩnh đạc", "đính chính", "đính giao", "đính ước", "định canh", "định đề", "định đoạt", "định giá", "định hạn", "định hình", "định hồn", "định kiến", "định lệ", "định liệu", "định lượng", "định mệnh", "định mức", "định ngữ", "định phận", "định sở", "định thần", "định thức", "định ước", "đìu", "địu", "đo đạc", "đo đất", "đo lường", "đò đưa", "đò giang", "đò ngang", "đỏ au", "đỏ bừng", "đỏ chói", "đỏ chót", "đỏ đắn", "đỏ đen", "đỏ đèn", "đỏ đọc", "đỏ gay", "đỏ hây", "đỏ hoe", "đỏ hỏn", "đỏ mặt", "đỏ tía", "đó đây", "đọ gươm", "đoá", "đoài", "đoan trang", "đoan trinh", "đoàn bộ", "đoàn trưởng", "đoản", "đoản đao", "đoản hậu", "đoản mạch", "đoản mệnh", "đoản thiên", "đoán chừng", "đoán già", "đoán mò", "đoán phỏng", "đoạn đầu đài", "đoạn hậu", "đoạn mại", "đoạn nhiệt", "đoạn tang", "đoành", "đoạt vị", "đóc", "đoi", "đòi hỏi", "đói bụng", "đói kém", "đói khó", "đói khổ", "đói ngấu", "đòm", "đỏm", "đỏm dáng", "đóm", "đon", "đòn bẩy", "đòn gió", "đòn rồng", "đòn triêng", "đòn vọt", "đòn xeo", "đòn xóc", "đón chào", "đón đầu", "đón đưa", "đón đường", "đón rào", "đón rước", "đón tay", "đón ý", "đong đưa", "đòng", "đòng đòng", "đóng băng", "đóng bộ", "đóng chai", "đóng chóc", "đóng chốt", "đóng dấu", "đóng đai", "đóng đinh", "đóng đô", "đóng họ", "đóng kịch", "đóng phim", "đóng quân", "đóng vai", "đóng vảy", "đóng yên", "đót", "đô", "đô đốc", "đô hội", "đô sát", "đô thành", "đô thị hóa", "đô thị hóa", "đô thống", "đô trưởng", "đô úy", "đồ án", "đồ bản", "đồ biểu", "đồ chừng", "đồ cổ", "đồ cúng", "đồ dùng", "đồ đá", "đồ đảng", "đồ đệ", "đồ đồng", "đồ giả", "đồ gốm", "đồ họa", "đồ nho", "đồ sắt", "đồ sộ", "đồ sứ", "đồ tang", "đồ thán", "đồ thị", "đồ thư quán", "đồ thư quán", "đồ thừa", "đồ tồi", "đồ uống", "đồ vật", "đổ bác", "đổ bể", "đổ bệnh", "đổ bộ", "đổ dồn", "đổ đồng", "đổ hồi", "đổ khuôn", "đổ lỗi", "đổ mồ hôi", "đổ nát", "đổ nhào", "đổ quanh", "đổ riệt", "đổ thừa", "đỗ đạt", "đố chữ", "độ chừng", "độ đường", "độ khẩu", "độ kinh", "độ lượng", "độ thế", "độ trì", "độ trước", "độ ví", "độ vong", "đốc", "đốc chứng", "đốc học", "đốc phủ sứ", "đốc suất", "đốc thúc", "đốc tờ", "độc ẩm", "độc bản", "độc bình", "độc canh", "độc chất", "độc chất học", "độc chất học", "độc chiếm", "độc đáo", "độc đạo", "độc đinh", "độc đoán", "độc kế", "độc miệng", "độc mộc", "độc quyền", "độc tấu", "độc thần giáo", "độc thần giáo", "độc thoại", "độc tính", "độc tố", "độc tôn", "độc trời", "độc vận", "đôi ba", "đôi bên", "đôi chút", "đôi hồi", "đôi lứa", "đôi mách", "đôi mươi", "đôi nam", "đôi nam nữ", "đôi nam nữ", "đôi nữ", "đôi ta", "đôi tám", "đồi mồi", "đồi tệ", "đồi trụy", "đổi công", "đổi đời", "đổi giọng", "đổi lẫn", "đổi mới", "đổi ý", "đối cách", "đối chất", "đối chiếu", "đối chọi", "đối chứng", "đối kháng", "đối lưu", "đối phương", "đối sách", "đối thoại", "đối thủ", "đối trọng", "đối tượng", "đối xử", "đội bảng", "đội hình", "đội lốt", "đội ngũ", "đội quân", "đội sổ", "đội trưởng", "đôm đốm", "đôm đốp", "đôm độp", "đôn", "đôn đốc", "đồn ải", "đồn bót", "đồn đại", "đồn điền", "đồn lũy", "đồn thú", "đồn trại", "đồn trưởng", "đốn đời", "đốn mạt", "độn tóc", "đông bán cầu", "đông bán cầu", "đông bắc", "đông chí", "đông cung", "đông dân", "đông du", "đông dược", "đông đặc", "Đông Đô", "đông đủ", "đông khô lạnh", "đông lân", "đông nghịt", "đồng tác giả", "đồng vị ngữ", "đồng vị ngữ", "đổng", "đổng nhung", "động binh", "động cấn", "động chạm", "động cỡn", "động danh từ", "động dao", "động dục", "động dụng", "động đậy", "động đĩ", "động đực", "động hình", "động học", "động mạch", "động tâm", "động tiên", "động tình", "động tĩnh", "động tính từ", "động tính từ", "động từ", "động vật chí", "động vật chí", "động vật học", "động vật học", "đốp", "đốp chát", "độp", "đốt cháy", "đốt phá", "đốt sống", "đốt vía", "đột biến", "đột khởi", "đột ngột", "đột nhập", "đột nhiên", "đột phá", "đột phá khẩu", "đột phá khẩu", "đột phát", "đột tử", "đơ", "đỡ dậy", "đỡ đần", "đỡ đẻ", "đỡ lời", "đỡ nhẹ", "đỡ thì", "đớ", "đớ họng", "đớ lưỡi", "đời người", "đời thuở", "đời tư", "đợi chờ", "đợi thời", "đơm", "đơm đặt", "đơn âm", "đơn bạc", "đơn bản vị", "đơn bội", "đơn ca", "đơn chất", "đơn chiếc", "đơn cử", "đơn điệu", "đơn độc", "đơn giản", "đơn giản hóa", "đơn kiện", "đơn thuần", "đơn thuốc", "đơn thức", "đơn tiết", "đơn tính", "đơn từ", "đơn tử", "đờn", "đớn", "đớn đời", "đớn kiếp", "đớn mạt", "đợp", "đớt", "đu bay", "đu đủ", "đu đủ tía", "đu đủ tía", "đù", "đù đà đù đờ", "đù đờ", "đủ điều", "đủ mặt", "đủ số", "đủ trò", "đú", "đú đa đú đởn", "đú đởn", "đú mỡ", "đua chen", "đua ngựa", "đua thuyền", "đua tranh", "đùa bỡn", "đùa dai", "đùa giỡn", "đũa bếp", "đũa cả", "đũa khuấy", "đúc sẵn", "đúc tiền", "đục khoét", "đục ngầu", "đui mù", "đùi non", "đũi", "đùm bọc", "đùm đụp", "đun đẩy", "đun nấu", "đùn", "đung đưa", "đùng", "đùng đoàng", "đùng đùng", "đủng đa đủng đỉnh", "đủng đỉnh", "đũng", "đúng đắn", "đúng hạn", "đúng lúc", "đúng mức", "đúng mực", "đụng chạm", "đụng đầu", "đụng độ", "đuốc hoa", "đuốc tuệ", "đuôi gà", "đuôi mắt", "đuôi nheo", "đuôi sam", "đuôi tàu", "đuôi tôm", "đuổi cổ", "đuối", "đuối hơi", "đuỗn", "đụp", "đút nút", "đút túi", "đừ", "đứ", "đứ đừ", "đưa cay", "đưa chân", "đưa dâu", "đưa đà", "đưa đám", "đưa đẩy", "đưa ma", "đứa", "đứa ở", "đức", "đức cha", "đức dục", "đức độ", "đức hạnh", "đức ông", "đức tin", "đực mặt", "đứng bóng", "đứng dậy", "đứng đắn", "đứng đầu", "đứng đường", "đứng giá", "đứng gió", "đứng lên", "đứng tuổi", "đước", "được lòng", "được lời", "được mùa", "được nước", "được thể", "được việc", "đượm", "đượm đà", "đườn", "đương", "đương đại", "đương kim", "đương nhiệm", "đương quy", "đương sự", "đương thì", "đương thời", "đương triều", "đường băng", "đường bệ", "đường biên", "đường biển", "đường cái", "đường cái quan", "đường cái quan", "đường cày", "đường chéo", "đường chim bay", "đường cùng", "đường dây", "đường đạn", "đường đất", "đường đi", "đường đường", "đường huyền", "đường kính", "đường lối", "đường mòn", "đường ngôi", "đường phố", "đường sá", "đường sắt", "đường tắt", "đường thẳng", "đường thắng", "đường tránh", "đường tròn", "đường vòng", "đường xoắn ốc", "đường xoi", "đường xuôi", "đứt đuôi", "đứt gãy", "đứt hơi", "đứt quãng", "đứt ruột", "e sợ", "e thẹn", "é", "éc", "em bé", "em em", "em nuôi", "em rể", "em út", "em vợ", "eng éc", "eo óc", "eo ôi", "eo sèo", "èo à éo ẹt", "èo èo", "èo éo", "èo ọt", "éo ẹt", "éo ợt", "ép xác", "ê chệ", "ê ê", "ê mặt", "ề", "ế ẩm", "êm ắng", "êm êm", "êm ru", "ềnh ềnh", "ếnh", "ếnh bụng", "ệnh", "êu", "êu êu", "êu ôi", "gai gốc", "gai ngạnh", "gai sốt", "gam", "gan liền", "gang tay", "gang tấc", "gang thép", "ganh", "ganh gổ", "ganh tị", "gạo tẻ", "gạt bỏ", "gạt gẫm", "gạt tàn", "gạy", "gằm", "gằm gằm", "gắm ghé", "gặm mòn", "gằn", "gắn xi", "găng tay", "gắng công", "gắng gỏi", "gắng gổ", "gắng gượng", "gặng", "gặng hỏi", "gắp thăm", "gặp dịp", "gặp phải", "gặp thời", "gắt gao", "gắt mù", "gặt hái", "gấc", "gầm ghì", "gầm gừ", "gầm trời", "gấm vóc", "gậm", "gân cổ", "gân guốc", "gần bên", "gần đến", "gần gặn", "gần gụi", "gần kề", "gần như", "gấp gáp", "gấp ngày", "gập", "gập gà gập ghềnh", "gật đầu", "gật gà gật gù", "gật gà gật gưỡng", "gật gù", "gâu gâu", "gầu", "gẫu", "gây chiến", "gây chuyện", "gây gấy", "gây gổ", "gây hấn", "gây lộn", "gây mê", "gây nhiễu", "gây rối", "gầy mòn", "gầy nhom", "gấy sốt", "gậy gộc", "gậy tày", "gen", "ghe chài", "ghẻ lở", "ghé lưng", "ghé mắt", "ghé tai", "ghé vai", "ghém", "ghen ăn", "ghen ngược", "ghen tị", "ghen tuông", "ghen tức", "ghèn", "ghép mộng", "ghét bỏ", "ghét mặt", "ghê ghê", "ghê gớm", "ghê hồn", "ghê người", "ghê răng", "ghê rợn", "ghế bố", "ghế chao", "ghế dựa", "ghế ngựa", "ghế tựa", "ghế xích đu", "ghểnh", "ghệt", "ghi chú", "ghi công", "ghi lòng", "ghi nhận", "ghi tạc", "ghi tên", "ghi ý", "gỉ đồng", "gí", "gia ân", "gia bảo", "gia biến", "gia bộc", "gia cầm", "gia chính", "gia chủ", "gia cố", "gia cư", "gia cường", "gia dĩ", "gia dụng", "gia đạo", "gia đình trị", "gia đình trị", "gia đồng", "gia giảm", "gia giáo", "gia huấn", "gia hương", "gia nô", "gia ơn", "gia pháp", "gia quyến", "gia sư", "gia sự", "gia tâm", "gia thần", "gia thất", "gia thế", "gia tiên", "gia tố", "gia tộc", "gia tư", "gia từ", "già cả", "già cấc", "già câng", "già cỗi", "già đời", "già giang", "già giận", "già họng", "già khọm", "già khụ", "già làng", "già láo", "già mồm", "già nua", "già sọm", "già tay", "già yếu", "giả bửa", "giả cách", "giả cầy", "giả da", "giả dạng", "giả dụ", "giả đạo đức", "giả đò", "giả hiệu", "giả hình", "giả ngơ", "giả như", "giả tảng", "giả tạo", "giả thác", "giả thiết", "giả thử", "giả trá", "giả trang", "giả vờ", "giã ơn", "giá bán", "giá bán buôn", "giá bán lẻ", "giá biểu", "giá dụ", "giá mà", "giá mua", "giá như", "giá phỏng", "giá sử", "giá thành", "giá thú", "giá thử", "giá treo cổ", "giá trị", "giá vé", "giác độ", "giác nút", "giai", "giai điệu", "giai gái", "giai phẩm", "giai tầng", "giai thoại", "giai vị", "giải ách", "giải binh", "giải buồn", "giải cấu", "giải đáp", "giải độc", "giải giáp", "giải hoà", "giải lạm phát", "giải lao", "giải mã", "giải muộn", "giải nghệ", "giải ngũ", "giải nguyên", "giải nhiệm", "giải oan", "giải phẩu", "giải phiền", "giải phóng quân", "giải phóng quân", "giải sầu", "giải thoát", "giải thưởng", "giải tích", "giải tỏ", "giải trừ", "giải vây", "giãi", "giãi giề", "giái âm", "giại", "giam cầm", "giam cứu", "giam giữ", "giam hãm", "giam lỏng", "giảm bớt", "giảm chấn", "giảm nhiễm", "giảm thiểu", "giảm thọ", "giảm tốc", "giám", "giám biên", "giám binh", "giám định viên", "giám định viên", "giám hiệu", "giám hộ", "giám má", "giám quốc", "giám sinh", "gian ác", "gian giảo", "gian hàng", "gian hiểm", "gian hùng", "gian khổ", "gian lao", "gian lận", "gian lậu", "gian nan", "gian thần", "giàn giáo", "giàn giụa", "giàn hoả", "giản chính", "giản đồ", "giản đơn", "giản đơn hoá", "giản đơn hoá", "giản lậu", "giản ước", "giản xương", "giản yếu", "gián cách", "gián đoạn", "gián hoặc", "gián thu", "giang biên", "giang hà", "giang khê", "giang tân", "giảng dạy", "giảng đàn", "giảng hòa", "giảng nghĩa", "giảng thuật", "giảng viên", "giáng cấp", "giáng chỉ", "giáng chức", "giáng hạ", "giáng họa", "giáng phàm", "giáng thế", "giáng trần", "giáng trật", "giạng", "giạng háng", "gianh", "giành giật", "giảnh", "giao ban", "giao binh", "giao bóng", "giao cảm", "giao cảnh", "giao du", "giao đấu", "giao hảo", "giao hẹn", "giao hiếu", "giao hoàn", "giao hội", "giao kèo", "giao kết", "giao long", "giao lương", "giao lưu", "giao nộp", "giao phối", "giao tế", "giao thoa", "giao thông hào", "giao thông hào", "giao tiếp", "giao tranh", "giao tuyến", "giao tử", "giào", "giảo hoạt", "giáo chủ", "giáo chức", "giáo dục học", "giáo dục học", "giáo đồ", "giáo giở", "giáo giới", "giáo hoá", "giáo học", "giáo hội", "giáo huấn", "giáo hữu", "giáo mác", "giáo tài", "giáo thụ", "giáo trình", "giáo vụ", "giáp bảng", "giáp binh", "giáp chiến", "giáp công", "giáp giới", "giáp hạt", "giáp lá cà", "giáp ranh", "giáp sĩ", "giáp trạng", "giáp trận", "giáp vụ", "giáp xác", "giát", "giát giường", "giát lò", "giạt", "giàu có", "giàu sang", "giảu", "giày bốt", "giày cao cổ", "giày dép", "giày ống", "giày xéo", "giãy giụa", "giãy nẩy", "giăm", "giăm bào", "giăm bông", "giăm kèn", "giằm", "giắm gia giắm giằn", "giằng xé", "giặt giạ", "giặt giũ", "giặt là", "giấc điệp", "giấc hoa", "giấc hoè", "giấc mộng", "giấc nồng", "giấc tiên", "giấc xuân", "giẫm", "giẫm đạp", "giấm ghém", "giấm giúi", "giấm mật", "giậm chân", "giậm dọa", "giậm giật", "giần giật", "giận dỗi", "giận thân", "giập giờn", "giập mật", "giật lửa", "giật mình", "giật nóng", "giật thót", "giật xổi", "giâu gia", "giâu gia xoan", "giâu gia xoan", "giầu", "giấu giếm", "giấu mình", "giấu tên", "giấu tiếng", "giây giướng", "giây lát", "giây phút", "giẩy", "giấy ảnh", "giấy bản", "giấy bao gói", "giấy báo", "giấy bồi", "giấy bổi", "giấy bướm", "giấy chứng minh", "giấy chứng nhận", "giấy cói", "giấy da", "giấy da bê", "giấy da bê", "giấy đánh máy", "giấy đi đường", "giấy giá thú", "giấy hoa tiên", "giấy kẻ ô", "giấy khai sinh", "giấy khen", "giấy kính", "giấy lọc", "giấy lộn", "giấy moi", "giấy mời", "giấy nến", "giấy nháp", "giấy quỳ", "giấy quyến", "giấy ráp", "giấy sáp", "giấy tàu bạch", "giấy thấm", "giấy thiếc", "giấy tín chỉ", "giấy tờ", "giấy trang kim", "giấy viết thư", "giẻ cùi", "giẻ lau", "giẻ rách", "gié", "gièm giẹp", "gièm pha", "gien", "gieo cầu", "gieo neo", "gieo quẻ", "gieo trồng", "gieo vần", "giéo giắt", "giẹo giọ", "giẹp lép", "giếc", "giêng hai", "giềng", "giềng mối", "giếng khơi", "giếng thơi", "giết chóc", "giết người", "gio", "giò bì", "giò lụa", "giò mỡ", "giò thủ", "giò vàng", "gió bão", "gió bấc", "gió bụi", "gió đông", "gió heo may", "gió lào", "gió máy", "gió mưa", "gió trăng", "gió xoáy", "gioi", "giỏi giang", "gion giỏn", "giòn giã", "giòn tan", "gión", "gióng giả", "giọng điệu", "giọt châu", "giọt sành", "giô", "giồ", "giỗ chạp", "giỗ đầu", "giỗ hết", "giồi mài", "giổi", "giối", "giối giăng", "giôn giốt", "giông", "giông giống", "giồng", "giống hệt", "giộp", "giơ xương", "giờ cao điểm", "giờ chót", "giờ hồn", "giờ lâu", "giở", "giở chứng", "giở dạ", "giở giói", "giở giọng", "giở giời", "giở mặt", "giở mình", "giở quẻ", "giới chức", "giới luật", "giới nghiêm", "giới sát", "giới sắc", "giới tuyến", "giới tửu", "giới yên", "giu giú", "giua", "giun chỉ", "giun đốt", "giun móc", "giun sán", "giun tóc", "giun tròn", "giữ giàng", "giữ gìn", "giữ kẽ", "giữ lại", "giữ lễ", "giữ miếng", "giữ miệng", "giữ phép", "giữ rịt", "giữ tiếng", "giữ tiết", "giữ trẻ", "giữ vững", "giữ ý", "giương vây", "gò đống", "gò ép", "gõ kiến", "goá", "goá bụa", "góc cạnh", "góc tư", "gỏi ghém", "gói gắm", "gói ghém", "gọi cửa", "gọi hồn", "gọi là", "gọi lính", "gọi thầu", "gom góp", "gon", "gòn gọn", "gọn", "gọn ghé", "gọn lỏn", "gọn mắt", "gọng kìm", "gòong", "góp chuyện", "góp ý", "gót ngọc", "gót sắt", "gót sen", "gót son", "gót tiền", "gọt giũa", "gô", "gỗ bìa", "gỗ cây", "gỗ dác", "gỗ dán", "gỗ súc", "gốc gác", "gốc ghép", "gốc phần", "gốc rễ", "gốc tích", "gốc tử", "gộc", "gồi", "gối điệp", "gối loan", "gối vụ", "gối xếp", "gốm", "gông cùm", "gồng gánh", "gộp", "gơ", "gỡ đầu", "gỡ gạc", "gỡ mìn", "gỡ nợ", "gỡ tội", "gợi cảm", "gợi lại", "gợi ý", "gớm ghê", "gớm ghiếc", "gớm guốc", "gớm mặt", "gờn gợn", "gu", "gụ", "gục gặc", "gùn", "gùn ghè", "gùn gút", "guốc chẳn", "guốc lẻ", "guồng máy", "gửi rễ", "gươm giáo", "gườm gườm", "gương lõm", "gương lồi", "gương mặt", "gương nga", "gương phẳng", "gương sen", "gượng ép", "gượng gạo", "ha hả", "hà chính", "hà cố", "hà hơi", "hà khẩu", "hà lạm", "hà má", "Hà Nội", "hà tằn hà tiện", "hà tằn hà tiện", "hà tằng", "hà thủ ô", "hà thủ ô", "Hà Tiên", "Hà Tĩnh", "hà xa", "hả dạ", "hả hê", "hả hơi", "hả lòng", "há dễ", "há nỡ", "hạ bệ", "hạ bút", "hạ cam", "hạ công", "hạ cờ", "hạ giới", "hạ hồi", "hạ huyền", "Hạ Long", "hạ lưu", "hạ mã", "hạ màn", "hạ nang", "hạ nghị viện", "hạ ngục", "hạ sách", "hạ sát", "hạ tần", "hạ tầng", "hạ thủ", "hạ tiện", "hạ tuần", "hạ viện", "hách dịch", "hạch toán", "hai chấm", "hai mang", "hai mặt", "hai thân", "hài đàm", "hài đồng", "hài hoà", "hài nhi", "hải chiến", "hải dương học", "hải dương học", "hải đạo", "hải đường", "hải khẩu", "hải lục không quân", "hải miên", "hải ngạn", "hải quân lục chiến", "hải quân lục chiến", "hải quỳ", "hải sản", "hải sâm", "hải triều", "hải vẫn", "hãi hùng", "ham chuộng", "ham thích", "hàm ân", "hàm ếch", "hàm giả", "hàm lượng", "hàm oan", "hàm răng", "hàm thiếc", "hàm thụ", "hàm tiếu", "hàm ý", "hãm hiếp", "hãm tài", "hạm trưởng", "hàn điện", "hàn đới", "hàn hơi", "hàn khẩu", "hàn lâm", "hàn lâm viện", "Hàn luật", "hàn mặc", "hàn nho", "hàn thực", "hàn xì", "hán tự", "hán văn", "hạn canh", "hạn định", "hạn độ", "hạn mức", "hạn ngạch", "hang động", "hang hốc", "hang hùm", "hang ổ", "hàng ăn", "hàng binh", "hàng hiên", "hàng họ", "hàng hoá", "hàng khô", "hàng không mẫu hạm", "hàng không mẫu hạm", "hàng nước", "hàng phố", "hàng phục", "hàng quán", "hàng rong", "hàng tấm", "hàng thần", "hàng thịt", "hàng xách", "hàng xén", "hàng xứ", "hạng bình", "hạng mục", "hạng mục công trình", "hạng thứ", "hạng ưu", "hanh hao", "hành binh", "hành chính", "hành cung", "hành dinh", "hành doanh", "hành đạo", "hành hạt", "hành hung", "hành hương", "hành khúc", "hành kinh", "hành lễ", "hành nghề", "hành quyết", "hành sự", "hành tinh", "hành tội", "hành trang", "hành xác", "hạnh đào", "hạnh nhân", "hao phí", "hao tài", "hào chỉ", "hào lũy", "hào mục", "hào phú", "hào ván", "hảo hạng", "hảo hớn", "hảo ý", "hão huyền", "háo khí", "hạt dẻ", "hạt giống", "hạt lựu", "hạt nhân", "hạt trai", "hau háu", "háu", "hay biết", "hay chữ", "hay đâu", "hay hay", "hay ho", "hay hớm", "hay là", "hay làm", "hay nhỉ", "hay sao", "hắc ám", "hắc bạch", "hắc buá", "hắc lào", "hắc vận", "hăm dọa", "hăm hăm hở hở", "hăm hăm hở hở", "hăm he", "hằm hè", "hằm hừ", "hằn thù", "hẳn hoi", "hẳn hòi", "hẳn là", "hắn ta", "hăng đì", "hăng hắc", "hăng hăng", "hăng máu", "hăng say", "hăng tiết", "hằng đẳng thức", "hằng lượng", "hằng nga", "hằng tâm", "hằng tinh", "hẵng", "hâm hẩm", "hầm hào", "hầm hầm", "hầm hập", "hầm hè", "hầm hơi", "hầm hừ", "hầm lò", "hậm hà hậm hực", "hậm họe", "hậm hực", "hấn", "hận cừu", "hận thù", "hẫng", "hấp háy", "hấp him", "hấp ta hấp tấp", "hấp thu", "hập", "hất cẳng", "hất hàm", "hất hậu", "hầu bàn", "hầu bóng", "hầu kiện", "hầu như", "hầu sáng", "hầu tước", "hậu bị", "hậu binh", "hậu bổ", "hậu bối", "hậu cảnh", "hậu cần", "hậu chiến", "hậu cổ điển", "hậu cung", "hậu đãi", "hậu đại", "hậu đậu", "hậu đội", "hậu đường", "hậu nghiệm", "hậu phẫu", "hậu phi", "hậu quân", "hậu sinh", "hậu sự", "hậu tạ", "hậu tập", "hậu thân", "hậu thuẩn", "hậu thuộc địa", "hậu tiến", "hậu tình", "hậu tuyến", "hậu từ", "hậu vệ", "hậu viện", "hây hây", "hây hẩy", "hấy", "hè hụi", "hé", "héc ta", "hèm hẹp", "hen suyễn", "hèn chi", "hèn kém", "hèn nào", "hẹn ước", "heo hắt", "heo may", "heo vòi", "héo hon", "héo quắt", "hẹp bụng", "hê", "hề chi", "hề gì", "hề hấn", "hề hề", "hệ luận", "hệ lụy", "hệ số", "hệ thống hoá", "hệ thống hoá", "hệ từ", "hệch", "hềnh hệch", "hểnh", "hết cả", "hết cách", "hết đời", "hết lẽ", "hết lời", "hết mực", "hết nhẵn", "hết nước", "hết ráo", "hết sạch", "hết thảy", "hết thời", "hết trọi", "hết trơn", "hết trụi", "hết viá", "hết ý", "hệt", "hi hi", "hì", "hì hà hì hục", "hỉ", "hỉ sắc", "hỉ sự", "hỉ tín", "hỉ xả", "hí ha hí hoáy", "hí ha hí hửng", "hí hí", "hí húi", "hí hửng", "hí kịch", "hí viện", "hiềm", "hiềm khích", "hiềm thù", "hiềm vì", "hiểm địa", "hiểm hoạ", "hiểm hóc", "hiểm nguy", "hiểm trở", "hiểm yếu", "hiếm có", "hiếm gì", "hiếm hoi", "hiền đệ", "hiền đức", "hiền hậu", "hiền hoà", "hiền huynh", "hiền khô", "hiền lành", "hiền mẫu", "hiền muội", "hiền nhân", "hiền tài", "hiền thần", "hiền thê", "hiển đạt", "hiển hiện", "hiển linh", "hiển minh", "hiển thánh", "hiển vi", "hiển vinh", "hiến binh", "hiến dâng", "hiến định", "hiến kế", "hiến pháp hoá", "hiến pháp hoá", "hiến sinh", "hiến thân", "hiện đại hoá", "hiện đại hoá", "hiện giờ", "hiện hữu", "hiện sinh", "hiện thời", "hiện tiền", "hiện trường", "hiêng hiếng", "hiếp tróc", "hiệp khách", "hiệp lực", "hiệp nghị", "hiệp sĩ", "hiệp tác", "hiểu dụ", "hiểu thị", "hiếu chủ", "hiếu danh", "hiếu động", "hiếu hạnh", "hiếu học", "hiếu khách", "hiếu khí", "hiếu nghĩa", "hiếu sắc", "hiếu sinh", "hiếu sự", "hiếu thắng", "hiếu thuận", "hiếu tử", "hiệu dụng", "hiệu năng", "hiệu thế", "hiệu triệu", "him him", "hĩm", "hình", "hình dong", "hình dung từ", "hình dung từ", "hình hài", "hình họa", "hình hộp", "hình lập phương", "hình luật", "hình mẫu", "hình nhân", "hình nhi thượng học", "hình nón", "hình nổi", "hình nộm", "hình phạt", "hình quạt", "hình sự", "hình thang", "hình thế", "hình thù", "hình thức", "hình thức chủ nghiã", "hình thức chủ nghiã", "hình thức hoá", "hình thức hoá", "hình trạng", "hình tròn", "hình trụ", "hình tượng", "hiu hắt", "hiu hiu", "ho gió", "ho he", "ho khan", "hò hẹn", "hò hét", "hò khoan", "hò mái đẩy", "hó hé", "họ đạo", "họ đương", "họ mạc", "họ ngoại", "họ nội", "Hoa", "hoa bia", "hoa bướm", "hoa cà", "hoa cương", "hoa huệ", "hoa khôi", "hoa lơ", "hoa màu", "hoa mắt", "hoa mơ", "hoa ngôn", "hoa nguyệt", "hoa niên", "hoa râm", "hoa sen", "hoa sói", "hoa tai", "hoa tay", "hoa tiên", "hoa tím", "hoa tình", "hoa trà", "hoa văn", "hoa viên", "hoa xoè", "hoà", "hoà âm", "Hoà Bình", "hoà bình", "hoà giải", "hoà hoãn", "hoà tan", "hoả", "hoả bài", "hoả công", "hoả diệm sơn", "hoả hoạn", "hoả kế", "hoả lò", "hoả lực", "hoả tai", "hoả tiễn", "hoả tinh", "hoá", "hoá chất", "hoá công", "hoá dầu", "hoá dược", "hoá học", "hoá lỏng", "hoá phân", "hoá tính", "hoá trị", "hoạ", "họa căn", "họa chăng", "họa công", "họa hoằn", "họa là", "họa may", "họa vần", "hoác", "hoai", "hoài báo", "hoài cảm", "hoài của", "hoài phí", "hoài sơn", "hoài thai", "hoài xuân", "hoái", "hoại thân", "hoại tử", "hoan lạc chủ nghĩa", "hoan lạc chủ nghĩa", "hoan nghênh", "hoàn bị", "hoàn chỉnh", "hoàn đồng", "hoàn hảo", "hoàn hồn", "hoàn lương", "hoàn nguyên", "hoàn tán", "hoàn tục", "hoãn binh", "hoãn nợ", "hoãn xung", "hoán", "hoán cải", "hoạn đồ", "hoạn lộ", "hoạn quan", "hoang dã", "hoang đảo", "hoang địa", "hoang điền", "hoang hoác", "hoang mạc", "hoang thai", "hoang toàng", "hoang tưởng", "hoang vắng", "hoàng anh", "hoàng ân", "hoàng bào", "hoàng chủng", "hoàng đản", "hoàng đạo", "hoàng đế", "hoàng giáp", "hoàng hậu", "Hoàng Hoa Thám", "hoàng kim", "hoàng lan", "hoàng phái", "hoàng thái hậu", "hoàng thái hậu", "hoàng thái tử", "hoàng thái tử", "hoàng thành", "hoàng thất", "hoàng thiên", "hoàng thổ", "hoàng tinh", "hoàng tôn", "hoàng triều", "hoàng tuyền", "hoàng yến", "hoảng hồn", "hoành", "hoành cách mô", "hoành độ", "hoành phi", "hoảnh", "hoạnh", "hoạnh họe", "hoạnh phát", "hoạt", "hoạt chất", "hoạt đầu", "hoạt hình", "hoạt hoạ", "hoạt khẩu", "hoạt kịch", "hoạt lực", "hoạt thạch", "hoạt tính", "hoắc hương", "hoắc lê", "hoặc giả", "hoặc là", "hoắm", "hoăng", "hoăng hoắc", "hoẵng", "hóc hiểm", "học bạ", "học chính", "học cụ", "học đòi", "học gạo", "học hàm", "học hành", "học hiệu", "học hỏi", "học khóa", "học lỏm", "học mót", "học ôn", "học phái", "học phiệt", "học quan", "học sinh", "học tập", "học thuật", "học vần", "học vấn", "học vị", "hoe", "hoe hoe", "hoen", "hoen gỉ", "hoen ố", "hoi", "hoi hoi", "hỏi bài", "hỏi dồn", "hỏi gạn", "hỏi nhỏ", "hỏi thăm", "hỏi thi", "hỏi tội", "hỏi vặn", "hỏi vợ", "hom", "hom hem", "hom hỏm", "hòm hòm", "hỏm", "hõm", "hóm", "hóm hỉnh", "hon hỏn", "hòn đạn", "hỏn", "hỏn hẻn", "hong hóng", "hòng", "hỏng ăn", "hỏng bét", "hỏng hóc", "hỏng kiểu", "hỏng máy", "hóng", "hóng chuyện", "họp báo", "họp hành", "họp mặt", "hô hào", "hô hoán", "hô hố", "hồ cầm", "Hồ Chí Minh", "hồ điệp", "hồ hải", "hồ hởi", "hồ khẩu", "hồ lì", "hồ lô", "hồ lơ", "hồ quang", "hồ thỉ", "hồ thuỷ", "hồ tiêu", "hồ tinh", "hổ cốt", "hổ khẩu", "hổ lang", "hổ lốn", "hổ lửa", "hổ mang", "hổ phù", "hổ thân", "hổ trướng", "hổ tương", "hổ tướng", "hố tiêu", "hố xí", "hộ bộ", "hộ đê", "hộ giá", "hộ lại", "hộ mạng", "hộ mệnh", "hộ pháp", "hộ sản", "hộ sĩ", "hộ sinh", "hộ tang", "hốc mắt", "hốc xì", "hộc hà hộc hệch", "hộc hệch", "hộc máu", "hộc tốc", "hôi hổi", "hôi mồm", "hôi nách", "hôi rình", "hôi tanh", "hồi cư", "hồi dương", "hồi hương", "hồi hưu", "hồi kinh", "hồi lâu", "hồi loan", "hồi môn", "hồi nãy", "hồi phục", "hồi quy", "hồi sức", "hồi tâm", "hồi thanh", "hồi tị", "hồi tín", "hồi tố", "hồi trang", "hồi trước", "hồi ức", "hồi văn", "hồi xuân", "hổi", "hối cải", "hối hả", "hối phiếu", "hối quá", "hối tiếc", "hội ẩm", "hội diễn", "hội diện", "hội đàm", "hội giảng", "hội hè", "hội họa", "hội họp", "hội kiến", "hội kín", "hội nguyên", "hội sinh", "hội thảo", "hội thẩm", "hội thi", "hội thí", "hội thiện", "hội thoại", "hội tụ", "hội ý", "hôm kia", "hôm kìa", "hôm mai", "hôm này", "hôm nọ", "hôm qua", "hôm sau", "hôm sớm", "hôm xưa", "hôn ám", "hôn hít", "hôn lễ", "hôn nhân", "hôn phối", "hôn quân", "hôn thú", "hôn thư", "hôn ước", "hồn ha hổn hển", "hồn hậu", "hồn phách", "hồn thơ", "hồn vía", "hổn hển", "hỗn", "hỗn chiến", "hỗn hào", "hỗn hống", "hỗn hợp", "hỗn loạn", "hỗn mang", "hỗn nguyên", "hỗn quân hỗn quan", "hỗn quân hỗn quan", "hỗn tạp", "hỗn thực", "hỗn xược", "hộn", "hồng bạch", "hồng bì", "hồng cầu", "hồng đào", "hồng điều", "hồng hộc", "hồng hồng", "hồng huyết cầu", "hồng lâu", "hồng mao", "hồng ngâm", "hồng ngoại", "hồng nhung", "hồng quân", "hồng quần", "hồng sắc", "hồng thủy", "hồng trần", "hồng vận", "hồng xiêm", "hồng y", "hồng y giáo chủ", "hổng", "hổng hểnh", "hổng trôn", "hống hách", "hộp đêm", "hộp sọ", "hộp số", "hốt", "hốt nhiên", "hốt thuốc", "hột cơm", "hột xoài", "hột xoàn", "hơ hở", "hờ hững", "hở cơ", "hở hang", "hở môi", "hở ngực", "hở sườn", "hở vai", "hơi dâu", "hơi độc", "hơi đồng", "hơi hơi", "hơi hướng", "hơi men", "hơi ngạt", "hơi sức", "hởi", "hỡi", "hỡi ôi", "hợi", "hợm", "hơn hẳn", "hơn hớn", "hơn nữa", "hơn thế nữa", "hơn thua", "hờn", "hờn hợt", "hờn mát", "hợp bang", "hợp bào", "hợp cách", "hợp cẩn", "hợp doanh", "hợp hiến", "hợp lệ", "hợp nhất", "hợp pháp hóa", "hợp pháp hóa", "hợp phần", "hợp quần", "hợp tác", "hợp tác hoá", "hợp tác hoá", "hợp thiện", "hợp thời", "hợp thức", "hợp tuyển", "hợp xướng", "hợp ý", "hớt hải", "hớt lẻo", "hớt ngọn", "hu hu", "hù", "hủ", "hủ bại", "hủ hoá", "hủ lậu", "hủ nho", "hủ tiếu", "hú họa", "hú hồn", "hú tim", "hú vía", "huân tước", "huấn dụ", "huấn đạo", "huấn lệnh", "huấn luyện viên", "huấn luyện viên", "huấn thị", "huấn từ", "hục", "hục hặc", "huề", "Huế", "huệ cố", "huếch", "huếch hoác", "huênh hoang", "húi", "hum húp", "hùm", "hùm beo", "hũm", "hụm", "hun hút", "hủn hoẳn", "hung bạo", "hung đồ", "hung hãn", "hung hăng", "hung hung", "hung tàn", "hung tán", "hung thủ", "hung tinh", "hùng", "hùng cứ", "hùng dũng", "hùng hậu", "hùng hoàng", "hùng hổ", "hùng hồn", "hùng hục", "hùng khí", "hùng tài", "húng", "húng hắng", "húng lìu", "huống", "huống chi", "huống hồ", "hụp lặn", "hút bụi", "hút máu", "hút xách", "hũu sản", "húy", "húy nhật", "huých", "huỵch", "huyên", "huyên đường", "huyên thiên", "huyên truyền", "huyền ảo", "huyền chức", "huyền đề", "huyền hoặc", "huyền hồ", "huyền phù", "huyền sâm", "huyền thoại", "huyền vi", "huyện đoàn", "huyện đội", "huyện đường", "huyện ủy", "huyết áp kế", "huyết áp kế", "huyết cầu tố", "huyết cầu tố", "huyết chiến", "huyết học", "huyết lệ", "huyết mạch", "huyết sử", "huyết thanh", "huyết thống", "huyết thư", "huyết tương", "huynh ông", "huynh trưởng", "huỳnh", "huỳnh huỵch", "huỷnh", "huýt gió", "huýt sáo", "hư ảo", "hư cấu", "hư đốn", "hư đời", "hư hao", "hư hèn", "hư hỏng", "hư phí", "hư số", "hư truyền", "hư trương", "hư từ", "hư văn", "hư vị", "hư vinh", "hừ", "hừ hừ", "hử", "hứ", "hực", "hưng binh", "hưng hửng", "hưng khởi", "hưng phế", "hưng vượng", "hừng hực", "hửng", "hững", "hững hờ", "hứng chí", "hượm", "hương án", "hương ẩm", "hương chính", "hương chức", "hương cống", "hương dũng", "hương đăng", "hương hoa", "hương hỏa", "hương lão", "hương lân", "hương quan", "hương sen", "hương sư", "hương thí", "hương thôn", "hương trời", "hương tục", "hương ước", "hương vòng", "hường", "hưởng lạc", "hưởng thọ", "hưởng thụ", "hướng dẫn viên", "hướng dương", "hướng đạo", "hướng đạo sinh", "hướng đạo sinh", "hướng động", "hướng ngã", "hướng nghiệp", "hướng tâm", "hươu cao cổ", "hươu sao", "hưu binh", "hưu bổng", "hưu canh", "hưu non", "hưu thẩm", "hữu ái", "hữu dực", "hữu hảo", "hữu hiệu", "hữu hình", "hữu khuynh", "hữu ngạn", "hữu nghị", "hữu quan", "hữu thanh", "hữu tính", "hữu trách", "ì à ì ạch", "ì ầm", "ỉ eo", "í a í ới", "í ới", "ỉa chảy", "ỉa đái", "ỉa vào", "ích dụng", "ích mẫu", "ịch", "im ả", "im ắng", "im bặt", "im ỉm", "im mồm", "in hệt", "in ít", "in tay", "in thạch bản", "in thử", "ìn ịt", "ình bụng", "ình ịch", "ít bữa", "ít lâu", "ít lời", "ít nhất", "ít oi", "ít ra", "ít tuổi", "ịt", "ỉu xịu", "kè", "kè kè", "kè nhè", "kẻ cả", "kẻ chợ", "kẻ gian", "kẻ giờ", "kẻ khó", "kẻ nứt", "kẻ thù", "kẽ nách", "ké né", "kẹ", "kéc", "kèm cặp", "kèm nhèm", "kém cạnh", "kém cỏi", "kém hèn", "kém vế", "ken", "ken két", "kèn cựa", "kèn hát", "kèn hiệu", "kèn kẹt", "kèn lệnh", "kèn trống", "kèn túi", "kén chọn", "keng", "keng keng", "keo bẩn", "keo cú", "keo sơn", "kèo cò", "kèo kẹo", "kèo nèo", "kẻo", "kẻo mà", "kẻo nữa", "kẻo rồi", "kẽo kẹt", "kéo bộ", "kéo cánh", "kéo căng", "kéo cầy", "kéo cờ", "kéo gỗ", "kéo theo", "kẹo bánh", "kẹo mứt", "kê cứu", "kê giao", "kề cà", "kể chi", "kể lể", "kể ra", "kể tội", "kể trên", "kể từ", "kế cận", "kế chân", "kế đến", "kế hoạch hoá", "kế hoạch hoá", "kế hoạch hoá gia đình", "kế hoạch hoá gia đình", "kế mẫu", "kế nghiệp", "kế sách", "kế tập", "kế thất", "kế toán viên", "kế toán viên", "kế truyền", "kệ xác", "kếch", "kếch xù", "kệch", "kệch cỡm", "kền", "kền kền", "kênh kiệu", "kềnh càng", "kềnh kệnh", "kễnh", "kệnh", "kếp", "kết", "kết bạn", "kết bè", "kết cấu", "kết cuộc", "kết dính", "kết đoàn", "kết liểu", "kết mạc", "kết nghĩa", "kết oán", "kết thân", "kết tinh", "kết toán", "kết tội", "kết tủa", "kêu ca", "kêu cầu", "kêu cứu", "kêu gào", "kêu rêu", "kêu trời", "kêu van", "kều", "khà", "khà khà", "khả biến", "khả dĩ", "khả kính", "khả thủ", "khá khen", "khác biệt", "khác chi", "khác nào", "khạc nhổ", "khách địa", "khách khí", "khách mời", "khách thể", "khách tình", "khai căn", "khai chiến", "khai giảng", "khai hoa", "khai hoang", "khai hội", "khai huyệt", "khai khẩn", "khai khẩu", "khai khoáng", "khai mạc", "khai mào", "khai mỏ", "khai sáng", "khai sinh", "khai sơn", "khai thông", "khai triển", "khai trường", "khai vị", "khai xuân", "khải ca", "khải hoàn môn", "khải hoàn môn", "khái", "khái huyết", "khái luận", "khái quát hóa", "khám bệnh", "khám đường", "khám nhà", "khàn", "khàn khàn", "khản", "khản cổ", "khản tiếng", "khang an", "khang cường", "khang khác", "khang kháng", "khang kiện", "kháng cáo", "kháng cự", "kháng độc", "kháng độc tố", "kháng độc tố", "kháng khuẩn", "kháng nghị", "kháng nguyên", "kháng thể", "kháng từ", "khạng nạng", "khanh", "khanh khách", "khanh tướng", "khảnh", "khảnh ăn", "khánh hạ", "khánh tận", "khao binh", "khao quân", "khao thưởng", "khảo chứng", "khảo cổ học", "khảo cổ học", "khảo của", "khảo đính", "khảo nghiệm", "khảo quan", "khảo thí", "khảo tra", "khảo vấn", "kháo", "kháp", "khát khao", "khát nước", "khát sữa", "khau", "kháu khỉnh", "khay đèn", "khảy", "kháy", "khắc đồng", "khắc gỗ", "khắc nghiệt", "khắc nung", "khắc phục", "khắc sâu", "khặc khừ", "khăm", "khăm khắm", "khăn bàn", "khăn choàng", "khăn gói", "khăn khẳn", "khăn lau", "khăn mặt", "khăn mỏ quạ", "khăn ngang", "khăn quàng", "khăn tay", "khẳn", "khẳn tính", "khăng khăng", "khằng", "khẳng khái", "khẳng kheo", "khẳng khiu", "khâm mạng", "khâm sai", "khâm sứ", "khâm thiên giám", "khấm khá", "khẩn", "khẩn cầu", "khẩn hoang", "khẩn khoản", "khẩn nài", "khẩn thiết", "khẩn vái", "khẩn yếu", "khấp kha khấp khểnh", "khấp khểnh", "khấp khởi", "khập khà khập khiễng", "khập khiễng", "khất lần", "khất sĩ", "khất thực", "khật khà khật khừ", "khật khừ", "khâu chần", "khâu lược", "khâu tay", "khâu vá", "khâu vắt", "khẩu đội", "khẩu khí", "khẩu lệnh", "khẩu ngữ", "khẩu tài", "khẩu truyền", "khấu đuôi", "khẩy", "khe khẽ", "khè", "khè khè", "khẻ", "khẽ khàng", "khé cổ", "khẹc", "khem", "khen thưởng", "khèn", "kheo", "kheo khư", "khéo khỉ", "khéo léo", "khéo nói", "khéo tay", "khéo xoay", "khép kín", "khép nép", "khét lẹt", "khét tiếng", "khề khà", "khế ước", "khệ nệ", "khênh", "khềnh", "khểnh", "khêu gan", "khi không", "khi khu", "khi mạn", "khi nào", "khi nên", "khi quân", "khi trá", "khì", "khì khì", "khỉ đột", "khỉ già", "khỉ gió", "khí áp", "khí áp kế", "khí áp kế", "khí bẩm", "khí công", "khí động", "khí gió", "khí hiếm", "khí hóa", "khí huyết", "khí hư", "khí khái", "khí nhạc", "khí nổ", "khí quan", "khí sắc", "khí sinh", "khí tài", "khí thế", "khí tiết", "khí tính học", "khí trơ", "khí trời", "khí tượng học", "khí tượng học", "khí vật", "khí vị", "khía cạnh", "khích", "khích bác", "khiêm", "khiêm nhượng", "khiêm tốn", "khiếm khuyết", "khiên", "khiên cưỡng", "khiền", "khiển muộn", "khiêng vác", "khiễng", "khiếp đảm", "khiêu chiến", "khiếu oan", "khin khít", "khìn khịt", "khinh binh", "khinh dể", "khinh hạm", "khinh khi", "khinh khỉnh", "khinh mạn", "khinh miệt", "khinh nhờn", "khinh rẻ", "khinh suất", "khinh tài", "khinh thị", "khinh trọng", "khít khao", "khít khịt", "khịt", "khíu", "kho bạc", "kho báu", "kho khó", "khò khè", "khò khò", "khó bảo", "khó chơi", "khó dễ", "khó hiểu", "khó khuây", "khó nghe", "khó ngửi", "khó nhá", "khó nhằn", "khó nói", "khó nuốt", "khó thở", "khó thương", "khó tin", "khó tính", "khó trôi", "khó xử", "kho?", "khoa bảng", "khoa cử", "khoa đại", "khoa giáo", "khoa hoạn", "khoa học luận", "khoa học luận", "khoa mục", "khoa trường", "khoa trưởng", "khoả", "khoả thân", "khoá", "khoá", "khoá chữ", "khoá kéo", "khoá luận", "khoá miệng", "khoác lác", "khoai dong", "khoai đao", "khoai lang", "khoai môn", "khoai nưa", "khoai riềng", "khoai sáp", "khoai từ", "khoai vạc", "khoái chá", "khoái chí", "khoái hoạt", "khoái trá", "khoan đãi", "khoan hậu", "khoan hoà", "khoan khoái", "khoan nhượng", "khoan tay", "khoán", "khoán trắng", "khoang nhạc", "khoảng cách", "khoảng chừng", "khoảng không", "khoảng rộng", "khoáng", "khoáng dã", "khoáng dật", "khoáng đãng", "khoáng hoá", "khoáng vật", "khoanh tay", "khoanh vùng", "khoảnh", "khoảnh độc", "khoát", "khoát đạt", "khoáy", "khoăm", "khoằm", "khoắng", "khóc lóc", "khóc mướn", "khóc than", "khóc thầm", "khoe khoang", "khoe mẽ", "khoé", "khoe?", "khoe? khoắn", "khoe? mạnh", "khoeo", "khom khom", "khom khòm", "khòm", "khòng", "khô cạn", "khô cằn", "khô đét", "khô khan", "khô kháo", "khô khóc", "khổ chủ", "khổ công", "khổ cực", "khổ độc", "khổ học", "khổ luyện", "khổ nhục", "khổ nỗi", "khổ thân", "khổ vai", "khố đỏ", "khố lục", "khố vàng", "khốc", "khốc hại", "khôi giáp", "khôi nguyên", "khôi vĩ", "khối tình", "khôn cùng", "khôn hồn", "khôn lẽ", "khôn lớn", "khôn thiêng", "khôn xiết", "khốn", "khốn cùng", "khốn cực", "khốn đốn", "khốn khó", "khốn kiếp", "khốn nạn", "khốn quẫn", "không bào", "không chuyên", "không dưng", "không đâu", "không đổi", "không đối đất", "không đối không", "không đối không", "không kích", "không ngờ", "không ngớt", "không những", "không tặc", "không tập", "không trung", "không tưởng", "không vận", "khổng tước", "khống", "khống chỉ", "khơ khớ", "khờ dại", "khờ khạo", "khờ khĩnh", "khớ", "khơi chừng", "khơi diễn", "khơi mào", "khơi sâu", "khởi binh", "khởi đầu", "khởi điểm", "khởi động", "khởi hấn", "khởi loạn", "khởi nghĩa", "khởi nguyên", "khởi phát", "khởi sắc", "khởi sự", "khởi thảo", "khởi thủy", "khởi tố", "khớp răng", "khớp xương", "khu", "khu biệt", "khu hệ", "khu phố", "khu trú", "khu trục", "khu trục hạm", "khu trục hạm", "khu uỷ", "khu vực", "khu xử", "khụ", "khuẩn", "khuất", "khuất tất", "khuất thân", "khuất tiết", "khuây", "khuây khoả", "khuấy động", "khuấy rối", "khục", "khuê khổn", "khuê môn", "khuê nữ", "khuê phòng", "khuếch", "khum", "khum khum", "khung cảnh", "khung chậu", "khung cửi", "khung thành", "khủng khỉnh", "khuôn phép", "khuôn thiêng", "khuôn trăng", "khuôn xanh", "khuôn xếp", "khụt khịt", "khuy tết", "khuya khoắt", "khuya sớm", "khuyên giáo", "khuyên nhủ", "khuyên răn", "khuyển mã", "khuyển nho", "khuyển ưng", "khuyến dụ", "khuyến học", "khuyến nghị", "khuyến nông", "khuyến thiện", "khuyết danh", "khuyết tật", "khuyết tịch", "khuynh diệp", "khuynh gia bại sản", "khuynh hữu", "khuynh tả", "khuynh thành", "khư khư", "khừ khừ", "khử", "khứng", "khựng", "khước", "khươm năm", "khướt", "khướu", "khứu giác", "ki", "kì cạch", "kì cọ", "kí", "kia kìa", "kìa", "kích bác", "kích cỡ", "kích dục", "kịch chiến", "kịch cỡm", "kịch hoá", "kịch muá", "kịch ngắn", "kịch nói", "kịch phát", "kịch sĩ", "kịch thơ", "kịch tính", "kịch trường", "kịch vui", "kiêm ái", "kiêm dụng", "kiêm nhiệm", "kiềm hoả", "kiềm hoá", "kiềm tính", "kiểm chứng", "kiểm dịch", "kiểm điểm", "kiểm học", "kiểm kê", "kiểm lâm", "kiểm nghiệm", "kiểm phiếu", "kiểm sát", "kiểm sát trưởng", "kiểm sát trưởng", "kiểm soát viên", "kiểm soát viên", "kiểm thảo", "kiểm tra", "kiếm ăn", "kiếm chác", "kiếm chuyện", "kiếm cớ", "kiếm cung", "kiếm khách", "kiếm sống", "kiếm thuật", "kiệm", "kiệm ước", "kiên chí", "kiên nghị", "kiên tâm", "kiên tín", "kiên trì", "kiên trung", "kiền", "kiền khôn", "kiến giải", "kiến lập", "kiến quốc", "kiến tạo", "kiến tập", "kiến trúc sư", "kiến trúc sư", "kiến văn", "kiện cáo", "kiện khang", "kiện nhi", "kiện toàn", "kiện tụng", "kiêng cữ", "kiêng dè", "kiêng khem", "kiềng", "kiểng", "kiễng", "kiếng", "kiếp người", "kiết cú", "kiết xác", "kiệt", "kiệt lực", "kiệt tác", "kiệt xuất", "kiêu binh", "kiêu hãnh", "kiêu hùng", "kiêu ngạo", "kiều", "kiều bào", "kiều cư", "kiều hối", "kiều mạch", "kiều nhi", "kiều nương", "kiểu cách", "kiểu sức", "kiếu", "kiếu bệnh", "kiếu từ", "kim bản vị", "kim băng", "kim cải", "kim chỉ", "kim chỉ nam", "kim chỉ nam", "kim cổ", "kim cúc", "kim cương", "kim đan", "kim đồng", "kim găm", "kim hoàn", "kim hôn", "kim lan", "kim mã ngọc đường", "kim móc", "kim môn", "kim ngạch", "kim ngọc", "kim nhũ", "kim ốc", "kim phong", "kim thoa", "kim thuộc", "kim thượng", "kìm", "kín đáo", "kín miệng", "kín mít", "kín tiếng", "kinh bổn", "kinh cụ", "kinh độ", "kinh động", "kinh hãi", "kinh hồn", "kinh kệ", "kinh khiếp", "kinh khủng", "kinh kịch", "kinh luân", "kinh nhật tụng", "kinh niên", "kinh phí", "kinh phong", "kinh qua", "kinh quyền", "kinh sợ", "kinh sư", "kinh sử", "kinh tài", "kinh tế tài chính", "kinh thành", "kinh tởm", "kinh truyện", "kinh vĩ", "kinh viện", "kình địch", "kình kịch", "kình ngạc", "kình nghê", "kình ngư", "kính ái", "kính cẩn", "kính cận", "kính lão", "kính lúp", "kính mến", "kính nể", "kính nhường", "kính râm", "kính thiên văn", "kính tiềm vọng", "kính trọng", "kính viễn", "kính viễn vọng", "kíp chầy", "kịp thời", "kịt", "ky", "kỷ", "la hán", "la làng", "la liếm", "la lối", "La mã hóa", "la rầy", "la sát", "la trời", "là đà", "là lượt", "lả lướt", "lã", "lã chã", "lá chét", "lá dong", "lá mạ", "lá mĩa", "lá sen", "lá thắm", "lá tọa", "lạ gì", "lạ mắt", "lạ miệng", "lác mắt", "lạc bước", "lạc đường", "lạc hầu", "lạc hướng", "lạc khoản", "Lạc Long Quân", "lạc lối", "lạc nghiệp", "lạc quyền", "lạc thành", "lạc tiên", "lạc tướng", "lạc vận", "lạch cà lạch cạch", "lạch tạch", "lai cảo", "lai căng", "lai hàng", "lai kinh", "lai láng", "lai nguyên", "lai nhai", "lai sinh", "lai tạo", "lai tạp", "lai thế", "lai tỉnh", "lài nhài", "lãi suất", "lại bộ", "lại bữa", "lại giống", "lại hồn", "lại mặt", "lại mục", "lại mũi", "lại người", "lại nữa", "lại quả", "lam khí", "làm ải", "làm bàn", "làm bằng", "làm bếp", "làm bộ", "làm cái", "làm cao", "làm chi", "làm chiêm", "làm cỗ", "làm dâu", "làm duyên", "làm đỏm", "làm gì", "làm già", "làm giặc", "làm giấy", "làm gương", "làm hàng", "làm hư", "làm khách", "làm kiêu", "làm kiểu", "làm lẽ", "làm lễ", "làm liều", "làm lông", "làm lơ", "làm lụng", "làm ma", "làm mai", "làm màu", "làm mồi", "làm mối", "làm mùa", "làm mướn", "làm nên", "làm ngơ", "làm người", "làm nhàm", "Lào Cai", "Lê Đại Hành", "lò cò", "loà", "loã lồ", "loã xõa", "loá", "loè", "loè loẹt", "luân thường", "luấn quấn", "luận", "luận bàn", "luận chiến", "luận chứng", "luận công", "luận cứ", "luận cương", "luận điểm", "luận giải", "luật hình", "luật lệ", "luật pháp", "Lúc lắc", "lục bảo", "lục bát", "lục bình", "lục bục", "lục cá nguyệt", "lục chiến", "lục diện", "lục đạo", "lục lạc", "lục lọi", "lục vị", "lục xì", "lui binh", "lui lại", "lui lũi", "lui tới", "lùi", "lùi bước", "lùi lũi", "Lùi xùi", "lụi", "lụi cụi", "lụi hụi", "lum khum", "lùm", "lùm lùm", "lủm", "lũm", "lùn tè", "lùn tịt", "lủn", "lủn chủn", "lủn củn", "lủn mủn", "lũn chũn", "lũn cũn", "lụn", "lụn đời", "lụn vụn", "lung", "lung bung", "lung linh", "lung tung", "lung tung beng", "lùng", "lùng bắt", "lùng bùng", "lùng nhùng", "lùng sục", "lùng thùng", "lùng tùng", "lủng cà lủng củng", "lủng lẳng", "lủng liểng", "lũng", "lụng bụng", "lụng nhụng", "lụng thụng", "luốc", "luôm nhuôm", "luộm thuộm", "luôn luôn", "luôn miệng", "luôn thể", "luôn tiện", "luồn lách", "luồn lỏi", "luồn lọt", "luồng lạch", "luỗng", "luống", "luống tuổi", "luốt", "lút đầu", "lụt lội", "lũy giảm", "lũy thừa", "lụy", "luyến", "luyến tiếc", "luyện đan", "luyện kim", "luyện tập", "lư", "lư hương", "lừ", "lừ đừ", "lừ khừ", "lừ lừ", "lừ thừ", "lử", "lử khử", "lử khử lừ khừ", "lử khử lừ khừ", "lữ", "lữ đoàn", "lữ đoàn trưởng", "lữ hành", "lữ quán", "lữ thứ", "lữ trưởng", "lữ xá", "lự", "lừa bịp", "lừa dối", "lừa gạt", "lừa lọc", "lừa phỉnh", "lửa dục", "lửa đạn", "lửa hận", "lửa lòng", "lửa rơm", "lửa tình", "lửa trại", "lữa", "lứa đôi", "lứa tuổi", "lựa chọn", "lựa là", "lực dịch", "lực điền", "lực học", "lực kế", "lưng chừng", "lưng lửng", "lưng tròng", "lưng vốn", "lừng", "lừng danh", "lừng khà lừng khừng", "lừng khừng", "lửng", "lửng dạ", "lững chững", "lững lờ", "lững thững", "lựng", "lược bí", "lược dịch", "lược sử", "lược thảo", "lược thưa", "lười", "lưỡi câu", "lưỡi gà", "lưỡi liềm", "lưỡi trai", "lưới điện", "lưới mắt cáo", "lưới quăng", "lưới rê", "lưới sắt", "lưới vây", "lưới vét", "lưới vợt", "lươm bươm", "lườm lườm", "lườm nguýt", "lượm lặt", "lươn khươn", "lườn", "lượn lờ", "lương bổng", "lương dân", "lương duyên", "lương đống", "lương hướng", "lương năng", "lương tri", "lương y", "lường", "lường gạt", "lưỡng chiết", "lưỡng cư", "lưỡng cực", "lưỡng hình", "lưỡng nghi", "lưỡng phân", "lưỡng thê", "lưỡng tiện", "lưỡng tính", "lưỡng tự", "lưỡng viện chế", "lưỡng viện chế", "lưỡng viện chế độ", "lưỡng viện chế độ", "lướng vướng", "lượng cá", "lượng giác", "lượng mưa", "lượng tình", "lượng tử", "lượng tử hóa", "lượng tử hóa", "lướt mướt", "lướt thướt", "lướt ván", "lượt bượt", "lượt là", "lượt thượt", "lứt", "lưu ban", "lưu cầu", "lưu chiểu", "lưu chuyển", "lưu cữu", "lưu dung", "lưu dụng", "lưu đãng", "lưu hóa", "lưu hoàng", "lưu học sinh", "lưu huyết", "lưu huỳnh", "lưu lãng", "lưu loát", "lưu nhiệm", "lưu niệm", "lưu niên", "lưu trú", "lưu truyền", "lưu trữ", "lưu trữ viên", "lưu ý", "lựu pháo", "miến", "mít xoài", "mịt", "mịt mờ", "mịt mù", "mịt mùng", "mo", "mo then", "mò mẫm", "mò mò", "mỏ ác", "mỏ cặp", "mỏ hàn", "mỏ khoét", "mỏ nhát", "mõ tòa", "mọc mầm", "mọc sừng", "moi móc", "mòi", "mỏi", "mỏi mắt", "mỏi mệt", "mọi rợ", "mom", "mỏm", "mon men", "mòn mỏi", "mọn", "mong chờ", "mong đợi", "mong mỏi", "mong mỏng", "mong muốn", "mong ngóng", "mong nhớ", "mong ước", "mòng", "mòng mọng", "mỏng dính", "mỏng manh", "mỏng mảnh", "mỏng môi", "mỏng tai", "mọng", "móp", "móp mép", "mọt cơm", "mọt dân", "mọt già", "mọt sách", "mọt xác", "mô học", "mô phật", "mô tê", "mồ hóng", "mồ ma", "mồ mả", "mổ cò", "mổ xác", "mỗ", "mố", "mộ", "mộ binh", "mộ danh", "mộ đạo", "mốc", "mốc meo", "mốc thếch", "mốc xì", "mộc", "mộc bản", "mộc dục", "mộc già", "mộc nhĩ", "mộc tặc", "môi sinh", "môi trường", "môi trường học", "môi trường học", "mồi chài", "mỗi một", "mỗi tội", "mối giềng", "mối hàng", "mối lái", "mối manh", "mồm", "mồm mép", "mồm miệng", "môn đồ", "môn hạ", "môn sinh", "mồn một", "mông đít", "mông lung", "mông mênh", "mông mốc", "mông muội", "mồng", "mồng tơi", "mổng", "mống", "mống mắt", "mộng ảo", "mộng tinh", "mộng triệu", "mộng tưởng", "một chạp", "một chiều", "một chốc", "một dạo", "một đôi", "một đời", "một hai", "một hơi", "một ít", "một khi", "một lần", "một lèo", "một lòng", "một mạch", "một mai", "mơ màng", "mơ mòng", "mờ ám", "mờ ảo", "mờ đục", "mờ mịt", "mờ mờ", "mờ sáng", "mở cờ", "mở đường", "mở hàng", "mở mào", "mở máy", "mở mặt", "mở rộng", "mở tiệc", "mở toang", "mỡ chài", "mỡ gà", "mỡ lá", "mỡ nước", "mỡ phần", "mợ", "mời mọc", "mới cứng", "mới đây", "mới hay", "mới lạ", "mới mẻ", "mới nguyên", "mới rồi", "mới tinh", "mới toanh", "mơm", "mờm", "mớm", "mớp", "mù chữ", "mù khơi", "mù lòa", "mù mờ", "mù quáng", "mù sương", "mù tịt", "mũ cát", "mũ chào mào", "mũ cối", "mụ", "mua buôn", "mua đường", "mua lẻ", "mua mặt", "mua sỉ", "mua việc", "mùa vụ", "múa giật", "múa may", "múa mép", "múa rối", "múc", "mục", "mục đích luận", "mục đích luận", "mục đông", "mục kỉch", "mục nát", "mục súc", "mục sư", "mục trường", "mục từ", "mục tử", "mùi gì", "mùi mẽ", "mùi mẽ gì", "mùi tàu", "mùi tây", "mủi", "mủi lòng", "mũi đất", "mũi giùi", "mũi nhọn", "mũi tiêm", "múi", "múi giờ", "mụi", "mum", "mum múp", "mủm mỉm", "mũm mỉm", "múm", "múm mím", "mun", "mùn", "mủn", "mụn", "mụn nhọt", "mùng", "mủng", "muôi", "muồi", "muối mặt", "muối tiêu", "muối vừng", "muội", "muỗm", "muôn", "muôn dặm", "muôn dân", "muôn muốt", "muộn màng", "muộn mằn", "muồng", "muỗng", "muống", "muốt", "múp", "múp míp", "mút", "mụt", "mưa bay", "mưa bụi", "mưa dầm", "mưa dông", "mưa gió", "mưa lũ", "mưa móc", "mưa ngâu", "mưa nguồn", "mưa rào", "mửa mật", "mứa", "mức", "mức độ", "mức sống", "mực tàu", "mực thước", "mưng", "mừng công", "mừng quýnh", "mừng rỡ", "mừng thầm", "mừng tuổi", "mươi", "mươi hai", "mươi lăm", "mười", "mượn cớ", "mượn tiếng", "mương", "Mường", "mường", "mướp", "mượt", "mượt mà", "mứt", "mứt kẹo", "mưu cầu", "mưu chước", "mưu cơ", "mưu đồ", "mưu hại", "mưu kế", "mưu lược", "mưu mẹo", "mưu mô", "mưu phản", "mưu sát", "mưu sĩ", "mưu sự", "mưu tính", "mưu toan", "mưu trí", "na mô", "nà", "nạ", "nạ dòng", "nai nịt", "nài bao", "nài ép", "nài xin", "nái sề", "nại", "nam bán cầu", "nam bộ", "nam cao", "nam giao", "nam giới", "nam kha", "nam mô", "nam nhi", "nam phong", "nam phục", "nam sinh", "nam tiến", "nam trang", "nam trầm", "nam trung", "nam tử", "nam tước", "nam vô", "nan hoa", "nan y", "nản chí", "nản lòng", "nán", "nạn dân", "nàng thơ", "nanh nọc", "nánh", "nạnh", "nao", "nao nao", "nao nức", "nào đâu", "nào đó", "nào hay", "nào là", "nào ngờ", "não bạt", "não bộ", "não điện đồ", "não lòng", "não nề", "náo", "náo động", "náo nức", "nạp thái", "nát bàn", "nát bét", "nát gan", "nát nước", "nát rượu", "nạt", "nau", "náu", "náu mặt", "náu tiếng", "nay kính", "nay mai", "nay thư", "này nọ", "nảy lửa", "nảy mầm", "nảy nòi", "nảy nở", "nảy sinh", "nãy", "nãy giờ", "nắc nẻ", "nặc", "nặc danh", "nặc nô", "năm ba", "năm bảy", "năm kia", "năm mặt trời", "năm một", "năm mới", "năm năm", "năm ngoái", "năm nhuận", "năm tháng", "năm thiên văn", "năm tuổi", "năm xưa", "nằm bẹp", "nằm bếp", "nằm co", "nằm dài", "nằm ì", "nằm kềnh", "nằm khàn", "nằm khểnh", "nằm khoèo", "nằm không", "nằm meo", "nằm mộng", "nằm mơ", "nằm ngang", "nằm nơi", "nằm quèo", "nằm thượt", "nằm ườn", "nằm viện", "nằm vùng", "nằm xoài", "nằm xuống", "nắm chắc", "nắm giữ", "nắm tay", "nắm vững", "năn nỉ", "nằn nì", "nắn bóp", "nắn điện", "nắn gân", "nắn nót", "nặn", "nặn chuyện", "nặn óc", "năng", "năng động", "nằng nặc", "nắng mưa", "nắng nôi", "nặng bụng", "nặng căn", "nặng cân", "nặng đầu", "nặng gánh", "nặng hơi", "nặng lãi", "nặng lòng", "nặng mặt", "nặng tai", "nặng tay", "nặng trịch", "nặng vía", "nấc cụt", "nầm nập", "nấm men", "nấm mồ", "nậm", "nân", "nâng bậc", "nâng cao", "nâng cấp", "nâng cốc", "nâng giấc", "nâng niu", "nẫng", "nấng", "nậng", "nấp bóng", "nâu nâu", "nâu non", "nâu sồng", "nẫu", "nấu", "nấu bếp", "nấu chảy", "nấu nướng", "nậu", "nây", "nẩy", "nẩy mực", "nấy", "nậy", "ne", "nè", "nem nép", "ném đĩa", "ném tạ", "neo đơn", "nẻo đường", "néo", "nét chữ", "nét mặt", "nẹt", "nê", "nề", "nề nếp", "nể lòng", "nể lời", "nể mặt", "nể nang", "nể vì", "nệ", "nệ cổ", "nếm đòn", "nếm mùi", "nếm trải", "nên chăng", "nên chi", "nên người", "nên thân", "nên thơ", "nền nã", "nền trời", "nến", "nện", "nếp", "nếp cái", "nếp cẩm", "nếp con", "nếp cũ", "nếp cuộn", "nết", "nêu gương", "nếu cần", "nếu như", "nếu thế", "nếu vậy", "Nga hoàng", "nga mi", "Nga văn", "ngà ngà", "ngả ngốn", "ngả ngớn", "ngả vạ", "ngã giá", "ngã lẽ", "ngã lòng", "ngã ngũ", "ngã ngửa", "ngạc ngư", "ngạch", "ngạch bậc", "ngạch trật", "ngai ngái", "ngai vàng", "ngài ngại", "ngài ngự", "ngải", "ngải cứu", "ngải đắng", "ngãi", "ngái", "ngại ngần", "ngam ngám", "ngàm", "ngám", "ngan ngán", "ngàn thu", "ngàn trùng", "ngàn vàng", "ngàn xưa", "ngán ngẩm", "ngán nỗi", "ngang bướng", "ngang chướng", "ngang dạ", "ngang dọc", "ngang giá", "ngang ngang", "ngang ngạng", "ngang ngổ", "ngang ngược", "ngang nối", "ngang phè", "ngang tai", "ngang tàng", "ngang tắt", "ngang tầm", "ngành", "ngành nghề", "ngảnh", "ngao du", "ngao ngán", "ngạo đời", "ngạo ngược", "ngáp gió", "ngát", "ngạt mũi", "ngau ngáu", "ngàu", "ngay lập tức", "ngay lưng", "ngay mặt", "ngay ngáy", "ngay ngắn", "ngay râu", "ngay tức khắc", "ngay tức thì", "ngay xương", "ngày càng", "ngày đêm", "ngày đường", "ngày hội", "ngày kia", "ngày kìa", "ngày rày", "ngày sau", "ngày sóc", "ngày Tết", "ngày thường", "ngày trước", "ngày vía", "ngày vọng", "ngày xanh", "ngắc", "ngắc nga ngắc ngứ", "ngắc ngoải", "ngắc ngứ", "ngăm", "ngăm ngăm", "ngắm vuốt", "ngăn cách", "ngăn cản", "ngăn chặn", "ngăn kéo", "ngăn ngắn", "ngăn trở", "ngẳng", "ngẳng nghiu", "ngắt điện", "ngắt quãng", "ngặt", "ngặt nghẽo", "ngặt nghẹo", "ngặt ngõng", "ngặt vì", "ngấc", "ngâm khúc", "ngâm ngẩm", "ngâm ngợi", "ngâm tôm", "ngâm vịnh", "ngầm ngập", "ngẫm nghĩ", "ngấm đòn", "ngấm ngầm", "ngấm ngoảy", "ngấm nguẩy", "ngấm nguýt", "ngậm câm", "ngậm họng", "ngậm miệng", "ngậm nước", "ngậm tăm", "ngậm vành", "ngân hôn", "ngân khố", "ngân nga", "ngân tiền", "ngẩn mặt", "ngẩn người", "ngấn", "ngấn lệ", "ngẫng", "ngấp nghé", "ngập đầu", "ngập mắt", "ngập ngà ngập ngừng", "ngập ngụa", "ngất", "ngất nga ngất ngưởng", "ngật ngà ngất ngưởng", "ngật ngưởng", "ngâu", "ngâu ngấu", "ngầu", "ngầu ngầu", "ngẫu hợp", "ngẫu lực", "ngẫu nhỉ", "ngấu", "ngấu nghiến", "ngậu", "ngậu xị", "ngây", "ngây mặt", "ngây ngấy", "ngây ngô", "ngây người", "ngầy", "ngầy ngà", "ngấy", "ngậy", "nghe bệnh", "nghe chừng", "nghe hơi", "nghe lỏm", "nghe lóm", "nghe lời", "nghe ngóng", "nghe nhìn", "nghe như", "nghe nói", "nghe ra", "nghe theo", "nghè", "nghé", "nghé mắt", "nghé ngọ", "nghen", "nghẽn", "nghẹn lời", "nghèo đói", "nghèo khó", "nghèo khổ", "nghèo ngặt", "nghẻo", "nghẽo", "nghẹo", "nghét", "nghẹt", "nghẹt thở", "nghê", "nghề đời", "nghề nghiệp", "nghề ngỗng", "nghề phụ", "nghề văn", "nghề võ", "nghể", "nghệ nghiệp", "nghệ tây", "nghếch", "nghếch mắt", "nghếch ngác", "nghệch", "nghệch ngạc", "nghển cổ", "nghênh", "nghênh địch", "nghênh đón", "nghênh giá", "nghênh hôn", "nghênh ngang", "nghênh tiếp", "nghênh tống", "nghênh xuân", "nghểnh", "nghểnh ngãng", "nghêu", "nghều", "nghễu nghện", "nghi án", "nghi binh", "nghi hoặc", "nghi kỵ", "nghi lễ", "nghi môn", "nghi ngại", "nghi ngờ", "nghi tiết", "nghi vệ", "nghì", "nghỉ chân", "nghỉ đẻ", "nghỉ hè", "nghỉ hưu", "nghỉ lễ", "nghỉ mát", "nghỉ năm", "nghỉ ngơi", "nghỉ ốm", "nghỉ phép", "nghỉ tay", "nghỉ trưa", "nghĩ bụng", "nghĩ lại", "nghĩ ngợi", "nghĩ ra", "nghí ngoáy", "nghị án", "nghị định thư", "nghị định thư", "nghị gật", "nghị sự", "nghị tội", "nghị trường", "nghị trưởng", "nghị viên", "nghị viện", "nghĩa binh", "nghĩa bộc", "nghĩa cử", "nghĩa dụng", "nghĩa đệ", "nghĩa hiệp", "nghĩa khí", "nghịch lý", "nghịch mắt", "nghịch ngợm", "nghịch nhĩ", "nghịch phong", "nghịch tai", "nghịch thần", "nghịch thuyết", "nghiêm cách", "nghiêm cẩn", "nghiêm chỉnh", "nghiêm chính", "nghiêm đường", "nghiêm huấn", "nghiêm lệnh", "nghiêm mật", "nghiêm minh", "nghiêm ngặt", "nghiêm nghị", "nghiêm nhặt", "nghiêm phụ", "nghiêm trang", "nghiêm túc", "nghiêm từ", "nghiễm nhiên", "nghiệm", "nghiệm số", "nghiệm thu", "nghiên bút", "nghiên cứu sinh", "nghiên cứu sinh", "nghiền ngẫm", "nghiến ngấu", "nghiến răng", "nghiện", "nghiện ngập", "nghiêng", "nghiêng ngả", "nghiêng ngửa", "nghiệp", "nghiệp báo", "nghiệp chướng", "nghìm", "nghỉm", "nghìn nghịt", "nghìn thu", "nghịt", "ngò", "ngỏ lòng", "ngỏ lời", "ngỏ ý", "ngõ cụt", "ngõ hầu", "ngõ ngách", "ngó ngàng", "ngó ngoáy", "ngọ", "ngọ ngoạy", "ngoa", "ngoã", "ngoác", "ngoách", "ngoài cuộc", "ngoài da", "ngoài khơi", "ngoài lề", "ngoài mặt", "ngoài miệng", "ngoài tai", "ngoài trời", "ngoái", "ngoái cổ", "ngoại giao đoàn", "ngoại giao đoàn", "ngoàm", "ngoan cường", "ngoan đạo", "ngoang ngoảng", "ngoảnh", "ngoảnh đi", "ngoảnh lại", "ngoảnh mặt", "ngoao", "ngoay ngoáy", "ngoảy", "ngoáy", "ngoắc", "ngoắc ngoặc", "ngoặc", "ngoặc kép", "ngoặc tay", "ngoặc vuông", "ngoằn ngoèo", "ngoằng", "ngoắng", "ngoắt", "ngoắt ngoéo", "ngoắt ngoẹo", "ngoặt", "ngóc", "ngóc đầu", "ngóc ngách", "ngọc bích", "ngọc bội", "ngọc chỉ", "ngọc chiếu", "ngọc diện", "ngọc đường", "ngọc hành", "ngọc hoàng", "ngọc lan tây", "ngọc lan tây", "ngọc ngà", "ngọc nữ", "ngọc thể", "ngọc thỏ", "ngọc thực", "ngoe", "ngoe ngoảy", "ngoe ngoe", "ngoe ngóe", "ngóe", "ngoi", "ngòi bút", "ngòi nổ", "ngõi", "ngói âm dương", "ngói bò", "ngói chiếu", "ngói móc", "ngói nóc", "ngói ống", "ngòm", "ngỏm", "ngỏm dậy", "ngóm", "ngon ăn", "ngon giấc", "ngon lành", "ngon mắt", "ngon miệng", "ngon ngót", "ngon ngọt", "ngon ơ", "ngon xơi", "ngòn", "ngòn ngọt", "ngón", "ngọn nguồn", "ngong ngóng", "ngòng", "ngòng ngoèo", "ngỏng", "ngõng", "ngóng", "ngóng chờ", "ngóng trông", "ngọng", "ngọng nghịu", "ngót", "ngọt giọng", "ngọt lịm", "ngọt lừ", "ngọt lự", "ngọt ngào", "ngọt nhạt", "ngọt sắc", "ngô công", "ngô khoai", "ngô nghê", "ngồ ngộ", "ngổ", "ngổ ngáo", "ngổ nghịch", "ngổ ngược", "ngố", "ngộ", "ngộ biến", "ngộ cảm", "ngộ đạo", "ngộ nạn", "ngộ nhỡ", "ngộ sát", "ngốc nga ngốc nghếch", "ngốc nga ngốc nghếch", "ngốc nghếch", "ngôi báu", "ngôi sao", "ngôi thứ", "ngôi trời", "ngôi vua", "ngồi dưng", "ngồi không", "ngồi lê", "ngồi rồi", "ngồm ngoàm", "ngôn hành", "ngôn luận", "ngôn ngổn", "ngôn ngữ học", "ngổn ngang", "ngốn", "ngốn ngấu", "ngộn", "ngông", "ngông nghênh", "ngồng", "ngồng ngồng", "ngốt", "ngốt người", "ngột", "ngột ngạt", "ngơ", "ngơ ngáo", "ngơ ngẫn", "ngờ đâu", "ngờ ngạc", "ngờ ngợ", "ngờ vực", "ngỡ ngàng", "ngớ", "ngớ ngẩn", "ngợ", "ngơi", "ngơi tay", "ngời", "ngợi khen", "ngơm ngớp", "ngớp", "ngợp", "ngớt", "ngớt lời", "ngu dại", "ngu dốt", "ngu huynh", "ngu muội", "ngu ngốc", "ngu ngơ", "ngu phụ", "ngu si", "ngu xuẩn", "ngu ý", "ngù", "ngù ngờ", "ngủ dậy", "ngủ gà", "ngủ gật", "ngủ gục", "ngủ khì", "ngủ lang", "ngủ mê", "ngũ âm", "ngũ bội tử", "ngũ bội tử", "ngũ cốc", "ngũ đại", "ngũ đoản", "ngũ giác đài", "ngũ giới", "ngũ hành", "ngũ hình", "ngũ ngôn", "ngũ quả", "ngũ sắc", "ngũ tạng", "ngũ thường", "ngũ tuần", "ngụ cư", "ngụ ý", "ngục hình", "ngục lại", "ngục thất", "ngục tối", "ngục tốt", "ngục tù", "ngủm", "ngụm", "nguôi", "nguôi nguôi", "nguồi nguội", "nguội điện", "nguội lạnh", "nguội ngắt", "nguội tanh", "nguồn cơn", "ngụp", "ngụy", "ngụy binh", "ngụy tạo", "ngụy triều", "ngụy vận", "nguyên canh", "nguyên dạng", "nguyên hình", "nguyên nhân học", "nguyên nhân học", "nguyên niên", "nguyên quán", "nguyên sinh", "nguyên sinh chất", "nguyên sinh chất", "nguyên sinh động vật", "nguyên sinh động vật", "nguyên soái", "nguyên thủy", "nguyên tử atom", "nguyên vật liệu", "Nguyễn Du", "Nguyễn Dữ", "Nguyễn Trãi", "nguyệt bạch", "nguyệt liễm", "nguyệt thực", "ngư cụ", "ngư dân", "ngư long", "ngư lôi", "ngư ông", "ngư tiêù", "ngư trường", "ngữ", "ngữ âm", "ngữ âm học", "ngữ âm học", "ngữ cảnh", "ngữ điệu", "ngữ đoạn", "ngữ hệ", "ngữ học", "ngữ khí", "ngữ ngôn học", "ngữ văn", "ngự", "ngự sử", "ngự y", "ngừa", "ngửa", "ngửa tay", "ngứa mắt", "ngứa miệng", "ngứa mồm", "ngứa ngáy", "ngứa nghề", "ngứa tai", "ngứa tay", "ngựa nghẽo", "ngựa người", "ngựa trời", "ngựa vằn", "ngửi", "ngưng", "ngưng đọng", "ngưng trệ", "ngưng tụ", "ngừng bắn", "ngừng bút", "ngừng bước", "ngừng tay", "ngừng trệ", "ngửng", "ngước", "ngược", "ngược dòng", "ngược đời", "ngược lại", "ngược mắt", "ngược ngạo", "ngươi", "người bệnh", "người chứng", "người dưng", "người đời", "người hầu", "người hùng", "người lạ", "người làm", "người lớn", "người người", "người ở", "người thiên cổ", "người tình", "người vượn", "người xưa", "ngường ngượng", "ngưỡng", "ngưỡng cửa", "ngưỡng vọng", "ngượng mặt", "ngượng mồm", "ngượng ngập", "ngượng ngùng", "ngưu đậu", "nha dịch", "nha lại", "nha môn", "nhà bảo sanh", "nhà bảo sanh", "nhà bạt", "nhà băng", "nhà binh", "nhà buôn", "nhà cái", "nhà cầu", "nhà chọc trời", "nhà chồng", "nhà chùa", "nhà chung", "nhà chức trách", "nhà cửa", "nhà dây thép", "nhà dòng", "nhà dưới", "nhà đá", "nhà đám", "nhà đèn", "nhà đoan", "nhà đương cục", "nhà gá", "nhà gác", "nhà gái", "nhà giai", "nhà giam", "nhà giáo", "nhà giàu", "nhà hát", "Nhà Hậu Lê", "nhà hộ sinh", "nhà kho", "nhà khó", "nhà kính", "nhà lao", "nhà lầu", "nhà lí luận", "nhà lưu động", "nhà máy điện", "nhà máy điện", "nhà mô phạm", "nhà mô phạm", "nhà mồ", "nhà ngang", "nhà nghèo", "nhà ngoài", "nhà ngủ", "nhà ngươi", "nhà nho", "nhà nòi", "nhà nông", "nhà ổ chuột", "nhà ổ chuột", "nhà ở", "nhà pha", "nhà quê", "nhà rạp", "nhà rông", "nhà sàn", "nhà sấy", "nhà sư", "nhà tây", "Nhà Tây Sơn", "nhà thổ", "nhà tiêu", "nhà tình nghĩa", "nhà tôi", "nhà tông", "nhà tơ", "nhà trai", "nhà trẻ", "nhà trên", "nhà trò", "nhà trời", "nhà trường", "nhà tu", "nhà tu kín", "nhà tù", "nhà tư", "nhà tư tưởng", "nhà tư tưởng", "nhà văn hóa", "nhà văn hóa", "nhà vệ sinh", "nhà vợ", "nhà vua", "nhà xác", "nhà xe", "nhà xí", "nhả", "nhả nhớt", "nhã", "nhã giám", "nhã nhạc", "Nhã ý", "nhá", "nhác", "nhạc công", "nhạc cụ", "nhạc hát", "nhạc khúc", "nhạc kịch", "nhạc mẫu", "nhạc nhẹ", "nhách", "nhai lại", "nhai nhải", "nhài quạt", "nhãi", "nhãi con", "nhãi nhép", "nhãi ranh", "nhại", "nham hiểm", "nham nháp", "nham nhở", "nham thạch", "nhàm tai", "nhảm", "nhảm nhí", "nhám sì", "nhàn đàm", "nhàn lãm", "nhàn nhạt", "nhàn rỗi", "nhàn tản", "nhãn áp", "nhãn áp kế", "nhãn áp kế", "nhãn giới", "nhãn kính", "nhãn quan", "nhãn thức", "nhãn tiền", "nhang khói", "nhàng nhàng", "nhãng", "nháng", "nhanh gọn", "nhanh lẹ", "nhanh mắt", "nhanh nhách", "nhanh nhánh", "nhanh nhảu", "nhanh nhạy", "nhanh nhẹ", "nhảnh", "nhao", "nhao nhác", "nhao nhao", "nhào", "nhào lặn", "nhào lộn", "nhão nhạo", "nháo", "nháo nhác", "nháo nhào", "nháo nhâng", "nhạo báng", "nháp", "nhát đòn", "nhát gái", "nhát gan", "nhát gừng", "nhạt nhẽo", "nhạt phèo", "nhạt thếch", "nhau nhảu", "nhay nhay", "nhay nháy", "nhảy bổ", "nhảy cao", "nhảy cẫng", "nhảy cóc", "nhảy cừu", "nhảy dây", "nhảy đầm", "nhảy múa", "nhảy mũi", "nhảy nhót", "nhảy ô", "nhảy ổ", "nhảy rào", "nhảy tót", "nhảy xổ", "nháy mắt", "nháy nháy", "nhạy", "nhạy bén", "nhạy cảm", "nhạy miệng", "nhắc nhỏm", "nhắc nhủ", "nhắc vở", "nhăm", "nhăm nhăm", "nhăm nhe", "nhằm lúc", "nhằm nhè", "nhắm chừng", "nhắm mắt", "nhắm nghiền", "nhắm nháp", "nhắm nhe", "nhắm rượu", "nhặm", "nhặm lẹ", "nhăn nhẳn", "nhăn nhở", "nhăn nhúm", "nhăn răng", "nhằn", "nhẳn", "nhẵn", "nhẵn bóng", "nhẵn mặt", "nhẵn thín", "nhắn", "nhắn nhe", "nhắn nhủ", "nhăng", "nhăng nhẳng", "nhăng nhít", "nhằng", "nhằng nhằng", "nhằng nhẵng", "nhằng nhịt", "nhẳng", "nhắng", "nhắng nhít", "nhặng xị", "nhắp mắt", "nhắt", "nhặt nhạnh", "nhấc", "nhâm", "nhầm", "nhầm lẫn", "nhầm nhỡ", "nhẩm", "nhấm", "nhấm nháp", "nhấm nháy", "nhấm nhẳng", "nhậm chức", "nhân cách hóa", "nhân cách hóa", "nhân chủng", "nhân duyên", "nhân giả", "nhân giống", "nhân hình", "nhân hòa", "nhân hoàn", "nhân huynh", "nhân khẩu học", "nhân khẩu học", "nhân loại học", "nhân loại học", "nhân luân", "nhân lực", "nhân mãn", "nhân mạng", "nhân ngãi", "nhân nghĩa", "nhân ngôn", "nhân nhẩn", "nhân quả", "nhân quần", "nhân quyền", "nhân sinh", "nhân sinh quan", "nhân tài", "nhân tâm", "nhân tiện", "nhân tình", "nhân tính", "nhân tính hóa", "nhân tính hóa", "nhân tố", "nhân trung", "nhân văn", "nhân vật", "nhân vì", "nhân vị", "nhần nhận", "nhẫn nhục", "nhấn", "nhận cảm", "nhận chân", "nhận diện", "nhận thấy", "nhận thức luận", "nhận thức luận", "nhận tội", "nhận việc", "nhận xét", "nhâng nháo", "nhâng nhâng", "nhấp", "nhấp giọng", "nhấp nhánh", "nhấp nháy", "nhấp nhem", "nhấp nhoáng", "nhấp nhổm", "nhập", "nhập cảng", "nhập cảnh", "nhập cục", "nhập cuộc", "nhập cư", "nhập học", "nhập hội", "nhập môn", "nhập nhà nhập nhằng", "nhập nhằng", "nhập nhèm", "nhập nhoạng", "nhập nội", "nhập quan", "nhập quốc tịch", "nhập quỹ", "nhập siêu", "nhất đán", "nhất đẳng", "nhất giáp", "nhất hạng", "nhất là", "nhất lãm", "nhất loạt", "nhất luật", "nhất mực", "nhất nguyên", "nhất nguyên luận", "nhất nguyên luận", "nhất sinh", "nhất tâm", "nhất tề", "nhất thần giáo", "nhất thiết", "nhất thống", "nhất thời", "nhất viện chế", "nhật dụng", "nhật lệnh", "nhật nguyệt", "nhật quỳ", "nhật trình", "nhật tụng", "nhật xạ", "nhâu nhâu", "nhậu nhẹt", "nhây", "nhây nhây", "nhầy", "nhầy nhầy", "nhầy nhụa", "nhẩy", "nhẫy", "nhậy", "nhe", "nhè", "nhẻ nhói", "nhẽ", "nhé", "nhẹ bỗng", "nhẹ bụng", "nhẹ bước", "nhẹ lời", "nhẹ miệng", "nhẹ mình", "nhẹ nhàng", "nhẹ nhõm", "nhẹ nợ", "nhẹ tay", "nhẹ tênh", "nhẹ tình", "nhẹ tính", "nhem", "nhem nhẻm", "nhem nhép", "nhem nhúa", "nhem nhuốc", "nhèm", "nhẻm nhèm nhem", "nhẹm", "nhen", "nhẹn", "nheo", "nheo nhẻo", "nheo nhéo", "nhèo", "nhèo nhèo", "nhẽo", "nhẽo nhèo", "nhéo nhẹo", "nhét", "nhể", "nhênh nhang", "nhếu nháo", "nhệu nhạo", "nhi", "nhi nhí", "nhi nữ", "nhỉ", "nhĩ mục", "nhí nha nhí nhảnh", "nhí nha nhí nhoẻn", "nhí nháy", "nhí nhéo", "nhí nhoẻn", "nhí nhố", "nhị cái", "nhị diện", "nhị đực", "nhị giáp", "nhị hỉ", "nhị nguyên luận", "nhị nguyên luận", "nhị phẩm", "nhị phân", "nhị tâm", "nhị viện chế", "nhích", "nhiếc", "nhiếc mắng", "nhiếc móc", "nhiễm", "nhiễm bẩn", "nhiễm bệnh", "nhiễm điện", "nhiễm độc", "nhiễm khuẩn", "nhiễm sắc thể", "nhiễm sắc thể", "nhiễm trùng", "nhiễm từ", "nhiễm xạ", "nhiệm chức", "nhiệm sở", "nhiên hậu", "nhiễn", "nhiếp chính", "nhiêt động học", "nhiêt tình", "nhiệt", "nhiệt biểu", "nhiệt dung", "nhiệt đới", "nhiệt đới hóa", "nhiệt đới hóa", "nhiệt giai", "nhiệt hạch", "nhiệt hóa học", "nhiệt học", "nhiệt huyết", "nhiệt kế", "nhiệt luyện", "nhiệt lượng kế", "nhiệt năng", "nhiệt phân", "nhiệt quyển", "nhiệt tâm", "nhiệt thành", "nhiêu", "nhiêu khê", "nhiều chân", "nhiều chuyện", "nhiều nhặn", "nhiểu chuyện", "nhiễu", "nhiễu sự", "nhiễu xạ", "nhím", "nhím biển", "nhìn chung", "nhìn nhó", "nhìn nổi", "nhìn thấu", "nhín", "nhịn", "nhinh nhỉnh", "nhịp điệu", "nhịp độ", "nhịp nhàng", "nhíu", "nhịu", "nho lại", "nho lâm", "nho nhoe", "nho phong", "nho sinh", "nhỏ bé", "nhỏ con", "nhỏ dãi", "nhỏ dại", "nhỏ giọt", "nhỏ hẹp", "nhỏ lửa", "nhỏ mọn", "nhỏ người", "nhỏ nhoi", "nhỏ tí", "nhỏ to", "nhỏ tuổi", "nhỏ xíu", "nhỏ yếu", "nhọ", "nhọ nhem", "nhọ nồi", "nhoà", "nhoai", "nhoài", "nhoáng", "nhoay nhoáy", "nhóc", "nhọc", "nhọc lòng", "nhọc óc", "nhoe'", "nhoe nhóe", "nhoe nhoét", "nhoè", "nhoè nhoẹt", "nhoen nhoẻn", "nhoi", "nhoi nhói", "nhói", "nhom", "nhom nhem", "nhòm", "nhòm nhỏ", "nhỏm", "nhỏm nhẻm", "nhóm họp", "nhóm máu", "nhóm trưởng", "nhóm viên", "nhon nhen", "nhon nhỏn", "nhõn", "nhón", "nhón nhén", "nhọn hoắt", "nhong nhong", "nhong nhong", "nhong nhóng", "nhong nhóng", "nhòng", "nhỏng nha nhỏng nhảnh", "nhỏng nhảnh", "nhóp nhép", "nhót", "nhọt", "nhô", "nhổ", "nhổ neo", "nhổ sào", "nhổ trại", "nhố nhăng", "nhôi", "nhồi", "nhồi máu", "nhồi nhét", "nhội", "nhôm nham", "nhồm nhàm", "nhồm nhoàm", "nhổm", "nhôn nhao", "nhôn nhốt", "nhốn nháo", "nhộn nhàng", "nhộn nhạo", "nhông nhông", "nhơ bẩn", "nhơ danh", "nhơ đời", "nhơ nhớ", "nhơ nhớp", "nhờ cậy", "nhờ nhờ", "nhờ nhỡ", "nhờ nhợ", "nhờ trời", "nhờ vả", "nhỡ", "nhỡ nhàng", "nhớ chừng", "nhớ đời", "nhớ lại", "nhớ mong", "nhớ nhung", "nhớ ra", "nhớ thương", "nhớ tiếc", "nhợ", "nhơi", "nhời", "nhởi", "nhơm nhở", "nhơm nhớp", "nhơn", "nhơn nhớt", "nhờn", "nhờn nhợt", "nhởn", "nhỡn", "nhớn", "nhớn nha nhớn nhác", "nhớn nhác", "nhớt kế", "nhớt nhát", "nhớt nhợt", "nhợt", "nhợt nhạt", "nhu", "nhu đạo", "nhu nhú", "nhu phí", "nhu thuật", "nhu yếu", "nhu yếu phẩm", "nhu yếu phẩm", "nhủ", "nhũ đá", "nhũ hương", "nhũ mẫu", "nhú", "nhuận tràng", "nhục nhằn", "nhuế nhóa", "nhuệ binh", "nhui", "nhủi", "nhúi", "nhủn", "nhũn", "nhũn não", "nhũn nhặn", "nhũn nhùn", "nhũn xương", "nhún", "nhún vai", "nhung kẻ", "nhung nhăng", "nhung nhúc", "nhung phục", "nhung vải", "nhung y", "nhùng nhằng", "nhủng nhẳng", "nhũng", "nhũng lạm", "nhũng nhẵng", "nhũng nhiễu", "nhúng máu", "nhúng tay", "nhuốc", "nhuốc nhơ", "nhuốm", "nhuốm bệnh", "nhút", "nhút nhát", "nhụt", "nhụy", "nhuyễn", "như ai", "như chơi", "như cũ", "như hệt", "như không", "như là", "như nguyện", "như nhau", "như quả", "như thể", "như trên", "như tuồng", "như ý", "nhừ", "nhừ đòn", "nhừ tử", "nhứ", "nhựa két", "nhựa thông", "nhức nhói", "nhức nhối", "nhức óc", "nhưng mà", "nhưng nhức", "những", "những ai", "những là", "những như", "nhược", "nhược bằng", "nhược tiểu", "nhường", "nhường ấy", "nhường bao", "nhường bước", "nhường lời", "nhường nào", "nhường ngôi", "nhượng", "nhượng địa", "nhứt", "nhựt", "ni", "nì", "nỉ non", "nịch", "niêm dịch", "niêm mạc", "niềm", "niềm tây", "niệm", "niên biểu", "niên canh", "niên đại học", "niên đại học", "niên hiệu", "niên học", "niên khóa", "niên kim", "niên lịch", "niên thiếu", "niên xỉ", "niền", "niềng niễng", "niễng", "niệt", "niêu", "niệu", "nín bặt", "nín lặng", "nín nhịn", "nín thinh", "nín thít", "nín tiếng", "ninh", "ninh gia", "ninh ních", "nình nịch", "nịnh", "nịnh bợ", "nịnh đầm", "nịnh mặt", "nịnh nọt", "nịnh thần", "níp", "nít", "nịt", "nịt vú", "no ấm", "no đủ", "no nê", "nò", "nỏ miệng", "nỏ mồm", "nỏ nang", "nõ", "nõ nường", "nọ", "noãn", "noãn bào", "nóc", "nọc cổ", "nọc độc", "noi", "noi gót", "nòi", "nòi giống", "nỏi", "nói bẩy", "nói bẻm", "nói bóng", "nói bông", "nói bỡn", "nói bừa", "nói cạnh", "nói chọc", "nói chơi", "nói chung", "nói chữ", "nói cứng", "nói dóc", "nói đổng", "nói gạt", "nói gẫu", "nói giễu", "nói giỡn", "nói gở", "nói hộ", "nói hớ", "nói hớt", "nói khó", "nói là", "nói lảng", "nói láy", "nói lầm", "nói lếu", "nói lót", "nói lối", "nói lửng", "nói lưỡng", "nói mát", "nói mép", "nói mê", "nói mỉa", "nói mò", "nói phách", "nói phải", "nói phét", "nói phiếm", "nói qua", "nói rào", "nói riêng", "nói rõ", "nói rước", "nói sai", "nói sảng", "nói sõi", "nói sòng", "nói suông", "nói thach", "nói thánh tướng", "nói thẳng", "nói thầm", "nói toạc", "nói toẹt", "nói trại", "nói trạng", "nói trắng", "nói trổng", "nói trống không", "nói trống không", "nói tướng", "nói xấu", "nom", "nòm", "non", "non nớt", "non sông", "non tay", "non trẻ", "nõn", "nõn nà", "nõn nường", "nón chóp", "nón cụt", "nón dấu", "nón lá", "nón lông", "nón mê", "nón quai thao", "nọn", "nong", "nong nả", "nong nóng", "nòng", "nòng nực", "nóng bỏng", "nóng bức", "nóng chảy", "nóng gáy", "nóng giận", "nóng hổi", "nóng mắt", "nóng mặt", "nóng nảy", "nóng nực", "nóng rẫy", "nóng ruột", "nóng sáng", "nóng sốt", "nọng", "nóp", "nô", "nô bộc", "nô dịch", "Nô en", "nô giỡn", "nô nức", "nồ", "nổ bùng", "nổ chậm", "nổ mìn", "nổ tung", "nỗ lực", "nố", "nộ", "nộ khí", "nộ nạt", "nốc", "nôi", "nồi áp suất", "nồi chó", "nồi hấp", "nồi hơi", "nồi niêu", "nồi rang", "nổi bật", "nổi bọt", "nổi chìm", "nổi danh", "nổi dậy", "nổi dóa", "nổi điên", "nổi khùng", "nổi lên", "nổi loạn", "nổi lửa", "nổi nóng", "nổi rõ", "nổi tam bành", "nổi xung", "nỗi", "nỗi lòng", "nỗi mình", "nỗi nhà", "nỗi niềm", "nỗi riêng", "nối dõi", "nối đuôi", "nối gót", "nối khố", "nối lại", "nối liền", "nối lời", "nối ngôi", "nối tiếp", "nội", "nội bào", "nội biến", "nội cung", "nội độc tố", "nội đồng", "nội giàn", "nội hàm", "nội hiện", "nội hôn", "nội khoa", "nội ký sinh", "nội loạn", "nội lực", "nội năng", "nội ngoại", "nội nhân", "nội nhập", "nội nhật", "nội quy", "nội tại", "nội tạng", "nội tâm", "nội thành", "nội thất", "nội thị", "nội tiếp", "nội tiết tố", "nội tình", "nội tỉnh", "nội trị", "nội tướng", "nội ứng", "nôm na", "nồm", "nộm", "nôn", "nôn mửa", "nôn nao", "nôn nóng", "nông choèn", "nông công nghiệp", "nông cụ", "nông gia", "nông giang", "nông hóa học", "nông học", "nông hộ", "nông hội", "nông lâm", "nông lịch", "nông nghiệp", "nông sờ", "nông tang", "nông thôn", "nông trại", "nông trang", "nông trường", "nông vận", "nông vụ", "nồng", "nồng cháy", "nồng độ", "nồng đượm", "nồng nặc", "nồng nhiệt", "nồng nỗng", "nồng nực", "nồng thắm", "nống", "nộp", "nốt rễ", "nở hoa", "nở mũi", "nở nang", "nỡ", "nỡ nào", "nỡ tâm", "nớ", "nợ đìa", "nợ đời", "nợ máu", "nợ miệng", "nợ nần", "nợ nước", "nợ xuýt", "nơi nơi", "nới giá", "nới tay", "nơm nớp", "nỡm", "nu", "núc", "núc ních", "nục", "núi băng", "núi rừng", "núi sông", "nung bệnh", "nung đúc", "nung mủ", "nung núng", "Nùng", "nũng", "núng", "núng na núng nính", "núng nính", "nuộc", "nuôi bộ", "nuôi cấy", "nuôi trẻ", "nuôi trồng", "nuối", "nuốm", "nuông", "nuốt hận", "nuốt hờn", "nuốt lời", "nuốt nhục", "nuốt sống", "nuốt trôi", "nuốt trửng", "nuốt tươi", "nuột", "nút gạc", "nư", "nữ anh hùng", "nữ bác sĩ", "nữ ca sĩ", "nữ cao", "nữ chúa", "nữ cứu thương", "nữ diễn viên", "nữ du kích", "nữ hạnh", "nữ hoá", "nữ học đường", "nữ học đường", "nữ hộ sinh", "nữ kiệt", "nữ lang", "nữ lưu", "nữ sắc", "nữ sĩ", "nữ tắc", "nữ thần", "nữ trầm", "nữ tu sĩ", "nữ tu sĩ", "nữ tử", "nữ tướng", "nữ văn sĩ", "nữ vương", "nữ y sĩ", "nữ y tá", "nưa", "nửa buổi", "nửa chừng", "nửa đời", "nửa đường", "nửa lời", "nửa lương", "nửa mùa", "nửa tiền", "nửa vời", "nữa khi", "nữa là", "nữa rồi", "nứa", "nức", "nức danh", "nức lòng", "nức nở", "nức tiếng", "nực", "nực cười", "nực nội", "nưng", "nưng niu", "nừng", "nứng", "nựng nịu", "nước bí", "nước bóng", "nước bọt", "nước canh", "nước chanh", "nước chấm", "nước chè", "nước dãi", "nước dùng", "nước đái", "nước đái quỷ", "nước đái quỷ", "nước đại", "nước độc", "nước đôi", "nước đời", "nước đứng", "nước ép", "nước giải", "nước gội đầu", "nước hàng", "nước khoáng", "nước kiệu", "nước lã", "nước lèo", "nước lên", "nước lọc", "nước lợ", "nước lũ", "nước mắm", "nước mắt", "nước ngoài", "nước ốc", "nước ối", "nước tiểu", "nước trà", "nước vàng", "nước vo gạo", "nước vôi", "nước vối", "nước xáo", "nước xốt", "nước xuống", "nước xuýt", "nườm nượp", "nương bóng", "nương cậy", "nương mạ", "nương nhờ", "nương nương", "nương rẫy", "nương tay", "nương thân", "nương tử", "nương tựa", "nường", "nứt mắt", "nứt nanh", "nứt rạn", "o ép", "o o", "o oe", "ò e", "ọ ẹ", "oà", "oạch", "oai nghi", "oai phong", "oai quyền", "oải hương", "oái oăm", "oàm oạp", "oan gia", "oan khiên", "oan khổ", "oan khuất", "oan khúc", "oan tình", "oan ức", "oản", "oán hờn", "oán thán", "oán thù", "oang", "oang oác", "oang oang", "oanh", "oanh tạc", "oành oạch", "oát", "oằn oại", "oằn tù tì", "oặt", "óc ách", "óc đậu", "óc trâu", "ọc ọc", "oe oe", "oe óe", "oẻ", "oẻ họe", "oẹ", "òi ọp", "ỏi", "ọi", "om xương", "òm", "ỏm", "ỏm tỏi", "ỏn ẻn", "ong bắp cày", "ong bướm", "ong chúa", "ong đực", "ong ọc", "ong vẽ", "ỏng", "õng ẹo", "óng", "óng chuốt", "óng mượt", "óp", "óp xọp", "ọp ẹp", "ót ét", "ô kìa", "ô lại", "ô liu", "ô long", "ô mai", "ô rô", "ô tạp", "ô tặc cốt", "ô thước", "ô vuông", "ồ ề", "ồ ồ", "ổ cắm", "ổ lợn", "ổ mắt", "ổ răng", "ổ trục", "ố", "ộ ệ", "ốc đảo", "ốc sạo", "ốc sên", "ộc", "ôi chao", "ôi khét", "ôi thôi", "ối chà", "ối dào", "ôm chầm", "ôm đầu", "ôm đít", "ôm trống", "ồm ồm", "ốm đau", "ốm đòn", "ốm nghén", "ốm nhom", "ốm o", "ôn con", "ôn dịch", "ôn độ", "ôn luyện", "ôn vật", "ồn ã", "ồn ào", "ồn ồn", "ổn áp", "ổn thỏa", "ộn", "ộn ện", "ông anh", "ông ba mươi", "ông ba mươi", "ông bầu", "ông cha", "ông công", "ông cụ", "ông địa", "ông gia", "ông già", "ông lão", "ông lớn", "ông mãnh", "ông ổng", "ông táo", "ông tạo", "ông tơ", "ông từ", "ông vải", "ông xã", "ông xanh", "ồng ộc", "ống bơm", "ống dẫn", "ống dòm", "ống đót", "ống kính", "ống lòng", "ống máng", "ống nghe", "ống nhỏ giọt", "ống nhỏ giọt", "ống nhổ", "ống phóng", "ống quyển", "ống súc", "ống tay", "ống thuốc", "ống tiền", "ống vôi", "ống xối", "ộp oạp", "ơ hay", "ơ hờ", "ơ kìa", "ờ", "ờ ờ", "ở ẩn", "ở cữ", "ở dưng", "ở đậu", "ở đợ", "ở không", "ở lại", "ở lì", "ở lổ", "ở mùa", "ở mướn", "ở năm", "ở nể", "ở rể", "ở thuê", "ở trần", "ở truồng", "ở vậy", "ớ này", "ơi", "ơi ới", "ớm", "ơn huệ", "ơn nghĩa", "ơn ớn", "ớn mình", "ợt", "pa nô", "pa tê", "pan", "pao", "pê đan", "pê ni xi lin", "pha chế", "pha giống", "pha loãng", "pha tạp", "pha tiếng", "pha trộn", "phả", "phả hệ", "phả hệ học", "phả hệ học", "phá bỉnh", "phá bỏ", "phá cách", "phá cỗ", "phá của", "phá gia", "phá giới", "phá hoang", "phá hoẵng", "phá lệ", "phá ngang", "phá ngầm", "phá nước", "phá sập", "phá tan", "phá tân", "phá thối", "phá trận", "phá vây", "phá vỡ", "phá xa", "phác thảo", "phác thực", "phác tính", "phách lác", "phách tấu", "phai lạt", "phai mờ", "phai nhạt", "phải bả", "phải cái", "phải chi", "phải đòn", "phải đúa", "phải gái", "phải giá", "phải gió", "phải giờ", "phải khi", "phải lại", "phải phép", "phải rồi", "phải tội", "phải trái", "phải vạ", "phái sinh", "phái yếu", "phàm ăn", "phàm lệ", "phàm nhân", "phạm đồ", "phạm húy", "phạm phòng", "phạm quy", "phạm thượng", "Phan Bội Châu", "Phan Đình Phùng", "Phan Văn Trị", "phán bảo", "phán đoán", "phán sự", "phán truyền", "phạn", "phạn điếm", "Phạn học", "Phạn ngữ", "phạng", "phành phạch", "phao câu", "phao ngôn", "phao phí", "phao tiêu", "phào", "pháo cao xạ", "pháo cối", "pháo dây", "pháo đại", "pháo đập", "pháo đùng", "pháo hạm", "pháo hiệu", "pháo hoa", "pháo lệnh", "pháo sáng", "pháo tép", "pháo thủ", "pháo thuyền", "pháo xiết", "pháp bảo", "pháp danh", "pháp hóa", "pháp học", "pháp lệnh", "pháp ngữ", "pháp nhân", "pháp quan", "pháp quy", "pháp quyền", "pháp sư", "pháp thuật", "pháp thuộc", "pháp trị", "phát ban", "phát binh", "phát bóng", "phát canh", "phát chẩn", "phát dục", "phát điên", "phát điện", "phát đoan", "phát động", "phát hiện", "phát hỏa", "phát huy", "phát kiến", "phát lưu", "phát mại", "phát nguyên", "phát nhiệt", "phát phì", "phát quang", "phát rẫy", "phát sáng", "phát sinh", "phát sốt", "phát tài", "phát tán", "phát tang", "phát thanh viên", "phát thanh viên", "phát tích", "phát tiết", "phát triển", "phát vãng", "phát vấn", "phát xuất", "phạt đền", "phạt giam", "phạt góc", "phạt mộc", "phạt tù", "phạt vạ", "phạt vi cảnh", "phau", "phay", "phắc", "phăm phăm", "phăm phắp", "phăn phắt", "phăng", "phăng phắc", "phăng teo", "phẳng phắn", "phắt", "phầm phập", "phẩm bình", "phẩm cách", "phẩm cấp", "phẩm đề", "phẩm hàm", "phẩm loại", "phẩm phục", "phẩm trật", "phẩm tước", "phân ban", "phân bào", "phân bắc", "phân bậc", "phân bì", "phân bổ", "phân bố", "phân bộ", "phân bua", "phân cách", "phân cắt", "phân chi", "phân chim", "phân chuồng", "phân chương trình", "phân chương trình", "phân cục", "phân cực", "phân cực kế", "phân cực kế", "phân dị", "phân đạm", "phân điểm", "phân định", "phân đội", "phân đốt", "phân giác", "phân giới", "phân hạch", "phân hạng", "phân hệ", "phân hiệu", "phân hóa", "phân hóa học", "phân hóa học", "phân học", "phân hội", "phân lân", "phân lập", "phân liệt", "phân loài", "phân loại học", "phân loại học", "phân lớp", "phân lũ", "phân minh", "phân mục", "phân ngành", "phân nhiệm", "phân phát", "phân phối", "phân tâm", "phân thủy", "phân tranh", "phân trần", "phân tử lượng", "phân tử lượng", "phân ủ", "phân vai", "phân vân", "phân vô cơ", "phân vua", "phân vùng", "phân xanh", "phân xử", "phần đông", "phần hồn", "phần lớn", "phần mộ", "phần nào", "phần nhiều", "phần phật", "phần trăm", "phần tử", "phần việc", "phẩn", "phẫn", "phẫn chí", "phẫn kích", "phẫn nộ", "phẫn uất", "phấn rôm", "phấn sáp", "phấn son", "phấn trần", "phận", "phận bạc", "phận bồ", "phấp phỏng", "phấp phới", "phập", "phập phồng", "phất phới", "phật Bà", "phật đài", "phật đản", "phật đường", "phật giáo", "phật học", "phật lăng", "phật lòng", "phật sống", "phật thủ", "phật tổ", "phật ý", "phẫu", "phẫu thuật", "phẫu thuật viên", "phây phây", "phẩy", "phẩy khuẩn", "phe phẩy", "phè", "phè phè", "phèn chua", "phèng phèng", "phèo", "phép chia", "phép cộng", "phép cưới", "phép lành", "phép mầu", "phép nghỉ", "phép nhà", "phép nhân", "phép tắc", "phép thông công", "phép thuật", "phép trừ", "phép vua", "phét", "phét lác", "phẹt", "phê duyệt", "phê phán", "phề phệ", "phế", "phế binh", "phế cầu khuẩn", "phế đế", "phế lập", "phế liệu", "phế nang", "phế nô", "phế quản", "phế thải", "phế tích", "phế vị", "phế viêm", "phệ bụng", "phệ nệ", "phếch", "phên", "phễn", "phềnh", "phết", "phệt", "phều", "phều phào", "phi báo", "phi chính trị", "phi công vũ trụ", "phi giáo hội", "phi hành vũ trụ", "phi kiếm", "phi lao", "phi lộ", "phi mậu dịch", "phi ngã", "phi nghĩa", "phi phàm", "phi pháo", "phi pháp", "phi quân sự", "phi quân sự hóa", "phi quân sự hóa", "phi sản xuất", "phi tần", "phi thời gian", "phi thực dân hóa", "phi thực tại", "phi trọng lượng", "phi trường", "phi vô sản", "phi vô sản hóa", "phì", "phì cười", "phì nộn", "phì phà", "phì phì", "phì phị", "phì phò", "phỉ", "phỉ chí", "phỉ dạ", "phỉ lòng", "phỉ nguyền", "phỉ nhổ", "phỉ phong", "phỉ sức", "phí", "Phí bảo hiểm", "phị", "phìa", "phìa tạo", "phịa", "phích", "phiếm", "phiếm ái", "phiếm chỉ", "phiếm định", "phiên bản", "phiên chế", "phiên chúa", "phiên hiệu", "phiên phiến", "phiên quốc", "phiên thần", "phiên thuộc", "phiên trấn", "phiền lụy", "phiền não", "phiền toái", "phiến diện", "phiến động", "phiến quân", "phiến thạch", "phiệt duyệt", "phiêu bạt", "phiêu diêu", "phiêu lãng", "phím loan", "phin", "phinh phính", "phình", "phình phình", "phình phĩnh", "phỉnh", "phỉnh mũi", "phỉnh nịnh", "phỉnh phờ", "phĩnh", "phĩnh bụng", "phính", "phịu", "pho", "pho mát", "phò tá", "phó bảng", "phó hội", "phó mặc", "phó ngữ", "phó phòng", "phó sứ", "phó thương hàn", "phó tiến sĩ", "phó văn phòng", "phó vương", "phóc", "phoi", "phòi", "phom", "phong ba", "phong bao", "phong bế", "phong cách", "phong cách học", "phong cách học", "phong cầm", "phong địa", "phong độ", "phong hàn", "phong hóa", "phong kế", "phong lưu", "phong môi", "phong nguyệt", "phong phanh", "phong quang", "phong sương", "phong thái", "phong thanh", "phong thấp", "phong thổ", "phong thủy", "phong tình", "Phong Trào Yêu Nước", "phong trần", "phong tục", "phong tư", "phong văn", "phong vân", "phong vận", "phong vị", "phong vũ biểu", "phòng giữ", "phòng hạn", "phòng hỏa", "phòng hộ", "phòng hờ", "phòng khách", "phòng khám", "phòng khi", "phòng khuê", "phòng mạch", "phòng ngủ", "phòng nhì", "phòng ốc", "phòng thân", "phòng the", "phòng thủ", "phòng thương mại", "phòng trà", "phòng tuyến", "phòng văn", "phòng vệ", "phỏng chừng", "phỏng dịch", "phỏng độ", "phỏng sinh học", "phỏng sinh học", "phỏng tính", "phóng bút", "phóng đại", "phóng điện", "phóng hỏa", "phóng khoáng", "phóng lãng", "phóng pháo", "phóng sinh", "phóng sự", "phóng tay", "phóng thanh", "phóng tinh", "phóng túng", "phót", "phọt", "phô", "phô bày", "phô diễn", "phổ", "phổ cập", "phổ độ", "phổ hệ", "phổ hệ học", "phổ hệ học", "phổ quát", "phổ thông đầu phiếu", "phố phường", "phố xá", "phốc", "phôi", "phôi sinh học", "phổi bò", "phối cảnh", "phối hợp", "phối nhạc", "phối trí", "phôm phốp", "phồm phàm", "phồn hoa", "phồn thịnh", "phồn vinh", "phông", "phổng phao", "phỗng", "phỗng tay trên", "phốp", "phốp pháp", "phơ", "phơ phơ", "phờ", "phở", "phở tái", "phơi áo", "phơi nắng", "phơi phóng", "phơi thây", "phới", "phơn phớt", "phớt", "phu bốc vác", "phu phen", "phu phụ", "phu quân", "phu trạm", "phu tử", "phu xe", "phù", "phù chú", "phù dâu", "phù dung", "phù điêu", "phù hiệu", "phù hoa", "phù hộ", "phù kế", "phù phù", "phù rể", "phù sinh", "phù tá", "phù thế", "phù thịnh", "phù thũng", "phù trầm", "phù trì", "phù trợ", "phù vân", "phù voi", "phủ chính", "phủ doãn", "phủ dụ", "phủ đệ", "phủ phục", "phủ tạng", "phủ thừa", "phủ việt", "phú", "phú bẩm", "phú cường", "phú gia", "phú hào", "phú lục", "phú ông", "phú quý", "phụ bản", "phụ cận", "phụ chánh", "phụ chú", "phụ đạo", "phụ đính", "phụ động", "phụ gia", "phụ giảng", "phụ giáo", "phụ hệ", "phụ họa", "phụ hoàng", "phụ khuyết", "phụ lão", "phụ lực", "phụ mẫu", "phụ nghĩa", "phụ nhân", "phụ ơn", "phụ phẩm", "phụ phí", "phụ quyền", "phụ tải", "phụ thẩm", "phụ thu", "phụ thuộc", "phụ tình", "phụ tố", "phụ trợ", "phụ từ", "phụ tử", "phụ ước", "phụ vận", "phúc án", "Phúc âm", "phúc âm", "phúc ấm", "phúc đáp", "phúc hậu", "phúc khảo", "phúc lành", "phúc lộc", "phúc lợi", "phúc mạc", "phúc phận", "phúc thẩm", "phục binh", "phục chế", "phục chức", "phục cổ", "phục dược", "phục hoạt", "phục hồi", "phục hưng", "phục lăn", "phục mệnh", "phục nguyên", "phục phịch", "phục quốc", "phục sức", "phục thiện", "phục thù", "phục thuốc", "phục tội", "phục trang", "phục tráng", "phục tùng", "phục vụ", "phủi", "phủi ơn", "phun trào", "phùn", "phùn phụt", "phún xuất", "phung phá", "phùng", "phúng", "phúng dụ", "phúng phính", "phúng viếng", "phụng chỉ", "phụng hoàng", "phụng mệnh", "phụng phịu", "phụng thờ", "phút đầu", "phút giây", "phụt", "phuy", "phứa", "phức", "phức cảm", "phức chất", "phức hệ", "phức tạp hóa", "phức tạp hóa", "phưng phức", "phừng phừng", "phước", "phưỡn", "phướn", "phương án", "phương cách", "phương chi", "phương danh", "phương đông", "phương hại", "phương hướng", "phương kế", "phương ngôn", "phương ngữ", "phương phi", "phương sách", "phương tây", "phương trưởng", "phương trượng", "phương vị", "phương viên", "phường hội", "phướng", "phượng hoàng", "phượu", "phứt", "phựt", "pi", "pô", "qua cầu", "qua chuyện", "qua đường", "qua lại", "qua lân", "qua lửa than", "qua mặt", "qua mâu", "quả bàng", "quả báo", "quả học", "quả là", "quả lắc", "quả tạ", "quả thật", "quả thế", "quả thực", "quả tim", "quả tình", "quả tua", "quả vậy", "quá bán", "quá bộ", "quá cảnh", "quá chén", "quá chừng", "quá đà", "quá đáng", "quá đỗi", "quá giang", "quá hạn", "quá khích", "quá khổ", "quá lắm", "quá lời", "quá lứa", "quá lứa lỡ thì", "quá mức", "quá ngán", "quá nhiệt", "quá niên", "quá quan", "quá quắt", "quá tải", "quá thể", "quá trời", "quá trớn", "quá ư", "quá vãng", "quá xá", "quạ cái", "quạ khoang", "quạ quạ", "quác", "quạc", "quạc quạc", "quách", "quạch", "quai", "quai bị", "quai chèo", "quai mồm", "quai xanh", "quài", "quải", "quái", "quái ác", "quái đản", "quái gở", "quái lạ", "quái quỷ", "quái thai", "quàn", "quản bút", "quản ca", "quản chế", "quản chi", "quản cơ", "quản đạo", "quản giáo", "quản hạt", "quản huyền", "quản tượng", "quán cơm", "quán ngữ", "quán rượu", "quán thế", "quán thông", "quán triệt", "quàng quạc", "quàng quàng", "quảng bá", "quảng canh", "quảng giao", "quảng hàn", "quạnh", "quạnh vắng", "quát lác", "quạt bàn", "quạt điện", "quạt hòm", "quạt kéo", "quạt lúa", "quạt máy", "quạt mo", "quạt nan", "quàu quạu", "quay đi", "quay giáo", "quay gót", "quay lại", "quay lơ", "quay lưng", "quay ngoắt", "quay tít", "quay vòng", "quày", "quặc", "quăm quắm", "quằm quặm", "quằn quặn", "quằn quèo", "quằn quẹo", "quặn quẹo", "quẳng", "quặp râu", "quắt queo", "quân báo", "quân bưu", "quân cấp", "quân chế", "quân chủng", "quân cơ", "quân cờ", "quân dụng", "quân điền", "quân giới", "quân hạm", "quân huấn", "quân khí", "quân lương", "quân mã", "quân ngũ", "quân nhạc", "quân nhu", "quân phân", "quân phí", "quân phục", "quân quan", "quân quyền", "quân sự hóa", "quân sự hóa", "quân thân", "quân thần", "quân thù", "quân trang", "quân ủy", "quân vụ", "quân vương", "quân xa", "quân y sĩ", "quân y sĩ", "quân y viện", "quân y viện", "quần cộc", "quần cụt", "quần cư", "quần đông xuân", "quần đùi", "quần hệ", "quần hôn", "quần hồng", "quần hợp", "quần tây", "quần thể", "quần xã", "quẩn bách", "quẩn quanh", "quẩn trí", "quấn quýt", "quận huyện", "quận ủy", "quẩng mỡ", "quẫng", "quật ngã", "quây quẩy", "quây ráp", "quây tụ", "quầy quậy", "quẩy", "quẫy", "quấy đảo", "quấy phá", "quấy quả", "quấy quá", "que chọc lò", "que cời", "que đun nước", "que móc", "qué", "quen hơi", "quen lệ", "quen mui", "quen nết", "quen tay", "quen thân", "quen thuộc", "queo quắt", "quèo", "quẹo cọ", "quét đất", "quê nhà", "quê quán", "quế chi", "quế hòe", "quệch quạc", "quên bẵng", "quên béng", "quên khuấy", "quên lửng", "quên mình", "quện", "quệt trầu", "quều quào", "quốc sử quán", "quốc sử quán", "quốc tế hóa", "quốc tế hóa", "quốc tế ngữ", "quốc tế ngữ", "quốc tử giám", "quốc vụ khanh", "quốc vụ viện", "quờ", "quờ quạng", "quở mắng", "quở quang", "quy", "quy bản", "quy cách", "quy cách hóa", "quy cách hóa", "quy chiếu", "quy công", "quy củ", "quy hàng", "quy hoạch", "quy luật", "quy mô", "quy tắc", "quy ước", "quỳ", "quỳ lạy", "quỷ", "quỷ kế", "quỷ quái", "quỷ quyệt", "quỷ sứ", "quỷ thần", "quỷ thuật", "quỹ", "quý", "quý mến", "quỵ", "quyên giáo", "quyên góp", "quyền Anh", "quyền biến", "quyền môn", "quyền năng", "quyền nghi", "quyền quý", "quyền thần", "quyền thế", "quyến", "quyến dỗ", "quyện", "quyết chí", "quyết định luận", "quyết định luận", "quyết đoán", "quyết nghị", "quyết nhiên", "quyết thắng", "quyết ý", "quyệt", "quỳnh bôi", "quỷnh", "quýnh", "quýt", "quỵt", "ra bộ", "ra chiều", "ra công", "ra da", "ra đi an", "ra đi ô", "ra điều", "ra gì", "ra giêng", "ra hè", "ra hồn", "ra lệnh", "ra mồm", "ra ngôi", "ra người", "ra ơn", "ra phết", "ra quân", "ra ràng", "ra tay", "ra trận", "ra tro", "ra trò", "ra tuồng", "ra vào", "ra viện", "rà", "rà rẫm", "rả rích", "rã", "rã cánh", "rã họng", "rã ngũ", "rã người", "rã rời", "rác mắt", "rác rưởi", "rác tai", "rạc rài", "rách bươm", "rách mướp", "rách nát", "rách tươm", "rải thảm", "rái", "ram ráp", "rám", "ran", "ran rát", "ràn", "ràng rạng", "ràng rịt", "ráng", "ráng sức", "rạng", "rạng danh", "rạng đông", "rạng ngày", "ranh khôn", "ranh vặt", "rành rành", "rành rọt", "rảnh nợ", "rảnh rỗi", "rảnh thân", "rảnh việc", "rãnh trượt", "rao hàng", "rào đón", "rào giậu", "rào rào", "rào rạo", "rảo", "rão", "ráo hoảnh", "rạo", "ráp rạp", "rạp chiếu bóng", "rạp xiếc", "rát mặt", "rát rạt", "rát ruột", "rau bẹ", "rau bí", "rau cải", "rau cần", "rau cần tây", "rau cần tây", "rau câu", "rau cháo", "rau cỏ", "rau lê", "rau má", "rau rút", "ray", "rảy", "ráy", "rặc", "răm", "răm rắp", "rằm", "rắm", "rặm", "răn", "răn bảo", "răn đe", "rằn", "rằn ri", "rắn cạp nia", "rắn cạp nong", "rắn cấc", "rắn giun", "rắn lải", "rắn mang bành", "rắn mặt", "rắn mối", "rắn nước", "rắn ráo", "rắn rết", "rặn", "răng cưa", "răng hàm", "răng móc", "răng rắc", "răng sữa", "rắp", "rặt", "râm mát", "râm ran", "rầm", "rầm chìa", "rầm rầm", "rầm rập", "rầm rĩ", "rấm", "rấm bếp", "rấm rứt", "rấm vợ", "rậm rạp", "rậm rật", "rậm rì", "rậm rịch", "rân", "rân rát", "rân rấn", "rần rật", "rấn", "rấn bước", "rấp", "rập khuôn", "rập nổi", "rập rình", "rất đỗi", "râu mày", "râu mép", "râu quặp", "râu ria", "râu trê", "râu xồm", "rầu rỉ", "rầy la", "rầy rật", "re", "rè rè", "rẻ mạt", "rẻ quạt", "rẻ rúng", "rẻ thối", "rẻ tiền", "rẽ duyên", "rẽ đôi", "rẽ ngang", "rẽ ràng", "rẽ ròi", "rẽ rọt", "ré", "ren rén", "rèn cặp", "rèn đúc", "rén", "rén bước", "reo hò", "reo mừng", "rèo rẹo", "rẻo", "rẻo cao", "réo nợ", "réo rắt", "rẹo rọc", "rét buốt", "rét cóng", "rét mướt", "rét nàng Bân", "rét ngọt", "rề rà", "rề rề", "rễ bên", "rễ cái", "rễ chùm", "rễ cọc", "rễ con", "rễ củ", "rệ", "rếch", "rếch rác", "rên la", "rên rẩm", "rên rỉ", "rên siết", "rền", "rền rỉ", "rềnh ràng", "rệp son", "rều", "rệu", "rệu rã", "rệu rạo", "ri", "ri rỉ", "ri rí", "rì", "rì rầm", "rì rì", "rỉ hơi", "rỉ rả", "rỉ răng", "rỉ tai", "rí", "rí rách", "rị", "rỉa ráy", "rỉa rói", "rịa", "rích", "riêng biệt", "riêng lẻ", "riêng rẽ", "riêng tây", "riêng tư", "riềng", "riết", "riết ráo", "riết róng", "riệt", "riêu", "rim", "rin rít", "rinh", "rình mò", "rình rang", "rình rập", "rình rịch", "rĩnh", "rít", "rít răng", "riu riu", "ríu", "ro ro", "ro ró", "rò", "rỏ dãi", "rỏ giọt", "rõ khéo", "rõ rệt", "ró", "rọ mõm", "rọ rạy", "roi vọt", "rõi", "rói", "rom", "ròm", "rong kinh", "rong ruổi", "ròng rã", "ròng ròng", "rô bốt", "rô manh", "rồ dại", "rỗ chằng", "rỗ hoa", "rộ", "rốc", "rốc két", "rộc", "rồi đây", "rồi đời", "rồi ra", "rồi sao", "rồi tay", "rổi", "rỗi hơi", "rỗi rãi", "rỗi việc", "rối beng", "rối bời", "rối bù", "rối mắt", "rối mù", "rối rắm", "rối ruột", "rối tinh", "rối tung", "rôm", "rôm rả", "rôm sảy", "rôm trò", "rộm", "rôn rốt", "rộn", "rộn rã", "rộn ràng", "rộn rạo", "rông", "rồng rắn", "rồng rồng", "rỗng không", "rỗng ruột", "rỗng tuếch", "rộng cẳng", "rộng rãi", "rộp", "rốt", "rốt lòng", "rờ mó", "rờ rẩm", "rở", "rỡ ràng", "rớ", "rơi rụng", "rơi vãi", "rời bỏ", "rời mắt", "rời miệng", "rời tay", "rợi", "rơm rớm", "rờm", "rởm", "rớm", "rợm", "rơn", "rơn rớt", "rờn rợn", "rởn", "rợn", "rợp", "rợp bóng", "rợp đất", "rợp trời", "rớt dãi", "ru rú", "rù", "rù rì", "rù rù", "rủ", "rủ rỉ", "rủ rỉ rù rì", "rủ rỉ rù rì", "rũ tù", "rú rí", "rua", "rúc đầu", "rúc ráy", "rúc rỉa", "rúc rích", "rục xương", "rui", "rủi may", "rủi ro", "rụi", "rum", "rùm", "rùm beng", "rúm", "rúm ró", "run rẩy", "run rủi", "run run", "rùn", "rủn", "rủn chí", "rún rẩy", "rung cảm", "rung chuyển", "rung rinh", "rung rúc", "rung rung", "rùng", "rùng núi", "rùng rùng", "rủng ra rủng rỉnh", "rủng rẻng", "rủng rỉnh", "rụng trứng", "ruốc bông", "ruồi giấm", "ruồi muỗi", "ruồi nhặng", "ruồi trâu", "ruổi", "ruối", "ruộm", "ruồng", "ruồng bố", "ruỗng", "ruỗng nát", "ruộng bậc thang", "ruộng công", "ruộng đồng", "ruộng mạ", "ruộng rẫy", "ruộng rộc", "ruộng vườn", "ruột chay", "ruột gan", "ruột hồi", "ruột kết", "ruột rà", "ruột thẳng", "ruột thịt", "ruột tịt", "rúp", "rút bớt", "rút chạy", "rút cục", "rút cuộc", "rút gọn", "rút lại là", "rút mủ", "rút rát", "rút ruột", "rút tỉa", "rư", "rứ", "rưa rứa", "rửa cưa", "rửa mặn", "rửa ráy", "rửa ruột", "rữa nát", "rứa", "rực", "rực sáng", "rưng rức", "rừng cấm", "rừng già", "rừng nguyên sinh", "rừng nguyên thủy", "rừng rú", "rừng rực", "rừng xanh", "rửng mỡ", "rươi", "rười rượi", "rưởi", "rượi", "rườm", "rườm tai", "rườn rượt", "rướn", "rượn", "rương hòm", "rường", "rượu cẩm", "rượu cần", "rượu chè", "rượu khai vị", "rượu lậu", "rượu lễ", "rượu mạnh", "rứt", "rứt ruột", "sa bồi", "sa đì", "sa lệch", "sa môn", "sa mù", "sa nhân", "sa sả", "sa sâm", "sa thạch", "sa trường", "sã cánh", "sá quản", "sách dẫn", "sách đèn", "sách lịch", "sách phong", "sách xanh", "sạch nước", "sạch tội", "sai khiến", "sai khớp", "sai lệch", "sai nha", "sai phái", "sai phạm", "sai suyễn", "sài", "sãi", "sàm sỡ", "sạm mặt", "san", "san đàn", "san phẳng", "sàn diễn", "sàn sạn", "sàn sạt", "sản dục", "sản phụ", "sạn đạo", "sạn mặt", "sang đoạt", "sang độc", "sang năm", "sang sáng", "sang tiểu", "sang trang", "sàng sảy", "sàng tuyển", "sáng bạch", "sáng láng", "sáng lòa", "sáng lòe", "sáng mai", "sáng ngày", "sáng nghiệp", "sáng quắc", "sáng rõ", "sáng tỏ", "sáng trăng", "sáng trí", "sành ăn", "sành nghề", "sành sanh", "sảnh", "sảnh đường", "sánh đôi", "sánh tày", "sao bắc cực", "sao bắc đẩu", "sao bằng", "sao biển", "sao chế", "sao chụp", "sao đang", "sao đổi ngôi", "sao Hỏa", "sao Kim", "sao lãng", "sao lục", "sao Mộc", "sao nhãng", "sao nỡ", "sao sa", "sao Thổ", "sao Thủy", "sao truyền", "sảo", "sảo thai", "sáo đá", "sáo mép", "sáo mòn", "sáo ngữ", "sáo rỗng", "sạo sục", "sạp", "sát hợp", "sát khuẩn", "sát nách", "sát nhập", "sát phạt", "sát sao", "sát sườn", "sát thương", "sạt", "sạt sành", "sau chót", "sau cùng", "sau đây", "sau nữa", "sau sau", "sau xưa", "say khướt", "say máu", "say mèm", "sảy", "sắc diện", "sắc dục", "sắc giới", "sắc luật", "sắc mạo", "sắc mắc", "sắc nước", "sắc phong", "sắc phục", "sắc tố", "sắc tộc", "sắc tứ", "sặc gạch", "sặc tiết", "săm soi", "sắm nắm", "sắm sanh", "sặm", "săn đón", "săn đuổi", "săn gân", "săn sắt", "săn tin", "sẵn tay", "sắn bìm", "sắp sẵn", "sắp sửa", "sắt cầm", "sắt đá", "sắt thép", "sắt vụn", "sặt", "sâm nghiêm", "sâm nhung", "sâm sẩm", "sâm si", "sâm thương", "sầm sầm", "sầm sập", "sẩm", "sấm ngữ", "sấm truyền", "sậm", "sậm màu", "sân chơi", "sân gác", "sân hòe", "sân lai", "sân phơi", "sân rồng", "sân sau", "sân sướng", "sân thượng", "sần mặt", "sần sật", "sấp bóng", "sập sùi", "sất", "sật", "sâu bệnh", "sâu bọ", "sâu đậm", "sâu hiểm", "sâu hoắm", "sâu lắng", "sâu nặng", "sâu quảng", "sâu răng", "sâu rộng", "sâu rượu", "sâu sát", "sâu thẳm", "sâu xa", "sầu bi", "sầu đâu", "sầu não", "sầu riêng", "sẩy miệng", "sẩy vẩy", "sấy tóc", "se lòng", "se mình", "se môi", "se sẽ", "sè", "sè sè", "sè sẽ", "sẽ biết", "sẽ sàng", "sẹ", "sen đầm", "sẻn", "sẻn so", "seo", "sề sệ", "sể", "sễ", "sền sệt", "sến", "sênh", "sênh tiền", "sểnh ra", "sếp", "sệp", "sêu", "sêu tết", "si mê", "si ngốc", "sì sì", "sì sụp", "sì sụt", "sĩ", "sĩ hoạn", "sĩ khí", "sĩ lâm", "sĩ thứ", "sị", "sỉa", "sịa", "siễn", "siểng", "siêu cảm giác", "siêu cấu trúc", "siêu dẫn", "siêu đế quốc", "siêu độ", "siêu giai cấp", "siêu hạn", "siêu hiển vi", "siêu hiện thực", "siêu phản ứng", "siêu quần", "siêu quốc gia", "siêu sinh", "siêu thị", "siêu thoát", "siêu thực", "siêu vi khuẩn", "siêu việt", "sim", "sin", "sin sít", "sinh ba", "sinh bệnh học", "sinh bình", "sinh đẻ", "sinh địa", "sinh đồ", "sinh giới", "sinh hàn", "sinh hoạt phí", "sinh hoạt phí", "sinh khối", "sinh khương", "sinh linh", "sinh lợi", "sinh ngữ", "sinh nhai", "sinh nhiệt", "sinh nở", "sinh phần", "sinh quyển", "sinh sôi", "sinh thái", "sinh thành", "sinh thiết", "sinh thú", "sinh thực", "sinh tiền", "sinh tổng hợp", "sinh tư", "sinh từ", "sình sịch", "sỉnh", "sính lễ", "sính nghi", "sít sịt", "sịt", "so dây", "so đo", "so đọ", "so đũa", "so kè", "so màu", "sỏ", "soạn sửa", "soát vé", "soát xét", "soạt", "soi bóng", "soi rọi", "soi sáng", "sòi", "sỏi đời", "sỏi phân", "sỏi ruột", "sòm sọm", "sọm người", "sọm sẹm", "son phấn", "son rỗi", "son sẻ", "sòn sòn", "song âm tiết", "song âm tiết", "song ẩm", "song bản vị", "song ca", "song công", "song cực", "song đề", "song đường", "song hồ", "song kiếm", "song loan", "song ngữ", "song phi", "song sa", "song thần", "song thất lục bát", "song thê", "song thị", "song tiêu", "song trùng", "song tuyền", "song tử diệp", "sòng sọc", "soong", "sót nhau", "sọt giấy", "sọt rác", "sô", "sô gai", "sồ sề", "sổ cái", "sổ chi", "sổ đen", "sổ điền", "sổ hộ khẩu", "sổ hộ khẩu", "sổ kho", "sổ lòng", "sổ lương", "sổ mũi", "sổ nhật ký", "sổ quỹ", "sổ thai", "sổ thu", "sổ thu chi", "sổ thu chi", "sổ tiết kiệm", "sổ toẹt", "sổ vàng", "sỗ", "số bị nhân", "số bị nhân", "số dôi", "số dư", "số đen", "số đề", "số đo", "số đỏ", "số hiệu", "số hư", "số hữu tỉ", "số hữu tỉ", "số ít", "số không", "số kiếp", "số là", "số liệt", "số lớn", "số mệnh", "số mũ", "số mục", "số nguyên tố", "số nguyên tố", "số nhân", "số nhiều", "số phận", "số phức", "số thành", "số vô tỉ", "sốc", "sôi động", "sôi máu", "sôi tiết", "sổi", "sông cái", "sông con", "sông đào", "sông máng", "sông Ngân", "sông nước", "sồng", "sổng miệng", "sổng mồm", "sổng sểnh", "sống dai", "sống động", "sống lại", "sống lưng", "sống mái", "sống nhăn", "sống thác", "sốt cơn", "sốt gan", "sốt sột", "sốt xuất huyết", "sột sột", "sơ cảo", "sơ chế", "sơ cứu", "sơ đẳng", "sơ giản", "sơ học", "sơ kết", "sơ kiến", "sơ ngộ", "sơ nhiễm", "sơ phạm", "sơ sài", "sơ sịa", "sơ sót", "sơ sơ", "sơ thảo", "sơ tuyển", "sờ nắn", "sờ sẫm", "sờ soạng", "sờ sợ", "sở cậy", "sở cứ", "sở dĩ", "sở đắc", "sở kiến", "sở quan", "sở ước", "sở vọng", "sợ sệt", "sới", "sơm sớm", "sờm sỡ", "sớm chiều", "sớm khuya", "sớm muộn", "sớm sủa", "sơn cước", "sơn dã", "sơn hà", "sơn hệ", "sơn lâm", "sơn môn", "sơn pháo", "sơn then", "sơn tinh", "sơn trà", "sơn trại", "sơn trang", "sơn tràng", "sơn văn học", "sơn xì", "sơn xuyên", "sờn chí", "sởn gáy", "sởn sơ", "sớn sác", "su sẽ", "sù sụ", "sủi cảo", "sủi tăm", "sùm sòa", "sùm sụp", "sun", "sung chức", "sung quân", "sùng ái", "sùng mộ", "sùng ngoại", "sùng phụng", "sùng sục", "sùng thần", "sùng thượng", "sùng tín", "sũng", "suông tình", "suốt lượt", "sụp lạy", "sút người", "sụt giá", "sụt lở", "sụt lún", "sụt sịt", "sụt sùi", "sụt thế", "suy bại", "suy bì", "suy cử", "suy dinh dưỡng", "suy đoán", "suy đốn", "suy giảm", "suy mòn", "suy ngẫm", "suy rộng", "suy sụp", "suy sút", "suy suyễn", "suy tị", "suy tim", "suy tính", "suy tổn", "suy tư", "suy tưởng", "suy vi", "suy vong", "sư bà", "sư bác", "sư cô", "sư đoàn", "sư đoàn trưởng", "sư đoàn trưởng", "sư hữu", "sư mô", "sư nữ", "sư ông", "sư sãi", "sư sinh", "sư thầy", "sư thúc", "sườn sượt", "sương muối", "sường sượng", "Tây Bắc", "Thái", "Thanh Hoá", "thoả", "thoả chí", "thoả hiệp", "thoả lòng", "thoả mãn", "thoả thích", "thoả thuận", "Thời Đại Hùng Vương", "tình ca", "Tôn Thất Thuyết", "Trần Thủ Độ", "trống cơm", "tuồng", "ú oà", "úc", "Việt", "Việt Nam", "Vinh", "vú sữa", "Vũng Tàu", "xõa", "xòe", "xuýt", "xuýt xoát"];
exports.default = _default;
};

moduleFactories["node_modules/absol-vietnamese/RareWords.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vietnamese/RareWords.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = ["a la hán", "a-lô", "a-men", "a-míp", "a-pác-thai", "a-rập học", "a-xit", "à này", "ả đầu", "ả hằng", "ả phiện", "ả phù dung", "á châu", "á hoang mạc", "á khanh", "á nhiệt đới", "ác độc", "ác hại", "ác ma", "ác mỏ", "ác-mô-ni-ca", "ác ngôn", "ác nhân", "ác tăng", "ác thần", "ác vàng", "ách tắc", "ai cập học", "ái dà", "ái kỉ", "ái nữ", "ái nương", "ái tài", "ái tình học", "am tường", "ám điểm", "ám lệnh", "ám quẻ", "ám tiêu", "ám trợ", "an-bom", "an dưỡng đường", "an hảo", "an nhiên", "an thai", "an thân", "an toàn khu", "an tức hương", "án gian", "án lệ", "án lệnh", "án lí", "án mạch", "án ngồi", "án tích", "án từ", "ảng", "áng độ", "anh chàng", "anh danh", "anh hào", "anh hoa", "anh kiệt", "anh kim", "anh ngữ", "anh nhi", "anh tú", "anh văn", "anh vũ", "anh yến", "ảnh kế", "ảnh phổ", "ánh ỏi", "ao chuôm", "ao hồ", "ao-xơ", "ảo đăng", "ảo hóa", "áo bà ba", "áo bào", "áo bông", "áo bơ-lu-dông", "áo bờ-lu", "áo cà sa", "áo cẩm bào", "áo chẽn", "áo cộc", "áo cối", "áo hạt", "áo lễ", "áo lót mình", "áo mão", "áo may-ô", "áo não", "áo nậu", "áo nẹp", "áo nịt", "áo rộng", "áo sổ gấu", "áo ti-cô", "áo trào", "áo vét", "áo vét-tông", "ạo ực", "áp bách", "áp chót", "áp điện", "áp điệu", "áp kế", "áp kí", "áp-phích", "áp phục", "áp thấp", "áp út", "áp-xe", "át-lát", "ắc", "ắc-coóc", "ắc-quy", "ặc", "ăn ảnh", "ăn báo", "ăn báo cô", "ăn bẫm", "ăn bẩn", "ăn bậy", "ăn bẻo", "ăn bĩnh", "ăn bòn", "ăn boóng", "ăn bùn", "ăn bửa", "ăn câu", "ăn chằng", "ăn chực", "ăn cỏ", "ăn cuộc", "ăn dè", "ăn dỗ mồi", "ăn đất", "ăn đèn", "ăn độn", "ăn đụng", "ăn đút", "ăn ghẹ", "ăn ghém", "ăn già", "ăn giơ", "ăn gỏi", "ăn gỗ", "ăn hàng", "ăn hiệu", "ăn hớt", "ăn kẹ", "ăn kết", "ăn khách", "ăn khan", "ăn khảnh", "ăn khao", "ăn khem", "ăn lá", "ăn lấn", "ăn lận", "ăn lén", "ăn lễ", "ăn lên", "ăn lộc", "ăn mót", "ăn mực", "ăn ngọn", "ăn nhau", "ăn nhờ", "ăn non", "ăn phân", "ăn phấn", "ăn quà", "ăn quẩn", "ăn quỵt", "ăn rễ", "ăn sáng", "ăn sâu", "ăn tảo", "ăn theo", "ăn thịt", "ăn tiệm", "ăn to", "ăn tươi", "ăn vặt", "ăn vận", "ăn vọ", "ăn xài", "ăn xam", "ăn xôi", "ăn xuýt", "ăng ẳng", "ằng ặc", "ắng", "ắng cổ", "ặp", "ắt có", "ắt hẳn", "ắt là", "ậc", "âm ẩm", "âm bản", "âm binh", "âm bộ", "âm bội", "âm chủ", "âm dương lịch", "âm đức", "âm hao", "âm hiểm", "âm môn", "âm nhạc học", "âm nhấn", "âm phần", "âm tần", "âm trình", "âm vực", "ầm ì", "ẩm chồi", "ẩm độ", "ẩm ỉu", "ẩm kế", "ẩm sẫm", "ẩm sì", "ẩm sì ẩm sịt", "ẩm xìu", "ấm a ấm ách", "ấm a ấm ớ", "ấm a ấm ức", "ấm chuyên", "ấm đầu", "ấm lạnh", "ấm oái", "ấm óe", "ấm sinh", "ậm à ậm ực", "ậm ọe", "ậm ừ", "ậm ực", "ân điển", "ân đức", "ân khoa", "ân sủng", "ân thưởng", "ân trạch", "ân tứ", "ân ưu", "ẩn danh", "ẩn khuất", "ẩn lánh", "ẩn lậu", "ẩn nặc", "ẩn ngữ", "ẩn nhẫn", "ẩn núp", "ẩn tàng", "ẩn thân", "ấn độ giáo", "ấn tín học", "ấp iu", "âu tàu", "âu thuyền", "âu trang", "ẩu tả", "ấu học", "ấu nhi", "ấu thể", "ấu trĩ viện", "ầy", "ba-dô-ca", "ba-dơ", "ba đậu", "ba đậu nam", "ba đậu tây", "ba gạc", "ba kích", "ba-lê", "ba-lô", "ba-lông", "ba má", "ba ngay", "ba toác", "ba-toong", "ba-tui", "bà-la-môn", "bà ngoại", "bà nội", "bà xơ", "bã đậu", "bã nhờn", "bã trầu", "bá chiếm", "bá đạo", "bá ngọ", "bá nhọ", "bá vơ", "bác bỏ", "bác đại", "bác đoạt", "bác mẹ", "bác tạp", "bạc đầu", "bạc đen", "bạc điền", "bạc đức", "bạc hà cay", "bạc lông", "bạc má", "bạc phếch", "bạc thạch", "bạc thau", "bạc tóc", "bách cước ngô công", "bách giải", "bách linh", "bách nhật", "bạch bì", "bạch ốc", "bạch sản", "bạch tiền", "bạch vi", "bài bông", "bài chỉ", "bài giảng", "bài hương", "bài liệt", "bài niệu", "bài phong", "bài tây", "bài tính", "bài trung", "bài văn", "bải", "bải hải", "bãi dịch", "bãi khóa", "bái đường", "bái kim", "bái mạng", "bái tướng", "bái xái", "bàm bàm", "ban cấp", "ban-công", "ban cua", "ban đào", "ban đỏ", "ban lao", "ban sớm", "ban tối", "ban xuất huyết", "bàn cát", "bàn chặm", "bàn cứ", "bàn đẻ", "bàn gảy", "bàn láng", "bàn toạ", "bàn ủi", "bàn xoay", "bản hữu", "bản kép", "bản mẫu", "bản mường", "bản nguyên", "bản thổ", "bản văn học", "bán ảnh", "bán công", "bán du mục", "bán đoạn", "bán đợ", "bán đứt", "bán hạ", "bán hầu", "bán khuyên", "bán kí sinh", "bán manh", "bán mình", "bán phá giá", "bán rẻ", "bán rong", "bán tống", "bạn điền", "bạn nghịch", "bàng tiếp", "bảng đá", "bảng hổ", "bảng rồng", "bảng tra", "bành tượng", "bánh bẻ", "bánh tây", "bao biếm", "bao bố", "bao chầy", "bao dai", "bao dong", "bao hình", "bao hoa", "bao lâu", "bao nả", "bao nài", "bao phấn", "bao quản", "bao tời", "bao tượng", "bao xa", "bao xiết", "bào chữa viên", "bào cóc", "bào huynh", "bào mòn", "bào nang", "bào phác", "bào phòng", "bào quan", "bào tộc", "bào tử", "bào tử diệp", "bào tử nang", "bào tử thể", "bào tử trùng", "bào xác", "bào xoi", "bảo anh viện", "bảo cô viện", "bảo dân", "bảo học", "bảo nhi viện", "bảo quyến", "bảo thọ", "bão tuyến", "báo bổ", "báo bờm", "báo chương", "báo cừu", "báo hàng ngày", "báo hỉ", "báo tuyết", "bạo cửa", "bạo hỗ băng hà", "bạo tay", "basoi", "bát bội", "bát chữ", "bát cổ", "bát diện", "bát đàn", "bát họ", "bát-két", "bát ngôn", "bát nhã", "bát sành", "bát sứ", "bát tiền", "bạt nhĩ", "bạt phong", "bạt tụy", "bảu nhảu bàu nhàu", "bạu mặt", "bay là", "bày việc", "bắc cực quyền", "bắc đẩu", "bắc đẩu bội tinh", "bắc phương", "bắc sử", "bắc thần", "băm bổ", "bắn bia", "bắn hơi", "bắn nợ", "băng âm", "băng băng", "băng cầu", "băng chừng", "băng dính", "băng tang", "băng tay", "băng tréo", "bằng đẳng", "bằng được", "bằng nhau", "bắp chuối", "bắt bánh", "bắt bò", "bắt bú", "bắt được", "bắt khoán", "bắt lẽ", "bắt lời", "bắt lửa", "bắt màu", "bắt thường", "bậc thang", "bậc thềm", "bẩm thụ", "bấm chí", "bấm gáy", "bậm bạp", "bần bạc", "bần bạch", "bần dân", "bần khổ", "bần nữ", "bẩn bụng", "bấn bíu", "bận bộn", "bận chân", "bâng bâng", "bầng", "bầng bầng", "bập bà bập bồng", "bất can", "bất câu", "bất cộng tác", "bất đẳng thức", "bất đề kháng", "bất hoà", "bất hòa giải", "bất hợp cách", "bất hợp lí", "bất hợp thức", "bất khả quy", "bất khả tri luận", "bất kì", "bất kính", "bất lão", "bất mục", "bất nghì", "bất ngoại", "bất phục", "bất tác vi", "bất tín", "bất tín nhiệm", "bất toàn", "bất tuân", "bật đèn", "bật hơi", "bật lò-xo", "bật ngửa", "bầu bầu", "bầu chủ", "bầu eo", "bấu xén", "bẫy lồng", "bẫy lưới", "bẫy sập", "bấy bớt", "bẻ bão", "bẻ gãy", "bẻ lẽ", "bẻ quế", "bẽ mặt", "bé mọn", "bẹ mạng", "béc-giê", "bem bép", "bèm nhèm", "bén rễ", "beng beng", "bèo hoa dâu", "bèo mây", "bèo nhật bản", "bèo tây", "béo mép", "béo múp", "béo nân", "béo ngấy", "bẹp dúm", "bẹp gí", "bét tĩ", "bê-rê", "bê-tông", "bê trệ", "bề rộng", "bề sề", "bề trái", "bề trong", "bể trần", "bế ẵm", "bế bồng", "bệ sệ", "bệch bạch", "bên lề", "bền lâu", "bền lòng", "bền mùi", "bền va", "bến ô-tô", "bện hơi", "bệnh biến", "bệnh căn", "bệnh học", "bệnh khoa", "bệnh lí", "bêu đầu", "bi-a", "bi-đông", "bi hài", "bi hoan", "bi kí", "bi sầu", "bì bịch", "bì khổng", "bì kịp", "bì quyện", "bì sị", "bỉ lận", "bỉ lậu", "bí ba bí bét", "bí ba bí bô", "bí ba bí bốp", "bí bét", "bí bô", "bí bốp", "bí đao", "bí đỏ", "bí ngô", "bí quẫn", "bí rợ", "bí thơ", "bí thuật", "bí tử", "bị án", "bị bẹt", "bị đơn", "bia hơi", "bích-cốt", "bích-quy", "bích thủy", "biếm hoạ", "biên dạng", "biên đình", "biên tái", "biên uỷ", "biên viễn", "biển ngắm", "biến cải", "biến thân", "biến tiết", "biến tốc kế", "biến trá", "biện biệt", "biện lại", "biện lí", "biện liệu", "biện mang", "biện thần", "biệt cư", "biệt li", "biệt nhiễm", "biệt tịch", "biệt trú", "biệt ứng", "biểu chương", "biểu diện", "biểu đề", "biểu hiệu", "biểu thuế", "biểu tự", "bỉm", "binh cách", "binh chế", "binh đội", "binh hoả", "binh hoạ", "binh lương", "binh nhung", "binh trạm", "binh uy", "bình bút", "bình cổ cong", "bình dã", "bình điền", "bình đồ", "bình linh", "bình quân chủ nghĩa", "bình sa", "bình thành", "bình thì", "bình thông nhau", "bình thời", "bình thuỷ", "bình-toong", "bình tưới", "bình văn", "bịp già", "bít đốc", "bít họng", "bít miệng", "bít-tết", "bịt mũi", "bìu bịu", "bíu bo", "bịu", "bo bíu", "bo bo bỏm bỏm", "bò lan", "bò sữa", "bò toài", "bò vẽ", "bỏ ăn", "bỏ bả", "bỏ hoá", "bỏ lơ", "bỏ lơi", "bỏ ngục", "bỏ vạ", "bó bột", "bó cẳng", "bó chân", "bó chiếu", "bó đuốc", "bó giáp", "bó giò", "bó nẹp", "bó rọ", "bó tay", "bó tròn", "bọ da", "bọ hà", "bọ lá", "bọ mạt", "bọ mắm", "bọ nẹt", "bọ que", "bọ rùa", "bọ trĩ", "bóc mòn", "bóc niêm", "bóc trần", "bóc xén", "bọc máu", "bòi", "bòi ngòi", "bói kiều", "bói lửa", "bói rùa", "bói toán", "bói trăng", "bom a", "bom cháy", "bom h", "bom lửa", "bom na-pan", "bòm", "bòm bòm", "bón đón đòng", "bón lót", "bón nuôi đòng", "bón phân", "bón thúc", "bọn chúng", "bọn họ", "bọn mình", "bọn phát xít", "bọn tao", "bọn tớ", "bỏng nẻ", "bỏng ngô", "bỏng nổ", "bóng bàn", "bóng bán dẫn", "bóng bay", "bóng bầu dục", "bóng bẩy", "bóng bì", "bóng câu", "bóng chuyền", "bóng đá", "bóng đái", "bóng đè", "bóng điện", "bóng hạc", "bóng hồng", "bóng huỳnh", "bóng láng", "bóng lộn", "bóng ma", "bóng mát", "bóng mây", "bóng ném", "bóng nga", "bóng nguyệt", "bóng nhoáng", "bóng nước", "bóng ô", "bóng tà", "bóng tối", "bóng tròn", "bóng vàng", "bọng nước", "boong-ke", "boóng", "bóp bẹp", "bóp chắt", "bóp chuông", "bóp cò", "bóp gác", "bóp nát", "bóp vụn", "bọp bẹp", "bọt bèo", "bô xu", "bồ cu vẽ", "bồ hôi", "bồ kết", "bồ-tạt", "bổ bán", "bổ di", "bổ huyết", "bổ lưới", "bổ nhậm", "bổ xoài", "bố chồng", "bố dượng", "bố ghẻ", "bố lém", "bố mìn", "bố tời", "bố tử", "bố vợ", "bộ bảy", "bộ chiến", "bộ chọn", "bộ chuyển đổi", "bộ ghi", "bộ hoãn", "bộ li hợp", "bộ luật", "bộ năm", "bộ ngắm", "bộ nối", "bộ ổn nhiệt", "bộ rung", "bộ sáu", "bộ tám", "bộ tư", "bốc-can", "bốc nọc", "bốc phép", "bốc phệ", "bốc xếp", "bộc lôi", "bôi lem", "bôi mỡ", "bồi dục", "bồi khoản", "bồi thần", "bổi hổi", "bối mẫu", "bội chỉnh", "bội kế", "bội nghịch", "bội phục", "bội thụ tinh", "bội tốc", "bôn bả", "bôn hành", "bôn-sê-vích", "bôn-sê-vích hóa", "bôn xu", "bồn tắm", "bổn", "bốn bề", "bốn bể", "bốn chung quanh", "bốn cõi", "bốn tay", "bông đá", "bông mo", "bông tiêu", "bồng bồng", "bồng mạc", "bồng tang", "bổng trầm", "bộp chà chộp chộp", "bốt-can", "bột áo", "bột chua", "bột lọc", "bột men", "bột sam", "bột xay", "bột xoa", "bơ bải", "bơ lơ", "bơ xờ", "bờ khoảnh", "bờ-lu", "bờ lũy", "bờ quai", "bờ tường", "bở vía", "bợ đít", "bợ đỡ", "bơi nghiêng", "bơi thuyền", "bời lời", "bởi chưng", "bởi đâu", "bởi lẽ", "bởi tại", "bởi vậy", "bởi vì", "bới chuyện", "bơm chân không", "bơm điện", "bơm máy", "bơm xung", "bợm bãi", "bợm đĩ", "bợm già", "bỡn", "bỡn bờ", "bợp tai", "bu-gi", "bu-lông", "bu lu", "bù-loong", "bù trội", "bú mớm", "bua", "bùa hộ mệnh", "bùa hộ thân", "búa bổ củi", "búa chày", "búa đanh", "búa đinh", "búa gió", "búa gõ", "búa hơi", "búa quai", "búa rìu", "búa tạ", "bùi miệng", "bụi bờ", "bùm", "bùm tum", "bùn hoa", "bùn non", "bủn nhủn", "bún bò", "bún chả", "bún ốc", "bún riêu", "bún thang", "bùng binh", "búng báng", "buộc nút", "buộc thuốc", "buộc túm", "buồm dọc", "buồm vẹt", "buôn ngồi", "buồn buồn", "buông câu", "buông lơi", "buông lời", "buồng đẻ", "buồng loan", "buồng thêu", "buồng xuân", "buốt ruột", "búp-bê", "bút bi", "bút chì", "bút chiến", "bút cứ", "bút danh", "bút đàm", "bút giá", "bút hoa", "bút kí", "bút lông", "bút lực", "bút máy", "bút nghiên", "bút phớt", "bút tích", "bụt ốc", "bư bứ", "bưa", "bừa máy", "bừa mứa", "bừa ngả", "bừa phứa", "bừa san", "bữa ăn", "bữa cỗ", "bữa cơm", "bữa tê", "bức bàn", "bức chí", "bức cửa", "bực chí", "bửng", "bước chân", "bước qua", "bước sang", "bước sóng", "bước vào", "bướm cải", "bướm đêm", "bướm ống", "bướm quế", "bướm sâu đo", "bướm sói", "bươn bả", "bướp", "bướu khí", "bựt", "bưu kí", "bưu phiếu", "bưu vụ", "bửu vật", "ca-bin", "ca-cao", "ca kĩ", "ca-lo", "ca-lô", "ca-men", "ca múa nhạc", "ca-nô", "ca-nông", "ca thán", "ca-vát", "ca vũ nhạc", "cà bát", "cà gai", "cà khẳng cà kheo", "cà là khổ", "cà-mèn", "cà nhom", "cà ổi", "cà pháo", "cà-phê", "cà-phê", "cà riềng cà tỏi", "cà-rốt", "cà-rốt", "cà tong", "cà xóc", "cả cái", "cả cười", "cả quẫy", "cá bạc má", "cá chai", "cá chiên", "cá chình", "cá chình điện", "cá chó", "cá cờ", "cá đuôi cờ", "cá giống", "cá hàng chài", "cá hét", "cá hố", "cá kiếm", "cá kim", "cá kình", "cá lẻ", "cá lịch", "cá lon", "cá mắm", "cá mù làn", "cá mú", "cá nhồng", "cá rô tía", "cá thần tiên", "cá thể hoá", "cá tính học", "cá trác", "cá trê phi", "cá trổng", "cá tuyết", "cá vẹt", "cá vền", "cá vụn", "cá xác-đin", "các bà", "các-bon", "các-bon-nát", "các-bua", "các ngài", "các ông", "các-ten", "các-tông", "các-tơ", "cách cú", "cách đều", "cách điệu", "cách li", "cách nhiệt", "cách thuỷ", "cai bầu", "cai ngục", "cài nhài", "cải bổ", "cải cúc", "cải dại", "cải dụng", "cải hoá", "cải nguyên", "cải tân", "cãi lẫy", "cãi lí", "cãi nhau", "cái gì", "cam-nhông", "cam quýt", "cam thũng", "cam tích", "cảm giác học", "cảm giác luận", "cảm hoá", "cám lợn", "can-kê", "can táo", "can tràng", "can-xi", "cản quang", "càng cua", "cảng ngoài", "canh điền", "canh giờ", "canh tà", "cành cạnh", "cành cơi", "cành là", "cảnh địa", "cảnh tầm rộng", "cảnh tầm sâu", "cảnh vực", "cánh cờ", "cánh hữu", "cánh sáo", "cánh tả", "cạnh huyền", "cạnh khế", "cạnh khía", "cạnh khoé", "cạnh sườn", "cao-bồi", "cao đàm", "cao đan hoàn tán", "cao đoán", "cao kì", "cao kiềm", "cao-lanh", "cao sâu", "cao-su", "cao tan", "cao tầng tổ khảo", "cao uỷ", "cao xạ pháo", "cáo thoái", "cáo tị", "cáo tố", "cát-két", "cát kết", "cát lũy", "cát sĩ", "cau bụng", "cau cảu", "cau mặt", "cáu gắt", "cay mắt", "cày chìa vôi", "cày ngả rạ", "cày vỡ", "cảy tính", "cắc-tê", "cặc bò", "cặc heo", "căm xe", "cắm nhà", "cắm thẻ", "căn cắt", "căn duyên", "căn tố", "cằn cặt", "cắn gót", "căng buồm", "căng mọng", "căng nọc", "căng sữa", "căng-tin", "cẳng giò", "cẵng", "cắp nắp", "cắp tay", "cắp vặt", "cặp giấy", "cặp sốt", "cắt bom", "cắt đứt", "cắt họng", "cắt lân", "cắt ngọn", "cắt phiên", "cắt quãng", "cắt rốn", "cắt tai", "cắt toa", "cắt tóc", "cầm đài", "cầm đường", "cầm kì", "cầm lỏng", "cầm màu", "cẩm thạch hóa", "cấm kị", "cân cấn", "cân thường", "cân tiểu li", "cần chánh điện", "cẩn thủ", "cấn cái", "cận cổ", "cận giáp", "cận lao", "cận răng", "cận sản", "cận trạng", "cận văn học", "cận y học", "cấp biến", "cấp điệu", "cấp kênh", "cất bút", "cất chén", "cất đám", "cất lẻn", "cất mồm", "cất nóc", "cất phần", "câu chắp", "câu đằng", "câu giăng", "câu hát", "câu hoạ", "câu kẹo", "câu quăng", "câu thòng", "câu thơ", "câu ứng", "câu ví", "cầu bến", "cầu gai", "cầu kế", "cầu khẩu", "cầu khỉ", "cầu khuẩn", "cầu kì", "cầu phúc", "cầu sau", "cầu tai", "cầu tích", "cầu trước", "cầu trường", "cầu yên", "cẩu an", "cẩu hợp", "cấu kết", "cấu rứt", "cấu trúc học", "cậu bé", "cây bài", "cây bụi", "cây buồn", "cây cảnh", "cây cẩy", "cây đèn", "cây gõ", "cây hàng", "cây hương", "cây leo", "cây mầm", "cây mộc", "cây nhỏ", "cây nhỡ", "cây rơm", "cây thảo", "cây thóc", "cây thuốc", "cây trồng", "cầy bạc má", "cấy cày", "cấy hái", "cha dượng", "cha phó", "chà chạnh", "chả chay", "chả chìa", "chả cuốn", "chả nướng", "chả quế", "chạc chìu", "chạch đồng", "chai tay", "chài khách", "chải bồng", "chạm bong", "chạm khắc", "chạm lộng", "chạm lưới", "chán mắt", "chàng màng", "chàng mạng", "chàng ràng", "chàng rể", "chành chành", "chành chạnh", "chành chọe", "chảnh hoảnh", "chánh trương", "chao chát", "chào rơi", "chào xáo", "chão chàng", "chão chuộc", "cháo bồi", "cháo kê", "cháo lòng", "cháo rau", "cháo thí", "chạp mả", "chát lè", "chát ngấm", "chảu bảu", "cháu họ", "cháu ruột", "chay lòng", "chảy đất", "chảy máu cam", "chảy máu dạ dày", "chảy máu não", "cháy nắng", "cháy rực", "chạy ăn", "chạy bữa", "chạy dài", "chạy đàn", "chạy gạo", "chạy giặc", "chạy hậu", "chạy lại", "chạy nhăng", "chạy tiếp sức", "chạy trốn", "chắc ăn", "chắc bụng", "chắc là", "chắc mỏm", "chặc lưỡi", "chăm chăm", "chăm học", "chăm làm", "chằm bặp", "chăn chắn", "chằn", "chằn chặn", "chẵn đôi", "chắn cạ", "chăng nhẽ", "chăng tá", "chằng buộc", "chằng chớ", "chẳng kẻo", "chẳng lọ", "chẳng mấy khi", "chắp chảnh", "chắp dính", "chắp nối", "chặt chịa", "chặt cụt", "chặt cứng", "chặt khúc", "chặt ngọn", "chặt tay", "chậc lưỡi", "chấm câu", "chấm điểm", "chấm sáng", "chấm thi", "chậm bước", "chậm chân", "chậm đông", "chậm phát triển", "chậm rì", "chân bì", "chân bụng", "chân chạy", "chân chất", "chân chim", "chân đầu", "chân đều", "chân không đế", "chân không học", "chân lí", "chân lưng", "chân nâng", "chân nhái", "chân nhân", "chân nhện", "chân què", "chân sào", "chân tẩy", "chân tính", "chân tóc", "chân trong", "chân vây", "chân voi", "chần chờ", "chẩn đoán học", "chẩn tế", "chấn lưu", "chấn phát", "chấn thương học", "chấn tiêu", "chấp chiếm", "chấp chứa", "chấp chưởng", "chấp lễ", "chấp pháp", "chấp uỷ", "chập cheng", "chập chừng", "chập mạch", "chất bột", "chất chính", "chất đệm", "chất đống", "chất keo", "chất khử", "chất nhớt", "chất thải", "chật cứng", "chật lèn", "chật ních", "châu lệ", "châu lị", "châu lụy", "châu mục", "châu ngọc", "châu phê", "châu quận", "châu thành", "châu trần", "chầu hẫu", "chầu mồm", "chầu phật", "chầu tổ", "chậu giặt", "chậu hoa", "chậu thau", "chấy rận", "che bóng", "che chắn", "che khuất", "che kín", "che mắt", "che miệng", "che mờ", "che tàn", "chè bà cốt", "chè bồm", "chè búp", "chè cốm", "chè hột", "chè kho", "chè khoai", "chè lam", "chẻ tre", "chem chẻm", "chèn bẩy", "chẻn hoẻn", "chén bạch định", "chén đồng", "chén hạt mít", "chén mồi", "chén nung", "chén quan hà", "chén quân", "chén quỳnh", "chén thề", "chén tống", "chẹn họng", "cheng cheng", "cheo veo", "chèo chẹo", "chẻo lẻo", "chẻo miệng", "chéo chó", "chép miệng", "chép tay", "chẹp bẹp", "chét tay", "chề chà", "chề chề", "chế hoá", "chế khoa", "chế phục", "chế tài", "chế ước", "chế xuất", "chềm chễm", "chênh chếch", "chềnh ềnh", "chểnh choảng", "chễnh chện", "chết chém", "chết chẹt", "chết chìm", "chết cỏng", "chết cười", "chết đắm", "chết đâm", "chết đói", "chết đòn", "chết gí", "chết hụt", "chết khát", "chết khiếp", "chết khô", "chết mê", "chết mòn", "chết ngạt", "chết người", "chết tử", "chết yểu", "chi cấp", "chi chi chành chành", "chi chí", "chi dụng", "chi đội", "chi họ", "chi hội", "chi khu", "chi nài", "chi phái", "chi thu", "chi trả", "chi trì", "chi tử", "chi uỷ", "chi uỷ viên", "chì bì", "chỉ báo", "chỉ cần", "chỉ chực", "chỉ có", "chỉ hồng", "chỉ huy sở", "chỉ huyết", "chỉ nhị", "chỉ số hoá", "chỉ thị màu", "chỉ thực", "chỉ vì", "chỉ xác", "chí cao", "chí chí", "chí cốt", "chí khổ", "chí lí", "chí nguy", "chí như", "chí phải", "chí tâm", "chí thành", "chí thân", "chí thiện", "chí thiểu", "chí ư", "chị ả", "chị chồng", "chị dâu", "chị nuôi", "chia bài", "chia buồn", "chia chọn", "chia đàn", "chia đốt", "chia hết", "chia loại", "chia lô", "chia nhỏ", "chia ô", "chia phần", "chìa khoá", "chìa vặn", "chĩa ba", "chích chích", "chiếc thân", "chiêm tinh", "chiếm dụng", "chiếm địa", "chiền chiền", "chiến cục", "chiến địa", "chiến hoạ", "chiến mã", "chiến phí", "chiến quả", "chiến sử", "chiến thư", "chiến tranh học", "chiềng", "chiết áp", "chiết giá", "chiết suất", "chiết trung chủ nghĩa", "chiêu dụ", "chiêu đãi viên", "chiêu hàng", "chiếu án", "chiếu biểu", "chiếu cạp", "chiếu đàn", "chiếu đậu", "chiếu hoa", "chiếu manh", "chiếu mệnh", "chiếu sáng", "chiếu thư", "chiếu tướng", "chim bằng", "chim cắt", "chim còi", "chim cu", "chim cút", "chim cụt", "chim đớp ruồi", "chim gõ kiến", "chim hòa bình", "chim mỏ thìa", "chim mồi", "chim phường chèo", "chim ruồi", "chim sẻ đỏ", "chim sẻ ngô", "chim thước", "chim ưng", "chim xít", "chìm lỉm", "chìm ngập", "chìm nổi", "chỉn", "chín bệ", "chín khúc", "chín mòm", "chín nẫu", "chín nhũn", "chín nục", "chín rữa", "chín tới", "chín vàng", "chinh an", "chình ình", "chỉnh đảng", "chỉnh hiện", "chỉnh hợp", "chỉnh lí", "chỉnh phân", "chỉnh tâm", "chỉnh trang", "chỉnh trị", "chính cung", "chíp chíp", "chịu chết", "chịu chuyện", "chịu cực", "chịu cứng", "chịu đòn", "chịu hàng", "chịu khổ", "chịu lãi", "chịu lễ", "chịu lỗ", "chịu lỗi", "chịu lời", "chịu lụy", "chịu lửa", "chịu nhịn", "chịu non", "chịu ơn", "chịu tải", "chịu tho", "chịu tốt", "cho bõ", "cho cái", "cho chữ", "cho đang", "cho đành", "cho đến", "cho điểm", "cho đơn", "cho được", "cho không", "cho là", "cho máu", "cho qua", "cho rồi", "cho thuê", "cho vay", "chò chỉ", "chõ miệng", "chõ mồm", "chó bông", "chó dại", "chó đái", "chó đẻ", "chó ghẻ", "chó gio", "chó mực", "chó ngao", "chó ngộ", "chó rừng", "chọ", "choá", "choạc choạc", "choáng choàng", "choáng mắt", "choạng", "choạng vạng", "choăn choắt", "choắt cheo", "chóc", "chóc ngóc", "chọc gan", "chọc hút", "chọc nách", "chọc thủng", "chọc trời", "chói chang", "chói lói", "chói tai", "chọn ngày", "chòng ảnh", "chòng vòng", "chỏng vó", "choòng", "chóp chài", "chóp rễ", "chồ", "chỗ dựa", "chỗ đứng", "chỗ hiểm", "chỗ ngồi", "chỗ ở", "chỗ phạm", "chỗ quang", "chỗ trống", "chộ", "chốc lở", "chốc mép", "chốc mòng", "chồi ghép", "chồi gốc", "chồi mầm", "chồi sương", "chồi tái sinh", "chổi chà", "chổi cọ", "chổi đót", "chổi góp", "chổi lông", "chổi lúa", "chổi rễ", "chổi sể", "chổi tre", "chối kệ", "chối quanh", "chối tai", "chối xác", "chồm chộp", "chồm hổm", "chôn sống", "chôn vùi", "chồn bạc má", "chồn đèn", "chồn hôi", "chồn ngận hương", "chộn rộn", "chông chà", "chồng chưa cưới", "chồng đống", "chồng họ", "chồng khít", "chổng chểnh", "chổng vó", "chống càn", "chống đảng", "chống đau", "chống đông", "chống gỉ", "chống giáo hội", "chống hạn", "chống hao", "chống lao", "chống ma sát", "chống nhiễm khuẩn", "chống tăng", "chống tên lửa", "chống uốn ván", "chống va", "chống viêm", "chộp choạp", "chộp chộp", "chốt giữ", "chột ý", "chờ chực", "chờ mong", "chờ thời", "chở đò", "chớ chết", "chớ gì", "chớ hòng", "chớ kệ", "chớ thây", "chợ giời", "chơi chòi", "chơi chua", "chơi đểu", "chơi khăm", "chơi ngông", "chơi nhau", "chơi nhởn", "chơi phiếm", "chơi rong", "chơn", "chờn", "chờn chợn", "chợn", "chớt chát", "chu kì", "chu mật", "chu niên", "chu sa", "chu tuyền", "chù", "chủ âm", "chủ chứa", "chủ điểm", "chủ kiến", "chủ lễ", "chủ não", "chủ nhà", "chủ phạm", "chủ quán", "chủ soái", "chủ tài khoản", "chủ tể", "chủ tế", "chủ tiệc", "chủ tố", "chủ trí", "chủ từ", "chú bé", "chú chích", "chú dượng", "chú họ", "chú nó", "chú rể", "chú ruột", "chú tiểu", "chua chỏng", "chua loét", "chua lòm", "chua me đất", "chua ngoét", "chua ngút", "chúa đất", "chúa sơn lâm", "chúa thượng", "chúa xuân", "chuẩn cứ", "chuẩn đô đốc", "chuẩn độ", "chuẩn nhận", "chuẩn tắc", "chuẩn uý", "chúc hạ", "chúc tết", "chuếch choáng", "chuệch choạng", "chui nhủi", "chũi", "chúi lái", "chùm hum", "chụm đầu", "chun chủn", "chùn bước", "chùn chùn", "chùn chũn", "chùn tay", "chủn", "chủn ngủn", "chung đỉnh", "chung khảo", "chung kì", "chung lộn", "chung lưng", "chung thuỷ", "chủng bào", "chủng chẳng", "chủng hệ", "chủng tộc chủ nghĩa", "chúng anh", "chúng bạn", "chúng bay", "chúng cháu", "chúng con", "chúng em", "chúng mày", "chúng ông", "chúng tao", "chúng tớ", "chuồi chuội", "chuối rẻ quạt", "chuội nợ", "chuồn chuồn kim", "chuồn chuồn ngô", "chuồng chồ", "chuồng gio", "chuồng hôi", "chuột lắt", "chuột nhím", "chụp bóng", "chụp điện", "chụp hình", "chút nào", "chút nữa", "chút phận", "chút thân", "chụt chịt", "chuyên biệt", "chuyên doanh", "chuyên luận", "chuyên mục", "chuyên nhất", "chuyên trị", "chuyền bóng", "chuyền máu", "chuyền tay", "chuyển cữu", "chuyển dòng", "chuyển đệ", "chuyển điệu", "chuyển đổi", "chuyển động học", "chuyển giọng", "chuyển hoán", "chuyển hồi", "chuyển mã", "chuyển mạch", "chuyển nghĩa", "chuyển soạn", "chuyển tải", "chuyển thể", "chuyển vận", "chuyển vế", "chuyện chơi", "chuyện gẫu", "chuyện nhảm", "chư bà", "chư huynh", "chư ông", "chư tăng", "chư vị", "chừ bự", "chữ chân", "chữ con", "chữ đệm", "chữ đồng", "chữ hiếu", "chữ hoa", "chữ in", "chữ kí", "chữ ngả", "chữ nghiêng", "chữ rông", "chữ rời", "chữ tây", "chữ thập ngoặc", "chữ tình", "chữ tòng", "chữ triện", "chữ trung", "chữ vạn", "chữ viết", "chứ như", "chứ sao", "chưa chút", "chưa từng", "chừa bỏ", "chừa mặt", "chửa trâu", "chửa trứng", "chữa bệnh", "chữa cháy", "chứa gá", "chứa trọ", "chức phẩm", "chức sự", "chức việc", "chửi chữ", "chửi đổng", "chửi xỏ", "chưn", "chừng độ", "chừng đỗi", "chững chàng", "chứng duyệt", "chứng giải", "chứng nghiệm", "chứng tật", "chứng tích", "chứng tri", "chương cú", "chương đài", "chương hồi", "chương hướng", "chưởng", "chưởng cơ", "chưởng lí", "chướng mắt", "co co cỏm cỏm", "co cỏm", "co cụm", "co cứng", "co dúm", "co khít", "co lại", "co mình", "co rúm", "co thắt", "cò bạch", "cò già", "cò hương", "cò khoang", "cò quay", "cò ruồi", "cò thìa", "cỏ ba lá", "cỏ ban", "cỏ chét", "cỏ dại", "cỏ dùi trống", "cỏ lác", "cỏ lông lợn", "cỏ lùng", "cỏ lức", "cỏ nến", "cỏ roi ngựa", "cỏ sữa", "cỏ xước", "có án", "có bát ăn", "có bầu", "có bụng tốt", "có chăng", "có chân", "có chí", "có chuyện", "có chứ", "có con", "có công", "có cơ", "có cớ", "có duyên", "có đâu", "có gan", "có hạn", "có hạnh", "có kinh", "có lí", "có lòng", "có lỗi", "có lợi", "có ma", "có mã", "có mẽ", "có một", "có mùi", "có nết", "có nghì", "có người", "có nhẽ", "có ơn", "có phép", "có phúc", "có phước", "có sẵn", "có tài", "có tật", "có thế", "có tiếng", "có tội", "có vị", "có vú", "có ý", "cọ dầu", "cóc bùn", "cóc cần", "cóc vàng", "cọc cà cọc cạnh", "cọc leo", "cọc sợi", "cọc tiêu", "coi được", "coi hát", "coi khinh", "coi mắt", "coi ngó", "coi như", "coi trọng", "cõi âm", "cõi lòng", "cõi mộng", "cõi tiên", "cõi trần", "cõi tục", "cói bông", "cói giấy", "cói giùi", "cói túi", "com-lê", "com-măng-ca", "com-pa", "còm lưng", "còm nhỏm còn nhom", "cọm già", "cọm rọm", "con bài", "con bọ", "con cả", "con chạy", "con chồng", "con côi", "con cúi", "con cưng", "con dại", "con dâu", "con dấu", "con dòng", "con đàn", "con đẻ", "con đĩ", "con đòi", "con đực", "con đường", "con ghẻ", "con giấm", "con giống", "con hát", "con hầu", "con khăng", "con khẳng", "con lăn", "con mái", "con mắt", "con mụ", "con ngựa", "con nhài", "con nhỏ", "con nụ", "con nuôi", "con sợi", "con tàu", "con thịt", "con thơ", "con thứ", "con trẻ", "con trưởng", "con trượt", "con út", "con ve", "con xỏ", "còn nguyên", "còn tiếp", "cong cong", "còng queo", "cỏng", "cóp nhặt", "cóp nhóp", "cót", "cọt", "cô ả", "cô ai tử", "cô bé", "cô chiêu", "cô đặc", "cô đầu", "cô đòng", "cô đọng", "cô độc", "cô đỡ", "cô đúc", "cô gái", "cô giáo", "cô lậu", "cô liêu", "cô miên", "cô mình", "cô mụ", "cô nàng", "cô nhi viện", "cô phòng", "cô ta", "cô thế", "cô tịch", "cô trung", "cô tử", "cô ve", "cồ cộ", "cổ bẻ", "cổ bồng", "cổ cánh", "cổ chày", "cổ chân", "cổ cồn", "cổ dân tộc học", "cổ đại", "cổ đặc hữu", "cổ địa lý", "cổ độ", "cổ đông", "cổ động vật học", "cổ đứng", "cổ giả", "cổ họa", "cổ hoặc", "cổ họng", "cổ hũ", "cổ khí hậu", "cổ khí hậu học", "cổ kim", "cổ kính", "cổ lai", "cổ leo", "cổ lệ", "cổ lọ", "cổ lỗ", "cổ ngạn", "cổ ngữ", "cổ ngữ học", "cổ nhiệt đới", "cổ phong", "cổ quái", "cổ sinh", "cổ sinh vật bệnh học", "cổ sinh vật học", "cổ sơ", "cổ sử", "cổ tay", "cổ tâm lí học", "cổ tế bào học", "cổ thạch khí", "cổ thi", "cổ thìa", "cổ tự", "cổ tự học", "cổ tượng", "cổ văn", "cổ văn học", "cổ vũ", "cổ xúy", "cổ xưa", "cỗ áo", "cỗ bài", "cỗ bàn", "cỗ chay", "cỗ đòn", "cỗ kiệu", "cỗ lòng", "cỗ săng", "cỗ trung thu", "cỗ ván", "cỗ xe", "cố chết", "cố chí", "cố chủ", "cố công", "cố cùng", "cố cựu", "cố đạo", "cố định luận", "cố kết", "cố lão", "cố nhiên", "cố nông", "cố quận", "cố sự", "cố sức", "cố tâm", "cố tật", "cố thổ", "cố thủ", "cố tình", "cố ý", "cộ", "cốc biển", "cốc đế", "cốc láo", "cốc loại", "cốc-tay", "cốc vại", "cốc vũ", "côi", "cổi", "cỗi nguồn", "cỗi phúc", "cỗi rễ", "cội nguồn", "cội rễ", "côm", "côm cốp", "cồm cộp", "côn quang", "côn quyền", "côn trùng học", "cồn cào", "cồn cộn", "cồn ngọt", "cồn ruột", "cồn thuốc", "cổn bào", "cổn miện", "cốn", "công an viên", "công báo", "công-bát", "công bằng", "công binh", "công binh xưởng", "công bình", "công bộc", "công bội", "công cán", "công cáo ủy viên", "công chuyện", "công chức", "công chứng", "công chứng thư", "công chứng viên", "công cốc", "công cộng", "công cụ", "công cuộc", "công diễn", "công dụng", "công điểm", "công điền", "công điện", "công điệp", "công đoạn", "công đức", "công đường", "công hãm", "công hầu", "công hiệu", "công hội", "công huân", "công hữu", "công hữu hoá", "công kênh", "công khanh", "công khố", "công kích", "công kiên", "công lao", "công lập", "công lệ", "công lênh", "công lệnh", "công lí", "công lịch", "công liên", "công lợi", "công lương", "công mẫu", "công minh", "công môn", "công năng", "công nghệ học", "công nghị", "công nghĩa", "công nghiệp hoá", "công nghiệp phẩm", "công nguyên", "công nhân viên", "công nhật", "công nhiên", "công nông", "công nông nghiệp", "công nợ", "công nữ", "công nương", "công ơn", "công phá", "công phạt", "công phẫn", "công phiếu", "công phu", "công quốc", "công quỹ", "công quyền", "công sá", "công sai", "công sản", "công sảnh", "công sở", "công suất", "công sứ", "công sứ quán", "công sức", "công tác phí", "công tắc", "công tâm", "công-te-nơ", "công thải", "công thẩm", "công thần", "công thổ", "công thủ", "công thự", "công thương gia", "công thương nghiệp", "công ti", "công tích", "công toi", "công tố", "công tố viên", "công tố viện", "công tôn", "công tôn nữ", "công-tơ", "công trạng", "công trình", "công trình sư", "công trợ", "công truyền", "công trường", "công tư", "công tử", "công tử bột", "công tử vỏ", "công tước", "công ước", "công vận", "công việc", "công viên", "công vụ", "công xá", "công-xôn", "cồng cộc", "cổng cái", "cổng chào", "cổng hậu", "cổng ngõ", "cổng rả", "cống lễ", "cống nạp", "cống ngầm", "cống phẩm", "cống rãnh", "cống sĩ", "cống sinh", "cống vật", "cộng bào", "cộng đồng", "cộng hoà", "cộng hoà hoá", "cộng hưởng", "cộng sản chủ nghĩa", "cộng sinh", "cộng sự", "cộng tác viên", "cộng tồn", "cốp", "cốp-pha", "cộp", "cốt cách", "cốt cán", "cốt giao", "cốt hoá", "cốt học", "cốt khí", "cốt lõi", "cốt nhất", "cốt thép", "cốt tủy", "cốt tử", "cốt yếu", "cột buồm", "cột cái", "cột cây số", "cột chống", "cột dây thép", "cột gôn", "cột lái", "cột lòng", "cột mốt", "cột mỡ", "cột mũi", "cột ngắm", "cột ốp", "cột sống", "cột tháp", "cột tín hiệu", "cột tủy", "cột xăng", "cơ ba đầu", "cơ bần", "cơ biến", "cơ bìu", "cơ căng", "cơ cầu", "cơ cấu", "cơ chế", "cơ chỉ", "cơ chừng", "cơ công kế", "cơ công kí", "cơ duỗi", "cơ duyên", "cơ đồ", "cơ gấp", "cơ giạng", "cơ giới hóa", "cơ hàn", "cơ hoành", "cơ học", "cơ hồ", "cơ hội chủ nghĩa", "cơ khí", "cơ khí hóa", "cơ khít", "cơ khổ", "cơ kí", "cơ lí", "cơ lỡ", "cơ mà", "cơ man", "cơ mật", "cơ mật viện", "cơ mầu", "cơ năng", "cơ năng kế", "cơ ngơi", "cơ ngũ", "cơ ngửa", "cơ nhỡ", "cơ niên", "cơ quan học", "cơ rối", "cơ sấp", "cơ số", "cơ sự", "cơ thang", "cơ thắt", "cơ thể học", "cơ thiền", "cơ tim", "cơ trần", "cơ trí", "cơ trời", "cơ trơn", "cơ vân", "cơ vận", "cơ xảo", "cơ xưởng", "cờ bỏi", "cờ đuôi nheo", "cờ hiệu", "cờ-lê", "cờ lệnh", "cờ lông công", "cờ mao", "cờ người", "cờ quạt", "cờ quốc tế", "cờ-rếp", "cờ rủ", "cờ trắng", "cờ vây", "cờ vía", "cờ vua", "cờ xí", "cớ chi", "cớ gì", "cớ sao", "cơi nới", "cời", "cởi trần", "cởi truồng", "cỡi", "cơm áo", "cơm bữa", "cơm cháo", "cơm chay", "cơm cháy", "cơm chiên", "cơm chim", "cơm dừa", "cơm không", "cơm lam", "cơm nắm", "cơm nếp", "cơm rang", "cơm suất", "cơm tây", "cơm thập cẩm", "cơm toi", "cơm vắt", "cớm", "cơn", "cơn cớ", "cơn cớn", "cờn cợn", "cỡn", "cỡn cờ", "cớn non", "cợn", "cớt nhả", "cợt nhả", "cợt nhợt", "cu cậu", "cu cu", "cu cũ", "cu gầm ghì", "cu-li", "cu-lông", "cu ngói", "cu sen", "cu xanh", "cù đinh", "cù là", "cù mì", "cù mộc", "cù nhằng", "cù nhầy", "cù rù", "cù túng", "củ ấu", "củ cải", "củ cải đường", "củ cái", "củ cẩm", "củ chính", "củ chóc", "củ chuối", "củ dong", "củ đao", "củ đậu", "củ gấu", "củ hợp", "củ mài", "củ nâu", "củ tỉ", "củ từ", "cũ càng", "cũ kĩ", "cũ nát", "cũ rích", "cú mèo", "cú móc", "cú muỗi", "cú rũ", "cú sút", "cú tuyết", "cụ bà", "cụ bị", "cụ cựa", "cụ kị", "cụ lớn", "cụ nhà", "cụ non", "cụ nội", "cụ ông", "cụ thể hóa", "cua bấy", "cua bể", "cua đồng", "cua gạch", "cua nhện", "cua óp", "cua-roa", "của ấy", "của cấm", "của chìm", "của công", "của đút", "của hiếm", "của hồi môn", "của hương hỏa", "của nả", "của này", "của nổi", "của nợ", "của riêng", "của thửa", "của tư", "cúa", "cúc bách nhiệt", "cúc bấm", "cúc cu", "cúc cúc", "cúc cung", "cúc đầu xuân", "cúc tần", "cúc trắng", "cúc vạn thọ", "cúc vàng", "cục bộ", "cục cằn", "cục cục", "cục cưng", "cục kịch", "cục phó", "cục súc", "cục tác", "cục thế", "cục trưởng", "cùi cụi", "cùi-dìa", "cùi tay", "củi đóm", "củi đuốc", "củi lửa", "củi rả", "củi rều", "củi tạ", "củi vụn", "cúi gằm", "cúi lạy", "cúi luồn", "cúi rạp", "cúi xin", "cum cúp", "cùm cụp", "cùm kẹp", "cúm rúm", "cụm nhọt", "cùn cụt", "cùn đời", "củn", "cũn cờ", "cũn cỡn", "cung bậc", "cung cách", "cung cấm", "cung cấp", "cung chiêm", "cung chiều", "cung chúc", "cung chức", "cung cúc", "cung điện", "cung hạ", "cung hỉ", "cung hiến", "cung khuyết", "cung kiếm", "cung kính", "cung long", "cung mây", "cung mê", "cung nga", "cung nguyệt", "cung phụng", "cung quảng", "cung quăng", "cung quế", "cung răng", "cung thang", "cung thất", "cung thiềm", "cung thiếu niên", "cung thương", "cùng bất đắc dĩ", "cùng bên", "cùng chẳng đã", "cùng chung", "cùng cực", "cùng dân", "cùng đinh", "cùng đồ", "cùng đường", "cùng gốc", "cùng kế", "cùng khốn", "cùng kì lí", "cùng kiệt", "cùng lúc", "cùng nguồn", "cùng nhau", "cùng nhân", "cùng quẫn", "cùng ra", "cùng tịch", "cùng tột", "cùng với", "củng mạc", "cũng cứ", "cũng nên", "cũng như", "cũng thể", "cũng thế", "cúng bái", "cúng cáo", "cúng cháo", "cúng cơm", "cúng được", "cúng giỗ", "cúng tế", "cúng vái", "cúng vọng", "cụng", "cuốc bàn", "cuốc bộ", "cuốc chim", "cuốc xới", "cuộc đấu", "cuộc đỏ đen", "cuộc đua", "cuộc họp", "cuộc lạc quyên", "cuộc sống", "cuộc thi", "cuộc vui", "cuối tuần", "cuội kết", "cuốn chiếu", "cuốn hút", "cuốn lá", "cuốn tổ sâu", "cuốn vó", "cuốn xéo", "cuộn khúc", "cuộn mình", "cuộn phim", "cuồng ẩm", "cuồng bạo", "cuồng cẳng", "cuồng chân", "cuồng chiến", "cuồng chữ", "cuồng chứng", "cuồng cuống", "cuồng dại", "cuồng dâm", "cuồng loạn", "cuồng nộ", "cuồng phong", "cuồng sĩ", "cuồng tưởng", "cuồng vọng", "cuống họng", "cuống lưu", "cuống nhị", "cuống noãn", "cuống quýt", "cuộng", "cúp đuôi", "cụp đuôi", "cụp tai", "cút ca cút kít", "cút kít", "cụt chân", "cụt lổng", "cụt lủn", "cụt tay", "cư sĩ", "cư tang", "cư trú", "cư xá", "cừ", "cừ khôi", "cử ai", "cử binh", "cử chỉ", "cử đỉnh", "cử động", "cử lễ", "cử nghiệp", "cử nhạc", "cử sự", "cử tạ", "cử toạ", "cử tri đoàn", "cử tử", "cứ liệu", "cứ như", "cứ việc", "cự đại", "cự hôn", "cự li", "cự nho", "cự nự", "cự phách", "cự phú", "cự thạch", "cự tộc", "cưa đá", "cưa máy", "cưa tay", "cửa bán vé", "cửa bể", "cửa bên", "cửa biển", "cửa bồ đề", "cửa bức bàn", "cửa chớp", "cửa công", "cửa cuốn", "cửa già", "cửa hiệu", "cửa khẩu", "cửa không", "cửa khổng", "cửa khuyết", "cửa kính", "cửa mạch", "cửa mái", "cửa miệng", "cửa mở", "cửa ngách", "cửa ngầm", "cửa ngõ", "cửa nhà", "cửa ô", "cửa phật", "cửa quan", "cửa quang", "cửa quyền", "cửa ra", "cửa tàu", "cửa tay", "cửa thiền", "cửa thông hơi", "cửa tò vò", "cửa trập", "cửa từ bi", "cửa van", "cửa viên", "cửa xe", "cứa cổ", "cựa gà", "cựa quậy", "cức bì", "cực bắc", "cực cầu", "cực chẳng đã", "cực dương", "cực đại", "cực đoan", "cực độ", "cực hàn", "cực hữu", "cực khoái", "cực khổ", "cực kì", "cực lạc", "cực lòng", "cực lực", "cực mạnh", "cực nam", "cực ngắn", "cửi", "cửi canh", "cưng cứng", "cửng", "cứng cáp", "cứng cát", "cứng còng", "cứng cổ", "cứng cựa", "cứng họng", "cứng khớp", "cứng lưỡi", "cứng miệng", "cứng mình", "cứng ngắc", "cứng nhắc", "cứng nhẳng", "cước chú", "cước sắc", "cước vận", "cười bò", "cười cợt", "cười duyên", "cười gằn", "cười giòn", "cười góp", "cười khà", "cười khan", "cười khẩy", "cười khì", "cười lăn", "cười mát", "cười mỉm", "cười ngất", "cười nhạt", "cười nịnh", "cười nụ", "cười ồ", "cười rộ", "cười rũ", "cười ruồi", "cười thầm", "cười trừ", "cười tủm", "cười vang", "cười xoà", "cưỡi", "cưỡi bổ", "cưỡi cổ", "cưỡi rồng", "cưới xin", "cườm cườm", "cương cường", "cương dũng", "cương giới", "cương máu", "cương mô", "cương mục", "cương ngạnh", "cương nghị", "cương thổ", "cương thường", "cương toả", "cương vị", "cương vực", "cương yếu", "cường bạo", "cường dương", "cường địch", "cường điệu", "cường hào", "cường kích", "cường lân", "cường quyền", "cường thần", "cường thịnh", "cường thủy", "cường toan", "cưỡng bách", "cưỡng chế", "cưỡng chiếm", "cưỡng ép", "cưỡng hiếp", "cưỡng hôn", "cướp bóc", "cướp chồng", "cướp cò", "cướp công", "cướp giật", "cướp lái", "cướp lời", "cướp ngày", "cướp ngôi", "cướp phá", "cứt cò", "cứt gián", "cứt lợn", "cứt mũi", "cứt ngựa", "cứt sắt", "cứt su", "cừu quốc", "cừu thị", "cửu lí hương", "cửu ngũ", "cửu nguyên", "cửu phẩm", "cửu trùng", "cữu", "cứu bần", "cứu bệnh", "cứu binh", "cứu chữa", "cứu giúp", "cứu hạn", "cứu hoả", "cứu hộ", "cứu khổ", "cứu mệnh", "cứu nguy", "cứu nhân", "cứu nước", "cứu quốc", "cứu tế", "cứu vãn", "cứu viện", "cứu vong", "cứu vớt", "cựu binh", "cựu giao", "cựu hiềm", "cựu học", "cựu học sinh", "cựu lệ", "cựu nho", "cựu thạch khí", "cựu thần", "cựu thế giới", "cựu ước", "da bát", "da bê", "da chì", "da cóc", "da cừu", "da dày", "da dầu", "da dê", "da đầu", "da đen", "da đỏ", "da đồng", "da gà", "da khô", "da lộn", "da lông", "da lươn", "da non", "da nổi hạt", "da rạn", "da sống", "da trắng", "da trời", "da vàng", "dà", "dã ca", "dã đề", "dã ngoại", "dã sử", "dã thự", "dã vị", "dá", "dạ cẩm", "dạ cỏ", "dạ con", "dạ dịp", "dạ đài", "dạ đề", "dạ hợp", "dạ hương", "dạ khúc", "dạ lá sách", "dạ lữ viện", "dạ múi khế", "dạ thị", "dạ tổ ong", "dạ xoa", "dác", "dai nhách", "dai nhằng", "dai sức", "dài đườn", "dài hạn", "dài hơi", "dài long", "dài lời", "dài lưng", "dài mồm", "dài ngoằng", "dài ngoẵng", "dài nhằng", "dải đồng", "dải khứu", "dải màn", "dải mũ", "dải rút", "dãi dầu", "dãi rớt", "dãi thẻ", "dái chân", "dái mít", "dái ngựa", "dái tai", "dại gái", "dại mặt", "dại trai", "dam", "dạm hỏi", "dạm mặt", "dan tay", "dàn bài", "dàn dựng", "dàn hoà", "dàn mặt", "dàn mỏng", "dàn nhạc", "dàn trận", "dàn ý", "dán mắt", "dán mũi", "dạn dày", "dạn dĩ", "dạn đòn", "dạn người", "dạn roi", "dàng dênh", "dáng bộ", "dáng chừng", "dáng dấp", "dáng đi", "dáng như", "dáng vẻ", "dáng vóc", "dạng bản", "dạng hình", "dạng thức", "danh bạ", "danh ca", "danh cách", "danh cầm", "danh diện", "danh gia", "danh giá", "danh hoạ", "danh kĩ", "danh nhân", "danh nho", "danh pháp", "danh sĩ", "danh sơn", "danh sư", "danh tài", "danh thắng", "danh thần", "danh thủ", "danh tiếng", "danh tiết", "danh tính", "danh tướng", "danh vị", "danh y", "dao cắt kính", "dao con", "dao dài", "dao díp", "dao động đồ", "dao động kế", "dao động kí", "dao ghép", "dao gọt", "dao kéo", "dao khắc", "dao mỗ", "dao phát", "dao rọc giấy", "dao trầu", "dạo chơi", "dạo mát", "dạo ổ", "dạo quanh", "dát mỏng", "dàu", "day lưng", "dày dày", "dãy cuốn", "dãy núi", "dăm bào", "dăm kèn", "dăm trống", "dăm xem", "dặm băng", "dăng dẳng", "dằng dặt", "dằng dịt", "dẳng", "dặng", "dắt tay", "dâm từ", "dâm yêu", "dấm dẳng", "dậm", "dân chủ hoá", "dân đinh", "dân khí", "dân phu", "dân thanh", "dân tuyển", "dân ước", "dần mòn", "dẫn bảo", "dẫn chuyện", "dẫn dắt", "dẫn đạo", "dẫn hát", "dẫn hướng", "dẫn khởi", "dẫn lễ", "dẫn lộ", "dẫn nạp", "dẫn thân", "dẫn thần xác", "dẫn thủy", "dẫn tiến", "dận ga", "dâng công", "dâng sao", "dật cư", "dật dờ", "dầu bạc hà", "dầu cho", "dầu dọc", "dầu dừa", "dầu đèn", "dầu giun", "dầu hoả", "dầu khuynh diệp", "dầu lạc", "dầu lai", "dầu long não", "dầu lửa", "dầu mà", "dầu máy", "dầu mè", "dầu nặng", "dầu nhớt", "dầu phụng", "dầu rái", "dầu sở", "dầu tẩy", "dầu thầu dầu", "dầu thông", "dầu trai", "dầu tràm", "dầu trẩu", "dầu ve", "dầu vừng", "dấu chấm lửng", "dấu kiểm", "dấu ngoặc ôm", "dấu phết", "dây bông xanh", "dây buộc", "dây chão", "dây cu-roa", "dây đàn", "dây đau xương", "dây đeo", "dây gắm", "dây guồi", "dây kẽm", "dây khóa kéo", "dây lèo", "dây loan", "dây mật", "dây mộc thông", "dây néo", "dây nhảy", "dây ông lão", "dẫy", "dấy nghiệp", "de dé", "dẻ gai", "dẽ khoang", "dẻo tay", "dẹp đường", "dẹp giặc", "dẹp yên", "dẹt đét", "dẹt lét", "dê già", "dê rừng", "dể", "dễ ăn", "dễ đâu", "dễ tiêu", "dễ ưa", "dện", "di hoạ", "di lí", "di mờ", "di thể", "dì hai", "dì họ", "dì ruột", "dĩ hậu", "dĩ thượng", "dĩ tiền", "dị bào", "dị biến thái", "dị bội", "dị cảm", "dị giao", "dị hoá", "dị hợp tử", "dị kì", "dị nhiễm", "dị phát sinh", "dị sản", "dị sắc", "dị sinh trưởng", "dị sự", "dị trị", "dị trương", "dị ứng học", "dị ứng nguyên", "dị ứng thể", "dị vòng", "dích", "dịch lệ", "dịch ngược", "dịch phẩm", "dịch rỉ", "dịch thấm", "dịch xuôi", "diếc móc", "diêm trường", "diềm cửa", "diềm mạch", "diễn binh", "diễn hành", "diễn kịch", "diễn trường", "diện tích kế", "diếp củ", "diếp dại", "diếp ma", "diệp chi", "diệt chuột", "diều lửa", "diều mốc", "diều vằn", "diệu kì", "dinh dưỡng học", "dinh điền sứ", "dinh-tê", "dinh thất", "dinh thực", "dinh trại", "dính đạn", "dính máu", "dịu bớt", "do lai", "do thái hóa", "dò ý", "dó rộp", "dóa", "dọa già", "doan", "doãng", "doanh dật", "doanh điền sử", "doanh hoàn", "doanh sinh", "doanh thương", "dóc tổ", "dọc ngang", "doi đất", "dòi dõi", "dõi dõi", "dõi theo", "dòm nom", "dỏm", "don", "dọn cơm", "dọn nhà", "dong thứ", "dòng máu", "dòng quét", "dòng thăm", "dõng lưng", "dót", "dô-kề", "dô nách", "dốc lòng", "dốc sức", "dối da", "dội âm", "dông bão", "dộng cửa", "dơ duốc", "dở miệng", "dỡ hàng", "dơi lá mũi", "dơi ngao", "dơi ngựa", "dơi tai", "dời bước", "du già", "du hí", "du kí", "du tử", "dù thế nào", "dũ sang", "dụ hàng", "dùa", "duềnh", "dúm dụm", "dùn", "dung bào", "dung dăng", "dung độ", "dung hạnh", "dung hoà", "dung hợp", "dung kháng", "dung nghi", "dùng dắng", "dũng dược", "dụng cụ viên", "dụng hiền", "dụng học", "duy hạnh phúc", "duy hiện tượng", "duy kỉ", "duy lí", "duy mĩ", "duy năng", "duy thao tác", "duy thực", "duy tu", "duyên hài", "duyên trời", "duyệt mục", "dư ân", "dư dùng", "dư huệ", "dư hương", "dư hưởng", "dư lực", "dư vị", "dừ đòn", "dừ tử", "dử thính", "dữ vía", "dự phần", "dự thẩm viên", "dự thí", "dự ước", "dưa bở", "dưa chua", "dưa đắng", "dựa kề", "dừng bút", "dừng bước", "dừng chân", "dửng", "dựng hình", "dựng ngược", "dược lí học", "dược liệu học", "dược lực học", "dược mạ", "dưới đây", "dương dương", "dương đài", "dương xuân", "dường ấy", "dường bao", "dường bâu", "dưỡng chí", "dưỡng mục", "dưỡng thành", "dưỡng thân", "dưỡng tử", "đa bệnh", "đa búp đỏ", "đa loạn dưỡng", "đa nang", "đa năng", "đa ngôn", "đa nguyên luận", "đa nguyên tử", "đa sắc", "đa tạp", "đa thần", "đa thời", "đa thủ", "đa trá", "đa tư lự", "đà đao", "đả tử", "đã hay", "đã qua", "đã thế", "đã trót", "đá ba-lát", "đá cối", "đá đen", "đá gót", "đá hất", "đá hậu", "đá hộc", "đá kì", "đá lát", "đá liếc", "đá móc", "đá phốc", "đá song phi", "đá vụn", "đá xây", "đai cân", "đai chậu", "đai ngựa", "đài dinh", "đài hoa", "đài khí tượng", "đái đầm", "đái đêm", "đái khó", "đái láu", "đái nhạt", "đái rắt", "đại bào tử", "đại bịp", "đại cán", "đại cáo", "đại công", "đại danh từ", "đại dương học", "đại giao tử", "đại hạnh phúc", "đại hiền triết", "đại học viện", "đại hồi", "đại hội diễn", "đại hội tập", "đại hồng cầu", "đại nghĩa", "đam thanh", "đàm suyễn", "đàm tếu", "đám mờ", "đám rối", "đám xá", "đan đình", "đàn ca", "đàn cầm", "đàn chay", "đàn dây", "đàn gảy", "đàn gõ", "đàn hát", "đàn hồi kế", "đàn kéo", "đàn phím bàn", "đàn tam", "đàn tì", "đạn lửa", "đạn trái phá", "đạn xuyên", "đang cai", "đang in", "đảng kì", "đảng phong", "đảng tranh", "đáng bậc", "đáng buồn", "đáng chết", "đáng ghét", "đáng gờm", "đáng khen", "đáng khinh", "đáng kính", "đáng lí", "đáng ngờ", "đáng phạt", "đáng thương", "đáng thưởng", "đáng tiếc", "đáng tin", "đáng yêu", "đanh đá", "đành chịu", "đành là", "đánh bão", "đánh bể", "đánh chết", "đánh chuông", "đánh chuyền", "đánh cờ", "đánh đá", "đánh đàn", "đánh đáo", "đánh đấm", "đánh đầu", "đánh đẹp", "đánh gỉ", "đánh mất", "đánh mộng", "đánh mùi", "đánh nấm", "đánh ống", "đánh phá", "đánh tranh", "đánh trứng", "đánh véc-ni", "đánh vòng", "đánh xi", "đao cung", "đào hát", "đào kiếm", "đào lí", "đào liễu", "đào vong", "đảo ảnh", "đảo chữ", "đảo đề", "đảo nghịch", "đảo trưởng", "đáo để", "đáo đĩa", "đáo lí", "đáo lỗ", "đáo thủ", "đáo tuế", "đáo tường", "đạo binh", "đạo cụ", "đạo đạt", "đạo hạnh", "đạo hiệu", "đạo lí", "đạo lộ", "đạo quân", "đạo sĩ", "đáp đề", "đạp lúa", "đạt-lai lạt-ma", "đạt lí", "đau buốt", "đau chạy", "đau chói", "đau chuyển dạ", "đau cơ", "đau dạ con", "đau dạ dày", "đau gan", "đau khớp", "đau lách", "đau lưng", "đau mạch", "đau mình", "đau ngực", "đau nhói", "đau nhức", "đau nửa đầu", "đau nửa người", "đau quặn", "đãy", "đáy chậu", "đáy lòng", "đắc kế", "đắc sủng", "đắc thất", "đặc chất", "đặc chỉ", "đặc giá", "đặc khoản", "đặc sai", "đặc tứ", "đặc ứng", "đăm đắm", "đẵm", "đẵm máu", "đăng đường", "đăng kí", "đăng lính", "đăng-ten", "đăng tiêu", "đằng đằng", "đằng nay", "đẳng bào tử", "đẳng biến áp", "đẳng bội", "đẳng cao", "đẳng chấn", "đẳng chu", "đẳng cự", "đẳng dị", "đẳng diện", "đẳng địa nhiệt", "đẳng điện", "đẳng giác", "đẳng giao", "đẳng giao tử", "đẳng hiện", "đẳng tà", "đẳng tĩnh", "đẳng trích", "đẳng trọng", "đẳng trục", "đẳng từ", "đẳng tướng", "đẳng vị", "đẵng", "đắng ngắt", "đắt tiền", "đắt vợ", "đặt câu", "đặt cuộc", "đặt cửa", "đặt lãi", "đâm khùng", "đâm lo", "đâm lười", "đâm mầm", "đâm nghi", "đâm rễ", "đâm thủng", "đầm đầm", "đầm đậm", "đấm lưng", "đấm ngực", "đẫn đờ", "đập cánh", "đập chết", "đập cửa", "đập lúa", "đất phong", "đất son", "đâu mâu", "đâu như", "đâu ta", "đâu tá", "đâu xa", "đầu bài", "đầu dài", "đầu giường", "đầu heo", "đẩu thăng", "đấu ẩu", "đấu bóng", "đấu chọi", "đấu kiếm", "đấu lí", "đấu sĩ", "đậu chiều", "đậu cô-ve", "đậu dải áo", "đậu hà lan", "đậu hũ", "đậu hương", "đậu lào", "đậu lăng", "đậu liên lí", "đậu mèo", "đậu ngự", "đậu phộng", "đậu phụ nhự", "đậu phụng", "đậu răng ngựa", "đậu tằm", "đậu tía", "đậu trắng", "đậu tương", "đậu ván", "đậu vảy", "đậu xanh", "đầy năm", "đầy ứ", "đẩy lui", "đẫy mắt", "đẫy sắc", "đẻ khó", "đẻ ngược", "đẻ nhánh", "đẻ trứng", "đẻ trứng thai", "đem đầu", "đèm đẹp", "đen kịt", "đen nhẻm", "đen sạm", "đen sịt", "đèn ba cực", "đèn ba dây", "đèn báo", "đèn biển", "đèn cây", "đèn cầy", "đèn rọi", "đèn trần", "đèn vô tuyến", "đẹn sữa", "đeo đai", "đeo đẳng", "đẽo khoét", "đẽo mỏng", "đẹp dạ", "đẹt đít", "đê bối", "đê hạ", "đê phụ", "đề bài", "đề binh", "đề chủ", "đề xướng", "để cách", "để dạ", "để giống", "để hở", "để lại", "để mả", "đễ", "đế chính", "đế hoa", "đế quốc chủ nghĩa", "đệ quy", "đếch cần", "đệm thuý", "đền nghì", "đến đỗi", "đến hay", "đến mức", "đều bước", "đều cạnh", "đi buôn", "đi bước nữa", "đi chợ", "đi dọc", "đi đại tiện", "đi đạo", "đi đường", "đi hầu", "đi học", "đi kèm", "đi lị", "đi nghề", "đi nữa", "đi phu", "đi rỏn", "đi rửa", "đi rừng", "đi sau", "đi sông", "đi tới", "đi tua", "đi vào", "đi về", "đì đà đì đẹt", "đì đoành", "đì đọp", "đĩ già", "đĩ mốc", "đĩ thoả", "đỉa cá", "đỉa hẹ", "đỉa trâu", "đỉa vòi", "đía", "địa chấn đồ", "địa chấn kí", "địa chính trị", "địa cốt bì", "địa danh học", "địa du", "địa điện", "địa động lực học", "địa hoá học", "địa hoàng", "địa hướng động", "địa lũy", "địa mạch", "địa máng", "địa mạo học", "địa nhiệt học", "địa phận", "địa phủ", "địa phương chủ nghĩa", "địa sinh vật học", "địa thức học", "địa thực vật học", "địa tĩnh học", "địa văn học", "địa vật lí", "địa vồng", "địa xạ kế", "đích thật", "địch cừu", "địch quốc", "điên bái", "điên điên", "đinh bầu", "đinh chốt", "đinh giày", "đinh guốc", "đinh huyền", "đình liệu", "đình nghiệp", "đình trung", "đỉnh cao", "đỉnh đang", "đỉnh đầu", "đỉnh nhĩ", "đỉnh tròn", "định âm", "định biên", "định chí", "định công", "định danh", "định đô", "định khoản", "định kì", "định lí", "định ngạch", "định phân", "định sẵn", "định số", "định tinh", "định tội", "định xuất", "đít đoi", "đo đắn", "đo đỏ", "đo giường", "đo góc", "đo vẽ", "đò dọc", "đỏ chóe", "đỏ đuôi", "đỏ gây", "đỏ hoét", "đỏ ối", "đỏ ửng", "đõ", "đọ sức", "đọ tài", "đọa", "đọa kiếp", "đọa lạc", "đọa thai", "đoái", "đoan chắc", "đoan dương", "đoan ngọ", "đoan ngũ", "đoan thệ", "đoàn lạp", "đoàn luyện", "đoàn phó", "đoản binh", "đoản bình", "đoản ca", "đoản côn", "đoản hơi", "đoản kì", "đoản văn", "đoán định", "đoán mộng", "đoán nhận", "đoán số", "đoạn giao", "đoạn tình", "đoàng", "đoảng", "đoảng vị", "đoành đoàng", "đoạt quyền", "đọc nối", "đọc thuộc lòng", "đoi đói", "đòi cơn", "đòi đoạn", "đỏi", "đói khát", "đói lả", "đói lòng", "đói mèm", "đói meo", "đọi đèn", "đon đản", "đòn càn", "đòn gánh", "đòn ghen", "đòn nóc", "đòn ống", "đón dâu", "đón hỏi", "đón lõng", "đón trước", "đọn", "đong lường", "đòng đọc", "đòng đong", "đóng bao", "đóng cục", "đóng cừ", "đóng cửa", "đóng đáy", "đóng điện", "đóng đồn", "đóng kiện", "đóng mốc", "đóng trại", "đóng trò", "đô-la", "đô lại", "đô ngự sử", "đô sảnh", "đô thị hoá", "đô tùy", "đô uý", "đồ bạc", "đồ chó", "đồ dệt", "đồ đểu", "đồ đĩ", "đồ giải", "đồ hoạ", "đồ ngốc", "đồ nhắm", "đồ rét", "đồ thư", "đổ lộn", "đổ ngã", "đổ oan", "đổ thùng", "đổ tội", "đỗ đen", "đỗ trọng nam", "đỗ tương", "đỗ ván", "đỗ vũ", "đỗ xanh", "đố kị", "đố phụ", "độ cao", "độ chuẩn", "độ dốc", "độ đặc", "độ đậm", "độ hồn", "độ không", "độ lệch", "độ vĩ", "đốc binh", "đốc chiến", "đốc chính", "đốc lí", "đốc-tờ", "độc âm", "độc bạch", "độc ca", "độc cần", "độc cước", "độc điệu", "độc huyền", "độc nhãn", "độc quyền hoá", "độc thần", "độc trụ", "độc xướng", "đồi não", "đồi thị", "đổi chiều", "đổi dạ", "đổi dòng", "đổi dời", "đổi điện", "đổi hướng", "đổi khác", "đổi lấy", "đổi lốt", "đổi vai", "đối bào", "đối cảm", "đối chân", "đối cực", "đối giao cảm", "đối hậu môn", "đối hình", "đối hợp", "đối khẩu", "đối nại", "đối ngẫu", "đối quang", "đối song", "đối số", "đối trình", "đối trướng", "đội bóng", "đội hợp xướng", "đội kèn", "đội phó", "đồm độp", "đốm mắt", "đốm trán", "đốm vằn", "đốm xuất huyết", "đồn bốt", "đốn kiếp", "đông-bắc", "đông lạnh", "đông-nam", "đồng bạc", "đồng bạch", "đồng bàn", "đồng bạn", "đồng bang", "đồng bào", "đồng bảo trợ", "đồng bằng", "đồng bệnh", "đồng biến", "đồng bộ hoá", "đồng ca", "đồng cam", "đồng cảm", "đồng canh", "đồng căn", "đồng cân", "đồng cấp", "đồng cấu", "đồng chấn", "đồng chất", "đồng chiêm", "đồng chu", "đồng chủ tịch", "đồng chua", "đồng chủng", "đồng cỏ", "đồng cô", "đồng cư", "đồng đại", "đồng đảng", "đồng đạo", "đồng đẳng", "đồng đất", "đồng đen", "đồng điền", "đồng điều", "đồng điếu", "đồng điệu", "đồng hồ", "đồng loại", "đồng mắt cua", "đồng mẫu", "đồng minh", "đồng môn", "đồng mức", "đồng mưu", "đồng nát", "đồng nghiệp", "đồng ngũ", "đồng ngữ", "đồng nhất", "đồng nhất hóa", "đồng nhất thức", "đồng nhiệm", "đồng nhiệt", "đồng niên", "đồng nội", "đồng phục", "đồng tản", "đồng tâm", "đồng tông", "đồng triện", "đồng triều", "đồng trinh", "đồng trục", "đồng trùng hợp", "đồng tuế", "đồng tướng", "đồng văn", "đồng vận", "đồng vòng", "đồng vọng", "đổng lí", "động bào tử", "động bào tử nang", "động biển", "động dạng", "động dung", "động điên", "động mạch chủ", "động tử", "đốt đèn", "đốt pháo", "đốt rẫy", "đốt sống đội", "đốt sống trục", "đốt tay", "đột qụy", "đờ mặt", "đỡ lòng", "đời công", "đời kiếp", "đời nay", "đời sau", "đời xưa", "đới cầu", "đởm", "đơn bào", "đơn chủ", "đơn cực", "đơn sắc", "đơn trục", "đơn tử diệp", "đơn ứng", "đơn vòng", "đơn xin", "đơn ý", "đớp ruồi", "đủ bát ăn", "đủ nơi", "đua tài", "đua trí", "đùa nhả", "đúc điện", "đúc rút", "đục gỗ", "đục hom", "đục kế", "đục lầm", "đục máng", "đục một", "đục phác", "đục thủng", "đum đum", "đùm túm", "đúm", "đùn đẩy", "đùn đùn", "đún đởn", "đùng đình", "đúng lí", "đúng tuổi", "đúng với", "đuôi công", "đuôi diều", "đuôi rắn", "đuôi seo", "đuổi gái", "đuổi khéo", "đuổi riết", "đuối lí", "đuối sức", "đút tiền", "đút tỏm", "đụt", "đưa đò", "đưa đơn", "đưa nhẹ", "đưa ra", "đưa tay", "đưa thoi", "đưa vào", "đưa võng", "đừa", "đức bà", "đức chúa trời", "đức hoá", "đức mẹ", "đức uy", "đức vọng", "đực giống", "đưng", "đứng cái", "đứng gác", "đứng giữa", "đứng im", "đứng lại", "được cuộc", "được thua", "được tiếng", "đườn đưỡn", "đưỡn", "đương cai", "đương khi", "đương lượng", "đương quyền", "đường bán kính", "đường bánh", "đường bao", "đường bay", "đường bằng", "đường biểu diễn", "đường cao", "đường chỉ", "đường chiến lược", "đường cong", "đường cuốn", "đường dài", "đường gãy", "đường gân", "đường giao thông", "đường goòng", "đường hiệu", "đường hoa mai", "đường hoành", "đường ống", "đường vành đai", "đường viền", "đường xe lửa", "đường xích đạo", "đường xiên", "đứt đầu", "đứt đoạn", "đứt khúc", "e ấp", "e e", "e hèm", "e nề", "e nể", "è vai", "é é", "ẹ", "éc éc", "em ruột", "em trai", "én bạc", "eng", "eo ếch", "eo sách", "eo xèo", "èo ẽo", "ẻo họe", "ẻo ọe", "ẻo ợt", "ẽo à ẽo ẹt", "ẽo à ẽo ợt", "ép tình", "ét", "ét-xăng", "ẹt", "ê-ke", "ê-kíp", "ê-tô", "êm chuyện", "êm đẹp", "êm giọng", "êm lặng", "ềnh ễnh", "ễnh bụng", "ga-ma", "ga-men", "ga-ra", "ga-tô", "gà ác", "gà cát", "gà cỏ", "gà con", "gà gáp", "gà gật", "gà gô", "gà hoa", "gà mái ghẹn", "gà nhật", "gà nòi", "gà nước", "gà pha", "gà phi", "gà qué", "gà ri", "gà sếu", "gà sống", "gà tiền", "gà tồ", "gà tơ", "gà vịt", "gả bán", "gả chồng", "gá bạc", "gá lời", "gá tiếng", "gạ chuyện", "gác bếp", "gác bút", "gác cổng", "gác mỏ", "gác núi", "gác sân", "gác thượng", "gác xếp", "gạc bỏ", "gạch bỏ", "gạch chéo", "gạch chịu lửa", "gạch dưới", "gạch gạch", "gạch hoa", "gạch lá nem", "gạch lát", "gạch mộc", "gạch ngang", "gạch xóa", "gai cua", "gai dầu", "gai gai", "gai tên", "gai thị", "gai xương", "gái đĩ", "gái già", "gái goá", "gái sề", "gái tân", "gan cóc tía", "gan ruột", "gàn bát sách", "gàn dở", "gàn gàn", "gàn quải", "gán ép", "gán ghép", "gán nợ", "gán tội", "gạn", "gạn gùng", "gạn lọc", "gang trắng", "gang xám", "gành", "gánh chịu", "gánh gồng", "gánh nặng", "gánh vác", "gạnh", "gạo ba giăng", "gạo cẩm", "gạo chiêm", "gạo cụ", "gạo dự", "gạo đồ", "gạo giã", "gạo lứt", "gạo mùa", "gạo nước", "gạo ré", "gạo tám", "gạo xát", "gạt ngọn", "gau gáu", "gàu dai", "gàu sòng", "gay", "gảy", "gãy gọn", "gãy vụn", "gằm ghè", "găn gắt", "găng cơm", "găng tây", "gặp vận", "gâm gấp", "gầm hét", "gân sức", "gấp gay", "gập xuống", "gật gưỡng", "gấu lợn", "gấu trúc", "gây bệnh", "gây giống", "gây lạnh", "gây men", "gây ngủ", "gây sốt", "gây tê", "gầy gộc", "gầy xơ", "gấy", "ghe bầu", "ghe cộ", "ghẻ nước", "ghẻ ong", "ghẻ ruồi", "ghé gẩm", "ghép cặp", "ghép đôi", "ghép sau", "ghép trước", "ghét người", "ghê sợ", "ghế băng", "ghế bị cáo", "ghế gập", "ghế mây", "ghế phụ", "ghế vải", "ghế xoay", "ghểnh cổ", "ghi-đông", "ghi rõ", "ghi-ta", "ghiền gập", "ghim băng", "gi-lê", "gì gì", "gia ấm", "gia cảm", "gia chi dĩ", "gia đệ", "gia đinh", "gia đường", "gia hào", "gia huynh", "gia phong", "gia phổ", "gia quan", "gia số", "gia thanh", "gia thân", "gia thuộc", "gia tốc kế", "gia trạch", "gia trọng", "gia trưởng", "gia vận", "già giặn", "già lão", "giả bữa", "giả cầu", "giả chu kì", "giả của", "giả đồng hình", "giả giao", "giả hợp kim", "giả lời", "giả nhân giả nghĩa", "giả tỉ", "giả tuần hoàn", "giả túc", "giá áo", "giá biển", "giá buôn", "giá dôi", "giá họa", "giá ngự", "giá nhạc", "giá noãn", "giá thể", "giá vẽ", "giá xí nghiệp", "giác cự", "giác kế", "giác kính", "giai cú", "giai kì", "giai tác", "giai tế", "giai thừa", "giải bùa", "giải cử", "giải điều", "giải độc tố", "giải hạn", "giải kết", "giải mê", "giải ngộ", "giải phẫu học", "giải thuyết", "giải thức", "giải toả", "giải tội", "giải trùng hợp", "giải ước", "giải vi", "giãi tỏ", "giam cấm", "giảm án", "giảm áp", "giảm dần", "giảm đau", "giảm giá", "giảm huyết áp", "giảm lực", "giảm nhiệt", "giảm niệu", "giảm phân", "giảm phức", "giảm sản", "giảm sốt", "giảm tiết", "giảm tô", "giảm tức", "giám đốc thẩm", "giám học", "giám lí", "giám mã", "giám thủ", "gian bào", "gian băng", "gian chí tuyến", "gian cơ", "gian địa cực", "gian địa tầng", "gian đốt", "gian hàm", "gian khớp", "giàn bếp", "giàn pháo", "giàn thiêu", "giản đơn hóa", "giản minh", "giãn mạch", "giãn nở", "giãn tĩnh mạch", "giãn xương", "gián nghị", "gián phân", "gián quan", "giang đình", "giang khẩu", "giang khúc", "giang mai học", "giang san", "giàng", "giảng diễn", "giảng dụ", "giảng đài", "giảng đạo", "giảng hoà", "giáng cua", "giáng hoạ", "giáng hương", "giáng lâm", "giáng loại", "giáng trả", "giao bái", "giao hoà", "giao hoan", "giao hoán", "giao hỗ", "giao hôn", "giao liên", "giao loan", "giao nạp", "giao nhận", "giao phối học", "giao quân", "giao thoa kế", "giao trùng", "giao tử bào", "giao tử nang", "giao tử thể", "giao vĩ", "giáo ban", "giáo dưỡng", "giáo đạo", "giáo điều chủ nghĩa", "giáo đoàn", "giáo học pháp", "giáo khoa thư", "giáo khu", "giáo lệnh", "giáo lí", "giáo phẩm", "giáo phường", "giáo trưởng", "giáo xứ", "giáp lai", "giáp năm", "giạt sợi", "giàu sụ", "giảu mỏ", "giảu môi", "giày ban", "giày cườm", "giày đạp", "giày gia định", "giày guốc", "giày hạ", "giày kinh", "giày mỏm nhái", "giặc cỏ", "giặc lái", "giăm-bông", "giăm trống", "giằn giọc", "giăng hoa", "giằng xay", "giắt giường", "giấc bướm", "giấc hòe", "giấc mòng", "giấc vàng", "giấm bỗng", "giấm thanh", "giần sàng", "giận hờn", "giấp", "giật cánh khuỷu", "giật cơ", "giật dây", "giật giật", "giật giọng", "giật hậu", "giật nẩy", "giật rung", "giầu cau", "giầu không", "giấu màu", "giấu quanh", "giấu tủ", "giầy", "giẫy", "giấy bao bì", "giấy bọc", "giấy bóng kính", "giấy các-bon", "giấy căn cước", "giấy chặm", "giấy dậm", "giấy gói", "giấy hằn sọc", "giấy hồ", "giấy sơn", "giấy thẩm", "giấy vẽ", "giấy vê-lanh", "gieo lại", "giẹp mình", "giền cơm", "giền gai", "giếng dầu", "giết tróc", "gìm", "giò bó", "giò xào", "giỏ ấm", "giỏ phấn", "gió may", "gió mây", "gió sương", "gió tây", "gió vàng", "giòi da", "giỏi giắn", "giong buồm", "gióng đôi", "gióng một", "giọng văn", "giọt hồng", "giọt lệ", "giọt ngọc", "giọt tụ", "giỗ giúi", "giỗ hậu", "giộ", "giối già", "giống cái", "giống đực", "giống má", "giống như", "giống trung", "giơ mặt", "giờ ăn", "giờ chết", "giờ chơi", "giờ nghỉ", "giở lại", "giở tay", "giời", "giời leo", "giới hình", "giới ngữ", "giới tính hóa", "giới tính học", "gip", "giu", "giũ bụi", "giũ lông", "giú", "giục giã", "giùi chọc", "giùi mài", "giủi", "giúi giụi", "giụi", "giùm", "giùm giúp", "giun cát", "giun giẹp", "giun ít tơ", "giun lươn", "giun móc câu", "giun nhiều tơ", "giun ống", "giun que", "giun vòi", "giun xoắn", "giuộc", "giúp đỡ", "giúp rập", "giúp sức", "giúp việc", "giừ", "giữ giá", "giữ mình", "giữ nguyên", "giữ nhiệt", "giữa chừng", "giương cao", "giường bệnh", "giường chiếu", "giường thờ", "giượng", "gò băng", "gò gẫm", "gò mộ", "gò tóp", "goá chồng", "goá vợ", "góc bẹt", "góc bù", "góc kề", "góc khúc xạ", "góc ngọn", "góc nhà", "góc nhị diện", "góc nhọn", "góc phản xạ", "gọi hỏi", "gọi sống", "gọn ghẽ", "gọng vó", "goòng", "goòng bằng", "góp điện", "góp họ", "góp nhóp", "góp vào", "gót đầu", "gót tiên", "gô cổ", "gỗ dát", "gỗ hồng sắc", "gỗ tạp", "gỗ thiết mộc", "gỗ tròn", "gộ", "gốc rạ", "gốc từ", "gối chăn", "gối dài", "gối dựa", "gối phụng", "gột sạch", "gột vịt", "gơ-lu-xit", "gờ vòng", "gở mồm", "gờm mặt", "guốc chẵn", "gụt", "gửi lời", "gửi rể", "gửi thân", "gửi thưa", "gừng gió", "gươm đao", "gương cầu", "gương hậu", "gương sáng", "gường gượng", "gượng gùng", "hà cớ", "hà khốc", "hà ngược", "hà thủ ô đỏ", "hà y", "hả mùi", "há dám", "há miệng", "hạ bán niên", "hạ bì", "hạ buồm", "hạ khô thảo", "hạ nghị sĩ", "hạ nguyên tử", "hạ nhiệt", "hạ phách", "hạ sơn", "hạ thử", "hạ tình", "hạ trần", "hạ từ", "hạ tứ", "hạch đồ", "hạch hạnh", "hạch lạc", "hạch nhiễm sắc", "hạch tâm", "hạch xoài", "hai lá mầm", "hai nghĩa", "hai quốc tịch", "hài âm", "hài sảo", "hài văn", "hải dương", "hải đồ", "hải li", "hải lí", "hải lưu kế", "hải nội", "hải tân", "hải tần", "hải thuyền", "hải tiêu", "hải tinh", "hải vận", "hải vương", "hái lượm", "ham sách", "ham sống", "hàm dưỡng", "hàm lâm viện", "hàm rắn", "hãm màu", "hãm mình", "hãm nhạy", "hám của", "han gỉ", "hàn gia", "hàn huyên", "hàn luật", "hàn ôn", "hàn rèn", "hãn mạn", "hán", "hán hóa", "hán ngữ", "hán thư", "hán tộc", "hán việt", "hạn lượng", "hạn vận", "hang phổi", "hàng hoa", "hàng lối", "hàng nằm", "hàng ngà", "hàng thú", "hàng tỉnh", "hàng tướng", "hàng ước", "hàng xã", "hàng xáo", "hàng xũ", "hãng buôn", "hạng bét", "hạng nặng", "hạng nhất", "hành búi", "hành cách", "hành hoa", "hành khiển", "hành lí", "hành não", "hành nhân", "hành phạt", "hành ta", "hành tá tràng", "hành tăm", "hành tẩu", "hành thích", "hành tỏi", "hành trình kế", "hành trình kí", "hành vân", "hành vi chủ nghĩa", "hành viện", "hánh nắng", "hao hao", "hao sức", "hào lí", "hào trưởng", "hảo sự", "hảo vị", "hạp long", "hát ả đào", "hát bài chòi", "hát bắc", "hát bóng", "hát bộ", "hát bội", "hát cải lương", "hát chèo", "hát cô đầu", "hát đùm", "hát giặm", "hát hỏng", "hát tuồng", "hát xẩm", "hát xướng", "hạt châu", "hạt cườm", "hạt huyền", "hạt kết", "hạt kín", "hạt mềm", "hạt trần", "háu ăn", "háu đói", "hay dở", "hay háy", "hay không", "hay quá", "hay quên", "hắc búa", "hắc tinh tinh", "hắc tố", "hắt nắng", "hâm nóng", "hầm chông", "hầm hố", "hầm mìn", "hầm ngầm", "hầm rập", "hầm rượu", "hầm tàu", "hẩng", "hẫng chân", "hẫng hờ", "hấng", "hấp lực", "hấp thủy kế", "hất ngã", "hầu lễ", "hầu non", "hẩu lốn", "hấu", "hậu ấn tượng", "hậu báo", "hậu đài", "hậu điện", "hậu đình", "hậu phôi", "hậu tạo", "hậu thú", "hậu thưởng", "hậu tuyển", "hây", "héc-ta", "hẹm", "hèn gì", "hẻo", "héo đầu ruồi", "héo mòn", "héo queo", "héo ruột", "hẹp hòi", "hề đồng", "hể", "hệ luỵ", "hệ thống hóa", "hệ thống học", "hênh hếch", "hết dạ", "hết duyên", "hết đường", "hết ngỏm", "hết tiệt", "hết vía", "hi-la", "hi lạp hóa", "hi sinh", "hi vọng", "hì hì", "hì hục", "hì hụp", "hỉ đồng", "hỉ mũi", "hí khúc", "hiền hữu", "hiển hoa", "hiển tinh", "hiển vi học", "hiến pháp hóa", "hiến ước", "hiện bộ", "hiện dịch", "hiện kim", "hiện tại hóa", "hiện thực hóa", "hiện tượng học", "hiếp bức", "hiếp chế", "hiếp hách", "hiệp biến", "hiệp đoàn", "hiệp nữ", "hiệp trợ", "hiểu ngầm", "hiếu dưỡng", "hiếu hỉ", "hiếu kì", "hiếu kinh", "hiếu nam", "hiếu nữ", "hiếu phục", "hiếu tâm", "hiếu trung", "hiệu buôn", "hiệu chỉnh", "hiệu đoàn", "hiệu đoàn trưởng", "hiệu phó", "hiệu sách", "hiệu thuốc", "hình bao", "hình dịch", "hình hiệu học", "hình hoạ", "hình in bóng", "hình móc", "hình sắc", "hình sinh", "hình sự hóa", "hình thức chủ nghĩa", "hình thức hóa", "hình triết", "híp-pi", "hò giã gạo", "hò lơ", "hoắc loạn", "hoặc chúng", "hoăm hoắm", "học bộ", "học chế", "học điền", "học giới", "học kì", "học nghiệp", "học niên", "học phong", "học sĩ", "học vụ", "hoét", "hoẹt", "hỏi tra", "hói đầu", "hói trán", "hòm chân", "hòm gian", "hòm phiếu", "hòm siểng", "hòm thư", "hòm xe", "hòn đảo", "hòn đáo", "hòn ngọc", "hong gió", "hỏng chân", "hỏng đi", "hỏng mắt", "hỏng thi", "họng súng", "họp chợ", "hô cách", "hô danh", "hô hấp kế", "hô ngữ", "hồ chi", "hồ dễ", "hồ đào", "hồ li", "hồ phèn", "hồ thủy", "hổ biến", "hổ cứ", "hổ huyệt", "hổ lục", "hổ quyền", "hổ trùng", "hổ vĩ", "hỗ tương", "hộ lí", "hộ sinh viên", "hộ trì", "hôi của", "hôi dầu", "hôi ình", "hôi mốc", "hôi sì", "hồi cảm", "hồi chuyển", "hồi đầu", "hồi giáo hoá", "hồi hồi", "hồi lưu", "hồi não", "hồi tràng", "hồi trào", "hồi triều", "hồi tục", "hối lỗi", "hội báo", "hội buôn", "hội chủ", "hội chùa", "hội giác", "hội hoạ", "hội quán", "hội sở", "hội thao", "hội thương", "hôm nao", "hôm nào", "hôm rày", "hôm trước", "hôn nhật", "hồn bạch", "hổn ha hổn hển", "hỗn ẩu", "hỗn dịch", "hỗn giao", "hỗn hống hóa", "hỗn nhập", "hông hốc", "hồng chủng", "hồng diệp", "hồng hạc", "hồng hoa", "hồng hoàng", "hồng kì", "hồng lô", "hồng lựu", "hồng nương", "hồng thuỷ", "hồng tích", "hồng tước", "hỗng tràng", "hột cườm", "hơ hớ", "hở chuyện", "hơi đâu", "hơi hướm", "hời hợi", "hợm hĩnh", "hơn cả", "hơn hết", "hơn là", "hợp bào tử", "hợp danh", "hợp điểm", "hợp giao", "hợp lẽ", "hợp lí hóa", "hợp sinh", "hợp tấu", "hợp thành", "hợp thức hoá", "hợp tình", "hợp tử", "hớt bọt", "hớt hơ hớt hải", "hớt tóc", "hớt váng", "hù dọa", "hú hoạ", "hua", "huân công", "huân nghiệp", "huấn", "huấn điều", "huấn học", "huê", "huê tình", "huệ biển", "huệ tây", "hụi", "hun khói", "hùn vốn", "hung táng", "hùng tâm", "húng chanh", "húng chó", "húng dồi", "húng láng", "húng quế", "húng thông", "huơ", "húp híp", "hút bám", "hút thu", "hụt ăn", "hụt chân", "hụt vốn", "huy hiệu học", "huy hoắc", "huỷ", "huỷ bỏ", "huỷ diệt", "huỷ hoại", "huỷ sắc", "huý", "huý kị", "huý nhật", "huyện hàm", "huyện lị", "huyện uỷ", "huyện uỷ viên", "huyết áp học", "huyết bào", "huyết cầu kế", "huyết hư", "huyết khối", "huyết niệu", "huyết sắc kế", "huyết sắc tố", "huyết tâm", "huyết thanh học", "huyết thanh tố", "huýt còi", "hư báo", "hư hàm", "hư kháng", "hư không hóa", "hư nát", "hư ngụy", "hư nhược", "hư vô chủ nghĩa", "hứa nguyện", "hừm", "hưng bái", "hưng cảm", "hưng thần", "hưng vong", "hửng nắng", "hứng dục", "hứng khởi", "hương bạ", "hương bài", "hương cả", "hương đài", "hương đảng", "hương giới", "hương hoả", "hương lí", "hương phụ", "hương quản", "hương thẻ", "hương thung", "hương xạ", "hướng cách", "hướng địa", "hướng điện", "hướng lại", "hướng màu", "hướng ngoại", "hướng nhật", "hướng nhiệt", "hướng quang", "hưu", "hưu hạ", "hưu quan", "hữu biên", "hữu chí", "hữu danh", "hữu lí", "hữu sản", "hữu sinh vô dưỡng", "hữu thần luận", "hữu tỉ", "i-nốc", "i-ốt", "ì ì", "ì oàm", "ì ọp", "ỉ", "ỉa bậy", "ỉa són", "ỉa tháo", "ích kỉ", "ích xì", "im bẵng", "im đi", "im gió", "im lịm", "im trời", "in hình", "in li-tô", "in nắng", "in như", "in nổi", "in rô-nê-ô", "in sao", "in thạch", "in ti-pô", "ĩnh bụng", "ít hôm", "ít xì", "ịt ịt", "ỉu ỉu", "ỉu xìu", "ka-ki", "ka-li", "kẻ dưới", "kẻ địch", "kẻ khác", "kẻ nể", "kẻ ô", "kẻ quê", "kẽ nẻ", "kẽ nứt", "kẽ răng", "kẽ tóc", "ké đầu ngựa", "kèm theo", "kém ăn", "kém đi", "kém mắt", "kém sức", "kém tai", "kẹn", "keo gai", "keo ong", "kèo nài", "kẽo cà kẽo kẹt", "kéo bễ", "kéo cày", "kẹo ca-ra-men", "kẹo cao-su", "kẹo chanh", "kẹo hạnh nhân", "kẹo mút", "kẹo nhai", "kẹo thơm", "kẹo trứng chim", "két bạc", "két dầu", "kê đơn", "kê-pi", "kể cả", "kể chuyện", "kể gì", "kể lại", "kế chí", "kế thế", "kế tự", "kệ kinh", "kệ thây", "kênh rạch", "kết băng", "kết bông", "kết đôi", "kết hạt", "kết hối", "kết khối", "kết liễu", "kết tinh học", "kết tràng", "kết tục", "kết xã", "khả nghịch", "khả tích", "khả ước", "khá thương", "khác âm", "khác chỗ", "khác cực", "khác dạng", "khác gốc", "khác hình", "khác lá", "khác nhau", "khác số", "khác thể", "khác tướng", "khác ý", "khách ăn", "khách nợ", "khách quan hóa", "khách vận", "khai ấn", "khai diễn", "khai đề", "khai đoan", "khai hạ", "khai hấn", "khai hoả", "khai hoá", "khai lễ", "khai man", "khai mù", "khai tâm", "khai thị", "khai thủy", "khai toán", "khai tố", "khai trí", "khai um", "khái lược", "khái quát hoá", "khám soát", "khán hộ", "khán thủ", "khang khảng", "khang ninh", "kháng âm", "kháng chiến hoá", "kháng huyết thanh", "kháng kích dục", "kháng men", "kháng nhiệt", "kháng sinh đồ", "kháng thuế", "kháng tố", "kháng vi-rút", "khao vọng", "khảo giá", "khảo khóa", "khát rượu", "khắc ảnh", "khắc độ", "khắc hoạ", "khắc kỉ", "khắc lậu", "khăm khẳm", "khắm lặm", "khăn mùi soa", "khẳng", "khắng khít", "khắp cả", "khắp nơi", "khâm", "khẩn điền", "khấn vái", "khất từ", "khâu díu", "khâu đột", "khâu máy", "khâu nhíu", "khẩu chiếm", "khẩu đầu", "khẩu đội trưởng", "khen khét", "khén", "kheo khéo", "khéo miệng", "khép tán", "khét mù", "khê đọng", "khế đường", "khều khoào", "khi ấy", "khi đầu", "khi nãy", "khỉ bông", "khỉ mũ", "khỉ mũi", "khỉ nhện", "khỉ râu", "khỉ rú", "khỉ sóc", "khỉ xồm", "khí áp kí", "khí cục", "khí động lực học", "khí đốt", "khí ép", "khí giời", "khí hậu bệnh học", "khí kế", "khí khổng", "khí lực học", "khí mỏ", "khí nhân", "khí nhiệt động", "khí nhiệt động học", "khí quan khinh", "khí rãnh", "khí tai bèo", "khí thành", "khí thũng", "khí tĩnh học", "khí uất", "khía răng", "khiên ngưu", "khiêu hấn", "khinh địch", "khinh kị", "khinh người", "kho bãi", "kho tàu", "khò", "khó dạy", "khó gỡ", "khó tả", "khó tiêu", "khoa danh", "khoa đệ", "khoa giáp", "khoả tử", "khoá an toàn", "khoá chuông", "khoá dây", "khoá họp", "khoác tay", "khoai nghệ", "khoái lạc chủ nghĩa", "khoan hoà chủ nghĩa", "khoán quản", "khoang cổ", "khoang hốc", "khoảng âm", "khoảng giữa", "khoảng mở", "khoảng trống", "khoáng đại", "khoáng sàng", "khoáng tướng học", "khoanh bí", "khoanh tròn", "khoăm khoăm", "khoắm", "khóc nhè", "khóc vòi", "khoe khỏe", "khỏe", "khỏe khoắn", "khỏe ra", "khóe mắt", "khoeo chân", "khoèo", "khoèo chân", "khói hương", "khói lửa", "khòm khòm", "khọm", "khọm già", "khô cổ", "khô khốc", "khô không khốc", "khô mộc", "khô ráo", "khổ ải", "khổ chiến", "khổ hải", "khổ lực", "khổ mặt", "khổ nạn", "khổ người", "khổ nhục hình", "khổ nhục kế", "khổ sâm", "khổ thơ", "khố dây", "khố xanh", "khôi khoa", "khối nổi", "khối phấn", "khối thang", "khối xây", "khổn hạnh", "không ai", "không dứt", "không đáng kể", "không gian hóa", "không khốc", "không ngôi", "không ngừng", "không quốc tịch", "không tên", "không thèm", "khổng tử", "khống cáo", "khơi lại", "khởi thuỷ", "khớp đồ", "khớp học", "khu uỷ viên", "khù khờ", "khù khù", "khú", "khua khuắng", "khuân vác", "khuẩn cầu chùm", "khuẩn cầu chuỗi", "khuẩn cẩu", "khuấy luyện", "khúc côn cầu", "khúc cuộn", "khúc dạo", "khúc kha khúc khích", "khúc khắc", "khúc luyện", "khúc mắt", "khúc ngoặt", "khúc nhôi", "khúc nôi", "khúc quành", "khúc uốn", "khúc xạ học", "khúc xạ kế", "khuê", "khuê tảo", "khuếch tán kế", "khung cửa", "khung gầm", "khùng khục", "khuôn khéo", "khuôn nhịp", "khuôn rập", "khuông phò", "khuơ", "khuy áo", "khuy móc", "khuyên dỗ", "khuyên lơn", "khuyết cách", "khuyết nghi", "khuyết thiếu", "khuynh gia", "khuynh loát", "khuỳnh", "khuỷu", "khuỵu", "khử áp", "khử cực", "khử độc", "khử khuẩn", "khử màu", "khử mùi", "khử nhiễm", "khử từ", "khứ lưu", "khươi", "ki cóp", "ki-lô", "ki-lô-gam", "ki-lô-mét", "ki-lô-oát", "ki-nin", "kì an", "kì bo", "kì bộ", "kì cà kì cạch", "kì chay", "kì công", "kì cục", "kì cùng", "kì họp", "kì lạ", "kì lân", "kì lân biển", "kì lương", "kì mục", "kì nam", "kì nghỉ", "kì ngộ", "kì nham", "kì nhông", "kì phiếu", "kì quan", "kì thi", "kỉ", "kỉ cương", "kỉ hà học", "kỉ luật", "kỉ lục", "kỉ niệm", "kĩ", "kĩ thuật", "kí kết", "kí lục", "kí ngụ", "kí nhận", "kí pháp", "kí quỹ", "kí sinh", "kí sinh trùng", "kí sinh trùng học", "kí sinh vật", "kí sự", "kí ức", "kị", "kị binh", "kị khí", "kị mã", "kị màu", "kị nắng", "kích hoạt", "kích tố", "kịch hóa", "kịch múa", "kiêm toàn", "kiềm hóa", "kiềm kế", "kiềm thổ", "kiềm thúc", "kiềm toả", "kiểm định", "kiểm nhận", "kiểm sát viên", "kiếm lời", "kiên", "kiên cường", "kiến cánh", "kiến đen", "kiến đỏ", "kiến gió", "kiến lính", "kiến lửa", "kiến mật", "kiến sư tử", "kiến tạo học", "kiến thợ", "kiến vàng", "kiện hàng", "kiêng kị", "kiếp sống", "kiết lị", "kiệt dinh dưỡng", "kiêu kì", "kiều dưỡng", "kiều lộ", "kiều nhược", "kiểu hình", "kiểu táng", "kiệu song loan", "kim anh tử", "kim chi", "kim giây", "kim mai", "kim ngân hoa", "kim oanh", "kim phượng", "kinh bang tế thế", "kinh chiều", "kinh địa", "kinh hoảng", "kinh khuyết", "kinh kì", "kinh nghiệm chủ nghĩa", "kinh quốc", "kinh trập", "kính ảnh", "kính bẩm", "kính cáo", "kính cặp mũi", "kính che gió", "kính coong", "kính cổ", "kính cửa", "kính đeo mắt", "kính đên", "kính định tinh", "kính đo xa", "kính ghép màu", "kính lập thể", "kính một mắt", "kính quang phổ", "kính siêu hiển vi", "kính thăm", "kính thưa", "kính trắng", "kính trình", "kịp thì", "la-de", "la-đơn", "la-mã hoá", "la-tê-rít", "la-tê-rít hoá", "la-tinh", "la-tinh hoá", "là hơi", "là lạ", "là ngà", "là vì", "lá áo", "lá bắc", "lá buồm", "lá đài", "lá đơn", "lá gan", "lá giấp", "lá guồng", "lá kèm", "lá khôi", "lá kim", "lá kính", "lá lốt", "lá lược", "lá mầm", "lá mọng", "lá ngọn", "lá nhãn", "lá noãn", "lá rộng", "lá sắn", "lá toạ", "lá vai", "lạ kì", "lạ nhà", "lạ tai", "lạc chỗ", "lạc đà không bướu", "lạc đàn", "lạc đệ", "lạc giọng", "lạc màu", "lạc quyên", "lạc viên", "lách ca lách cách", "lạch bà lạch bạch", "lạch đà lạch đạch", "lạch tà lạch tạch", "lại nhà", "làm ẩu", "làm bài", "làm chay", "làm cơm", "làm dầm", "làm đau", "làm điệu", "làm đổ", "làm gái", "làm giá", "làm giúp", "làm hại", "làm kêu", "làm khổ", "làm lạnh", "làm lợi", "làm lương", "làm nhàu", "làm nhụt", "làm nũng", "làm oai", "làm ồn", "làm ơn", "làm phách", "làm phản", "làm phép", "làm phúc", "làm quà", "làm quan", "làm ra", "làm ra vẻ", "làm rầy", "làm rẫy", "làm rẽ", "làm reo", "làm rể", "làm rối", "làm ruộng", "làm tiệc", "làm toáng", "làm tổ", "làm tôi", "làm tội", "làm trai", "làm trò", "làm tròn", "làm tường", "làm việc", "làm xằng", "lảm nhảm", "lạm", "lạm bàn", "lạm bổ", "lạm quyền", "lạm sát", "lạm thu", "lạm tiêu", "lan bướm", "lan chân rết", "lan đất", "lan hạc đính", "lan hài", "lan man", "lan quạt", "lan quế", "lan thông", "lan toả", "lan trùng", "lan truyền", "làn điệu", "lãn công", "lán", "lán trại", "lang bang", "lang lảng", "lang lổ", "lang miếu", "lang quân", "lang sói", "lang trắng", "lang vườn", "làng bẹp", "làng chơi", "làng mạc", "làng nhàng", "làng nho", "làng nước", "làng xã", "làng xóm", "lảng lảng", "lảng tai", "lảng trí", "lãng du", "lãng đãng", "lãng mạn hoá", "lãng ngâm", "lãng uyển", "láng bóng", "láng cháng", "láng máng", "lanh", "lanh chai", "lanh chanh", "lanh lẹn", "lanh lợi", "lành chanh", "lành chanh lành chói", "lành da", "lành dạ", "lành lạnh", "lành mạnh", "lành mạnh hoá", "lành ngạnh", "lành nghề", "lành tính", "lảnh", "lảnh lót", "lãnh binh", "lãnh cung", "lãnh dục", "lãnh đại", "lãnh ngoại quyền", "lãnh nguyên", "lãnh sam", "lãnh sự quán", "lãnh tụ", "lãnh vực", "lánh mình", "lạnh buốt", "lạnh cóng", "lạnh gáy", "lạnh giá", "lạnh ngắt", "lao cải", "lao dịch", "lao đầu", "lao hạch", "lao kê", "lao lí", "lao lung", "lao lực", "lao màn", "lao móc", "lao nhao", "lao tư", "lào", "lào quào", "lào thào", "lào xào", "lão bệnh học", "lão dân quân", "lão dê", "lão đồng chí", "lão gia", "lão hoá", "lão hủ", "lão khoa", "lão mẫu", "lão mưu", "lão ngốc", "lão nhiêu", "lão nông", "lão ông", "lão quyền", "lão sư", "lão thành", "lão thân", "lão thần", "lão thị", "lão thực", "lão trượng", "láo lếu", "láo quáo", "láo toét", "láo xược", "lạo thảo", "lạo xạo", "láp nháp", "lạt lẽo", "lạt màu", "lau chau", "lau lách", "lau láu", "lau nhau", "lau sậy", "làu bà làu bàu", "làu làu", "làu nhàu", "lảu bảu", "lảu nhảu", "lảu thông", "láu", "láu ta láu táu", "láu táu", "lạu bạu", "lay lay", "lay lắt", "lay nhay", "lay-ơn", "láy âm", "láy chùm", "láy rền", "lạy lục", "lạy tạ", "lạy van", "lắc cắc", "lắc đầu", "lắc-lê", "lắc lơ", "lặc là lặc lè", "lặc lè", "lăm", "lăm lăm", "lăm lẳm", "lăm tăm", "lằm lằm", "lằm lặm", "lắm chuyện", "lắm điều", "lắm lắm", "lắm mồm", "lắm trò", "lặm", "lăn bánh", "lăn chiêng", "lăn cổ", "lăn cù", "lăn đùng", "lăn đường", "lăn kềnh", "lăn lóc", "lăn lưng", "lăn quay", "lăn queo", "lăn tăn", "lăn xả", "lẳn", "lặn lội", "lăng băng", "lăng lắc", "lăng líu", "lăng miếu", "lăng mộ", "lăng nhăng", "lăng trì", "lẳng", "lẳng khẳng", "lẳng lặng", "lẳng nhẳng", "lẵng đẵng", "lẵng nhẵng", "lắng đắng", "lắng đọng", "lắng nghe", "lắng nhắng", "lặng dần", "lặng đen", "lặng im", "lặng móc", "lặng ngắm", "lặng người", "lặng thinh", "lặng trắng", "lặng yên", "lắp ba lắp bắp", "lắp bắp", "lắp đít", "lắp ghép", "lắp lại", "lắp ráp", "lặp", "lặp lại", "lắt lay", "lắt lẻo", "lắt léo", "lặt", "lấc cấc", "lấc xấc", "lâm bịnh", "lâm bồn", "lâm dâm", "lâm học", "lâm khẩn", "lâm li", "lâm nghiệp", "lâm nguy", "lâm râm", "lâm sản", "lâm sàng", "lâm sàng học", "lâm sơn", "lâm sự", "lâm thâm", "lâm thổ sản", "lâm trận", "lâm trường", "lâm tuyền", "lầm dầm", "lầm lầm", "lầm lầm lì lì", "lầm lì", "lầm lỡ", "lầm rầm", "lẩm", "lẩm ca lẩm cẩm", "lẩm nhẩm", "lẫm", "lẫm cẫm", "lấm", "lấm la lấm lét", "lấm láp", "lấm lem", "lân bang", "lân bàng", "lân la", "lân lí", "lân quốc", "lân tuất", "lần chần", "lần khân", "lần lần", "lần lữa", "lần mò", "lần thần", "lẩn khuất", "lẩn lút", "lẩn mặt", "lẩn mẩn", "lẩn mình", "lẩn tha lẩn thẩn", "lẩn thẩn", "lẩn trốn", "lẫn cẫn", "lẫn hình", "lẫn màu", "lẫn nhau", "lẫn tiếng", "lấn át", "lấn bấn", "lấn bước", "lấn cấn", "lấn chiếm", "lấn lướt", "lận", "lấp la lấp lánh", "lấp láy", "lấp loáng", "lấp loé", "lấp lú", "lấp lửng", "lập ấp", "lập cà lập cập", "lập cập", "lập đông", "lập hạ", "lập hiến", "lập hội", "lập là", "lập loè", "lập lờ", "lập luận", "lập nghiêm", "lập phương", "lập quần", "lập quốc", "lập quy", "lập tâm", "lập thân", "lập thể", "lập thu", "lập thứ", "lập trình", "lập trình viên", "lập tự", "lập xuân", "lất phất", "lật bật", "lật lọng", "lật mặt", "lật ngửa", "lật ngược", "lật úp", "lâu bền", "lâu dài", "lâu lắc", "lâu lâu", "lâu nay", "lâu năm", "lâu ngày", "lâu nhâu", "lầu canh", "lầu hồng", "lầu son", "lầu trang", "lẩu", "lậu cầu", "lậu vé", "lây bây", "lây nhây", "lầy thụt", "lẩy", "lẩy ba lẩy bẩy", "lẩy bẩy", "lẫy", "lấy cắp", "lấy chồng", "lấy công", "lấy đỗ", "lấy được", "lấy giọng", "lấy giống", "lấy hướng", "lấy lãi", "lấy lại", "lấy làm", "lấy lẽ", "lấy lời", "lấy mất", "lấy nê", "lấy nhau", "lấy tiếng", "lấy vợ", "le lé", "le te", "lè", "lè lẹ", "lè tè", "lè xè", "lẻ bộ", "lẻ đôi", "lẻ nhẻ lè nhè", "lẽ dĩ nhiên", "lẽ hằng", "lẽ mọn", "lẽ nào", "lẽ thường", "lẹ làng", "lem lẻm", "lem lém", "lem luốc", "lem nhem", "lèm bèm", "lèm nhèm", "lém lỉnh", "lém mép", "lẹm", "lẹm cằm", "len chân", "len dạ", "len lẻn", "len lén", "len lét", "len lỏi", "len mình", "lèn lẹt", "lẻn", "lẻn bước", "leng beng", "lẻng kẻng", "lẻng xẻng", "léng phéng", "leo dây", "leo kheo", "leo lắt", "leo nheo", "leo teo", "leo thang", "lèo", "lèo khèo", "lèo lá", "lèo lái", "lèo nhèo", "lèo xèo", "lẻo khẻo", "lẻo mép", "léo", "léo lắt", "léo nhéo", "léo xéo", "lép bép", "lép kẹp", "lép nhép", "lép vế", "lép xép", "lẹp kẹp", "lẹp xẹp", "lét", "lét đét", "lẹt", "lê dân", "lê-dương", "lê la", "lê lết", "lê mê", "lê-nin-nít", "lề luật", "lễ bộ", "lễ ca", "lễ các thánh", "lễ đài", "lễ đường", "lễ hỏi", "lễ lộc", "lễ lớn", "lễ mễ", "lễ phục sinh", "lễ quy thiên", "lễ sinh", "lễ tang", "lễ tân", "lễ tết", "lễ thăm", "lễ thăng thiên", "lễ tiết", "lễ trọng", "lệ dân", "lệ đương", "lệ khệ", "lệ ngoại", "lệ ngôn", "lệ nông", "lệ quyên", "lệ sử", "lếch tha lếch thếch", "lếch thếch", "lệch", "lệch lạc", "lệch pha", "lệch tâm", "lệch trục", "lên bậc", "lên bộ", "lên bờ", "lên cao", "lên cân", "lên chân", "lên chức", "lên cò", "lên cơn", "lên da", "lên đạn", "lên đèn", "lên đồng", "lên gân", "lên giọng", "lên hoa", "lên khung", "lên khuôn", "lên lão", "lên mâm", "lên mây", "lên ngôi", "lên nước", "lên râu", "lên tay", "lên tiếng", "lên trang", "lênh chênh", "lênh khênh", "lềnh", "lềnh kềnh", "lềnh lệch", "lệnh bà", "lệnh cấm", "lệnh chỉ", "lệnh đường", "lệnh huynh", "lệnh lang", "lệnh muội", "lệnh nghiêm", "lệnh tiễn", "lệnh truyền", "lết", "lết bết", "lêu", "lêu đêu", "lêu lêu", "lêu lổng", "lêu nghêu", "lêu têu", "lều bều", "lều chiếu", "lều chõng", "lều khều", "lều nghều", "lều quán", "lểu đểu", "lễu nghễu", "lếu", "li", "li bì", "li biệt", "li dị", "li giác", "li gián", "li giáo", "li hôn", "li hợp", "li hương", "lì lì", "lì lợm", "lí", "lí do", "lí láu", "lí lẽ", "lí lịch", "lí luận", "lí ngư", "lí nhí", "lí ra", "lí sinh học", "lí số", "lí sự", "lí thú", "lí thuyết", "lí trí", "lị sở", "lìa đời", "lịa", "lịch bà lịch bịch", "lịch bịch", "lịch cà lịch kịch", "lịch duyệt", "lịch đại", "lịch kịch", "lịch thiệp", "lịch triều", "lịch trình", "liếc mắt", "liêm", "liêm chính", "liêm phóng", "liềm", "liềm móng", "liếm đít", "liếm gót", "liếm láp", "liếm mép", "liếm môi", "liên a-rập", "liên á", "liên binh chủng", "liên cầu khuẩn", "liên chi", "liên chi ủy", "liên chính phủ", "liên danh", "liên đài", "liên đái", "liên đại lục", "liên đội", "loạn khứu", "loạn li", "loạn ngôn", "loạn nhịp", "loạn nội tiết", "loạn óc", "loạn quân", "loạn sản", "loạn sắc tố", "loạn tạng", "loạn thần", "loạn thị kế", "loạn trí nhớ", "loạn vận động", "loạn xạ", "loạn xị", "loang loãng", "loang loáng", "loang lỗ", "loang toàng", "loàng xoàng", "loảng xoảng", "loáng", "loáng choáng", "loạng choạng", "loạt soạt", "loay hoay", "loăng quăng", "loằng ngoằng", "loắt choắt", "lóc cóc", "lóc ngóc", "lóc nhóc", "lọc cọc", "lọc trong", "lọc xọc", "loe loé", "loè bịp", "loè đời", "loé", "loen loét", "loẹt", "lòi dom", "lòi đuôi", "lòi họng", "lòi mặt nạ", "lòi ruột", "lòi tiền", "lỏi", "lõi", "lọi", "lọi xương", "lom khom", "lòm lòm", "lỏm", "lõm bõm", "lóm", "lọm cọm", "lọm khọm", "lon ton", "lon xon", "lòn", "lỏn", "lọn nghĩa", "long án", "long bào", "long cổn", "long cung", "long diên hương", "long đình", "long đong", "long đờm", "long đởm", "long giá", "long lỏng", "long mạch", "long nhan", "long nhãn", "long nhong", "long sàng", "long thần", "long thể", "long tong", "long trọng hóa", "long tu", "long vân", "long vương", "long xa", "lòng chảo", "lòng dạ", "lòng dục", "lòng đào", "lòng đất", "lòng đỏ", "lòng khòng", "lòng mang", "lòng máng", "lòng ngòng", "lòng son", "lòng tàu", "lòng tham", "lòng thành", "lòng thòng", "lòng thương", "lòng tin", "lòng trắng", "lòng vàng", "lòng xuân", "lỏng cha lỏng chỏng", "lỏng chỏng", "lỏng khỏng", "lỏng lẻo", "lỏng vỏng", "lõng", "lõng bõng", "lóng ca lóng cóng", "lóng cóng", "lóng la lóng lánh", "lóng lánh", "lóng nhóng", "lóp", "lóp lép", "lóp ngóp", "lót dạ", "lót lòng", "lót tay", "lọt lưới", "lọt tai", "lô-cốt", "lô-ga-rít", "lô gích", "lô-gích học", "lô hội", "lô nhô", "lô-tô", "lô xô", "lồ", "lồ lộ", "lồ ô", "lổ", "lổ đổ", "lỗ bi", "lỗ bì", "lỗ chẩm", "lỗ chân lông", "lỗ châu mai", "lỗ chỗ", "lỗ cống", "lỗ đáo", "lỗ hổng", "lỗ khí", "lỗ khoan", "lỗ mỗ", "lỗ mộng", "lỗ mũi", "lỗ nước", "lỗ rò", "lỗ rốn", "lỗ thông hơi", "lỗ thở", "lỗ thủng", "lỗ vốn", "lố bịch", "lố nhố", "lộ bàng", "lộ chuyện", "lộ đồ", "lộ hầu", "lộ liễu", "lộ phí", "lộ sáng", "lộ tẩy", "lộ thiên", "lộ xỉ", "lốc", "lốc cốc", "lốc nhốc", "lốc thốc", "lộc cộc", "lộc điền", "lộc giác", "lộc ngộc", "lộc nhung", "lộc vừng", "lôi đình", "lôi kéo", "lôi long", "lồi cầu", "lồi củ", "lồi lõm", "lỗi đạo", "lỗi hẹn", "lỗi in", "lỗi lạc", "lỗi lầm", "lối chừng", "lối đi", "lối lăng", "lối ra", "lối sống", "lối thoát", "lối vào", "lôm côm", "lôm lốp", "lồm", "lồm cồm", "lồm lộp", "lổm ngổm", "lộm cộm", "lồn lột", "lổn nhổn", "lốn nhốn", "lộn ẩu", "lộn bậy", "lộn chồng", "lộn cổ", "lộn đầu đuôi", "lộn giống", "lộn lại", "lộn lạo", "lộn mí", "lộn mửa", "lộn ngược", "lộn nhào", "lông bông", "lông buồn", "lông cánh", "lông chuột", "lông cu li", "lông hồng", "lông hút", "lông lá", "lông lốc", "lông lợn", "lông mã", "lông măng", "lông mình", "lông móc", "lông mũi", "lông ngông", "lông ngứa", "lông nhung", "lông quặm", "lông ruột", "lông seo", "lồng ấp", "lồng bàn", "lồng bồng", "lồng cồng", "lồng đèn", "lồng hổng", "lồng kính", "lồng lộn", "lồng ngực", "lồng ruột", "lồng tiếng", "lổng chổng", "lộng", "lộng gió", "lộng hành", "lộng óc", "lốp bốp", "lốp đốp", "lộp bộp", "lộp cộp", "lộp độp", "lốt", "lột da", "lột sột", "lột tả", "lột trần", "lột truồng", "lột vỏ", "lột xác", "lơ chơ", "lơ đãng", "lơ đễnh", "lơ-go", "lơ là", "lơ láo", "lơ lớ", "lơ lửng", "lơ thơ", "lơ tơ mơ", "lờ khờ", "lờ lãi", "lờ lờ", "lờ lợ", "lờ lững", "lờ mờ", "lờ ngờ", "lờ phờ", "lờ vờ", "lở", "lở láy", "lở loét", "lở tích", "lỡ bước", "lỡ cỡ", "lỡ dịp", "lỡ dỡ", "lỡ duyên", "lỡ hẹn", "lỡ lầm", "lỡ lời", "lỡ miệng", "lỡ mồm", "lợ", "lơi", "lơi lả", "lơi lỏng", "lời bạt", "lời chúc", "lời giải", "lời khai", "lời khen", "lời lãi", "lời lẽ", "lời lỗ", "lời nói", "lời nói đầu", "lời thú tội", "lời văn", "lợi danh", "lợi dân", "lợi hại", "lợi ích", "lợi khẩu", "lợi khí", "lợi kỉ", "lợi lộc", "lợi mật", "lợi nhuận", "lợi niệu", "lợi quyền", "lợi suất", "lợi sữa", "lờm", "lờm lợm", "lờm xờm", "lợm", "lơn", "lơn lớn", "lờn bơn", "lờn lợt", "lờn mặt", "lởn vởn", "lớn gan", "lớn lao", "lớn lên", "lớn mạnh", "lớn miệng", "lớn phổng", "lớn tiếng", "lớn tuổi", "lớn tướng", "lớn vồng", "lợn biển", "lợn bột", "lợn cà", "lợn cấn", "lợn cợn", "lợn dái", "lợn gạo", "lợn hạch", "lợn lòi", "lợn nái", "lợn nước", "lớp áo", "lớp cảnh", "lớp ghép", "lớp học", "lớp nhớp", "lớp sơn", "lớp xớp", "lợp xợp", "lớt phớt", "lớt xớt", "lợt lạt", "lu bù", "lu loa", "lu lơ", "lu mờ", "lù bù", "lù đù", "lù khù", "lù lù", "lù mù", "lù rù", "lù xù", "lủ khủ lù khù", "lũ lụt", "lũ lượt", "lú gan", "lú lẫn", "lú lấp", "lú nhú", "lú ruột", "lụ khụ", "lua", "lúa chét", "lúa chiêm", "lúa lốc", "lúa ma", "lúa má", "lúa miến", "lúa mùa", "lúa nếp", "lúa nổi", "lúa sớm", "lúa tẻ", "lụa là", "luân canh", "luân hồi", "luân lí", "luân lưu", "luân phiên", "luân tai", "luận giả", "luật dân sự", "luật thơ", "lúc đó", "lúc la lúc lắc", "lúc này", "lúc nãy", "lúc nhúc", "lục bì", "lục bội", "lục cườm", "lui bước", "lui gót", "lui lủi", "lùi xùi", "lúi húi", "lúi xùi", "lủm bủm", "lũm bũm", "lúm", "lúm khúm", "lún phún", "lún sâu", "lún sụt", "lún thụt", "lủng ca lủng củng", "lủng la lủng lẳng", "lúng ba lúng búng", "lúng búng", "lúng liếng", "lúng ta lúng túng", "lụng thà lụng thụng", "luôn tay", "luông luốc", "luông tuồng", "luống cày", "luống những", "lúp", "lụp bụp", "lụp chụp", "lút", "luỹ", "luỹ cọc", "luỹ giảm", "luỹ thừa", "luỹ tích", "luỹ tiến", "luỵ", "luyến âm", "luyện kim học", "luýnh quýnh", "lử đử lừ đừ", "lử thử lừ thừ", "lừa mị", "lửa binh", "lực kí", "lực nâng", "lừng chừng", "lược bỏ", "lược mau", "lược thao", "lười lĩnh", "lười nhác", "lười ươi", "lưỡi bẹ", "lưỡi cày", "lưỡi chích", "lưỡi hái", "lưỡi khoá", "lưỡi trượt", "lưới giăng", "lưới phễu", "lượn quanh", "lượn sóng", "lương lậu", "lương tướng", "lưỡng", "lưỡng bội", "lưỡng chất", "lưỡng hợp", "lưỡng tiêm", "lưỡng viện", "lượng cả", "lượng giác học", "lượng hình", "lượng sức", "lượng tử hoá", "lướt tha lướt thướt", "lượt thà lượt thượt", "lưu biến học", "lưu biến kế", "lưu độc", "lưu giam", "lưu giản", "lưu hoá", "lưu li", "lưu lượng", "lưu manh hoá", "lưu thuỷ", "lưu toan", "lưu tốc kế", "ma-bùn", "ma-cà-bông", "ma-cà-rồng", "ma chay", "ma-cô", "ma da", "ma-dút", "ma đạo", "ma-gi", "ma hoàng", "ma-két", "ma mãnh", "ma-men", "ma phương", "ma quái", "ma quỷ học", "ma tà", "ma thuật", "ma trận", "ma trơi", "ma tuý", "ma vương", "ma xó", "mà chi", "mà chược", "mà còn", "mà lại", "mà thôi", "mả bố", "mả cha", "mả mẹ", "mã cầu", "mã đề", "mã hiệu", "mã hồi", "mã não hoá", "mã số", "mã tà", "mã thầy", "mã tiền", "mã vĩ", "má hồng", "má phấn", "mác-xít", "mạc nối", "mạc treo", "mách bảo", "mách lẻo", "mách nước", "mách qué", "mạch ba gốc", "mạch dội", "mạch dừng", "mạch đập", "mạch đen", "mạch đồ", "mạch động", "mạch học", "mạch kí", "mạch lươn", "mạch môn đồng", "mạch nước", "mạch rẽ", "mai danh", "mai đây", "mai gầm", "mai hậu", "mai kia", "mai mỉa", "mai mốt", "mai một", "mai táng phí", "mai trúc", "mai vàng", "mài mòn", "mài nhẵn", "mài nhọn", "mài sắc", "mải mê", "mải miết", "mãi", "mãi lộ", "mái ấp", "mái bằng", "mái che", "mái chìa", "mái đầu", "mái đẩy", "mái đẻ", "mái đốc", "mái đua", "mái gà", "mái hắt", "mái nhà", "mái nhì", "mái nhô", "mại", "mại bản", "mại dâm", "man khai", "man mát", "man muội", "màn ảnh nhỏ", "màn ảnh rộng", "màn cửa", "màn màn", "màn quần", "màn sắt", "màn trướng", "màn vây", "màn xế", "mãn địa", "mãn đời", "mãn hạn", "mãn khoá", "mãn kì", "mãn kiếp", "mãn kinh", "mãn nguyệt", "mãn tang", "mãn tính", "mãn ý", "mán đỉa", "mán xá", "mạn đàm", "mạn phép", "mạn thượng", "mạn tính", "mang bành", "mang bệnh", "mang lại", "mang luỵ", "mang nợ", "mang ơn", "mang râu", "mang rô", "mang sang", "mang tai", "mang tấm", "mang tên", "mang tội", "màng bào", "màng bụng", "màng cứng", "màng kết", "màng lưới", "màng mềm", "màng não", "màng ngoài tim", "màng nháy", "màng nhầy", "màng nhện", "màng ối", "màng phổi", "màng sụn", "màng tang", "màng xương", "mãng cầu xiêm", "máng cỏ", "máng xối", "mạng chung", "mạng lịnh", "manh động", "manh giông", "manh tràng", "mành mành", "mảnh", "mảnh bát", "mảnh cộng", "mảnh dẻ", "mảnh ghép", "mảnh khảnh", "mảnh tước", "mảnh vỏ", "mảnh vỡ", "mảnh vụn", "mãnh", "mãnh hổ", "mãnh tướng", "mánh", "mánh khóe", "mạnh bạo", "mạnh cánh", "mạnh dần", "mạnh giỏi", "mạnh mẽ", "mạnh miệng", "mạnh mồm", "mạnh tay", "mạnh thường quân", "mao", "mao dẫn", "mao dẫn học", "mao dẫn kế", "mao lương", "mao mạch", "mào đầu", "mào gà", "mào lông", "mào tinh", "mão", "mạo", "mạo danh", "mạo muội", "mạo từ", "mạo xưng", "mát da", "mát dạ", "mát giời", "mát lòng", "mát mặt", "mát mẻ", "mát ruột", "mát rượi", "mát tay", "mát trời", "mạt-chược", "mạt đời", "mạt gà", "mạt giũa", "mạt hạng", "mạt kì", "mạt kiếp", "mạt lộ", "mạt nghệ", "mạt thế", "mau hạt", "mau lẹ", "mau miệng", "mau nước mắt", "màu bột", "màu da", "màu keo", "màu mẽ", "màu nước", "màu phấn", "máu cá", "máu cam", "máu chó", "máu dê", "máu gà", "máu ghen", "máu lạnh", "máu mặt", "máu me", "máu mê", "may đo", "may mặc", "may-ô", "may-ơ", "may ra", "may rủi", "may sao", "may-so", "may thay", "may vá", "mày đay", "mày hoa", "mày mò", "mày râu", "mày tao", "mày trắng", "mảy", "mảy may", "máy bào", "máy bay", "máy bóc gỗ", "máy bơm", "máy cán", "máy cày", "máy cắt", "máy cấy", "máy chém", "máy chiếu bóng", "máy công cụ", "máy dát", "máy dệt", "máy dệt kim", "máy dò", "máy doa", "máy đào", "máy đập", "máy điện", "máy điện toán", "máy đông lạnh", "máy gặt", "máy gấp", "máy giũa", "máy hàn", "máy hát", "máy hát điện", "máy hơi nước", "máy hút bụi", "máy kéo", "máy khâu", "máy khoan", "máy láng", "máy lạnh", "máy lửa", "máy lượn", "máy may", "máy miệng", "máy mó", "máy móc", "máy thu hình", "máy tốc kí", "máy vi tính", "máy xay", "máy xới", "máy xúc", "mạy châu", "mạy lay", "mắc áo", "mắc bận", "mắc bẫy", "mắc cạn", "mắc cọc", "mắc cửi", "mắc kẹt", "mắc lỗi", "mắc lỡm", "mắc míu", "mắc mớ", "mắc mớp", "mắc mưu", "mắc mứu", "mắc nạn", "mắc nghẽn", "mắc phải", "mắc việc", "mắc xương", "mặc cả", "mặc kệ", "mặc khách", "mặc lòng", "mặc may", "mặc nhiên", "mặc sức đi dạo", "mặc thây", "mặc xác", "mặc ý", "măm", "măm mún", "mắm cá", "mắm muối", "mắm tôm", "măn mẳn", "mằn", "mằn mặn", "mằn thắn", "mẳn", "mắn", "mắn đẻ", "mặn mà", "măng-đa", "măng đá", "măng-đô-lin", "măng non", "măng-sét", "măng-sông", "măng sữa", "măng-tô", "mắng chửi", "mắng mỏ", "mắng nhiếc", "mắt cáo", "mắt đơn", "mắt ghép", "mắt hột", "mắt kép", "mắt kính", "mắt mỏ", "mắt nhoèn", "mắt thần", "mắt vọ", "mặt bằng", "mặt cắt", "mặt cân", "mặt chữ", "mặt dày", "mặt dưới", "mặt đứng", "mặt đường", "mặt giăng", "mặt giời", "mặt hoa", "mặt khác", "mặt mày", "mặt mẹt", "mặt mo", "mặt mũi", "mặt nạc", "mặt nhẫn", "mặt phải", "mặt phố", "mặt rồng", "mặt sắt", "mặt số", "mặt thịt", "mặt thoáng", "mặt thớt", "mặt trái", "mặt trời", "mâm bồng", "mâm đỉnh cột", "mâm xôi", "mầm ghép", "mầm mống", "mầm phôi", "mầm răng", "mân", "mân mó", "mần", "mần ăn", "mần răng", "mần thinh", "mần trầu", "mẫn nhuệ", "mẫn tiệp", "mẫn tuệ", "mấn", "mâng", "mầng", "mất ăn", "mất công", "mất cướp", "mất giá", "mất giống", "mất gốc", "mất hồn", "mất hút", "mất kinh", "mất lòng", "mất mạng", "mất mát", "mất mặt", "mất nết", "mất nước", "mất sức", "mất tăm", "mất tiếng", "mất tinh thần", "mất toi", "mất trắng", "mất trinh", "mất trộm", "mất tư cách", "mất vía", "mất vui", "mật báo", "mật chỉ", "mật cứ", "mật dụ", "mật đàm", "mật điện", "mật hoa", "mật huyết", "mật kế", "mật mã hóa", "mật nguyệt", "mật ngữ", "mật phái", "mật tấu", "mật thám", "mật thiết", "mật thư", "mật tiếp", "mật ước", "mâu", "mầu", "mầu nhiệm", "mẫu gốc", "mẫu hậu", "mẫu mực", "mẫu quốc", "mẫu quyền", "mẫu tây", "mẫu thân", "mẫu thức", "mẫu tử", "mẫu tự", "mấu chốt", "mấu lồi", "mậu", "mậu dịch quốc doanh", "mậu dịch viên", "mây bạc", "mây dông", "mây khói", "mây mù", "mây mưa", "mây rồng", "mây ti", "mây ti tầng", "mây ti tích", "mây trung tầng", "mẩy", "mấy", "mấy ai", "mấy chốc", "mấy hơi", "mấy khi", "mấy mươi", "mấy nả", "mấy nỗi", "me tây", "me-xừ", "mè nheo", "mè xửng", "mẽ", "mẹ chồng", "mẹ cu", "mẹ ghẻ", "mẹ già", "mẹ kế", "mẹ mìn", "mẹ mốc", "mẹ nuôi", "mẹ ranh", "mem", "mèm", "men huyền", "men khảm", "men mét", "men rạn", "men trong", "mén", "mèng", "meo cau", "meo meo", "meo mốc", "mèo hoang", "mèo rừng", "mẻo", "méo mặt", "méo mó", "méo xệch", "mẹo mực", "mẹp", "mét hệ", "mét khối", "mét vuông", "mẹt", "mê ám", "mê cung", "mê cuồng", "mê đạo", "mê gái", "mê hoảng", "mê hoặc", "mê hồn", "mê li", "mê loạn", "mê mải", "mê mẩn", "mê mệt", "mê ngủ", "mê sách", "mê say", "mê tân", "mê thích", "mê tít", "mê tơi", "mề", "mề-đay", "mề gà", "mễ", "mế", "mệ", "mếch lòng", "mềm dẻo", "mềm hóa", "mềm lòng", "mềm lưng", "mềm mại", "mềm môi", "mềm nhẽo", "mềm nhũn", "mềm yếu", "mên mến", "mền mệt", "mến chuộng", "mến thương", "mến tiếc", "mến yêu", "mênh mang", "mệnh", "mệnh bạc", "mệnh căn", "mệnh chung", "mệnh danh", "mệnh đề", "mệnh hệ", "mệnh lệnh", "mệnh một", "mệt lả", "mệt lử", "mệt nhoài", "mệt nhọc", "mệt nhừ", "mệt phờ", "mệt rũ", "mệt xác", "mếu máo", "mi", "mi-ca", "mi-cơ-rô", "mì chính", "mì dẹt", "mì hột", "mì ống", "mì que", "mì sợi", "mĩ cảm", "mĩ dục", "mĩ hóa", "mĩ học", "mĩ kim", "mĩ lệ", "mĩ mãn", "mĩ miều", "mĩ nghệ", "mĩ nghệ phẩm", "mí", "mia", "mỉa", "mích lòng", "miên hành", "miễn chấp", "miễn chức", "miễn dịch học", "miễn giảm", "miễn là", "miễn nghị", "miễn nhiệm", "miễn sai", "miễn sao", "miễn tố", "miễn tội", "miễn trách", "miễn xá", "miện", "miệng ăn", "miệng thế", "miệng tiếng", "miết", "miệt", "miệt thị", "miêu", "miễu", "miếu đường", "miếu hiệu", "miếu mạo", "mim mím", "mỉm", "min", "mịn", "mịn màng", "minh", "minh chủ", "minh chứng", "minh công", "minh giải", "minh hoạ", "minh hương", "minh linh", "minh mạc", "minh mông", "minh nguyệt", "minh oan", "minh phủ", "minh quản", "minh quân", "minh tâm", "minh thệ", "minh tinh", "minh tra", "minh xét", "mình mẩy", "mịnh", "mít đặc", "mít-tinh", "mò đỏ", "mò gái", "mỏ chặn", "mỏ hạc", "mỏ-lết", "mỏ lộ thiên", "mỏ quạ", "mõ toà", "mó", "mó máy", "moay-ơ", "móc câu", "móc đôi", "móc hàm", "móc máy", "móc ngoặc", "móc nối", "móc túi", "móc xích", "mọc mộng", "moi ruột", "mỏi nhừ", "mỏi rời", "mòm", "mỏm chũm", "mỏm cụt", "mõm chó", "mõm mòm", "mõm sói", "móm", "móm mém", "móm xều", "món ăn", "món canh", "món thi", "món tiền nhỏ nhoi", "mòng biển", "mòng két", "mỏng mẻo", "móng", "móng giò", "móng guốc", "móng mánh", "móng rồng", "mọng nước", "moóc", "moóc-chê", "móp mẹp", "mọt gỗ", "mọt thóc", "mô bào", "mô-bi-lét", "mô-đéc", "mô-tô", "mô-tô thuyền", "mô-tơ", "mộ giả", "mốc sương", "mộc đạc", "mộc học", "mộc hương", "mộc lan", "mộc thông", "mộc tinh", "môi hóa", "môi-răng", "môi-vòm", "mối mai", "mối quân", "mối thợ", "môm", "môn vị", "mồng gà", "mống cụt", "mộng hàm", "mộng học", "mộng hồn", "mộng thức", "một độ", "một lá mầm", "một lúc", "mơ ngủ", "mờ nhạt", "mở cửa", "mở tung", "mỡ giắt", "mỡ khổ", "mỡ màng", "mơi", "mới phải", "mơn", "mơn man", "mơn mởn", "mù màu", "mù-tạt", "mù u", "mủ thối", "mũ bê-rê", "mũ bình thiên", "mũ bịt đầu", "mũ ca-lô", "mũ cánh chuồn", "mũ cát-két", "mũ cột", "mú", "mua cái", "mua chịu", "mua hàng", "mua họ", "mua vét", "mùa đông", "mùa gặt", "mùa hạ", "mùa hanh", "mùa hè", "mùa lạnh", "mùa nực", "mùa nước", "mùa rét", "mùa thu", "mùa xuân", "múa máy", "múa mỏ", "múa vờn", "mục phu", "mùi hôi", "mùi khét", "mùi thối", "mùi thơm", "mùi-xoa", "mũi dãi", "mũi hóa", "mũi khoan", "múi nhau", "mũm mĩm", "mùn cưa", "mùn thớt", "mùn xâu", "mụn cóc", "mụn con", "mụn ghẻ", "mụn mủ", "mụn nước", "mụn rộp", "mung lung", "mùng quân", "mùng tơi", "muỗi cát", "muỗi năn", "muỗi sốt rét", "muỗi vằn", "muội lò", "muôn kiếp", "muộn chồng", "muộn con", "mụp", "mút chìa", "mưa bóng mây", "mưa đá", "mựa", "mực bướm", "mực nang", "mực nho", "mực phủ", "mực thẻ", "mướp đắng", "mướp hương", "mướp tàu", "mướp tây", "mướt", "mưu loạn", "na-pan", "nác", "nái sữa", "nam ai", "nam bằng", "nam hóa", "nam mộc hương", "nam tính hóa", "nan hóa", "nan trị", "nàn", "nang hóa", "náng", "nành", "não giữa", "não nà não nuột", "não nuột", "não sau", "não thất", "não trung gian", "não trước", "não tủy", "náo loạn", "nạo thai", "nạp đạn", "nạp điện", "nát nhừ", "náu mình", "nảy đom đóm", "nặc mùi", "năm hạn", "năm kìa", "năm ngân sách", "nằm im", "nằm mèo", "nằm mẹp", "nằm nghiêng", "nằm ngửa", "nằm queo", "nằm sấp", "nằm sượt", "nắm bắt", "nắm cổ", "nắm đất", "nắm lấy", "nằn nèo", "nắn khớp", "nắn lưng", "năng động tính", "năng lượng học", "nằng nặng", "nắng hạn", "nắng mới", "nắng quái", "nặng nợ", "nặng trĩu", "nắp ấm", "nắp mang", "nấc nở", "nầm", "nấm chổi", "nấm cũ", "nấm da", "nấm gỉ", "nấm hương", "nấm lim", "nấm lõ chó", "nấm mồng gà", "nâng dậy", "nẫng nhẹ", "nâu đen", "nầy", "nem chua", "nem rán", "ném biên", "ném thia lia", "nen nét", "nén cà", "neo người", "neo túng", "nèo", "nét bút", "nét chải", "nét ngang", "nét phóng", "nét sổ", "nét vẽ", "nê-ông", "nể nả", "nên danh", "nên nỗi", "nêu bật", "nêu tên", "nga hoàng", "nga truật", "ngà răng", "ngả cỗ", "ngả người", "ngả rạ", "ngã chúi", "ngã lăn", "ngã ngồi", "ngã nhào", "ngã uỵch", "ngã xệp", "ngạc", "ngạc hóa", "ngai rồng", "ngại khó", "ngan", "ngan ngát", "ngàn dặm", "ngàn năm", "ngàn ngạt", "ngán ngao", "ngang điểm", "ngang ngạnh", "ngang nhau", "ngang vai", "ngãng", "ngáng trở", "ngảnh đi", "ngảnh lại", "ngảnh mặt", "ngão", "ngáo ộp", "ngạt thở", "ngay thảo", "ngày chí", "ngày đản", "ngày kị", "ngày một", "ngày phân", "ngày rằm", "ngày tết", "ngày xửa ngày xưa", "ngắc ngỏm", "ngăm đe", "ngắm ngía", "ngăn chận", "ngăn chuồng bò", "ngăn đón", "ngăn ngắt", "ngăn ngừa", "ngăn rào", "ngằn ngặt", "ngắn gọn", "ngắn hạn", "ngắn hơi", "ngắn hủn", "ngắn ngủi", "ngắn ngủn", "ngẵng", "ngắt lời", "ngắt mạch", "ngặt ngòi", "ngấc đầu", "ngâm chiết", "ngâm cứu", "ngâm đít", "ngậm hơi", "ngậm hờn", "ngân bản vị", "ngân hoa", "ngân qũy", "ngân tuyến", "ngần", "ngần nào", "ngần này", "ngẩn", "ngận hương", "ngẩng", "ngẩng mặt", "ngấp nga ngấp nghé", "ngấp ngó", "ngập lụt", "ngất trời", "ngật ngà ngật ngưỡng", "ngật ngưỡng", "ngẫu", "ngẫu cực", "ngẫu đề", "ngẫu nhĩ", "ngầy ngậy", "ngấy sốt", "nghe lõm", "nghe lóng", "nghe sách", "nghe tiếng", "nghèn nghẹn", "nghèn nghẹt", "nghẽn mạch", "nghẹn đòng", "nghèo xác", "nghèo xơ", "nghề khơi", "nghề lộng", "nghề ngà", "nghệ đen", "nghênh ngáo", "nghênh phong", "nghễnh ngãng", "nghêu ngao", "nghễu", "nghi dụ", "nghi gia", "nghi nghĩa", "nghi trang", "nghi trượng", "nghĩ thái", "nghĩ thầm", "nghị", "nghị hoà", "nghĩa bóng", "nghĩa dũng", "nghĩa dũng quân", "nghĩa đen", "nghĩa hẹp", "nghĩa huynh", "nghĩa vụ học", "nghịch biến", "nghịch biện", "nghịch chuyển", "nghịch chứng", "nghịch thù", "nghịch thường", "nghiêm khốc", "nghiêm phòng", "nghiên", "nghiên cứu viên", "nghiêu khê", "nghìn", "nghìn dặm", "nghìn năm", "nghỉn", "nghinh địch", "nghinh đón", "nghinh giá", "nghinh hôn", "nghinh nghỉnh", "nghinh phong", "nghinh tân", "nghinh tiếp", "nghinh tống", "nghinh xuân", "nghít", "ngò gai", "ngò tàu", "ngó sen", "ngoài vòng", "ngoại", "ngoại đạo", "ngoại độc tố", "ngoại động từ", "ngoại giả", "ngoại giới", "ngoại hạng", "ngoại hiện", "ngoại hình", "ngoại hoá", "ngoại hối", "ngoại hôn", "ngoại khoa", "ngoại nhập", "ngoại nhũ", "ngoại quả bì", "ngoại quan", "ngoại sinh", "ngoại suy", "ngoại tâm", "ngoại thành", "ngoại thẩm", "ngoại thận", "ngoại thích", "ngoại tiếp", "ngoại tiết", "ngoại trú", "ngoại trừ", "ngoại trưởng", "ngoại ứng", "ngoạn cảnh", "ngoáo", "ngoay ngoảy", "ngoằng ngoẵng", "ngoẵng", "ngọc am", "ngọc giá", "ngọc hoàn", "ngọc thạch", "ngoe nguẩy", "ngóeo chân", "ngỏn ngoẻn", "ngón bấm", "ngón bật", "ngón cái", "ngón gian", "ngón giữa", "ngón nhẫn", "ngón tay", "ngón trỏ", "ngón út", "ngọn cỏ", "ngọn cờ", "ngọn đèn", "ngọn giáo", "ngọn gió", "ngọn lửa", "ngọt bùi", "ngọt dịu", "ngọt hóa", "ngô đồng", "ngô ngố", "ngỗ nghịch", "ngỗ ngược", "ngộ biện", "ngộ thuốc", "ngộc nghệch", "ngồi bệt", "ngồi chồm hổm", "ngồi dậy", "ngồi đồng", "ngồi phệt", "ngồi vắt chân", "ngồi xếp bằng", "ngồi xệp", "ngồi xổm", "ngôn", "ngồn ngộn", "ngỗng trời", "ngơ ngẩn", "ngờ nghệch", "ngời ngời", "ngời ngợi", "ngờm ngợp", "ngợm", "ngơn ngớt", "ngu phu", "ngủ hè", "ngủ hoang", "ngủ lịm", "ngũ bội", "ngũ cung", "ngũ cúng", "ngũ gia bì", "ngũ giác", "ngũ sự", "ngũ vị hương", "ngũ vị nam", "ngú ngớ", "ngúc", "ngúc ngắc", "ngúng nga ngúng nguẩy", "ngúng nguẩy", "nguồn hứng", "nguy", "nguy hại", "nguy khốn", "nguy kịch", "nguy nan", "nguy ngập", "nguy vong", "ngụy đạo", "ngụy tác", "nguyên", "nguyên âm", "nguyên bản", "nguyên bào cơ", "nguyên bào sợi", "nguyên bào tử", "nguyên cảo", "nguyên cáo", "nguyên cớ", "nguyên cư", "nguyên cứ", "nguyên do", "nguyên giá", "nguyên hồng cầu", "nguyên lí", "nguyên sơ", "nguyên súy", "nguyên thuỷ", "nguyên tố", "nguyên tội", "nguyên tử bào", "nguyên tử gam", "nguyên tử lực", "nguyên tử lượng", "nguyên tử số", "nguyên uỷ", "nguyên văn", "nguyên vẹn", "nguyên vì", "nguyện ước", "nguyệt", "nguyệt cung", "nguyệt hoa", "nguyệt học", "nguyệt kị", "nguyệt lão", "nguyệt phí", "nguyệt quế", "nguyệt san", "nguyệt tận", "nguýt", "ngư học", "ngư tất", "ngư tiều", "ngừ", "ngữ pháp học", "ngữ tộc", "ngữ văn học", "ngữ vị", "ngữ vị học", "ngữ vựng", "ngưa ngứa", "ngửa nghiêng", "ngứa sần", "ngứa tiết", "ngựa gỗ", "ngực giữa", "ngực sau", "ngực trước", "ngưng kết", "ngước mắt", "ngược chiều", "người già", "người gửi", "người ốm", "người thân", "người thương", "ngưỡng trông", "ngượng ngạo", "ngứt", "ngưu bàng", "ngưu hoàng", "nha đảm tử", "nhà con", "nhà đòn", "nhà nhã", "nhà nhân chủng học", "nhà nước hoá", "nhà tranh", "nhà trong", "nhà trừng giới", "nhà việc", "nhả khớp", "nhả tơ", "nhã tập", "nhã ý", "nhác nhớm", "nhác qua", "nhác thấy", "nhác trông", "nhạc gia", "nhạc khí", "nhạc lí", "nhái bén", "nham", "nham nham", "nham nhám", "nhan đề", "nhan đề là", "nhan nhản", "nhàn cư", "nhàn hạ", "nhãn áp đồ", "nhãn áp kí", "nhãn chiết kế", "nhãn trùng", "nhãng quên", "nhanh chai", "nhanh tay", "nhành", "nhào lượn", "nhào nháo", "nhạo đời", "nhạt miệng", "nhàu nhò", "nhày", "nhày nhụa", "nhảy cái", "nhảy phốc", "nhảy quẩng", "nhăm nhắp", "nhằm nhì", "nhắm nhía", "nhăn nhẵn", "nhắn tin", "nhặng bộ", "nhắp nháp", "nhặt khoan", "nhặt thưa", "nhấc bổng", "nhấc que", "nhâm nhẩm", "nhâm nhấp", "nhấm nhứ", "nhân  nhượng", "nhân bản chủ nghĩa", "nhân chính", "nhân dạng", "nhân danh học", "nhân dục", "nhân đạo chủ nghĩa", "nhân hình hóa", "nhân mối", "nhân nghì", "nhân tử", "nhân văn chủ nghĩa", "nhẫn cưới", "nhẫn nhịn", "nhận dạng", "nhận lỗi", "nhận thầu", "nhận thực", "nhấp nha nhấp nháy", "nhấp nha nhấp nhổm", "nhấp nhỏm", "nhấp nhô", "nhập bọn", "nhập diệu", "nhập lí", "nhập thanh", "nhất nguyên chế", "nhật ấn", "nhật dạ", "nhật hoa", "nhật hướng động", "nhật kế", "nhật kì", "nhật kí", "nhật quang", "nhật quang kế", "nhật tâm", "nhật xạ kế", "nhật xạ kí", "nhây nhớt", "nhe răng", "nhẻ", "nhem nhem", "nhẻm", "nhèo nhẽo", "nhèo nhẹo", "nhện nâu", "nhện nhà", "nhi đồng học", "nhi tính", "nhĩ châm", "nhí nha nhí nhố", "nhị hóa", "nhị lép", "nhị nguyên", "nhị trùng", "nhiễm lạnh", "nhiễm thể", "nhiệm kì", "nhiệm mệnh", "nhiệt cơ", "nhiệt động học", "nhiệt đới hoá", "nhiệt lí", "nhiệt nghiệm", "nhiệt thán", "nhiệt tình", "nhiệt từ", "nhiều bên", "nhiễu chuyện", "nhìn nhõ", "nhịn khát", "nhịp điệu học", "nhiu nhíu", "nhịu mồm", "nhỏ nhắn", "nhọ mặt", "nhòa", "nhoang nhoáng", "nhòe", "nhòe nhoẹt", "nhóm chức", "nhóm con", "nhón chân", "nhọn vắt", "nhót tây", "nhọt bọc", "nhồn nhột", "nhộng bọc", "nhộng trần", "nhờ có", "nhớ nước", "nhớ ơn", "nhớm", "nhơn nhơn", "nhu dụng", "nhu mô", "nhù nhờ", "nhũ", "nhũ hóa", "nhũ trấp", "nhụ", "nhùn nhũn", "nhún nhảy", "nhung mao", "nhung não", "nhùng nhà nhùng nhằng", "nhũng nha nhũng nhẵng", "nhuốm màu", "nhuộm màu", "nhuyễn não", "như in", "nhựa dầu", "nhựa đường", "nhựa luyện", "nhựa nguyên", "nhựa ruồi", "nhức đầu", "nhức xương", "nhưng nháo", "nhửng nhưng", "nhược cơ", "nhược trương", "nhường này", "nhường như", "nhướng", "ni-lông", "niêm chì", "niềm tin", "niên bạ", "niên kỉ", "niết", "niết bàn", "niêu biểu", "nịnh nót", "no say", "nóc nhà", "nóc vòm", "noi bước", "noi gương", "noi theo", "nói bộ", "nói chi", "nói dựa", "nói gì", "nói giúp", "nói hoẹt", "nói khoác", "nói lẫn", "nói lẩy", "nói lí", "nói lịu", "nói lọn", "nói lớ", "nói mơ", "nói rỉa", "nói thách", "nói trây", "nói trộm vía", "nói trống", "non yếu", "nón dứa", "nóng ngốt", "nóng rực", "nô dịch hóa", "nô en", "nô lệ hóa", "nô thần", "nô tì", "nỗ", "nồi cất", "nồi chõ", "nồi chưng", "nồi hầm", "nồi lò", "nổi cáu", "nổi cơn", "nổi doá", "nổi gân", "nổi hạt", "nổi hiệu", "nổi nhà", "nội ban", "nội chất", "nội cỏ", "nội dưỡng", "nội giám", "nội gián phân", "nội giao", "nội hạch", "nội hoá", "nội hợp", "nội lưu", "nội mô", "nội nguyên tử", "nội ô", "nội thẩm", "nội thẩm kế", "nội tiết học", "nội tuyết", "nôn nả", "nôn nghén", "nôn ọe", "nông chính", "nông địa học", "nông nhàn", "nông trang viên", "nộp mình", "nốt ngân", "nốt sần", "nột", "nờ", "nở dài", "nở khối", "nỡ lòng nào", "nỡ tay", "nợ khống", "nơi nới", "nới lỏng", "nờm nợp", "nụ áo thực", "nủa", "nục huyết", "nục nạc", "nục nịch", "núi non bộ", "nùn", "nung núc", "nùng nục", "núng thế", "nuốc", "nuối tiếc", "núp bóng", "nút bấm", "nữ binh", "nữ cán bộ", "nữ dung", "nữ đồng chí", "nữ giáo viên", "nữ hóa", "nữ học", "nữ huấn", "nữ kĩ sư", "nữ sinh viên", "nữ sử", "nữ thi sĩ", "nữ thí sinh", "nữ tì", "nữ tùy tùng", "nửa cung", "nửa kí sinh", "nửa sóng", "nữa mai", "nực mùi", "nựng mùi", "nước ăn", "nước bài", "nước cam", "nước chín", "nước dừa", "nước hãm", "nước lạnh", "nước ót", "nược", "nứt nẻ", "o-xi", "o-xít hóa", "ò e í e", "ó cá", "oái", "oán cừu", "oát giờ", "oát kế", "oẳn tù tì", "oăng oẳng", "óc nóc", "oe con", "oe oé", "oi khan", "om kế", "ỏn a ỏn ẻn", "ong bầu", "ong bò vẽ", "ong đất", "ong gấu", "ong óng", "ong quân", "ong ruồi", "ong vàng", "òng ọc", "ỏng ảnh", "óng a óng ánh", "ọt ẹt", "ô đầu", "ô kéo", "ô kê", "ô mắt", "ô môi", "ô-tô", "ô-tô-buýt", "ô-tô-ca", "ô-tô điện", "ô-tô hòm", "ô-tô ray", "ô-tô xích", "ổ bánh mì", "ổ khoá", "ốc anh vũ", "ốc ao", "ốc bươu", "ốc đá", "ốc gai", "ốc làn", "ốc mượn hồn", "ốc nhồi", "ốc sao", "ốc song kinh", "ộc gạch", "ổi đào", "ổi găng", "ổi tiết", "ổi trâu", "ổi xá lị", "ối chao ôi", "ôm chằm", "ôm kế", "ốm nhách", "ôn hoà", "ôn ổn", "ôn tuyền", "ổn đáng", "ổn thoả", "ông đồng", "ông kẹ", "ông tự", "ống dẫn đái", "ống dẫn khí đốt", "ống đái", "ống gió", "ống khí", "ống lông", "ống lồng", "ống nghiệm", "ống quần", "ống sáo", "ống suốt", "ống trắm", "ống xả", "ống xoắn", "ốp đồng", "ốp-xét", "ở ăn", "ở lỗ", "ở vú", "ợ chua", "ợ nóng", "ờn ợt", "ớn rét", "ớt bột", "ớt chỉ thiên", "ớt cựa gà", "ớt ngọt", "palăng", "pha lững", "pha phôi", "phá đề", "phá hỏng", "phá trại giam", "phác hoạ", "phạch", "phạch phạch", "phai màu", "phải bã", "phải đũa", "phải đường", "phái thuốc", "phàm là", "phàm trần", "phạm huý", "phạm tội", "phản ảnh", "phản ánh luận", "phản bác", "phản bạn", "phản biến", "phản biện", "phản bội", "phản cách mạng", "phản chỉ định", "phản chiến", "phản chứng", "phản cung", "phản dân tộc", "phản diện", "phản duy lí", "phản đại chúng", "phản đề án", "phản đề nghị", "phản đế", "phản điện động", "phản gián", "phản hạt", "phản hiến pháp", "phản hồi", "phản kháng", "phản khoa học", "phản kích", "phản kinh tế", "phản liên", "phản pháo kích", "phản phong", "phản phong kiến", "phản phúc", "phản quang", "phản quốc", "phản sư phạm", "phản thân", "phản thần", "phản thùng", "phản xạ đồ", "phản xạ học", "phán định", "phán xét", "phán xử", "phạn học", "phạn ngữ", "phang phác", "phanh xác", "phao khí", "phao tang", "phao truyền", "pháo đài bay", "pháo đội", "pháo thăng thiên", "pháp trường", "phát âm", "phát báo", "phát chán", "phát hoả", "phát hoàn", "phát khiếp", "phát lương", "phát ngôn nhân", "phát phiền", "phát thệ", "phát xít hóa", "phạt tiền", "phảy", "phăng phăng", "phẩm vị", "phân đoạn", "phân đôi", "phân gà vịt", "phân giao", "phân hoá", "phân hoá học", "phân hoạch", "phân kì", "phân lèn", "phân lực", "phân lượng", "phân thân", "phân thùy", "phân thức", "phân tiết", "phân tính", "phân tính học", "phân tro", "phân trụ", "phân tử gram", "phân tử khối", "phân vị", "phần cảm", "phần góp", "phần lẻ", "phần phò", "phần ứng", "phất trần", "phật bà", "phây phẩy", "phe lũ", "phe phảy", "phèn đen", "phèn đẹt", "phép giải", "phép khử", "phép thế", "phê", "phê phán chủ nghĩa", "phế dung kế", "phế dung kí", "phế mạc", "phệnh", "phi chính trị hóa", "phi giác quan", "phi giai cấp", "phi giáo điều", "phi hạt nhân hóa", "phi hình", "phi hình sự hóa", "phi lí", "phi nhân hóa", "phi thực dân hoá", "phi tiêu", "phi tội phạm hóa", "phi tư sản hóa", "phì đại", "phì hơi", "phí công", "phí của", "phí sức", "phiếm giao", "phiếm tại", "phiếm thần luận", "phiên thân", "phiên toà", "phiền hoa", "phiền luỵ", "phiền tạp", "phiết", "phiếu bầu", "phim ảnh", "phim truyện", "phin nõn", "phịt", "phịu mặt", "pho pho", "phò vua", "phó chủ tịch", "phó đô đốc", "phó giám đốc", "phó giám mục", "phó giáo sư", "phó hiệu trưởng", "phó hội trưởng", "phó kĩ sư", "phó lãnh sự", "phó lí", "phó thống đốc", "phó thủ tướng", "phó tổng", "phó tổng thống", "phó viện trưởng", "phó vụ trưởng", "phong ấn", "phong ấp", "phong cương", "phong hoá", "phong kí", "phong lôi", "phong tặng", "phong thành", "phong thánh", "phong thần", "phong thuỷ", "phong toả", "phòng gian", "phòng giấy", "phòng hoả", "phòng học", "phòng mổ", "phòng trai", "phỏng cầu", "phỏng lập phương", "phỏng ước", "phóng hoả", "phóng tác", "phô của", "phô danh", "phô tài", "phồ", "phổ dụng", "phổ học", "phổ kí", "phổ nhạc", "phổ quang kế", "phôi bào", "phôi bì", "phôi cầu", "phôi châu", "phôi dâu", "phôi học", "phôi nang", "phôi vị", "phối giống", "phồng tôm", "phổng", "phổng mũi", "phơi màu", "phơi xác", "phu lục lộ", "phù động", "phù kiều", "phù nền", "phù thủng", "phù thuỷ", "phủ hầu", "phú hậu", "phú hộ", "phú hữu", "phụ âm hoá", "phụ chính", "phụ công", "phụ đề", "phụ hoạ", "phụ kiện", "phụ lòng", "phúc bồn tử", "phúc chốt", "phúc hạch", "phục hoá", "phục quyền", "phục tòng", "phục vị", "phủi tay", "phung", "phung phúng", "phúng điếu", "phụng chiếu", "phút đâu", "phứa phựa", "phức điệu", "phức tạp hoá", "phừng", "phước lành", "phương khuy", "phương ngữ học", "phương pháp học", "phương pháp luận", "phương sai", "phường chèo", "phượng loan", "phượng tây", "phượng vĩ", "pi-a-nô", "pi-gia-ma", "pi-rít", "ping-pông", "pom-mát", "pô-pe-lin", "pô-rơ-tít", "pơ-luya", "pơ mu", "pu-li", "qua lần", "qua lâu", "qua lửa", "quà bánh", "quà biếu", "quà tết", "quả bế", "quả bì", "quả bóng", "quả cải", "quả cánh", "quả dâu", "quả đậu", "quả hạch", "quả hộp", "quả khô", "quả kiếp", "quả mõ", "quả mọng", "quả thịt", "quả tụ", "quá giờ", "quá nén", "quạ mổ", "quạ sắt", "quai nón", "quái thai học", "quái tượng", "quan", "quan ải", "quan âm", "quan cách", "quan chế", "quan chiêm", "quan chức", "quan dạng", "quan điền", "quan giai", "quan họ", "quan khách", "quan lại", "quan liêu", "quan lộ", "quan lớn", "quan ngại", "quan nha", "quan ôn", "quan quyền", "quan san", "quan sát viên", "quan sơn", "quan tái", "quan tâm", "quan thầy", "quan thiết", "quan thoại", "quan thuế", "quan toà", "quan trắc", "quan trọng hóa", "quan trường", "quan tước", "quan văn", "quan viên", "quan võ", "quan yếu", "quản bao", "quản bào", "quản khoán", "quản lễ", "quản lí", "quán ăn", "quán nước", "quán tẩy", "quán từ", "quán xá", "quang âm", "quang cầu", "quang dẫn", "quang dầu", "quang dưỡng", "quang điện", "quang gánh", "quang hình học", "quang hóa", "quang hóa học", "quang hoạt", "quang hợp", "quang hướng động", "quang kế", "quang liệu pháp", "quang năng", "quang nhân", "quang phản ứng", "quang phát quang", "quang phân", "quang quác", "quang quẻ", "quang sai", "quang sinh học", "quang thông", "quang tổng hợp", "quang từ", "quang tử", "quang ứng động", "quang xúc tác", "quảng thị", "quảng tính", "quáng quàng", "quanh năm", "quanh quánh", "quanh queo", "quanh quéo", "quành quạch", "quao", "quát tháo", "quạt giấy", "quạt lông", "quạt thóc", "quau có", "quáu", "quay chuyển", "quay đĩa", "quay ngửa", "quay phải", "quay quoắt", "quay ráo", "quay sấp", "quay trái", "quay trượt", "quày quạy", "quăm", "quăm quẳm", "quắp đuôi", "quấc", "quân bưu viên", "quân dân", "quân kì", "quân kỉ", "quân phong quân kỉ", "quân sự hoá", "quân uỷ", "quần bò", "quần hội", "quần lạc", "quần lót", "quần xà lỏn", "quẫn", "quận đoàn", "quận uỷ", "quẩng", "que diêm", "que ngoáy", "que thăm", "quen mặt", "quen việc", "quèn quẹt", "quèo chân", "quê kệch", "quê khách", "quê ngoại", "quê nội", "quế nhục", "quềnh quoàng", "quệnh quoạng", "quết trầu", "quều", "quếu quáo", "quốc âm", "quốc bảo", "quốc biến", "quốc cấm", "quốc dân đảng", "quốc đại", "quốc gia chủ nghĩa", "quốc hiệu", "quốc hoạ", "quốc học", "quốc hồn", "quốc hữu hoá", "quốc kế", "quốc khố", "quốc kì", "quốc lập", "quốc lễ", "quốc liên", "quốc nạn", "quốc pháp", "quốc phục", "quốc sách", "quốc sắc", "quốc sỉ", "quốc sĩ", "quốc sư", "quốc sử", "quốc sử quan", "quốc sự", "quốc tang", "quốc tế ca", "quốc tế chủ nghĩa", "quốc tế hoá", "quốc vương", "quốc xã hoá", "quở quạng", "quớ", "quy cách hoá", "quy chế", "quy chính", "quỳ gối", "quỹ bảo thọ", "quyền anh", "quyển bá", "quyển khí", "quyển lửa", "quyển nặng", "quyển nước", "quyển sắc", "quyển sinh vật", "quyết đoán luận", "quyết thực vật", "quyết tử", "ra-đa", "ra-đi", "ra-đi-an", "ra-đi-ô", "ra gu", "ra lò", "ra rià", "ra toà", "rà soát", "rác rến", "rạc người", "rách tướp", "rái cá biển", "ram rám", "ràn rạt", "rán sức", "rán xem", "rạn vỡ", "ràng ràng", "rạng sáng", "rành rẽ", "rào rạt", "rảo bước", "rạo rạo", "rau càng cua", "rau cao", "rau trai", "rãy", "ráy leo", "rắm rít", "rằn rện", "rắn hổ lục", "rắn lục cườm", "rắn mai gầm", "rắn phì", "rắn râu", "răng cấm", "răng hàm nhỏ", "râm rấp", "rậm rịt", "rấn sức", "rận cá", "rận chim", "rận chó", "rận gà", "rận mu", "rận nước", "rập đầu", "râu dê", "râu má", "râu mèo", "râu quai nón", "rầu lòng", "rầu rĩ", "rầy nâu", "rầy vằn", "rẩy", "rẻ sườn", "rẽ mạch", "rèn giũa", "rèn nguội", "rèn nóng", "reng reng", "reo réo", "rét dài", "rét nàng bân", "rẹt", "rễ bành", "rễ bạnh", "rễ cột", "rễ giả", "rểnh rang", "rệp sáp", "rết đất", "rết tơ", "rêu cỏ", "rêu lông", "rêu nước", "rêu tản", "rêu vảy", "ri-vê", "rì rà rì rầm", "rí rỏm", "rìa xờm", "rỉa lông", "riềm", "rinh rích", "riu", "rìu chiến", "rõ nét", "roi rói", "róm", "rỏn", "rón", "rong đầm", "rong đuôi chó", "rong lá liễu", "rong li", "rong lươn", "rong mái chèo", "rong từ", "rong xương cá", "rô-nê-ô", "rộ việc", "rồi thì", "rối ra rối rít", "rôm rốp", "rồm rộp", "rốn bể", "rốn lại", "rông rổng", "rồng mây", "rộng ẩm", "rộng bụng", "rộng chân", "rộng muối", "rộng nhiệt", "rộng sọ", "rộng thùng", "rốp", "rốt cục", "rờ rẫm", "rờ rệt", "rờ rỡ", "rờ rợ", "rời rợi", "rơm rạ", "rờm mắt", "rờm rà", "rờm rợp", "rờm tai", "rờn", "rợn người", "rợt", "ru hời", "rủ lòng", "rủ ren", "rùa hôi", "rùa voi", "rúi rụi", "rung kế", "rung nghiệm", "rụng âm", "ruồi da", "ruồi gai", "ruồi giòi", "ruồi ngủ", "ruồi ong", "ruồi phân", "ruổi giong", "ruộng lúa", "ruột khoang", "ruột nghé", "ruột ngựa", "ruột tá", "rút gân.", "rút lại", "rút thăm", "rửa trôi", "rừng núi", "rửng mở", "rước dâu", "rước đèn", "rước sách", "rươm rướm", "rườm lời", "rượu chổi", "rượu lê", "rượu mơ", "sa giông", "sa khương", "sa mu", "sả rừng", "sá cày", "sách chỉ nam", "sai áp", "sai dịch", "sai hẹn", "sai nhầm", "sài cẩu", "sài đẹn", "sài giật", "sài kinh", "sải tay", "sãi chùa", "sãi vãi", "sàm sạm", "sạm nắng", "san hô tảng", "san nhuận", "sàn nhà", "sản dịch", "sản giật", "sản ông", "sán bò", "sán chó", "sán gai", "sán lợn", "sán lưỡi", "sán máng", "sán máu", "sang hèn", "sang hình", "sang sửa", "sang tai", "sảng sốt", "sáng giăng", "sáng lập viên", "sáng lóe", "sáng nhoáng", "sanh sánh", "sánh kịp", "sao hỏa", "sao kim", "sao mộc", "sao nên", "sao sao", "sao thế", "sao thổ", "sao thủy", "sao vàng", "sao vậy", "sào ngắm", "sáo mỏ nhà", "sáo mỏ vàng", "sạo sạo", "sáp ong", "sạp hàng", "sát cạnh", "sát nút", "say mềm", "say nắng", "say rượu", "say sóng", "say thuốc", "sắc điệu", "sắc giai", "sắc kế", "sắc kí", "sắc lạp", "sắc lẻm", "sắc lẹm", "sắc sai", "sắc tài", "sắc tướng", "sặc máu", "săm sắn", "săng lẻ", "sắng", "sắp ấn", "sắt điện", "sắt động", "sắt góc", "sắt huyết", "sắt móng", "sắt từ", "sặt sành", "sâm-banh", "sâm bố chính", "sâm lâm", "sầm sẫm", "sầm sì", "sấm kí", "sân bãi", "sân quần vợt", "sần sượng", "sâu bột", "sâu cắn gié", "sâu cuốn lá", "sâu đo", "sâu đục thân", "sâu gai", "sâu hỏm", "sâu keo", "sâu năn", "sâu nhậy", "sâu xám", "sâu yên chi", "sầu đông", "sầy vảy", "sẩy miếng", "se lạnh", "se sẻ", "sẻ đồng", "sẻ ngô", "sen biển", "sen cạn", "seo cờ", "seo gà", "sến cát", "sênh ca", "sếu vườn", "sĩ dân", "sỉa chân", "siêng sắn", "siết chặt", "siêu áp suất", "siêu bội", "siêu bù trừ", "siêu cơ thể", "siêu cường độ", "siêu cường quốc", "siêu đạo", "siêu đạo đức", "siêu độc quyền", "siêu hạ giới", "siêu phức", "siêu tâm lí", "siêu tâm lí học", "siêu thăng", "siêu thường", "siêu toán học", "siêu trọng tài", "siêu tuyệt", "siêu vi trùng", "sinh điện", "sinh hoá", "sinh hoá học", "sinh học vũ trụ", "sinh li", "sinh lí", "sinh lí học", "sinh mạng", "sinh sát", "sinh thì", "sinh thực khí", "sinh vật quần", "sinh vị", "sịt mũi", "siu", "so với", "sò bùn", "sò cát", "sò đá", "sò đốm", "sò huyết", "sò lông", "sò nứa", "sò tim", "sọ kế", "sọ khỉ", "sóc bay", "sóc chuột", "sóc len", "sóc vọng", "soi cá", "sỏi cát", "sõi đời", "sói biển", "son phèn", "són", "song biến", "song cầu khuẩn", "song hữu tỉ", "song nhân", "song tiếp", "song tiết", "song truyền", "song tuyến", "song tử dịệp", "song viên", "sõng", "sóng bạc đầu", "sóng cồn", "sóng đôi", "sóng gợn", "sóng hài", "sóng lừng", "sóng ngầm", "sóng soài", "sóng thần", "sóng tình", "sóoc", "sô-cô-la", "sô-vanh", "sổ đinh", "sổ gấu", "sổ hưu", "sổ nhau", "sổ rau", "số ảo", "số âm", "số chẵn", "số dương", "số độc đắc", "số lẻ", "số nghịch đảo", "số nguyên", "sôi bụng", "sôi ruột", "sồi rừng", "sông băng", "sông ngân", "sông sống", "sống đời", "sống đuôi", "sốp-phơ", "sốt cương sữa", "sốt hạch", "sốt hồi quy", "sốt kê", "sốt mòn", "sốt ngoại ban", "sốt nổi cơn", "sốt phát ban", "sốt rét cơn", "sốt rong kinh", "sốt sản", "sốt vàng", "sốt vỡ da", "sột sệt", "sơ chế.", "sơ đồ hóa", "sơ kì", "sơ lậu", "sơ yếu", "sờ sững", "sợi bên", "sợi canh", "sợi khổ", "sợi liên bào", "sợi xoắn", "sớm trưa", "sơn cẩu", "sơn lam chướng khí", "sơn lót", "sơn mạch", "sơn mai", "sơn nại", "sơn nguyên", "sơn sốc", "sơn thuỷ", "sơn tiêu", "sơn tuế", "sởn ốc", "su", "su-lơ", "su sê", "su-su", "sù", "sú vẹt", "sủa càn", "suất đội", "suất góp", "suất lĩnh", "súc họng", "súc miệng", "súc mục", "sục sôi", "sui gia", "sủi", "sum suê", "sùm soà", "sún răng", "sụn gối", "sụn lưng", "sụn mí", "sụn xơ", "sung quỹ", "sùng cổ", "sùng sũng", "sủng thần", "súng cao-su", "súng đại bác", "súng đại liên", "súng đạn", "súng hơi", "súng kíp", "súng liên thanh", "súng máy", "súng mút", "súng ống", "súng phun lửa", "súng sáu", "súng thần công", "súng tiểu liên", "súng trung liên", "súng tự động", "suôn sắn", "súp-de", "súp lơ", "sút cân", "sút giảm", "sút kém", "sụt thao", "suy lí", "súy", "súy phủ", "suỵt", "sư tổ", "sư tử biển", "sư vãi", "sử biên niên", "sử kí", "sử liệu", "sử quan", "sử quán", "sử quân tử", "sử thi", "sử xanh", "sứ bộ", "sứ mạng", "sứ quân", "sứ thần", "sự biến", "sự chủ", "sự đời", "sự lòng", "sự thật", "sự tình", "sự vụ", "sự vụ chủ nghĩa", "sưa", "sửa gáy", "sửa lưng", "sửa mình", "sửa sai", "sửa tội", "sữa bột", "sữa chua", "sữa chúa", "sữa đặc", "sữa đậu", "sữa kế", "sữa non", "sữa ong chúa", "sứa ống", "sứa sen", "sức bật", "sức bền", "sức cản", "sức căng", "sức chứa", "sức đẩy", "sức điện động", "sức hấp dẫn", "sức học", "sức hút", "sức ì", "sức kéo", "sức lao động", "sực", "sừn sựt", "sưng phổi", "sưng phù", "sưng sỉa", "sưng tấy", "sưng vù", "sừng hươu", "sừng sộ", "sừng sực", "sừng trâu", "sửng người", "sựng", "sưót mướt", "sườn cụt", "sườn treo", "sương gió", "sương mai", "sương phụ", "sướng bụng", "sướng mạ", "sướng miệng", "sướng mồm", "sướng rơn", "sướng tai", "sướng tay", "sượng sùng", "sướt da", "sượt", "sứt mẻ", "sứt sẹo", "sựt", "sưu", "sưu cầu", "sưu dịch", "sửu", "ta đây", "ta-lư", "ta-nin", "ta-tăng", "ta-tu", "tà đạo", "tà gian", "tà giáo", "tà hành", "tà huy", "tà tà", "tà vạy", "tà ý", "tả biên", "tả cảnh", "tả dực", "tả hữu", "tả tình", "tả tuyền", "tã lót", "tá gà", "tá lí", "tá sự", "tạ ân", "tạ bệnh", "tạ ơn", "tạ sự", "tạ tình", "tạ tội", "tạ từ", "tác", "tác chiến", "tác gia", "tác họa", "tác hợp", "tác nghiệp", "tác oai", "tác vi", "tách âm", "tách biệt", "tách lắng", "tách rời", "tai bèo", "tai chuột", "tai-ga", "tai hoạ", "tai hồng", "tai hùm", "tai mắt", "tai mèo", "tai mũi họng", "tai nàn", "tai nghe", "tai ngược", "tai tái", "tai tượng", "tai vạ", "tai voi", "tài ba", "tài bàn", "tài binh", "tài bộ", "tài bồi", "tài danh", "tài hóa", "tài lợi", "tài lược", "tài phán", "tài phú", "tài trai", "tài trợ", "tải ba", "tải điện", "tải thương", "tải trọng", "tái đăng", "tái giảng", "tái hiện", "tái hôn", "tái kiến", "tái lai", "tái lại", "tái lập", "tái mặt", "tái mét", "tái ngắt", "tái ngộ", "tái nhiễm", "tái quân sự hóa", "tái tê", "tái thẩm", "tái thiết", "tái võ trang", "tái vũ trang", "tái xanh", "tại ngoại", "tại nhà", "tại trận", "tại vị", "tam bành", "tam bảo", "tam bội", "tam cá nguyệt", "tam công", "tam cúc", "tam cương", "tam dân", "tam diện", "tam đa", "tam giác châu", "tam giác đạc", "tam giác nguyên", "tam giáp", "tam giới", "tam hình", "tam hợp", "tam hùng", "tam huyền", "tam khôi", "tam liên", "tam nguyên", "tam nhị", "tam sự", "tam tài", "tam tam chế", "tam tạng", "tam thế", "tam thừa", "tăm dạng", "tăm tắp", "tăm tiếng", "tăm tối", "tằm bủng", "tằm gai", "tằm nghệ", "tằm tang", "tằm tơ", "tằm vôi", "tắm gội", "tắm hơi", "tắm táp", "tẳn mẳn", "tăng bội", "tăng chúng", "tăng gia", "tăng già", "tăng giảm", "tăng hoạt", "tăng lực", "tăng nhạy", "tăng phòng", "tăng sản", "tăng sinh", "tăng sức", "tăng thu", "tăng tiến", "tăng tiết", "tăng tốc", "tăng trọng", "tăng trưởng", "tằng", "tằng huyền tôn", "tặng cách", "tặng vật", "tắp", "tắt dần", "tắt dục", "tắt mắt", "tắt ngấm", "tắt nghỉ", "tắt nghỉn", "tắt ngóm", "tấc gang", "tấc son", "tấc thành", "tấc vàng", "tâm bệnh", "tâm bì", "tâm đẩy", "tâm điểm", "tâm đồ", "tâm huyết", "tâm khảm", "tâm kí", "tâm lí", "tâm lí chủ nghĩa", "tâm lí học", "tâm lực", "tâm ngẩm", "tâm nghiêng", "tâm ngoài", "tâm niệm", "tâm phục", "tâm sai", "tâm sen", "tâm sinh lí", "tâm sức", "tâm thần học", "tâm thể", "tâm thu", "tâm tri", "tâm truyền", "tâm trương", "tâm vị", "tầm âm", "tầm bậy tầm bạ", "tầm bóp", "tầm cỡ", "tầm ma", "tầm mắt", "tầm nhìn", "tầm nhìn xa", "tầm phèo", "tầm phơ", "tầm quất", "tầm sét", "tầm tay", "tầm tầm", "tầm thước", "tầm thường hoá", "tẩm ngẩm", "tấm chắn", "tấm đúc", "tấm ga", "tấm gương", "tấm lòng", "tấm phản", "tấm riêng", "tấm son", "tấm tắc", "tấm tức", "tân", "tân bằng", "tân chủ", "tân dân chủ", "tân dược", "tân đại lục", "tân giai nhân", "tân giáo", "tân học", "tân khoa", "tân khổ", "tân kì", "tân lịch", "tân lục địa", "tân nhân", "tân sinh", "tân tạo", "tân thế giới", "tân toan", "tân trang", "tân ước", "tân văn", "tần", "tần bì", "tần mần", "tần phiền", "tần số kế", "tần suất", "tần tiện", "tẩn", "tấn sĩ", "tấn tới", "tận hiếu", "tận mắt", "tận số", "tận tay", "tận thiện", "tận thu", "tận trung", "tận từ", "tâng", "tâng công", "tâng hẩng", "tâng tâng", "tầng hầm", "tầng nền", "tầng tích", "tầng trãi", "tấp", "tấp tểnh", "tấp tửng", "tập ấm", "tập con", "tập công", "tập duyệt", "tập dượt", "tập đọc", "tập nhiễm", "tập quán pháp", "tập quần", "tập quyền", "tập tàng", "tập tễnh", "tập thể hóa", "tập tính", "tập tính học", "tập tọng", "tập trận", "tập tước", "tất bật", "tất dài", "tất định", "tất giao", "tất là", "tất lực", "tất ngắn", "tất nhỡ", "tất niên", "tất phải", "tất ta tất tưởi", "tất tay", "tất tật", "tất thảy", "tất thắng", "tất toán", "tất trong", "tất tưởi", "tật nguyền", "tật xấu", "tâu", "tâu bày", "tẩu cẩu", "tấu nhạc", "tây bán cầu", "tây dương", "tây lịch", "tây ngưu", "tây phương hóa", "tây riêng", "tây thiên", "tây vị", "tây y", "tầy", "tẩy oan", "tẩy trần", "tẩy uế", "te tái", "te te", "tè he", "tè tè", "tẻ ngắt", "tẻ nhạt", "té re", "té tát", "téc-gan", "tèm hem", "tèm lem", "tèm nhèm", "ten đồng", "ten-nít", "tèn tẹt", "tẽn", "tẽn tò", "teo cơ", "teo da", "tẻo", "tẻo teo", "tẻo tèo teo", "tép riu", "tẹp nhẹp", "tẹt mũi", "tê dại", "tê-lê-típ", "tê-lếch", "tê liệt", "tê ngưu", "tê phù", "tê tái", "tê tề", "tề", "tề chỉnh", "tề gia", "tề ngụy", "tể tướng", "tế bào học", "tế bần", "tế cờ", "tế điền", "tế lễ", "tế nhuyễn", "tế phục", "tế toái", "tế tử", "tế tự", "tế tửu", "tế vi", "tệ lậu", "tệ nạn", "têm trầu", "tên bịp", "tên chữ", "tên cúng cơm", "tên đạn", "tên gian", "tên hèm", "tên họ", "tên huý", "tên lửa đất đối đất", "tên lửa không đối đất", "tên riêng", "tên sách", "tên thật", "tên thuỵ", "tên tuổi", "tên tự", "tênh hênh", "tênh tênh", "tềnh toàng", "tệp", "têt", "tết nhất", "tếu táo", "tha bổng", "tha chết", "tha giác", "tha hình", "tha hoá", "tha hương", "tha lỗi", "tha phương", "tha sinh", "tha thẩn", "tha thiết", "tha thướt", "tha tội", "thà rằng", "thả bè", "thả giọng", "thả mồi", "thả nổi", "thả sức", "thá", "thác loạn", "thác sinh", "thách cưới", "thách đố", "thạch ấn", "thạch học", "thạch quyển", "thạch thán", "thạch thảo", "thạch tín", "thạch xương bồ", "thai bàn", "thai dựng", "thai nhi", "thai phụ", "thai sản", "thai sinh", "thài lài", "thải bỏ", "thải loại", "thải nhiệt", "thái âm", "thái ất", "thái bảo", "thái cổ", "thái công", "thái cực quyền", "thái dương hệ", "thái hoà", "thái học sinh", "thái hư", "thái không", "thái lai", "thái miếu", "thái phó", "thái sư", "thái tây", "thái thú", "thái tổ", "thái uý", "tham bác", "tham bạo", "tham biến", "tham biện", "tham chiếu", "tham dự", "tham lam", "tham mưu trưởng", "tham nghị", "tham ô", "tham sắc", "tham số", "tham tá", "tham tán", "tham tri", "tham tụng", "tham vấn", "thàm", "thàm làm", "thảm bại", "thảm đạm", "thảm hoạ", "thảm kịch", "thảm não", "thảm sầu", "thảm thê", "thảm trạng", "thám báo", "thám hoa", "thám không", "thám sát", "than bánh", "than béo", "than bụi", "than cốc", "than đá", "than đỏ", "than gầy", "than hóa", "than khóc", "than mỏ", "than mỡ", "than nắm", "than nâu", "than quả bàng", "than sàng", "than thở", "than tổ ong", "than trắng", "than van", "than vãn", "than vàng", "than xanh", "than xương", "thán khí", "thán ngữ", "thán thư", "thang âm", "thang gác", "thang mây", "thảng thốt", "tháng ba", "tháng bảy", "tháng chạp", "tháng chín", "tháng giêng", "tháng hai", "tháng mười", "tháng mười hai", "tháng mười một", "tháng năm", "tháng sáu", "tháng tám", "tháng tư", "thanh âm", "thanh bần", "thanh cao", "thanh cỡ", "thanh dịch", "thanh điệu", "thanh đới", "thanh giản", "thanh giằng", "thanh hao", "thanh hóa", "thanh khí", "thanh khiết", "thanh lâu", "thanh lí", "thanh lọc", "thanh lương", "thanh lương trà", "thanh mạc", "thanh mai", "thanh manh", "thanh mảnh", "thanh mẫu", "thanh môn", "thanh nhã", "thanh nhạc", "thanh niên", "thanh phong", "thanh quản học", "thanh quản kí", "thanh quang", "thanh răng", "thanh sắc", "thanh sơn", "thanh sử", "thanh táo", "thanh tân", "thanh thải", "thanh thanh", "thanh thảnh", "thanh thất", "thanh thế", "thanh thỏa", "thanh thuỷ", "thanh tĩnh", "thanh trà", "thanh truyền", "thanh trừ", "thanh trượt", "thanh tú", "thanh vận", "thanh xuân", "thanh y", "thanh yên", "thành án", "thành bại", "thành bộ", "thành chung", "thành đinh", "thành đoàn", "thành đô", "thành đồng", "thành gia", "thành hoàng", "thành hội", "thành khẩn", "thành khí", "thành lập", "thành lệ", "thành luỹ", "thành nhân", "thành nội", "thành phục", "thành quách", "thành quốc", "thành ra", "thành sẹo", "thành tạo", "thành tật", "thành thật", "thành thục", "thành thực", "thành thương", "thành tín", "thành tố", "thành trì", "thành trùng", "thành uỷ", "thành uỷ viên", "thánh chúa", "thánh đế", "thánh hiền", "thánh hóa", "thánh kinh", "thánh lễ", "thánh mẫu", "thánh miếu", "thánh sống", "thánh thần", "thánh thất", "thánh thể", "thánh thót", "thánh thư", "thánh tích", "thánh tướng", "thánh vương", "thao thao", "thao thức", "thào", "thào thợt", "thảo am", "thảo cầm viên", "thảo dã", "thảo đường", "thảo hèn", "thảo lư", "thảo nào", "thảo phạt", "thảo quả", "thảo quyết minh", "thảo trùng", "thảo xá", "tháo băng", "tháo chạy", "tháo chốt", "tháo dỡ", "tháo đạn", "tháo gỡ", "tháo khoán", "tháo lời", "tháo rời", "tháo thân", "tháo tỏng", "thạo đời", "thạo tin", "tháp bút", "tháp chóp", "tháp chuông", "tháp khoan", "tháp nước", "tháp tùng", "thau chua", "thau tháu", "tháu cáy", "thay áo", "thay lảy", "thay lòng", "thay lông", "thay lời", "thay thế", "thày lay", "thảy thảy", "tháy máy", "thăm bệnh", "thăm hỏi", "thăm nom", "thăm thẳm", "thắm thiết", "thắm tươi", "thăn", "thăn chuột", "thằn lằn bay", "thăng chức", "thăng đồng", "thăng đường", "thăng giáng", "thăng hà", "thăng thưởng", "thăng trật", "thằng", "thằng bé", "thằng chài", "thằng nhỏ", "thằng thúc", "thẳng băng", "thẳng cẳng", "thẳng đuột", "thẳng hàng", "thẳng tắp", "thẳng tính", "thẳng tuột", "thắng bại", "thắng bộ", "thắng cuộc", "thắng địa", "thắng phụ", "thắng tích", "thặng", "thặng vốn", "thắp bút", "thắp sáng", "thắt buộc", "thắt ngặt", "thắt nút", "thâm canh", "thâm dạ", "thâm hụt", "thâm khuê", "thâm mưa thâm", "thâm nghiêm", "thâm nhiễm", "thâm nho", "thâm quầng", "thâm sì", "thâm sinh", "thâm tạ", "thâm thẫm", "thâm thấp", "thâm thù", "thâm thủng", "thâm thúy", "thâm tím", "thâm u", "thâm uyên", "thâm xịt", "thầm kín", "thầm thì", "thầm vụng", "thẩm cứu", "thẩm đoán", "thẩm lậu", "thẩm mĩ", "thẩm mĩ học", "thẩm phán quan", "thẩm sát", "thẩm thấu", "thẩm tích", "thẩm tra", "thẩm xét", "thấm đòn", "thấm tháp", "thấm thoắt", "thậm", "thậm cấp", "thậm tệ", "thậm thà thậm thụt", "thậm thịch", "thậm thọt", "thậm thụt", "thân bằng", "thân binh", "thân chinh", "thân chính", "thân chủ", "thân cột", "thân dân", "thân gia", "thân già", "thân giáp", "thân hào", "thân mầm", "thân mẫu", "thân mềm", "thân mình", "thân ngoại", "thân nhân", "thân nhiệt", "thân oan", "thân phụ", "thân quen", "thân quyến", "thân răng", "thân rễ", "thân sĩ", "thân sinh", "thân sơ", "thân thích", "thân thương", "thân tín", "thân tình", "thân tộc", "thân từ", "thân vương", "thân xương", "thân yêu", "thần chết", "thần chủ", "thần công", "thần dân", "thần dược", "thần đạo", "thần giao cách cảm", "thần hạ", "thần hệ", "thần hiệu", "thần hôn", "thần khải", "thần khẩu", "thần khí", "thần kì", "thần kinh hệ", "thần kinh học", "thần lí", "thần linh học", "thần luận", "thần minh", "thần mộng", "thần ngôn", "thần nhân", "thần nông", "thần phật", "thần phụ", "thần sa", "thần thế", "thần thoại học", "thần thuật", "thần tích", "thần tiên", "thần trí", "thần tử", "thần xác", "thẩn thờ", "thận học", "thấp bé", "thấp kém", "thấp kế", "thấp khớp", "thấp lè tè", "thấp mưu", "thấp tho", "thấp thỏm", "thập can", "thập diện", "thập đạo", "thập điều", "thập kỉ", "thập lục", "thập ngoặc", "thập nhị chi", "thập nhị phân", "thập thành", "thập thò", "thập trưởng", "thập tự chinh", "thập tự quân", "thất", "thất bảo", "thất cơ", "thất cử", "thất đảm", "thất gia", "thất hòa", "thất hứa", "thất khiếu", "thất lộc", "thất luật", "thất ngôn", "thất niêm", "thất phẩm", "thất tán", "thất tha thất thểu", "thất thanh", "thất thần", "thất thểu", "thất thiệt", "thất thu", "thất tịch", "thất tinh", "thất toán", "thất trinh", "thất tuần", "thất tung", "thất xuất", "thật bụng", "thật là", "thật lòng", "thật lực", "thật ra", "thật sự", "thật tâm", "thật tình", "thâu", "thâu thái", "thâu tóm", "thầu lại", "thẩu", "thấu đạt", "thấu hiểu", "thấu lí", "thấu nhiệt", "thấu niệm", "thấu quang", "thấu suốt", "thấu tình", "thấu triệt", "thây kệ", "thây lẩy", "thầy bà", "thầy cả", "thầy cãi", "thầy cò", "thầy cô", "thầy cúng", "thầy địa", "thầy đồ", "thầy giùi", "thầy học", "thầy kí", "thầy kiện", "thầy lang", "thầy mằn", "thầy mẹ", "thầy mo", "thầy quyền", "thầy số", "thầy tào", "thầy thông", "thầy thợ", "thầy tớ", "thầy trò", "thầy trợ", "thấy bà", "thấy kinh", "thấy mồ", "thấy tháng", "thấy tội", "the the", "thẻ ngà", "thẽ thọt", "thé", "thèm nhạt", "thèm thèm", "thèm thuồng", "thèm vào", "thèn thẹn", "thẹn lòng", "thẹn thẹn", "thẹn thò", "theo đòi", "theo đuôi", "theo gót", "theo kịp", "theo như", "theo rõi", "theo thời", "theo trai", "thẻo", "thép cán", "thép hình", "thét lác", "thét mắng", "thê nhi", "thê noa", "thê thiếp", "thê thiết", "thê tử", "thề bội", "thề độc", "thề thốt", "thể chế hoá", "thể dịch", "thể dục học", "thể địa", "thể đôi", "thể hạt", "thể hệ", "thể kết", "thể khảm", "thể loại", "thể nào", "thể nấm", "thể nền", "thể nhân", "thể nhiễm sắc", "thể nữ", "thể phách", "thể sợi", "thể tài", "thể tạng", "thể tấm", "thể thức", "thể tích kế", "thể tình", "thể trạng", "thể trọng", "thể từ", "thể từ hóa", "thể tường", "thể xác", "thế bạ", "thế chân", "thế chấp", "thế chiến", "thế chứ", "thế cố", "thế công", "thế cuộc", "thế đại", "thế đạo", "thế đồ", "thế gia", "thế giao", "thế giới hóa", "thế giới ngữ", "thế hiệu", "thế huynh", "thế kỉ", "thế là", "thế lộ", "thế mà", "thế mạng", "thế mạnh", "thế năng", "thế nghị", "thế nghiệp", "thế nhân", "thế nhưng", "thế phát", "thế phiệt", "thế rồi", "thế tập", "thế tất", "thế thần", "thế thủ", "thế thường", "thế tình", "thế tổ", "thế tôn", "thế tục hóa", "thế tử", "thế và", "thế vận", "thế vị", "thệ sư", "thệ thủy", "thếch", "thêm thắt", "thềm lục địa", "thềm nghỉ", "thênh thênh", "thếp vàng", "thết đãi", "thết tiệc", "thêu dệt", "thêu ren", "thi ân", "thi bá", "thi ca", "thi cảm", "thi cử học", "thi đàn", "thi đấu", "thi đình", "thi đồng", "thi gan", "thi gia", "thi giới", "thi hài", "thi hoạ", "thi hội", "thi hương", "thi khách", "thi khúc", "thi lễ", "thi nhau", "thi phái", "thi phẩm", "thi phú", "thi tài", "thi tập", "thi thánh", "thi thoại", "thi thư", "thi thử", "thi tuyển", "thi tửu", "thi văn", "thi vị hóa", "thi xã", "thì chớ", "thì là", "thì ra", "thì thà", "thì thà thì thụt", "thì thùng", "thì thụp", "thì thụt", "thì trân", "thí chủ", "thí phát", "thí quân", "thí sai", "thí thân", "thị dục", "thị điều", "thị độ", "thị độc", "thị đồng", "thị giá", "thị giảng", "thị hùng", "thị kính", "thị lang", "thị mẹt", "thị nữ", "thị oai", "thị phi", "thị sai", "thị sát", "thị tần", "thị thành", "thị thần", "thị thế", "thị tì", "thị trường hóa", "thị uy", "thị uỷ", "thị vệ", "thị yến", "thia", "thia lia", "thìa khóa", "thìa là", "thìa lìa", "thích chí", "thích dụng", "thích giáo", "thích nghĩa", "thích thời", "thích thuộc", "thịch", "thịch thịch", "thiêm thiếp", "thiềm", "thiềm cung", "thiềm thừ", "thiểm độc", "thiểm thiểm độc", "thiên bẩm", "thiên binh", "thiên cảm", "thiên cầm", "thiên cầu", "thiên chất", "thiên chức", "thiên cơ", "thiên cung", "thiên cư", "thiên cực", "thiên di", "thiên đàn", "thiên đàng", "thiên đạo", "thiên đầu thống", "thiên để", "thiên địa", "thiên đình", "thiên giới", "thiên hà", "thiên hoàng", "thiên hương", "thiên hữu", "thiên hựu", "thiên khai", "thiên khải", "thiên khuất", "thiên kỉ", "thiên kim", "thiên la", "thiên lệch", "thiên lí", "thiên lí mã", "thiên môn đông", "thiên nhan", "thiên nhãn", "thiên niên", "thiên niên kỉ", "thiên phủ", "thiên phú", "thiên tả", "thiên tào", "thiên tây", "thiên thạch", "thiên thai", "thiên thẹo", "thiên thu", "thiên thư", "thiên thực", "thiên tiên", "thiên tinh", "thiên tôn", "thiên triều", "thiên triệu", "thiên trụy", "thiên tư", "thiên tướng", "thiên tượng học", "thiên uy", "thiên văn", "thiên vương tinh", "thiên xạ", "thiền định", "thiền đường", "thiền học", "thiền sư", "thiền tăng", "thiền tông", "thiền trai", "thiền trượng", "thiển cận", "thiển kiến", "thiển lậu", "thiển nghĩ", "thiện ác", "thiện căn", "thiện chính", "thiện nam tín nữ", "thiện ngôn", "thiện nhân", "thiện tiện", "thiêng", "thiếp danh", "thiếp phục", "thiệp liệp", "thiệp thế", "thiết bị", "thiết chế", "thiết cốt", "thiết diện", "thiết dụng", "thiết đãi", "thiết đoàn", "thiết đồ", "thiết giáp hạm", "thiết kị", "thiết lộ", "thiết nghĩ", "thiết quân luật", "thiết thạch", "thiết tưởng", "thiệt chiến", "thiệt hơn", "thiệt thà", "thiệt thân", "thiệt thòi", "thiêu đốt", "thiêu hóa", "thiêu sinh", "thiêu thiếu", "thiêu xác", "thiểu đức", "thiểu lực", "thiểu năng", "thiểu nhiệt", "thiếu dinh dưỡng", "thiếu điều", "thiếu gì", "thiếu mặt", "thiếu niên", "thiếu nữ", "thiếu quân", "thiếu thốn", "thiếu thời", "thin thít", "thìn", "thinh không", "thinh thích", "thình thịch", "thình thình", "thỉnh an", "thỉnh kinh", "thỉnh mệnh", "thính lực", "thính lực đồ", "thính lực kế", "thính mũi", "thính phòng", "thính tai", "thịnh danh", "thịnh suy", "thịnh thời", "thịnh ý", "thít", "thịt ba chỉ", "thịt băm", "thịt hầm", "thịt kho", "thịt luộc", "thịt lưng", "thịt mông", "thịt nạc", "thịt nướng", "thịt quay", "thiu người", "thiu thiu", "thiu thỉu", "thìu", "thỉu", "tho", "thỏ đế", "thỏ rừng", "thó", "thọ chung", "thọ đường", "thọ mệnh", "thòa", "thoả nguyện", "thoả thuê", "thoải", "thoái", "thoái biến", "thoái binh", "thoái bộ", "thoái chí", "thoái hoá", "thoái lui", "thoái ngũ", "thoái nhiệt", "thoái thu", "thoái thủ", "thoái trào", "thoái triển", "thoái vị", "thoại kịch", "thoàn", "thoán đoạt", "thoán nghịch", "thoán vị", "thoang thoảng", "thoang thoáng", "thoảng qua", "thoáng", "thoáng đãng", "thoáng gió", "thoáng khí", "thoáng thấy", "thoát", "thoát giang", "thoát hiểm", "thoát hơi nước", "thoát khỏi", "thoát li", "thoát lũ", "thoát nạn", "thoát thai", "thoát tội", "thoát trần", "thoát tục", "thoát vị", "thoát xác", "thoát y", "thoạt", "thoạt đầu", "thoạt kì thuỷ", "thoắng", "thoắt", "thóc", "thóc chim", "thóc lép", "thóc lúa", "thóc mách", "thọc léc", "thọc lét", "thoi loi", "thoi thóp", "thoi thót", "thòi", "thòi lòi", "thòi tiền", "thói đời", "thói hư", "thói phép", "thói thường", "thom lỏm", "thom thóp", "thòm", "thòm thèm", "thòm thòm", "thỏm", "thon lỏn", "thon thả", "thon thon", "thon thót", "thong manh", "thong thả", "thòng lọng", "thõng", "thõng thẹo", "thõng thượt", "thóp", "thót", "thô bạo", "thô bố", "thô chế", "thô kệch", "thô kịch", "thô lậu", "thô lỗ", "thô lố", "thô thiển", "thồ", "thổ âm", "thổ canh", "thổ cẩm", "thổ công", "thổ cư", "thổ địa", "thổ hào", "thổ hoàng liên", "thổ huyết", "thổ mộ", "thổ mộc", "thổ mộc hương", "thổ nghi", "thổ ngơi", "thổ ngữ", "thổ nhưỡng học", "thổ phục linh", "thổ quan", "thổ sản", "thổ tả", "thổ thần", "thổ ti", "thổ trạch", "thổ trước", "thổ tù", "thố", "thố hoại", "thố tha", "thốc", "thốc tháo", "thộc", "thôi sơn", "thôi thì", "thôi thôi", "thôi thối", "thôi tra", "thồi", "thổi mòn", "thổi nấu", "thổi ngạt", "thối chí", "thối hoắc", "thối hoăng", "thối mồm", "thối rễ", "thối ruỗng", "thối rữa", "thối tai", "thối thác", "thối thây", "thồm lồm", "thôn ấp", "thôn dân", "thôn ổ", "thôn trang", "thôn xã", "thôn xóm", "thồn thộn", "thổn thện", "thốn", "thộn", "thông bá hương", "thông bạch", "thông báo hạm", "thông bệnh", "thông biển", "thông công", "thông dâm", "thông dịch", "thông đạt", "thông đất", "thông đỏ", "thông đường", "thông gia", "thông giám", "thông gian", "thông gió", "thông hành", "thông hiểu", "thông hiệu", "thông hơi", "thông khí", "thông lệnh", "thông linh", "thông lò", "thông manh", "thông mưu", "thông nghĩa", "thông ngôn", "thông nho", "thông phán", "thông phong", "thông suốt", "thông sử", "thông sự", "thông sức", "thông tầm", "thông tấn", "thông thái", "thông thênh", "thông thiên", "thông thốc", "thông thống", "thông thuộc", "thông thuơng", "thông thư", "thông tin học", "thông tín viên", "thông tỏ", "thông tri", "thống", "thống giác kế", "thống kê", "thống kê học", "thống lãnh", "thống lí", "thống mạ", "thống nhứt", "thống phong", "thống soái", "thống suất", "thống sứ", "thống thiết", "thống tướng", "thộp ngực", "thốt nhiên", "thơ ca", "thơ lại", "thơ mộng", "thơ mới", "thơ ngây", "thơ phú", "thơ rơi", "thơ thẩn", "thơ thớt", "thơ trẻ", "thơ văn", "thờ cúng", "thờ lửa", "thờ phụng", "thờ thẫn", "thờ tự", "thở dốc", "thở hắt ra", "thở phào", "thở ra", "thở than", "thở vào", "thớ lợ", "thớ xoắn", "thợ bạn", "thợ cả", "thợ cán", "thợ cày", "thợ chạm", "thợ dệt", "thợ doa", "thợ đấu", "thợ gặt", "thợ giày", "thợ giặt", "thợ gốm", "thợ hồ", "thợ in", "thợ kèn", "thợ khắc", "thợ khóa", "thợ kim hoàn", "thợ mã", "thợ mỏ", "thợ nề", "thợ ngoã", "thợ ngôi", "thợ nguội", "thợ nhuộm", "thợ phay", "thợ rào", "thợ sàng", "thợ sắp chữ", "thợ thêu", "thợ thơ", "thợ thủ công", "thợ thuyền", "thợ tiện", "thợ trời", "thợ vẽ", "thợ xẻ", "thơi", "thời", "thời bệnh", "thời biểu", "thời buổi", "thời chiến", "thời cục", "thời cuộc", "thời đàm", "thời điểm", "thời giá", "thời gian biểu", "thời giờ", "thời hạn", "thời hiệu", "thời kế", "thời khắc", "thời khắc biểu", "thời khí", "thời kì", "thời luận", "thời nay", "thời nghi", "thời nhân", "thời sự hóa", "thời thế", "thời thượng", "thời trân", "thời trị", "thời vận", "thời vị", "thời xưa", "thơm hắc", "thơm lây", "thơm lừng", "thơm lựng", "thơm ngát", "thơm nực", "thơm nứt", "thơm phức", "thơm sực", "thơm thảo", "thơn thớt", "thờn bơn", "thớt", "thu ba", "thu binh", "thu chi", "thu dung", "thu dụng", "thu giấu", "thu gọn", "thu góp", "thu hải đường", "thu hái", "thu hẹp", "thu hình", "thu hóa", "thu không", "thu liễm", "thu lôi", "thu lu", "thu mình", "thu mua", "thu nạp", "thu năng", "thu ngân viên", "thu nhặt", "thu nhận", "thu nhiệt", "thu nhỏ", "thu phát", "thu phân", "thu phong", "thu phục", "thu quân", "thu sơ", "thu teo", "thu thập", "thu thú", "thu thuỷ", "thu tóm", "thu tô", "thu va thu vén", "thu vén", "thù", "thù ân", "thù du", "thù đáp", "thù đủ", "thù ghét", "thù hằn", "thù hiềm", "thù hình", "thù lù", "thù máu", "thù nghịch", "thù tạc", "thù tiếp", "thù ứng", "thù vặt", "thủ", "thủ bạ", "thủ bản", "thủ cấp", "thủ chỉ", "thủ công nghệ", "thủ công nghiệp", "thủ cựu", "thủ dâm", "thủ đắc", "thủ đoạn", "thủ giữ", "thủ hạ", "thủ hiểm", "thủ hiến", "thủ hoa", "thủ lãnh", "thủ môn", "thủ mưu", "thủ pháo", "thủ pháp", "thủ phận", "thủ phủ", "thủ thành", "thủ thân", "thủ thế", "thủ thỉ", "thủ thuật viên", "thủ thường", "thủ tiết", "thủ tín", "thủ túc", "thủ từ", "thủ tự", "thủ tướng phủ", "thủ vai", "thủ vĩ ngâm", "thủ xảo", "thủ xướng", "thú dữ", "thú phục", "thú quê", "thú săn", "thú thật", "thú thực", "thú tính", "thú tội", "thú vật", "thú y", "thú y sĩ", "thụ ân", "thụ bệnh", "thụ bì", "thụ cảm", "thụ chức", "thụ giáo", "thụ giới", "thụ hình", "thụ lí", "thụ mệnh", "thụ mộc học", "thụ tang", "thụ trai", "thua bạc", "thua cháy", "thua kém", "thua kiện", "thua lỗ", "thua trận", "thua trụi", "thùa", "thùa sợi", "thủa", "thuần chất", "thuần chủng", "thuần dưỡng", "thuần hậu", "thuần hoá", "thuần lí", "thuần loại", "thuần phác", "thuần phong", "thuần tính", "thuần trở", "thuần tuý", "thuẫn", "thuận cảnh", "thuận gió", "thuận hoà", "thuận hướng", "thuận lợi", "thuận nghịch", "thuận tai", "thuận tay", "thuận tình", "thuận từ", "thuật sĩ", "thuật số", "thuật toán", "thúc", "thúc bá", "thúc đẩy", "thúc giục", "thúc mẫu", "thúc nợ", "thúc phụ", "thục", "thục địa", "thục hồi", "thục luyện", "thục mạng", "thục nữ", "thục quỳ", "thục tội", "thuê bao", "thuê mướn", "thuể thỏa", "thuế biểu", "thuế chợ", "thuế đinh", "thuế gián thu", "thuế khóa", "thuế má", "thuế môn bài", "thuế muối", "thuế quan", "thuế sát sinh", "thuế suất", "thuế trực thu", "thuế vụ", "thui", "thui lủi", "thùi lủi", "thúi", "thum", "thum thủm", "thùm thụp", "thun lủn", "thun thút", "thung", "thung dung", "thung đường", "thung huyên", "thung thăng", "thung thổ", "thùng đấu", "thùng ong", "thùng phân", "thùng quay mật", "thùng rác", "thùng thình", "thùng thùng", "thùng tưới", "thùng xe", "thủng lưới", "thủng thẳng", "thủng thỉnh", "thũng", "thúng thắng", "thụng", "thụng thịu", "thuốc bỏng", "thuốc bột", "thuốc chén", "thuốc cốm", "thuốc dấu", "thuốc đạn", "thuốc đắp", "thuốc đỏ", "thuốc giun", "thuốc hảm", "thuốc hoàn", "thuốc lá sợi", "thuốc men", "thuốc mỡ", "thuốc nhỏ mắt", "thuốc nhuận tràng", "thuốc nổ", "thuốc nôn", "thuốc nước", "thuốc pháo", "thuốc rịt", "thuốc sán", "thuốc sắc", "thuốc súng", "thuốc tễ", "thuốc thang", "thuốc thử", "thuốc tiêm", "thuốc tiên", "thuốc tím", "thuốc trường sinh", "thuốc viên", "thuốc xỉa", "thuốc xoa", "thuốc xổ", "thuộc cách", "thuộc hạ", "thuộc lại", "thuộc làu", "thuộc lòng", "thuộc ngữ", "thuộc quốc", "thuộc viên", "thuôn", "thuôn thuôn", "thuồn", "thuồn thuỗn", "thuỗn", "thuốn", "thuồng luồng", "thuở nay", "thuở xưa", "thụp", "thút", "thút nút", "thụt giữ", "thụt két", "thụt lui", "thụt nhuận tràng", "thụt tẩy", "thụt tháo", "thuỳ", "thuỳ dương", "thuỳ liễu", "thuỳ mị", "thuỳ túc", "thuỷ", "thuỷ binh", "thuỷ binh lục chiến", "thuỷ tinh", "thụy du", "thụy hương", "thụy miên liệu pháp", "thuyên", "thuyên giảm", "thuyền ba ván", "thuyền bè", "thuyền bồng", "thuyền buồm", "thuyền chủ", "thuyền đạp", "thuyền đinh", "thuyền độc mộc", "thuyền mành", "thuyền máy", "thuyền nan", "thuyền phó", "thuyền quyên", "thuyền rồng", "thuyền tam bản", "thuyền tán", "thuyền thoi", "thuyền tình", "thuyền viên", "thuyết khách", "thuyết lí", "thuyết minh", "thuyết pháp", "thuyết trình viên", "thư án", "thư bảo đảm", "thư chuyển tiền", "thư cục", "thư duỗi", "thư điểm", "thư đồng", "thư đường", "thư giãn", "thư hiên", "thư hoàng", "thư hùng", "thư hương", "thư khế", "thư kí", "thư lâu", "thư lưu", "thư mục", "thư mục học", "thư ngỏ", "thư nhàn", "thư pháp", "thư phù", "thư quán", "thư song", "thư sướng", "thư tay", "thư thư", "thư tịch", "thư tịch học", "thư trai", "thư viện học", "thư xã", "thừ", "thử hỏi", "thử lòng", "thử lửa", "thử nghiệm", "thử sức", "thứ ba", "thứ bảy", "thứ cấp", "thứ dân", "thứ đẳng", "thứ đệ", "thứ đến", "thứ hai", "thứ hạng", "thứ hầu", "thứ lỗi", "thứ mẫu", "thứ nam", "thứ năm", "thứ nguyên", "thứ tư", "thứ tử", "thứ vị", "thự thạch", "thưa bẩm", "thưa chuyện", "thưa gửi", "thưa thốt", "thưa trình", "thừa ân", "thừa cơ", "thừa dịp", "thừa lệnh", "thừa lương", "thừa mệnh", "thừa mứa", "thừa phái", "thừa phát lại", "thừa quản", "thừa sức", "thừa tập", "thừa thắng", "thừa thế", "thừa tiếp", "thừa trừ", "thừa từ", "thừa tự", "thừa tướng", "thừa ưa", "thửa", "thức ăn", "thức giả", "thức giấc", "thức nhắc", "thức thời", "thức thức", "thức uống", "thực bào", "thực bì", "thực bụng", "thực chi", "thực chứng", "thực dân địa", "thực dân mới", "thực dụng chủ nghĩa", "thực địa", "thực định", "thực hình", "thực học", "thực hư", "thực khách", "thực là", "thực lòng", "thực lợi", "thực lục", "thực lực", "thực nghiệp", "thực phẩm", "thực quản", "thực tài", "thực tại hóa", "thực tay", "thực tâm", "thực tập sinh", "thực thà", "thực thi", "thực thu", "thực thụ", "thực tiễn", "thực tình", "thực vật", "thực vật chí", "thưng", "thừng chão", "thừng mực", "thừng tinh", "thước cặp", "thước cuốn", "thước dẹt", "thước gấp", "thước khối", "thước mộc", "thước nách", "thước sắp chữ", "thước ta", "thước tây", "thước thợ", "thước tỉ lệ", "thước tính", "thước vuông", "thước xếp", "thưỡi", "thườn thưỡn", "thưỡn", "thưỡn mặt", "thương binh", "thương cảng", "thương chánh", "thương chiến", "thương chính", "thương cục", "thương đao", "thương đau", "thương điếm", "thương đoàn", "thương đội", "thương giới", "thương hải", "thương hàn", "thương hội", "thương khách", "thương khấu", "thương lục", "thương mãi", "thương mến", "thương nghị", "thương nghiệp", "thương nhân", "thương ôi", "thương pháp", "thương phẩm", "thương phẩm hóa", "thương phiếu", "thương tá", "thương tật", "thương thân", "thương thuyền", "thương thuyết", "thương thực", "thương tiếc", "thương tình", "thương trường", "thương ước", "thương vong", "thương xót", "thương yêu", "thường biến", "thường dân", "thường dùng", "thường kì", "thường lệ", "thường phạm", "thường phục", "thường sơn", "thường tân", "thường thức", "thường tình", "thường trú", "thường vụ", "thường xuân", "thưởng ngoạn", "thưởng nguyệt", "thưởng phạt", "thưởng xuân", "thượng", "thượng cổ", "thượng công", "thượng du", "thượng điền", "thượng đồng", "thượng giới", "thượng hạ", "thượng hảo hạng", "thượng hoàng", "thượng huyền", "thượng hương", "thượng hưởng", "thượng khẩn", "thượng kinh", "thượng lệnh", "thượng lộ", "thượng lương", "thượng lưu", "thượng mã", "thượng nghị sĩ", "thượng nguồn", "thượng nguyên", "thượng quan", "thượng quốc", "thượng tá", "thượng tằng", "thượng tân", "thượng thanh", "thượng thẩm", "thượng thận", "thượng thiện", "thượng thọ", "thượng thư", "thượng tỉ", "thượng toạ", "thượng tuần", "thượng uý", "thượng vị", "thượng viện", "thượt", "ti", "ti chức", "ti-cô", "ti hào", "ti niết", "ti phiên", "ti-pô", "ti tầng", "ti thể", "ti ti", "ti tỉ", "ti tích", "ti trúc", "ti trưởng", "ti-vi", "tì bà", "tì giải", "tì ố", "tì tạch", "tì thiếp", "tì tì", "tì tướng", "tì vị", "tỉ", "tỉ dụ", "tỉ đối", "tỉ giá", "tỉ khối", "tỉ lệ", "tỉ lệ nghịch", "tỉ lệ thức", "tỉ lệ xích", "tỉ mẩn", "tỉ nhiệt", "tỉ như", "tỉ phú", "tỉ số", "tỉ suất", "tỉ thí", "tỉ ti", "tỉ trọng", "tỉ trọng kế", "tĩ", "tí", "tí đỉnh", "tí nhau", "tí tẹo", "tí toáy", "tí toe tí toét", "tị", "tị hiềm", "tị nạnh", "tị tổ", "tị trần", "tia hồng ngoại", "tia ló", "tia tía", "tia tới", "tia tử ngoại", "tia vũ trụ", "tỉa cành", "tỉa chồi", "tỉa gọt", "tỉa lá", "tía lia", "tía lia tía lịa", "tía tô đất", "tích cóp", "tích điện", "tích đức", "tích hợp", "tích kê", "tích kí", "tích lũy", "tích lượng", "tích số", "tích sự", "tích-tắc", "tích thoát", "tích tụ", "tịch", "tịch biên", "tịch cốc", "tịch diệt", "tịch dương", "tịch điền", "tịch kí", "tịch mịch", "tịch thâu", "tiếc công", "tiếc của", "tiếc lời", "tiếc ngẫn", "tiếc nuối", "tiếc sức", "tiếc thay", "tiếc thương", "tiệc mặn", "tiệc tùng", "tiệc yến", "tiêm chủng", "tiêm kích", "tiêm la", "tiêm lửa", "tiêm mao", "tiêm nhập", "tiêm nhiễm", "tiêm tất", "tiêm tế", "tiêm truyền", "tiềm ẩn", "tiềm giác", "tiềm kích", "tiềm năng", "tiềm nhập", "tiềm sinh", "tiềm tiệm", "tiềm vọng", "tiếm chủ", "tiếm đoạt", "tiếm ngôi", "tiếm quyền", "tiếm vị", "tiệm cận", "tiệm tiến", "tiên chỉ", "tiên cô", "tiên cung", "tiên đan", "tiên đề hoá", "tiên định", "tiên đồng", "tiên giác", "tiên giới", "tiên hiền", "tiên hoa", "tiên hoạch", "tiên kiến", "tiên liệt", "tiên liệu", "tiên linh", "tiên lượng", "tiên nghiệm", "tiên nhân", "tiên nho", "tiên ông", "tiên quân", "tiên rồng", "tiên sinh", "tiên sư", "tiên thánh", "tiên thề", "tiên thiên", "tiên thủ", "tiên thường", "tiên tổ", "tiên triết", "tiên triệu", "tiên tử", "tiên vương", "tiền án", "tiền bào tử", "tiền bối", "tiền cảnh", "tiền căn", "tiền cổ điển", "tiền công", "tiền cước", "tiền dạng", "tiền diệp lục", "tiền duyên", "tiền dư", "tiền đạo", "tiền đặt", "tiền đình", "tiền định luận", "tiền đội", "tiền đồn", "tiền đồng", "tiền đúc", "tiền đường", "tiền giấy", "tiền hồ", "tiền khai hoa", "tiền khoa học", "tiền khởi nghĩa", "tiền khu", "tiền lệ", "tiền ngay", "tiền ngữ", "tiền nhiệm", "tiền nong", "tiền nước", "tiền phân bào", "tiền phòng", "tiền phôi", "tiền phương", "tiền quân", "tiền quân dịch", "tiền sảnh", "tiền sinh", "tiền sống", "tiền sơn nguyên", "tiền sử học", "tiền sự", "tiền tài", "tiền tạo", "tiền tâm thu", "tiền tâm trương", "tiền tệ hóa", "tiền thân", "tiền thế", "tiền thưởng", "tiền tiến", "tiền tinh trùng", "tiền tố", "tiền trái", "tiền triết", "tiền triều", "tiền triệu", "tiền trình", "tiền tuất", "tiền túi", "tiền văn học", "tiền vận", "tiền vệ", "tiễn chân", "tiễn đưa", "tiễn hành", "tiễn thu", "tiến công", "tiến cống", "tiến cử", "tiến động", "tiến hoá", "tiến quân", "tiến thân", "tiến thủ", "tiến triển", "tiện bề", "tiện dân", "tiện dịp", "tiện dụng", "tiện kĩ", "tiện lợi", "tiện nội", "tiện nữ", "tiện tặn", "tiện thể", "tiện thiếp", "tiêng tiếc", "tiếng dội", "tiếng dữ", "tiếng địch", "tiếng đồn", "tiếng đồng hồ", "tiếng kêu", "tiếng kinh", "tiếng là", "tiếng lành", "tiếng ồn", "tiếng rằng", "tiếng thế", "tiếng thổi", "tiếng thơm", "tiếng tốt", "tiếng vọng", "tiếng xấu", "tiếp ảnh", "tiếp âm", "tiếp chiến", "tiếp cứu", "tiếp dẫn", "tiếp diễn", "tiếp đầu ngữ", "tiếp điểm", "tiếp hợp", "tiếp khách", "tiếp khẩu", "tiếp kí", "tiếp liên", "tiếp liệu", "tiếp lời", "tiếp máu", "tiếp ngôn", "tiếp phát", "tiếp phẩm", "tiếp rước", "tiếp sau", "tiếp sức", "tiếp tay", "tiếp tế", "tiếp thị", "tiếp thụ", "tiếp tố", "tiếp tuyến", "tiếp ứng", "tiếp vận", "tiếp vĩ ngữ", "tiếp viên", "tiếp xúc", "tiệp báo", "tiệp diệp", "tiết canh", "tiết chế", "tiết dê", "tiết dục", "tiết điệu", "tiết giảm", "tiết hạnh", "tiết lậu", "tiết liệt", "tiết lưu", "tiết mao", "tiết nghĩa", "tiết niệu", "tiết phụ", "tiết tấu", "tiết tháo", "tiết thực", "tiết tố", "tiết túc", "tiết ước", "tiệt", "tiệt khuẩn", "tiệt nhiên", "tiệt nọc", "tiệt sản", "tiêu âm", "tiêu bản", "tiêu biến", "tiêu chảy", "tiêu chuẩn hóa", "tiêu cự", "tiêu cự kế", "tiêu dao", "tiêu diêu", "tiêu hoá", "tiêu hôn", "tiêu hồn", "tiêu hủy", "tiêu huyền", "tiêu khiển", "tiêu ma", "tiêu muối", "tiêu ngữ", "tiêu non", "tiêu pha", "tiêu phí", "tiêu phòng", "tiêu sinh", "tiêu tán", "tiêu tao", "tiêu thổ", "tiêu thuỷ", "tiêu tiền", "tiêu trừ", "tiêu tức", "tiêu xưng", "tiều", "tiều phu", "tiểu", "tiểu bài", "tiểu bào tử", "tiểu bì", "tiểu cao", "tiểu câu", "tiểu chủ", "tiểu chú", "tiểu công nghệ", "tiểu công nghiệp", "tiểu công quốc", "tiểu đăng khoa", "tiểu đậu", "tiểu đề", "tiểu đệ", "tiểu địa chủ", "tiểu đình", "tiểu đoàn bộ", "tiểu đoàn phó", "tiểu đoàn trưởng", "tiểu đội phó", "tiểu đội trưởng", "tiểu đồng", "tiểu hồi", "tiểu hồng cầu", "tiểu hùng tinh", "tiểu khê", "tiểu khí", "tiểu khí hậu", "tiểu khu", "tiểu kỉ", "tiểu kiều", "tiểu kinh tế học", "tiểu mạch", "tiểu mục", "tiểu não", "tiểu nghiệt", "tiểu nhi", "tiểu nhĩ", "tiểu nông", "tiểu phẩm", "tiểu phân tử", "tiểu sản", "tiểu sản xuất", "tiểu sinh", "tiểu tâm", "tiểu thặng", "tiểu thệ", "tiểu thơ", "tiểu thủ công", "tiểu thủy nông", "tiểu thuyết hóa", "tiểu thư", "tiểu thử", "tiểu thương", "tiểu tiết", "tiểu tinh", "tiểu tổ", "tiểu tốt", "tiểu tràng", "tiểu truyện", "tiểu tu", "tiểu tuần hoàn", "tiểu tuyết", "tiểu từ", "tiểu viên chức", "tiểu vương", "tiểu vương quốc", "tiểu yêu", "tiễu", "tiễu phỉ", "tiễu trừ", "tim đen", "tim gan", "tim la", "tim mạch", "tim tím", "tìm hỏi", "tìm kiếm", "tìm ra", "tìm thấy", "tìm tòi", "tỉm xắm", "tím bầm", "tím gan", "tím ruột", "tím than", "tin buồn", "tin cẩn", "tin chắc", "tin dùng", "tin học", "tin lành", "tin mừng", "tin nhảm", "tin nhạn", "tin sương", "tin tức", "tin tưởng", "tin vặt", "tin yêu", "tín", "tín chỉ", "tín chủ", "tín điều", "tín đồ", "tín hiệu học", "tín nghĩa", "tín ngưỡng", "tín nữ", "tín phong", "tín phục", "tín vật", "tinh", "tinh anh", "tinh bào", "tinh binh", "tinh cất", "tinh diệu", "tinh đời", "tinh giảm", "tinh hoa chủ nghĩa", "tinh hồng nhiệt", "tinh khí", "tinh khôi", "tinh khôn", "tinh kì", "tinh lạc", "tinh luyện", "tinh lực", "tinh ma", "tinh mạc", "tinh mơ", "tinh quái", "tinh ranh", "tinh sai", "tinh sương", "tinh thạch", "tinh thành", "tinh thạo", "tinh thần hóa", "tinh thể", "tinh thể học", "tinh thông", "tinh thuần", "tinh thục", "tinh tinh", "tinh tỉnh", "tinh trùng", "tinh tuý", "tinh tử", "tinh tươm", "tinh tường", "tinh vân", "tinh vệ", "tinh xác", "tinh xảo", "tinh ý", "tình ái", "tình anh em", "tình bạn", "tình báo", "tình báo viên", "tình cảnh", "tình chung", "tình dục", "tình duyên", "tình đầu", "tình địch", "tình huống", "tình lang", "tình lụy", "tình nghi", "tình nghĩa", "tình nương", "tình phụ", "tình quân", "tình si", "tình sử", "tình tang", "tình thâm", "tình thân", "tình thư", "tình thực", "tình thương", "tình trường", "tình tứ", "tình tự", "tỉnh bộ", "tỉnh bơ", "tỉnh đoàn", "tỉnh đội", "tỉnh đường", "tỉnh giấc", "tỉnh hội", "tỉnh khô", "tỉnh lẻ", "tỉnh lị", "tỉnh lộ", "tỉnh lược", "tỉnh ngộ", "tỉnh ngủ", "tỉnh rượu", "tỉnh thành", "tỉnh trưởng", "tỉnh uỷ", "tỉnh uỷ viên", "tĩnh", "tĩnh đàn", "tĩnh điện", "tĩnh điện học", "tĩnh điện kế", "tĩnh mạc", "tĩnh mạch", "tĩnh mạch đồ", "tĩnh mạch học", "tĩnh mịch", "tĩnh tâm", "tĩnh thổ", "tĩnh tịch", "tĩnh toạ", "tĩnh trí", "tĩnh từ", "tĩnh vật", "tính chuyện", "tính danh", "tính dễ dãi", "tính dục", "tính đố", "tính giao", "tính hạnh", "tính liệu", "tính mạng", "tính mệnh", "tính năng", "tính ngữ", "tính nhẩm", "tính phác", "tính rợ", "tính sổ", "tính tình", "tính toan", "tính trạng", "tính từ hóa", "tịnh", "tịnh độ", "tịnh giới", "tịnh tiến", "tịnh vô", "típ", "tít mắt", "tịt mít", "tịt ngòi", "tiu", "tiu nghỉu", "tiu nguỷu", "tíu", "tíu ta tíu tít", "tíu tít", "to bụng", "to cao", "to chuyện", "to đầu", "to gan", "to mồm", "to nhỏ", "to-nô", "to sụ", "to tiếng", "to xác", "to xù", "tò-he", "tò te", "tò tí-te", "tò tò", "tỏ bày", "tỏ rõ", "tỏ tình", "tó", "toa", "toa ăn", "toa nằm", "toa rập", "toa sàn", "toại", "toại chí", "toại nguyện", "toại ý", "toàn bị", "toàn bích", "toàn biến chất", "toàn biến thái", "toàn cảnh", "toàn cầu", "toàn cục", "toàn cuộc", "toàn dạng", "toàn dân", "toàn dưỡng", "toàn gia", "toàn mĩ", "toàn miệng", "toàn năng", "toàn phương", "toàn quân", "toàn sắc", "toàn sinh", "toàn tài", "toàn tâm", "toàn tập", "toàn thắng", "toàn thân", "toàn thị", "toàn thiện", "toàn thịnh", "toàn thư", "toàn tiến", "toàn tiết", "toàn tinh", "toàn tòng", "toàn trí", "toàn vẹn", "toán đố", "toán học hóa", "toán kinh-tế", "toán lí", "toán loạn", "toán pháp", "toán số", "toán trưởng", "toán tử", "toang", "toang hoang", "toang toác", "toang toang", "toáng", "toanh tout", "toát", "tóc đáp", "tóc gáy", "tóc giả", "tóc máu", "tóc mây", "tóc ngứa", "tóc sâu", "tóc sương", "tóc tai", "tóc thề", "tóc tiên", "tóc tiên nước", "tóc vấn", "tóc xanh", "tọc mạch", "toe", "toe toét", "tòe", "tỏe", "toẽ", "toé", "tóe khói", "tóe loe", "tóe phở", "toen hoẻn", "toèn toẹt", "toét nhèm", "toẹt", "toi cơm", "toi dịch", "tòi", "tỏi lào", "tom", "tom chát", "tom ngỏm", "tom tóp", "tòm", "tòm cắc", "tòm tem", "tòm tòm", "tỏm tẻm", "tóm cổ", "tóm tém", "tóm về", "ton hót", "ton-nô", "ton tả", "ton ton", "tòn ten", "tong", "tong tả", "tong teo", "tong tong", "tòng", "tòng chinh", "tòng cổ", "tòng đảng", "tòng học", "tòng lai", "tòng phu", "tòng quyền", "tòng sự", "tòng tâm", "tòng thuộc", "tòng tọc", "tòng tử", "tòng vong", "tỏng", "tỏng tòng tong", "toòng teng", "tóp", "tóp mỡ", "tọp", "tót", "tót vời", "tô giới", "tô hạp", "tô hô", "tô hồng", "tô hợp", "tô màu", "tô mộc", "tô nhượng", "tô-pô-học", "tô-tem", "tô-tem giáo", "tô tức", "tồ", "tồ tồ", "tổ ấm", "tổ bố", "tổ chấy", "tổ đỉa", "tổ đổi công", "tổ khúc", "tổ mẫu", "tổ nghiệp", "tổ ong", "tổ phó", "tổ phụ", "tổ sư", "tổ thành", "tổ tôm", "tổ tông", "tổ truyền", "tổ trưởng", "tổ viên", "tố", "tố chất", "tố lốc", "tố nga", "tố nữ", "tộ", "tốc chiến", "tốc kế", "tốc kí", "tốc lực", "tốc tả", "tốc thành", "tốc thắng", "tộc biểu", "tộc danh", "tộc người", "tộc phả", "tộc trưởng", "tôi con", "tôi đòi", "tôi luyện", "tôi mọi", "tôi người", "tôi rèn", "tôi tối", "tồi tàn", "tối dạ", "tối đại", "tối đại hóa", "tối đất", "tối đen", "tối đèn", "tối giản", "tối hảo", "tối hậu", "tối huệ quốc", "tối khẩn", "tối kị", "tối mắt", "tối mật", "tối mò", "tối mù", "tối mũi", "tối ngày", "tối ngòm", "tối om", "tối sầm", "tối tăm", "tối thượng", "tối trời", "tối ư", "tối ưu", "tối ưu hóa", "tội đồ", "tội gì", "tội lệ gì", "tội lỗi", "tội nghiệp", "tội nhân", "tội nợ", "tội phạm học", "tội tình", "tội trạng", "tôm càng", "tôm cua", "tôm mượn vỏ", "tôm rảo", "tôm ròng", "tôm sông", "tôm tép", "tôn chủ", "tôn hiệu", "tôn huynh", "tôn kính", "tôn mẫu", "tôn miếu", "tôn múi", "tôn nhân phủ", "tôn nữ", "tôn ông", "tôn phái", "tôn phò", "tôn phong", "tôn phù", "tôn quân", "tôn qúy", "tôn sư", "tôn tạo", "tôn thất", "tôn thờ", "tôn tộc", "tôn tốt", "tôn trưởng", "tôn xưng", "tồn", "tồn cảo", "tồn căn", "tồn cổ", "tồn dư", "tồn đọng", "tồn nghi", "tồn qũy", "tồn trữ", "tồn vong", "tổn", "tổn hao", "tổn phí", "tổn thọ", "tông", "tông chỉ", "tông đồ", "tông-đơ", "tông đường", "tông miếu", "tông môn", "tông phái", "tông tộc", "tồng ngồng", "tồng tộc", "tổng", "tổng bãi công", "tổng bãi khóa", "tổng bãi thị", "tổng bao", "tổng biên tập", "tổng binh", "tổng bộ", "tổng chỉ huy", "tổng công đoàn", "tổng công hội", "tổng công kích", "tổng công trình sư", "tổng công ty", "tổng cục", "tổng cục trưởng", "tổng diễn tập", "tổng diện tích", "tổng doanh thu", "tổng dũng", "tổng duyệt", "tổng dự đoán", "tổng đại điện", "tổng đình công", "tổng đoàn", "tổng đốc", "tổng đội", "tổng động binh", "tổng động viên", "tổng giá", "tổng giác", "tổng hòa", "tổng kho", "tổng khởi nghĩa", "tổng khủng hoảng", "tổng kiểm sát trưởng", "tổng lãnh sự", "tổng lãnh sự quán", "tổng lí", "tổng liên đoàn", "tổng luận", "tổng lực", "tổng năng", "tổng ngân sách", "tổng nha", "tổng phản công", "tổng sản lượng", "tổng sản phẩm", "tổng sư", "tổng tài", "tổng tấn công", "tổng tham mưu trưởng", "tổng thanh tra", "tổng thể", "tổng thống", "tổng thống chế", "tổng thu nhập", "tổng thư ký", "tổng tiến công", "tổng trấn", "tổng trưởng", "tổng tư lệnh", "tổng vệ sinh", "tống", "tống chung", "tống cựu", "tống đạt", "tống khứ", "tống lao", "tống táng", "tống tiền", "tống tiễn", "tống tình", "tống tửu", "tốp ca", "tốt bạn", "tốt bộ", "tốt bổng", "tốt duyên", "tốt đen", "tốt đẹp", "tốt đôi", "tốt giọng", "tốt lão", "tốt lễ", "tốt lo", "tốt mối", "tốt nái", "tốt nết", "tốt ngày", "tốt nhịn", "tốt nói", "tốt phúc", "tốt thầy", "tốt thuốc", "tốt trai", "tốt trời", "tốt tươi", "tốt tướng", "tốt vô ngần", "tột", "tột bậc", "tột bực", "tột cùng", "tột điểm", "tột mực", "tột phẩm", "tơ cảm", "tơ duyên", "tơ đào", "tơ đồng", "tơ hào", "tơ huyết", "tơ liễu", "tơ lòng", "tơ lơ mơ", "tơ lụa", "tơ màng", "tơ mành", "tơ mơ", "tơ rung", "tơ rưng", "tơ tình", "tơ tóc", "tơ vò", "tơ vương", "tờ báo", "tờ cung", "tờ gác", "tờ hoa", "tờ khai", "tờ mây", "tờ mờ", "tờ phóng", "tờ rưng", "tờ trình", "tớ thầy", "tợ", "tơi", "tơi xốp", "tới cùng", "tới hạn", "tới mức", "tới nơi", "tới nước", "tới số", "tới tấp", "tớn", "tớn táo", "tợn tạo", "tớp", "tớt", "tra của", "tra hỏi", "tra tấn", "tra vấn", "tra xét", "trà lá", "trà mi", "trà trộn", "trả ân", "trả bữa", "trả công", "trả của", "trả giá", "trả lại", "trả lễ", "trả miếng", "trả nghĩa", "trả nợ", "trả nủa", "trả ơn", "trả phép", "trã", "trá", "trá bệnh", "trá hàng", "trác việt", "trách bị", "trách cứ", "trách móc", "trách phạt", "trách phận", "trạch tả", "trai đàn", "trai gái", "trai giới", "trai lơ", "trai ngọc", "trai phòng", "trai tráng", "trài", "trải mờ", "trãi", "trái cân", "trái chủ", "trái chứng", "trái cổ", "trái cựa", "trái đào", "trái đất", "trái gió", "trái giống", "trái khoản", "trái khoán", "trái lại", "trái lẽ", "trái mắt", "trái nết", "trái ngược", "trái phá", "trái phiếu", "trái tai", "trái tim", "trái tính", "trái vụ", "trái ý", "trại chủ", "trại giam", "trại hè", "trại lính", "trại phong", "trại tập trung", "trại tế bần", "tram", "trảm quyết", "trám đen", "trám hương", "trám miệng", "trám trắng", "trạm trưởng", "trạm xá", "tran", "tràn đầy", "tràn lan", "tràn ngập", "trán cổng", "trán cửa", "trán tường", "trang âm", "trang ấp", "trang cụ", "trang đài", "trang kim", "trang nhã", "trang phục", "trang thiết bị", "trang trải", "trang trại", "trang viên", "tràng", "tràng cửu", "tràng giang", "tràng hạt", "tràng kì", "tràng kỉ", "tràng nhạc", "tràng quy", "tràng sinh", "tràng thạch", "tràng thành", "tràng thi", "tràng thiên", "trảng", "tráng dương", "tráng đinh", "tráng khí", "tráng kiện", "tráng men", "tráng niên", "tráng phim", "tráng sĩ", "trạng", "trạng huống", "trạng mạo", "trạng nguyên", "trạng ngữ", "trạng sư", "trạng từ", "trạng từ hóa", "tranh ảnh", "tranh ăn", "tranh biện", "tranh bộ ba", "tranh bộ đôi", "tranh chấp", "tranh cổ động", "tranh công", "tranh cường", "tranh dân gian", "tranh dầu", "tranh đấu", "tranh đoạt", "tranh ghép mảnh", "tranh giải", "tranh giành", "tranh hùng", "tranh in tay", "tranh khắc", "tranh khôn", "tranh liễn", "tranh màu bột", "tranh màu keo", "tranh nề", "tranh quyền", "tranh sinh hoạt", "tranh tấm", "tranh thủy mặc", "tranh tụng", "tranh tường", "tranh vách", "tranh vải", "tranh vanh", "trao tặng", "trao trả", "trào lộng", "trảo nha", "tráo", "tráo trợn", "tráo trưng", "trau", "trau giồi", "tràu", "trảu", "trày trạy", "trảy", "trạy", "trắc ẩn", "trắc bá", "trắc bách diệp", "trắc dĩ", "trắc đạc", "trắc đồ", "trắc lượng", "trắc nết", "trắc quang", "trắc thủ", "trắc trở", "trăm ăm", "trăm họ", "trăm năm", "trăm ngày", "trăm sự", "trăm tuổi", "trằm trồ", "trắm", "trằn", "trăng già", "trăng hoa", "trăng khuyết", "trăng mật", "trăng trắng", "trăng trối", "trắng án", "trắng bệch", "trắng bong", "trắng bốp", "trắng chân", "trắng chiếu", "trắng đen", "trắng hếu", "trắng lốp", "trắng muốt", "trắng nhờ", "trắng nõn", "trắng nuột", "trắng phau", "trắng tinh", "trắng trẻo", "trắng trong", "trắng trợt", "trắng xoá", "trâm anh", "trâm hốt", "trầm bổng", "trầm cảm", "trầm hà", "trầm lắng", "trầm lặng", "trầm luân", "trầm mình", "trầm ngâm", "trầm nghị", "trầm tích", "trầm tích học", "trầm tĩnh", "trầm tính", "trầm trệ", "trầm trồ", "trầm tư", "trầm uất", "trẫm", "trẫm mình", "trẫm triệu", "trậm trầy trậm trật", "trân bảo", "trân cam", "trân châu lùn", "trân trân", "trân tu", "trân vị", "trần ai", "trần bì", "trần cầu", "trần duyên", "trần đời", "trần giới", "trần hoàn", "trần hủ", "trần liệt", "trần lụy", "trần mễ", "trần phàm", "trần thiết", "trần thuật", "trần thuyết", "trần tục", "trẩn", "trấn", "trấn át", "trấn ba đình", "trấn biên", "trấn định", "trấn lột", "trấn ngự", "trấn nhậm", "trấn phong", "trấn phục", "trấn thủ", "trấn yểm", "trận đồ", "trận mạc", "trận pháp", "trận thế", "trận tiền", "trận vong", "trập", "trập ô", "trật bánh", "trật cánh khỉ", "trật chân", "trật khớp", "trật lất", "trật trà trật trưỡng", "trật trệu", "trật trưỡng", "trâu gié", "trâu ngố", "trâu ngựa", "trầu cau", "trầu không", "trầu thuốc", "trẩu", "trây", "trây lười", "trầy trật", "trầy trụa", "trẩy", "trẩy hội", "tre gai", "tre là ngà", "tre nứa", "tre pheo", "tre trẻ", "trè", "trẻ em", "trẻ già", "trẻ hóa", "trẻ măng", "trẻ mỏ", "trẻ nhỏ", "trẻ ranh", "trẻ thơ", "trẽ", "trèm", "trém", "trém mép", "trèn trẹt", "trẽn", "trẽn mặt", "treo bảng", "treo chức", "treo cổ", "treo cờ", "treo giò", "treo gương", "treo mỏ", "treo mõm", "treo niêu", "trèo leo", "tréo", "tréo cựa", "tréo giò", "tréo khoáy", "tréo khoeo", "tréo ngoảy", "trẹo cổ", "trẹo họng", "trẹo trọ", "trẹo xương", "trẹt", "trẹt lét", "trê", "trê trễ", "trề", "trề trễ", "trễ biếng", "trễ tràng", "trệ", "trệ thai", "trệch", "trên dưới", "trết", "trệt lết", "trêu chọc", "trêu chòng", "trêu gan", "trêu ghẹo", "trêu tráo", "trệu", "trệu trạo", "tri âm", "tri châu", "tri cơ", "tri giao", "tri hô", "tri huyện", "tri kỉ", "tri năng", "tri ngộ", "tri niệm", "tri phủ", "tri quá", "tri tâm", "tri thù", "tri thức rộng", "tri tình", "tri túc", "trì", "trì độn", "trì năng", "trì trệ", "trĩ", "trĩ mũi", "trí dục", "trí dũng", "trí giả", "trí lự", "trí mạng", "trí não", "trí năng", "trí sĩ", "trí trá", "trị an", "trị bệnh", "trị gia", "trị liệu", "trị loạn", "trị ngoại", "trị quốc", "trị số", "trị thuỷ", "trỉa", "trích dịch", "trích đăng", "trích điển", "trích đoạn", "trích giảng", "trích lục", "trích tiên", "trích trích", "trích yếu", "trịch", "triền", "triển hạn", "triển khai", "triến", "triêng", "triềng", "triệng", "triết", "triết lí", "triết nhân", "triệt", "triệt âm", "triệt binh", "triệt hồi", "triệt phá", "triệt thoái", "triêu mộ", "triều", "triều chính", "triều cống", "triều cường", "triều đường", "triều kiến", "triều lưu", "triều miếu", "triều phục", "triều yết", "triệu chứng", "triệu chứng học", "triệu hồi", "triệu trẫm", "triệu triệu", "trinh", "trinh nữ học", "trinh phụ", "trinh sản", "trinh sát", "trinh thám", "trinh thục", "trình bày", "trình toà", "trình trịch", "trình trọt", "trít", "trịt", "trìu trĩu", "trĩu", "trĩu trịt", "tro bụi", "tro tàn", "trò cười", "trò đời", "trò khỉ", "trò trẻ", "trò trống", "trò vè", "trọ", "trọ trẹ", "tróc mảng", "tróc nã", "tróc vảy", "trọc khí", "trọc lóc", "trọc lốc", "trọc phú", "trọc tếch", "trọc tếu", "troi", "tròi", "tròi trọi", "trỏi", "trói gô", "trói ké", "trói tôm", "trói tròn", "trọi", "trọi lỏi", "trọi trơn", "tròm trõm", "trõm", "tróm trém", "tron", "tròn bóng", "tròn trặn", "tròn trĩnh", "tròn trõn", "tròn xoay", "tròn xoe", "trọn đời", "trọn vẹn", "trong khoảng", "trong lành", "trong lúc", "trong mình", "trong mờ", "trong ngoài", "trong trắng", "trong trẻo", "trong vắt", "trong veo", "tròng", "tròng đen", "tròng lọng", "tròng tên", "tròng trắng", "tròng trọc", "trỏng", "tróng", "trọng án", "trọng bệnh", "trọng dụng", "trọng đãi", "trọng địa", "trọng đông", "trọng hạ", "trọng hậu", "trọng hình", "trọng liên", "trọng lực", "trọng lực kế", "trọng nhậm", "trọng nông", "trọng phạm", "trọng pháo", "trọng tâm", "trọng thần", "trọng thể", "trọng thị", "trọng thọ", "trọng thu", "trọng thương", "trọng tội", "trọng trách", "trọng trường", "trọng vọng", "trọng xuân", "trót", "trót dại", "trô trố", "trổ tài", "trổ trời", "trỗ", "trỗ bông", "trố", "trộ", "trốc", "trộc trệch", "trôi nổi", "trôi qua", "trôi sông", "trổi", "trổi dậy", "trối", "trối chết", "trối già", "trối kệ", "trối thây", "trối trăng", "trôm", "trộm cắp", "trộm cướp", "trộm phép", "trộm vía", "trôn", "trôn ốc", "trốn học", "trốn lính", "trốn mặt", "trốn nợ", "trốn thoát", "trốn thuế", "trốn tránh", "trốn việc", "trộn bài", "trộn lẫn", "trộn tiếng", "trộn trạo", "trông chừng", "trông đợi", "trông lại", "trông mong", "trông nhờ", "trông nom", "trông thấy", "trông vời", "trồng cấy", "trồng chuối", "trồng cưỡng", "trồng đậu", "trồng răng", "trồng tỉa", "trồng trỉa", "trồng trọt", "trồng xen", "trổng", "trống bỏi", "trống cà rùng", "trống cái", "trống chầu", "trống con", "trống định âm", "trống đồng", "trống ếch", "trống gió", "trống hoác", "trống hốc", "trống huếch", "trống khẩu", "trống lảng", "trống lấp", "trống lệnh", "trống lốc", "trống lổng", "trống lục lạc", "trống mái", "trống miệng", "trống ngực", "trống trếch", "trống tuếch", "trơ ì", "trơ khấc", "trơ mắt", "trơ mép", "trơ thổ địa", "trơ trẽn", "trơ trơ", "trờ trờ", "trở chua", "trở chứng", "trở dạ", "trở đi", "trở gió", "trở kháng", "trở lên", "trở lui", "trở lực", "trở mình", "trở mùi", "trở quẻ", "trở ra", "trở tay", "trở thành", "trở trời", "trở vào", "trớ", "trợ", "trợ bào", "trợ bút", "trợ chiến", "trợ dung", "trợ giáo", "trợ giúp", "trợ lí", "trợ lực", "trợ quản", "trợ tá", "trợ tế", "trợ thai", "trợ thì", "trợ thời", "trợ tim", "trợ từ", "trơi", "trời bể", "trời biển", "trời đánh", "trời đất", "trời già", "trời giáng", "trời xanh", "trơn nhẫy", "trơn trợt", "trơn tuột", "trờn", "trờn trợn", "trớn trác", "trợn trạo", "trợn trừng", "trớp", "trợt lớt", "tru", "tru di", "trù", "trù dập", "trù định", "trù hoạch", "trù liệu", "trù mật", "trù mưu", "trù phú", "trù úm", "trủ", "trú", "trú binh", "trú chân", "trú dạ", "trú phòng", "trú quán", "trú quân", "trú sở", "trụ cột", "trụ kế", "trụ sinh", "trụ sở", "trụ thạch", "trụ trì", "truân chiên", "truất", "truất ngôi", "truất quyền", "truật", "trúc", "trúc bâu", "trúc đổ", "trúc hóa long", "trúc lịch", "trúc mai", "trúc nhào", "trúc nhự", "trúc ti", "trúc tra trúc trắc", "trúc trắc", "trục béo", "trục cam", "trục cán", "trục lăn", "trục lợi", "trui", "trùi trũi", "trùi trụi", "trũi", "trụi", "trụi lủi", "trùm chăn", "trùm sỏ", "trùm trụp", "trúm", "trụm", "trun", "trùn", "trụn", "trung bì", "trung bình chủ nghĩa", "trung bình cộng", "trung bình nhân", "trung bộ", "trung can", "trung cao", "trung cầu", "trung châu", "trung chính", "trung cổ", "trung dung", "trung dũng", "trung đại", "trung đại học", "trung đẳng", "trung điểm", "trung đoàn bộ", "trung đoàn phó", "trung đoạn", "trung độ", "trung đội phó", "trung đội trưởng", "trung giao", "trung hậu", "trung hiếu", "trung hoà", "trung hòa tử", "trung học", "trung hưng", "trung kì", "trung kiên", "trung lập hóa", "trung liên", "trung liệt", "trung lộ", "trung lương", "trung lưu", "trung mô", "trung nghĩa", "trung ngôn", "trung nguyên", "trung nhiệt", "trung nông", "trung phân", "trung phần", "trung phong", "trung quả bì", "trung quân", "trung sách", "trung sinh", "trung tâm điểm", "trung tần", "trung tầng", "trung thần", "trung thận", "trung thất", "trung thể", "trung thế kỉ", "trung thiên", "trung thọ", "trung tỉ", "trung tích", "trung tiện", "trung tín", "trung tính", "trung tố", "trung trị", "trung triêng", "trung trinh", "trung trụ", "trung trũng", "trung trực", "trung tu", "trung tuyến", "trung tử", "trung tướng", "trung uý", "trung vị", "trung y", "trùng", "trùng bào tử", "trùng chân giả", "trùng chuông", "trùng cỏ", "trùng cửu", "trùng đế giày", "trùng điệp", "trùng khơi", "trùng lắp", "trùng lê", "trùng máu", "trùng mắt", "trùng môi", "trùng mũi khoan", "trùng ngôn", "trùng ngũ", "trùng phùng", "trùng phương", "trùng rận", "trùng roi", "trùng tảo", "trùng tố", "trùng vây", "trùng vi", "trùng xoắn", "trúng cách", "trúng độc", "trúng giải", "trúng kế", "trúng mom", "trúng môm", "trúng phong", "trúng quả", "trúng thử", "trúng thực", "trúng tim", "trúng ý", "trụng", "truồng", "truột", "trụp", "trút bỏ", "trút mồ hôi", "trụt", "truy", "truy bức", "truy cứu", "truy điệu", "truy hoan", "truy hoàn", "truy hỏi", "truy hô", "truy lĩnh", "truy lùng", "truy nạp", "truy nhận", "truy phong", "truy quét", "truy tặng", "truy tầm", "truy thu", "truy tìm", "truy tưởng", "truy vấn", "truỵ", "trụy", "truỵ lạc", "truỵ thai", "trụy thai", "truyền bảo", "truyền dẫn", "truyền đạo", "truyền đạt", "truyền điện", "truyền động", "truyền đơn", "truyền giáo", "truyền giáo học", "truyền giống", "truyền khẩu", "truyền kì", "truyền kiếp", "truyền lệnh", "truyền lực", "truyền miệng", "truyền một tin", "truyền ngôi", "truyền nhiễm", "truyền nhiệt", "truyền tải", "truyền thần", "truyền thống chủ nghĩa", "truyền tin", "truyền tụng", "truyện dài", "truyện kí", "truyện ngắn", "truyện phim", "truyện thơ", "trừ bì", "trừ bị", "trừ bỏ", "trừ bữa", "trừ căn", "trừ gian", "trừ hại", "trừ hao", "trừ khi", "trừ ngoại", "trừ phục", "trừ tà", "trừ tịch", "trừ tiệt", "trữ kim", "trữ lượng", "trứ tác", "trự", "trưa trật", "trưa trờ", "trừa", "trực ban", "trực cảm", "trực chiến", "trực chuẩn", "trực dịch", "trực diện", "trực đạc", "trực giác luận", "trực hệ", "trực khuẩn-huyết", "trực ngôn", "trực nhật", "trực phân", "trực tâm", "trực thăng vận", "trực thu", "trực thuộc", "trực tính", "trực tuần", "trưng", "trưng binh", "trưng cầu", "trưng mua", "trưng tập", "trưng thâu", "trưng thầu", "trưng triệu", "trừng giới", "trừng trộ", "trừng trừng", "trửng", "trứng cuốc", "trứng điện", "trứng gà", "trứng lộn", "trứng nhện", "trứng quốc", "trứng sam", "trứng sáo", "trứng tóc", "trước bạ", "trước hạn", "trước hết", "trước kia", "trước mắt", "trước nay", "trước sau", "trước tác", "trước thuật", "trương lực", "trương nước", "trương tuần", "trường bay", "trường bắn", "trường chinh", "trường cửu", "trường dòng", "trường đấu", "trường độ", "trường đời", "trường giang", "trường hận ca", "trường kì", "trường kỉ", "trường ốc", "trường quay", "trường quy", "trường sinh", "trường sở", "trường thạch", "trường thành", "trường thi", "trường thiên", "trường thoại", "trường thương", "trường tồn", "trường trai", "trường vốn", "trường xuân", "trưởng ban", "trưởng đoàn", "trưởng đồn", "trưởng giả", "trưởng giả hóa", "trưởng họ", "trưởng kho", "trưởng kíp", "trưởng lão", "trưởng nam", "trưởng nữ", "trưởng quan", "trưởng thôn", "trưởng ti", "trưởng tộc", "trưởng tôn", "trưởng tràng", "trưởng tử", "trướng", "trướng bụng", "trướng đào", "trướng gấm", "trướng hoa", "trướng hồng", "trướng hùm", "trướng huỳnh", "trướng loan", "trượng", "trượt băng", "trượt chân", "trượt giá", "trượt gỗ", "tu bổ", "tu chí", "tu chỉnh", "tu chính", "tu chính án", "tu hành", "tu kín", "tu lí", "tu lơ khơ", "tu luyện", "tu nghiệp", "tu nhân", "tu sĩ", "tu tạo", "tu thư", "tu tiên", "tu tỉnh", "tu tu", "tu từ học", "tu viện trưởng", "tù cẳng", "tù chung thân", "tù đày", "tù đọng", "tù đồ", "tù khổ sai", "tù mù", "tù ngồi", "tù ngục", "tù nhân", "tù phạm", "tù thất", "tù tì", "tù treo", "tù trưởng", "tù xa", "tủ", "tủ áo", "tủ đứng", "tủ gương", "tủ phiếu", "tủ sắt", "tủ sấy", "tủ thuốc", "tú", "tú bà", "tú cầu", "tú khí", "tú sĩ", "tú tài", "tú tuấn", "tú ú", "tú ụ", "tụ", "tụ ba", "tụ bạ", "tụ cầu khuẩn", "tụ điểm", "tụ hội", "tụ hợp", "tụ huyết trùng", "tụ nghĩa", "tụ nhị", "tụ sắc", "tụ tập", "tuần", "tuần chay", "tuần du", "tuần đinh", "tuấn mã", "tuấn nhã", "tuấn sĩ", "tuất", "túc", "túc chí", "túc dụng", "túc duyên", "túc học", "túc khiên", "túc mễ cục", "túc nhân", "túc nho", "túc số", "túc trái", "túc túc", "túc vệ", "tục bản", "tục biên", "tục danh", "tục đoạn", "tục hôn", "tục luỵ", "tục ngữ hoá", "tục ngữ học", "tục tác", "tục truyền", "tục tử", "tục xưng", "tuế", "tuế cống", "tuế nguyệt", "tuế toái", "tuệ", "tuệ nhãn", "tuệ tinh", "tuếch", "tuếch toác", "tui", "tủi", "tủi cực", "tủi duyên", "tủi hổ", "tủi nhục", "túi bụi", "túi con", "tụi", "tụi chúng", "tụi mình", "tụi tao", "túm tụm", "tun hủn", "tun ngủn", "tung độ", "tung độ kế", "tung hê", "tung hoành", "tung hô", "tung hứng", "tung tăng", "tung toé", "tung tung", "tùng", "tùng chinh", "tùng cúc", "tùng đàm", "tùng đảng", "tùng hương", "tùng phạm", "tùng phèo", "tùng quân", "tùng san", "tùng sự", "tùng thư", "tùng tùng", "tùng xẻo", "túng", "túng bấn", "túng đói", "túng kiết", "túng nhiên", "túng sử", "túng thiếu", "tụng", "tụng ca", "tụng đình", "tuộc", "tuổi đầu", "tuổi đời", "tuổi già", "tuổi hạc", "tuổi mụ", "tuổi mụ bà", "tuổi nghề", "tuổi ta", "tuổi tác", "tuổi tây", "tuổi tôi", "tuổi xanh", "tuổi xuân", "tuôn lệ", "tuồn", "tuông", "tuốt tuộc", "tuốt tuồn tuộc", "túp", "túp lều", "tút", "tút-xuỵt", "tụt", "tụt hậu", "tụt nõ", "tuy vậy", "tuỳ", "tuỳ bút", "tuỳ cơ", "tuỳ hành", "tuỳ hứng", "tuỳ nghi", "tuỳ phái", "tuỳ thân", "tuỳ theo", "tuỳ thuộc", "tuyên án", "tuyên cáo", "tuyên chiến", "tuyên đọc", "tuyên độc", "tuyên giáo", "tuyên huấn", "tuyên thệ", "tuyên uý", "tuyền", "tuyển binh", "tuyển chọn", "tuyển cử", "tuyển hầu", "tuyển lựa", "tuyển nổi", "tuyển quân", "tuyển sinh", "tuyển tập", "tuyển thủ", "tuyển trạch", "tuyến đầu", "tuyến đường", "tuyến giáp", "tuyến hình", "tuyến lệ", "tuyến mặt", "tuyến tính", "tuyến trước", "tuyến tùng", "tuyến yên", "tuyết cừu", "tuyết hận", "tuyết lở", "tuyết sỉ", "tuyết sương", "tuyệt bút", "tuyệt cú", "tuyệt diệt", "tuyệt đại bộ phận", "tuyệt đại đa số", "tuyệt đích", "tuyệt đỉnh", "tuyệt giao", "tuyệt giống", "tuyệt hảo", "tuyệt không", "tuyệt kĩ", "tuyệt kinh", "tuyệt mệnh", "tuyệt mĩ", "tuyệt nhiên", "tuyệt nọc", "tuyệt phẩm", "tuyệt sắc", "tuyệt thế", "tuyệt thực", "tuyệt tình", "tuyệt trần", "tuyệt tự", "tuyệt xảo", "tuyn", "tư bản chủ nghĩa", "tư bản hóa", "tư bẩm", "tư biện", "tư bôn", "tư bổn", "tư cấp", "tư doanh", "tư dung", "tư điền", "tư đồ", "tư đức", "tư gia", "tư hiềm", "tư ích", "tư khấu", "tư không", "tư kỉ", "tư kiến", "tư lập", "tư lịnh", "tư lự", "tư mã", "tư nghiệp", "tư nhân", "tư nhân hóa", "tư sản hóa", "tư tâm", "tư thái", "tư thất", "tư thông", "tư thương", "tư tình", "tư tố", "tư trang", "tư trào", "tư trợ", "tư túi", "tư văn", "tư vị", "tư ý", "từ ái", "từ cảm", "từ căn", "từ chêm", "từ chức", "từ chương", "từ công cụ", "từ cực", "từ đầu", "từ đây", "từ đấy", "từ đệm", "từ điện", "từ đó", "từ động", "từ động học", "từ đường", "từ ghép", "từ giã", "từ giảo", "từ hoá", "từ hôn", "từ ngày", "từ nguyên học", "từ ngữ", "từ nhiệt", "từ phổ", "từ phú", "từ quan", "từ rày", "từ tạ", "từ tâm", "từ thạch", "từ thiên", "từ thiên kế", "từ thông kế", "từ thuở", "từ thực", "từ tĩnh học", "từ tổ", "từ tố", "từ trần", "từ trễ", "từ trở", "từ trường", "từ từ", "từ vị", "từ vựng hóa", "tử", "tử biệt", "tử chiến", "tử diệp", "tử đệ", "tử địa", "tử điểm", "tử giác", "tử hà xa", "tử hình", "tử khí", "tử nạn", "tử nang thể", "tử ngoại", "tử phần", "tử phòng", "tử sinh", "tử số", "tử thi", "tử thù", "tử thủ", "tử thương", "tử tiết", "tử tô", "tử tội", "tử tôn", "tử tù", "tử tức", "tử tước", "tử vận", "tử vong", "tứ", "tứ bàng", "tứ bào tử", "tứ bảo", "tứ bề", "tứ bình", "tứ bội", "tứ chiếng", "tứ cực", "tứ cửu", "tứ dân", "tứ diện", "tứ duy", "tứ kết", "tứ khổ", "tứ linh", "tứ lục", "tứ mã", "tứ phẩm", "tứ phân", "tứ phương", "tứ qúy", "tứ sắc", "tứ tán", "tứ thanh", "tứ thân", "tứ thể", "tứ thiết", "tứ thời", "tứ thư", "tứ trụ", "tứ tuyệt", "tứ tử", "tứ vi", "tứ xứ", "tự", "tự ải", "tự ái", "tự ám thị", "tự biên", "tự biến áp", "tự biện bạch", "tự bốc cháy", "tự buộc tội", "tự cảm", "tự chảy", "tự chế", "tự chuẩn trực", "tự chủng", "tự cung", "tự cực", "tự cường", "tự dạng", "tự danh", "tự dẫn", "tự do chủ nghĩa", "tự dưng", "tự dưỡng", "tự đại", "tự đẩy", "tự điền", "tự điển", "tự điều chỉnh", "tự điều hòa", "tự điều khiển", "tự động hoá", "tự động từ", "tự ghép", "tự giao", "tự hành", "tự hình", "tự hoại", "tự hỏi", "tự hủy", "tự khắc", "tự khẳng định", "tự khi", "tự khiêm", "tự khoa", "tự khử khuẩn", "tự kỉ", "tự kỉ ám thị", "tự kiêu", "tự lọc", "tự lợi", "tự mãn", "tự miễn dịch", "tự mồi", "tự mục đích", "tự ngã", "tự ngã chủ nghĩa", "tự nghĩa", "tự ngôn", "tự nhiễm độc", "tự nhiễm khuẩn", "tự nhiên chủ nghĩa", "tự nhiên học", "tự nó", "tự ổn định", "tự phê", "tự phê bình", "tự phụ", "tự phục vụ", "tự quản", "tự quản lí", "tự quân", "tự quuyết", "tự quyền", "tự rút", "tự sản", "tự sinh", "tự sự", "tự tại", "tự tạo", "tự tân", "tự tận", "tự thân", "tự thế", "tự thị", "tự thiêu", "tự thụ tinh", "tự thuật", "tự thừa", "tự thực", "tự ti", "tự tích", "tự tiêu", "tự tiêu hóa", "tự tiêu thụ", "tự tín", "tự tình", "tự tôn", "tự truyện", "tự tu", "tự tư tự lợi", "tự tử", "tự vẫn", "tự vấn", "tự vệ", "tự vị", "tự vựng", "tự xúc tác", "tự xử", "tưa", "tửa", "tứa", "tựa đề", "tức", "tức bực", "tức cảnh", "tức hứng", "tức khắc", "tức khí", "tức mình", "tức như", "tức thị", "tức thời", "tức tối", "tức tưởi", "tức vị", "tưng bốc", "tưng hửng", "tưng tức", "tưng tửng", "từng li", "từng lớp", "tước bỏ", "tước hiệu", "tước lộc", "tước vị", "tươi đẹp", "tươi mát", "tươi rói", "tươi sáng", "tươi sống", "tươi thắm", "tươi tỉnh", "tươi tốt", "tươi trẻ", "tươi vui", "tưới tiêu", "tươm", "tươm tươm", "tườm tượp", "tướn", "tương", "tương ái", "tương bào", "tương cách", "tương can", "tương đẳng", "tương đối luận", "tương đồng", "tương giao", "tương hỗ", "tương hợp", "tương kế", "tương khắc", "tương kiến", "tương liên", "tương ngộ", "tương ớt", "tương phản", "tương phùng", "tương tác", "tương tàn", "tương tế", "tương thân", "tương thích", "tương tri", "tương truyền", "tương tự", "tương xứng", "tường cánh gà", "tường giải", "tường hoa", "tường ốp", "tường trình", "tường vi", "tưởng bở", "tưởng chừng", "tưởng là", "tưởng lệ", "tưởng lục", "tưởng niệm", "tưởng vọng", "tướng công", "tướng cướp", "tướng lĩnh", "tướng quân", "tướng quốc", "tướng sĩ", "tướng soái", "tướng số", "tướng súy", "tướng tá", "tướng thuật", "tượng binh", "tượng đài", "tượng tầng", "tượng thanh", "tượng trưng hóa", "tướp", "tướt", "tượt", "tườu đùa", "tửu", "tửu lượng", "tửu quán", "tửu tinh kế", "tựu chức", "tựu nghĩa", "tựu trung", "tựu trường", "u buồn", "u em", "u gai", "u già", "u giả", "u hoài", "u linh", "u lồi", "u mạch", "u mê", "u minh", "u nang", "u quái", "u-rê", "u sụn", "u tối", "u tuyến", "u uẩn", "ù cạc", "ù lì", "ù ờ", "ù tai", "ù té", "ù ù", "ù ù cạc cạc", "ù xọe", "ủ ấp", "ủ bệnh", "ủ tươi", "ú", "ú a ú ớ", "ú òa", "ú tim", "ú ứ", "ụ", "ụ đảo", "ụ ngồi", "ụ pháo", "ụ súng", "ụ tàu", "ùa theo", "úa vàng", "ụa", "ụa khan", "uẩn súc", "uẩn tàng", "uất", "uất giận", "uẩy", "ục", "ục ục", "uế tạp", "uế vật", "úi dào", "um", "um sùm", "úm", "úm ấp", "úm ba la", "un", "un đúc", "ùn", "ùn tắc", "ùn ùn", "ủn ỉn", "ung độc", "ung thư hoá", "ung thư học", "ung ủng", "ùng", "ùng oàng", "ùng ục", "úng ngập", "úng thuỷ", "uôm uôm", "uốn cong", "uốn dẻo", "uốn éo", "uốn gối", "uốn khúc", "uốn lượn", "uốn nếp", "uốn ván", "uổng", "uổng công", "uổng mạng", "uổng phí", "uở", "úp úp mở mở", "ụp", "út ít", "uy", "uy linh", "uy nghiêm", "uy vũ", "uỷ", "uỷ ban", "uỷ hội", "uỷ lĩnh", "uỷ mị", "uỷ nhiệm", "uỷ nhiệm thư", "uỷ quyền", "uyên ảo", "uyên nguyên", "uyên ương", "uyển ngữ", "uỳnh uỵch", "ư", "ư hừ", "ư hự", "ư ứ", "ừ", "ừ ào", "ừ è", "ừ hữ", "ừ nhỉ", "ừ phải", "ừ ừ ào ào", "ừ ừ è è", "ứ hơi", "ứ hự", "ứ máu", "ứ phân", "ứ tắc", "ứ trệ", "ứ ừ", "ưa chuộng", "ưa đèn", "ưa may", "ưa thích", "ứa gan", "ứa giọt", "ựa", "ức bách", "ức đạc", "ức đoán", "ức đồ", "ức hiếp", "ức thuyết", "ưng chuẩn", "ưng khuyển", "ưng ửng", "ưng ý", "ừng ực", "ửng", "ửng đỏ", "ửng sáng", "ứng", "ứng chiến", "ứng cử", "ứng cử viên", "ứng cứu", "ứng đối", "ứng động", "ứng lực", "ứng mộ", "ứng mộng", "ứng nghiệm", "ứng tác", "ứng tạm", "ứng tấu", "ứng thù", "ứng tiếp", "ứng trước", "ứng tuyển", "ứng viên", "ứng viện", "ứng xuất", "ước ao", "ước chung", "ước đoán", "ước lệ", "ước lược", "ước nguyền", "ước nguyện", "ước số", "ước số chung", "ước thúc", "ước tính", "ươm", "ướm hỏi", "ướm lòng", "ướm lời", "ươn mình", "ươn ướt", "ườn", "ưỡn", "ưỡn à ưỡn ẹo", "ương", "ương bướng", "ương gàn", "ương ương", "ướp xác", "ướt đầm", "ướt đề", "ướt nhè", "ướt nhèm", "ướt sũng", "ưu", "ưu binh", "ưu đãi", "ưu đẳng", "ưu hạng", "ưu khuyết", "ưu khuyết điểm", "ưu lự", "ưu phẫn", "ưu sinh", "ưu sinh học", "ưu thế", "ưu thời", "ưu trương", "ưu tú", "ưu tư", "va chạm", "va đập", "va-li", "va-ni", "va-rơ", "va-rơi", "va vấp", "vả chăng", "vả rừng", "vã", "vá may", "vạ gì", "vạ miệng", "vạ vật", "vạ vịt", "vác mặt", "vác-xin", "vạc mặt", "vách đá", "vách ngăn", "vạch mắt", "vạch mặt", "vạch ngang", "vạch nối", "vai cày", "vai vế", "vài ba", "vài bốn", "vải bạt", "vải bồi", "vải bông", "vải dầu", "vải dựng", "vải giả da", "vải in hoa", "vải liệm", "vải mảnh", "vải phin", "vãi", "vãi cứt", "vái", "vái dài", "vái lạy", "vái trời", "vạm vỡ", "van bướm", "van lạy", "van lơn", "van vãn", "van vát", "van vỉ", "vàn", "vãn anh", "vãn cảnh", "vãn duyên", "vãn niên", "vãn sinh", "ván bìa", "ván địa", "ván khuôn", "ván ngựa", "ván thiên", "ván thôi", "vạn an", "vạn bảo", "vạn bất đắc dĩ", "vạn bội", "vạn cổ", "vạn đại", "vạn hạnh", "vạn kiếp", "vạn nhất", "vạn quốc", "vạn toàn", "vạn tuế", "vạn tuyền", "vạn vật học", "vang âm", "vang dậy", "vang dội", "vang vọng", "vàng ạnh", "vàng bạc", "vàng cốm", "vàng da", "vàng diệp", "vàng đá", "vàng đen", "vàng ệch", "vàng hoe", "vàng hồ", "vàng kiêng", "vàng lá", "vàng mã", "vàng nén", "vàng nghệ", "vàng ngọc", "vàng ối", "vàng qùy", "vàng rộm", "vàng rực", "vàng tâm", "vàng thùa", "vàng vàng", "vàng vọt", "vãng", "vãng cảnh", "vãng phản", "váng đầu", "váng huyết", "váng óc", "váng vất", "vanh vách", "vành bánh", "vành khăn", "vành khuyên", "vành móng ngựa", "vành mũi", "vành trăng", "vành vạnh", "vạnh", "vào đám", "vào đề", "vào đời", "vào làng", "vào mẩy", "vào ra", "vào tròng", "vào vai", "vào vụ", "vát", "vay lãi", "vay mượn", "vày", "vảy bao hoa", "vảy cá", "vảy cám", "vảy da", "vảy mạc", "vảy nến", "vảy ốc", "váy cộc", "váy trong", "váy xòe", "vạy", "vắc-xin", "vặc", "vằm mặt", "văn", "văn án", "văn bài", "văn bản", "văn chỉ", "văn công", "văn đoàn", "văn gia", "văn giai", "văn giáo", "văn giới", "văn hài", "văn hào", "văn hiến", "văn hoa", "văn hoá", "văn hoá phẩm", "văn học sử", "văn khắc", "văn khế", "văn khoa", "văn kiện học", "văn liệu", "văn miếu", "văn minh hóa", "văn nghệ", "văn nghệ sĩ", "văn nghiệp", "văn ngôn", "văn nhã", "văn nhân", "văn phái", "văn phạm", "văn pháp", "văn quan", "văn sách", "văn sĩ", "văn tài", "văn tập", "văn tế", "văn thân", "văn thể", "văn thư", "văn trị", "văn tuyển", "văn tứ", "văn tự", "văn uyển", "văn võ", "văn vũ", "văn xã", "văn xuôi", "vằn", "vằn thắn", "vằn vèo", "vằn vện", "vắn dài", "vắn tắt", "vặn vẹo", "vặn vọ", "văng mạng", "văng tê", "văng tục", "văng vẳng", "văng vắng", "vằng", "vằng vặc", "vắng bặt", "vắng bóng", "vắng lặng", "vắng mặt", "vắng ngắt", "vắng tanh", "vắng teo", "vắng tiếng", "vắng tin", "vắt dòng", "vắt nóc", "vắt sổ", "vắt va vắt vẻo", "vắt vẻo", "vâm", "vậm vạp", "vân cẩu", "vân du", "vân hà", "vân hán", "vân mẫu", "vân mồng", "vân sam", "vân vi", "vân vũ", "vân vụ", "vần chân", "vần công", "vần lưng", "vần nội", "vần ôm", "vần thông", "vần vật", "vần xoay", "vẩn", "vẩn vơ", "vẫn thạch", "vấn an", "vấn danh", "vấn tâm", "vấn tội", "vấn vương", "vận dụng", "vận động", "vận động chiến", "vận động viên", "vận đơn", "vận hà", "vận hạn", "vận hội", "vận luật", "vận luật học", "vận lương", "vận mạch", "vận mạng", "vận mệnh", "vận tống", "vận trù học", "vận văn", "vận xuất", "vâng dạ", "vâng vâng dạ dạ", "vầng", "vầng dương", "vầng đông", "vầng hồng", "vấp váp", "vập", "vập vào tường", "vất", "vất va vất vưởng", "vất vơ", "vất vưởng", "vật chất chủ nghĩa", "vật chất hóa", "vật chủ", "vật dục", "vật dụng", "vật giá", "vật hậu học", "vật hóa", "vật hoạt", "vật kính", "vật lí", "vật lí học", "vật lộn", "vật lực", "vật mình", "vật nài", "vật nuôi", "vật phẩm", "vật quyền", "vật thể hóa", "vật thử", "vật tổ", "vật tư", "vật vã", "vật vờ", "vầu", "vấu", "vây bắt", "vây bọc", "vây bủa", "vây dồn", "vây hãm", "vây quanh", "vây ráp", "vây vẫy", "vây vo", "vầy vò", "vẩy", "vẫy gọi", "vẫy vùng", "vậy nên", "vậy ôi", "vậy ru", "vậy thay", "vậy vay", "ve áo", "ve vãn", "ve vảy", "ve ve", "ve vuốt", "vẻ chi", "vẻ mặt", "vẻ ngoài", "vẽ chuyện", "vẽ trò", "vẽ truyền", "vẽ vời", "véc-ni", "véc-tơ", "vẹm", "ven", "ven biển", "ven bờ", "ven đô", "ven nội", "ven theo", "vẻn vẹn", "vén gốc", "vẹn", "vẹn tròn", "vẹn tuyền", "veo", "vèo vèo", "vẻo", "vẹo", "vẹo cổ", "vẹo vọ", "vét kiệt", "vét-tông", "vẹt ăn thịt", "vẹt gấm", "vẹt mào", "vẹt xám", "vẹt xanh", "về già", "về hùa", "về không", "về phần", "về quê", "về sau", "về vườn", "vệ đà", "vệ đà giáo", "vệ đội", "vệ quốc", "vệ quốc đoàn", "vệ quốc quân", "vệ sĩ", "vệ sinh học", "vệ sinh viên", "vếch", "vền", "vền vên", "vện", "vênh mặt", "vênh vang", "vênh vênh", "vênh vểnh", "vểnh râu", "vết bầm", "vết chàm", "vết hoe", "vết nhăn", "vết nhơ", "vết tích", "vết xe", "vêu", "vêu mõm", "vêu vao", "vều", "vếu", "vi", "vi ảnh", "vi ba", "vi chấn", "vi điện chuyển", "vi điện tử", "vi động vật", "vi kế", "vi khí hậu", "vi khí hậu học", "vi khuẩn học", "vi-la", "vi lệnh", "vi lô", "vi lượng", "vi lượng đồng căn", "vi mô", "vi-ni-lông", "vi-ô-lông", "vi phân", "vi phẫu", "vi-rút", "vi-rút học", "vi sai", "vi sinh vật", "vi sinh vật học", "vi-ta-min", "vi thao tác", "vi thể", "vi thiềng", "vi thực vật", "vi ti huyết quản", "vi tiểu hình hóa", "vi tin", "vi tinh", "vi tinh thể", "vi trùng", "vi ước", "vi vu", "vi xử lí", "vì chưng", "vì kèo", "vì là", "vì lẽ", "vì nể", "vì nỗi", "vì rằng", "vì vậy", "vỉ buồm", "vỉ lò", "vỉ ruồi", "vĩ", "vĩ bạch", "vĩ cầm", "vĩ mô", "vĩ nhân", "vĩ tố", "ví bằng", "ví chăng", "ví dù", "ví dụ", "ví phỏng", "ví von", "vị danh", "vị dịch", "vị hôn phu", "vị hôn thê", "vị kỉ", "vị lợi", "vị lợi chủ nghĩa", "vị mặt", "vị nể", "vị ngã", "vị tất", "vị thành niên", "vị thế", "vị thứ", "vị toan", "vị tự", "vị vong nhân", "vía", "vía van", "vích", "việc gì", "viêm họng", "viêm nhiễm", "viêm nhiệt", "viêm quầng", "viêm tấy", "viên", "viên bao", "viên bao đường", "viên băm", "viên chức hóa", "viên cốm", "viên hạt", "viên mãn", "viên môn", "viên nang", "viên ngậm", "viên ngoại", "viên nhện", "viên nhộng", "viển vông", "viễn", "viễn ảnh", "viễn chí", "viễn chinh", "viễn du", "viễn dụng", "viễn dương", "viễn địa", "viễn kế", "viễn khách", "viễn kính", "viễn nhật", "viễn phương", "viễn thị", "viễn tin", "viễn tưởng", "viễn tượng", "viễn vọng", "viện binh", "viện dân biểu", "viện dẫn", "viện hàn lâm", "viện kiểm sát", "viện phí", "viện phó", "viện quân", "viện sĩ", "viện trưởng", "viếng", "viết chì", "viết lách", "viết máy", "việt dã", "việt gian", "việt hóa", "việt nam hóa", "việt ngữ", "việt văn", "vịm", "vinh", "vinh hiển", "vinh hoa", "vinh nhục", "vinh quy", "vinh thân", "vĩnh biệt", "vĩnh hằng", "vĩnh quyết", "vịt bầu", "vịt cỏ", "vịt đái", "vịt đàn", "vịt pha", "vịt thìa", "vịt trời", "vịt xiêm", "víu", "vo", "vo ve", "vo viên", "vo vo", "vò đầu", "vò tơ", "vò vẽ", "vò xé", "vỏ bào", "vỏ chai", "vỏ chăn", "vỏ chuối", "vỏ lụa", "vỏ não", "vỏ quả", "vỏ sò", "võ bị", "võ biền", "võ công", "võ cử", "võ giai", "võ khí", "võ lực", "võ miếu", "võ phu", "võ quan", "võ sĩ", "võ sĩ đạo", "võ sư", "võ trang", "võ tướng", "võ vạc", "võ vàng", "võ vẽ", "vọ", "voan", "vóc", "vóc dạc", "vóc hạ", "vọc", "vọc vạch", "voi biển", "voi nan", "vòi nhụy", "vòi nước", "vòi rồng", "vòi trứng", "vòi vĩnh", "vòi vọi", "vói", "vọi", "vòm bán nguyệt", "vòm bát úp", "vòm chéo", "vòm chống", "vòm cuốn", "vòm hóa", "vòm họng", "vòm mềm", "vòm miệng", "vòm trời", "vòmg cung", "von", "von kế", "von vót", "vòn vọt", "vỏn vẹn", "vón", "vong", "vong bản", "vong bổn", "vong gia thất thổ", "vong hồn", "vong mạng", "vong mệnh", "vong nhân", "vong niên", "vong quốc", "vong quốc nô", "vong vỏng", "vòng bi", "vòng cổ", "vòng đai", "vòng đệm", "vòng đua", "vòng găng", "vòng luồn", "vòng quay", "vòng tay", "vòng tên", "vòng tránh thai", "vòng tròn", "vòng vây", "vỏng", "võng giá", "võng lọng", "võng lưng", "võng vãnh", "vóng", "vọng canh", "vọng cổ", "vọng cung", "vọng đăng", "vọng lầu", "vọng nguyệt", "vọng phu", "vọng tiêu", "vọng tộc", "vọng vần", "vọp", "vọp bẻ", "vô", "vô bào", "vô bờ", "vô bờ bến", "vô can", "vô chánh phủ", "vô chánh trị", "vô chính phủ", "vô chính trị", "vô chừng", "vô cố", "vô công rỗi nghề", "vô cớ", "vô cùng", "vô cùng tận", "vô cương", "vô dụng", "vô duyên", "vô dưỡng", "vô đạo", "vô địch", "vô điều kiện", "vô định hình", "vô định luận", "vô gia cư", "vô giá trị", "vô giác", "vô giao", "vô giáo dục", "vô hạn", "vô hạn định", "vô hạn độ", "vô hạnh", "vô hậu", "vô hi vọng", "vô hiệu hóa", "vô hiệu lực", "vô hình trung", "vô học", "vô hồi kì trận", "vô hướng", "vô kể", "vô kế", "vô kháng", "vô khối", "vô khuẩn", "vô kỉ luật", "vô kinh", "vô lại", "vô-lăng", "vô lễ", "vô lí", "vô loài", "vô lối", "vô luân", "vô luận", "vô lương", "vô lượng", "vô mưu", "vô năng", "vô ngần", "vô nghệ", "vô nghì", "vô nghĩa lí", "vô nghiệm", "vô nguyên tắc", "vô nhân", "vô nhân đạo", "vô niệu", "vô ơn", "vô phúc", "vô phước", "vô phương", "vô sản hóa", "vô sắc", "vô sỉ", "vô song", "vô tài", "vô tang", "vô tâm", "vô thanh", "vô thần luận", "vô thiên lủng", "vô thời hạn", "vô thời hiệu", "vô thủy chung", "vô thừa kế", "vô thừa tự", "vô thưởng vô phạt", "vô thượng", "vô tỉ", "vô tích sự", "vô tiền khoáng hậu", "vô tình cảm", "vô tính", "vô tổ chức", "vô tội vạ", "vô trách nhiệm", "vô tri", "vô trùng", "vô tuyến", "vô tuyến điện", "vô tuyến truyền hình", "vô tuyến truyền thanh", "vô tự", "vô ước", "vô ưu", "vô vàn", "vô vi", "vô vọng", "vô ý", "vồ", "vồ ếch", "vổ", "vỗ đùi", "vỗ mặt", "vỗ ngực", "vỗ nợ", "vỗ ơn", "vỗ tuột", "vỗ vế", "vỗ yên", "vố", "vôi bột", "vôi chín", "vôi hóa", "vôi nước", "vôi sống", "vôi tam hợp", "vôi thủy", "vôi tôi", "vồi vội", "vối", "vội vàng", "vôn", "vôn kế", "vốn dĩ", "vốn liếng", "vốn sống", "vông", "vông đồng", "vông nem", "vông vàng", "vồng", "vổng", "vơ vào", "vơ váo", "vơ vẩn", "vơ vất", "vơ vét", "vờ vẫn", "vờ vĩnh", "vở", "vở diễn", "vỡ bụng", "vỡ chợ", "vỡ chum", "vỡ da", "vỡ giọng", "vỡ hoang", "vỡ lẽ", "vỡ lở", "vỡ mộng", "vỡ nghĩa", "vỡ tiếng", "vỡ tổ", "vỡ vạc", "vớ bở", "vớ va vớ vẫn", "vợ cả", "vợ chồng", "vợ chưa cưới", "vợ con", "vợ hai", "vợ kế", "vợ lẽ", "vợ mọn", "vợ nhỏ", "vợ thứ", "vơi", "vơi vơi", "vời", "vời vợi", "với lại", "với nhau", "vớt mìn", "vớt vát", "vu", "vu cáo", "vu hãm", "vu hoặc", "vu khoát", "vu quy", "vu thác", "vu vạ", "vu vu", "vù vù", "vũ bị", "vũ công", "vũ dũng", "vũ đạo", "vũ đoán", "vũ giai", "vũ hội", "vũ kế", "vũ khí", "vũ kịch", "vũ lộ", "vũ lực", "vũ lượng", "vũ lượng kế", "vũ môn", "vũ nghệ", "vũ phu", "vũ sĩ", "vũ sĩ đạo", "vũ tạ", "vũ tầng", "vũ thoát y", "vũ thuật", "vũ thuỷ", "vũ trang", "vũ trụ học", "vũ trụ luận", "vũ trụ quan", "vũ trường", "vũ tướng", "vũ y", "vú bánh giầy", "vú bầu", "vú bõ", "vú chũm cau", "vú đá", "vú già", "vú mướp", "vú vê", "vụ danh", "vụ phó", "vụ trưởng", "vụ việc", "vua bếp", "vua chúa", "vua quan", "vua tôi", "vùa", "vùa giúp", "vúc vắc", "vục", "vui chân", "vui chơi", "vui chuyện", "vui cười", "vui dạ", "vui lòng", "vui mắt", "vui miệng", "vui mồm", "vui mừng", "vui vẻ", "vùi dập", "vùi đầu", "vùi đầu vùi cổ", "vũm", "vun bón", "vun đắp", "vun gốc", "vun quén", "vun tưới", "vun vào", "vun vén", "vun vút", "vun xới", "vùn", "vùn vụt", "vung phí", "vung tàn tán", "vung vãi", "vung văng", "vung vẩy", "vung vinh", "vùng biển", "vùng cao", "vùng cấm địa", "vùng dậy", "vùng đất", "vùng lên", "vùng trời", "vùng và vùng vằng", "vùng ven", "vũng bùn", "vũng lầy", "vũng tàu", "vụng ăn ở", "vụng dại", "vụng tính", "vụng trộm", "vụng về", "vuông góc", "vuông tròn", "vuông vắn", "vuông vức", "vuốt đuôi", "vuốt giãn", "vuốt giận", "vuốt mắt", "vuột", "vút", "vụt chốc", "vừa đôi", "vừa khéo", "vừa khi", "vừa lứa", "vừa mắt", "vừa miệng", "vừa mồm", "vừa nãy", "vừa phải", "vừa qua", "vừa rồi", "vừa sức", "vừa tay", "vừa vặn", "vừa vừa", "vừa ý", "vữa động mạch", "vựa lúa", "vựa thóc", "vực thẳm", "vưng", "vững bụng", "vững chãi", "vững chân", "vững dạ", "vững giá", "vững lòng", "vững mạnh", "vững tâm", "vững tin", "vững vàng", "vựng", "vược", "vươn vai", "vườn bách thảo", "vườn hoa", "vườn quả", "vườn quốc gia", "vườn rau", "vườn thú", "vườn trẻ", "vườn trường", "vườn tược", "vườn ươm", "vườn ương", "vượn cáo", "vượn mèo", "vượn người", "vượn thờ", "vượn vá", "vương bá", "vương công", "vương cung", "vương đạo", "vương giả", "vương hầu", "vương miện", "vương nghiệp", "vương phi", "vương phủ", "vương quyền", "vương vị", "vướng chân", "vướng mức", "vướng vít", "vướng víu", "vượng khí", "vượt âm", "vượt bậc", "vượt biên", "vượt cấp", "vượt mức", "vượt ngục", "vượt qua", "vượt quá", "vượt quyền", "vượt tuyến", "vứt bỏ", "vứt đi", "vưu vật", "x quang", "xa cảng", "xa gần", "xa giá", "xa hậu", "xa hoàng", "xa khơi", "xa lắc", "xa lắc xa lơ", "xa lìa", "xa-lông", "xa mã", "xa mu", "xa phí", "xa rời", "xa-tanh", "xa-tăng", "xa tắp", "xa thẳm", "xa tiền tử", "xa tít", "xa trưởng", "xa vắng", "xa xả", "xa xẩn", "xà-bông", "xà cạp", "xà-cột", "xà đơn", "xà ích", "xà kép", "xà-lách", "xà lệch", "xà-lim", "xà lỏn", "xà-lù", "xà mâu", "xà ngang", "xà-phòng", "xà tích", "xà xẻo", "xả hơi", "xả kỉ", "xả láng", "xã đoàn", "xã đội", "xã đội trưởng", "xã hội đồ", "xã hội hóa", "xã thôn", "xã thuyết", "xã trưởng", "xã vệ", "xã viên", "xá cày", "xá đệ", "xá muội", "xá xíu", "xạ", "xạ ảnh", "xạ khí", "xạ khuẩn", "xác chết", "xác chứng", "xác cứ", "xác-đin", "xác lập", "xác lột", "xác minh", "xác suất", "xác thịt", "xác ướp", "xác ve", "xạc", "xạc xài", "xạc xào", "xách mé", "xách nách", "xách tai", "xách tay", "xạch xạch", "xài lớn", "xài phí", "xài xạc", "xái", "xái nhì", "xái xảm", "xam", "xam xám", "xam xưa", "xàm", "xàm bậy", "xàm xạp", "xàm xĩnh", "xàm xỡ", "xảm", "xám ngắt", "xám ngoét", "xám xanh", "xan", "xán", "xàng xê", "xanh bủng", "xanh cỏ", "xanh da bát", "xanh da trời", "xanh-đi-ca", "xanh hoa lí", "xanh hồ thủy", "xanh lá mạ", "xanh lam", "xanh lè", "xanh lét", "xanh lục", "xanh lướt", "xanh mắt", "xanh mặt", "xanh mét", "xanh mướt", "xanh ngắt", "xanh nước biển", "xanh rớt", "xanh xao hốc hác", "xành xạch", "xao", "xao nhãng", "xao xác", "xào lăn", "xào nấu", "xào xáo", "xào xạo", "xảo hoạt", "xảo kế", "xảo ngôn", "xảo thuật", "xảo trá", "xáo", "xáo động", "xáo lộn", "xáo xác", "xáo xới", "xáp", "xáp chiến", "xáp lá cà", "xáp mặt", "xáp trận", "xạp", "xát hẹp", "xàu", "xạu mặt", "xay xát", "xảy", "xáy", "xắc", "xắc-cốt", "xắc mắc", "xắc xói", "xăm xăm", "xăm xắn", "xăm xắp", "xăm xỉa", "xắm nắm", "xăn", "xăn văn", "xăng dầu", "xăng-đan", "xăng nhớt", "xăng xái", "xăng xít", "xằng", "xằng bậy", "xằng xiên", "xằng xịt", "xẵng giọng", "xắp", "xấc láo", "xấc lấc", "xâm", "xâm canh", "xâm đoạt", "xâm lăng", "xâm lấn", "xâm mặt", "xâm thực", "xâm xẩm", "xâm xấp", "xầm xì", "xẩm", "xẩm xoan", "xẩn vẩn", "xấp", "xấp giọng", "xấp xí xập ngầu", "xập xè", "xập xình", "xập xòe", "xâu chuỗi", "xâu dịch", "xâu tai", "xấu bụng", "xấu chơi", "xấu dạ", "xấu đói", "xấu hoắc", "xấu mặt", "xấu múa", "xấu nghĩa", "xấu òm", "xấu tay", "xấu thói", "xấu tính", "xây đắp", "xây lắp", "xẩy", "xe", "xe ba bánh", "xe ba gác", "xe bình bịch", "xe bọc sắt", "xe ca", "xe cải tiến", "xe cam-nhông", "xe cao su", "xe chở dầu", "xe chữa cháy", "xe cơ giới", "xe cút kít", "xe cứu hỏa", "xe dây", "xe dê", "xe duyên", "xe đám", "xe đạp máy", "xe đạp nước", "xe đẩy hàng", "xe điện ngầm", "xe điếu", "xe đòn", "xe đổ thùng", "xe gíp", "xe goòng", "xe hàng", "xe hẩy", "xe hòm", "xe hơi", "xe kéo", "xe khách", "xe lam", "xe lăn đường", "xe lết", "xe lọ", "xe lội nước", "xe lu", "xe lửa", "xe moóc", "xe ô-tô", "xe tay", "xe tắc-xi", "xe tăng", "xe thiết giáp", "xe thồ", "xe thổ mộ", "xe thư", "xe tơ", "xe trâu", "xe trượt tuyết", "xe tứ mã", "xe tưới đường", "xe ủi đất", "xe xích", "xe xích-lô", "xè xè", "xé lẻ", "xé ruột", "xé tai", "xé xác", "xéc", "xẹc", "xem bệnh", "xem bói", "xem chừng", "xem hát", "xem hội", "xem khinh", "xem lễ", "xem mạch", "xem mặt", "xem ngày", "xen canh", "xen kẽ", "xen lẫn", "xèn xẹt", "xẻn lẻn", "xén tóc", "xèng", "xẻng", "xeo", "xeo nạy", "xèo", "xẻo", "xẽo", "xéo xẹo", "xéo xó", "xẹo xiên", "xẹo xọ", "xép", "xép xẹp", "xẹp lép", "xét", "xét duyệt", "xét lại", "xét nết", "xét nghiệm", "xét soi", "xẹt", "xê", "xê cố", "xê-mi-ne", "xê xế", "xể", "xế bóng", "xế tà", "xế tuổi", "xệ", "xếch mé", "xếch xác", "xệch", "xệch xạc", "xềm xệp", "xên", "xênh xang", "xềnh xệch", "xềnh xoàng", "xếp ải", "xếp bằng", "xếp bằng tròn", "xếp chữ", "xếp dọn", "xếp dỡ", "xếp đống", "xếp hạng", "xếp loại", "xếp nếp", "xếp xó", "xệp", "xêu", "xều", "xệu xạo", "xi-lanh", "xi-líp", "xi-lô", "xi-măng", "xi-nê", "xi-rô", "xì- ke", "xì dầu", "xì đồng", "xì-gà", "xì hơi", "xì xà xì xụp", "xì xằng", "xì xầm", "xì xị", "xì xồ", "xì xục", "xì xụp", "xỉ than", "xỉ vả", "xí", "xí gạt", "xí xoá", "xí xố", "xị", "xị mặt", "xia", "xỉa xói", "xía", "xích đế", "xích-đông", "xích đới", "xích lại", "xích-lô", "xích tay", "xích thằng", "xích thố", "xích vệ", "xịch", "xiêm", "xiêm áo", "xiểm nịnh", "xiên góc", "xiên khoai", "xiên xẹo", "xiên xiên", "xiên xọ", "xiển minh", "xiềng xích", "xiểng liểng", "xiết bao", "xiết nỗi", "xiêu xiêu", "xiêu xọ", "xim", "xin cưới", "xin phép", "xin thẻ", "xin vâng", "xin việc", "xin xăm", "xin xỉn", "xin xỏ", "xỉn", "xinh trai", "xinh tươi", "xinh xắn", "xinh xẻo", "xinh xinh", "xình", "xít", "xíu mại", "xịu", "xo ro", "xo vai", "xỏ lá", "xỏ mũi", "xỏ ngọt", "xỏ tai", "xỏ xiên", "xó ró", "xó xỉnh", "xọ", "xoa bóp", "xoa dịu", "xoa xoa", "xoa xuýt", "xoà", "xoá bỏ", "xoá nhoà", "xoá sổ", "xoác", "xoạc", "xoài tượng", "xoài xiêm", "xoải", "xoan", "xoan đào", "xoan lát", "xoang", "xoang tràng", "xoang xoảng", "xoàng", "xoàng xĩnh", "xoàng xoàng", "xoảng", "xoạng", "xoành xoạch", "xoay chiều", "xoay chuyển", "xoay lưng", "xoay trần", "xoay trở", "xoay vần", "xoay xỏa", "xoay xoáy", "xoáy nghịch", "xoáy thuận", "xoáy trôn ốc", "xoăn mũi", "xoăn tai", "xoắn", "xoắn kế", "xoắn khuẩn", "xoắn ốc", "xoắn trùng", "xoắn xuýt", "xóc cái", "xóc đĩa", "xóc thẻ", "xóc xách", "xọc", "xoe", "xoen xoét", "xoèn xoẹt", "xoét", "xoẹt", "xoi bói", "xoi lọng", "xoi móc", "xoi xói", "xói", "xói lở", "xói móc", "xói mòn", "xom", "xom xom", "xòm xọp", "xõm", "xóm làng", "xóm thôn", "xon", "xon xon", "xon xón", "xon xót", "xong chuyện", "xong đời", "xong nợ", "xong xả", "xong xóc", "xòng xõng", "xỏng xảnh", "xõng", "xõng lưng", "xoong", "xoong chảo", "xoong nồi", "xóp", "xóp xọp", "xọp", "xót ruột", "xót thương", "xót xa", "xô-nát", "xô-viết", "xô-viết hóa", "xô-viết học", "xô xát", "xồ", "xốc nổi", "xốc xa xốc xếch", "xốc xáo", "xộc", "xộc xà xộc xệch", "xộc xệch", "xôi", "xôi gấc", "xôi hoa cau", "xôi lúa", "xôi thịt", "xôi vò", "xổi", "xôm", "xồm", "xồm xoàm", "xổm", "xồn xồn", "xốn", "xốn xang", "xộn", "xộn rộn", "xộn xạo", "xông đất", "xông nhà", "xông pha", "xông xáo", "xông xổng", "xồng xộc", "xống", "xống áo", "xốp xáp", "xốp xộp", "xốt", "xốt vang", "xơ-cua", "xơ cứng", "xơ gan", "xơ mít", "xơ múi", "xơ rơ", "xơ vơ", "xờ xạc", "xở", "xớ rớ", "xớ xẩn", "xơi", "xơi xơi", "xởi", "xởi lởi", "xới xáo", "xờm", "xờm xờm", "xơn xớt", "xởn", "xớp", "xợp", "xớt", "xớt xợt", "xu-chiêng", "xu lợi", "xu mị", "xu-páp", "xu phụ", "xu phụng", "xu xoa", "xù xù", "xũ", "xú danh", "xú khí", "xụ", "xua", "xua tay", "xuân đường", "xuân hoá", "xuân huyên", "xuân nhật", "xuân phong", "xuân sắc", "xuân sơn", "xuân tiết", "xuân tình", "xuân xanh", "xuẩn", "xuẩn động", "xuất bản phẩm", "xuất biên", "xuất binh", "xuất cảnh", "xuất chính", "xuất chuồng", "xuất gia", "xuất huyết", "xuất khẩu", "xuất kích", "xuất lực", "xuất môn", "xuất ngoại", "xuất ngũ", "xuất nhập", "xuất nhập khẩu", "xuất phát điểm", "xuất quân", "xuất quần", "xuất qũy", "xuất siêu", "xuất thần", "xuất thế", "xuất tinh", "xuất trận", "xuất tục", "xuất tướng", "xuất viện", "xuất vốn", "xuất xưởng", "xuây", "xúc biến", "xúc biện", "xúc cảnh", "xúc giác kế", "xúc hướng động", "xúc tác", "xúc tiếp", "xúc tu", "xúc xắc", "xúc-xích", "xục rục", "xuê xoa", "xuể", "xuệch xoạc", "xuềnh xoàng", "xui bảo", "xui bẩy", "xui dại", "xui giục", "xui khiến", "xui nên", "xui xẻo", "xui xiểm", "xúi", "xúi bẩy", "xúi giục", "xúi quẩy", "xụi", "xum xoe", "xùm xoà", "xùm xụp", "xúm đông", "xúm quanh", "xúm xít", "xung", "xung động", "xung kích", "xung lượng", "xung năng", "xung quanh", "xung thiên", "xung trận", "xung xăng", "xùng xình", "xủng xẻng", "xủng xoảng", "xúng xa xúng xính", "xúng xính", "xuôi gió", "xuôi ngược", "xuôi tai", "xuôi xả", "xuôi xuôi", "xuồng lướt", "xuồng máy", "xuống cân", "xuống cấp", "xuống dòng", "xuống dốc", "xuống giọng", "xuống lỗ", "xuống mã", "xuống nước", "xuống tay", "xuống thang", "xúp", "xút", "xuy", "xùy", "xuya", "xuyên động", "xuyên quốc gia", "xuyên sơn", "xuyên suốt", "xuyên tâm", "xuyên tâm liên", "xuynh", "xuýt nữa", "xừ", "xử án", "xử bắn", "xử công khai", "xử đoán", "xử giảo", "xử hoà", "xử khuyết tịch", "xử kín", "xử lí", "xử lí thường vụ", "xử nhũn", "xử nữ", "xử phạt", "xử quyết", "xử sĩ", "xử tội", "xử vắng mặt", "xứ đạo", "xứ uỷ", "xưa nay", "xưa rày", "xức", "xực", "xưng", "xưng bá", "xưng đế", "xưng hùng", "xưng thần", "xưng tụng", "xưng vương", "xưng xuất", "xưng xưng", "xửng", "xửng cổ", "xửng vửng", "xứng", "xứng chức", "xứng đôi", "xứng hợp", "xứng vai", "xứng ý", "xước mang rô", "xược", "xười", "xười xĩnh", "xương bả vai", "xương bàn đạp", "xương bánh chè", "xương bò", "xương búa", "xương bướm", "xương chạc", "xương chày", "xương chẩm", "xương chêm", "xương cùng", "xương cụt", "xương đe", "xương đòn", "xương đùi", "xương ghe", "xương giăm", "xương gót", "xương hoá", "xương hom", "xương hông", "xương khô", "xương lưỡi hái", "xương ống", "xương sàng", "xương sên", "xương sọ", "xương thiêng", "xương thịnh", "xương thịt", "xương thóp", "xương thuyền", "xương trụ", "xương tuỷ", "xương ức", "xương vừng", "xương xảu", "xương xương", "xưởng máy", "xưởng thợ", "xưởng trưởng", "xướng âm", "xướng ca", "xướng hoạ", "xướng tên", "xướng tùy", "xướng xuất", "y án", "y bạ", "y bát", "y cơ", "y cụ", "y cựu", "y dược", "y gia", "y giới", "y hệt", "y hoá học", "y lệnh", "y lí", "y nguyện", "y nhiên", "y như", "y sinh", "y sư", "y tá trưởng", "y thường", "y trang", "y vật lí", "y vụ", "y xá", "ỷ lại", "ỷ quyền", "ỷ thế", "ý chí luận", "ý chừng", "ý dĩ", "ý giả", "ý hội", "ý hướng", "ý nguyện", "ý nhị", "ý thích", "ý thức hệ", "ý trung nhân", "ý tứ", "ý vận", "yểm bùa", "yểm trừ", "yếm khí", "yên ả", "yên ắng", "yên bình", "yên bướm", "yên chi", "yên cương", "yên giấc", "yên hà", "yên hàn", "yên hoa", "yên hưởng", "yên lành", "yên nghỉ", "yên phận", "yên sau", "yên tâm", "yên thân", "yên tĩnh", "yên ủi", "yên vị", "yên vui", "yến anh", "yến ẩm", "yến diên", "yến mạch", "yến oanh", "yến sào", "yểng", "yểng quạ", "yết hậu", "yêu đào", "yêu đời", "yêu đương", "yêu mến", "yêu người", "yêu nước", "yêu quái", "yêu quý", "yêu thích", "yêu thương", "yêu vì", "yêu yếu", "yểu tử", "yểu tướng", "yếu đau", "yếu địa", "yếu hèn", "yếu kém", "yếu lĩnh", "yếu mềm", "yếu ớt", "yếu sức", "yếu thế"];
exports.default = _default;
};

moduleFactories["node_modules/absol-vietnamese/tokenizeBySound.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vietnamese/tokenizeBySound.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = tokenizeBySound;

function tokenizeBySound(text) {
  var res = [];
  var rex = /([^,\s\.]+(((\.|\,)[^,\s\.]+))?)|([\,\.\s]+)/g;
  var matched = rex.exec(text);

  while (matched) {
    if (matched[1]) res.push({
      text: matched[0],
      type: 'miniword'
    });else res.push({
      text: matched[0],
      type: 'break'
    });
    matched = rex.exec(text);
  }

  return res;
}
};

moduleFactories["node_modules/absol-vietnamese/tokenizeByWord.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vietnamese/tokenizeByWord.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = tokenizeByWord;

var _tokenizeBySound = _interopRequireDefault(require("./tokenizeBySound"));


function subWord(tokens, i, l) {
  var res = '';
  var token;
  var end = i + l;

  while (i < end) {
    token = tokens[i];
    res += token.type == 'break' ? ' ' : token.text;
    ++i;
  }

  return res;
}

function breakWord(tokens, wordDict) {
  var res = [];
  var lastText;
  var token;
  var cText;
  var i = 0;

  while (i < tokens.length) {
    token = tokens[i];

    if (token.type == 'break') {
      res.push(token);
      ++i;
    } else {
      for (var l = Math.min(20, tokens.length - i); l > 0; --l) {
        lastText = subWord(tokens, i, l);

        if (l == 1 || wordDict[lastText] || wordDict[lastText.toLowerCase()]) {
          res.push({
            text: lastText,
            type: 'word'
          });
          i += l;
          break;
        }
      }
    }
  }

  return res;
}

function tokenizeByWord(text, wordDict) {
  if (wordDict instanceof Array) {
    wordDict = wordDict.reduce(function (ac, cr) {
      ac[cr] = true;
      return ac;
    }, {});
  }

  var tokens = (0, _tokenizeBySound.default)(text);
  return breakWord(tokens, wordDict);
}
};

moduleFactories["node_modules/absol-vietnamese/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vietnamese/dev.js ***/
"use strict";

var _CommonWords = _interopRequireDefault(require("./CommonWords"));

var _UncommonWords = _interopRequireDefault(require("./UncommonWords"));

var _RareWords = _interopRequireDefault(require("./RareWords"));

var _tokenizeByWord = _interopRequireDefault(require("./tokenizeByWord"));


var allWordDict = _CommonWords.default.concat(_UncommonWords.default).concat(_RareWords.default).reduce(function (ac, cr) {
  ac[cr] = true;
  return ac;
}, {});

var vietnamese = {
  RareWords: _RareWords.default,
  CommonWords: _CommonWords.default,
  UncommonWords: _UncommonWords.default,
  allWordDict: allWordDict,
  tokenizeByWord: function (text) {
    return (0, _tokenizeByWord.default)(text, allWordDict);
  }
};
window.absol = window.absol || {};
window.absol.vietnamese = vietnamese;
};

moduleFactories["node_modules/absol/src/polyfill.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/polyfill.js ***/
"use strict";

require("./Polyfill/polyfill");
};

moduleFactories["node_modules/absol-acomp/ACore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/ACore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$$ = exports.$ = exports._ = void 0;

require("./css/default.css");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var ACore = new _Dom.default({
  creator: Object.assign({}, _Dom.default.ShareInstance.creator)
});
var _ = ACore._;
exports._ = _;
var $ = ACore.$;
exports.$ = $;
var $$ = ACore.$$;
exports.$$ = $$;
var _default = ACore;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/adapter/MaterialDesignIconsAdapter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/adapter/MaterialDesignIconsAdapter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MaterialDesignIconsCode = exports.MaterialDesignIconsNameMap = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _ACore = _interopRequireDefault(require("../../ACore"));


/***
 * Old name to new name
 */
var MaterialDesignIconsNameMap = {
  'settings-outline': 'cog-outline',
  'contact-mail': 'card-account-mail'
};
exports.MaterialDesignIconsNameMap = MaterialDesignIconsNameMap;
var MaterialDesignIconsCode = {};
exports.MaterialDesignIconsCode = MaterialDesignIconsCode;

_Dom.default.documentReady.then(function () {
  //because of merge tool handled it
  return;
  var _ = _ACore.default._;

  var a = _({
    tag: 'span',
    class: ['mdi'],
    style: {
      display: 'none'
    }
  }).addTo(document.body);

  var content;
  var cssCodeLines = [];

  for (var oldName in MaterialDesignIconsNameMap) {
    a.addClass('mdi-' + MaterialDesignIconsNameMap[oldName]);
    content = getComputedStyle(a, '::before').content;
    MaterialDesignIconsCode[oldName] = content;
    cssCodeLines.push('.mdi-' + oldName + '::before{content:' + content + '}');
    a.removeClass('mdi-' + MaterialDesignIconsNameMap[oldName]);
  }

  a.remove();

  var styleElt = _({
    tag: 'style',
    props: {
      innerHTML: cssCodeLines.join('\n')
    }
  }).addTo(document.head);
});
};

moduleFactories["node_modules/absol-acomp/js/MultiLanguageCSS.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MultiLanguageCSS.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../ACore");

var counter = 30;

function makeCss(data) {
  var cssText = Object.keys(data).map(key => {
    return ['[data-ml-key=' + JSON.stringify(key) + ']::before {', '    content: ' + JSON.stringify(data[key]) + ';', '}'].join('\n');
  }).join('\n\n');
  (0, _ACore._)({
    tag: 'style',
    attr: {
      type: 'text/css'
    },
    props: {
      innerHTML: cssText
    }
  }).addTo(document.head);
}

var data = {
  txt_ok: 'OK',
  txt_cancel: 'Cancel',
  txt_close: 'Close',
  txt_option: 'Option',
  txt_check_all: 'Check All'
};
makeCss(data);
var overrideData = {};

function waitLanguage() {
  if (window['LanguageModule'] && window['LanguageModule'].data && window['LanguageModule'].data.length > 0) {
    var text;
    var newest = false;

    for (var key in data) {
      text = window['LanguageModule'].text(key);

      if (!text.startsWith('[key:') && text !== data[key]) {
        overrideData[key] = text;
        newest = true;
      }
    }

    if (newest) makeCss(overrideData);
  } else {
    if (counter--) setTimeout(waitLanguage, 400 + Math.floor(16000 / counter / counter));
  }
}

waitLanguage();
var _default = {};
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DebugTask.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DebugTask.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var originSetTimeout = setTimeout;
var originClearTimeout = clearTimeout;
var originSetInterval = setInterval;
var originClearInterval = clearInterval;
var pendingTimeout = 0;
var pendingInterval = 0;
var timeoutDict = {};
var intervalDict = {};

function DebugTask() {
  var res = _({
    class: 'absol-debug-task',
    child: [{
      child: [{
        tag: 'span',
        class: 'absol-debug-task-name',
        child: {
          text: 'settimeout '
        }
      }, {
        tag: 'span',
        class: ['absol-debug-task-value', 'settimeout'],
        child: {
          text: '0'
        }
      }]
    }, {
      child: [{
        tag: 'span',
        class: 'absol-debug-task-name',
        child: {
          text: 'setintervel '
        }
      }, {
        tag: 'span',
        class: ['absol-debug-task-value', 'setinterval'],
        child: {
          text: '0'
        }
      }]
    }, {
      child: [{
        tag: 'span',
        class: 'absol-debug-task-name',
        child: {
          text: 'Work '
        }
      }, {
        tag: 'span',
        class: ['absol-debug-task-value', 'work'],
        child: {
          text: '0%'
        }
      }]
    }]
  });

  res._timeout = 0;
  res._interval = 0;
  res._work = 0;
  res.$setTimeOutValue = $('.absol-debug-task-value.settimeout', res);
  res.$setIntervalValue = $('.absol-debug-task-value.setinterval', res);
  res.$setWorkValue = $('.absol-debug-task-value.work', res);
  return res;
}

DebugTask.property = {};
DebugTask.property.timeout = {
  set: function (value) {
    this._timeout = value;
    this.$setTimeOutValue.innerHTML = value + '';
  },
  get: function () {
    return this._timeout;
  }
};
DebugTask.property.interval = {
  set: function (value) {
    this._interval = value;
    this.$setIntervalValue.innerHTML = value + '';
  },
  get: function () {
    return this._interval;
  }
};
DebugTask.property.work = {
  set: function (value) {
    this._work = value;
    value = (value * 100).toFixed(1);
    this.$setWorkValue.innerHTML = value + '%';
  },
  get: function () {
    return this._work;
  }
};

DebugTask.start = function () {
  if (DebugTask.started) return;

  if (!DebugTask.$view) {
    DebugTask.$view = _('debugtask');
  }

  var times = [];
  originSetInterval(function () {
    var now = performance.now();

    while (times.length > 0 && times[0].end < now - 2000) {
      times.shift();
    }

    if (times.length == 0) DebugTask.$view.work = 0;
  }, 3000);

  global.setTimeout = function () {
    var args = Array.prototype.map.call(arguments, function (x) {
      return x;
    });
    var originCallback = arguments[0];
    if (typeof originCallback == 'undefined') return;

    if (typeof originCallback == 'string') {
      originCallback = new Function(originCallback);
    }

    args[0] = function () {
      var ret;

      try {
        var now = performance.now();

        while (times.length > 0 && times[0].end < now - 1000) {
          times.shift();
        }

        ret = originCallback.apply(null, arguments);
        var now1 = performance.now();
        var long = now1 - now;
        times.push({
          long: long,
          start: now,
          end: now1
        });
        var sTime = 0;

        for (var i = 0; i < times.length; ++i) {
          sTime += times[i].long;
        }

        DebugTask.$view.work = sTime / Math.max(now1 - times[0].start, 1000);
      } catch (e) {
        console.error(e);
      }

      if (timeoutDict[timeoutId]) {
        pendingTimeout--;
        delete timeoutDict[timeoutId];
        DebugTask.$view.timeout = pendingTimeout;
      }

      return ret;
    };

    var timeoutId = originSetTimeout.apply(global, args);
    pendingTimeout++;
    timeoutDict[timeoutId] = true;
    DebugTask.$view.timeout = pendingTimeout;
    return timeoutId;
  };

  global.clearTimeout = function (timeoutId) {
    if (timeoutDict[timeoutId]) {
      pendingTimeout--;
      delete timeoutDict[timeoutId];
      DebugTask.$view.timeout = pendingTimeout;
    }

    return originClearTimeout.apply(global, arguments);
  };

  global.setInterval = function () {
    var args = Array.prototype.map.call(arguments, function (x) {
      return x;
    });
    var originCallback = arguments[0];
    if (typeof originCallback == 'undefined') return;

    if (typeof originCallback == 'string') {
      originCallback = new Function(originCallback);
    }

    args[0] = function () {
      var ret;

      try {
        var now = performance.now();

        while (times.length > 0 && times[0].end < now - 1000) {
          times.shift();
        }

        ret = originCallback.apply(null, arguments);
        var now1 = performance.now();
        var long = now1 - now;
        times.push({
          long: long,
          start: now,
          end: now1
        });
        var sTime = 0;

        for (var i = 0; i < times.length; ++i) {
          sTime += times[i].long;
        }

        DebugTask.$view.work = sTime / Math.max(now1 - times[0].start, 1000);
      } catch (e) {
        console.error(e);
      }

      return ret;
    };

    var intervalId = originSetInterval.apply(global, args);
    pendingInterval++;
    intervalDict[intervalId] = true;
    DebugTask.$view.interval = pendingInterval;
    return intervalId;
  };

  global.clearInterval = function (intervalId) {
    var args = Array.prototype.map.call(arguments, function (x) {
      return x;
    });

    if (intervalDict[intervalId]) {
      pendingInterval--;
      delete intervalDict[intervalId];
      DebugTask.$view.interval = pendingInterval;
    }

    return originClearInterval.apply(global, args);
  };

  _Dom.default.documentReady.then(function () {
    DebugTask.$view.addTo(document.body);
  });
};

_ACore.default.install('debugtask', DebugTask);

var _default = DebugTask;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Draggable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Draggable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));


function Draggable(element) {
  if (!element) element = _ACore.default._('div');else _ACore.default.$(element);
  element.defineEvent(['predrag', 'drag', 'begindrag', 'enddrag']);

  var body = _ACore.default.$('body');

  var isMoving = false;
  var firstMove = false;
  var offsetX;
  var offsetY;
  var fontSize;
  var left0em, top0em, left0, top0;

  var finishMoving = function (event) {
    if (isMoving) {
      isMoving = false;
      body.off('mousemove', mouseMoveEventHandler);
      event.moveDX = event.clientX - offsetX;
      event.moveDY = event.clientY - offsetY;
      event.moveDXem = event.moveDX / fontSize;
      event.moveDYem = event.moveDY / fontSize;
      event.moveToX = left0 + event.moveDX;
      event.moveToY = top0 + event.moveDY;
      element.emit('enddrag', event);
    }
  };

  var mouseUpEventHandler = function (event) {
    finishMoving(event);
  };

  var mouseMoveEventHandler = function (event) {
    event.preventDefault();
    event.moveDX = event.clientX - offsetX;
    event.moveDY = event.clientY - offsetY;
    event.moveDXem = event.moveDX / fontSize;
    event.moveDYem = event.moveDY / fontSize;
    event.moveToX = left0 + event.moveDX;
    event.moveToY = top0 + event.moveDY;
    event.moveToXem = left0em + event.moveDXem;
    event.moveToYem = top0em + event.moveDYem;

    if (firstMove) {
      firstMove = false;
      element.emit('begindrag', event);
    }

    element.emit('drag', event);
  };

  var mouseOutEventHandler = function (event) {
    finishMoving(event);
  };

  var mouseDownEventHandler = function (event) {
    isMoving = true;
    firstMove = true;
    body.on('mousemove', mouseMoveEventHandler);
    body.once('mouseleave', mouseOutEventHandler);
    body.once('mouseup', mouseUpEventHandler);
    fontSize = this.getFontSize();
    offsetX = event.clientX;
    offsetY = event.clientY;
    left0 = parseFloat(element.getComputedStyleValue('left').replace('px', ''));
    top0 = parseFloat(element.getComputedStyleValue('top').replace('px', ''));
    left0em = left0 / fontSize;
    top0em = top0 / fontSize;
    event.x0 = left0;
    event.y0 = top0;
    event.y0em = left0em;
    event.y0em = top0em;
    element.emit('predrag', event);
  };

  element.on('mousedown', mouseDownEventHandler);
  return element;
}

;
var _default = Draggable;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/EmojiChars.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/EmojiChars.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var EmojiChars = [["Smileys & Emotion", [["face-smiling", [[["U+1F600"], "😀", "grinning face"], [["U+1F603"], "😃", "grinning face with big eyes"], [["U+1F604"], "😄", "grinning face with smiling eyes"], [["U+1F601"], "😁", "beaming face with smiling eyes"], [["U+1F606"], "😆", "grinning squinting face"], [["U+1F605"], "😅", "grinning face with sweat"], [["U+1F923"], "🤣", "rolling on the floor laughing"], [["U+1F602"], "😂", "face with tears of joy"], [["U+1F642"], "🙂", "slightly smiling face"], [["U+1F643"], "🙃", "upside-down face"], [["U+1F609"], "😉", "winking face"], [["U+1F60A"], "😊", "smiling face with smiling eyes"], [["U+1F607"], "😇", "smiling face with halo"]]], ["face-affection", [[["U+1F970"], "🥰", "smiling face with hearts"], [["U+1F60D"], "😍", "smiling face with heart-eyes"], [["U+1F929"], "🤩", "star-struck"], [["U+1F618"], "😘", "face blowing a kiss"], [["U+1F617"], "😗", "kissing face"], [["U+263A"], "☺", "smiling face"], [["U+1F61A"], "😚", "kissing face with closed eyes"], [["U+1F619"], "😙", "kissing face with smiling eyes"], [["U+1F972"], "🥲", "⊛ smiling face with tear"]]], ["face-tongue", [[["U+1F60B"], "😋", "face savoring food"], [["U+1F61B"], "😛", "face with tongue"], [["U+1F61C"], "😜", "winking face with tongue"], [["U+1F92A"], "🤪", "zany face"], [["U+1F61D"], "😝", "squinting face with tongue"], [["U+1F911"], "🤑", "money-mouth face"]]], ["face-hand", [[["U+1F917"], "🤗", "hugging face"], [["U+1F92D"], "🤭", "face with hand over mouth"], [["U+1F92B"], "🤫", "shushing face"], [["U+1F914"], "🤔", "thinking face"]]], ["face-neutral-skeptical", [[["U+1F910"], "🤐", "zipper-mouth face"], [["U+1F928"], "🤨", "face with raised eyebrow"], [["U+1F610"], "😐", "neutral face"], [["U+1F611"], "😑", "expressionless face"], [["U+1F636"], "😶", "face without mouth"], [["U+1F60F"], "😏", "smirking face"], [["U+1F612"], "😒", "unamused face"], [["U+1F644"], "🙄", "face with rolling eyes"], [["U+1F62C"], "😬", "grimacing face"], [["U+1F925"], "🤥", "lying face"]]], ["face-sleepy", [[["U+1F60C"], "😌", "relieved face"], [["U+1F614"], "😔", "pensive face"], [["U+1F62A"], "😪", "sleepy face"], [["U+1F924"], "🤤", "drooling face"], [["U+1F634"], "😴", "sleeping face"]]], ["face-unwell", [[["U+1F637"], "😷", "face with medical mask"], [["U+1F912"], "🤒", "face with thermometer"], [["U+1F915"], "🤕", "face with head-bandage"], [["U+1F922"], "🤢", "nauseated face"], [["U+1F92E"], "🤮", "face vomiting"], [["U+1F927"], "🤧", "sneezing face"], [["U+1F975"], "🥵", "hot face"], [["U+1F976"], "🥶", "cold face"], [["U+1F974"], "🥴", "woozy face"], [["U+1F635"], "😵", "dizzy face"], [["U+1F92F"], "🤯", "exploding head"]]], ["face-hat", [[["U+1F920"], "🤠", "cowboy hat face"], [["U+1F973"], "🥳", "partying face"], [["U+1F978"], "🥸", "⊛ disguised face"]]], ["face-glasses", [[["U+1F60E"], "😎", "smiling face with sunglasses"], [["U+1F913"], "🤓", "nerd face"], [["U+1F9D0"], "🧐", "face with monocle"]]], ["face-concerned", [[["U+1F615"], "😕", "confused face"], [["U+1F61F"], "😟", "worried face"], [["U+1F641"], "🙁", "slightly frowning face"], [["U+2639"], "☹", "frowning face"], [["U+1F62E"], "😮", "face with open mouth"], [["U+1F62F"], "😯", "hushed face"], [["U+1F632"], "😲", "astonished face"], [["U+1F633"], "😳", "flushed face"], [["U+1F97A"], "🥺", "pleading face"], [["U+1F626"], "😦", "frowning face with open mouth"], [["U+1F627"], "😧", "anguished face"], [["U+1F628"], "😨", "fearful face"], [["U+1F630"], "😰", "anxious face with sweat"], [["U+1F625"], "😥", "sad but relieved face"], [["U+1F622"], "😢", "crying face"], [["U+1F62D"], "😭", "loudly crying face"], [["U+1F631"], "😱", "face screaming in fear"], [["U+1F616"], "😖", "confounded face"], [["U+1F623"], "😣", "persevering face"], [["U+1F61E"], "😞", "disappointed face"], [["U+1F613"], "😓", "downcast face with sweat"], [["U+1F629"], "😩", "weary face"], [["U+1F62B"], "😫", "tired face"], [["U+1F971"], "🥱", "yawning face"]]], ["face-negative", [[["U+1F624"], "😤", "face with steam from nose"], [["U+1F621"], "😡", "pouting face"], [["U+1F620"], "😠", "angry face"], [["U+1F92C"], "🤬", "face with symbols on mouth"], [["U+1F608"], "😈", "smiling face with horns"], [["U+1F47F"], "👿", "angry face with horns"], [["U+1F480"], "💀", "skull"], [["U+2620"], "☠", "skull and crossbones"]]], ["face-costume", [[["U+1F4A9"], "💩", "pile of poo"], [["U+1F921"], "🤡", "clown face"], [["U+1F479"], "👹", "ogre"], [["U+1F47A"], "👺", "goblin"], [["U+1F47B"], "👻", "ghost"], [["U+1F47D"], "👽", "alien"], [["U+1F47E"], "👾", "alien monster"], [["U+1F916"], "🤖", "robot"]]], ["cat-face", [[["U+1F63A"], "😺", "grinning cat"], [["U+1F638"], "😸", "grinning cat with smiling eyes"], [["U+1F639"], "😹", "cat with tears of joy"], [["U+1F63B"], "😻", "smiling cat with heart-eyes"], [["U+1F63C"], "😼", "cat with wry smile"], [["U+1F63D"], "😽", "kissing cat"], [["U+1F640"], "🙀", "weary cat"], [["U+1F63F"], "😿", "crying cat"], [["U+1F63E"], "😾", "pouting cat"]]], ["monkey-face", [[["U+1F648"], "🙈", "see-no-evil monkey"], [["U+1F649"], "🙉", "hear-no-evil monkey"], [["U+1F64A"], "🙊", "speak-no-evil monkey"]]], ["emotion", [[["U+1F48B"], "💋", "kiss mark"], [["U+1F48C"], "💌", "love letter"], [["U+1F498"], "💘", "heart with arrow"], [["U+1F49D"], "💝", "heart with ribbon"], [["U+1F496"], "💖", "sparkling heart"], [["U+1F497"], "💗", "growing heart"], [["U+1F493"], "💓", "beating heart"], [["U+1F49E"], "💞", "revolving hearts"], [["U+1F495"], "💕", "two hearts"], [["U+1F49F"], "💟", "heart decoration"], [["U+2763"], "❣", "heart exclamation"], [["U+1F494"], "💔", "broken heart"], [["U+2764"], "❤", "red heart"], [["U+1F9E1"], "🧡", "orange heart"], [["U+1F49B"], "💛", "yellow heart"], [["U+1F49A"], "💚", "green heart"], [["U+1F499"], "💙", "blue heart"], [["U+1F49C"], "💜", "purple heart"], [["U+1F90E"], "🤎", "brown heart"], [["U+1F5A4"], "🖤", "black heart"], [["U+1F90D"], "🤍", "white heart"], [["U+1F4AF"], "💯", "hundred points"], [["U+1F4A2"], "💢", "anger symbol"], [["U+1F4A5"], "💥", "collision"], [["U+1F4AB"], "💫", "dizzy"], [["U+1F4A6"], "💦", "sweat droplets"], [["U+1F4A8"], "💨", "dashing away"], [["U+1F573"], "🕳", "hole"], [["U+1F4A3"], "💣", "bomb"], [["U+1F4AC"], "💬", "speech balloon"], [["U+1F441", "U+FE0F", "U+200D", "U+1F5E8", "U+FE0F"], "👁️‍🗨️", "eye in speech bubble"], [["U+1F5E8"], "🗨", "left speech bubble"], [["U+1F5EF"], "🗯", "right anger bubble"], [["U+1F4AD"], "💭", "thought balloon"], [["U+1F4A4"], "💤", "zzz"]]]]], ["People & Body", [["hand-fingers-open", [[["U+1F44B"], "👋", "waving hand"], [["U+1F91A"], "🤚", "raised back of hand"], [["U+1F590"], "🖐", "hand with fingers splayed"], [["U+270B"], "✋", "raised hand"], [["U+1F596"], "🖖", "vulcan salute"]]], ["hand-fingers-partial", [[["U+1F44C"], "👌", "OK hand"], [["U+1F90C"], "🤌", "⊛ pinched fingers"], [["U+1F90F"], "🤏", "pinching hand"], [["U+270C"], "✌", "victory hand"], [["U+1F91E"], "🤞", "crossed fingers"], [["U+1F91F"], "🤟", "love-you gesture"], [["U+1F918"], "🤘", "sign of the horns"], [["U+1F919"], "🤙", "call me hand"]]], ["hand-single-finger", [[["U+1F448"], "👈", "backhand index pointing left"], [["U+1F449"], "👉", "backhand index pointing right"], [["U+1F446"], "👆", "backhand index pointing up"], [["U+1F595"], "🖕", "middle finger"], [["U+1F447"], "👇", "backhand index pointing down"], [["U+261D"], "☝", "index pointing up"]]], ["hand-fingers-closed", [[["U+1F44D"], "👍", "thumbs up"], [["U+1F44E"], "👎", "thumbs down"], [["U+270A"], "✊", "raised fist"], [["U+1F44A"], "👊", "oncoming fist"], [["U+1F91B"], "🤛", "left-facing fist"], [["U+1F91C"], "🤜", "right-facing fist"]]], ["hands", [[["U+1F44F"], "👏", "clapping hands"], [["U+1F64C"], "🙌", "raising hands"], [["U+1F450"], "👐", "open hands"], [["U+1F932"], "🤲", "palms up together"], [["U+1F91D"], "🤝", "handshake"], [["U+1F64F"], "🙏", "folded hands"]]], ["hand-prop", [[["U+270D"], "✍", "writing hand"], [["U+1F485"], "💅", "nail polish"], [["U+1F933"], "🤳", "selfie"]]], ["body-parts", [[["U+1F4AA"], "💪", "flexed biceps"], [["U+1F9BE"], "🦾", "mechanical arm"], [["U+1F9BF"], "🦿", "mechanical leg"], [["U+1F9B5"], "🦵", "leg"], [["U+1F9B6"], "🦶", "foot"], [["U+1F442"], "👂", "ear"], [["U+1F9BB"], "🦻", "ear with hearing aid"], [["U+1F443"], "👃", "nose"], [["U+1F9E0"], "🧠", "brain"], [["U+1F9B7"], "🦷", "tooth"], [["U+1F9B4"], "🦴", "bone"], [["U+1F440"], "👀", "eyes"], [["U+1F441"], "👁", "eye"], [["U+1F445"], "👅", "tongue"], [["U+1F444"], "👄", "mouth"]]], ["person", [[["U+1F476"], "👶", "baby"], [["U+1F9D2"], "🧒", "child"], [["U+1F466"], "👦", "boy"], [["U+1F467"], "👧", "girl"], [["U+1F9D1"], "🧑", "person"], [["U+1F471"], "👱", "person: blond hair"], [["U+1F468"], "👨", "man"], [["U+1F9D4"], "🧔", "man: beard"], [["U+1F468", "U+200D", "U+1F9B0"], "👨‍🦰", "man: red hair"], [["U+1F468", "U+200D", "U+1F9B1"], "👨‍🦱", "man: curly hair"], [["U+1F468", "U+200D", "U+1F9B3"], "👨‍🦳", "man: white hair"], [["U+1F468", "U+200D", "U+1F9B2"], "👨‍🦲", "man: bald"], [["U+1F469"], "👩", "woman"], [["U+1F469", "U+200D", "U+1F9B0"], "👩‍🦰", "woman: red hair"], [["U+1F9D1", "U+200D", "U+1F9B0"], "🧑‍🦰", "person: red hair"], [["U+1F469", "U+200D", "U+1F9B1"], "👩‍🦱", "woman: curly hair"], [["U+1F9D1", "U+200D", "U+1F9B1"], "🧑‍🦱", "person: curly hair"], [["U+1F469", "U+200D", "U+1F9B3"], "👩‍🦳", "woman: white hair"], [["U+1F9D1", "U+200D", "U+1F9B3"], "🧑‍🦳", "person: white hair"], [["U+1F469", "U+200D", "U+1F9B2"], "👩‍🦲", "woman: bald"], [["U+1F9D1", "U+200D", "U+1F9B2"], "🧑‍🦲", "person: bald"], [["U+1F471", "U+200D", "U+2640", "U+FE0F"], "👱‍♀️", "woman: blond hair"], [["U+1F471", "U+200D", "U+2642", "U+FE0F"], "👱‍♂️", "man: blond hair"], [["U+1F9D3"], "🧓", "older person"], [["U+1F474"], "👴", "old man"], [["U+1F475"], "👵", "old woman"]]], ["person-gesture", [[["U+1F64D"], "🙍", "person frowning"], [["U+1F64D", "U+200D", "U+2642", "U+FE0F"], "🙍‍♂️", "man frowning"], [["U+1F64D", "U+200D", "U+2640", "U+FE0F"], "🙍‍♀️", "woman frowning"], [["U+1F64E"], "🙎", "person pouting"], [["U+1F64E", "U+200D", "U+2642", "U+FE0F"], "🙎‍♂️", "man pouting"], [["U+1F64E", "U+200D", "U+2640", "U+FE0F"], "🙎‍♀️", "woman pouting"], [["U+1F645"], "🙅", "person gesturing NO"], [["U+1F645", "U+200D", "U+2642", "U+FE0F"], "🙅‍♂️", "man gesturing NO"], [["U+1F645", "U+200D", "U+2640", "U+FE0F"], "🙅‍♀️", "woman gesturing NO"], [["U+1F646"], "🙆", "person gesturing OK"], [["U+1F646", "U+200D", "U+2642", "U+FE0F"], "🙆‍♂️", "man gesturing OK"], [["U+1F646", "U+200D", "U+2640", "U+FE0F"], "🙆‍♀️", "woman gesturing OK"], [["U+1F481"], "💁", "person tipping hand"], [["U+1F481", "U+200D", "U+2642", "U+FE0F"], "💁‍♂️", "man tipping hand"], [["U+1F481", "U+200D", "U+2640", "U+FE0F"], "💁‍♀️", "woman tipping hand"], [["U+1F64B"], "🙋", "person raising hand"], [["U+1F64B", "U+200D", "U+2642", "U+FE0F"], "🙋‍♂️", "man raising hand"], [["U+1F64B", "U+200D", "U+2640", "U+FE0F"], "🙋‍♀️", "woman raising hand"], [["U+1F9CF"], "🧏", "deaf person"], [["U+1F9CF", "U+200D", "U+2642", "U+FE0F"], "🧏‍♂️", "deaf man"], [["U+1F9CF", "U+200D", "U+2640", "U+FE0F"], "🧏‍♀️", "deaf woman"], [["U+1F647"], "🙇", "person bowing"], [["U+1F647", "U+200D", "U+2642", "U+FE0F"], "🙇‍♂️", "man bowing"], [["U+1F647", "U+200D", "U+2640", "U+FE0F"], "🙇‍♀️", "woman bowing"], [["U+1F926"], "🤦", "person facepalming"], [["U+1F926", "U+200D", "U+2642", "U+FE0F"], "🤦‍♂️", "man facepalming"], [["U+1F926", "U+200D", "U+2640", "U+FE0F"], "🤦‍♀️", "woman facepalming"], [["U+1F937"], "🤷", "person shrugging"], [["U+1F937", "U+200D", "U+2642", "U+FE0F"], "🤷‍♂️", "man shrugging"], [["U+1F937", "U+200D", "U+2640", "U+FE0F"], "🤷‍♀️", "woman shrugging"]]], ["person-role", [[["U+1F9D1", "U+200D", "U+2695", "U+FE0F"], "🧑‍⚕️", "health worker"], [["U+1F468", "U+200D", "U+2695", "U+FE0F"], "👨‍⚕️", "man health worker"], [["U+1F469", "U+200D", "U+2695", "U+FE0F"], "👩‍⚕️", "woman health worker"], [["U+1F9D1", "U+200D", "U+1F393"], "🧑‍🎓", "student"], [["U+1F468", "U+200D", "U+1F393"], "👨‍🎓", "man student"], [["U+1F469", "U+200D", "U+1F393"], "👩‍🎓", "woman student"], [["U+1F9D1", "U+200D", "U+1F3EB"], "🧑‍🏫", "teacher"], [["U+1F468", "U+200D", "U+1F3EB"], "👨‍🏫", "man teacher"], [["U+1F469", "U+200D", "U+1F3EB"], "👩‍🏫", "woman teacher"], [["U+1F9D1", "U+200D", "U+2696", "U+FE0F"], "🧑‍⚖️", "judge"], [["U+1F468", "U+200D", "U+2696", "U+FE0F"], "👨‍⚖️", "man judge"], [["U+1F469", "U+200D", "U+2696", "U+FE0F"], "👩‍⚖️", "woman judge"], [["U+1F9D1", "U+200D", "U+1F33E"], "🧑‍🌾", "farmer"], [["U+1F468", "U+200D", "U+1F33E"], "👨‍🌾", "man farmer"], [["U+1F469", "U+200D", "U+1F33E"], "👩‍🌾", "woman farmer"], [["U+1F9D1", "U+200D", "U+1F373"], "🧑‍🍳", "cook"], [["U+1F468", "U+200D", "U+1F373"], "👨‍🍳", "man cook"], [["U+1F469", "U+200D", "U+1F373"], "👩‍🍳", "woman cook"], [["U+1F9D1", "U+200D", "U+1F527"], "🧑‍🔧", "mechanic"], [["U+1F468", "U+200D", "U+1F527"], "👨‍🔧", "man mechanic"], [["U+1F469", "U+200D", "U+1F527"], "👩‍🔧", "woman mechanic"], [["U+1F9D1", "U+200D", "U+1F3ED"], "🧑‍🏭", "factory worker"], [["U+1F468", "U+200D", "U+1F3ED"], "👨‍🏭", "man factory worker"], [["U+1F469", "U+200D", "U+1F3ED"], "👩‍🏭", "woman factory worker"], [["U+1F9D1", "U+200D", "U+1F4BC"], "🧑‍💼", "office worker"], [["U+1F468", "U+200D", "U+1F4BC"], "👨‍💼", "man office worker"], [["U+1F469", "U+200D", "U+1F4BC"], "👩‍💼", "woman office worker"], [["U+1F9D1", "U+200D", "U+1F52C"], "🧑‍🔬", "scientist"], [["U+1F468", "U+200D", "U+1F52C"], "👨‍🔬", "man scientist"], [["U+1F469", "U+200D", "U+1F52C"], "👩‍🔬", "woman scientist"], [["U+1F9D1", "U+200D", "U+1F4BB"], "🧑‍💻", "technologist"], [["U+1F468", "U+200D", "U+1F4BB"], "👨‍💻", "man technologist"], [["U+1F469", "U+200D", "U+1F4BB"], "👩‍💻", "woman technologist"], [["U+1F9D1", "U+200D", "U+1F3A4"], "🧑‍🎤", "singer"], [["U+1F468", "U+200D", "U+1F3A4"], "👨‍🎤", "man singer"], [["U+1F469", "U+200D", "U+1F3A4"], "👩‍🎤", "woman singer"], [["U+1F9D1", "U+200D", "U+1F3A8"], "🧑‍🎨", "artist"], [["U+1F468", "U+200D", "U+1F3A8"], "👨‍🎨", "man artist"], [["U+1F469", "U+200D", "U+1F3A8"], "👩‍🎨", "woman artist"], [["U+1F9D1", "U+200D", "U+2708", "U+FE0F"], "🧑‍✈️", "pilot"], [["U+1F468", "U+200D", "U+2708", "U+FE0F"], "👨‍✈️", "man pilot"], [["U+1F469", "U+200D", "U+2708", "U+FE0F"], "👩‍✈️", "woman pilot"], [["U+1F9D1", "U+200D", "U+1F680"], "🧑‍🚀", "astronaut"], [["U+1F468", "U+200D", "U+1F680"], "👨‍🚀", "man astronaut"], [["U+1F469", "U+200D", "U+1F680"], "👩‍🚀", "woman astronaut"], [["U+1F9D1", "U+200D", "U+1F692"], "🧑‍🚒", "firefighter"], [["U+1F468", "U+200D", "U+1F692"], "👨‍🚒", "man firefighter"], [["U+1F469", "U+200D", "U+1F692"], "👩‍🚒", "woman firefighter"], [["U+1F46E"], "👮", "police officer"], [["U+1F46E", "U+200D", "U+2642", "U+FE0F"], "👮‍♂️", "man police officer"], [["U+1F46E", "U+200D", "U+2640", "U+FE0F"], "👮‍♀️", "woman police officer"], [["U+1F575"], "🕵", "detective"], [["U+1F575", "U+FE0F", "U+200D", "U+2642", "U+FE0F"], "🕵️‍♂️", "man detective"], [["U+1F575", "U+FE0F", "U+200D", "U+2640", "U+FE0F"], "🕵️‍♀️", "woman detective"], [["U+1F482"], "💂", "guard"], [["U+1F482", "U+200D", "U+2642", "U+FE0F"], "💂‍♂️", "man guard"], [["U+1F482", "U+200D", "U+2640", "U+FE0F"], "💂‍♀️", "woman guard"], [["U+1F977"], "🥷", "⊛ ninja"], [["U+1F477"], "👷", "construction worker"], [["U+1F477", "U+200D", "U+2642", "U+FE0F"], "👷‍♂️", "man construction worker"], [["U+1F477", "U+200D", "U+2640", "U+FE0F"], "👷‍♀️", "woman construction worker"], [["U+1F934"], "🤴", "prince"], [["U+1F478"], "👸", "princess"], [["U+1F473"], "👳", "person wearing turban"], [["U+1F473", "U+200D", "U+2642", "U+FE0F"], "👳‍♂️", "man wearing turban"], [["U+1F473", "U+200D", "U+2640", "U+FE0F"], "👳‍♀️", "woman wearing turban"], [["U+1F472"], "👲", "person with skullcap"], [["U+1F9D5"], "🧕", "woman with headscarf"], [["U+1F935"], "🤵", "person in tuxedo"], [["U+1F935", "U+200D", "U+2642", "U+FE0F"], "🤵‍♂️", "⊛ man in tuxedo"], [["U+1F935", "U+200D", "U+2640", "U+FE0F"], "🤵‍♀️", "⊛ woman in tuxedo"], [["U+1F470"], "👰", "person with veil"], [["U+1F930"], "🤰", "pregnant woman"], [["U+1F931"], "🤱", "breast-feeding"]]], ["person-fantasy", [[["U+1F47C"], "👼", "baby angel"], [["U+1F385"], "🎅", "Santa Claus"], [["U+1F936"], "🤶", "Mrs. Claus"], [["U+1F9B8"], "🦸", "superhero"], [["U+1F9B8", "U+200D", "U+2642", "U+FE0F"], "🦸‍♂️", "man superhero"], [["U+1F9B8", "U+200D", "U+2640", "U+FE0F"], "🦸‍♀️", "woman superhero"], [["U+1F9B9"], "🦹", "supervillain"], [["U+1F9B9", "U+200D", "U+2642", "U+FE0F"], "🦹‍♂️", "man supervillain"], [["U+1F9B9", "U+200D", "U+2640", "U+FE0F"], "🦹‍♀️", "woman supervillain"], [["U+1F9D9"], "🧙", "mage"], [["U+1F9D9", "U+200D", "U+2642", "U+FE0F"], "🧙‍♂️", "man mage"], [["U+1F9D9", "U+200D", "U+2640", "U+FE0F"], "🧙‍♀️", "woman mage"], [["U+1F9DA"], "🧚", "fairy"], [["U+1F9DA", "U+200D", "U+2642", "U+FE0F"], "🧚‍♂️", "man fairy"], [["U+1F9DA", "U+200D", "U+2640", "U+FE0F"], "🧚‍♀️", "woman fairy"], [["U+1F9DB"], "🧛", "vampire"], [["U+1F9DB", "U+200D", "U+2642", "U+FE0F"], "🧛‍♂️", "man vampire"], [["U+1F9DB", "U+200D", "U+2640", "U+FE0F"], "🧛‍♀️", "woman vampire"], [["U+1F9DC"], "🧜", "merperson"], [["U+1F9DC", "U+200D", "U+2642", "U+FE0F"], "🧜‍♂️", "merman"], [["U+1F9DC", "U+200D", "U+2640", "U+FE0F"], "🧜‍♀️", "mermaid"], [["U+1F9DD"], "🧝", "elf"], [["U+1F9DD", "U+200D", "U+2642", "U+FE0F"], "🧝‍♂️", "man elf"], [["U+1F9DD", "U+200D", "U+2640", "U+FE0F"], "🧝‍♀️", "woman elf"], [["U+1F9DE"], "🧞", "genie"], [["U+1F9DE", "U+200D", "U+2642", "U+FE0F"], "🧞‍♂️", "man genie"], [["U+1F9DE", "U+200D", "U+2640", "U+FE0F"], "🧞‍♀️", "woman genie"], [["U+1F9DF"], "🧟", "zombie"], [["U+1F9DF", "U+200D", "U+2642", "U+FE0F"], "🧟‍♂️", "man zombie"], [["U+1F9DF", "U+200D", "U+2640", "U+FE0F"], "🧟‍♀️", "woman zombie"]]], ["person-activity", [[["U+1F486"], "💆", "person getting massage"], [["U+1F486", "U+200D", "U+2642", "U+FE0F"], "💆‍♂️", "man getting massage"], [["U+1F486", "U+200D", "U+2640", "U+FE0F"], "💆‍♀️", "woman getting massage"], [["U+1F487"], "💇", "person getting haircut"], [["U+1F487", "U+200D", "U+2642", "U+FE0F"], "💇‍♂️", "man getting haircut"], [["U+1F487", "U+200D", "U+2640", "U+FE0F"], "💇‍♀️", "woman getting haircut"], [["U+1F6B6"], "🚶", "person walking"], [["U+1F6B6", "U+200D", "U+2642", "U+FE0F"], "🚶‍♂️", "man walking"], [["U+1F6B6", "U+200D", "U+2640", "U+FE0F"], "🚶‍♀️", "woman walking"], [["U+1F9CD"], "🧍", "person standing"], [["U+1F9CD", "U+200D", "U+2642", "U+FE0F"], "🧍‍♂️", "man standing"], [["U+1F9CD", "U+200D", "U+2640", "U+FE0F"], "🧍‍♀️", "woman standing"], [["U+1F9CE"], "🧎", "person kneeling"], [["U+1F9CE", "U+200D", "U+2642", "U+FE0F"], "🧎‍♂️", "man kneeling"], [["U+1F9CE", "U+200D", "U+2640", "U+FE0F"], "🧎‍♀️", "woman kneeling"], [["U+1F9D1", "U+200D", "U+1F9AF"], "🧑‍🦯", "person with white cane"], [["U+1F468", "U+200D", "U+1F9AF"], "👨‍🦯", "man with white cane"], [["U+1F469", "U+200D", "U+1F9AF"], "👩‍🦯", "woman with white cane"], [["U+1F9D1", "U+200D", "U+1F9BC"], "🧑‍🦼", "person in motorized wheelchair"], [["U+1F468", "U+200D", "U+1F9BC"], "👨‍🦼", "man in motorized wheelchair"], [["U+1F469", "U+200D", "U+1F9BC"], "👩‍🦼", "woman in motorized wheelchair"], [["U+1F9D1", "U+200D", "U+1F9BD"], "🧑‍🦽", "person in manual wheelchair"], [["U+1F468", "U+200D", "U+1F9BD"], "👨‍🦽", "man in manual wheelchair"], [["U+1F469", "U+200D", "U+1F9BD"], "👩‍🦽", "woman in manual wheelchair"], [["U+1F3C3"], "🏃", "person running"], [["U+1F3C3", "U+200D", "U+2642", "U+FE0F"], "🏃‍♂️", "man running"], [["U+1F3C3", "U+200D", "U+2640", "U+FE0F"], "🏃‍♀️", "woman running"], [["U+1F483"], "💃", "woman dancing"], [["U+1F57A"], "🕺", "man dancing"], [["U+1F574"], "🕴", "person in suit levitating"], [["U+1F46F"], "👯", "people with bunny ears"], [["U+1F46F", "U+200D", "U+2642", "U+FE0F"], "👯‍♂️", "men with bunny ears"], [["U+1F46F", "U+200D", "U+2640", "U+FE0F"], "👯‍♀️", "women with bunny ears"], [["U+1F9D6"], "🧖", "person in steamy room"], [["U+1F9D6", "U+200D", "U+2642", "U+FE0F"], "🧖‍♂️", "man in steamy room"], [["U+1F9D6", "U+200D", "U+2640", "U+FE0F"], "🧖‍♀️", "woman in steamy room"], [["U+1F9D7"], "🧗", "person climbing"], [["U+1F9D7", "U+200D", "U+2642", "U+FE0F"], "🧗‍♂️", "man climbing"], [["U+1F9D7", "U+200D", "U+2640", "U+FE0F"], "🧗‍♀️", "woman climbing"]]], ["person-sport", [[["U+1F93A"], "🤺", "person fencing"], [["U+1F3C7"], "🏇", "horse racing"], [["U+26F7"], "⛷", "skier"], [["U+1F3C2"], "🏂", "snowboarder"], [["U+1F3CC"], "🏌", "person golfing"], [["U+1F3CC", "U+FE0F", "U+200D", "U+2642", "U+FE0F"], "🏌️‍♂️", "man golfing"], [["U+1F3CC", "U+FE0F", "U+200D", "U+2640", "U+FE0F"], "🏌️‍♀️", "woman golfing"], [["U+1F3C4"], "🏄", "person surfing"], [["U+1F3C4", "U+200D", "U+2642", "U+FE0F"], "🏄‍♂️", "man surfing"], [["U+1F3C4", "U+200D", "U+2640", "U+FE0F"], "🏄‍♀️", "woman surfing"], [["U+1F6A3"], "🚣", "person rowing boat"], [["U+1F6A3", "U+200D", "U+2642", "U+FE0F"], "🚣‍♂️", "man rowing boat"], [["U+1F6A3", "U+200D", "U+2640", "U+FE0F"], "🚣‍♀️", "woman rowing boat"], [["U+1F3CA"], "🏊", "person swimming"], [["U+1F3CA", "U+200D", "U+2642", "U+FE0F"], "🏊‍♂️", "man swimming"], [["U+1F3CA", "U+200D", "U+2640", "U+FE0F"], "🏊‍♀️", "woman swimming"], [["U+26F9"], "⛹", "person bouncing ball"], [["U+26F9", "U+FE0F", "U+200D", "U+2642", "U+FE0F"], "⛹️‍♂️", "man bouncing ball"], [["U+26F9", "U+FE0F", "U+200D", "U+2640", "U+FE0F"], "⛹️‍♀️", "woman bouncing ball"], [["U+1F3CB"], "🏋", "person lifting weights"], [["U+1F3CB", "U+FE0F", "U+200D", "U+2642", "U+FE0F"], "🏋️‍♂️", "man lifting weights"], [["U+1F3CB", "U+FE0F", "U+200D", "U+2640", "U+FE0F"], "🏋️‍♀️", "woman lifting weights"], [["U+1F6B4"], "🚴", "person biking"], [["U+1F6B4", "U+200D", "U+2642", "U+FE0F"], "🚴‍♂️", "man biking"], [["U+1F6B4", "U+200D", "U+2640", "U+FE0F"], "🚴‍♀️", "woman biking"], [["U+1F6B5"], "🚵", "person mountain biking"], [["U+1F6B5", "U+200D", "U+2642", "U+FE0F"], "🚵‍♂️", "man mountain biking"], [["U+1F6B5", "U+200D", "U+2640", "U+FE0F"], "🚵‍♀️", "woman mountain biking"], [["U+1F938"], "🤸", "person cartwheeling"], [["U+1F938", "U+200D", "U+2642", "U+FE0F"], "🤸‍♂️", "man cartwheeling"], [["U+1F938", "U+200D", "U+2640", "U+FE0F"], "🤸‍♀️", "woman cartwheeling"], [["U+1F93C"], "🤼", "people wrestling"], [["U+1F93C", "U+200D", "U+2642", "U+FE0F"], "🤼‍♂️", "men wrestling"], [["U+1F93C", "U+200D", "U+2640", "U+FE0F"], "🤼‍♀️", "women wrestling"], [["U+1F93D"], "🤽", "person playing water polo"], [["U+1F93D", "U+200D", "U+2642", "U+FE0F"], "🤽‍♂️", "man playing water polo"], [["U+1F93D", "U+200D", "U+2640", "U+FE0F"], "🤽‍♀️", "woman playing water polo"], [["U+1F93E"], "🤾", "person playing handball"], [["U+1F93E", "U+200D", "U+2642", "U+FE0F"], "🤾‍♂️", "man playing handball"], [["U+1F93E", "U+200D", "U+2640", "U+FE0F"], "🤾‍♀️", "woman playing handball"], [["U+1F939"], "🤹", "person juggling"], [["U+1F939", "U+200D", "U+2642", "U+FE0F"], "🤹‍♂️", "man juggling"], [["U+1F939", "U+200D", "U+2640", "U+FE0F"], "🤹‍♀️", "woman juggling"]]], ["person-resting", [[["U+1F9D8"], "🧘", "person in lotus position"], [["U+1F9D8", "U+200D", "U+2642", "U+FE0F"], "🧘‍♂️", "man in lotus position"], [["U+1F9D8", "U+200D", "U+2640", "U+FE0F"], "🧘‍♀️", "woman in lotus position"], [["U+1F6C0"], "🛀", "person taking bath"], [["U+1F6CC"], "🛌", "person in bed"]]], ["family", [[["U+1F9D1", "U+200D", "U+1F91D", "U+200D", "U+1F9D1"], "🧑‍🤝‍🧑", "people holding hands"], [["U+1F46D"], "👭", "women holding hands"], [["U+1F46B"], "👫", "woman and man holding hands"], [["U+1F46C"], "👬", "men holding hands"], [["U+1F48F"], "💏", "kiss"], [["U+1F469", "U+200D", "U+2764", "U+FE0F", "U+200D", "U+1F48B", "U+200D", "U+1F468"], "👩‍❤️‍💋‍👨", "kiss: woman, man"], [["U+1F468", "U+200D", "U+2764", "U+FE0F", "U+200D", "U+1F48B", "U+200D", "U+1F468"], "👨‍❤️‍💋‍👨", "kiss: man, man"], [["U+1F469", "U+200D", "U+2764", "U+FE0F", "U+200D", "U+1F48B", "U+200D", "U+1F469"], "👩‍❤️‍💋‍👩", "kiss: woman, woman"], [["U+1F491"], "💑", "couple with heart"], [["U+1F469", "U+200D", "U+2764", "U+FE0F", "U+200D", "U+1F468"], "👩‍❤️‍👨", "couple with heart: woman, man"], [["U+1F468", "U+200D", "U+2764", "U+FE0F", "U+200D", "U+1F468"], "👨‍❤️‍👨", "couple with heart: man, man"], [["U+1F469", "U+200D", "U+2764", "U+FE0F", "U+200D", "U+1F469"], "👩‍❤️‍👩", "couple with heart: woman, woman"], [["U+1F46A"], "👪", "family"], [["U+1F468", "U+200D", "U+1F469", "U+200D", "U+1F466"], "👨‍👩‍👦", "family: man, woman, boy"], [["U+1F468", "U+200D", "U+1F469", "U+200D", "U+1F467"], "👨‍👩‍👧", "family: man, woman, girl"], [["U+1F468", "U+200D", "U+1F469", "U+200D", "U+1F467", "U+200D", "U+1F466"], "👨‍👩‍👧‍👦", "family: man, woman, girl, boy"], [["U+1F468", "U+200D", "U+1F469", "U+200D", "U+1F466", "U+200D", "U+1F466"], "👨‍👩‍👦‍👦", "family: man, woman, boy, boy"], [["U+1F468", "U+200D", "U+1F469", "U+200D", "U+1F467", "U+200D", "U+1F467"], "👨‍👩‍👧‍👧", "family: man, woman, girl, girl"], [["U+1F468", "U+200D", "U+1F468", "U+200D", "U+1F466"], "👨‍👨‍👦", "family: man, man, boy"], [["U+1F468", "U+200D", "U+1F468", "U+200D", "U+1F467"], "👨‍👨‍👧", "family: man, man, girl"], [["U+1F468", "U+200D", "U+1F468", "U+200D", "U+1F467", "U+200D", "U+1F466"], "👨‍👨‍👧‍👦", "family: man, man, girl, boy"], [["U+1F468", "U+200D", "U+1F468", "U+200D", "U+1F466", "U+200D", "U+1F466"], "👨‍👨‍👦‍👦", "family: man, man, boy, boy"], [["U+1F468", "U+200D", "U+1F468", "U+200D", "U+1F467", "U+200D", "U+1F467"], "👨‍👨‍👧‍👧", "family: man, man, girl, girl"], [["U+1F469", "U+200D", "U+1F469", "U+200D", "U+1F466"], "👩‍👩‍👦", "family: woman, woman, boy"], [["U+1F469", "U+200D", "U+1F469", "U+200D", "U+1F467"], "👩‍👩‍👧", "family: woman, woman, girl"], [["U+1F469", "U+200D", "U+1F469", "U+200D", "U+1F467", "U+200D", "U+1F466"], "👩‍👩‍👧‍👦", "family: woman, woman, girl, boy"], [["U+1F469", "U+200D", "U+1F469", "U+200D", "U+1F466", "U+200D", "U+1F466"], "👩‍👩‍👦‍👦", "family: woman, woman, boy, boy"], [["U+1F469", "U+200D", "U+1F469", "U+200D", "U+1F467", "U+200D", "U+1F467"], "👩‍👩‍👧‍👧", "family: woman, woman, girl, girl"], [["U+1F468", "U+200D", "U+1F466"], "👨‍👦", "family: man, boy"], [["U+1F468", "U+200D", "U+1F466", "U+200D", "U+1F466"], "👨‍👦‍👦", "family: man, boy, boy"], [["U+1F468", "U+200D", "U+1F467"], "👨‍👧", "family: man, girl"], [["U+1F468", "U+200D", "U+1F467", "U+200D", "U+1F466"], "👨‍👧‍👦", "family: man, girl, boy"], [["U+1F468", "U+200D", "U+1F467", "U+200D", "U+1F467"], "👨‍👧‍👧", "family: man, girl, girl"], [["U+1F469", "U+200D", "U+1F466"], "👩‍👦", "family: woman, boy"], [["U+1F469", "U+200D", "U+1F466", "U+200D", "U+1F466"], "👩‍👦‍👦", "family: woman, boy, boy"], [["U+1F469", "U+200D", "U+1F467"], "👩‍👧", "family: woman, girl"], [["U+1F469", "U+200D", "U+1F467", "U+200D", "U+1F466"], "👩‍👧‍👦", "family: woman, girl, boy"], [["U+1F469", "U+200D", "U+1F467", "U+200D", "U+1F467"], "👩‍👧‍👧", "family: woman, girl, girl"]]], ["person-symbol", [[["U+1F5E3"], "🗣", "speaking head"], [["U+1F464"], "👤", "bust in silhouette"], [["U+1F465"], "👥", "busts in silhouette"], [["U+1FAC2"], "🫂", "⊛ people hugging"], [["U+1F463"], "👣", "footprints"]]]]], ["Component", [["hair-style", [[["U+1F9B0"], "🦰", "red hair"], [["U+1F9B1"], "🦱", "curly hair"], [["U+1F9B3"], "🦳", "white hair"], [["U+1F9B2"], "🦲", "bald"]]]]], ["Animals & Nature", [["animal-mammal", [[["U+1F435"], "🐵", "monkey face"], [["U+1F412"], "🐒", "monkey"], [["U+1F98D"], "🦍", "gorilla"], [["U+1F9A7"], "🦧", "orangutan"], [["U+1F436"], "🐶", "dog face"], [["U+1F415"], "🐕", "dog"], [["U+1F9AE"], "🦮", "guide dog"], [["U+1F415", "U+200D", "U+1F9BA"], "🐕‍🦺", "service dog"], [["U+1F429"], "🐩", "poodle"], [["U+1F43A"], "🐺", "wolf"], [["U+1F98A"], "🦊", "fox"], [["U+1F99D"], "🦝", "raccoon"], [["U+1F431"], "🐱", "cat face"], [["U+1F408"], "🐈", "cat"], [["U+1F981"], "🦁", "lion"], [["U+1F42F"], "🐯", "tiger face"], [["U+1F405"], "🐅", "tiger"], [["U+1F406"], "🐆", "leopard"], [["U+1F434"], "🐴", "horse face"], [["U+1F40E"], "🐎", "horse"], [["U+1F984"], "🦄", "unicorn"], [["U+1F993"], "🦓", "zebra"], [["U+1F98C"], "🦌", "deer"], [["U+1F42E"], "🐮", "cow face"], [["U+1F402"], "🐂", "ox"], [["U+1F403"], "🐃", "water buffalo"], [["U+1F404"], "🐄", "cow"], [["U+1F437"], "🐷", "pig face"], [["U+1F416"], "🐖", "pig"], [["U+1F417"], "🐗", "boar"], [["U+1F43D"], "🐽", "pig nose"], [["U+1F40F"], "🐏", "ram"], [["U+1F411"], "🐑", "ewe"], [["U+1F410"], "🐐", "goat"], [["U+1F42A"], "🐪", "camel"], [["U+1F42B"], "🐫", "two-hump camel"], [["U+1F999"], "🦙", "llama"], [["U+1F992"], "🦒", "giraffe"], [["U+1F418"], "🐘", "elephant"], [["U+1F98F"], "🦏", "rhinoceros"], [["U+1F99B"], "🦛", "hippopotamus"], [["U+1F42D"], "🐭", "mouse face"], [["U+1F401"], "🐁", "mouse"], [["U+1F400"], "🐀", "rat"], [["U+1F439"], "🐹", "hamster"], [["U+1F430"], "🐰", "rabbit face"], [["U+1F407"], "🐇", "rabbit"], [["U+1F43F"], "🐿", "chipmunk"], [["U+1F994"], "🦔", "hedgehog"], [["U+1F987"], "🦇", "bat"], [["U+1F43B"], "🐻", "bear"], [["U+1F43B", "U+200D", "U+2744", "U+FE0F"], "🐻‍❄️", "⊛ polar bear"], [["U+1F428"], "🐨", "koala"], [["U+1F43C"], "🐼", "panda"], [["U+1F9A5"], "🦥", "sloth"], [["U+1F9A6"], "🦦", "otter"], [["U+1F9A8"], "🦨", "skunk"], [["U+1F998"], "🦘", "kangaroo"], [["U+1F9A1"], "🦡", "badger"], [["U+1F43E"], "🐾", "paw prints"]]], ["animal-bird", [[["U+1F983"], "🦃", "turkey"], [["U+1F414"], "🐔", "chicken"], [["U+1F413"], "🐓", "rooster"], [["U+1F423"], "🐣", "hatching chick"], [["U+1F424"], "🐤", "baby chick"], [["U+1F425"], "🐥", "front-facing baby chick"], [["U+1F426"], "🐦", "bird"], [["U+1F427"], "🐧", "penguin"], [["U+1F54A"], "🕊", "dove"], [["U+1F985"], "🦅", "eagle"], [["U+1F986"], "🦆", "duck"], [["U+1F9A2"], "🦢", "swan"], [["U+1F989"], "🦉", "owl"], [["U+1FAB6"], "🪶", "⊛ feather"], [["U+1F9A9"], "🦩", "flamingo"], [["U+1F99A"], "🦚", "peacock"], [["U+1F99C"], "🦜", "parrot"]]], ["animal-amphibian", [[["U+1F438"], "🐸", "frog"]]], ["animal-reptile", [[["U+1F40A"], "🐊", "crocodile"], [["U+1F422"], "🐢", "turtle"], [["U+1F98E"], "🦎", "lizard"], [["U+1F40D"], "🐍", "snake"], [["U+1F432"], "🐲", "dragon face"], [["U+1F409"], "🐉", "dragon"], [["U+1F995"], "🦕", "sauropod"], [["U+1F996"], "🦖", "T-Rex"]]], ["animal-marine", [[["U+1F433"], "🐳", "spouting whale"], [["U+1F40B"], "🐋", "whale"], [["U+1F42C"], "🐬", "dolphin"], [["U+1F41F"], "🐟", "fish"], [["U+1F420"], "🐠", "tropical fish"], [["U+1F421"], "🐡", "blowfish"], [["U+1F988"], "🦈", "shark"], [["U+1F419"], "🐙", "octopus"], [["U+1F41A"], "🐚", "spiral shell"]]], ["animal-bug", [[["U+1F40C"], "🐌", "snail"], [["U+1F98B"], "🦋", "butterfly"], [["U+1F41B"], "🐛", "bug"], [["U+1F41C"], "🐜", "ant"], [["U+1F41D"], "🐝", "honeybee"], [["U+1F41E"], "🐞", "lady beetle"], [["U+1F997"], "🦗", "cricket"], [["U+1F577"], "🕷", "spider"], [["U+1F578"], "🕸", "spider web"], [["U+1F982"], "🦂", "scorpion"], [["U+1F99F"], "🦟", "mosquito"], [["U+1F9A0"], "🦠", "microbe"]]], ["plant-flower", [[["U+1F490"], "💐", "bouquet"], [["U+1F338"], "🌸", "cherry blossom"], [["U+1F4AE"], "💮", "white flower"], [["U+1F3F5"], "🏵", "rosette"], [["U+1F339"], "🌹", "rose"], [["U+1F940"], "🥀", "wilted flower"], [["U+1F33A"], "🌺", "hibiscus"], [["U+1F33B"], "🌻", "sunflower"], [["U+1F33C"], "🌼", "blossom"], [["U+1F337"], "🌷", "tulip"]]], ["plant-other", [[["U+1F331"], "🌱", "seedling"], [["U+1FAB4"], "🪴", "⊛ potted plant"], [["U+1F332"], "🌲", "evergreen tree"], [["U+1F333"], "🌳", "deciduous tree"], [["U+1F334"], "🌴", "palm tree"], [["U+1F335"], "🌵", "cactus"], [["U+1F33E"], "🌾", "sheaf of rice"], [["U+1F33F"], "🌿", "herb"], [["U+2618"], "☘", "shamrock"], [["U+1F340"], "🍀", "four leaf clover"], [["U+1F341"], "🍁", "maple leaf"], [["U+1F342"], "🍂", "fallen leaf"], [["U+1F343"], "🍃", "leaf fluttering in wind"]]]]], ["Food & Drink", [["food-fruit", [[["U+1F347"], "🍇", "grapes"], [["U+1F348"], "🍈", "melon"], [["U+1F349"], "🍉", "watermelon"], [["U+1F34A"], "🍊", "tangerine"], [["U+1F34B"], "🍋", "lemon"], [["U+1F34C"], "🍌", "banana"], [["U+1F34D"], "🍍", "pineapple"], [["U+1F96D"], "🥭", "mango"], [["U+1F34E"], "🍎", "red apple"], [["U+1F34F"], "🍏", "green apple"], [["U+1F350"], "🍐", "pear"], [["U+1F351"], "🍑", "peach"], [["U+1F352"], "🍒", "cherries"], [["U+1F353"], "🍓", "strawberry"], [["U+1FAD0"], "🫐", "⊛ blueberries"], [["U+1F95D"], "🥝", "kiwi fruit"], [["U+1F345"], "🍅", "tomato"], [["U+1FAD2"], "🫒", "⊛ olive"], [["U+1F965"], "🥥", "coconut"]]], ["food-vegetable", [[["U+1F951"], "🥑", "avocado"], [["U+1F346"], "🍆", "eggplant"], [["U+1F954"], "🥔", "potato"], [["U+1F955"], "🥕", "carrot"], [["U+1F33D"], "🌽", "ear of corn"], [["U+1F336"], "🌶", "hot pepper"], [["U+1F952"], "🥒", "cucumber"], [["U+1F96C"], "🥬", "leafy green"], [["U+1F966"], "🥦", "broccoli"], [["U+1F9C4"], "🧄", "garlic"], [["U+1F9C5"], "🧅", "onion"], [["U+1F344"], "🍄", "mushroom"], [["U+1F95C"], "🥜", "peanuts"], [["U+1F330"], "🌰", "chestnut"]]], ["food-prepared", [[["U+1F35E"], "🍞", "bread"], [["U+1F950"], "🥐", "croissant"], [["U+1F956"], "🥖", "baguette bread"], [["U+1FAD3"], "🫓", "⊛ flatbread"], [["U+1F968"], "🥨", "pretzel"], [["U+1F96F"], "🥯", "bagel"], [["U+1F95E"], "🥞", "pancakes"], [["U+1F9C7"], "🧇", "waffle"], [["U+1F9C0"], "🧀", "cheese wedge"], [["U+1F356"], "🍖", "meat on bone"], [["U+1F357"], "🍗", "poultry leg"], [["U+1F969"], "🥩", "cut of meat"], [["U+1F953"], "🥓", "bacon"], [["U+1F354"], "🍔", "hamburger"], [["U+1F35F"], "🍟", "french fries"], [["U+1F355"], "🍕", "pizza"], [["U+1F32D"], "🌭", "hot dog"], [["U+1F96A"], "🥪", "sandwich"], [["U+1F32E"], "🌮", "taco"], [["U+1F32F"], "🌯", "burrito"], [["U+1FAD4"], "🫔", "⊛ tamale"], [["U+1F959"], "🥙", "stuffed flatbread"], [["U+1F9C6"], "🧆", "falafel"], [["U+1F95A"], "🥚", "egg"], [["U+1F373"], "🍳", "cooking"], [["U+1F958"], "🥘", "shallow pan of food"], [["U+1F372"], "🍲", "pot of food"], [["U+1FAD5"], "🫕", "⊛ fondue"], [["U+1F963"], "🥣", "bowl with spoon"], [["U+1F957"], "🥗", "green salad"], [["U+1F37F"], "🍿", "popcorn"], [["U+1F9C8"], "🧈", "butter"], [["U+1F9C2"], "🧂", "salt"], [["U+1F96B"], "🥫", "canned food"]]], ["food-asian", [[["U+1F371"], "🍱", "bento box"], [["U+1F358"], "🍘", "rice cracker"], [["U+1F359"], "🍙", "rice ball"], [["U+1F35A"], "🍚", "cooked rice"], [["U+1F35B"], "🍛", "curry rice"], [["U+1F35C"], "🍜", "steaming bowl"], [["U+1F35D"], "🍝", "spaghetti"], [["U+1F360"], "🍠", "roasted sweet potato"], [["U+1F362"], "🍢", "oden"], [["U+1F363"], "🍣", "sushi"], [["U+1F364"], "🍤", "fried shrimp"], [["U+1F365"], "🍥", "fish cake with swirl"], [["U+1F96E"], "🥮", "moon cake"], [["U+1F361"], "🍡", "dango"], [["U+1F95F"], "🥟", "dumpling"], [["U+1F960"], "🥠", "fortune cookie"], [["U+1F961"], "🥡", "takeout box"]]], ["food-marine", [[["U+1F980"], "🦀", "crab"], [["U+1F99E"], "🦞", "lobster"], [["U+1F990"], "🦐", "shrimp"], [["U+1F991"], "🦑", "squid"], [["U+1F9AA"], "🦪", "oyster"]]], ["food-sweet", [[["U+1F366"], "🍦", "soft ice cream"], [["U+1F367"], "🍧", "shaved ice"], [["U+1F368"], "🍨", "ice cream"], [["U+1F369"], "🍩", "doughnut"], [["U+1F36A"], "🍪", "cookie"], [["U+1F382"], "🎂", "birthday cake"], [["U+1F370"], "🍰", "shortcake"], [["U+1F9C1"], "🧁", "cupcake"], [["U+1F967"], "🥧", "pie"], [["U+1F36B"], "🍫", "chocolate bar"], [["U+1F36C"], "🍬", "candy"], [["U+1F36D"], "🍭", "lollipop"], [["U+1F36E"], "🍮", "custard"], [["U+1F36F"], "🍯", "honey pot"]]], ["drink", [[["U+1F37C"], "🍼", "baby bottle"], [["U+1F95B"], "🥛", "glass of milk"], [["U+2615"], "☕", "hot beverage"], [["U+1F375"], "🍵", "teacup without handle"], [["U+1F376"], "🍶", "sake"], [["U+1F37E"], "🍾", "bottle with popping cork"], [["U+1F377"], "🍷", "wine glass"], [["U+1F378"], "🍸", "cocktail glass"], [["U+1F379"], "🍹", "tropical drink"], [["U+1F37A"], "🍺", "beer mug"], [["U+1F37B"], "🍻", "clinking beer mugs"], [["U+1F942"], "🥂", "clinking glasses"], [["U+1F943"], "🥃", "tumbler glass"], [["U+1F964"], "🥤", "cup with straw"], [["U+1F9CB"], "🧋", "⊛ bubble tea"], [["U+1F9C3"], "🧃", "beverage box"], [["U+1F9C9"], "🧉", "mate"], [["U+1F9CA"], "🧊", "ice"]]], ["dishware", [[["U+1F962"], "🥢", "chopsticks"], [["U+1F37D"], "🍽", "fork and knife with plate"], [["U+1F374"], "🍴", "fork and knife"], [["U+1F944"], "🥄", "spoon"], [["U+1F52A"], "🔪", "kitchen knife"], [["U+1F3FA"], "🏺", "amphora"]]]]], ["Travel & Places", [["place-map", [[["U+1F30D"], "🌍", "globe showing Europe-Africa"], [["U+1F30E"], "🌎", "globe showing Americas"], [["U+1F30F"], "🌏", "globe showing Asia-Australia"], [["U+1F310"], "🌐", "globe with meridians"], [["U+1F5FA"], "🗺", "world map"], [["U+1F5FE"], "🗾", "map of Japan"], [["U+1F9ED"], "🧭", "compass"]]], ["place-geographic", [[["U+1F3D4"], "🏔", "snow-capped mountain"], [["U+26F0"], "⛰", "mountain"], [["U+1F30B"], "🌋", "volcano"], [["U+1F5FB"], "🗻", "mount fuji"], [["U+1F3D5"], "🏕", "camping"], [["U+1F3D6"], "🏖", "beach with umbrella"], [["U+1F3DC"], "🏜", "desert"], [["U+1F3DD"], "🏝", "desert island"], [["U+1F3DE"], "🏞", "national park"]]], ["place-building", [[["U+1F3DF"], "🏟", "stadium"], [["U+1F3DB"], "🏛", "classical building"], [["U+1F3D7"], "🏗", "building construction"], [["U+1F9F1"], "🧱", "brick"], [["U+1FAA8"], "🪨", "⊛ rock"], [["U+1FAB5"], "🪵", "⊛ wood"], [["U+1F3D8"], "🏘", "houses"], [["U+1F3DA"], "🏚", "derelict house"], [["U+1F3E0"], "🏠", "house"], [["U+1F3E1"], "🏡", "house with garden"], [["U+1F3E2"], "🏢", "office building"], [["U+1F3E3"], "🏣", "Japanese post office"], [["U+1F3E4"], "🏤", "post office"], [["U+1F3E5"], "🏥", "hospital"], [["U+1F3E6"], "🏦", "bank"], [["U+1F3E8"], "🏨", "hotel"], [["U+1F3E9"], "🏩", "love hotel"], [["U+1F3EA"], "🏪", "convenience store"], [["U+1F3EB"], "🏫", "school"], [["U+1F3EC"], "🏬", "department store"], [["U+1F3ED"], "🏭", "factory"], [["U+1F3EF"], "🏯", "Japanese castle"], [["U+1F3F0"], "🏰", "castle"], [["U+1F492"], "💒", "wedding"], [["U+1F5FC"], "🗼", "Tokyo tower"], [["U+1F5FD"], "🗽", "Statue of Liberty"]]], ["place-religious", [[["U+26EA"], "⛪", "church"], [["U+1F54C"], "🕌", "mosque"], [["U+1F6D5"], "🛕", "hindu temple"], [["U+1F54D"], "🕍", "synagogue"], [["U+26E9"], "⛩", "shinto shrine"], [["U+1F54B"], "🕋", "kaaba"]]], ["place-other", [[["U+26F2"], "⛲", "fountain"], [["U+26FA"], "⛺", "tent"], [["U+1F301"], "🌁", "foggy"], [["U+1F303"], "🌃", "night with stars"], [["U+1F3D9"], "🏙", "cityscape"], [["U+1F304"], "🌄", "sunrise over mountains"], [["U+1F305"], "🌅", "sunrise"], [["U+1F306"], "🌆", "cityscape at dusk"], [["U+1F307"], "🌇", "sunset"], [["U+1F309"], "🌉", "bridge at night"], [["U+2668"], "♨", "hot springs"], [["U+1F3A0"], "🎠", "carousel horse"], [["U+1F3A1"], "🎡", "ferris wheel"], [["U+1F3A2"], "🎢", "roller coaster"], [["U+1F488"], "💈", "barber pole"], [["U+1F3AA"], "🎪", "circus tent"]]], ["transport-ground", [[["U+1F682"], "🚂", "locomotive"], [["U+1F683"], "🚃", "railway car"], [["U+1F684"], "🚄", "high-speed train"], [["U+1F685"], "🚅", "bullet train"], [["U+1F686"], "🚆", "train"], [["U+1F687"], "🚇", "metro"], [["U+1F688"], "🚈", "light rail"], [["U+1F689"], "🚉", "station"], [["U+1F68A"], "🚊", "tram"], [["U+1F69D"], "🚝", "monorail"], [["U+1F69E"], "🚞", "mountain railway"], [["U+1F68B"], "🚋", "tram car"], [["U+1F68C"], "🚌", "bus"], [["U+1F68D"], "🚍", "oncoming bus"], [["U+1F68E"], "🚎", "trolleybus"], [["U+1F690"], "🚐", "minibus"], [["U+1F691"], "🚑", "ambulance"], [["U+1F692"], "🚒", "fire engine"], [["U+1F693"], "🚓", "police car"], [["U+1F694"], "🚔", "oncoming police car"], [["U+1F695"], "🚕", "taxi"], [["U+1F696"], "🚖", "oncoming taxi"], [["U+1F697"], "🚗", "automobile"], [["U+1F698"], "🚘", "oncoming automobile"], [["U+1F699"], "🚙", "sport utility vehicle"], [["U+1F69A"], "🚚", "delivery truck"], [["U+1F69B"], "🚛", "articulated lorry"], [["U+1F69C"], "🚜", "tractor"], [["U+1F3CE"], "🏎", "racing car"], [["U+1F3CD"], "🏍", "motorcycle"], [["U+1F6F5"], "🛵", "motor scooter"], [["U+1F9BD"], "🦽", "manual wheelchair"], [["U+1F9BC"], "🦼", "motorized wheelchair"], [["U+1F6FA"], "🛺", "auto rickshaw"], [["U+1F6B2"], "🚲", "bicycle"], [["U+1F6F4"], "🛴", "kick scooter"], [["U+1F6F9"], "🛹", "skateboard"], [["U+1F6FC"], "🛼", "⊛ roller skate"], [["U+1F68F"], "🚏", "bus stop"], [["U+1F6E3"], "🛣", "motorway"], [["U+1F6E4"], "🛤", "railway track"], [["U+1F6E2"], "🛢", "oil drum"], [["U+26FD"], "⛽", "fuel pump"], [["U+1F6A8"], "🚨", "police car light"], [["U+1F6A5"], "🚥", "horizontal traffic light"], [["U+1F6A6"], "🚦", "vertical traffic light"], [["U+1F6D1"], "🛑", "stop sign"], [["U+1F6A7"], "🚧", "construction"]]], ["transport-water", [[["U+2693"], "⚓", "anchor"], [["U+26F5"], "⛵", "sailboat"], [["U+1F6F6"], "🛶", "canoe"], [["U+1F6A4"], "🚤", "speedboat"], [["U+1F6F3"], "🛳", "passenger ship"], [["U+26F4"], "⛴", "ferry"], [["U+1F6E5"], "🛥", "motor boat"], [["U+1F6A2"], "🚢", "ship"]]], ["transport-air", [[["U+2708"], "✈", "airplane"], [["U+1F6E9"], "🛩", "small airplane"], [["U+1F6EB"], "🛫", "airplane departure"], [["U+1F6EC"], "🛬", "airplane arrival"], [["U+1FA82"], "🪂", "parachute"], [["U+1F4BA"], "💺", "seat"], [["U+1F681"], "🚁", "helicopter"], [["U+1F69F"], "🚟", "suspension railway"], [["U+1F6A0"], "🚠", "mountain cableway"], [["U+1F6A1"], "🚡", "aerial tramway"], [["U+1F6F0"], "🛰", "satellite"], [["U+1F680"], "🚀", "rocket"], [["U+1F6F8"], "🛸", "flying saucer"]]], ["hotel", [[["U+1F6CE"], "🛎", "bellhop bell"], [["U+1F9F3"], "🧳", "luggage"]]], ["time", [[["U+231B"], "⌛", "hourglass done"], [["U+23F3"], "⏳", "hourglass not done"], [["U+231A"], "⌚", "watch"], [["U+23F0"], "⏰", "alarm clock"], [["U+23F1"], "⏱", "stopwatch"], [["U+23F2"], "⏲", "timer clock"], [["U+1F570"], "🕰", "mantelpiece clock"], [["U+1F55B"], "🕛", "twelve o’clock"], [["U+1F567"], "🕧", "twelve-thirty"], [["U+1F550"], "🕐", "one o’clock"], [["U+1F55C"], "🕜", "one-thirty"], [["U+1F551"], "🕑", "two o’clock"], [["U+1F55D"], "🕝", "two-thirty"], [["U+1F552"], "🕒", "three o’clock"], [["U+1F55E"], "🕞", "three-thirty"], [["U+1F553"], "🕓", "four o’clock"], [["U+1F55F"], "🕟", "four-thirty"], [["U+1F554"], "🕔", "five o’clock"], [["U+1F560"], "🕠", "five-thirty"], [["U+1F555"], "🕕", "six o’clock"], [["U+1F561"], "🕡", "six-thirty"], [["U+1F556"], "🕖", "seven o’clock"], [["U+1F562"], "🕢", "seven-thirty"], [["U+1F557"], "🕗", "eight o’clock"], [["U+1F563"], "🕣", "eight-thirty"], [["U+1F558"], "🕘", "nine o’clock"], [["U+1F564"], "🕤", "nine-thirty"], [["U+1F559"], "🕙", "ten o’clock"], [["U+1F565"], "🕥", "ten-thirty"], [["U+1F55A"], "🕚", "eleven o’clock"], [["U+1F566"], "🕦", "eleven-thirty"]]], ["sky & weather", [[["U+1F311"], "🌑", "new moon"], [["U+1F312"], "🌒", "waxing crescent moon"], [["U+1F313"], "🌓", "first quarter moon"], [["U+1F314"], "🌔", "waxing gibbous moon"], [["U+1F315"], "🌕", "full moon"], [["U+1F316"], "🌖", "waning gibbous moon"], [["U+1F317"], "🌗", "last quarter moon"], [["U+1F318"], "🌘", "waning crescent moon"], [["U+1F319"], "🌙", "crescent moon"], [["U+1F31A"], "🌚", "new moon face"], [["U+1F31B"], "🌛", "first quarter moon face"], [["U+1F31C"], "🌜", "last quarter moon face"], [["U+1F321"], "🌡", "thermometer"], [["U+2600"], "☀", "sun"], [["U+1F31D"], "🌝", "full moon face"], [["U+1F31E"], "🌞", "sun with face"], [["U+1FA90"], "🪐", "ringed planet"], [["U+2B50"], "⭐", "star"], [["U+1F31F"], "🌟", "glowing star"], [["U+1F320"], "🌠", "shooting star"], [["U+1F30C"], "🌌", "milky way"], [["U+2601"], "☁", "cloud"], [["U+26C5"], "⛅", "sun behind cloud"], [["U+26C8"], "⛈", "cloud with lightning and rain"], [["U+1F324"], "🌤", "sun behind small cloud"], [["U+1F325"], "🌥", "sun behind large cloud"], [["U+1F326"], "🌦", "sun behind rain cloud"], [["U+1F327"], "🌧", "cloud with rain"], [["U+1F328"], "🌨", "cloud with snow"], [["U+1F329"], "🌩", "cloud with lightning"], [["U+1F32A"], "🌪", "tornado"], [["U+1F32B"], "🌫", "fog"], [["U+1F32C"], "🌬", "wind face"], [["U+1F300"], "🌀", "cyclone"], [["U+1F308"], "🌈", "rainbow"], [["U+1F302"], "🌂", "closed umbrella"], [["U+2602"], "☂", "umbrella"], [["U+2614"], "☔", "umbrella with rain drops"], [["U+26F1"], "⛱", "umbrella on ground"], [["U+26A1"], "⚡", "high voltage"], [["U+2744"], "❄", "snowflake"], [["U+2603"], "☃", "snowman"], [["U+26C4"], "⛄", "snowman without snow"], [["U+2604"], "☄", "comet"], [["U+1F525"], "🔥", "fire"], [["U+1F4A7"], "💧", "droplet"], [["U+1F30A"], "🌊", "water wave"]]]]], ["Activities", [["event", [[["U+1F383"], "🎃", "jack-o-lantern"], [["U+1F384"], "🎄", "Christmas tree"], [["U+1F386"], "🎆", "fireworks"], [["U+1F387"], "🎇", "sparkler"], [["U+1F9E8"], "🧨", "firecracker"], [["U+2728"], "✨", "sparkles"], [["U+1F388"], "🎈", "balloon"], [["U+1F389"], "🎉", "party popper"], [["U+1F38A"], "🎊", "confetti ball"], [["U+1F38B"], "🎋", "tanabata tree"], [["U+1F38D"], "🎍", "pine decoration"], [["U+1F38E"], "🎎", "Japanese dolls"], [["U+1F38F"], "🎏", "carp streamer"], [["U+1F390"], "🎐", "wind chime"], [["U+1F391"], "🎑", "moon viewing ceremony"], [["U+1F9E7"], "🧧", "red envelope"], [["U+1F380"], "🎀", "ribbon"], [["U+1F381"], "🎁", "wrapped gift"], [["U+1F397"], "🎗", "reminder ribbon"], [["U+1F39F"], "🎟", "admission tickets"], [["U+1F3AB"], "🎫", "ticket"]]], ["award-medal", [[["U+1F396"], "🎖", "military medal"], [["U+1F3C6"], "🏆", "trophy"], [["U+1F3C5"], "🏅", "sports medal"], [["U+1F947"], "🥇", "1st place medal"], [["U+1F948"], "🥈", "2nd place medal"], [["U+1F949"], "🥉", "3rd place medal"]]], ["sport", [[["U+26BD"], "⚽", "soccer ball"], [["U+26BE"], "⚾", "baseball"], [["U+1F94E"], "🥎", "softball"], [["U+1F3C0"], "🏀", "basketball"], [["U+1F3D0"], "🏐", "volleyball"], [["U+1F3C8"], "🏈", "american football"], [["U+1F3C9"], "🏉", "rugby football"], [["U+1F3BE"], "🎾", "tennis"], [["U+1F94F"], "🥏", "flying disc"], [["U+1F3B3"], "🎳", "bowling"], [["U+1F3CF"], "🏏", "cricket game"], [["U+1F3D1"], "🏑", "field hockey"], [["U+1F3D2"], "🏒", "ice hockey"], [["U+1F94D"], "🥍", "lacrosse"], [["U+1F3D3"], "🏓", "ping pong"], [["U+1F3F8"], "🏸", "badminton"], [["U+1F94A"], "🥊", "boxing glove"], [["U+1F94B"], "🥋", "martial arts uniform"], [["U+1F945"], "🥅", "goal net"], [["U+26F3"], "⛳", "flag in hole"], [["U+26F8"], "⛸", "ice skate"], [["U+1F3A3"], "🎣", "fishing pole"], [["U+1F93F"], "🤿", "diving mask"], [["U+1F3BD"], "🎽", "running shirt"], [["U+1F3BF"], "🎿", "skis"], [["U+1F6F7"], "🛷", "sled"], [["U+1F94C"], "🥌", "curling stone"]]], ["game", [[["U+1F3AF"], "🎯", "direct hit"], [["U+1FA80"], "🪀", "yo-yo"], [["U+1FA81"], "🪁", "kite"], [["U+1F3B1"], "🎱", "pool 8 ball"], [["U+1F52E"], "🔮", "crystal ball"], [["U+1FA84"], "🪄", "⊛ magic wand"], [["U+1F9FF"], "🧿", "nazar amulet"], [["U+1F3AE"], "🎮", "video game"], [["U+1F579"], "🕹", "joystick"], [["U+1F3B0"], "🎰", "slot machine"], [["U+1F3B2"], "🎲", "game die"], [["U+1F9E9"], "🧩", "puzzle piece"], [["U+1F9F8"], "🧸", "teddy bear"], [["U+1FA85"], "🪅", "⊛ piñata"], [["U+1FA86"], "🪆", "⊛ nesting dolls"], [["U+2660"], "♠", "spade suit"], [["U+2665"], "♥", "heart suit"], [["U+2666"], "♦", "diamond suit"], [["U+2663"], "♣", "club suit"], [["U+265F"], "♟", "chess pawn"], [["U+1F0CF"], "🃏", "joker"], [["U+1F004"], "🀄", "mahjong red dragon"], [["U+1F3B4"], "🎴", "flower playing cards"]]], ["arts & crafts", [[["U+1F3AD"], "🎭", "performing arts"], [["U+1F5BC"], "🖼", "framed picture"], [["U+1F3A8"], "🎨", "artist palette"], [["U+1F9F5"], "🧵", "thread"], [["U+1FAA1"], "🪡", "⊛ sewing needle"], [["U+1F9F6"], "🧶", "yarn"], [["U+1FAA2"], "🪢", "⊛ knot"]]]]], ["Objects", [["clothing", [[["U+1F453"], "👓", "glasses"], [["U+1F576"], "🕶", "sunglasses"], [["U+1F97D"], "🥽", "goggles"], [["U+1F97C"], "🥼", "lab coat"], [["U+1F9BA"], "🦺", "safety vest"], [["U+1F454"], "👔", "necktie"], [["U+1F455"], "👕", "t-shirt"], [["U+1F456"], "👖", "jeans"], [["U+1F9E3"], "🧣", "scarf"], [["U+1F9E4"], "🧤", "gloves"], [["U+1F9E5"], "🧥", "coat"], [["U+1F9E6"], "🧦", "socks"], [["U+1F457"], "👗", "dress"], [["U+1F458"], "👘", "kimono"], [["U+1F97B"], "🥻", "sari"], [["U+1FA71"], "🩱", "one-piece swimsuit"], [["U+1FA72"], "🩲", "briefs"], [["U+1FA73"], "🩳", "shorts"], [["U+1F459"], "👙", "bikini"], [["U+1F45A"], "👚", "woman’s clothes"], [["U+1F45B"], "👛", "purse"], [["U+1F45C"], "👜", "handbag"], [["U+1F45D"], "👝", "clutch bag"], [["U+1F6CD"], "🛍", "shopping bags"], [["U+1F392"], "🎒", "backpack"], [["U+1FA74"], "🩴", "⊛ thong sandal"], [["U+1F45E"], "👞", "man’s shoe"], [["U+1F45F"], "👟", "running shoe"], [["U+1F97E"], "🥾", "hiking boot"], [["U+1F97F"], "🥿", "flat shoe"], [["U+1F460"], "👠", "high-heeled shoe"], [["U+1F461"], "👡", "woman’s sandal"], [["U+1FA70"], "🩰", "ballet shoes"], [["U+1F462"], "👢", "woman’s boot"], [["U+1F451"], "👑", "crown"], [["U+1F452"], "👒", "woman’s hat"], [["U+1F3A9"], "🎩", "top hat"], [["U+1F393"], "🎓", "graduation cap"], [["U+1F9E2"], "🧢", "billed cap"], [["U+1FA96"], "🪖", "⊛ military helmet"], [["U+26D1"], "⛑", "rescue worker’s helmet"], [["U+1F4FF"], "📿", "prayer beads"], [["U+1F484"], "💄", "lipstick"], [["U+1F48D"], "💍", "ring"], [["U+1F48E"], "💎", "gem stone"]]], ["sound", [[["U+1F507"], "🔇", "muted speaker"], [["U+1F508"], "🔈", "speaker low volume"], [["U+1F509"], "🔉", "speaker medium volume"], [["U+1F50A"], "🔊", "speaker high volume"], [["U+1F4E2"], "📢", "loudspeaker"], [["U+1F4E3"], "📣", "megaphone"], [["U+1F4EF"], "📯", "postal horn"], [["U+1F514"], "🔔", "bell"], [["U+1F515"], "🔕", "bell with slash"]]], ["music", [[["U+1F3BC"], "🎼", "musical score"], [["U+1F3B5"], "🎵", "musical note"], [["U+1F3B6"], "🎶", "musical notes"], [["U+1F399"], "🎙", "studio microphone"], [["U+1F39A"], "🎚", "level slider"], [["U+1F39B"], "🎛", "control knobs"], [["U+1F3A4"], "🎤", "microphone"], [["U+1F3A7"], "🎧", "headphone"], [["U+1F4FB"], "📻", "radio"]]], ["musical-instrument", [[["U+1F3B7"], "🎷", "saxophone"], [["U+1FA97"], "🪗", "⊛ accordion"], [["U+1F3B8"], "🎸", "guitar"], [["U+1F3B9"], "🎹", "musical keyboard"], [["U+1F3BA"], "🎺", "trumpet"], [["U+1F3BB"], "🎻", "violin"], [["U+1FA95"], "🪕", "banjo"], [["U+1F941"], "🥁", "drum"], [["U+1FA98"], "🪘", "⊛ long drum"]]], ["phone", [[["U+1F4F1"], "📱", "mobile phone"], [["U+1F4F2"], "📲", "mobile phone with arrow"], [["U+260E"], "☎", "telephone"], [["U+1F4DE"], "📞", "telephone receiver"], [["U+1F4DF"], "📟", "pager"], [["U+1F4E0"], "📠", "fax machine"]]], ["computer", [[["U+1F50B"], "🔋", "battery"], [["U+1F50C"], "🔌", "electric plug"], [["U+1F4BB"], "💻", "laptop"], [["U+1F5A5"], "🖥", "desktop computer"], [["U+1F5A8"], "🖨", "printer"], [["U+2328"], "⌨", "keyboard"], [["U+1F5B1"], "🖱", "computer mouse"], [["U+1F5B2"], "🖲", "trackball"], [["U+1F4BD"], "💽", "computer disk"], [["U+1F4BE"], "💾", "floppy disk"], [["U+1F4BF"], "💿", "optical disk"], [["U+1F4C0"], "📀", "dvd"], [["U+1F9EE"], "🧮", "abacus"]]], ["light & video", [[["U+1F3A5"], "🎥", "movie camera"], [["U+1F39E"], "🎞", "film frames"], [["U+1F4FD"], "📽", "film projector"], [["U+1F3AC"], "🎬", "clapper board"], [["U+1F4FA"], "📺", "television"], [["U+1F4F7"], "📷", "camera"], [["U+1F4F8"], "📸", "camera with flash"], [["U+1F4F9"], "📹", "video camera"], [["U+1F4FC"], "📼", "videocassette"], [["U+1F50D"], "🔍", "magnifying glass tilted left"], [["U+1F50E"], "🔎", "magnifying glass tilted right"], [["U+1F56F"], "🕯", "candle"], [["U+1F4A1"], "💡", "light bulb"], [["U+1F526"], "🔦", "flashlight"], [["U+1F3EE"], "🏮", "red paper lantern"], [["U+1FA94"], "🪔", "diya lamp"]]], ["book-paper", [[["U+1F4D4"], "📔", "notebook with decorative cover"], [["U+1F4D5"], "📕", "closed book"], [["U+1F4D6"], "📖", "open book"], [["U+1F4D7"], "📗", "green book"], [["U+1F4D8"], "📘", "blue book"], [["U+1F4D9"], "📙", "orange book"], [["U+1F4DA"], "📚", "books"], [["U+1F4D3"], "📓", "notebook"], [["U+1F4D2"], "📒", "ledger"], [["U+1F4C3"], "📃", "page with curl"], [["U+1F4DC"], "📜", "scroll"], [["U+1F4C4"], "📄", "page facing up"], [["U+1F4F0"], "📰", "newspaper"], [["U+1F5DE"], "🗞", "rolled-up newspaper"], [["U+1F4D1"], "📑", "bookmark tabs"], [["U+1F516"], "🔖", "bookmark"], [["U+1F3F7"], "🏷", "label"]]], ["money", [[["U+1F4B0"], "💰", "money bag"], [["U+1FA99"], "🪙", "⊛ coin"], [["U+1F4B4"], "💴", "yen banknote"], [["U+1F4B5"], "💵", "dollar banknote"], [["U+1F4B6"], "💶", "euro banknote"], [["U+1F4B7"], "💷", "pound banknote"], [["U+1F4B8"], "💸", "money with wings"], [["U+1F4B3"], "💳", "credit card"], [["U+1F9FE"], "🧾", "receipt"], [["U+1F4B9"], "💹", "chart increasing with yen"]]], ["mail", [[["U+2709"], "✉", "envelope"], [["U+1F4E7"], "📧", "e-mail"], [["U+1F4E8"], "📨", "incoming envelope"], [["U+1F4E9"], "📩", "envelope with arrow"], [["U+1F4E4"], "📤", "outbox tray"], [["U+1F4E5"], "📥", "inbox tray"], [["U+1F4E6"], "📦", "package"], [["U+1F4EB"], "📫", "closed mailbox with raised flag"], [["U+1F4EA"], "📪", "closed mailbox with lowered flag"], [["U+1F4EC"], "📬", "open mailbox with raised flag"], [["U+1F4ED"], "📭", "open mailbox with lowered flag"], [["U+1F4EE"], "📮", "postbox"], [["U+1F5F3"], "🗳", "ballot box with ballot"]]], ["writing", [[["U+270F"], "✏", "pencil"], [["U+2712"], "✒", "black nib"], [["U+1F58B"], "🖋", "fountain pen"], [["U+1F58A"], "🖊", "pen"], [["U+1F58C"], "🖌", "paintbrush"], [["U+1F58D"], "🖍", "crayon"], [["U+1F4DD"], "📝", "memo"]]], ["office", [[["U+1F4BC"], "💼", "briefcase"], [["U+1F4C1"], "📁", "file folder"], [["U+1F4C2"], "📂", "open file folder"], [["U+1F5C2"], "🗂", "card index dividers"], [["U+1F4C5"], "📅", "calendar"], [["U+1F4C6"], "📆", "tear-off calendar"], [["U+1F5D2"], "🗒", "spiral notepad"], [["U+1F5D3"], "🗓", "spiral calendar"], [["U+1F4C7"], "📇", "card index"], [["U+1F4C8"], "📈", "chart increasing"], [["U+1F4C9"], "📉", "chart decreasing"], [["U+1F4CA"], "📊", "bar chart"], [["U+1F4CB"], "📋", "clipboard"], [["U+1F4CC"], "📌", "pushpin"], [["U+1F4CD"], "📍", "round pushpin"], [["U+1F4CE"], "📎", "paperclip"], [["U+1F587"], "🖇", "linked paperclips"], [["U+1F4CF"], "📏", "straight ruler"], [["U+1F4D0"], "📐", "triangular ruler"], [["U+2702"], "✂", "scissors"], [["U+1F5C3"], "🗃", "card file box"], [["U+1F5C4"], "🗄", "file cabinet"], [["U+1F5D1"], "🗑", "wastebasket"]]], ["lock", [[["U+1F512"], "🔒", "locked"], [["U+1F513"], "🔓", "unlocked"], [["U+1F50F"], "🔏", "locked with pen"], [["U+1F510"], "🔐", "locked with key"], [["U+1F511"], "🔑", "key"], [["U+1F5DD"], "🗝", "old key"]]], ["tool", [[["U+1F528"], "🔨", "hammer"], [["U+1FA93"], "🪓", "axe"], [["U+26CF"], "⛏", "pick"], [["U+2692"], "⚒", "hammer and pick"], [["U+1F6E0"], "🛠", "hammer and wrench"], [["U+1F5E1"], "🗡", "dagger"], [["U+2694"], "⚔", "crossed swords"], [["U+1F52B"], "🔫", "pistol"], [["U+1FA83"], "🪃", "⊛ boomerang"], [["U+1F3F9"], "🏹", "bow and arrow"], [["U+1F6E1"], "🛡", "shield"], [["U+1F527"], "🔧", "wrench"], [["U+1FA9B"], "🪛", "⊛ screwdriver"], [["U+1F529"], "🔩", "nut and bolt"], [["U+2699"], "⚙", "gear"], [["U+1F5DC"], "🗜", "clamp"], [["U+2696"], "⚖", "balance scale"], [["U+1F9AF"], "🦯", "white cane"], [["U+1F517"], "🔗", "link"], [["U+26D3"], "⛓", "chains"], [["U+1FA9D"], "🪝", "⊛ hook"], [["U+1F9F0"], "🧰", "toolbox"], [["U+1F9F2"], "🧲", "magnet"], [["U+1FA9C"], "🪜", "⊛ ladder"]]], ["science", [[["U+2697"], "⚗", "alembic"], [["U+1F9EA"], "🧪", "test tube"], [["U+1F9EB"], "🧫", "petri dish"], [["U+1F9EC"], "🧬", "dna"], [["U+1F52C"], "🔬", "microscope"], [["U+1F52D"], "🔭", "telescope"], [["U+1F4E1"], "📡", "satellite antenna"]]], ["medical", [[["U+1F489"], "💉", "syringe"], [["U+1FA78"], "🩸", "drop of blood"], [["U+1F48A"], "💊", "pill"], [["U+1FA79"], "🩹", "adhesive bandage"], [["U+1FA7A"], "🩺", "stethoscope"]]], ["household", [[["U+1F6AA"], "🚪", "door"], [["U+1F6D7"], "🛗", "⊛ elevator"], [["U+1F6CF"], "🛏", "bed"], [["U+1F6CB"], "🛋", "couch and lamp"], [["U+1FA91"], "🪑", "chair"], [["U+1F6BD"], "🚽", "toilet"], [["U+1FAA0"], "🪠", "⊛ plunger"], [["U+1F6BF"], "🚿", "shower"], [["U+1F6C1"], "🛁", "bathtub"], [["U+1FA92"], "🪒", "razor"], [["U+1F9F4"], "🧴", "lotion bottle"], [["U+1F9F7"], "🧷", "safety pin"], [["U+1F9F9"], "🧹", "broom"], [["U+1F9FA"], "🧺", "basket"], [["U+1F9FB"], "🧻", "roll of paper"], [["U+1FAA3"], "🪣", "⊛ bucket"], [["U+1F9FC"], "🧼", "soap"], [["U+1FAA5"], "🪥", "⊛ toothbrush"], [["U+1F9FD"], "🧽", "sponge"], [["U+1F9EF"], "🧯", "fire extinguisher"], [["U+1F6D2"], "🛒", "shopping cart"]]], ["other-object", [[["U+1F6AC"], "🚬", "cigarette"], [["U+26B0"], "⚰", "coffin"], [["U+26B1"], "⚱", "funeral urn"], [["U+1F5FF"], "🗿", "moai"], [["U+1FAA7"], "🪧", "⊛ placard"]]]]], ["Symbols", [["transport-sign", [[["U+1F3E7"], "🏧", "ATM sign"], [["U+1F6AE"], "🚮", "litter in bin sign"], [["U+1F6B0"], "🚰", "potable water"], [["U+267F"], "♿", "wheelchair symbol"], [["U+1F6B9"], "🚹", "men’s room"], [["U+1F6BA"], "🚺", "women’s room"], [["U+1F6BB"], "🚻", "restroom"], [["U+1F6BC"], "🚼", "baby symbol"], [["U+1F6BE"], "🚾", "water closet"], [["U+1F6C2"], "🛂", "passport control"], [["U+1F6C3"], "🛃", "customs"], [["U+1F6C4"], "🛄", "baggage claim"], [["U+1F6C5"], "🛅", "left luggage"]]], ["warning", [[["U+26A0"], "⚠", "warning"], [["U+1F6B8"], "🚸", "children crossing"], [["U+26D4"], "⛔", "no entry"], [["U+1F6AB"], "🚫", "prohibited"], [["U+1F6B3"], "🚳", "no bicycles"], [["U+1F6AD"], "🚭", "no smoking"], [["U+1F6AF"], "🚯", "no littering"], [["U+1F6B1"], "🚱", "non-potable water"], [["U+1F6B7"], "🚷", "no pedestrians"], [["U+1F4F5"], "📵", "no mobile phones"], [["U+1F51E"], "🔞", "no one under eighteen"], [["U+2622"], "☢", "radioactive"], [["U+2623"], "☣", "biohazard"]]], ["arrow", [[["U+2B06"], "⬆", "up arrow"], [["U+2197"], "↗", "up-right arrow"], [["U+27A1"], "➡", "right arrow"], [["U+2198"], "↘", "down-right arrow"], [["U+2B07"], "⬇", "down arrow"], [["U+2199"], "↙", "down-left arrow"], [["U+2B05"], "⬅", "left arrow"], [["U+2196"], "↖", "up-left arrow"], [["U+2195"], "↕", "up-down arrow"], [["U+2194"], "↔", "left-right arrow"], [["U+21A9"], "↩", "right arrow curving left"], [["U+21AA"], "↪", "left arrow curving right"], [["U+2934"], "⤴", "right arrow curving up"], [["U+2935"], "⤵", "right arrow curving down"], [["U+1F503"], "🔃", "clockwise vertical arrows"], [["U+1F504"], "🔄", "counterclockwise arrows button"], [["U+1F519"], "🔙", "BACK arrow"], [["U+1F51A"], "🔚", "END arrow"], [["U+1F51B"], "🔛", "ON! arrow"], [["U+1F51C"], "🔜", "SOON arrow"], [["U+1F51D"], "🔝", "TOP arrow"]]], ["religion", [[["U+1F6D0"], "🛐", "place of worship"], [["U+269B"], "⚛", "atom symbol"], [["U+1F549"], "🕉", "om"], [["U+2721"], "✡", "star of David"], [["U+2638"], "☸", "wheel of dharma"], [["U+262F"], "☯", "yin yang"], [["U+271D"], "✝", "latin cross"], [["U+2626"], "☦", "orthodox cross"], [["U+262A"], "☪", "star and crescent"], [["U+262E"], "☮", "peace symbol"], [["U+1F54E"], "🕎", "menorah"], [["U+1F52F"], "🔯", "dotted six-pointed star"]]], ["zodiac", [[["U+2648"], "♈", "Aries"], [["U+2649"], "♉", "Taurus"], [["U+264A"], "♊", "Gemini"], [["U+264B"], "♋", "Cancer"], [["U+264C"], "♌", "Leo"], [["U+264D"], "♍", "Virgo"], [["U+264E"], "♎", "Libra"], [["U+264F"], "♏", "Scorpio"], [["U+2650"], "♐", "Sagittarius"], [["U+2651"], "♑", "Capricorn"], [["U+2652"], "♒", "Aquarius"], [["U+2653"], "♓", "Pisces"], [["U+26CE"], "⛎", "Ophiuchus"]]], ["av-symbol", [[["U+1F500"], "🔀", "shuffle tracks button"], [["U+1F501"], "🔁", "repeat button"], [["U+1F502"], "🔂", "repeat single button"], [["U+25B6"], "▶", "play button"], [["U+23E9"], "⏩", "fast-forward button"], [["U+23ED"], "⏭", "next track button"], [["U+23EF"], "⏯", "play or pause button"], [["U+25C0"], "◀", "reverse button"], [["U+23EA"], "⏪", "fast reverse button"], [["U+23EE"], "⏮", "last track button"], [["U+1F53C"], "🔼", "upwards button"], [["U+23EB"], "⏫", "fast up button"], [["U+1F53D"], "🔽", "downwards button"], [["U+23EC"], "⏬", "fast down button"], [["U+23F8"], "⏸", "pause button"], [["U+23F9"], "⏹", "stop button"], [["U+23FA"], "⏺", "record button"], [["U+23CF"], "⏏", "eject button"], [["U+1F3A6"], "🎦", "cinema"], [["U+1F505"], "🔅", "dim button"], [["U+1F506"], "🔆", "bright button"], [["U+1F4F6"], "📶", "antenna bars"], [["U+1F4F3"], "📳", "vibration mode"], [["U+1F4F4"], "📴", "mobile phone off"]]], ["gender", [[["U+2640"], "♀", "female sign"], [["U+2642"], "♂", "male sign"], [["U+26A7"], "⚧", "⊛ transgender symbol"]]], ["math", [[["U+2716"], "✖", "multiply"], [["U+2795"], "➕", "plus"], [["U+2796"], "➖", "minus"], [["U+2797"], "➗", "divide"], [["U+267E"], "♾", "infinity"]]], ["punctuation", [[["U+203C"], "‼", "double exclamation mark"], [["U+2049"], "⁉", "exclamation question mark"], [["U+2753"], "❓", "question mark"], [["U+2754"], "❔", "white question mark"], [["U+2755"], "❕", "white exclamation mark"], [["U+2757"], "❗", "exclamation mark"], [["U+3030"], "〰", "wavy dash"]]], ["currency", [[["U+1F4B1"], "💱", "currency exchange"], [["U+1F4B2"], "💲", "heavy dollar sign"]]], ["other-symbol", [[["U+2695"], "⚕", "medical symbol"], [["U+267B"], "♻", "recycling symbol"], [["U+269C"], "⚜", "fleur-de-lis"], [["U+1F531"], "🔱", "trident emblem"], [["U+1F4DB"], "📛", "name badge"], [["U+1F530"], "🔰", "Japanese symbol for beginner"], [["U+2B55"], "⭕", "hollow red circle"], [["U+2705"], "✅", "check mark button"], [["U+2611"], "☑", "check box with check"], [["U+2714"], "✔", "check mark"], [["U+274C"], "❌", "cross mark"], [["U+274E"], "❎", "cross mark button"], [["U+27B0"], "➰", "curly loop"], [["U+27BF"], "➿", "double curly loop"], [["U+303D"], "〽", "part alternation mark"], [["U+2733"], "✳", "eight-spoked asterisk"], [["U+2734"], "✴", "eight-pointed star"], [["U+2747"], "❇", "sparkle"], [["U+00A9"], "©", "copyright"], [["U+00AE"], "®", "registered"], [["U+2122"], "™", "trade mark"]]], ["keycap", [[["U+0023", "U+FE0F", "U+20E3"], "#️⃣", "keycap: #"], [["U+002A", "U+FE0F", "U+20E3"], "*️⃣", "keycap: *"], [["U+0030", "U+FE0F", "U+20E3"], "0️⃣", "keycap: 0"], [["U+0031", "U+FE0F", "U+20E3"], "1️⃣", "keycap: 1"], [["U+0032", "U+FE0F", "U+20E3"], "2️⃣", "keycap: 2"], [["U+0033", "U+FE0F", "U+20E3"], "3️⃣", "keycap: 3"], [["U+0034", "U+FE0F", "U+20E3"], "4️⃣", "keycap: 4"], [["U+0035", "U+FE0F", "U+20E3"], "5️⃣", "keycap: 5"], [["U+0036", "U+FE0F", "U+20E3"], "6️⃣", "keycap: 6"], [["U+0037", "U+FE0F", "U+20E3"], "7️⃣", "keycap: 7"], [["U+0038", "U+FE0F", "U+20E3"], "8️⃣", "keycap: 8"], [["U+0039", "U+FE0F", "U+20E3"], "9️⃣", "keycap: 9"], [["U+1F51F"], "🔟", "keycap: 10"]]], ["alphanum", [[["U+1F520"], "🔠", "input latin uppercase"], [["U+1F521"], "🔡", "input latin lowercase"], [["U+1F522"], "🔢", "input numbers"], [["U+1F523"], "🔣", "input symbols"], [["U+1F524"], "🔤", "input latin letters"], [["U+1F170"], "🅰", "A button (blood type)"], [["U+1F18E"], "🆎", "AB button (blood type)"], [["U+1F171"], "🅱", "B button (blood type)"], [["U+1F191"], "🆑", "CL button"], [["U+1F192"], "🆒", "COOL button"], [["U+1F193"], "🆓", "FREE button"], [["U+2139"], "ℹ", "information"], [["U+1F194"], "🆔", "ID button"], [["U+24C2"], "Ⓜ", "circled M"], [["U+1F195"], "🆕", "NEW button"], [["U+1F196"], "🆖", "NG button"], [["U+1F17E"], "🅾", "O button (blood type)"], [["U+1F197"], "🆗", "OK button"], [["U+1F17F"], "🅿", "P button"], [["U+1F198"], "🆘", "SOS button"], [["U+1F199"], "🆙", "UP! button"], [["U+1F19A"], "🆚", "VS button"], [["U+1F201"], "🈁", "Japanese “here” button"], [["U+1F202"], "🈂", "Japanese “service charge” button"], [["U+1F237"], "🈷", "Japanese “monthly amount” button"], [["U+1F236"], "🈶", "Japanese “not free of charge” button"], [["U+1F22F"], "🈯", "Japanese “reserved” button"], [["U+1F250"], "🉐", "Japanese “bargain” button"], [["U+1F239"], "🈹", "Japanese “discount” button"], [["U+1F21A"], "🈚", "Japanese “free of charge” button"], [["U+1F232"], "🈲", "Japanese “prohibited” button"], [["U+1F251"], "🉑", "Japanese “acceptable” button"], [["U+1F238"], "🈸", "Japanese “application” button"], [["U+1F234"], "🈴", "Japanese “passing grade” button"], [["U+1F233"], "🈳", "Japanese “vacancy” button"], [["U+3297"], "㊗", "Japanese “congratulations” button"], [["U+3299"], "㊙", "Japanese “secret” button"], [["U+1F23A"], "🈺", "Japanese “open for business” button"], [["U+1F235"], "🈵", "Japanese “no vacancy” button"]]], ["geometric", [[["U+1F534"], "🔴", "red circle"], [["U+1F7E0"], "🟠", "orange circle"], [["U+1F7E1"], "🟡", "yellow circle"], [["U+1F7E2"], "🟢", "green circle"], [["U+1F535"], "🔵", "blue circle"], [["U+1F7E3"], "🟣", "purple circle"], [["U+1F7E4"], "🟤", "brown circle"], [["U+26AB"], "⚫", "black circle"], [["U+26AA"], "⚪", "white circle"], [["U+1F7E5"], "🟥", "red square"], [["U+1F7E7"], "🟧", "orange square"], [["U+1F7E8"], "🟨", "yellow square"], [["U+1F7E9"], "🟩", "green square"], [["U+1F7E6"], "🟦", "blue square"], [["U+1F7EA"], "🟪", "purple square"], [["U+1F7EB"], "🟫", "brown square"], [["U+2B1B"], "⬛", "black large square"], [["U+2B1C"], "⬜", "white large square"], [["U+25FC"], "◼", "black medium square"], [["U+25FB"], "◻", "white medium square"], [["U+25FE"], "◾", "black medium-small square"], [["U+25FD"], "◽", "white medium-small square"], [["U+25AA"], "▪", "black small square"], [["U+25AB"], "▫", "white small square"], [["U+1F536"], "🔶", "large orange diamond"], [["U+1F537"], "🔷", "large blue diamond"], [["U+1F538"], "🔸", "small orange diamond"], [["U+1F539"], "🔹", "small blue diamond"], [["U+1F53A"], "🔺", "red triangle pointed up"], [["U+1F53B"], "🔻", "red triangle pointed down"], [["U+1F4A0"], "💠", "diamond with a dot"], [["U+1F518"], "🔘", "radio button"], [["U+1F533"], "🔳", "white square button"], [["U+1F532"], "🔲", "black square button"]]]]], ["Flags", [["flag", [[["U+1F3C1"], "🏁", "chequered flag"], [["U+1F6A9"], "🚩", "triangular flag"], [["U+1F38C"], "🎌", "crossed flags"], [["U+1F3F4"], "🏴", "black flag"], [["U+1F3F3"], "🏳", "white flag"], [["U+1F3F3", "U+FE0F", "U+200D", "U+1F308"], "🏳️‍🌈", "rainbow flag"], [["U+1F3F3", "U+FE0F", "U+200D", "U+26A7", "U+FE0F"], "🏳️‍⚧️", "⊛ transgender flag"], [["U+1F3F4", "U+200D", "U+2620", "U+FE0F"], "🏴‍☠️", "pirate flag"]]], ["country-flag", [[["U+1F1E6", "U+1F1E8"], "🇦🇨", "flag: Ascension Island"], [["U+1F1E6", "U+1F1E9"], "🇦🇩", "flag: Andorra"], [["U+1F1E6", "U+1F1EA"], "🇦🇪", "flag: United Arab Emirates"], [["U+1F1E6", "U+1F1EB"], "🇦🇫", "flag: Afghanistan"], [["U+1F1E6", "U+1F1EC"], "🇦🇬", "flag: Antigua & Barbuda"], [["U+1F1E6", "U+1F1EE"], "🇦🇮", "flag: Anguilla"], [["U+1F1E6", "U+1F1F1"], "🇦🇱", "flag: Albania"], [["U+1F1E6", "U+1F1F2"], "🇦🇲", "flag: Armenia"], [["U+1F1E6", "U+1F1F4"], "🇦🇴", "flag: Angola"], [["U+1F1E6", "U+1F1F6"], "🇦🇶", "flag: Antarctica"], [["U+1F1E6", "U+1F1F7"], "🇦🇷", "flag: Argentina"], [["U+1F1E6", "U+1F1F8"], "🇦🇸", "flag: American Samoa"], [["U+1F1E6", "U+1F1F9"], "🇦🇹", "flag: Austria"], [["U+1F1E6", "U+1F1FA"], "🇦🇺", "flag: Australia"], [["U+1F1E6", "U+1F1FC"], "🇦🇼", "flag: Aruba"], [["U+1F1E6", "U+1F1FD"], "🇦🇽", "flag: Åland Islands"], [["U+1F1E6", "U+1F1FF"], "🇦🇿", "flag: Azerbaijan"], [["U+1F1E7", "U+1F1E6"], "🇧🇦", "flag: Bosnia & Herzegovina"], [["U+1F1E7", "U+1F1E7"], "🇧🇧", "flag: Barbados"], [["U+1F1E7", "U+1F1E9"], "🇧🇩", "flag: Bangladesh"], [["U+1F1E7", "U+1F1EA"], "🇧🇪", "flag: Belgium"], [["U+1F1E7", "U+1F1EB"], "🇧🇫", "flag: Burkina Faso"], [["U+1F1E7", "U+1F1EC"], "🇧🇬", "flag: Bulgaria"], [["U+1F1E7", "U+1F1ED"], "🇧🇭", "flag: Bahrain"], [["U+1F1E7", "U+1F1EE"], "🇧🇮", "flag: Burundi"], [["U+1F1E7", "U+1F1EF"], "🇧🇯", "flag: Benin"], [["U+1F1E7", "U+1F1F1"], "🇧🇱", "flag: St. Barthélemy"], [["U+1F1E7", "U+1F1F2"], "🇧🇲", "flag: Bermuda"], [["U+1F1E7", "U+1F1F3"], "🇧🇳", "flag: Brunei"], [["U+1F1E7", "U+1F1F4"], "🇧🇴", "flag: Bolivia"], [["U+1F1E7", "U+1F1F6"], "🇧🇶", "flag: Caribbean Netherlands"], [["U+1F1E7", "U+1F1F7"], "🇧🇷", "flag: Brazil"], [["U+1F1E7", "U+1F1F8"], "🇧🇸", "flag: Bahamas"], [["U+1F1E7", "U+1F1F9"], "🇧🇹", "flag: Bhutan"], [["U+1F1E7", "U+1F1FB"], "🇧🇻", "flag: Bouvet Island"], [["U+1F1E7", "U+1F1FC"], "🇧🇼", "flag: Botswana"], [["U+1F1E7", "U+1F1FE"], "🇧🇾", "flag: Belarus"], [["U+1F1E7", "U+1F1FF"], "🇧🇿", "flag: Belize"], [["U+1F1E8", "U+1F1E6"], "🇨🇦", "flag: Canada"], [["U+1F1E8", "U+1F1E8"], "🇨🇨", "flag: Cocos (Keeling) Islands"], [["U+1F1E8", "U+1F1E9"], "🇨🇩", "flag: Congo - Kinshasa"], [["U+1F1E8", "U+1F1EB"], "🇨🇫", "flag: Central African Republic"], [["U+1F1E8", "U+1F1EC"], "🇨🇬", "flag: Congo - Brazzaville"], [["U+1F1E8", "U+1F1ED"], "🇨🇭", "flag: Switzerland"], [["U+1F1E8", "U+1F1EE"], "🇨🇮", "flag: Côte d’Ivoire"], [["U+1F1E8", "U+1F1F0"], "🇨🇰", "flag: Cook Islands"], [["U+1F1E8", "U+1F1F1"], "🇨🇱", "flag: Chile"], [["U+1F1E8", "U+1F1F2"], "🇨🇲", "flag: Cameroon"], [["U+1F1E8", "U+1F1F3"], "🇨🇳", "flag: China"], [["U+1F1E8", "U+1F1F4"], "🇨🇴", "flag: Colombia"], [["U+1F1E8", "U+1F1F5"], "🇨🇵", "flag: Clipperton Island"], [["U+1F1E8", "U+1F1F7"], "🇨🇷", "flag: Costa Rica"], [["U+1F1E8", "U+1F1FA"], "🇨🇺", "flag: Cuba"], [["U+1F1E8", "U+1F1FB"], "🇨🇻", "flag: Cape Verde"], [["U+1F1E8", "U+1F1FC"], "🇨🇼", "flag: Curaçao"], [["U+1F1E8", "U+1F1FD"], "🇨🇽", "flag: Christmas Island"], [["U+1F1E8", "U+1F1FE"], "🇨🇾", "flag: Cyprus"], [["U+1F1E8", "U+1F1FF"], "🇨🇿", "flag: Czechia"], [["U+1F1E9", "U+1F1EA"], "🇩🇪", "flag: Germany"], [["U+1F1E9", "U+1F1EC"], "🇩🇬", "flag: Diego Garcia"], [["U+1F1E9", "U+1F1EF"], "🇩🇯", "flag: Djibouti"], [["U+1F1E9", "U+1F1F0"], "🇩🇰", "flag: Denmark"], [["U+1F1E9", "U+1F1F2"], "🇩🇲", "flag: Dominica"], [["U+1F1E9", "U+1F1F4"], "🇩🇴", "flag: Dominican Republic"], [["U+1F1E9", "U+1F1FF"], "🇩🇿", "flag: Algeria"], [["U+1F1EA", "U+1F1E6"], "🇪🇦", "flag: Ceuta & Melilla"], [["U+1F1EA", "U+1F1E8"], "🇪🇨", "flag: Ecuador"], [["U+1F1EA", "U+1F1EA"], "🇪🇪", "flag: Estonia"], [["U+1F1EA", "U+1F1EC"], "🇪🇬", "flag: Egypt"], [["U+1F1EA", "U+1F1ED"], "🇪🇭", "flag: Western Sahara"], [["U+1F1EA", "U+1F1F7"], "🇪🇷", "flag: Eritrea"], [["U+1F1EA", "U+1F1F8"], "🇪🇸", "flag: Spain"], [["U+1F1EA", "U+1F1F9"], "🇪🇹", "flag: Ethiopia"], [["U+1F1EA", "U+1F1FA"], "🇪🇺", "flag: European Union"], [["U+1F1EB", "U+1F1EE"], "🇫🇮", "flag: Finland"], [["U+1F1EB", "U+1F1EF"], "🇫🇯", "flag: Fiji"], [["U+1F1EB", "U+1F1F0"], "🇫🇰", "flag: Falkland Islands"], [["U+1F1EB", "U+1F1F2"], "🇫🇲", "flag: Micronesia"], [["U+1F1EB", "U+1F1F4"], "🇫🇴", "flag: Faroe Islands"], [["U+1F1EB", "U+1F1F7"], "🇫🇷", "flag: France"], [["U+1F1EC", "U+1F1E6"], "🇬🇦", "flag: Gabon"], [["U+1F1EC", "U+1F1E7"], "🇬🇧", "flag: United Kingdom"], [["U+1F1EC", "U+1F1E9"], "🇬🇩", "flag: Grenada"], [["U+1F1EC", "U+1F1EA"], "🇬🇪", "flag: Georgia"], [["U+1F1EC", "U+1F1EB"], "🇬🇫", "flag: French Guiana"], [["U+1F1EC", "U+1F1EC"], "🇬🇬", "flag: Guernsey"], [["U+1F1EC", "U+1F1ED"], "🇬🇭", "flag: Ghana"], [["U+1F1EC", "U+1F1EE"], "🇬🇮", "flag: Gibraltar"], [["U+1F1EC", "U+1F1F1"], "🇬🇱", "flag: Greenland"], [["U+1F1EC", "U+1F1F2"], "🇬🇲", "flag: Gambia"], [["U+1F1EC", "U+1F1F3"], "🇬🇳", "flag: Guinea"], [["U+1F1EC", "U+1F1F5"], "🇬🇵", "flag: Guadeloupe"], [["U+1F1EC", "U+1F1F6"], "🇬🇶", "flag: Equatorial Guinea"], [["U+1F1EC", "U+1F1F7"], "🇬🇷", "flag: Greece"], [["U+1F1EC", "U+1F1F8"], "🇬🇸", "flag: South Georgia & South Sandwich Islands"], [["U+1F1EC", "U+1F1F9"], "🇬🇹", "flag: Guatemala"], [["U+1F1EC", "U+1F1FA"], "🇬🇺", "flag: Guam"], [["U+1F1EC", "U+1F1FC"], "🇬🇼", "flag: Guinea-Bissau"], [["U+1F1EC", "U+1F1FE"], "🇬🇾", "flag: Guyana"], [["U+1F1ED", "U+1F1F0"], "🇭🇰", "flag: Hong Kong SAR China"], [["U+1F1ED", "U+1F1F2"], "🇭🇲", "flag: Heard & McDonald Islands"], [["U+1F1ED", "U+1F1F3"], "🇭🇳", "flag: Honduras"], [["U+1F1ED", "U+1F1F7"], "🇭🇷", "flag: Croatia"], [["U+1F1ED", "U+1F1F9"], "🇭🇹", "flag: Haiti"], [["U+1F1ED", "U+1F1FA"], "🇭🇺", "flag: Hungary"], [["U+1F1EE", "U+1F1E8"], "🇮🇨", "flag: Canary Islands"], [["U+1F1EE", "U+1F1E9"], "🇮🇩", "flag: Indonesia"], [["U+1F1EE", "U+1F1EA"], "🇮🇪", "flag: Ireland"], [["U+1F1EE", "U+1F1F1"], "🇮🇱", "flag: Israel"], [["U+1F1EE", "U+1F1F2"], "🇮🇲", "flag: Isle of Man"], [["U+1F1EE", "U+1F1F3"], "🇮🇳", "flag: India"], [["U+1F1EE", "U+1F1F4"], "🇮🇴", "flag: British Indian Ocean Territory"], [["U+1F1EE", "U+1F1F6"], "🇮🇶", "flag: Iraq"], [["U+1F1EE", "U+1F1F7"], "🇮🇷", "flag: Iran"], [["U+1F1EE", "U+1F1F8"], "🇮🇸", "flag: Iceland"], [["U+1F1EE", "U+1F1F9"], "🇮🇹", "flag: Italy"], [["U+1F1EF", "U+1F1EA"], "🇯🇪", "flag: Jersey"], [["U+1F1EF", "U+1F1F2"], "🇯🇲", "flag: Jamaica"], [["U+1F1EF", "U+1F1F4"], "🇯🇴", "flag: Jordan"], [["U+1F1EF", "U+1F1F5"], "🇯🇵", "flag: Japan"], [["U+1F1F0", "U+1F1EA"], "🇰🇪", "flag: Kenya"], [["U+1F1F0", "U+1F1EC"], "🇰🇬", "flag: Kyrgyzstan"], [["U+1F1F0", "U+1F1ED"], "🇰🇭", "flag: Cambodia"], [["U+1F1F0", "U+1F1EE"], "🇰🇮", "flag: Kiribati"], [["U+1F1F0", "U+1F1F2"], "🇰🇲", "flag: Comoros"], [["U+1F1F0", "U+1F1F3"], "🇰🇳", "flag: St. Kitts & Nevis"], [["U+1F1F0", "U+1F1F5"], "🇰🇵", "flag: North Korea"], [["U+1F1F0", "U+1F1F7"], "🇰🇷", "flag: South Korea"], [["U+1F1F0", "U+1F1FC"], "🇰🇼", "flag: Kuwait"], [["U+1F1F0", "U+1F1FE"], "🇰🇾", "flag: Cayman Islands"], [["U+1F1F0", "U+1F1FF"], "🇰🇿", "flag: Kazakhstan"], [["U+1F1F1", "U+1F1E6"], "🇱🇦", "flag: Laos"], [["U+1F1F1", "U+1F1E7"], "🇱🇧", "flag: Lebanon"], [["U+1F1F1", "U+1F1E8"], "🇱🇨", "flag: St. Lucia"], [["U+1F1F1", "U+1F1EE"], "🇱🇮", "flag: Liechtenstein"], [["U+1F1F1", "U+1F1F0"], "🇱🇰", "flag: Sri Lanka"], [["U+1F1F1", "U+1F1F7"], "🇱🇷", "flag: Liberia"], [["U+1F1F1", "U+1F1F8"], "🇱🇸", "flag: Lesotho"], [["U+1F1F1", "U+1F1F9"], "🇱🇹", "flag: Lithuania"], [["U+1F1F1", "U+1F1FA"], "🇱🇺", "flag: Luxembourg"], [["U+1F1F1", "U+1F1FB"], "🇱🇻", "flag: Latvia"], [["U+1F1F1", "U+1F1FE"], "🇱🇾", "flag: Libya"], [["U+1F1F2", "U+1F1E6"], "🇲🇦", "flag: Morocco"], [["U+1F1F2", "U+1F1E8"], "🇲🇨", "flag: Monaco"], [["U+1F1F2", "U+1F1E9"], "🇲🇩", "flag: Moldova"], [["U+1F1F2", "U+1F1EA"], "🇲🇪", "flag: Montenegro"], [["U+1F1F2", "U+1F1EB"], "🇲🇫", "flag: St. Martin"], [["U+1F1F2", "U+1F1EC"], "🇲🇬", "flag: Madagascar"], [["U+1F1F2", "U+1F1ED"], "🇲🇭", "flag: Marshall Islands"], [["U+1F1F2", "U+1F1F0"], "🇲🇰", "flag: North Macedonia"], [["U+1F1F2", "U+1F1F1"], "🇲🇱", "flag: Mali"], [["U+1F1F2", "U+1F1F2"], "🇲🇲", "flag: Myanmar (Burma)"], [["U+1F1F2", "U+1F1F3"], "🇲🇳", "flag: Mongolia"], [["U+1F1F2", "U+1F1F4"], "🇲🇴", "flag: Macao SAR China"], [["U+1F1F2", "U+1F1F5"], "🇲🇵", "flag: Northern Mariana Islands"], [["U+1F1F2", "U+1F1F6"], "🇲🇶", "flag: Martinique"], [["U+1F1F2", "U+1F1F7"], "🇲🇷", "flag: Mauritania"], [["U+1F1F2", "U+1F1F8"], "🇲🇸", "flag: Montserrat"], [["U+1F1F2", "U+1F1F9"], "🇲🇹", "flag: Malta"], [["U+1F1F2", "U+1F1FA"], "🇲🇺", "flag: Mauritius"], [["U+1F1F2", "U+1F1FB"], "🇲🇻", "flag: Maldives"], [["U+1F1F2", "U+1F1FC"], "🇲🇼", "flag: Malawi"], [["U+1F1F2", "U+1F1FD"], "🇲🇽", "flag: Mexico"], [["U+1F1F2", "U+1F1FE"], "🇲🇾", "flag: Malaysia"], [["U+1F1F2", "U+1F1FF"], "🇲🇿", "flag: Mozambique"], [["U+1F1F3", "U+1F1E6"], "🇳🇦", "flag: Namibia"], [["U+1F1F3", "U+1F1E8"], "🇳🇨", "flag: New Caledonia"], [["U+1F1F3", "U+1F1EA"], "🇳🇪", "flag: Niger"], [["U+1F1F3", "U+1F1EB"], "🇳🇫", "flag: Norfolk Island"], [["U+1F1F3", "U+1F1EC"], "🇳🇬", "flag: Nigeria"], [["U+1F1F3", "U+1F1EE"], "🇳🇮", "flag: Nicaragua"], [["U+1F1F3", "U+1F1F1"], "🇳🇱", "flag: Netherlands"], [["U+1F1F3", "U+1F1F4"], "🇳🇴", "flag: Norway"], [["U+1F1F3", "U+1F1F5"], "🇳🇵", "flag: Nepal"], [["U+1F1F3", "U+1F1F7"], "🇳🇷", "flag: Nauru"], [["U+1F1F3", "U+1F1FA"], "🇳🇺", "flag: Niue"], [["U+1F1F3", "U+1F1FF"], "🇳🇿", "flag: New Zealand"], [["U+1F1F4", "U+1F1F2"], "🇴🇲", "flag: Oman"], [["U+1F1F5", "U+1F1E6"], "🇵🇦", "flag: Panama"], [["U+1F1F5", "U+1F1EA"], "🇵🇪", "flag: Peru"], [["U+1F1F5", "U+1F1EB"], "🇵🇫", "flag: French Polynesia"], [["U+1F1F5", "U+1F1EC"], "🇵🇬", "flag: Papua New Guinea"], [["U+1F1F5", "U+1F1ED"], "🇵🇭", "flag: Philippines"], [["U+1F1F5", "U+1F1F0"], "🇵🇰", "flag: Pakistan"], [["U+1F1F5", "U+1F1F1"], "🇵🇱", "flag: Poland"], [["U+1F1F5", "U+1F1F2"], "🇵🇲", "flag: St. Pierre & Miquelon"], [["U+1F1F5", "U+1F1F3"], "🇵🇳", "flag: Pitcairn Islands"], [["U+1F1F5", "U+1F1F7"], "🇵🇷", "flag: Puerto Rico"], [["U+1F1F5", "U+1F1F8"], "🇵🇸", "flag: Palestinian Territories"], [["U+1F1F5", "U+1F1F9"], "🇵🇹", "flag: Portugal"], [["U+1F1F5", "U+1F1FC"], "🇵🇼", "flag: Palau"], [["U+1F1F5", "U+1F1FE"], "🇵🇾", "flag: Paraguay"], [["U+1F1F6", "U+1F1E6"], "🇶🇦", "flag: Qatar"], [["U+1F1F7", "U+1F1EA"], "🇷🇪", "flag: Réunion"], [["U+1F1F7", "U+1F1F4"], "🇷🇴", "flag: Romania"], [["U+1F1F7", "U+1F1F8"], "🇷🇸", "flag: Serbia"], [["U+1F1F7", "U+1F1FA"], "🇷🇺", "flag: Russia"], [["U+1F1F7", "U+1F1FC"], "🇷🇼", "flag: Rwanda"], [["U+1F1F8", "U+1F1E6"], "🇸🇦", "flag: Saudi Arabia"], [["U+1F1F8", "U+1F1E7"], "🇸🇧", "flag: Solomon Islands"], [["U+1F1F8", "U+1F1E8"], "🇸🇨", "flag: Seychelles"], [["U+1F1F8", "U+1F1E9"], "🇸🇩", "flag: Sudan"], [["U+1F1F8", "U+1F1EA"], "🇸🇪", "flag: Sweden"], [["U+1F1F8", "U+1F1EC"], "🇸🇬", "flag: Singapore"], [["U+1F1F8", "U+1F1ED"], "🇸🇭", "flag: St. Helena"], [["U+1F1F8", "U+1F1EE"], "🇸🇮", "flag: Slovenia"], [["U+1F1F8", "U+1F1EF"], "🇸🇯", "flag: Svalbard & Jan Mayen"], [["U+1F1F8", "U+1F1F0"], "🇸🇰", "flag: Slovakia"], [["U+1F1F8", "U+1F1F1"], "🇸🇱", "flag: Sierra Leone"], [["U+1F1F8", "U+1F1F2"], "🇸🇲", "flag: San Marino"], [["U+1F1F8", "U+1F1F3"], "🇸🇳", "flag: Senegal"], [["U+1F1F8", "U+1F1F4"], "🇸🇴", "flag: Somalia"], [["U+1F1F8", "U+1F1F7"], "🇸🇷", "flag: Suriname"], [["U+1F1F8", "U+1F1F8"], "🇸🇸", "flag: South Sudan"], [["U+1F1F8", "U+1F1F9"], "🇸🇹", "flag: São Tomé & Príncipe"], [["U+1F1F8", "U+1F1FB"], "🇸🇻", "flag: El Salvador"], [["U+1F1F8", "U+1F1FD"], "🇸🇽", "flag: Sint Maarten"], [["U+1F1F8", "U+1F1FE"], "🇸🇾", "flag: Syria"], [["U+1F1F8", "U+1F1FF"], "🇸🇿", "flag: Eswatini"], [["U+1F1F9", "U+1F1E6"], "🇹🇦", "flag: Tristan da Cunha"], [["U+1F1F9", "U+1F1E8"], "🇹🇨", "flag: Turks & Caicos Islands"], [["U+1F1F9", "U+1F1E9"], "🇹🇩", "flag: Chad"], [["U+1F1F9", "U+1F1EB"], "🇹🇫", "flag: French Southern Territories"], [["U+1F1F9", "U+1F1EC"], "🇹🇬", "flag: Togo"], [["U+1F1F9", "U+1F1ED"], "🇹🇭", "flag: Thailand"], [["U+1F1F9", "U+1F1EF"], "🇹🇯", "flag: Tajikistan"], [["U+1F1F9", "U+1F1F0"], "🇹🇰", "flag: Tokelau"], [["U+1F1F9", "U+1F1F1"], "🇹🇱", "flag: Timor-Leste"], [["U+1F1F9", "U+1F1F2"], "🇹🇲", "flag: Turkmenistan"], [["U+1F1F9", "U+1F1F3"], "🇹🇳", "flag: Tunisia"], [["U+1F1F9", "U+1F1F4"], "🇹🇴", "flag: Tonga"], [["U+1F1F9", "U+1F1F7"], "🇹🇷", "flag: Turkey"], [["U+1F1F9", "U+1F1F9"], "🇹🇹", "flag: Trinidad & Tobago"], [["U+1F1F9", "U+1F1FB"], "🇹🇻", "flag: Tuvalu"], [["U+1F1F9", "U+1F1FC"], "🇹🇼", "flag: Taiwan"], [["U+1F1F9", "U+1F1FF"], "🇹🇿", "flag: Tanzania"], [["U+1F1FA", "U+1F1E6"], "🇺🇦", "flag: Ukraine"], [["U+1F1FA", "U+1F1EC"], "🇺🇬", "flag: Uganda"], [["U+1F1FA", "U+1F1F2"], "🇺🇲", "flag: U.S. Outlying Islands"], [["U+1F1FA", "U+1F1F3"], "🇺🇳", "flag: United Nations"], [["U+1F1FA", "U+1F1F8"], "🇺🇸", "flag: United States"], [["U+1F1FA", "U+1F1FE"], "🇺🇾", "flag: Uruguay"], [["U+1F1FA", "U+1F1FF"], "🇺🇿", "flag: Uzbekistan"], [["U+1F1FB", "U+1F1E6"], "🇻🇦", "flag: Vatican City"], [["U+1F1FB", "U+1F1E8"], "🇻🇨", "flag: St. Vincent & Grenadines"], [["U+1F1FB", "U+1F1EA"], "🇻🇪", "flag: Venezuela"], [["U+1F1FB", "U+1F1EC"], "🇻🇬", "flag: British Virgin Islands"], [["U+1F1FB", "U+1F1EE"], "🇻🇮", "flag: U.S. Virgin Islands"], [["U+1F1FB", "U+1F1F3"], "🇻🇳", "flag: Vietnam"], [["U+1F1FB", "U+1F1FA"], "🇻🇺", "flag: Vanuatu"], [["U+1F1FC", "U+1F1EB"], "🇼🇫", "flag: Wallis & Futuna"], [["U+1F1FC", "U+1F1F8"], "🇼🇸", "flag: Samoa"], [["U+1F1FD", "U+1F1F0"], "🇽🇰", "flag: Kosovo"], [["U+1F1FE", "U+1F1EA"], "🇾🇪", "flag: Yemen"], [["U+1F1FE", "U+1F1F9"], "🇾🇹", "flag: Mayotte"], [["U+1F1FF", "U+1F1E6"], "🇿🇦", "flag: South Africa"], [["U+1F1FF", "U+1F1F2"], "🇿🇲", "flag: Zambia"], [["U+1F1FF", "U+1F1FC"], "🇿🇼", "flag: Zimbabwe"]]], ["subdivision-flag", [[["U+1F3F4", "U+E0067", "U+E0062", "U+E0065", "U+E006E", "U+E0067", "U+E007F"], "🏴󠁧󠁢󠁥󠁮󠁧󠁿", "flag: England"], [["U+1F3F4", "U+E0067", "U+E0062", "U+E0073", "U+E0063", "U+E0074", "U+E007F"], "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "flag: Scotland"], [["U+1F3F4", "U+E0067", "U+E0062", "U+E0077", "U+E006C", "U+E0073", "U+E007F"], "🏴󠁧󠁢󠁷󠁬󠁳󠁿", "flag: Wales"]]]]]];
var _default = EmojiChars;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/EmojiAnims.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/EmojiAnims.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.EmojiAnimByIdent = exports.default = void 0;
var EmojiAnims = [["(heart)", "heart.png", "Heart"], ["(cool)", "cool.png", "Cool"], ["(hearteyes)", "hearteyes.png", "Heart eyes"], ["(stareyes)", "stareyes.png", "Star eyes"], ["(like)", "like.png", "Like"], ["(unamused)", "unamused.png", "Unamused"], ["(cwl)", "cwl.png", "Crying with laughter"], ["(xd)", "xd.png", "XD smiley"], [":)", "smile.png", "Smile"], [":(", "sad.png", "Sad"], [":D", "laugh.png", "Laugh"], [":O", "surprised.png", "Surprised"], [";)", "wink.png", "Wink"], [";(", "cry.png", "Crying"], ["(shivering)", "shivering.png", "Cold shivering"], ["(:|", "sweat.png", "Sweating"], [":|", "speechless.png", "Speechless"], [":P", "tongueout.png", "Cheeky"], [":$", "blush.png", "Blushing"], ["(inlove)", "inlove.png", "In love"], ["(kiss)", "kiss.png", "Kiss"], [":^)", "wonder.png", "Wondering"], ["|-)", "sleepy.png", "Sleepy"], ["|-(", "dull.png", "Dull"], ["(yawn)", "yawn.png", "Yawn"], ["(puke)", "puke.png", "Vomiting"], ["(doh)", "doh.png", "Doh!"], ["(angry)", "angry.png", "Angry"], ["(wasntme)", "wasntme.png", "It wasn't me!"], ["(worry)", "worry.png", "Worried"], ["(mm)", "mmm.png", "Mmmmm…"], ["(nerd)", "nerdy.png", "Nerdy"], ["(rainbowsmile)", "rainbowsmile.png", "Rainbow smile"], [":x", "lipssealed.png", "My lips are sealed"], ["(devil)", "devil.png", "Devil"], ["(angel)", "angel.png", "Angel"], ["(envy)", "envy.png", "Envy"], ["(makeup)", "makeup.png", "Make-up"], ["(think)", "think.png", "Thinking"], ["(rofl)", "rofl.png", "Rolling on the floor laughing"], ["(happy)", "happy.png", "Happy"], ["(smirk)", "smirk.png", "Smirking"], ["(nod)", "nod.png", "Nodding"], ["(shake)", "shake.png", "Shake"], ["(waiting)", "waiting.png", "Waiting"], ["(emo)", "emo.png", "Emo"], ["(donttalk)", "donttalktome.png", "Don't talk to me"], ["(idea)", "idea.png", "Idea"], ["(talk)", "talk.png", "Talking"], ["(swear)", "swear.png", "Swearing"], ["]:)", "evilgrin.png", "Evil grin"], ["(headbang)", "headbang.png", "Banging head on wall"], ["(learn)", "learn.png", "Global Learning"], ["(headphones)", "headphones.png", "Listening to headphones"], ["(morningafter)", "hungover.png", "Morning after party"], ["(selfie)", "selfie.png", "Selfie"], ["(shock)", "shock.png", "Spoiler alert"], ["(llsshock)", "llsshock.png", "Spoiler alert"], ["(ttm)", "ttm.png", "Talking too much"], ["(dream)", "dream.png", "Dreaming"], ["(ill)", "ill.png", "Ill"], ["(tired)", "tired.png", "Tired"], ["(party)", "party.png", "Party"], ["(bandit)", "bandit.png", "Bandit"], ["(tauri)", "tauri.png", "Bald man with glasses"], ["(nazar)", "nazar.png", "Blessing"], ["(movember)", "movember.png", "Movember"], ["(mysteryskype)", "mysteryskype.png", "Mystery Skype"], ["(dotdfemale)", "dotdfemale.png", "Day of the dead"], ["(dotdmale)", "dotdmale.png", "Day of the dead"], ["(selfiediwali)", "selfiediwali.png", "Selfie Diwali"], ["(diwaliselfie)", "diwaliselfie.png", "Diwali selfie"], ["(steveaoki)", "steveaoki.png", "Steve Aoki"], ["(aokijump)", "aokijump.png", "Aoki jump"], ["(cakethrow)", "cakethrow.png", "Cake throw"], ["(kolony)", "kolony.png", "Kolony"], ["(joy)", "joy.png", "Joy"], ["(anger)", "anger.png", "Anger"], ["(sadness)", "sadness.png", "Sadness"], ["(disgust)", "disgust.png", "Disgust"], ["(fear)", "fear.png", "Fear"], ["(hestonfacepalm)", "hestonfacepalm.png", "Heston facepalm"], ["(heston)", "heston.png", "Heston Blumenthal"], ["(stormtrooper)", "stormtrooper.png", "Storm trooper"], ["(kyloren)", "kyloren.png", "Kylo Ren"], ["(captainphasma)", "captainphasma.png", "Captain Phasma"], ["(malthe)", "malthe.png", "Smiling man with glasses"], ["(ladyvamp)", "ladyvampire.png", "Lady vampire"], ["(vampire)", "vampire.png", "Vampire"], ["(ghost)", "ghost.png", "Ghost"], ["(skull)", "skull.png", "Skull"], ["(pumpkin)", "pumpkin.png", "Pumpkin"], ["(santa)", "santa.png", "Santa"], ["(xmascwl)", "xmascwl.png", "Xmas crying with laughter"], ["(festiveparty)", "festiveparty.png", "Festive party"], ["(holidayspirit)", "holidayspirit.png", "Holiday spirit"], ["(rudolfsurprise)", "rudolfsurprise.png", "Surprised Rudolf"], ["(rudolfidea)", "rudolfidea.png", "Rudolf idea"], ["(wtf)", "wtf.png", "WTF…"], ["(smoking)", "smoke.png", "Smoking"], ["(drunk)", "drunk.png", "Drunk"], ["(finger)", "finger.png", "Finger"], ["(oliver)", "oliver.png", "Man saying come on"], ["(xmassarcastic)", "xmassarcastic.png", "Xmas sarcastic"], ["(xmascry)", "xmascry.png", "Xmas cry"], ["(wave)", "hi.png", "Hi"], ["(highfive)", "highfive.png", "High five"], ["(clap)", "clap.png", "Clapping"], ["(sarcastic)", "sarcastic.png", "Sarcastic"], ["(chuckle)", "giggle.png", "Giggle"], ["(facepalm)", "facepalm.png", "Facepalm"], ["(rock)", "rock.png", "Rock"], ["(yn)", "fingerscrossed.png", "Fingers crossed"], ["(listening)", "listening.png", "Listening"], ["(wait)", "wait.png", "Wait"], ["(whew)", "whew.png", "Relieved"], ["(tmi)", "tmi.png", "Too much information"], ["(call)", "call.png", "Call"], ["(punch)", "punch.png", "Punch"], ["(talktothehand)", "talktothehand.png", "Talk to the hand"], ["(whistle)", "whistle.png", "Whistle"], ["(slap)", "slap.png", "Slap"], ["(lalala)", "lalala.png", "Lalala"], ["(y)", "yes.png", "Yes"], ["(n)", "no.png", "No"], ["(handshake)", "handshake.png", "Handshake"], ["(fistbump)", "fistbump.png", "Fist bump"], ["(poke)", "poke.png", "Poke"], ["(celebrate)", "handsinair.png", "Hands celebrating"], ["(hearthands)", "hearthands.png", "Heart hands"], ["(victory)", "victory.png", "Victory sign"], ["(noworries)", "noworries.png", "No worries"], ["(ok)", "ok.png", "OK"], ["(pray)", "praying.png", "Praying"], ["(flex)", "muscle.png", "Muscle"], ["(ek)", "naturescall.png", "Nature's call"], ["(woty)", "woty.png", "Woman of the year"], ["(glassceiling)", "glassceiling.png", "Glass ceiling"], ["(deadyes)", "deadyes.png", "Dead yes"], ["(xmasyes)", "xmasyes.png", "Xmas yes"], ["(dropthemic)", "dropthemic.png", "Drop the mic"]];
var _default = EmojiAnims;
exports.default = _default;
var EmojiAnimByIdent = EmojiAnims.reduce((ac, cr) => {
  ac[cr[0]] = cr;
  return ac;
}, {});
exports.EmojiAnimByIdent = EmojiAnimByIdent;
};

moduleFactories["node_modules/absol-acomp/js/adapter/SearchStringArrayAdapter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/adapter/SearchStringArrayAdapter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/**
 * @typedef {Object} SearchArrayAdapterOption
 * @property {function} searchFuntion
 * 
 * 
 * 
 * @param {Array<String>} arr 
 * @param {SearchArrayAdapterOption} options not implement yet
 */
function SearchStringArrayAdapter(texts, options) {
  if (!this.queryItems) return new SearchStringArrayAdapter(texts, options);
  this.texts = texts;
}

SearchStringArrayAdapter.prototype.queryItems = function (query, mInput) {
  var query = query.toLocaleLowerCase();
  return this.texts.map(function (text) {
    var start = text.toLocaleLowerCase().indexOf(query);

    if (start >= 0) {
      var hightlightedText = text.substr(0, start) + '<strong style="color:red">' + text.substr(start, query.length) + '</strong>' + text.substr(start + query.length);
      return {
        text: text,
        hightlightedText: hightlightedText
      };
    } else return null;
  }).filter(function (it) {
    return it !== null;
  });
};

SearchStringArrayAdapter.onAttached = function (parent) {
  this.parent = parent;
};

SearchStringArrayAdapter.prototype.getItemText = function (item, mInput) {
  return item.text;
};

SearchStringArrayAdapter.prototype.getItemView = function (item, index, _, $, query, reuseItem, refParent, mInput) {
  if (reuseItem) {
    reuseItem.childNodes[0].innerHTML = item.hightlightedText;
    return reuseItem;
  } else return _({
    tag: 'div',
    child: {
      tag: 'span',
      class: 'absol-autocomplete-input-item-text',
      props: {
        innerHTML: item.hightlightedText
      }
    }
  });
};

var _default = SearchStringArrayAdapter;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/adapter/SearchObjectArrayAdapter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/adapter/SearchObjectArrayAdapter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/**
 * @typedef {Object} SearchObjectArrayAdapter
 * @property {function} getItemText
 * 
 * 
 * 
 * @param {Array<Object>} arr 
 * @param {SearchArrayAdapterOption} options
 */
function SearchObjectArrayAdapter(objects, options) {
  if (!this.queryItems) return new SearchObjectArrayAdapter(texts, options);
  this.objects = objects;
  this.options = options;
}

SearchObjectArrayAdapter.prototype.queryItems = function (query, mInput) {
  var query = query.toLocaleLowerCase();
  return this.objects.map(function (object) {
    var text = this.getItemText(object);
    var start = text.toLocaleLowerCase().indexOf(query);

    if (start >= 0) {
      var hightlightedText = text.substr(0, start) + '<strong style="color:red">' + text.substr(start, query.length) + '</strong>' + text.substr(start + query.length);
      return Object.assign(object, {
        __hightlightedText__: hightlightedText
      });
    } else return null;
  }.bind(this)).filter(function (it) {
    return it !== null;
  });
};

SearchObjectArrayAdapter.prototype.onAttached = function (parent) {
  this.parent = parent;

  parent.getSelectedObject = function () {
    if (this._selectedIndex >= 0) {
      return this.$poolItems[this._selectedIndex]._holderItem;
    } else {
      return null;
    }
  };
};

SearchObjectArrayAdapter.prototype.getItemText = function (item, mInput) {
  if (this.options && this.options.getItemText) return this.options.getItemText.call(this, item, mInput);else if (typeof item.text == 'string') {
    return item.text;
  } else return item.toString();
};

SearchObjectArrayAdapter.prototype.getItemView = function (item, index, _, $, query, reuseItem, refParent, mInput) {
  if (reuseItem) {
    reuseItem.childNodes[0].innerHTML = item.__hightlightedText__;
    return reuseItem;
  } else return _({
    tag: 'div',
    child: {
      tag: 'span',
      props: {
        innerHTML: item.__hightlightedText__
      }
    }
  });
};

var _default = SearchObjectArrayAdapter;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/AutoCompleteInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/AutoCompleteInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/autocompleteinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _SearchStringArrayAdapter = _interopRequireDefault(require("./adapter/SearchStringArrayAdapter"));

var _SearchObjectArrayAdapter = _interopRequireDefault(require("./adapter/SearchObjectArrayAdapter"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 *
 * @extends {AElement}
 * @constructor
 */

function AutoCompleteInput() {
  this.$input = $('input', this).on('keyup', this.eventHandler.keyup).on('keydown', this.eventHandler.keydown).on('focus', this.eventHandler.focus).on('blur', this.eventHandler.blur);
  this.$dropdown = $('.absol-autocomplete-input-dropdown', this);
  this.$vscroller = $('bscroller', this).on('click', this.eventHandler.vscrollerClick);
  this.$poolItems = [];
  this._currentData = [];
  this._sessionIndex = 0;
  this._updatedSession = -1;
  this._cache = {};

  _OOP.default.drillProperty(this, this.$input, 'value');
}

AutoCompleteInput.tag = 'AutoCompleteInput'.toLowerCase();

AutoCompleteInput.render = function () {
  return _({
    extendEvent: 'change',
    class: 'absol-autocomplete-input',
    child: ['input[type="text"].absol-autocomplete-input-text', {
      class: 'absol-autocomplete-input-dropdown',
      style: {
        display: 'none'
      },
      child: {
        tag: 'bscroller',
        style: {
          'max-height': '500px'
        }
      }
    }]
  });
};

AutoCompleteInput.eventHandler = {};

AutoCompleteInput.eventHandler.keyup = function (event) {
  if (this._keyTimeout) {
    clearTimeout(this._keyTimeout);
    this._keyTimeout = 0;
  }

  var cTimeout = setTimeout(function () {
    clearTimeout(cTimeout);
    this.find();
  }.bind(this), 300);

  if (this._cacheTimeout) {
    clearTimeout(this._cacheTimeout);
    this._cacheTimeout = 0;
  }

  var cacheTimeout = setTimeout(function () {
    clearTimeout(cacheTimeout);
    this.clearCache();
  }.bind(this), 300);
  this._cacheTimeout = cacheTimeout;
  this._keyTimeout = cTimeout;
};

AutoCompleteInput.eventHandler.blur = function () {
  if (!this.hasClass('focus')) return;
  this.removeClass('focus');
  $(document.body).off('mousedown', this.eventHandler.clickOut);
};

AutoCompleteInput.eventHandler.focus = function () {
  if (this.hasClass('focus')) return;
  this.addClass('focus');
  $(document.body).on('mousedown', this.eventHandler.clickOut);
};

AutoCompleteInput.eventHandler.clickOut = function (event) {
  if (_EventEmitter.default.hitElement(this, event)) return;
  $(document.body).off('mousedown', this.eventHandler.clickOut);
  var text = this.$input.value;

  if (this._lastValue != text) {
    this._lastValue = text;
    this.$dropdown.addStyle('display', 'none');
    this._lastValue = text;
    this.emit('change', {
      target: this,
      value: text
    }, this);
  }
};

AutoCompleteInput.eventHandler.vscrollerClick = function (event) {
  var current = event.target;

  while (current && !current.hasClass('absol-autocomplete-input-item') && current != this.$vscroller) {
    current = current.parentElement;
  }

  if (current && current._holderItem) {
    var text = this.getItemText(current._holderItem);
    this.$input.value = text;
    this._lastQuery = text;
    this._selectedIndex = current._holderIndex;
    this.$dropdown.addStyle('display', 'none');
    this._lastValue = text;
    this.emit('change', {
      target: this,
      value: text
    }, this);
  }
};

AutoCompleteInput.eventHandler.keydown = function (event) {
  var key = event.key;

  if (key === 'ArrowDown') {
    if (this._selectedIndex + 1 < this._currentData.length) {
      if (this.$poolItems[this._selectedIndex]) {
        this.$poolItems[this._selectedIndex].removeClass('active');
      }

      this._selectedIndex += 1;

      if (this.$poolItems[this._selectedIndex]) {
        this.$poolItems[this._selectedIndex].addClass('active');

        this.$vscroller.scrollInto(this.$poolItems[this._selectedIndex]);
      }
    }

    event.preventDefault();
  } else if (key === 'ArrowUp') {
    if (this._selectedIndex - 1 >= 0) {
      if (this.$poolItems[this._selectedIndex]) {
        this.$poolItems[this._selectedIndex].removeClass('active');
      }

      this._selectedIndex -= 1;

      if (this.$poolItems[this._selectedIndex]) {
        this.$poolItems[this._selectedIndex].addClass('active');

        this.$vscroller.scrollInto(this.$poolItems[this._selectedIndex]);
      }
    }

    event.preventDefault();
  } else if (key === 'Enter') {
    var text;

    if (this._currentData[this._selectedIndex] === undefined) {
      text = this.$input.value;
    } else {
      text = this.getItemText(this._currentData[this._selectedIndex]);
      this.$input.value = text;
    }

    this._lastQuery = text;
    this.$dropdown.addStyle('display', 'none');
    this._lastValue = text;
    this.emit('change', {
      target: this,
      value: text
    }, this);
  }
};

AutoCompleteInput.prototype.focus = function () {
  if (this.disabled) return;
  this.$input.focus.apply(this.$input, arguments);
};

AutoCompleteInput.prototype.blur = function () {
  this.$input.blur.apply(this.$input, arguments);
};

AutoCompleteInput.prototype.select = function () {
  this.$input.select.apply(this.$input, arguments);
};

AutoCompleteInput.prototype.find = function () {
  var query = this.$input.value;
  if (query == this._lastQuery) return;
  this._lastQuery = query;
  var currentSession = ++this._sessionIndex;

  if (!query) {
    this.pushData([], currentSession, query);
    return;
  }

  if (this.disableCache) {
    var onReciveData = function (data) {
      cacheHolder.data = data;
      this.pushData(data, currentSession, query); //sessionIndex may be change
    }.bind(this);

    var result = this.queryItems(query);
    if (typeof result.then == 'function') result.then(onReciveData);else onReciveData(result);
  } else {
    if (this._cache[query]) {
      this._cache[query].sessionIndex = currentSession;

      if (!this._cache[query].pending) {
        var data = this._cache[query].data;
        this.pushData(data, currentSession);
      }
    } else {
      var cacheHolder = {
        pending: true,
        sessionIndex: currentSession
      };

      var onReciveData = function (data) {
        cacheHolder.data = data;
        cacheHolder.pending = false;
        this.pushData(data, cacheHolder.sessionIndex, query); //sessionIndex may be change
      }.bind(this);

      var result = this.queryItems(query);
      if (typeof result.then == 'function') result.then(onReciveData);else onReciveData(result);
      this._cache[query] = cacheHolder;
    }
  }
};

AutoCompleteInput.prototype.pushData = function (data, sessionIndex, query) {
  if (sessionIndex > this._updatedSession) {
    this._updatedSession = sessionIndex;
    this.$vscroller.clearChild();
    this._currentData = data;

    if (data && data.length > 0) {
      this.$dropdown.removeStyle('display');
    } else {
      this.$dropdown.addStyle('display', 'none');
    }

    var maxHeight = this.getComputedStyleValue('max-height');

    if (maxHeight == 'none' || !maxHeight) {
      maxHeight = 10000;
    } else {
      maxHeight = parseFloat(maxHeight.replace('px', ''));
    }

    var outBound = _Dom.default.traceOutBoundingClientRect(this);

    var bound = this.$input.getBoundingClientRect();
    var aTop = bound.top - outBound.top;
    var aBotom = outBound.bottom - bound.bottom;
    this.$dropdown.removeClass('top');

    if (aTop > aBotom) {
      maxHeight = Math.min(maxHeight, aTop - 10);
    } else {
      maxHeight = Math.min(maxHeight, aBotom - 10);
    }

    this.$vscroller.addStyle('max-height', maxHeight + 'px');
    this._selectedIndex = -1;
    data.reduce(function (sync, item, i, arr) {
      return sync.then(function () {
        if (this._updatedSession != sessionIndex) return;
        return new Promise(function (rs) {
          if (this._updatedSession != sessionIndex) return;
          var reuseItem = this.$poolItems.length > i ? this.$poolItems[i] : undefined;

          if (reuseItem) {
            reuseItem.removeClass('active');
          }

          var newView = this.getItemView(item, i, _, $, query, reuseItem, this);
          newView.addClass('absol-autocomplete-input-item');
          newView._holderItem = item;
          newView._holderIndex = i;
          if (i == this._selectedIndex) newView.addClass('active');

          if (this.$poolItems.length <= i) {
            this.$poolItems.push(newView);
          } else {
            this.$poolItems[i] = newView;
          }

          this.$vscroller.addChild(newView);

          if (i == 0) {
            var estimateHeight = newView.getBoundingClientRect().height * arr.length;

            if (aTop > aBotom && estimateHeight > aBotom) {
              this.$dropdown.addClass('top');
            }
          }

          if (i >= 50 && i % 50 == 0) setTimeout(rs, 0);else rs();
        }.bind(this));
      }.bind(this));
    }.bind(this), Promise.resolve());
  }
};

AutoCompleteInput.prototype.getItemText = function (item) {
  if (this.adapter && this.adapter.getItemText) {
    return this.adapter.getItemText(item, this);
  } else if (typeof item == 'string') {
    return item;
  } else {
    throw Error('You need adapter.getItemText(item, mAutoCompleteInput) to handle your item text!');
  }
};

AutoCompleteInput.prototype.getItemView = function (item, index, _, $, query, reuseItem, refParent) {
  if (this.adapter && this.adapter.getItemView) {
    return this.adapter.getItemView(item, index, _, $, query, reuseItem, refParent, this);
  } else {
    var text = this.getItemText(item);

    if (reuseItem) {
      reuseItem.childNodes[0].innerHTML = text;
      return reuseItem;
    }

    return _({
      child: {
        tag: 'span',
        class: 'absol-autocomplete-input-item-text',
        child: {
          text: text
        }
      }
    });
  }
};
/**
 * @param {String} query
 * @returns {Array}
 */


AutoCompleteInput.prototype.queryItems = function (query) {
  if (this.adapter && this.adapter.queryItems) {
    return this.adapter.queryItems(query, this);
  } else {
    throw new Error('Invalid adapter: queryItems(query, mAutoCompleteInput) not found!');
  }
};

AutoCompleteInput.prototype.clearCache = function (old) {
  if (typeof old != "number") old = 30;

  for (var key in this._cache) {
    var cacheHolder = this._cache[key];

    if (this._sessionIndex - cacheHolder.sessionIndex > old) {
      delete this._cache[key];
    }
  }
};

AutoCompleteInput.property = {};
AutoCompleteInput.property.adapter = {
  set: function (value) {
    if (value instanceof Array) {
      if (value[0] == 'SearchStringArray') {
        this._adapter = new _SearchStringArrayAdapter.default(value[1], value[2]);
      } else if (value[0] == 'SearchObjectArray') {
        this._adapter = new _SearchObjectArrayAdapter.default(value[1], value[2]);
      } else {
        throw new Error("Unknown adapter type name");
      }
    } else {
      this._adapter = value;
    }

    if (this.adapter && this.adapter.onAttached) {
      this.adapter.onAttached(this);
    }
  },
  get: function () {
    return this._adapter;
  }
};
AutoCompleteInput.property.selectedItem = {
  get: function () {
    return this._currentData && this._currentData[this._selectedIndex] || null;
  }
};
AutoCompleteInput.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('absol-disabled');
    } else {
      this.removeClass('absol-disabled');
    }
  },
  get: function () {
    return this.hasClass('absol-disabled');
  }
};
AutoCompleteInput.attribute = {};
AutoCompleteInput.attribute.disabled = {
  set: function (value) {
    if (value === true || value === 'true' || value === null) {
      this.disabled = true;
    } else {
      this.disabled = false;
    }
  },
  get: function () {
    return this.disabled ? 'true' : 'false';
  },
  remove: function () {
    this.disabled = false;
  }
};

_ACore.default.install(AutoCompleteInput);

var _default = AutoCompleteInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Board.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Board.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/boardtable.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function Board() {}

Board.tag = "board";

Board.render = function () {
  return _({
    class: 'as-board',
    extendEvent: ['sizechange', 'changeposition']
  });
};

Board.prototype.getParent = function () {
  var parent = this.parentElement;

  while (parent) {
    if (parent.classList.contains('ac-board-table')) return parent;
    parent = parent.parentElement;
  }

  return null;
};

_ACore.default.install(Board);

var _default = Board;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/String/stringUtils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/String/stringUtils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.stringHashCode = stringHashCode;

function stringHashCode(st) {
  var hash = 0,
      i,
      chr;
  if (st.length === 0) return hash;

  for (i = 0; i < st.length; i++) {
    chr = st.charCodeAt(i);
    hash = (hash << 5) - hash + chr;
    hash |= 0; // Convert to 32bit integer
  }

  return hash;
}

function crc16($str) {
  var $CRC16_Lookup = [0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0];
  var $crc16 = 0xFFFF; // the CRC

  var $len = $str.length;
  var $t;

  for (var $i = 0; $i < $len; $i++) {
    $t = $crc16 >> 8 ^ $str.charCodeAt($i); // High byte Xor Message Byte to get index

    $crc16 = $crc16 << 8 & 0xffff ^ $CRC16_Lookup[$t]; // Update the CRC from table
  }

  $crc16 = $crc16.toString(16).toUpperCase();
  return $crc16;
}
};

moduleFactories["node_modules/absol-acomp/js/FlexiconButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/FlexiconButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/flexiconbutton.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/**
 * @extends AElement
 * @constructor
 */

function FlexiconButton() {
  this._icon = null;
  this.$content = $('.as-flexicon-button-content', this);
  this.$iconCtn = $('.as-flexicon-button-icon-container', this);
  this.$textCtn = $('.as-flexicon-button-text-container', this);
}

FlexiconButton.tag = 'FlexiconButton'.toLowerCase();

FlexiconButton.render = function () {
  return _({
    tag: 'button',
    class: 'as-flexicon-button',
    child: {
      class: 'as-icon-button-table-box',
      child: {
        class: 'as-flexicon-button-content',
        child: ['.as-flexicon-button-icon-container', '.as-flexicon-button-text-container']
      }
    }
  });
};

FlexiconButton.property = {};
FlexiconButton.property.icon = {
  set: function (value) {
    value = value || null;
    this._icon = value;
    this.$iconCtn.clearChild();

    if (value !== null) {
      this.$iconCtn.addChild(_(value));
    }
  },
  get: function () {
    return this._icon;
  }
};
FlexiconButton.property.text = {
  /***
   *
   * @param {string| {mlKey:string}|*} value
   */
  set: function (value) {
    value = value || null;
    this._text = value;
    this.$textCtn.clearChild();
    this.$textCtn.attr('data-ml-key', undefined);

    if (value === null || value === undefined) {} else if (typeof value === "object") {
      if (value.mlKey) {
        this.$textCtn.attr('data-ml-key', value.mlKey);
      }
    } else {
      this.$textCtn.addChild(_({
        text: value + ''
      }));
    }
  },
  get: function () {
    return this._text;
  }
};

_ACore.default.install(FlexiconButton);

var _default = FlexiconButton;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MessageDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MessageDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _FlexiconButton = _interopRequireDefault(require("./FlexiconButton"));

require("../css/messagedialog.css");




/***
 * @extends AElement
 * @constructor
 */
function MessageDialog() {
  this.$header = (0, _ACore.$)('.as-message-dialog-header', this);
  this.$title = (0, _ACore._)({
    tag: 'span',
    class: 'as-message-dialog-title',
    child: {
      text: ''
    }
  });
  this.$body = (0, _ACore.$)('.as-message-dialog-body', this);
  this.$footer = (0, _ACore.$)('.as-message-dialog-footer', this);
  this.$actionBtns = [];
}

MessageDialog.tag = 'MessageDialog'.toLowerCase();

MessageDialog.render = function () {
  return (0, _ACore._)({
    extendEvent: ['action'],
    class: 'as-message-dialog',
    child: [{
      class: 'as-message-dialog-header'
    }, {
      class: 'as-message-dialog-body'
    }, {
      class: 'as-message-dialog-footer'
    }]
  });
};

['addChild', 'removeChild', 'clearChild', 'addChildBefore', 'addChildAfter'].forEach(key => {
  MessageDialog.prototype[key] = function () {
    this.$body[key].apply(this.$body, arguments);
    return this;
  };
});

MessageDialog.prototype._makeActionBtn = function (action) {
  var button = (0, _ACore._)({
    tag: _FlexiconButton.default.tag,
    class: action.class || [],
    props: {
      text: action.text || action.name,
      icon: action.icon || null
    },
    on: {
      click: event => {
        this.emit('action', {
          type: 'action',
          target: this,
          originalEvent: event,
          action: action
        }, this);
      }
    }
  });
  if (action.name) button.attr('data-name', action.name);
  return button;
};

MessageDialog.property = {};
MessageDialog.property.dialogActions = {
  /***
   * @this MessageDialog
   * @param actions
   */
  set: function (actions) {
    this._actions = actions || [];
    this.$actionBtns.forEach(button => button.remove());
    this.$actionBtns = this._actions.map(action => this._makeActionBtn(action));
    this.$footer.addChild(this.$actionBtns);
  },
  get: function () {
    return this._actions;
  }
};
MessageDialog.property.dialogTitle = {
  set: function (value) {
    this._dialogTitle = value;
    this.$title.firstChild.data = '';
    this.$title.attr('data-ml-key', undefined);

    if (typeof value === "string") {
      this.$title.firstChild.data = value;
    } else if (value && value.mlKey) {
      this.$title.firstChild.data = '';
      this.$title.attr('data-ml-key', value.mlKey);
    }

    if (value && !this.$title.parentElement) {
      this.$header.addChild(this.$title);
    } else if (!value && this.$title.parentElement) {
      this.$title.remove();
    }
  },
  get: function () {
    return this._dialogTitle;
  }
};

_ACore.default.install(MessageDialog);

var _default = MessageDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/YesNoQuestionDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/YesNoQuestionDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/messagedialog.css");

var _MessageDialog = _interopRequireDefault(require("./MessageDialog"));




/***
 * @extends MessageDialog
 * @constructor
 */
function YesNoQuestionDialog() {
  this.dialogActions = [{
    class: 'secondary',
    text: 'No',
    name: 'no'
  }, {
    class: 'primary',
    text: 'Yes',
    name: 'yes'
  }];
  this.$yesBtn = this.$actionBtns[1];
  this.$noBtn = this.$actionBtns[0];
  this.$message = (0, _ACore.$)('.as-message-dialog-message', this);
  /*{
          class: 'as-message-dialog-footer',
          child: [
              {
                  tag: FlexiconButton.tag,
                  class: ['as-message-dialog-no-btn', 'secondary'],
                  props: {
                      text: 'No'
                  }
              },
              {
                  tag: FlexiconButton.tag,
                  class: ['as-message-dialog-yes-btn', 'primary'],
                  props: {
                      text: 'Yes'
                  }
              }
          ]
      }*/
}

YesNoQuestionDialog.tag = 'YesNoQuestionDialog'.toLowerCase();

YesNoQuestionDialog.render = function () {
  return (0, _ACore._)({
    tag: _MessageDialog.default.tag,
    child: [{
      tag: 'span',
      class: 'as-message-dialog-message',
      child: {
        text: ''
      }
    }]
  });
};

YesNoQuestionDialog.eventHandler = {};
YesNoQuestionDialog.property = {};
YesNoQuestionDialog.property.message = {
  set: function (value) {
    value = (value || '') + '';
    this.$message.firstChild.data = value;
  },
  get: function () {
    return this.$message.firstChild.data;
  }
};
YesNoQuestionDialog.property.textYes = {
  set: function (value) {
    value = (value || 'Yes') + '';
    this.$yesBtn.text = value;
    this.dialogActions[1].text = value;
  },
  get: function () {
    return this.$yesBtn.text;
  }
};
YesNoQuestionDialog.property.textNo = {
  set: function (value) {
    value = (value || 'No') + '';
    this.$noBtn.text = value;
    this.dialogActions[0].text = value;
  },
  get: function () {
    return this.$noBtn.text;
  }
};

_ACore.default.install(YesNoQuestionDialog);

var _default = YesNoQuestionDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Modal.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Modal.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/modal.css");

var _ACore = _interopRequireDefault(require("../ACore"));


var $ = _ACore.default.$;
var _ = _ACore.default._;

function Modal() {
  this._contentAlign = [];
  this.contentAlign = 'middle center';
  this.$content = $('.as-modal-content', this);
}

Modal.tag = 'modal';

Modal.render = function () {
  return _({
    class: 'as-modal',
    child: '.as-modal-content'
  });
};

['findChildBefore', 'findChildAfter', 'removeChild', 'clearChild', 'addChild'].forEach(function (key) {
  Modal.prototype[key] = function () {
    this.$content[key].apply(this.$content, arguments);
  };
});

Modal.prototype.getChildren = function () {
  return this.$content.children;
};

Modal.property = {};
Modal.property.show = {
  set: function (value) {
    if (value) this.removeClass('as-hidden');else this.addClass('as-hidden');
  },
  get: function () {
    return !this.hasClass('as-hidden');
  }
};
Modal.property.contentAlign = {
  set: function (value) {
    var thisM = this;

    this._contentAlign.forEach(function (name) {
      thisM.removeClass('as-' + name);
    });

    value = value || '';

    if (typeof value === 'string') {
      this._contentAlign = value.split(/\s+/);
    } else if (value instanceof Array) {
      this._contentAlign = value;
    } else {
      throw new Error("Invalid contentAlign!");
    }

    var thisM = this;

    this._contentAlign.forEach(function (name) {
      thisM.addClass('as-' + name);
    });
  },
  get: function () {
    return this._contentAlign.join(' ');
  }
};

_ACore.default.install(Modal);

var _default = Modal;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/utils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/utils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getSelectionRangeDirection = getSelectionRangeDirection;
exports.setSelectionRange = setSelectionRange;
exports.insertTextAtCursor = insertTextAtCursor;
exports.contenteditableTextOnly = contenteditableTextOnly;
exports.getSelectionText = getSelectionText;
exports.positiveIntMod = positiveIntMod;
exports.nearFloor = nearFloor;
exports.measureText = measureText;
exports.getCaretPosition = getCaretPosition;
exports.preventNotNumberInput = preventNotNumberInput;
exports.buildCss = buildCss;
exports.forwardEvent = forwardEvent;
exports.forwardMethod = forwardMethod;
exports.openFileDialog = openFileDialog;
exports.openYesNoQuestionDialog = openYesNoQuestionDialog;
exports.estimateWidth14 = estimateWidth14;
exports.absCeil = absCeil;
exports.zeroPadding = zeroPadding;
exports.cleanMenuItemProperty = cleanMenuItemProperty;
exports.getTagListInTextMessage = getTagListInTextMessage;
exports.swapElt = swapElt;
exports.swapChildrenInElt = swapChildrenInElt;
exports.vScrollIntoView = vScrollIntoView;
exports.fileSize2Text = fileSize2Text;
exports.isDateTimeFormatToken = isDateTimeFormatToken;
exports.isRealNumber = isRealNumber;
exports.isNaturalNumber = isNaturalNumber;
exports.parseLocalFloat = parseLocalFloat;
exports.formatLocalFloat = formatLocalFloat;
exports.isURLAddress = isURLAddress;
exports.fileAccept = fileAccept;
exports.fileInfoOf = fileInfoOf;
exports.addElementsBefore = addElementsBefore;
exports.addElementAfter = addElementAfter;
exports.getAncestorElementOf = getAncestorElementOf;
exports.checkedValues2RootTreeValues = checkedValues2RootTreeValues;
exports.rootTreeValues2CheckedValues = rootTreeValues2CheckedValues;
exports.copySelectionItemArray = copySelectionItemArray;
exports.isScrolledToBottom = isScrolledToBottom;
exports.implicitLatLng = implicitLatLng;
exports.getMapZoomLevel = getMapZoomLevel;
exports.latLngDistance = latLngDistance;
exports.keyStringOf = keyStringOf;
exports.jsStringOf = jsStringOf;
exports.calcDTQueryHash = calcDTQueryHash;
exports.replaceInObject = replaceInObject;
exports.replaceFileInObject = replaceFileInObject;
exports.isNone = isNone;
exports.charWidth = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _stringUtils = require("absol/src/String/stringUtils");

var _YesNoQuestionDialog = _interopRequireDefault(require("./YesNoQuestionDialog"));

var _Modal = _interopRequireDefault(require("./Modal"));

var _ext2MineType = _interopRequireDefault(require("absol/src/Converter/ext2MineType"));




function getSelectionRangeDirection(range) {
  var sel = document.getSelection();
  var direction = 'forward';
  var cmpPosition = sel.anchorNode.compareDocumentPosition(sel.focusNode);

  if (cmpPosition === 4) {
    direction = 'forward';
  } else if (cmpPosition === 2) {
    direction = 'backward';
  } else if (!cmpPosition && sel.anchorOffset > sel.focusOffset || cmpPosition === Node.DOCUMENT_POSITION_PRECEDING) {
    direction = 'backward';
  }

  return direction;
}
/***
 *
 * @param {Range} range
 * @param {boolean=} backward
 */


function setSelectionRange(range, backward) {
  var sel = document.getSelection();

  if (backward) {
    if (typeof sel.extend != "undefined") {
      var endRange = range.cloneRange();
      endRange.collapse(false);
      sel.removeAllRanges();
      sel.addRange(endRange);
      sel.extend(range.startContainer, range.startOffset);
    }
  } else {
    sel.removeAllRanges();
    sel.addRange(range);
  }
}

function insertTextAtCursor(text) {
  var sel, range;

  if (window.getSelection) {
    sel = window.getSelection();

    if (sel.getRangeAt && sel.rangeCount) {
      range = sel.getRangeAt(0);
      range.deleteContents();
      range.insertNode(document.createTextNode(text));
    }
  } else if (document.selection && document.selection.createRange) {
    document.selection.createRange().text = text;
  }
}

function contenteditableTextOnly(element, processText) {
  if (element.__contenteditableTextOnly__) return;
  element.__contenteditableTextOnly__ = true;
  element.addEventListener("paste", function (e) {
    e.preventDefault();

    if (e.clipboardData && e.clipboardData.getData) {
      var text = e.clipboardData.getData("text/plain");
      if (processText) text = processText(text);
      document.execCommand("insertHTML", false, text);
    } else if (window.clipboardData && window.clipboardData.getData) {
      var text = window.clipboardData.getData("Text");
      if (processText) text = processText(text);
      insertTextAtCursor(text);
    }
  });
}

function getSelectionText() {
  var text = "";
  var activeEl = document.activeElement;
  var activeElTagName = activeEl ? activeEl.tagName.toLowerCase() : null;

  if (activeElTagName == "textarea" || activeElTagName == "input" && /^(?:text|search|password|tel|url)$/i.test(activeEl.type) && typeof activeEl.selectionStart == "number") {
    text = activeEl.value.slice(activeEl.selectionStart, activeEl.selectionEnd);
  } else if (window.getSelection) {
    text = window.getSelection().toString();
  }

  return text;
}
/***
 *
 * @param num
 * @param maxVal
 * @return {number}
 */


function positiveIntMod(num, maxVal) {
  if (maxVal <= 0) return 0;

  if (num >= 0 && num < maxVal) {
    return Math.floor(num);
  } else if (num === Infinity) {
    if (maxVal === Infinity) return Infinity;else return 0;
  } else if (num < 0) {
    return (num + Math.ceil(-num / maxVal) * maxVal) % maxVal;
  } else if (num >= maxVal) {
    return Math.floor(num) % maxVal;
  } else return 0;
}

function nearFloor(x, epsilon) {
  var y = Math.floor(x);
  if (x - y + epsilon >= 1) y++;
  return y;
}

function measureText(text, font) {
  // re-use canvas object for better performance
  var canvas = measureText.canvas || (measureText.canvas = document.createElement("canvas"));
  var context = canvas.getContext("2d");
  if (font) context.font = font;
  var metrics = context.measureText(text);
  return metrics;
}

function getCaretPosition(oField) {
  var iCaretPos = 0;

  if (document.selection) {
    oField.focus();
    var oSel = document.selection.createRange();
    oSel.moveStart('character', -oField.value.length);
    iCaretPos = oSel.text.length;
  } else if (oField.selectionStart || oField.selectionStart == '0') iCaretPos = oField.selectionDirection == 'backward' ? oField.selectionStart : oField.selectionEnd;

  return iCaretPos;
}
/**
 *
 * @param {AElement} elt
 */


function preventNotNumberInput(elt) {
  elt.addEventListener('keyup', function () {
    var lastValue = elt.tagName === "DIV" || elt.tagName === "SPAN" ? elt.innerHTML : elt.attributes.value;
    var cValue = parseFloat(this.value);

    if (this.value != lastValue) {
      elt.attributes.value = cValue;
      elt.emit('change', cValue, elt);
    }
  });
  elt.addEventListener("paste", function (e) {
    e.preventDefault();
    var text = "";

    if (e.clipboardData && e.clipboardData.getData) {
      text = e.clipboardData.getData("text/plain");
    } else if (window.clipboardData && window.clipboardData.getData) {
      text = window.clipboardData.getData("Text");
    }

    var matched = text.match(/[+-]?([0-9]*[.])?[0-9]+/);

    if (matched) {
      this.value = matched[0];
    }
  });
  elt.addEventListener('keydown', function (event) {
    var key = event.key;

    if (key && key.length == 1 && !event.ctrlKey && !event.altKey) {
      if (key.match(/[0-9.\-\+]/)) {
        if (key == '.' && this.value.indexOf('.') >= 0) event.preventDefault();
        if ((key == '+' || key == '-') && (this.value.indexOf('+') >= 0 || this.value.indexOf('-') >= 0 || getCaretPosition(this) > 0)) event.preventDefault();
      } else event.preventDefault();
    }
  });
}

function buildCss(StyleSheet) {
  return (0, _ACore._)({
    tag: 'style',
    props: {
      innerHTML: Object.keys(StyleSheet).map(function (key) {
        var style = StyleSheet[key];
        return key + ' {\n' + Object.keys(style).map(function (propName) {
          return propName + ': ' + style[propName] + ';';
        }).join('\n') + '}';
      }).join('\n')
    }
  }).addTo(document.head);
}

function forwardEvent(elt, fromName, toName) {
  elt.defineEvent(toName);
  elt.on(fromName, function (event) {
    event = Object.assign({}, event);
    event.type = toName;
    this.emit.apply(this, [toName, event].concat(Array.prototype.slice.call(arguments, 1)));
  });
}

function forwardMethod(elt, fromName, toName) {
  elt[fromName] = function () {
    this[toName].apply(this, arguments);
  };
}
/***
 *
 * @param {"camera"|"microphone"|"camcorder"|{accept:("image/*"|"audio/*"|"video/*"|undefined), capture:boolean|undefined, multiple:boolean|undefined}|{}=} props
 * @param {boolean=}unSafe
 *  @return {Promise<File[]>}
 */


function openFileDialog(props, unSafe) {
  return new Promise(function (resolve) {
    var input = _ACore.default._({
      tag: 'input',
      style: {
        display: 'none'
      },
      attr: {
        type: 'file'
      }
    }).addTo(document.body);

    props = props || {};

    if (props === 'camera') {
      props = {
        accept: 'image/*',
        capture: 'camera'
      };
    } else if (props === 'microphone') {
      props = {
        accept: 'audio/*',
        capture: "microphone"
      };
    } else if (props === 'camcorder') {
      props = {
        accept: 'video/*',
        capture: 'camcorder'
      };
    }

    if (props.accept) {
      if (props.accept instanceof Array) input.attr('accept', props.accept.join(','));else input.attr('accept', props.accept);
    } else {
      input.attr('accept', null);
    }

    if (props.capture) {
      input.attr('capture', props.capture);
    }

    if (props.multiple) {
      input.attr('multiple', 'true');
    } else {
      input.attr('multiple');
    }

    input.value = null;

    function focusHandler() {
      setTimeout(function () {
        window.removeEventListener('focus', focusHandler);

        if (unSafe) {
          input.off('change', changeHandler);
          input.remove();
          resolve([]);
        }
      }, 1000);
    }

    function changeHandler() {
      input.off('change', changeHandler);
      window.removeEventListener('focus', focusHandler);
      var files = Array.prototype.slice.call(input.files);
      resolve(files);
      input.remove();
    }

    input.on('change', changeHandler);
    input.click();
    setTimeout(function () {
      window.addEventListener('focus', focusHandler);
    }, 10);
  });
}

function openYesNoQuestionDialog(title, message) {
  return new Promise(resolve => {
    if (window.ModalElement && window.ModalElement.question) {
      window.ModalElement.question({
        title: title,
        message: message,
        onclick: function (sel) {
          if (sel === 0) {
            resolve(true);
          } else {
            resolve(false);
          }
        }
      });
    } else {
      var modal = (0, _ACore._)({
        tag: _Modal.default.tag,
        child: {
          tag: _YesNoQuestionDialog.default.tag,
          props: {
            textYes: 'Có',
            textNo: 'Không',
            message: message,
            dialogTitle: title
          },
          on: {
            action: event => {
              modal.remove();
              resolve(event.action.name === 'yes');
            }
          }
        }
      }).addTo(document.body);
    }
  });
}

var charWidth = {
  "A": 9.337890625,
  "Á": 9.337890625,
  "À": 9.337890625,
  "Ả": 9.337890625,
  "Ã": 9.337890625,
  "Ạ": 9.337890625,
  "a": 7.7861328125,
  "á": 7.7861328125,
  "à": 7.7861328125,
  "ả": 7.7861328125,
  "ã": 7.7861328125,
  "ạ": 7.7861328125,
  "Ă": 9.337890625,
  "Ắ": 9.337890625,
  "Ằ": 9.337890625,
  "Ẳ": 9.337890625,
  "Ẵ": 9.337890625,
  "Ặ": 9.337890625,
  "ă": 7.7861328125,
  "ắ": 7.7861328125,
  "ằ": 7.7861328125,
  "ẳ": 7.7861328125,
  "ẵ": 7.7861328125,
  "ặ": 7.7861328125,
  "Â": 9.337890625,
  "Ấ": 9.337890625,
  "Ầ": 9.337890625,
  "Ẩ": 9.337890625,
  "Ẫ": 9.337890625,
  "Ậ": 9.337890625,
  "â": 7.7861328125,
  "ấ": 7.7861328125,
  "ầ": 7.7861328125,
  "ẩ": 7.7861328125,
  "ẫ": 7.7861328125,
  "ậ": 7.7861328125,
  "B": 9.337890625,
  "b": 7.7861328125,
  "C": 10.1103515625,
  "c": 7,
  "D": 10.1103515625,
  "d": 7.7861328125,
  "Đ": 10.1103515625,
  "đ": 7.7861328125,
  "E": 9.337890625,
  "É": 9.337890625,
  "È": 9.337890625,
  "Ẻ": 9.337890625,
  "Ẽ": 9.337890625,
  "Ẹ": 9.337890625,
  "e": 7.7861328125,
  "é": 7.7861328125,
  "è": 7.7861328125,
  "ẻ": 7.7861328125,
  "ẽ": 7.7861328125,
  "ẹ": 7.7861328125,
  "Ê": 9.337890625,
  "Ế": 9.337890625,
  "Ề": 9.337890625,
  "Ể": 9.337890625,
  "Ễ": 9.337890625,
  "Ệ": 9.337890625,
  "ê": 7.7861328125,
  "ế": 7.7861328125,
  "ề": 7.7861328125,
  "ể": 7.7861328125,
  "ễ": 7.7861328125,
  "ệ": 7.7861328125,
  "G": 10.8896484375,
  "g": 7.7861328125,
  "H": 10.1103515625,
  "h": 7.7861328125,
  "I": 3.8896484375,
  "Í": 3.8896484375,
  "Ì": 3.8896484375,
  "Ỉ": 3.8896484375,
  "Ĩ": 3.8896484375,
  "Ị": 3.8896484375,
  "i": 3.1103515625,
  "í": 3.1103515625,
  "ì": 3.1103515625,
  "ỉ": 3.1103515625,
  "ĩ": 3.1103515625,
  "ị": 3.1103515625,
  "K": 9.337890625,
  "k": 7,
  "L": 7.7861328125,
  "l": 3.1103515625,
  "M": 11.662109375,
  "m": 11.662109375,
  "N": 10.1103515625,
  "n": 7.7861328125,
  "O": 10.8896484375,
  "Ó": 10.8896484375,
  "Ò": 10.8896484375,
  "Ỏ": 10.8896484375,
  "Õ": 10.8896484375,
  "Ọ": 10.8896484375,
  "o": 7.7861328125,
  "ó": 7.7861328125,
  "ò": 7.7861328125,
  "ỏ": 7.7861328125,
  "õ": 7.7861328125,
  "ọ": 7.7861328125,
  "Ô": 10.8896484375,
  "Ố": 10.8896484375,
  "Ồ": 10.8896484375,
  "Ổ": 10.8896484375,
  "Ỗ": 10.8896484375,
  "Ộ": 10.8896484375,
  "ô": 7.7861328125,
  "ố": 7.7861328125,
  "ồ": 7.7861328125,
  "ổ": 7.7861328125,
  "ỗ": 7.7861328125,
  "ộ": 7.7861328125,
  "Ơ": 12.00390625,
  "Ớ": 12.00390625,
  "Ờ": 12.00390625,
  "Ở": 12.00390625,
  "Ỡ": 12.00390625,
  "Ợ": 12.00390625,
  "ơ": 9.1806640625,
  "ớ": 9.1806640625,
  "ờ": 9.1806640625,
  "ở": 9.1806640625,
  "ỡ": 9.1806640625,
  "ợ": 9.1806640625,
  "P": 9.337890625,
  "p": 7.7861328125,
  "Q": 10.8896484375,
  "q": 7.7861328125,
  "R": 10.1103515625,
  "r": 4.662109375,
  "S": 9.337890625,
  "s": 7,
  "T": 8.5517578125,
  "t": 3.8896484375,
  "U": 10.1103515625,
  "Ú": 10.1103515625,
  "Ù": 10.1103515625,
  "Ủ": 10.1103515625,
  "Ũ": 10.1103515625,
  "Ụ": 10.1103515625,
  "u": 7.7861328125,
  "ú": 7.7861328125,
  "ù": 7.7861328125,
  "ủ": 7.7861328125,
  "ũ": 7.7861328125,
  "ụ": 7.7861328125,
  "Ư": 11.9560546875,
  "Ứ": 11.9560546875,
  "Ừ": 11.9560546875,
  "Ử": 11.9560546875,
  "Ữ": 11.9560546875,
  "Ự": 11.9560546875,
  "ư": 9.3720703125,
  "ứ": 9.3720703125,
  "ừ": 9.3720703125,
  "ử": 9.3720703125,
  "ữ": 9.3720703125,
  "ự": 9.3720703125,
  "V": 9.337890625,
  "v": 7,
  "X": 9.337890625,
  "x": 7,
  "Y": 9.337890625,
  "Ý": 9.337890625,
  "Ỳ": 9.337890625,
  "Ỷ": 9.337890625,
  "Ỹ": 9.337890625,
  "Ỵ": 9.337890625,
  "y": 7,
  "ý": 7,
  "ỳ": 7,
  "ỷ": 7,
  "ỹ": 7,
  "ỵ": 7,
  " ": 3.8896484375
};
exports.charWidth = charWidth;

function estimateWidth14(text) {
  // return absol.text.measureText(text, '14px arial').width
  var l = 0;

  for (var j = 0; j < text.length; ++j) {
    l += charWidth[text.charAt(j)] || 9.337890625;
  }

  return l;
}
/***
 *
 * @param {number} v
 * @returns {number}
 */


function absCeil(v) {
  var a = Math.ceil(Math.abs(v));
  return v < 0 ? -a : a;
}
/***
 *
 * @param {number} x
 * @param {number} l
 * @returns {String}
 */


function zeroPadding(x, l) {
  var res = Math.abs(x) + '';

  while (res.length < l) {
    res = '0' + res;
  }

  if (x < 0) res = '-' + res;
  return res;
}

var propertyFilter = ["$trigger", "$content", "_isShow", "defineEvent", "isSupportedEvent", "emit", "fire", "eventEmittorOnWithTime", "on", "once", "off", "init", "eventHandler", "super", "defineAttribute", "defineAttributes", "attr", "addStyle", "removeStyle", "addChild", "addTo", "selfRemove", "selfReplace", "clearChild", "containsClass", "addClass", "removeClass", "getComputedStyleValue", "getFontSize", "findChildAfter", "findChildBefore", "addChildBefore", "addChildAfter", "getBoundingRecursiveRect", "isDescendantOf", "getCSSRules", "afterAttached", "afterDisplayed", "_azar_extendEvents", "__azar_force", "_azar_extendAttributes", "_azar_extendTags", "findAvailablePosition", "$container", "autoFixParrentSize", "sync", "$dropper", "$vmenu", "$button", "$text", "$key", "$arrow", "$iconCtn", "_textMarginRight", "_tabIndex", '$icon', '_icon', '$textNode', '$primaryBtn', '$extendBtn', '_menuHolder', '_items', 'hasClass'].reduce(function (ac, cr) {
  ac[cr] = true;
  return ac;
}, {});
/**
 * This is a solution for menu, before a better one.
 * @param obj
 * @returns {{}}
 */

function cleanMenuItemProperty(obj) {
  var res = {};
  var keys = Object.keys(obj);
  var key;

  for (var i = 0; i < keys.length; ++i) {
    key = keys[i];

    if (!propertyFilter[key]) {
      res[key] = obj[key];
    }
  }

  res.text = obj.text;

  if (obj.icon) {
    res.icon = obj.icon;
  }

  if (obj.items) {
    res.items = obj.items;
  }

  return res;
}

function getTagListInTextMessage(text) {
  var rg = /@\[id:(\d+)]/g;
  var matched = rg.exec(text);
  var dict = {};
  var v;
  var res = [];

  while (matched) {
    v = parseInt(matched[1]);
    if (isNaN(v)) v = matched[1];

    if (!dict[v]) {
      dict[v] = true;
      res.push(v);
    }

    matched = rg.exec(text);
  }

  return res;
}
/***
 *
 * @param {AElement} e1
 * @param {AElement} e2
 */


function swapElt(e1, e2) {
  var temp = (0, _ACore._)('div');
  e1.parentElement.replaceChild(temp, e1);
  e2.parentElement.replaceChild(e1, e2);
  temp.parentElement.replaceChild(e2, temp);
}

function swapChildrenInElt(e1, e2) {
  var c1 = Array.prototype.slice.call(e1.childNodes);
  var c2 = Array.prototype.slice.call(e2.childNodes);
  (0, _ACore.$)(e1).clearChild();
  (0, _ACore.$)(e2).clearChild();

  while (c2.length > 0) {
    e1.appendChild(c2.shift());
  }

  while (c1.length > 0) {
    e2.appendChild(c1.shift());
  }
}
/**
 *
 * @param {HTMLElement} elt
 */


function vScrollIntoView(elt) {
  var parent = elt.parentElement;
  var overflowStyle;

  while (parent) {
    overflowStyle = window.getComputedStyle(parent)['overflow'];

    if ((overflowStyle === 'auto scroll' || overflowStyle === 'auto' || overflowStyle === 'hidden auto' || overflowStyle === 'scroll' || parent.tagName === 'HTML') && parent.clientHeight < parent.scrollHeight) {
      break;
    }

    parent = parent.parentElement;
  }

  if (!parent || parent === document || parent.tagName === "HTML" || parent.tagName === "html") {
    parent = document.body.parentElement;
  }

  var eBound = elt.getBoundingClientRect();
  var viewportBound = parent.getBoundingClientRect();
  var currentScrollTop = parent.scrollTop;
  var newScrollTop = currentScrollTop;

  if (eBound.bottom > viewportBound.bottom) {
    newScrollTop = currentScrollTop + (eBound.bottom - viewportBound.bottom);
  }

  if (eBound.top < viewportBound.top) {
    newScrollTop = currentScrollTop - (viewportBound.top - eBound.top);
  }

  if (newScrollTop != currentScrollTop) {
    parent.scrollTop = newScrollTop;
  }
}

function fileSize2Text(s) {
  if (typeof s !== "number" || isNaN(s)) return '';
  var units = ['B', 'KB', 'MB', 'GB', 'TB'];
  var b = 1;

  for (var i = 0; i < units.length; ++i) {
    if (s <= b * 1024) {
      return Math.floor(s / b * 100) / 100 + units[i];
    }

    b *= 1024;
  }

  return Math.floor(s / b * 10) / 100 + 'PB';
}

function isDateTimeFormatToken(text) {
  return ['d', 'dd', 'M', 'MM', 'y', 'yyyy', 'h', 'hh', 'H', 'HH', 'm', 'mm', 'a', 'w', 'ww', 'Q', 'QQ'].indexOf(text) >= 0;
}

function isRealNumber(value) {
  return isFinite(value) && typeof value === "number";
}

function isNaturalNumber(value) {
  return isFinite(value) && typeof value === "number" && Math.floor(value) === value && value >= 0;
}
/****
 *
 * @param {string} text
 * @param {{locales?:string}|string =} opt
 */


function parseLocalFloat(text, opt) {
  if (typeof opt === "string") opt = {
    locales: opt
  };
  var locales = opt && opt.locales || window.systemconfig && window.systemconfig.numberFormatLocales;
  var sample = locales ? new Intl.NumberFormat(locales).format(123456.78) : 123456.78.toLocaleString(); // decimal-separator, thousand-separator.

  var thousandSeparator = sample.match(/3(.?)4/)[1] || '';
  var decimalSeparator = sample.match(/6(.?)7/)[1];
  text = text.replace(new RegExp('[' + thousandSeparator + ']', 'g'), '').replace(new RegExp('[' + decimalSeparator + ']', 'g'), '.');
  return parseFloat(text);
}

function formatLocalFloat(value, opt) {
  if (typeof opt === "string") opt = {
    locales: opt
  };
  var formatOpt = Object.assign({}, opt);
  delete formatOpt.locales;
  var locales = opt && opt.locales || window.systemconfig && window.systemconfig.numberFormatLocales;
  var sample;
  var thousandSeparator;
  var decimalSeparator;

  if (!locales) {
    sample = 123456.78.toLocaleString();
    thousandSeparator = sample.match(/3(.?)4/)[1] || '';
    decimalSeparator = sample.match(/6(.?)7/)[1];
    if (decimalSeparator === '.') locales = 'en-US';else if (decimalSeparator === ',') {
      locales = 'vi-VN';
    }
  }

  return new Intl.NumberFormat(locales, formatOpt).format(value);
}
/***
 *
 * @param {String} text
 * @returns {Boolean}
 */


function isURLAddress(text) {
  if (typeof text != "string") return false;
  return text.startsWith('.') || text.startsWith('http://') || text.startsWith('https://') || text.startsWith('/');
}
/***
 *
 * @param {string | null} pattern
 * @param {string} typeString
 * @returns {boolean}
 */


function fileAccept(pattern, typeString) {
  if (!pattern) return true;
  var parts = pattern.split(',').map(function (x) {
    return x.trim().toLowerCase();
  });
  var ext = typeString.split('.').pop().toLowerCase();
  var mineType = typeString.split('/').shift().toLowerCase();
  return parts.some(function (part) {
    if (part === '*') return true;

    if (part === 'audio/*') {
      return mineType === 'audio' || ['.3gp', '.aa', '.aac', '.aax', '.act', '.aiff', '.alac', '.amr', '.ape', '.au', '.awb', '.dss', '.flac', '.gsm', '.m4a', '.m4b', '.m4p', '.mp3', '.mpc', '.ogg, .oga, .mogg', '.opus', '.ra', '.rm', '.raw', '.rf64', '.sln', '.tta', '.voc', '.vox', '.wav', '.wma', '.wv', '.webm', '.8svx', '.cda'].indexOf(ext) >= 0;
    } else if (part === 'video/*') {
      return mineType === 'video' || ['.webm', '.mkv', '.flv', '.flv', '.vob', '.drc', '.gif', '.gifv', '.mng', '.avi', '.wmv', '.yuv', '.rm', '.rmvb', '.viv', '.asf', '.amv', '.m4v', '.svi', '.3gp', '.3g2', '.mxf', '.roq', '.nsv'].indexOf(ext) >= 0;
    } else if (part === 'image/*') {
      return mineType === 'video' || ["ase", "art", "bmp", "blp", "cd5", "cit", "cpt", "cr2", "cut", "dds", "dib", "djvu", "egt", "exif", "gif", "gpl", "grf", "icns", "ico", "iff", "jng", "jpeg", "jpg", "jfif", "jp2", "jps", "lbm", "max", "miff", "mng", "msp", "nef", "nitf", "ota", "pbm", "pc1", "pc2", "pc3", "pcf", "pcx", "pdn", "pgm", "PI1", "PI2", "PI3", "pict", "pct", "pnm", "pns", "ppm", "psb", "psd", "pdd", "psp", "px", "pxm", "pxr", "qfx", "raw", "rle", "sct", "sgi", "rgb", "int", "bw", "tga", "tiff", "tif", "vtf", "xbm", "xcf", "xpm", "3dv", "amf", "ai", "awg", "cgm", "cdr", "cmx", "dxf", "e2d", "egt", "eps", "fs", "gbr", "odg", "svg", "stl", "vrml", "x3d", "sxd", "v2d", "vnd", "wmf", "emf", "art", "xar", "png", "webp", "jxr", "hdp", "wdp", "cur", "ecw", "iff", "lbm", "liff", "nrrd", "pam", "pcx", "pgf", "sgi", "rgb", "rgba", "bw", "int", "inta", "sid", "ras", "sun", "tga", "heic", "heif"].indexOf(ext) >= 0;
    } else if (part.startsWith('.')) {
      return '.' + ext === part;
    } else {
      return part === ext || part === mineType;
    }
  });
}
/***
 *
 * @param {File|Blob|string|{url:string}} fi
 */


function fileInfoOf(fi) {
  var res = {};

  var handle = o => {
    if (typeof o === "string") {
      res.name = res.name || (o.split('/').pop() || '').replace(/%([\dA-Fa-f][\dA-Fa-f])/g, (all, g1) => {
        var n = parseInt(g1, 16);

        if (typeof n === "number") {
          return String.fromCharCode(n);
        }

        return all;
      }).replace(/\?.+$/, '');
      if (!res.url && isURLAddress(o)) res.url = o;
    } else if (typeof o === "object" && o) {
      if (o instanceof Blob) {
        res.mimeType = o.type;
      }

      if (!res.name && typeof o.name === "string") {
        res.name = o.name;
      }

      if (!res.size && typeof o.size === "number") {
        res.size = o.size;
      }

      if (typeof o.url === "string") {
        res.url = o.url;
        handle(o.url);
      }
    }
  };

  handle(fi);

  if (res.name) {
    res.name = res.name.replace(/\.upload$/, '');
  }

  if (!res.type && res.name) {
    res.type = res.name.toLowerCase().split('.').slice(1).pop();
  }

  if (!res.mimeType && res.type) {
    res.mimeType = _ext2MineType.default[res.type];
  }

  for (var k in res) {
    if (res[k] === undefined) delete res[k];
  }

  return res;
}

function addElementsBefore(inElement, elements, at) {
  for (var i = 0; i < elements.length; ++i) {
    (inElement.addChildBefore || inElement.insertBefore).call(inElement, elements[i], at);
  }
}

function addElementAfter(inElement, elements, at) {
  var atIdx;
  var before;
  var i;

  if (at) {
    atIdx = Array.prototype.indexOf.call(inElement.childNodes, at);
    if (at && atIdx < 0) throw new Error("The node before which the new node is to be inserted is not a child of this node.");
    before = inElement.childNodes[atIdx + 1];

    if (before) {
      for (i = 0; i < elements.length; ++i) {
        (inElement.addChildBefore || inElement.insertBefore).call(inElement, elements[i], before);
      }
    } else {
      for (i = 0; i < elements.length; ++i) {
        (inElement.addChild || inElement.appendChild).call(inElement, elements[i]);
      }
    }
  } else {
    before = inElement.firstChild;

    for (i = 0; i < elements.length; ++i) {
      (inElement.addChildBefore || inElement.insertBefore).call(inElement, elements[i], before);
    }
  }
}

function getAncestorElementOf(elt) {
  while (elt.parentElement) {
    elt = elt.parentElement;
  }

  return elt;
}

function checkedValues2RootTreeValues(items, values) {
  var keyOf = x => typeof x + x;

  var dict = values.reduce((ac, cr) => {
    ac[keyOf(cr)] = true;
    return ac;
  }, {});

  var checkScan = item => {
    if (dict[keyOf(item.value)]) return true;

    if (item.items && item.items.length > 0) {
      item.items.forEach(sItem => checkScan(sItem));
      dict[keyOf(item.value)] = item.items.every(sItem => dict[keyOf(sItem.value)]);
    }

    return dict[keyOf(item.value)];
  };

  var res = [];

  var scan = item => {
    if (dict[keyOf(item.value)]) {
      res.push(item.value);
    } else if (item.items && item.items.length > 0) {
      item.items.forEach(sItem => scan(sItem));
    }
  };

  items.forEach(sItem => scan(sItem));
  return res;
}

function rootTreeValues2CheckedValues(items, values) {
  var keyOf = x => typeof x + x;

  var dict = values.reduce((ac, cr) => {
    ac[keyOf(cr)] = true;
    return ac;
  }, {});
  var res = [];

  var visit = (item, checked) => {
    if (checked) res.push(item.value);

    if (item.items && item.items.length > 0) {
      item.items.forEach(cr => visit(cr, checked || dict[keyOf(cr.value)]));
    }
  };

  items.forEach(cr => visit(cr, dict[keyOf(cr.value)]));
  return res;
}
/***
 *
 * @param {SelectionItem[]} items
 * @param {{removeNoView?: boolean}=} opt
 * @returns {SelectionItem[]}
 */


function copySelectionItemArray(items, opt) {
  opt = opt || {};

  if (opt.removeNoView) {
    items = items.filter(item => !item.noView);
  }

  return items.map(item => {
    var newItem;

    if (typeof item === "object" && 'text' in item) {
      newItem = Object.assign({}, item);
    } else {
      newItem = {
        text: item + '',
        value: item
      };
    }

    if (item.items) {
      newItem.items = copySelectionItemArray(item.items, opt);
    }

    return newItem;
  });
}

function compareSelectionItemArray(a, b) {
  if (a === b) return true;
  var aEmpty = !a || !a.length;
  var bEmpty = !b || !b.length;
  if (!aEmpty && aEmpty === bEmpty) return true;
  if (aEmpty !== bEmpty) return false;
  if (a.length !== b.length) return false;
  var n = a.length;
  var ait, bit;

  for (var i = 0; i < n; ++i) {
    ait = a[i];
    bit = b[i];
    if (ait === bit) continue;
    if (ait.text !== bit.text) return false;
    if (ait.text !== bit.text) return false;
    if (!compareSelectionItemArray(ait.items, bit.items)) return false;
  }

  return true;
}
/***
 *
 * @param {AElement|HTMLElement} element
 * @param {number} padding
 */


function isScrolledToBottom(element, padding) {
  if (!isRealNumber(padding)) padding = 0;
  return element.scrollHeight - element.scrollTop - padding <= element.clientHeight;
}

function implicitLatLng(value) {
  var latlng = null;
  var nums;

  if (typeof value === "string") {
    nums = value.split(/\s*,\s*/).map(function (t) {
      return parseFloat(t);
    });

    if (isRealNumber(nums[0]) && isRealNumber(nums[1])) {
      latlng = new google.maps.LatLng(nums[0], nums[1]);
    }
  } else if (value instanceof google.maps.LatLng) {
    latlng = value;
  } else if (value && isRealNumber(value.latitude) && isRealNumber(value.longitude)) {
    latlng = new google.maps.LatLng(value.latitude, value.longitude);
  } else if (value && isRealNumber(value.lat) && isRealNumber(value.lng)) {
    latlng = new google.maps.LatLng(value.lat, value.lng);
  } else if (value instanceof Array && isRealNumber(value[0]) && isRealNumber(value[1])) {
    latlng = new google.maps.LatLng(value[0], value[1]);
  }

  return latlng;
}

function getMapZoomLevel(mapDim, bounds) {
  var WORLD_DIM = {
    height: 256,
    width: 256
  };
  var ZOOM_MAX = 21;

  function latRad(lat) {
    var sin = Math.sin(lat * Math.PI / 180);
    var radX2 = Math.log((1 + sin) / (1 - sin)) / 2;
    return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
  }

  function zoom(mapPx, worldPx, fraction) {
    return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2);
  }

  var ne = bounds.getNorthEast();
  var sw = bounds.getSouthWest();
  var latFraction = (latRad(ne.lat()) - latRad(sw.lat())) / Math.PI;
  var lngDiff = ne.lng() - sw.lng();
  var lngFraction = (lngDiff < 0 ? lngDiff + 360 : lngDiff) / 360;
  var latZoom = zoom(mapDim.height, WORLD_DIM.height, latFraction);
  var lngZoom = zoom(mapDim.width, WORLD_DIM.width, lngFraction);
  return Math.min(latZoom, lngZoom, ZOOM_MAX);
}
/***
 *
 * @param p0
 * @param p1
 * @returns {number}
 */


function latLngDistance(p0, p1) {
  var lat0 = p0.lat();
  var lat1 = p1.lat();
  var lng0 = p0.lng();
  var lng1 = p1.lng();

  var toRad = function (value) {
    return value * Math.PI / 180;
  };

  var R = 6371;
  var dLat = toRad(lat1 - lat0);
  var dLng = toRad(lng1 - lng0);
  lat0 = toRad(lat0);
  lat1 = toRad(lat1);
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLng / 2) * Math.sin(dLng / 2) * Math.cos(lat0) * Math.cos(lat1);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d;
}

function keyStringOf(o) {
  var type = typeof o;
  var keys;

  if (o && type === "object") {
    if (typeof o.getTime === "function") {
      return 'd(' + o.getTime() + ')';
    } else if (typeof o.map === "function") {
      return 'a(' + o.map(val => keyStringOf(val)).join(',') + ')';
    } else {
      keys = Object.keys(o);
      keys.sort();
      return 'o(' + keys.map(key => key + ':' + keyStringOf(o[key])).join(',') + ')';
    }
  } else {
    return type[0] + '(' + o + ')';
  }
}

function jsStringOf(x) {
  if (x === null) return 'null';
  if (x === undefined) return 'undefined';
  var type = typeof x;
  if (type === 'string' || type === 'number') return JSON.stringify(x);
  if (x instanceof Date) return 'new Date(' + x.getTime() + ')';
  var keys;
  keys = Object.keys(x);
  keys.sort();
  return '{' + keys.map(function (key) {
    return JSON.stringify(key) + ':' + jsStringOf(x[key]);
  }).join(',') + '}';
}

function calcDTQueryHash(o) {
  var s = jsStringOf(o);
  return (0, _stringUtils.stringHashCode)(s);
}

function replaceInObject(o, replacer, test) {
  return new Promise(rs => {
    var sync = [];

    function visit(so) {
      Object.keys(so).forEach(key => {
        var newValue;

        if (test(so[key])) {
          newValue = replacer(so[key], key, so);

          if (newValue && newValue.then) {
            sync.push(newValue);
            newValue.then(newValue => so[key] = newValue);
          } else {
            so[key] = newValue;
          }
        } else if (typeof so[key] === "object" && so[key]) {
          visit(so[key]);
        }
      });
    }

    visit(o);
    Promise.all(sync).then(() => {
      rs(o);
    });
  });
}

function replaceFileInObject(o, replacer) {
  return replaceInObject(o, replacer, (value, key, object) => {
    return value instanceof File || value instanceof Blob;
  });
}

function isNone(x) {
  return x === null || x === undefined;
}
};

moduleFactories["node_modules/absol-acomp/js/Hanger.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Hanger.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/hanger.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/****
 * @extends AElement
 * @constructor
 */

function Hanger() {
  this.addClass('as-hanger');
  this.defineEvent(['predrag', 'dragstart', 'drag', 'dragend', 'draginit', 'dragdeinit']);
  this._hangOn = 0;
  this._hangerPointerData = null;
  this.on2({
    mousedown: this.eventHandler.hangerPointerDown,
    touchstart: this.eventHandler.hangerPointerDown
  });
  this._touchEvents = {
    touchend: this.eventHandler.hangerPointerFinish,
    touchcancel: this.eventHandler.hangerPointerFinish,
    touchmove: this.eventHandler.hangerPointerMove
  };
  this._mouseEvents = {
    mouseup: this.eventHandler.hangerPointerFinish,
    mouseleave: this.eventHandler.hangerPointerFinish,
    mousemove: this.eventHandler.hangerPointerMove
  };
}

Hanger.tag = 'hanger';

Hanger.render = function () {
  return _('div');
};

Hanger.prototype.on2 = function () {
  if (arguments.length == 1) {
    for (var name in arguments[0]) {
      Hanger.prototype.on2.call(this, name, arguments[0][name]);
    }
  } else if (arguments.length == 2) {
    this.addEventListener(arguments[0], arguments[1], _BrowserDetector.default.supportPassiveEvent ? {
      passive: false
    } : true);
  }
};

Hanger.prototype.off2 = function () {
  if (arguments.length == 1) {
    for (var name in arguments[0]) {
      Hanger.prototype.off2.call(this, name, arguments[0][name]);
    }
  } else if (arguments.length == 2) {
    this.removeEventListener(arguments[0], arguments[1], _BrowserDetector.default.supportPassiveEvent ? {
      passive: false
    } : true);
  }
};

Hanger.property = {};
/**
 * @type {Hanger}
 */

Hanger.property.hangOn = {
  set: function (value) {
    if (!(value > 0)) value = 0;
    this._hangOn = value;
  },
  get: function () {
    return this._hangOn;
  }
};
/**
 * @type {Hanger}
 */

Hanger.eventHandler = {};

Hanger.eventHandler.hangerPointerDown = function (event) {
  if (this._hangerPointerData) return;
  var bound = this.getBoundingClientRect();
  var startingPoint;
  var isTouch = event.type === 'touchstart';
  var pointerIdent = -1;
  var target;

  if (isTouch) {
    var touch = event.changedTouches[0];
    target = touch.target;
    pointerIdent = touch.identifier;
    startingPoint = new _Vec.default(touch.clientX, touch.clientY);
  } else {
    startingPoint = new _Vec.default(event.clientX, event.clientY);
    target = event.target;
  }

  var offsetVec = startingPoint.sub(new _Vec.default(bound.left, bound.top));
  this._hangerPointerData = {
    state: 0,
    isTouch: isTouch,
    bound: bound,
    startingPoint: startingPoint,
    offsetVec: offsetVec,
    pointerIdent: pointerIdent,
    target: target
  };
  var preDragEvent = {
    type: 'draginit',
    originEvent: event,
    isTouch: isTouch,
    bound: bound,
    startingPoint: startingPoint,
    currentPoint: startingPoint,
    offsetVec: offsetVec,
    pointerIdent: pointerIdent,
    canceled: false,
    cancel: function () {
      this.canceled = true;
    },
    clientX: startingPoint.x,
    clientY: startingPoint.y,
    target: target,
    preventDefault: function () {
      event.preventDefault();
    }
  };
  this.emit('draginit', preDragEvent, this);
  this.emit('predrag', Object.assign(preDragEvent, {
    type: 'predrag'
  }), this);

  if (preDragEvent.canceled) {
    this._hangerPointerData = null;
    return;
  }

  if (isTouch) this.on2.call(document, this._touchEvents);else this.on2.call(document, this._mouseEvents);
};

Hanger.eventHandler.hangerPointerMove = function (event) {
  var pointerData = this._hangerPointerData;
  var isTouch = pointerData.isTouch;
  var pointerIdent = -2;
  var currentPoint;

  if (isTouch) {
    var touch = (0, _EventEmitter.findChangedTouchByIdent)(event, pointerData.pointerIdent);

    if (touch) {
      pointerIdent = touch.identifier;
      currentPoint = new _Vec.default(touch.clientX, touch.clientY);
    }
  } else {
    currentPoint = new _Vec.default(event.clientX, event.clientY);
    pointerIdent = -1;
  }

  if (pointerIdent != pointerData.pointerIdent) return;
  pointerData.currentPoint = currentPoint;

  if (pointerData.state == 0) {
    var distance = currentPoint.sub(pointerData.startingPoint).abs();

    if (distance >= this._hangOn) {
      var dragStartEvent = {
        type: 'dragstart',
        originEvent: event,
        isTouch: isTouch,
        bound: pointerData.bound,
        startingPoint: pointerData.startingPoint,
        offsetVec: pointerData.offsetVec,
        pointerIdent: pointerIdent,
        currentPoint: currentPoint,
        target: pointerData.target,
        clientX: currentPoint.x,
        clientY: currentPoint.y,
        preventDefault: function () {
          event.preventDefault();
        }
      };

      pointerData.trackedScrollers = (() => {
        var res = [];
        var c = this._hangerPointerData.target;

        while (c) {
          c.addEventListener('scroll', this.eventHandler.trackingScroll);
          res.push(c);
          c = c.parentElement;
        }

        document.addEventListener('scroll', this.eventHandler.trackingScroll);
        res.push(document);
        return res;
      })();

      pointerData.state = 1;
      this.emit('dragstart', dragStartEvent, this);
    }
  }

  if (pointerData.state === 1) {
    var dragEvent = {
      type: 'drag',
      originEvent: event,
      isTouch: isTouch,
      bound: pointerData.bound,
      startingPoint: pointerData.startingPoint,
      offsetVec: pointerData.offsetVec,
      pointerIdent: pointerIdent,
      currentPoint: currentPoint,
      target: pointerData.target,
      clientX: currentPoint.x,
      clientY: currentPoint.y,
      preventDefault: function () {
        event.preventDefault();
      }
    };
    this.emit('drag', dragEvent, this);
  }
};

Hanger.eventHandler.hangerPointerFinish = function (event) {
  var pointerData = this._hangerPointerData;
  var isTouch = event.type === 'touchend';
  var dragEndEvent;
  if (pointerData.isTouch !== isTouch) return;
  var pointerIdent = -2;
  var currentPoint;

  if (isTouch) {
    var touch = (0, _EventEmitter.findChangedTouchByIdent)(event, pointerData.pointerIdent);

    if (touch) {
      pointerIdent = touch.identifier;
      currentPoint = new _Vec.default(touch.clientX, touch.clientY);
    }
  } else {
    currentPoint = new _Vec.default(event.clientX, event.clientY);
    pointerIdent = -1;
  }

  if (pointerIdent !== pointerData.pointerIdent) return;

  if (pointerData.state === 1) {
    pointerData.trackedScrollers.forEach(elt => elt.removeEventListener('scroll', this.eventHandler.trackingScroll));
    dragEndEvent = {
      type: 'dragend',
      originEvent: event,
      isTouch: isTouch,
      bound: pointerData.bound,
      startingPoint: pointerData.startingPoint,
      offsetVec: pointerData.offsetVec,
      pointerIdent: pointerIdent,
      currentPoint: currentPoint,
      target: pointerData.target,
      clientX: currentPoint.x,
      clientY: currentPoint.y,
      preventDefault: function () {
        event.preventDefault();
      }
    };
    this.emit('dragend', dragEndEvent, this);
  }

  this._hangerPointerData = null;
  if (isTouch) this.off2.call(document, this._touchEvents);else this.off2.call(document, this._mouseEvents);
  this.emit('dragdeinit', {
    type: 'dragdeinit',
    originEvent: event,
    isTouch: isTouch,
    bound: pointerData.bound,
    startingPoint: pointerData.startingPoint,
    offsetVec: pointerData.offsetVec,
    pointerIdent: pointerIdent,
    currentPoint: currentPoint,
    target: pointerData.target,
    clientX: currentPoint.x,
    clientY: currentPoint.y
  });
};

Hanger.eventHandler.trackingScroll = function (event) {
  var pointerData = this._hangerPointerData;
  var currentPoint = pointerData.currentPoint;
  var dragEvent = {
    type: 'drag',
    originEvent: event,
    isTouch: false,
    bound: pointerData.bound,
    startingPoint: pointerData.startingPoint,
    offsetVec: pointerData.offsetVec,
    pointerIdent: pointerData.pointerIdent,
    currentPoint: currentPoint,
    target: pointerData.target,
    clientX: currentPoint.x,
    clientY: currentPoint.y,
    isScrolling: true,
    preventDefault: function () {// event.preventDefault();
    }
  };
  this.emit('drag', dragEvent, this);
};

_ACore.default.install(Hanger);

var _default = Hanger;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/BoardTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/BoardTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.FREE_ZONE_CLASS_NAME = exports.DRAG_ZONE_CLASS_NAME = exports.EFFECT_ZONE_CLASS_NAME = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

require("../css/boardtable.css");

require("./Board");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Element = _interopRequireDefault(require("absol/src/HTML5/Element"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _EventEmitter = _interopRequireWildcard(require("absol/src/HTML5/EventEmitter"));

var _utils = require("./utils");

var _Hanger = _interopRequireDefault(require("./Hanger"));




var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function BoardTable() {
  var events = {
    touchstart: this.eventHandler.mousedown,
    mousedown: this.eventHandler.mousedown
  };

  _Hanger.default.prototype.on2.call(this, events);

  this._childHolders = [];
  this._dragEventData = null;
  this._friends = [];
  this._longPressEventData = null;
}

BoardTable.tag = 'boardtable';

BoardTable.render = function () {
  return _({
    class: 'as-board-table',
    extendEvent: ['sizechange', 'orderchange', 'itemleave', 'itementer', 'dragitemstart', 'dragitemend']
  });
};

var EFFECT_ZONE_CLASS_NAME = 'as-board-table-effect-zone';
exports.EFFECT_ZONE_CLASS_NAME = EFFECT_ZONE_CLASS_NAME;
var DRAG_ZONE_CLASS_NAME = 'as-board-drag-zone';
exports.DRAG_ZONE_CLASS_NAME = DRAG_ZONE_CLASS_NAME;
var FREE_ZONE_CLASS_NAME = 'as-board-free-zone';
exports.FREE_ZONE_CLASS_NAME = FREE_ZONE_CLASS_NAME;
BoardTable.EFFECT_ZONE_CLASS_NAME = EFFECT_ZONE_CLASS_NAME;
BoardTable.DRAG_ZONE_CLASS_NAME = DRAG_ZONE_CLASS_NAME;
BoardTable.FREE_ZONE_CLASS_NAME = FREE_ZONE_CLASS_NAME;
BoardTable.prototype.$preventContext = _({
  tag: 'textarea',
  class: 'as-board-table-prevent-context',
  props: {
    readOnly: true
  }
});
BoardTable.prototype.maxScrollSpeed = 300;

BoardTable.prototype.findDomChildBefore = function (elt) {
  var nodes = this.childNodes;

  for (var i = 0; i < nodes.length; ++i) {
    if (nodes[i] == elt) return nodes[i - 1];
  }

  return null;
};

BoardTable.prototype.findDomChildAfter = function (elt) {
  var nodes = this.childNodes;

  for (var i = 0; i < nodes.length; ++i) {
    if (nodes[i] == elt) return nodes[i + 1];
  }

  return null;
};

BoardTable.prototype.addChild = function (elt) {
  if (elt.classList.contains('as-board')) {
    elt.selfRemove();
    var atElt;

    if (this._childHolders.length > 0) {
      atElt = this.findDomChildAfter(this._childHolders[this._childHolders.length - 1].elt);

      if (atElt) {
        if (atElt != -1) this.insertBefore(elt, atElt);else throw new Error("Violation data!");
      } else {
        this.appendChild(elt);
      }
    } else {
      this.appendChild(elt);
    }

    var holder = {
      elt: elt
    }; // elt.on('sizechange', holder.onsizechange);

    this._childHolders.push(holder);
  } else {
    this.appendChild(elt);
  }

  return this;
};

BoardTable.prototype.removeChild = function (elt) {
  var holderIndex = this.findChildHolderIndex(elt);

  if (holderIndex >= 0) {
    var holder = this._childHolders[holderIndex]; // holder.elt.off('sizechange', holder.onsizechange);

    this._childHolders.splice(holderIndex, 1);

    holder.elt.remove();
  } else {
    this.super(elt);
  }
};

BoardTable.prototype.findChildBefore = function (elt) {
  var holderIndex = this.findChildHolderIndex(elt);
  if (holderIndex < 0) return holderIndex;
  if (holderIndex < 1) return null;
  return this._childHolders[holderIndex - 1];
};

BoardTable.prototype.findChildAfter = function (elt) {
  var holderIndex = this.findChildHolderIndex(elt);
  if (holderIndex < 0) return holderIndex;
  if (holderIndex <= this._childHolders.length) return null;
  return this._childHolders[holderIndex + 1];
};

BoardTable.prototype.addChildBefore = function (elt, at) {
  elt.selfRemove();
  var atIndex = this.findChildHolderIndex(at);

  if (elt.classList.contains('as-board')) {
    if (atIndex < 0) {
      if (this._childHolders.length > 0) {
        if (this.findDomChildAfter(this._childHolders[this._childHolders.length - 1].elt) == at) {
          atIndex = this._childHolders.length;
        } else {
          throw new Error("Invalid position, you must insert board next to other board!");
        }
      }
    }

    this.insertBefore(elt, at);
    var holder = {
      elt: elt
    };

    this._childHolders.splice(atIndex, 0, holder);
  } else {
    if (atIndex > 0) {
      throw new Error("Invalid position, you can not insert othert type between two board!");
    } else {
      this.insertBefore(elt, at);
    }
  }

  return this;
};

BoardTable.prototype.addChildAfter = function (elt, at) {
  elt.selfRemove();
  var atIndex = this.findChildHolderIndex(at);
  var afterAt = this.findDomChildAfter(at);

  if (elt.classList.contains('as-board')) {
    if (atIndex < 0) {
      if (this._childHolders.length > 0) {
        if (this.findDomChildBefore(this._childHolders[0].elt) == at) {
          atIndex = -1;
        } else throw new Error("Invalid position,  you must insert board next to other board!");
      }
    }

    var holder = {
      elt: elt
    };

    if (!afterAt) {
      this.appendChild(elt);
    } else {
      this.insertBefore(elt, afterAt);
    }

    this._childHolders.splice(atIndex + 1, 0, holder);
  } else {
    if (this._childHolders.length > 1 && atIndex >= 0 && atIndex + 1 < this._childHolders.length) {
      throw new Error("Invalid position, you can not insert othert type between two board!");
    } else {
      if (!afterAt) {
        this.appendChild(elt);
      } else {
        this.insertBefore(elt, afterAt);
      }
    }
  }

  return this;
};

BoardTable.prototype.clearChild = function () {
  this._childHolders = [];
  return _Element.default.prototype.clearChild.call(this);
};

BoardTable.prototype.findChildHolder = function (elt) {
  return this._childHolders[this.findChildHolderIndex(elt)];
};

BoardTable.prototype.findChildHolderIndex = function (elt) {
  for (var i = 0; i < this._childHolders.length; ++i) {
    if (this._childHolders[i].elt == elt) return i;
  }

  return -1;
};

BoardTable.prototype.getEffectZone = function () {
  var ez = this;

  while (ez) {
    if (ez.classList.contains(EFFECT_ZONE_CLASS_NAME)) {
      return ez;
    }

    ez = ez.parentElement;
  }

  return this;
};

BoardTable.prototype._findDragZone = function (elt) {
  var res = null;

  while (elt != this && elt) {
    if (elt.classList.contains('as-board-table')) return null; //maybe in other

    if (!res && elt.classList.contains(DRAG_ZONE_CLASS_NAME)) {
      res = elt;
    }

    if (!res && elt.classList.contains(FREE_ZONE_CLASS_NAME)) return null; // do not drag

    elt = elt.parentElement;
  }

  return res;
};

BoardTable.prototype._findBoard = function (elt) {
  while (elt != this && elt) {
    if (elt.classList.contains('as-board')) return elt;
    elt = elt.parentElement;
  }

  return null;
};

BoardTable.prototype.getAllFriends = function () {
  var thisBT = this;
  var res = [];
  var friendQR;

  for (var i = 0; i < this._friends.length; ++i) {
    friendQR = this._friends[i];

    if (friendQR != this && friendQR && friendQR.classList && friendQR.classList.contains('as-board-table')) {
      res.push(friendQR);
    } else if (typeof friendQR == 'string') {
      // query
      $(friendQR, false, function (elt) {
        if (thisBT != elt && elt.classList && elt.classList.contains('as-board-table')) {
          res.push(elt);
        }

        return false;
      });
    }
  }

  return res;
};

BoardTable.prototype._findHoverBoardIndex = function (clientX, clientY, excludes) {
  var cli = new _Vec.default(clientX, clientY);
  var bound;

  for (var i = 0; i < this._childHolders.length; ++i) {
    // holder =
    if (excludes && excludes.indexOf(this._childHolders[i].elt) >= 0) continue;
    bound = _Rectangle.default.fromClientRect(this._childHolders[i].elt.getBoundingClientRect());
    if (bound.containsPoint(cli)) return i;
  }

  return -1;
};
/**
 * @type {BoardTable}
 */


BoardTable.eventHandler = {};

BoardTable.eventHandler.mousedown = function (event) {
  if (this._dragEventData) return;
  var mousePos;
  var pointerIdent = -1;
  var target;
  var isTouch = event.type === 'touchstart';

  if (isTouch) {
    var touch = event.changedTouches[0];
    target = touch.target;
    pointerIdent = touch.identifier;
    mousePos = new _Vec.default(touch.clientX, touch.clientY);
  } else {
    mousePos = new _Vec.default(event.clientX, event.clientY);
    target = event.target;
  }

  var dragzone = this._findDragZone(target);

  if (dragzone) {
    var boardElt = this._findBoard(dragzone);

    var holderIndex = this.findChildHolderIndex(boardElt);
    if (holderIndex < 0) return; // can not move

    var cBound = boardElt.getBoundingClientRect();
    var mouseBoardOffset = mousePos.sub(new _Vec.default(cBound.left, cBound.top));
    this._dragEventData = {
      boardElt: boardElt,
      state: 'WAIT',
      mouseStartPos: mousePos,
      mousePos: mousePos,
      mouseBoardOffset: mouseBoardOffset,
      holderIndex: holderIndex,
      boardBound: cBound,
      isTouch: isTouch,
      pointerIdent: pointerIdent
    };

    var cEvent = _EventEmitter.default.copyEvent(event);

    if (isTouch) {
      _Hanger.default.prototype.on2.call(document.body, {
        touchend: this.eventHandler.touchFinishBeforeReadyDrag,
        touchcancel: this.eventHandler.touchFinishBeforeReadyDrag,
        touchmove: this.eventHandler.touchMoveBeforeReadyDrag
      });

      this.$preventContext.off('contextmenu', this.eventHandler.contextMenu); //event maybe not remove because of double click

      this.$preventContext.on('contextmenu', this.eventHandler.contextMenu);
      var thisBT = this;
      this._dragEventData._longPressTimeout = setTimeout(function () {
        thisBT._longPressEventData = -1;
        thisBT.$preventContext.addStyle({
          '--x': mousePos.x + 'px',
          '--y': mousePos.y + 'px'
        }).addTo(document.body);
        thisBT.eventHandler.readyDrag(cEvent);
      }, 400);
    } else {
      this.eventHandler.readyDrag(event);
    }
  }
};

BoardTable.eventHandler.touchFinishBeforeReadyDrag = function (event) {
  var thisBT = this;
  var dragEventData = this._dragEventData;
  if (!dragEventData) return;

  _Hanger.default.prototype.off2.call(document.body, {
    touchend: this.eventHandler.touchFinishBeforeReadyDrag,
    touchcancel: this.eventHandler.touchFinishBeforeReadyDrag,
    touchmove: this.eventHandler.touchMoveBeforeReadyDrag
  });

  if (this._dragEventData._longPressTimeout > 0) {
    clearTimeout(this._dragEventData._longPressTimeout);
  }

  if (dragEventData.state === 'WAIT') {
    this._dragEventData = null; // canceled
  } else {
    setTimeout(function () {
      thisBT.$preventContext.off('contextmenu', thisBT.eventHandler.contextMenu);
      thisBT.$preventContext.remove();
    }, 60);
  }
};

BoardTable.eventHandler.contextMenu = function (event) {
  event.preventDefault();
  this.$preventContext.off('contextmenu', this.eventHandler.contextMenu);
  this.$preventContext.remove();
  this.eventHandler.touchFinishBeforeReadyDrag(event);
};

BoardTable.eventHandler.touchMoveBeforeReadyDrag = function (event) {
  var dragEventData = this._dragEventData;
  var touch = (0, _EventEmitter.findChangedTouchByIdent)(event, dragEventData.pointerIdent);
  if (!touch) return;
  var mousePos = new _Vec.default(touch.clientX, touch.clientY);

  if (dragEventData.state === 'WAIT') {
    var dv = mousePos.sub(dragEventData.mouseStartPos);

    if (dv.abs() > 8) {
      this.eventHandler.touchFinishBeforeReadyDrag(event);
      this._dragEventData = null; // cancel
    }
  } else {
    this.$preventContext.addStyle({
      '--x': mousePos.x + 'px',
      '--y': mousePos.y + 'px'
    });
  }
};

BoardTable.eventHandler.readyDrag = function (event) {
  var dragEventData = this._dragEventData;
  dragEventData.state = "PRE_DRAG";
  var bodyEvents = {};

  if (dragEventData.isTouch) {
    bodyEvents.touchmove = this.eventHandler.mousemove;
    bodyEvents.touchcancel = this.eventHandler.mousefinish;
    bodyEvents.touchend = this.eventHandler.mousefinish;
  } else {
    bodyEvents.mousemove = this.eventHandler.mousemove;
    bodyEvents.mouseup = this.eventHandler.mousefinish;
    bodyEvents.mouseleave = this.eventHandler.mousefinish;
  }

  _Hanger.default.prototype.on2.call(document.body, bodyEvents);

  if (dragEventData.isTouch) {
    this.eventHandler.mousemove(event);
  }
};

BoardTable.eventHandler.mousemovePredrag = function (event) {
  var dragEventData = this._dragEventData;
  var mousePos = dragEventData.mousePos;
  var thisBT = this;
  event.preventDefault();
  var cBound = dragEventData.boardElt.getBoundingClientRect();

  if (mousePos.sub(dragEventData.mouseStartPos).abs() > 8 || dragEventData.isTouch) {
    dragEventData.placeHolderElt = $(dragEventData.boardElt.cloneNode(false)).addClass('as-board-place-holder').addStyle({
      width: cBound.width + 'px',
      height: cBound.height + 'px'
    });
    dragEventData.friendHolders = this.getAllFriends().concat([this]).map(function (elt) {
      //include itself
      var effectZone = elt.getEffectZone();
      var res = {
        elt: elt,
        effectZone: effectZone
      };

      if (!dragEventData.isTouch) {
        var enterEvent = thisBT.eventHandler.enterFriendEffectZone.bind(thisBT, elt);

        _Hanger.default.prototype.on2.call(effectZone, dragEventData.isTouch ? 'touchmove' : 'mouseenter', enterEvent);

        res.enterEvent = enterEvent;
      } else {// use move event to detect
      }

      return res;
    });
    dragEventData.inEffectZoneOf = this;
    dragEventData.cardStyle = {
      width: dragEventData.boardElt.style.width,
      height: dragEventData.boardElt.style.height
    };
    dragEventData.boardElt.addStyle({
      width: cBound.width + 'px',
      height: cBound.height + 'px'
    });
    this.insertBefore(dragEventData.placeHolderElt, dragEventData.boardElt);
    dragEventData.state = "DRAG";
    $(document.body).addClass('as-has-board-table-drag');
    dragEventData.boardElt.addClass('as-board-moving');
    dragEventData.boardAt = dragEventData.holderIndex;
    dragEventData.boardIn = thisBT;
    this.emit('dragitemstart', {
      type: 'dragitemstart',
      target: this,
      boardElt: this._dragEventData.boardElt
    }, this);
  }
};

BoardTable.eventHandler.mousemoveDragInSelf = function (event) {
  var dragEventData = this._dragEventData;
  var mousePos = dragEventData.mousePos;

  if (this._childHolders.length < 2) {
    if (dragEventData.boardIn != this) {
      this.insertBefore(dragEventData.placeHolderElt, this._childHolders[0].elt);
      dragEventData.boardIn = this;
      dragEventData.boardAt = 0;
    }
  } else {
    // bản thân chỉ có 1, hoặc nhiều hơn
    var i = this._findHoverBoardIndex(mousePos.x, mousePos.y, [dragEventData.boardElt]);

    if (i >= 0) {
      if (dragEventData.boardIn != this) {
        dragEventData.boardIn = this;
      }

      var viewIndex;

      if (i < dragEventData.holderIndex && i < dragEventData.boardAt || i > dragEventData.holderIndex && i > dragEventData.boardAt || dragEventData.holderIndex == dragEventData.boardAt) {
        viewIndex = i;
      } else {
        if (dragEventData.holderIndex > dragEventData.boardAt) {
          viewIndex = i + 1;
        } else {
          viewIndex = i - 1;
        }
      }

      var fbound = this._childHolders[i].elt.getBoundingClientRect();

      var displayStyple = this._childHolders[i].elt.getComputedStyleValue('display');

      if (mousePos.x > fbound.left && mousePos.x < fbound.right && mousePos.y > fbound.top && mousePos.y < fbound.bottom) {
        if (displayStyple.startsWith('inline')) {
          if (dragEventData.boardBound.width < fbound.width) {
            if (dragEventData.boardAt > viewIndex && mousePos.x > fbound.left + dragEventData.boardBound.width) {
              viewIndex += 1;
            } else if (dragEventData.boardAt < viewIndex && mousePos.x < fbound.left + fbound.width - dragEventData.boardBound.width) {
              viewIndex -= 1;
            }
          }
        } else {
          if (dragEventData.boardBound.height < fbound.height) {
            if (dragEventData.boardAt > viewIndex && mousePos.y >= fbound.top + dragEventData.boardBound.height) {
              viewIndex += 1;
            } else if (dragEventData.boardAt < viewIndex && mousePos.y <= fbound.top + fbound.height - dragEventData.boardBound.height) {
              viewIndex -= 1;
            }
          }
        }

        viewIndex = Math.max(0, Math.min(this._childHolders.length, viewIndex));

        if (viewIndex != dragEventData.boardAt) {
          dragEventData.boardAt = viewIndex;

          if (dragEventData.holderIndex >= viewIndex) {
            this.insertBefore(dragEventData.placeHolderElt, this._childHolders[viewIndex].elt);
          } else {
            var bf = _Element.default.prototype.findChildAfter.call(this, this._childHolders[viewIndex].elt);

            if (bf) this.insertBefore(dragEventData.placeHolderElt, bf);else {
              this.appendChild(dragEventData.placeHolderElt);
            }
          }
        }
      }
    }
  }
};

BoardTable.eventHandler.mousemoveDragInOther = function (event) {
  var dragEventData = this._dragEventData;
  var mousePos = dragEventData.mousePos;
  var other = dragEventData.inEffectZoneOf;

  if (other._childHolders.length == 0) {
    if (dragEventData.boardIn != other) {
      dragEventData.boardIn = other;
      dragEventData.boardAt = 0;
      other.appendChild(dragEventData.placeHolderElt);
    }
  } else {
    var i = other._findHoverBoardIndex(mousePos.x, mousePos.y);

    if (i >= 0) {
      if (dragEventData.boardIn != other) {
        dragEventData.boardIn = other;
      }

      var displayStyple = other._childHolders[i].elt.getComputedStyleValue('display');

      var di = 0;

      var bbound = other._childHolders[i].elt.getBoundingClientRect();

      if (displayStyple.startsWith('inline')) {
        if (mousePos.x > bbound.left + bbound.width / 2) di++;
      } else {
        if (mousePos.y > bbound.top + bbound.height / 2) di++;
      }

      i += di;

      if (i < other._childHolders.length) {
        other.insertBefore(dragEventData.placeHolderElt, other._childHolders[i].elt);
      } else {
        var bf = other.findChildAfter(other._childHolders[other._childHolders.length - 1].elt);

        if (bf) {
          other.insertBefore(dragEventData.placeHolderElt, bf);
        } else {
          other.appendChild(dragEventData.placeHolderElt);
        }
      }

      dragEventData.boardAt = i;
    }
  }
};

BoardTable.eventHandler.mousemoveDrag = function (event) {
  var dragEventData = this._dragEventData;

  if (dragEventData.inEffectZoneOf == this) {
    this.eventHandler.mousemoveDragInSelf(event);
  } else {
    this.eventHandler.mousemoveDragInOther(event);
  }
};

BoardTable.eventHandler.boarDrag = function (event) {
  var dragEventData = this._dragEventData;
  var mousePos = dragEventData.mousePos;
  var boardPos = mousePos.sub(dragEventData.mouseBoardOffset);
  dragEventData.boardElt.addStyle({
    left: boardPos.x + 'px',
    top: boardPos.y + 'px'
  });
};

BoardTable.eventHandler.dragOnEffectZone = function (event) {
  var dragEventData = this._dragEventData;
  var mousePos = dragEventData.mousePos;
  var friendHolders = dragEventData.friendHolders;
  var bound;

  for (var i = 0; i < friendHolders.length; ++i) {
    bound = _Rectangle.default.fromClientRect(friendHolders[i].effectZone.getBoundingClientRect());

    if (bound.containsPoint(mousePos)) {
      dragEventData.inEffectZoneOf = friendHolders[i].elt;
      break;
    }
  }
};

BoardTable.eventHandler.mousemoveOverflow = function (event) {
  if (!this._dragEventData) return;
  var dragEventData = this._dragEventData;
  var scrollerX = this._dragEventData.boardIn;
  var overflowStyle;

  while (scrollerX) {
    overflowStyle = window.getComputedStyle(scrollerX)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'auto hidden' || overflowStyle === 'scroll' || scrollerX.tagName === 'HTML') && scrollerX.clientWidth < scrollerX.scrollWidth) break;
    scrollerX = scrollerX.parentElement;
  }

  var scrollerY = this._dragEventData.boardIn;

  while (scrollerY) {
    overflowStyle = window.getComputedStyle(scrollerY)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'hidden auto' || overflowStyle === 'scroll' || scrollerY.tagName === 'HTML') && scrollerY.clientHeight < scrollerY.scrollHeight) break;
    scrollerY = scrollerY.parentElement;
  }

  var outBound;
  var bBound;

  var screenSize = _Dom.default.getScreenSize();

  var vx = 0;
  var vy = 0;
  bBound = this._dragEventData.boardElt.getBoundingClientRect();

  if (scrollerX) {
    if (dragEventData.$scrollerX !== scrollerX) {
      dragEventData.scrollerXValue = scrollerX.scrollLeft;
      dragEventData.$scrollerX = scrollerX;
    }

    outBound = scrollerX.getBoundingClientRect();
    outBound = {
      left: Math.max(outBound.left, 0),
      top: Math.max(outBound.top, 0),
      bottom: Math.min(outBound.bottom, screenSize.height),
      right: Math.min(outBound.right, screenSize.width)
    };

    if (bBound.left < outBound.left) {
      vx = bBound.left - outBound.left;
    } else if (bBound.right > outBound.right) {
      vx = bBound.right - outBound.right;
    }
  } else {
    dragEventData.$scrollerX = null;
  }

  if (scrollerY) {
    if (dragEventData.$scrollerY !== scrollerY) {
      dragEventData.scrollerYValue = scrollerY.scrollTop;
      dragEventData.$scrollerY = scrollerY;
    }

    outBound = scrollerY.getBoundingClientRect();
    outBound = {
      left: Math.max(outBound.left, 0),
      top: Math.max(outBound.top, 0),
      bottom: Math.min(outBound.bottom, screenSize.height),
      right: Math.min(outBound.right, screenSize.width)
    };

    if (bBound.top < outBound.top) {
      vy = bBound.top - outBound.top;
    } else if (bBound.bottom > outBound.bottom) {
      vy = bBound.bottom - outBound.bottom;
    }
  } else {
    dragEventData.$scrollerY = null;
  }

  vx = Math.max(-this.maxScrollSpeed, Math.min(this.maxScrollSpeed, vx * Math.sqrt(Math.abs(vx))));
  vy = Math.max(-this.maxScrollSpeed, Math.min(this.maxScrollSpeed, vy * Math.sqrt(Math.abs(vy))));

  if (vx !== 0 || vy !== 0) {
    var copyEvent = {
      type: event.type,
      preventDefault: function () {
        /* noop */
      },
      target: event.target
    };

    if (event.type === 'touchmove') {
      copyEvent.changedTouches = Array.prototype.map.call(event.changedTouches, function (it) {
        return {
          identifier: it.identifier,
          clientX: it.clientX,
          clientY: it.clientY,
          target: it.target
        };
      });
      copyEvent.touches = Array.prototype.map.call(event.touches, function (it) {
        return {
          identifier: it.identifier,
          clientX: it.clientX,
          clientY: it.clientY,
          target: it.target
        };
      });
    } else {
      copyEvent.clientX = event.clientX;
      copyEvent.clientY = event.clientY;
    }

    var thisBT = this;
    var now = new Date().getTime();

    if (dragEventData.requestAnimationFrameId >= 0) {
      cancelAnimationFrame(dragEventData.requestAnimationFrameId);
    }

    dragEventData.requestAnimationFrameId = requestAnimationFrame(function () {
      dragEventData.requestAnimationFrameId = -1;
      var dt = (new Date().getTime() - now) / 1000;

      if (dragEventData.$scrollerY) {
        dragEventData.scrollerYValue += vy * dt;
        dragEventData.scrollerYValue = Math.max(0, Math.min(dragEventData.$scrollerY.scrollHeight - dragEventData.$scrollerY.clientHeight, dragEventData.scrollerYValue));
        dragEventData.$scrollerY.scrollTop = dragEventData.scrollerYValue;
      }

      if (dragEventData.$scrollerX) {
        dragEventData.scrollerXValue += vx * dt;
        dragEventData.scrollerXValue = Math.max(0, Math.min(dragEventData.$scrollerX.scrollWidth - dragEventData.$scrollerX.clientWidth, dragEventData.scrollerXValue));
        dragEventData.$scrollerX.scrollLeft = dragEventData.scrollerXValue;
      }

      if (thisBT._dragEventData && thisBT._dragEventData.state === "DRAG") {
        thisBT.eventHandler.mousemoveOverflow(copyEvent);
      }
    });
  }
};

BoardTable.eventHandler.mousemove = function (event) {
  var dragEventData = this._dragEventData;
  var isTouch = event.type === 'touchmove' || event.type === 'touchstart'; // call from timeout

  if (dragEventData.isTouch !== isTouch) return;
  var mousePos;
  var pointerIdent;
  var touch = -2;

  if (isTouch) {
    touch = (0, _EventEmitter.findChangedTouchByIdent)(event, dragEventData.pointerIdent);

    if (touch) {
      pointerIdent = touch.identifier;
      mousePos = new _Vec.default(touch.clientX, touch.clientY);
    }
  } else {
    pointerIdent = -1;
    mousePos = new _Vec.default(event.clientX, event.clientY);
  }

  if (dragEventData.pointerIdent !== pointerIdent) return;
  dragEventData.mousePos = mousePos;
  event.preventDefault();

  if (dragEventData.isTouch && dragEventData.state === 'DRAG') {
    this.eventHandler.dragOnEffectZone(event); //because touch not have mouseenter event
  }

  if (dragEventData.state === 'PRE_DRAG') {
    this.eventHandler.mousemovePredrag(event);
  }

  if (dragEventData.state === 'DRAG') {
    this.eventHandler.mousemoveDrag(event);
    this.eventHandler.boarDrag(event);
    this.eventHandler.mousemoveOverflow(event);
  }
};

BoardTable.eventHandler.mousefinish = function (event) {
  var dragEventData = this._dragEventData;
  var isTouch = event.type === 'touchend';
  if (dragEventData.isTouch !== isTouch) return;
  var mousePos;
  var pointerIdent;
  var touch = -2;

  if (isTouch) {
    touch = (0, _EventEmitter.findChangedTouchByIdent)(event, dragEventData.pointerIdent);

    if (touch) {
      pointerIdent = touch.identifier;
      mousePos = new _Vec.default(touch.clientX, touch.clientY);
    }
  } else {
    pointerIdent = -1;
    mousePos = new _Vec.default(event.clientX, event.clientY);
  }

  if (dragEventData.pointerIdent !== pointerIdent) return;
  dragEventData.mousePos = mousePos;
  var changed;

  if (dragEventData.state == 'DRAG') {
    setTimeout(function () {
      $(document.body).removeClass('as-has-board-table-drag');
    }, 1);
    dragEventData.boardElt.removeClass('as-board-moving').removeStyle('left').removeStyle('top');
    dragEventData.boardElt.addStyle(dragEventData.cardStyle);
    dragEventData.placeHolderElt.remove();
    dragEventData.state = "FINISH";
    if (!dragEventData.isTouch) dragEventData.friendHolders.forEach(function (holder) {
      _Hanger.default.prototype.off2.call(holder.effectZone, 'mouseenter', holder.enterEvent);
    });

    if (dragEventData.boardIn == this) {
      if (dragEventData.holderIndex != dragEventData.boardAt) {
        if (dragEventData.holderIndex > dragEventData.boardAt) {
          this.insertBefore(dragEventData.boardElt, this._childHolders[dragEventData.boardAt].elt);
        } else if (dragEventData.holderIndex < dragEventData.boardAt) {
          var bf = _Element.default.prototype.findChildAfter.call(this, this._childHolders[dragEventData.boardAt].elt);

          if (bf) this.insertBefore(dragEventData.boardElt, bf);else {
            this.appendChild(dragEventData.boardElt);
          }
        }

        var holder = this._childHolders.splice(dragEventData.holderIndex, 1)[0];

        this._childHolders.splice(dragEventData.boardAt, 0, holder);

        changed = 'orderchange';
        this.emit('orderchange', {
          type: 'orderchange',
          boardElt: holder.elt,
          action: 'move',
          from: dragEventData.holderIndex,
          to: dragEventData.boardAt,
          target: this
        }, this);
      }
    } else {
      var holder = this._childHolders.splice(dragEventData.holderIndex, 1)[0];

      holder.elt.remove(); ///remove all event

      var other = dragEventData.boardIn;
      changed = 'itemleave';
      this.emit('itemleave', {
        type: 'itemleave',
        item: holder.elt,
        from: {
          index: dragEventData.holderIndex,
          table: this
        },
        to: {
          index: dragEventData.boardAt,
          table: other
        },
        target: this
      }, this);

      if (other._childHolders.length == 0) {
        other.appendChild(holder.elt);

        other._childHolders.push(holder);
      } else {
        if (dragEventData.boardAt < other._childHolders.length) {
          other.insertBefore(holder.elt, other._childHolders[dragEventData.boardAt].elt);

          other._childHolders.splice(dragEventData.boardAt, 0, holder);
        } else {
          var bf = other.findDomChildAfter(other._childHolders.elt);

          if (bf) {
            other.insertBefore(holder.elt, bf);
          } else {
            other.appendChild(holder.elt);
          }

          other._childHolders.push(holder);
        }
      }

      other.emit('itementer', {
        type: 'itementer',
        item: holder.elt,
        target: other,
        from: {
          index: dragEventData.holderIndex,
          table: this
        },
        to: {
          index: dragEventData.boardAt,
          table: other
        }
      }, other);
    }

    this.emit('dragitemend', {
      type: 'dragitemend',
      target: this,
      changed: changed,
      boardElt: this._dragEventData.boardElt
    }, this);
  }

  var bodyEvents = {};

  if (dragEventData.isTouch) {
    bodyEvents.touchmove = this.eventHandler.mousemove;
    bodyEvents.touchcancel = this.eventHandler.mousefinish;
    bodyEvents.touchend = this.eventHandler.mousefinish;
  } else {
    bodyEvents.mousemove = this.eventHandler.mousemove;
    bodyEvents.mouseup = this.eventHandler.mousefinish;
    bodyEvents.mouseleave = this.eventHandler.mousefinish;
  }

  _Hanger.default.prototype.off2.call(document.body, bodyEvents);

  this._dragEventData = null;
};

BoardTable.eventHandler.enterFriendEffectZone = function (friendElt, event) {
  this._dragEventData.inEffectZoneOf = friendElt;
};

BoardTable.prototype.getAllBoards = function () {
  return this._childHolders.map(function (holder) {
    return holder.elt;
  });
};

BoardTable.property = {};
BoardTable.property.friends = {
  set: function (value) {
    value = value || [];
    if (!(value instanceof Array)) value = [value];
    this._friends = value;
  },
  get: function () {
    return this._friends;
  }
};

_ACore.default.install(BoardTable);

var _default = BoardTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/BScroller.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/BScroller.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/bscroller.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Element = _interopRequireDefault(require("absol/src/HTML5/Element"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function BScroller() {
  this.addClass('as-bscroller');
}

BScroller.tag = "bscroller";

BScroller.render = function (data) {
  if (data && data.elt) {
    return $(data.elt);
  } else return _('div');
};

BScroller.prototype.scrollInto = function (element) {
  if (_Element.default.prototype.isDescendantOf.call(element, this)) {
    var elementBound = element.getBoundingClientRect();
    var viewportBound = this.getBoundingClientRect();
    var currentScrollTop = this.scrollTop;
    var newScrollTop = currentScrollTop;

    if (elementBound.bottom > viewportBound.bottom) {
      newScrollTop = currentScrollTop + (elementBound.bottom - viewportBound.bottom);
    }

    if (elementBound.top < viewportBound.top) {
      newScrollTop = currentScrollTop - (viewportBound.top - elementBound.top);
    }

    if (newScrollTop != currentScrollTop) {
      this.scrollTop = newScrollTop;
    }

    var currentScrollLeft = this.scrollLeft;
    var newScrollLeft = currentScrollLeft;

    if (elementBound.right > viewportBound.right) {
      newScrollLeft = currentScrollLeft + (elementBound.right - viewportBound.right);
    }

    if (elementBound.left < viewportBound.left) {
      newScrollLeft = currentScrollLeft - (viewportBound.left - elementBound.left);
    }

    if (newScrollLeft != currentScrollLeft) {
      this.scrollLeft = newScrollLeft;
    }
  }
};

_ACore.default.install(BScroller);

var _default = BScroller;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ButtonArray.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ButtonArray.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/buttonarray.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function ButtonArray() {
  this._dict = {};
  this._pool = [];
  this._items = [];
  this.$lastActiveBtn = null;
  this._value = undefined;
  this._lastValue = this._value;
}

ButtonArray.tag = 'buttonarray';

ButtonArray.render = function () {
  return _({
    extendEvent: ['change'],
    class: 'as-button-array'
  });
};

ButtonArray.prototype._newButton = function () {
  var button = _({
    tag: 'button',
    class: 'as-button-array-item',
    child: {
      text: 'null'
    }
  });

  button.on('click', this.eventHandler.clickItem.bind(this, button));
  return button;
};

ButtonArray.prototype._requestButton = function (items) {
  var button;

  if (this._pool.length > 0) {
    button = this._pool.pop();
  } else {
    button = this._newButton();
  }

  return button;
};

ButtonArray.prototype._assignButton = function (button, data) {
  button._data = data;
  button.childNodes[0].data = data.text;
};

ButtonArray.prototype._releaseButton = function (button) {
  this._pool.push(button);
};

ButtonArray.prototype._getFullFormat = function (item) {
  var res = {};

  if (typeof item == 'string' || typeof item == 'number' || typeof item == 'boolean' || item === null || item === undefined) {
    res.ident = item;
    res.value = item;
    res.text = item + '';
  } else if (item && typeof item == 'object') {
    res.value = item.value;
    res.ident = res.value + '';
    res.text = item.text;
  }

  return res;
};

ButtonArray.property = {};
/**
 * @type {ButtonArray}
 */

ButtonArray.property.items = {
  set: function (items) {
    items = items || [];
    this._items = items;
    var child;

    while (this.childNodes.length > items.length) {
      child = this.lastChild;

      this._releaseButton(child);

      this.removeChild(child);
    }

    while (this.childNodes.length < items.length) {
      this.addChild(this._requestButton());
    }

    var item;

    for (var i = 0; i < items.length; ++i) {
      item = this._getFullFormat(items[i]);

      this._assignButton(this.childNodes[i], item);

      this._dict[item.ident] = {
        elt: this.childNodes[i],
        data: item
      };
    }

    if (items.length > 0) {
      if (!this._dict[this._value + '']) {
        this._value = this._getFullFormat(items[0]).value;
      }
    }

    this.value = this._value;
  },
  get: function () {
    return this._items;
  }
};
ButtonArray.property.value = {
  set: function (value) {
    this._value = value;
    this._lastValue = this._value;

    if (this.$lastActiveBtn) {
      this.$lastActiveBtn.removeClass('as-active');
      this.$lastActiveBtn = null;
    }

    var hodler = this._dict[value + ''];

    if (hodler) {
      hodler.elt.addClass('as-active');
      this.$lastActiveBtn = hodler.elt;
    }
  },
  get: function () {
    return this._value;
  }
};
ButtonArray.eventHandler = {};

ButtonArray.eventHandler.clickItem = function (item, event) {
  if (this._lastValue != item._data.value) {
    this.value = item._data.value;
    this.emit('change', {
      target: this,
      value: this.value,
      type: 'change'
    }, this);
  }
};

_ACore.default.install(ButtonArray);

var _default = ButtonArray;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Scroller.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Scroller.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.VScroller = VScroller;
exports.HScroller = HScroller;
exports.Scrollbar = Scrollbar;
exports.VScrollbar = VScrollbar;
exports.HScrollbar = HScrollbar;

require("../css/scroller.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Element = _interopRequireDefault(require("absol/src/HTML5/Element"));

var _int = require("absol/src/Math/int");


var _ = _ACore.default._;
var $ = _ACore.default.$;

_ACore.default.$scrollStyle = function () {
  var element = _('style#vscroller-style');

  element.innerHTML = ['.absol-vscroller-viewport{ margin-right: ' + -17 + 'px;  min-width: calc(100% + ' + 17 + 'px);}', '.absol-hscroller-viewport{ margin-bottom: ' + -17 + 'px;  min-height: calc(100% + ' + 17 + 'px);}'].join('\n');
  document.head.appendChild(element);

  _Dom.default.getScrollSize().then(function (size) {
    element.innerHTML = ['.absol-vscroller-viewport{ margin-right: ' + -size.width + 'px; min-width: calc(100% + ' + size.width + 'px);}', '.absol-hscroller-viewport{ margin-bottom: ' + -size.height + 'px; min-height: calc(100% + ' + size.height + 'px);}'].join('\n');
  });

  return element;
}();
/***
 * @extends AElement
 * @constructor
 */


function VScroller() {
  var thisVS = this;
  this.$attachHook = $('attachhook', this);
  this.sync = new Promise(function (rs) {
    thisVS.$attachHook.once('error', function () {
      rs();
    });
  });
  this.$attachHook.on('error', function () {
    thisVS.requestUpdateSize();
  });
  this.$vscrollbar = $('vscrollbar', this).on('scroll', this.eventHandler.scrollScrollbar);
  this.$viewport = $('.absol-vscroller-viewport', this).on('scroll', this.eventHandler.scrollViewport);

  _OOP.default.extends(thisVS.$viewport, {
    removeChild: function () {
      this.super.apply(this, arguments);
      thisVS.requestUpdateSize();
      return thisVS;
    }
  });
}

VScroller.tag = 'vscroller';

VScroller.render = function () {
  return _({
    class: 'absol-vscroller',
    child: ['.absol-vscroller-viewport', {
      class: ['absol-scrollbar-container', 'vertical'],
      child: 'vscrollbar'
    }, 'attachhook']
  });
};

VScroller.prototype.requestUpdateSize = function () {
  // return;
  if (this._isRequestingUpdateSize) return this.sync;
  this._isRequestingUpdateSize = true;
  this.sync = this.sync.then(function () {
    this.$vscrollbar.outerHeight = this.$viewport.clientHeight;
    this.$vscrollbar.innerHeight = this.$viewport.scrollHeight - 2;
    this.$vscrollbar.innerOffset = this.$viewport.scrollTop;

    if (this.$vscrollbar.innerHeight <= this.$vscrollbar.outerHeight) {
      this.$vscrollbar.hidden = true;
      this.addClass('disabled');
    } else {
      this.removeClass('disabled');
      this.$vscrollbar.hidden = false;
    }

    this._isRequestingUpdateSize = false;
  }.bind(this));
  return this.sync;
};

VScroller.prototype.init = function (props) {
  this.super(props);
  this.requestUpdateSize();
};

VScroller.prototype.addChild = function () {
  var res = this.$viewport.addChild.apply(this.$viewport, arguments);
  this.requestUpdateSize();
  return res;
};

VScroller.prototype.clearChild = function () {
  var res = this.$viewport.clearChild.apply(this.$viewport, arguments);
  this.requestUpdateSize();
  return res;
};

VScroller.prototype.addChildBefore = function () {
  var res = this.$viewport.addChildBefore.apply(this.$viewport, arguments);
  this.requestUpdateSize();
  return res;
};

VScroller.prototype.addChildAfter = function () {
  var res = this.$viewport.addChildAfter.apply(this.$viewport, arguments);
  this.requestUpdateSize();
  return res;
};

VScroller.prototype.findChildAfter = function () {
  return this.$viewport.findChildAfter.apply(this.$viewport, arguments);
};

VScroller.prototype.findChildBefore = function () {
  return this.$viewport.findChildBefore.apply(this.$viewport, arguments);
};

VScroller.prototype.removeChild = function () {
  var res = this.$viewport.removeChild.apply(this.$viewport, arguments);
  this.requestUpdateSize();
  return res;
};

VScroller.prototype.scrollInto = function (element, padding, scrollTime, beforFrame, afterFrame) {
  padding = padding || 0;
  scrollTime = scrollTime || 0;
  var frameCount = Math.ceil(scrollTime / 15 + 1);
  var self = this;

  function onFrame() {
    beforFrame && beforFrame();
    var elementBound = element.getBoundingClientRect();
    var viewportBound = self.$viewport.getBoundingClientRect();
    var currentScrollTop = self.$viewport.scrollTop;
    var newScrollTop = currentScrollTop;

    if (elementBound.bottom + padding > viewportBound.bottom) {
      newScrollTop = currentScrollTop + (elementBound.bottom + padding - viewportBound.bottom) / (Math.log(frameCount) + 1);
    }

    if (elementBound.top - padding < viewportBound.top) {
      newScrollTop = currentScrollTop - (viewportBound.top - (elementBound.top - padding)) / (Math.log(frameCount) + 1);
    }

    if (newScrollTop != currentScrollTop) {
      self.$viewport.scrollTop = newScrollTop;
    }

    afterFrame && afterFrame();
    frameCount--;
    if (frameCount > 0) setTimeout(onFrame, 15);
  }

  if (_Element.default.prototype.isDescendantOf.call(element, this.$viewport)) {
    onFrame();
  }
};

VScroller.prototype.scrollBy = function (dy, duration) {
  duration = duration || 0;
  var frameCount = Math.ceil(duration / 20);
  var timeOut = duration / frameCount;
  var i = 0;
  var self = this;
  var start = self.$viewport.scrollTop;
  var end = start + dy;

  function onFrame() {
    self.$viewport.scrollTop = Math.max((0, _int.map)(i, 0, frameCount, start, end), 0);
    ++i;
    if (i <= frameCount) setTimeout(onFrame, timeOut);
  }

  onFrame();
};

VScroller.eventHandler = {};

VScroller.eventHandler.scrollViewport = function (event) {
  this.$vscrollbar.outerHeight = this.$viewport.clientHeight;
  this.$vscrollbar.innerHeight = this.$viewport.scrollHeight;
  this.$vscrollbar.innerOffset = this.$viewport.scrollTop;
};

VScroller.eventHandler.scrollScrollbar = function (event) {
  this.$viewport.scrollTop = this.$vscrollbar.innerOffset;
};
/***
 * @extends AElement
 * @constructor
 */


function HScroller() {
  var thisHS = this;
  this.$attachHook = $('attachhook', this).on('error', function () {
    this.requestUpdateSize = this.requestUpdateSize || thisHS.requestUpdateSize.bind(thisHS);

    _Dom.default.addToResizeSystem(this);
  });
  this.sync = new Promise(function (rs, rj) {
    thisHS.$attachHook.once('error', rs);
  });
  this.$hscrollbar = $('hscrollbar', this).on('scroll', this.eventHandler.scrollScrollbar);
  this.$viewport = $('.absol-hscroller-viewport', this).on('scroll', this.eventHandler.scrollViewport);

  _OOP.default.extends(this.$viewport, {
    removeChild: function () {
      this.super.apply(this, arguments);
      thisHS.requestUpdateSize();
      return thisHS;
    }
  });
}

HScroller.tag = 'hscroller';

HScroller.render = function () {
  return _({
    class: 'absol-hscroller',
    child: ['.absol-hscroller-viewport', {
      class: ['absol-scrollbar-container', 'horizontal'],
      child: 'hscrollbar'
    }, 'attachhook']
  });
};

HScroller.eventHandler = {};

HScroller.eventHandler.scrollViewport = function (event) {
  this.$hscrollbar.outerWidth = this.$viewport.clientWidth;
  this.$hscrollbar.innerWidth = this.$viewport.scrollWidth;
  this.$hscrollbar.innerOffset = this.$viewport.scrollLeft;
};

HScroller.eventHandler.scrollScrollbar = function (event) {
  this.$viewport.scrollLeft = this.$hscrollbar.innerOffset;
};

Object.assign(HScroller.prototype, VScroller.prototype);

HScroller.prototype.requestUpdateSize = function () {
  // return;
  if (this._isRequestingUpdateSize) return this.sync;
  this._isRequestingUpdateSize = true;
  this.sync = this.sync.then(function () {
    this.$hscrollbar.outerWidth = this.$viewport.clientWidth;
    this.$hscrollbar.innerWidth = this.$viewport.scrollWidth;
    this.$hscrollbar.innerOffset = this.$viewport.scrollLeft;

    if (this.$hscrollbar.innerWidth <= this.$hscrollbar.outerWidth) {
      this.$hscrollbar.hidden = true;
      this.addClass('disabled');
    } else {
      this.removeClass('disabled');
      this.$hscrollbar.hidden = false;
    }

    this._isRequestingUpdateSize = false;
  }.bind(this));
  return this.sync;
};

HScroller.prototype.scrollInto = function (element) {
  if (_Element.default.prototype.isDescendantOf.call(element, this.$viewport)) {
    var elementBound = element.getBoundingClientRect();
    var viewportBound = this.$viewport.getBoundingClientRect();
    var currentScrollLeft = this.$viewport.scrollLeft;
    var newScrollLeft = currentScrollLeft;

    if (elementBound.right > viewportBound.right) {
      newScrollLeft = currentScrollLeft + (elementBound.right - viewportBound.right);
    }

    if (elementBound.left < viewportBound.left) {
      newScrollLeft = currentScrollLeft - (viewportBound.left - elementBound.left);
    }

    if (newScrollLeft != currentScrollLeft) {
      this.$viewport.scrollLeft = newScrollLeft;
    }
  }
};
/***
 * @extends AElement
 * @constructor
 */


function Scrollbar() {
  var thisSB = this;
  this.$button = $('.absol-scrollbar-button', this);
  this.on('inactive', function (event, sender) {
    this.emit('deactive', event, sender);
  });
  this.on('active', function () {
    if (!thisSB.$forceModal) thisSB.$forceModal = _('.absol-scrollbar-force-modal');
    thisSB.$forceModal.addTo(document.body);
  }).on('inactive', function () {
    setTimeout(function () {
      thisSB.$forceModal.remove();
    }, 30);
  });
}

Scrollbar.tag = 'scrollbar';

Scrollbar.render = function () {
  return _({
    class: ['absol-scrollbar'],
    extendEvent: ['scroll', 'active', 'inactive', 'deactive'],
    child: '.absol-scrollbar-button'
  });
};

Scrollbar.property = {};
Scrollbar.property.hidden = {
  set: function (value) {
    value = !!value;

    if (value !== this._hidden) {
      this._hidden = value;
      if (value) this.addClass('absol-hidden');else this.removeClass('absol-hidden');
    }
  },
  get: function () {
    return this.hasClass('absol-hidden');
  }
};
/***
 * @extends Scrollbar
 * @constructor
 */

function VScrollbar() {
  var thisVS = this;
  var top0, innerOffset0;

  var pointerMoveEventHandler = function (event) {
    event.preventDefault();
    var dy = event.clientY - top0;
    var newInnerOffset = innerOffset0 + dy * (thisVS.innerHeight / thisVS.outerHeight) * (thisVS.outerHeight / thisVS.getBoundingClientRect().height);
    if (newInnerOffset + thisVS.outerHeight > thisVS.innerHeight) newInnerOffset = thisVS.innerHeight - thisVS.outerHeight;
    if (newInnerOffset < 0) newInnerOffset = 0;
    thisVS.innerOffset = newInnerOffset; //todo

    event.innerOffset = newInnerOffset;
    thisVS.emit('scroll', event);
  };

  var finishEventHandler = function (event) {
    var body = $(document.body);
    body.off('pointerleave', finishEventHandler);
    body.off('pointerup', finishEventHandler);
    body.off('pointermove', pointerMoveEventHandler);
    thisVS.removeClass('absol-active');
    thisVS.emit('inactive', {
      type: 'inactive',
      originEvent: event,
      tagert: thisVS
    });
  };

  var pointerDownEventHandler = function (event) {
    var boundRes = thisVS.getBoundingClientRect();
    var boundButton = thisVS.$button.getBoundingClientRect();
    top0 = event.clientY;

    if (event.target == thisVS.$button) {
      innerOffset0 = thisVS.innerOffset;
    } else {
      var newInnerOffset = (0, _int.map)(top0 - boundButton.height / 2 - boundRes.top, 0, boundRes.height, 0, thisVS.innerHeight);
      if (newInnerOffset + thisVS.outerHeight > thisVS.innerHeight) newInnerOffset = thisVS.innerHeight - thisVS.outerHeight;
      if (newInnerOffset < 0) newInnerOffset = 0;
      thisVS.innerOffset = newInnerOffset; //todo

      event.innerOffset = newInnerOffset;
      innerOffset0 = newInnerOffset;
      thisVS.emit('scroll', event);
    }

    var body = $(document.body);
    body.on('pointerleave', finishEventHandler);
    body.on('pointerup', finishEventHandler);
    body.on('pointermove', pointerMoveEventHandler);
    thisVS.addClass('absol-active');
    thisVS.emit('active', {
      type: 'active',
      originEvent: event,
      tagert: thisVS
    });
  };

  this.on('pointerdown', pointerDownEventHandler, true);
  /***
   * @type {number}
   * @name outerHeight
   * @memberOf VScrollbar#
   */

  /***
   * @type {number}
   * @name innerHeight
   * @memberOf VScrollbar#
   */

  /***
   * @type {number}
   * @name innerHeight
   * @memberOf VScrollbar#
   */
}

VScrollbar.tag = 'vscrollbar';

VScrollbar.render = function () {
  return _({
    tag: 'scrollbar',
    class: 'absol-vscrollbar'
  }, true);
};

VScrollbar.prototype.updateValue = function () {
  this.$button.addStyle('height', Math.min(this.outerHeight / this.innerHeight, 1) * 100 + '%');
  this.$button.addStyle('top', this.innerOffset / this.innerHeight * 100 + '%');
};

VScrollbar.prototype.updateStatus = function () {
  if (this.innerHeight > this.outerHeight) {
    this.addClass('as-overflow');
  } else {
    this.removeClass('as-overflow');
  }
};

VScrollbar.property = {
  innerOffset: {
    set: function (value) {
      value = value || 0;

      if (this._innerOffset != value) {
        this._innerOffset = value;
        this.updateValue();
      }
    },
    get: function () {
      return this._innerOffset || 0;
    }
  },
  innerHeight: {
    set: function (value) {
      value = value || 1;
      value = Math.max(value, 1);

      if (this._innerHeight !== value) {
        this._innerHeight = value;
        this.updateValue();
      }

      this.updateStatus();
    },
    get: function () {
      return this._innerHeight || 1;
    }
  },
  outerHeight: {
    set: function (value) {
      value = value || 0;
      value = Math.max(value, 0);

      if (this._outerHeight !== value) {
        this._outerHeight = value;
        this.updateValue();
      }

      this.updateStatus();
    },
    get: function () {
      return this._outerHeight || 0;
    }
  }
};
/***
 * @extends Scrollbar
 * @constructor
 */

function HScrollbar() {
  var thisHS = this;
  var left0, innerOffset0;

  var pointerMoveEventHandler = function (event) {
    event.preventDefault();
    var dy = event.clientX - left0;
    var newInnerOffset = innerOffset0 + dy * (thisHS.innerWidth / thisHS.outerWidth) * (thisHS.outerWidth / thisHS.getBoundingClientRect().width);
    if (newInnerOffset + thisHS.outerWidth > thisHS.innerWidth) newInnerOffset = thisHS.innerWidth - thisHS.outerWidth;
    if (newInnerOffset < 0) newInnerOffset = 0;
    thisHS.innerOffset = newInnerOffset; //todo

    event.innerOffset = newInnerOffset;
    thisHS.emit('scroll', event);
  };

  var finishEventHandler = function (event) {
    var body = $(document.body);
    body.off('pointerleave', finishEventHandler);
    body.off('pointerup', finishEventHandler);
    body.off('pointermove', pointerMoveEventHandler);
    thisHS.removeClass('absol-active');
    thisHS.emit('inactive', {
      type: 'inactive',
      originEvent: event,
      tagert: thisHS
    });
  };

  var pointerDownEventHandler = function (event) {
    var boundRes = thisHS.getBoundingClientRect();
    var boundButton = thisHS.$button.getBoundingClientRect();
    left0 = event.clientX;

    if (event.target === thisHS.$button) {
      innerOffset0 = thisHS.innerOffset;
    } else {
      var newInnerOffset = (0, _int.map)(left0 - boundButton.width / 2 - boundRes.left, 0, boundRes.width, 0, thisHS.innerWidth);
      if (newInnerOffset + thisHS.outerWidth > thisHS.innerWidth) newInnerOffset = thisHS.innerWidth - thisHS.outerWidth;
      if (newInnerOffset < 0) newInnerOffset = 0;
      thisHS.innerOffset = newInnerOffset; //todo

      event.innerOffset = newInnerOffset;
      innerOffset0 = newInnerOffset;
      thisHS.emit('scroll', event);
    }

    var body = $(document.body);
    body.on('pointerleave', finishEventHandler);
    body.on('pointerup', finishEventHandler);
    body.on('pointermove', pointerMoveEventHandler);
    thisHS.addClass('absol-active');
    thisHS.emit('active', {
      type: 'inactive',
      originEvent: event,
      tagert: thisHS
    });
  };

  this.on('pointerdown', pointerDownEventHandler, true);
  /***
   * @type {number}
   * @name innerOffset
   * @memberOf HScrollbar#
   */

  /***
   * @type {number}
   * @name innerWidth
   * @memberOf HScrollbar#
   */

  /***
   * @type {number}
   * @name outerWidth
   * @memberOf HScrollbar#
   */
}

HScrollbar.tag = 'hscrollbar';

HScrollbar.render = function () {
  return _({
    tag: 'scrollbar',
    class: 'absol-hscrollbar'
  }, true);
};

HScrollbar.prototype.updateValue = function () {
  this.$button.addStyle('width', Math.min(this.outerWidth / this.innerWidth, 1) * 100 + '%');
  this.$button.addStyle('left', this.innerOffset / this.innerWidth * 100 + '%');
};

HScrollbar.prototype.updateStatus = function () {
  if (this.innerWidth > this.outerWidth) {
    this.addClass('as-overflow');
  } else {
    this.removeClass('as-overflow');
  }
};

HScrollbar.property = {
  innerOffset: {
    set: function (value) {
      value = value || 0;

      if (this._innerOffset !== value) {
        this._innerOffset = value;
        this.updateValue();
      }
    },
    get: function () {
      return this._innerOffset || 0;
    }
  },
  innerWidth: {
    set: function (value) {
      value = value || 1;
      value = Math.max(value, 1);

      if (this._innerWidth !== value) {
        this._innerWidth = value;
        this.updateValue();
      }

      this.updateStatus();
    },
    get: function () {
      return this._innerWidth || 1;
    }
  },
  outerWidth: {
    set: function (value) {
      value = value || 0;
      value = Math.max(value, 0);

      if (this._outerWidth !== value) {
        this._outerWidth = value;
        this.updateValue();
      }

      this.updateStatus();
    },
    get: function () {
      return this._outerWidth || 0;
    }
  }
};

_ACore.default.install([VScrollbar, HScrollbar, Scrollbar, VScroller, HScroller]);
};

moduleFactories["node_modules/absol-acomp/js/ChromeCalendar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ChromeCalendar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/chromecalendar.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var datetime = _interopRequireWildcard(require("absol/src/Time/datetime"));

var _EventEmitter = _interopRequireWildcard(require("absol/src/HTML5/EventEmitter"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Scroller = require("./Scroller");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _utils = require("./utils");




var _ = _ACore.default._;
var $ = _ACore.default.$;
/**
 * @extends AElement
 * @constructor
 */

function ChromeCalendar() {
  var thisCal = this;
  this._startDayOfWeek = 0; // getDefaultFirstDayOfWeek();

  this._level = "day";
  this.$years = $('.absol-chrome-calendar-years', this);

  this._fillYearList(this.$years);

  this.$title = $('.absol-chrome-calendar-title', this).on('click', this.eventHandler.clickTitle);
  this.$titleTime = $('.title-time', this.$title);
  this.$instance = $('.absol-chrome-calendar-instance', this);
  this.$era = $('.absol-chrome-calendar-era', this).on('scroll', this.eventHandler.eraScroll).on('click', this.eventHandler.clickEra);

  this._fillEra();

  this.$month = $('.absol-chrome-calendar-month', this);
  this.$dayOfWeek = $('.absol-chrome-calendar-dayofweek', this);
  this._min = new Date(1890, 0, 1);
  this._max = new Date(2090, 0, 1);
  this._selectedDates = [datetime.beginOfDay(new Date())];
  this._viewDate = new Date();
  this.$prevBtn = $('.absol-chrome-calendar-header-buttons > button.prev-btn', this).on('click', this.eventHandler.clickPrev);
  this.$todayBtn = $('.absol-chrome-calendar-header-buttons > button.today-btn', this).on('click', this.eventHandler.clickToday);
  this.$nextBtn = $('.absol-chrome-calendar-header-buttons > button.next-btn', this).on('click', this.eventHandler.clickNext);
  /***
   *
   * @type {VScroller}
   */

  this.$yearScroller = $('vscroller.absol-chrome-calendar-years', this);
  this.$yearItems = [];
  $('.absol-chrome-calendar-year', this.$yearScroller, function (e) {
    thisCal.$yearItems.push(e);
  });
  this.$attachHook = _('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$attachHook).on('level_change', this.eventHandler.levelChange).on('request_update_buttons', this._updateButtons.bind(this)).on('request_update_month', this._updateMonth.bind(this, this.$month)).on('request_update_open_year', this._updateOpenYear.bind(this)).on('request_update_disabled_year_in_era', this._updateDisabledYearInEra.bind(this)).on('request_update_picked_years', this._updatePickedYears.bind(this));
  this.sync = new Promise(function (rs) {
    thisCal.$attachHook.on('attached', rs);
  });
  this.domSignal.emit('level_change');
  this.sync.then('attached', function () {
    thisCal.$yearScroller.requestUpdateSize();
    thisCal.expandYear(thisCal._viewDate.getFullYear());

    thisCal._updateYearInEra();
  });

  _OOP.default.drillProperty(this, this, 'minLimitDate', 'min');

  _OOP.default.drillProperty(this, this, 'minDateLimit', 'min');

  _OOP.default.drillProperty(this, this, 'maxLimitDate', 'max');

  _OOP.default.drillProperty(this, this, 'maxDateLimit', 'max');

  this.startDayOfWeek = (0, datetime.getDefaultFirstDayOfWeek)();
}

ChromeCalendar.tag = 'ChromeCalendar'.toLowerCase();

ChromeCalendar.render = function () {
  return _({
    class: ['absol-chrome-calendar'],
    attr: {
      'data-level': 'day'
    },
    extendEvent: 'pick',
    child: [{
      class: 'absol-chrome-calendar-header',
      child: [{
        class: 'absol-chrome-calendar-title',
        child: [{
          tag: 'span',
          class: 'title-time',
          child: {
            text: 'Septemper, 2019'
          }
        }]
      }, {
        class: 'absol-chrome-calendar-header-buttons',
        child: [{
          tag: 'button',
          class: 'prev-btn',
          child: 'span.mdi.mdi-menu-left',
          attr: {
            title: 'Previous Month'
          }
        }, {
          tag: 'button',
          class: 'today-btn',
          child: 'span.mdi.mdi-circle-medium',
          attr: {
            title: 'Today'
          }
        }, {
          tag: 'button',
          class: 'next-btn',
          child: 'span.mdi.mdi-menu-right',
          attr: {
            title: 'Next Month'
          }
        }]
      }]
    }, {
      class: 'absol-chrome-calendar-instance',
      child: [{
        class: 'absol-chrome-calendar-dayofweek',
        child: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map(function (text) {
          return {
            child: {
              text: text
            }
          };
        })
      }, {
        class: 'absol-chrome-calendar-month',
        child: Array(6).fill(0).map(function (u, i) {
          return {
            class: 'absol-chrome-calendar-week-in-month',
            child: Array(7).fill(0).map(function (v, j) {
              return {
                child: {
                  text: i * 7 + j + ''
                }
              };
            })
          };
        })
      }, {
        tag: 'vscroller',
        class: 'absol-chrome-calendar-years',
        child: {}
      }, {
        class: "absol-chrome-calendar-era"
      }]
    }]
  });
};
/**
 * @param {Date} date
 * @returns {Boolean}
 */


ChromeCalendar.prototype._isSelectedDate = function (date) {
  for (var i = 0; i < this._selectedDates.length; ++i) {
    if ((0, datetime.compareDate)(date, this._selectedDates[i]) === 0) return true;
  }

  return false;
};
/**
 * @param {Date} date
 * @returns {Boolean}
 */


ChromeCalendar.prototype._isSelectedMonth = function (date) {
  for (var i = 0; i < this._selectedDates.length; ++i) {
    if ((0, datetime.compareMonth)(date, this._selectedDates[i]) === 0) return true;
  }

  return false;
};
/**
 * @param {Date} date
 * @returns {Boolean}
 */


ChromeCalendar.prototype._isSelectedQuarter = function (date) {
  for (var i = 0; i < this._selectedDates.length; ++i) {
    if ((0, datetime.compareMonth)((0, datetime.beginOfQuarter)(date), (0, datetime.beginOfQuarter)(this._selectedDates[i])) === 0) return true;
  }

  return false;
};
/**
 * @param {Date} date
 * @returns {Boolean}
 */


ChromeCalendar.prototype._isSelectedYear = function (date) {
  for (var i = 0; i < this._selectedDates.length; ++i) {
    if (date.getFullYear() === this._selectedDates[i].getFullYear()) return true;
  }

  return false;
};

ChromeCalendar.prototype._dayCmpLimit = function (date) {
  if ((0, datetime.compareDate)(date, this._min) < 0) return -1;
  if ((0, datetime.compareDate)(date, this._max) > 0) return 1;
  return 0;
};

ChromeCalendar.prototype._monthCmpLimit = function (date) {
  var startOfMonth = (0, datetime.beginOfMonth)(date);
  var endOfMonth = (0, datetime.nextMonth)(date);
  var minMil = Math.max(startOfMonth.getTime(), this._min.getTime());
  var maxMil = Math.min(endOfMonth.getTime(), (0, datetime.nextDate)(this._max).getTime());
  if (minMil < maxMil) return 0;
  return this._dayCmpLimit(date);
};

ChromeCalendar.prototype._yearCmpLimit = function (date) {
  var startOfYear = (0, datetime.beginOfYear)(date);
  var endOfYear = new Date(date.getFullYear() + 1, 0, 1);
  var minMil = Math.max(startOfYear.getTime(), this._min.getTime());
  var maxMil = Math.min(endOfYear.getTime(), (0, datetime.nextDate)(this._max).getTime());
  if (minMil < maxMil) return 0;
  return this._dayCmpLimit(date);
};
/***
 *
 * @param {Date} date
 * @param event
 */


ChromeCalendar.prototype.pickDate = function (date, event) {
  date = (0, datetime.beginOfDay)(date);
  this._selectedDates = [date];

  this._updateMonth(this.$month);

  if (this.$lastOpenYearItem) this.$lastOpenYearItem.$months.updateActiveMonth();
  this.emit('pick', {
    type: 'pick',
    value: date,
    isTrusted: event && event.isTrusted,
    originEvent: event,
    selectedDates: this.selectedDates
  });
};
/***
 *
 * @param {Date} date
 * @param event
 */


ChromeCalendar.prototype.pickMonth = function (date, event) {
  date = (0, datetime.beginOfMonth)(date);
  this._selectedDates = [date];
  if (this.$lastOpenYearItem) this.$lastOpenYearItem.$months.updateActiveMonth();
  this.emit('pick', {
    type: 'pick',
    value: date,
    isTrusted: event && event.isTrusted,
    originEvent: event,
    selectedDates: this.selectedDates
  });
};

ChromeCalendar.prototype._updatePickedYears = function () {
  var yearElt;
  var self = this;

  while (this.$lastPickYears && this.$lastPickYears.length > 0) {
    yearElt = this.$lastPickYears.pop();
    yearElt.removeClass('absol-chrome-calendar-selected');
  }

  this.$lastPickYears = this._selectedDates.map(function (date) {
    var yearElt = self._yearInAre(date.getFullYear());

    yearElt.addClass('absol-chrome-calendar-selected');
    return yearElt;
  });
};

ChromeCalendar.prototype.pickYear = function (year, event) {
  var date = new Date(year, 0, 1, 0, 0, 0, 0);
  this._selectedDates = [date];
  this.domSignal.emit('request_update_picked_years');
  this.scrollIntoDecade(Math.floor(year / 10) * 10, true);
  this.emit('pick', {
    type: 'pick',
    value: date,
    isTrusted: event && event.isTrusted,
    originEvent: event
  });
};
/**
 * @param {Element} monthElt
 * @param {Date} date
 */


ChromeCalendar.prototype._fillMonth = function (monthElt, date) {
  var self = this;

  if (monthElt.$cells === undefined) {
    //for faster, attach event to element
    monthElt.$cells = [];
    Array.prototype.forEach.call(monthElt.childNodes, function (row) {
      row.on('click', function (event) {
        if (event.target !== this) return;
        var pickedElt = this.firstChild;
        var pickDate = this.firstChild.__date__;
        self.pickDate(pickDate, event);

        if (pickedElt.hasClass('absol-chrome-calendar-not-in-month')) {
          if (pickDate.getDate() < 15) {
            self.viewNexMonth();
          } else {
            self.viewPrevMonth();
          }
        }
      });
    });
    $('.absol-chrome-calendar-week-in-month > div', this.$month, function (elt) {
      monthElt.$cells.push(elt);
      elt.on('click', function (event) {
        var pickedElt = elt;
        var pickDate = this.__date__;

        if (self._level === 'week') {
          pickDate = (0, datetime.beginOfWeek)(pickDate, false, self._startDayOfWeek);
          pickedElt = elt.parentElement.firstChild;
        }

        self.pickDate(pickDate, event);

        if (pickedElt.hasClass('absol-chrome-calendar-not-in-month')) {
          if (pickDate.getDate() < 15) {
            self.viewNexMonth();
          } else {
            self.viewPrevMonth();
          }
        }
      });
    });
  }

  var currentDate = datetime.beginOfWeek(datetime.beginOfMonth(date), false, this._startDayOfWeek);
  var d;
  var cell;

  for (var i = 0; i < monthElt.$cells.length; ++i) {
    cell = monthElt.$cells[i];
    d = currentDate.getDate();
    cell.innerHTML = '' + d;
    cell.__date__ = datetime.beginOfDay(currentDate);
    currentDate = datetime.nextDate(currentDate);
  }

  Array.prototype.forEach.call(monthElt.childNodes, function (row) {
    var weekIdx = (0, datetime.weekIndexOf)(row.firstChild.__date__, false, self._startDayOfWeek);
    row.attr('data-week-idx-text', (0, _utils.zeroPadding)(1 + weekIdx, 2) + '');
  });
};

ChromeCalendar.prototype._updateMonth = function (monthElt) {
  if (!monthElt.$cells) return; // days weren't filled

  var now = new Date();

  var viewM = this._viewDate.getMonth();

  var m;
  var cell;
  var currentDate;
  var selectedWeeks = {};

  for (var i = 0; i < monthElt.$cells.length; ++i) {
    cell = monthElt.$cells[i];
    currentDate = cell.__date__;
    m = currentDate.getMonth();
    if (m != viewM) cell.addClass('absol-chrome-calendar-not-in-month');else cell.removeClass('absol-chrome-calendar-not-in-month');
    if (datetime.compareDate(currentDate, now) === 0) cell.addClass('absol-chrome-calendar-today');else cell.removeClass('absol-chrome-calendar-today');

    if (this._isSelectedDate(currentDate)) {
      cell.addClass('absol-chrome-calendar-selected');
      selectedWeeks[(0, datetime.weekIndexOf)(currentDate, false, this._startDayOfWeek)] = true;
    } else cell.removeClass('absol-chrome-calendar-selected');

    if (datetime.compareDate(this._min, currentDate) > 0 || datetime.compareDate(currentDate, this._max) > 0) {
      cell.addClass('absol-chrome-calendar-date-disabled');
    } else {
      cell.removeClass('absol-chrome-calendar-date-disabled');
    }
  }

  Array.prototype.forEach.call(monthElt.childNodes, function (row) {
    var weekIdx = (0, datetime.weekIndexOf)(row.firstChild.__date__, false, this._startDayOfWeek);

    if (selectedWeeks[weekIdx]) {
      row.addClass('as-week-selected');
    } else {
      row.removeClass('as-week-selected');
    }
  }.bind(this));
};

ChromeCalendar.prototype._fillYearList = function (ctn) {
  var thisCal = this;

  _({
    child: Array(200).fill(0).map(function (u, i) {
      return {
        class: 'absol-chrome-calendar-year',
        child: [{
          class: 'absol-chrome-calendar-year-head',
          child: {
            text: i + 1890 + ''
          }
        }],
        props: {
          __year__: i + 1890
        },
        on: {
          click: function () {
            thisCal.expandYear(this.__year__);
          }
        }
      };
    })
  }).addTo(ctn);
};

ChromeCalendar.prototype._fillEra = function () {
  var now = new Date();
  var cYear = now.getFullYear();
  var rows = Array(50).fill(0).map(function (u, i) {
    return _({
      class: 'absol-chrome-calendar-era-row',
      child: Array(4).fill(0).map(function (u1, j) {
        var classList = ['absol-chrome-calendar-era-year'];
        var year = 1890 + i * 4 + j;

        if (cYear === year) {
          classList.push('absol-chrome-calendar-today');
        }

        return {
          class: classList,
          child: {
            text: year + ''
          },
          props: {
            __year__: year
          }
        };
      })
    });
  });
  this.$era.addChild(rows);
};

ChromeCalendar.prototype.viewNexMonth = function () {
  var self = this;
  this.sync = this.sync.then(function () {
    return new Promise(function (rs) {
      var oldBound = self.$month.getBoundingClientRect();
      var oldMonth = self.$month.cloneNode(true);
      var instanceBound = self.$instance.getBoundingClientRect();

      if (self.$lastAnimationCtn) {
        self.$lastAnimationCtn.removeClass('new').addClass('old');
      }

      var oldMonthCnt = _({
        class: ['absol-chrome-calendar-month-animation-container', 'old'],
        style: {
          top: oldBound.top - instanceBound.top + 'px',
          height: oldBound.height + 'px',
          width: oldBound.width + 'px'
        },
        child: oldMonth
      }).addTo(self.$instance);

      self._viewDate = datetime.nextMonth(self._viewDate);
      self.viewMonth();
      var newMonth = self.$month.cloneNode(true);
      var overlap = 0;
      var j = 41;

      while (j >= 0 && self.$month.$cells[j].hasClass('absol-chrome-calendar-not-in-month')) {
        overlap += oldBound.height / 6;
        j -= 7;
      }

      var newMonthCtn = _({
        class: ['absol-chrome-calendar-month-animation-container', 'new'],
        style: {
          top: oldBound.top + oldBound.height - instanceBound.top - overlap + 'px',
          height: oldBound.height + 'px',
          width: oldBound.width + 'px'
        },
        child: newMonth
      }).addTo(self.$instance);

      self.$lastAnimationCtn = newMonthCtn;
      setTimeout(function () {
        oldMonthCnt.addStyle('top', oldBound.top - oldBound.height + overlap - instanceBound.top + 'px');
        newMonthCtn.addStyle('top', oldBound.top - instanceBound.top + 'px');
      }, 20);
      setTimeout(function () {
        self.$lastAnimationCtn = undefined;
        oldMonthCnt.remove();
        newMonthCtn.remove();
      }, 220);
      setTimeout(rs, 22);
    });
  });
  return this.sync;
};

ChromeCalendar.prototype.viewPrevMonth = function () {
  var self = this;
  this.sync = this.sync.then(function () {
    return new Promise(function (rs) {
      var oldBound = self.$month.getBoundingClientRect();
      var oldMonth = self.$month.cloneNode(true);
      var instanceBound = self.$instance.getBoundingClientRect();

      if (self.$lastAnimationCtn) {
        self.$lastAnimationCtn.removeClass('new').addClass('old');
      }

      var oldMonthCnt = _({
        class: ['absol-chrome-calendar-month-animation-container', 'old'],
        style: {
          top: oldBound.top - instanceBound.top + 'px',
          height: oldBound.height + 'px',
          width: oldBound.width + 'px'
        },
        child: oldMonth
      }).addTo(self.$instance);

      self._viewDate = datetime.prevMonth(self._viewDate);
      self.viewMonth();
      var newMonth = self.$month.cloneNode(true);
      var overlap = 0;
      var j = 0;

      while (j < 42 && self.$month.$cells[j].hasClass('absol-chrome-calendar-not-in-month')) {
        overlap += oldBound.height / 6;
        j += 7;
      }

      var newMonthCtn = _({
        class: ['absol-chrome-calendar-month-animation-container', 'new'],
        style: {
          top: oldBound.top - oldBound.height + overlap - instanceBound.top + 'px',
          height: oldBound.height + 'px',
          width: oldBound.width + 'px'
        },
        child: newMonth
      }).addTo(self.$instance);

      self.$lastAnimationCtn = newMonthCtn;
      setTimeout(function () {
        oldMonthCnt.addStyle('top', oldBound.top + oldBound.height - overlap - instanceBound.top + 'px');
        newMonthCtn.addStyle('top', oldBound.top - instanceBound.top + 'px');
      }, 20);
      setTimeout(function () {
        self.$lastAnimationCtn = undefined;
        oldMonthCnt.remove();
        newMonthCtn.remove();
      }, 220);
      setTimeout(rs, 22);
    });
  });
  return this.sync;
};

ChromeCalendar.prototype.viewToday = function () {
  this._viewDate = new Date();

  switch (this._level) {
    case "day":
    case 'week':
      this.viewMonth();
      break;

    case "month":
    case "quarter":
      this.viewYear();
      break;

    case "year":
      this.viewEra(true);
      break;
  }
};

ChromeCalendar.prototype.viewMonth = function () {
  this._updateButtons();

  this.attr('data-view', 'month');

  this._fillMonth(this.$month, this._viewDate);

  this._updateMonth(this.$month);

  this.$titleTime.innerHTML = datetime.formatDateString(this._viewDate, 'mmmm, yyyy');
};

ChromeCalendar.prototype.viewYear = function () {
  this.attr('data-view', 'year');
  this.removeClass('view-month').removeClass('view-era').addClass('view-year');
  this.expandYear(this._viewDate.getFullYear());
  this.$yearScroller.requestUpdateSize();

  if (this._level === 'month' || this._level === 'quarter') {
    this.$titleTime.innerHTML = datetime.formatDateString(this._viewDate, 'yyyy');
  }
};

ChromeCalendar.prototype.viewEra = function (animation) {
  this.attr('data-view', 'era');
  this.removeClass('view-month').removeClass('view-year').addClass('view-era');
  this.scrollIntoDecade(Math.floor(this._viewDate.getFullYear() / 10) * 10, animation);
};

ChromeCalendar.prototype.viewNextDecade = function (animation) {
  this._viewDate = new Date(Math.min(2080, Math.floor(this._viewDate.getFullYear() / 10) * 10 + 10), 0, 1);
  this._viewDate = new Date(Math.min(this._viewDate.getTime(), (0, datetime.prevDate)(this._max).getTime()));
  this.viewEra(animation);
};

ChromeCalendar.prototype.viewPrevDecade = function (animation) {
  this._viewDate = new Date(Math.max(1890, Math.floor(this._viewDate.getFullYear() / 10) * 10 - 10), 0, 1);
  this._viewDate = new Date(Math.max(this._viewDate.getTime(), this._min.getTime()));
  this.viewEra(animation);
};

ChromeCalendar.prototype.expandYear = function (year) {
  if (this._level === 'month' || this._level === 'quarter') {
    this._viewDate = new Date(year, 0, 1);
    this.$titleTime.innerHTML = (0, datetime.formatDateString)(this._viewDate, 'yyyy');
    this.domSignal.emit('request_update_buttons');
  }

  var fontSize = this.getFontSize();
  var self = this;
  var lastItemElt = this.$lastOpenYearItem;
  var itemElt = this.$yearItems[year - 1890];
  var lastYear = 100000000;

  if (lastItemElt && lastItemElt.__year__ !== year) {
    lastYear = lastItemElt.__year__;
    lastItemElt.addClass('start-closing');
    setTimeout(function () {
      lastItemElt.removeClass('start-closing').addClass('closing');
    }, 0);
    setTimeout(function () {
      lastItemElt.removeClass('closing');
      lastItemElt.$months.remove();
      lastItemElt.$months = undefined;
    }, 100);
  }

  if (lastItemElt !== itemElt) {
    if (!itemElt.$months) {
      itemElt.$months = this._createMonths(year).addTo(itemElt);
      itemElt.addClass('start-opening');
      setTimeout(function () {
        itemElt.removeClass('start-opening').addClass('opening');
      }, 1);
      setTimeout(function () {
        itemElt.removeClass('opening');
      }, 100);
    }
  }

  var dy = itemElt.getBoundingClientRect().top - self.$yearScroller.getBoundingClientRect().top - fontSize * 0.45;

  if (itemElt.__year__ > lastYear) {
    dy -= 6 * fontSize;
  }

  self.$yearScroller.scrollBy(dy, 100);
  this.$lastOpenYearItem = itemElt;
  itemElt.$months.updateActiveMonth();
};

ChromeCalendar.prototype.scrollIntoDecade = function (startYear, animation) {
  if (!this.isDescendantOf(document.body)) {
    return this;
  }

  var thisCal = this;
  return new Promise(function (resolve) {
    var eraBound = thisCal.$era.getBoundingClientRect();
    var rowIdx = Math.floor((startYear - 1890) / 4);

    if (thisCal._decadeScrollTimeout > 0) {
      clearTimeout(thisCal._decadeScrollTimeout);
      thisCal._decadeScrollTimeout = -1;
    }

    if (thisCal.scrollIntoDecadeResolve) {
      thisCal.scrollIntoDecadeResolve();
      thisCal.scrollIntoDecadeResolve = null;
    }

    thisCal.scrollIntoDecadeResolve = resolve;
    var t0 = new Date().getTime();
    var t1 = t0 + 250;
    var y0 = thisCal.$era.scrollTop;
    var y1 = rowIdx * eraBound.height / 4;

    if (animation) {
      thisCal._decadeScrollTimeout = setTimeout(function tick() {
        var tc = new Date().getTime();
        var yc = Math.min(1, Math.pow((tc - t0) / (t1 - t0), 2)) * (y1 - y0) + y0;
        thisCal.$era.scrollTop = yc;
        console.log(yc);

        if (tc < t1) {
          thisCal._decadeScrollTimeout = setTimeout(tick, 500);
        } else {
          thisCal._decadeScrollTimeout = -1;
          thisCal.scrollIntoDecadeResolve = null;
          resolve();
        }
      }, 500);
    } else {
      thisCal.$era.scrollTop = y1;
    }
  });
};

ChromeCalendar.prototype._updateButtons_day = function () {
  if (this._monthCmpLimit((0, datetime.prevMonth)(this._viewDate)) < 0) {
    this.$prevBtn.addClass('absol-chrome-calendar-button-disabled');
  } else {
    this.$prevBtn.removeClass('absol-chrome-calendar-button-disabled');
  }

  if (this._monthCmpLimit((0, datetime.nextMonth)(this._viewDate)) > 0) {
    this.$nextBtn.addClass('absol-chrome-calendar-button-disabled');
  } else {
    this.$nextBtn.removeClass('absol-chrome-calendar-button-disabled');
  }

  var now = new Date();

  if (this._monthCmpLimit(now) === 0) {
    this.$todayBtn.removeClass('absol-chrome-calendar-button-disabled');
  } else {
    this.$todayBtn.addClass('absol-chrome-calendar-button-disabled');
  }
};

ChromeCalendar.prototype._updateButtons_week = ChromeCalendar.prototype._updateButtons_day;

ChromeCalendar.prototype._updateButtons_year = function () {
  if (!this._viewDate) return;
  var year = Math.floor(this._viewDate.getFullYear() / 10) * 10;

  if (this._yearCmpLimit(new Date(year - 1, 0, 1)) < 0) {
    this.$prevBtn.addClass('absol-chrome-calendar-button-disabled');
  } else {
    this.$prevBtn.removeClass('absol-chrome-calendar-button-disabled');
  }

  if (this._yearCmpLimit(new Date(year + 10, 0, 1)) > 0) {
    this.$nextBtn.addClass('absol-chrome-calendar-button-disabled');
  } else {
    this.$nextBtn.removeClass('absol-chrome-calendar-button-disabled');
  }

  var now = new Date();

  if (this._yearCmpLimit(now) === 0) {
    this.$todayBtn.removeClass('absol-chrome-calendar-button-disabled');
  } else {
    this.$todayBtn.addClass('absol-chrome-calendar-button-disabled');
  }
};

ChromeCalendar.prototype._updateButtons_month = function () {
  if (this._yearCmpLimit(new Date(this._viewDate.getFullYear() + 1, 0, 1)) > 0) {
    this.$nextBtn.addClass('absol-chrome-calendar-button-disabled');
  } else {
    this.$nextBtn.removeClass('absol-chrome-calendar-button-disabled');
  }

  if (this._yearCmpLimit(new Date(this._viewDate.getFullYear() - 1, 0, 1)) < 0) {
    this.$prevBtn.addClass('absol-chrome-calendar-button-disabled');
  } else {
    this.$prevBtn.removeClass('absol-chrome-calendar-button-disabled');
  }
};

ChromeCalendar.prototype._updateButtons = function () {
  var fName = '_updateButtons_' + this._level;
  this[fName] && this[fName]();
};

ChromeCalendar.prototype._createMonths = function (year) {
  var now = new Date();
  var self = this;

  var res = _({
    class: 'absol-chrome-calendar-year-months',
    child: Array(3).fill('').map(function (u, i) {
      return {
        class: 'absol-chrome-calendar-year-row-months',
        child: Array(4).fill(0).map(function (v, j) {
          var date = new Date(year, i * 4 + j, 1, 0, 0, 0, 0, 0);
          var quarter = Math.floor((i * 4 + j) / 3);
          return {
            class: ['absol-chrome-calendar-year-month'].concat(year == now.getFullYear() && now.getMonth() == i * 4 + j ? ['absol-chrome-calendar-today'] : []).concat(self._isSelectedMonth(date) ? ['absol-chrome-calendar-selected'] : []),
            attr: {
              'data-quarter': quarter + ''
            },
            child: {
              text: datetime.monthNames[i * 4 + j].substr(0, 3)
            },
            on: {
              click: function () {}
            },
            props: {
              __date__: date,
              __quarter__: quarter
            }
          };
        })
      };
    }),
    on: {
      click: this.eventHandler.clickMonthsInYear
    }
  });

  res.$monthList = [];
  $('.absol-chrome-calendar-year-month', res, function (e) {
    res.$monthList.push(e);
  });

  function onMouseEnter(event) {
    document.addEventListener('mousemove', onMouseMove);
  }

  function onMouseMove(event) {
    if (!(0, _EventEmitter.hitElement)(res, event)) {
      document.removeEventListener('mousemove', onMouseMove);
      res.attr('data-hover-quarter', undefined);
      return;
    }

    if (typeof event.target.__quarter__ === "number") {
      if (res.attr('data-hover-quarter') !== event.target.__quarter__ + '') res.attr('data-hover-quarter', event.target.__quarter__ + '');
    } else {
      res.attr('data-hover-quarter', undefined);
    }
  }

  res.on('mouseenter', onMouseEnter);

  res.updateActiveMonth = function () {
    res.$monthList.forEach(function (e) {
      now = new Date();

      if (datetime.compareMonth(e.__date__, now) == 0) {
        e.addClass('absol-chrome-calendar-today');
      } else {
        e.removeClass('absol-chrome-calendar-today');
      }

      if (self._isSelectedMonth(e.__date__)) {
        e.addClass('absol-chrome-calendar-selected');
      } else {
        e.removeClass('absol-chrome-calendar-selected');
      }

      if (self._isSelectedQuarter(e.__date__)) {
        e.addClass('as-quarter-selected');
      } else {
        e.removeClass('as-quarter-selected');
      }

      var beginOfMonth = datetime.beginOfMonth(e.__date__);
      var endOfMonth = datetime.prevDate(datetime.nextMonth(e.__date__));

      if (datetime.compareDate(self._min, endOfMonth) > 0 || datetime.compareDate(beginOfMonth, self._max) > 0) {
        e.addClass('absol-chrome-calendar-date-disabled');
      } else {
        e.removeClass('absol-chrome-calendar-date-disabled');
      }
    });
  };

  return res;
};

ChromeCalendar.prototype._yearInAre = function (year) {
  var d = year - 1890;
  var rowIdx = Math.floor(d / 4);
  var colIdx = d % 4;
  return this.$era.childNodes[rowIdx] && this.$era.childNodes[rowIdx].childNodes[colIdx];
};

ChromeCalendar.prototype._clearYearInAre = function (startYear) {
  var cellElt;

  for (var i = 0; i < 10; ++i) {
    cellElt = this._yearInAre(startYear + i);
    if (cellElt) cellElt.removeClass('absol-chrome-calendar-in-decade');
  }
};

ChromeCalendar.prototype._activeYearInAre = function (startYear) {
  var cellElt;

  for (var i = 0; i < 10; ++i) {
    cellElt = this._yearInAre(startYear + i);
    if (cellElt) cellElt.addClass('absol-chrome-calendar-in-decade');
  }
};

ChromeCalendar.prototype._updateYearInEra = function () {
  var eraBound = this.$era.getBoundingClientRect();
  var startYear = 1890 + 4 * Math.ceil((this.$era.scrollTop - eraBound.height / 16) * 4 / eraBound.height);
  var startDecade = Math.floor(startYear / 10) * 10;
  if (startDecade + 10 - startYear < 8) startDecade += 10;

  if (this._lastStartDecade !== startDecade) {
    if (this._lastStartDecade > 0) {
      this._clearYearInAre(this._lastStartDecade);
    }

    this._lastStartDecade = startDecade;

    this._activeYearInAre(startDecade);

    if (this._level === 'year') {
      this.$titleTime.innerHTML = startDecade + '-' + (startDecade + 10);

      if (!this._decadeScrollTimeout || this._decadeScrollTimeout < 0) {
        if (this._yearCmpLimit(new Date(startDecade, 0, 1)) === 0) this._viewDate = new Date(startDecade, 0, 1);
      }
    }

    this.domSignal.emit('request_update_buttons');
  }
};

ChromeCalendar.prototype._updateDisabledYearInEra = function () {
  var self = this;
  Array.prototype.forEach.call(this.$era.childNodes, function (rowElt) {
    Array.prototype.forEach.call(rowElt.childNodes, function (cellElt) {
      if (cellElt.__year__) {
        if (self._yearCmpLimit(new Date(cellElt.__year__, 0, 1)) === 0) {
          cellElt.removeClass('absol-chrome-calendar-date-disabled');
        } else {
          cellElt.addClass('absol-chrome-calendar-date-disabled');
        }
      }
    });
  });
};

ChromeCalendar.prototype._updateOpenYear = function () {
  if (this.$lastOpenYearItem) {
    this.$lastOpenYearItem.$months.updateActiveMonth();
  }
};

ChromeCalendar.property = {};
ChromeCalendar.property.selectedDates = {
  set: function (value) {
    value = value || [];
    if (!(value instanceof Array)) value = [value];
    value = value.map(d => (0, datetime.implicitDate)(d)).filter(d => !!d);
    this._selectedDates = value;
    this._viewDate = this._selectedDates[0] || new Date();
    this.domSignal.emit('level_change');
    if (this._level === 'year') this.domSignal.emit('request_update_picked_years');
  },
  get: function () {
    var level = this._level;

    var res = this._selectedDates.map(d => {
      switch (level) {
        case 'day':
          return (0, datetime.beginOfDay)(d);

        case 'week':
          return (0, datetime.beginOfWeek)(d);

        case 'month':
          return (0, datetime.beginOfMonth)(d);

        case 'quarter':
          return (0, datetime.beginOfQuarter)(d);

        case 'year':
          return (0, datetime.beginOfYear)(d);
      }
    });

    res = res.reduce((ac, d) => {
      var key = (0, _utils.keyStringOf)(d);
      if (ac.has[key]) return ac;
      ac.has[key] = d;
      ac.arr.push(d);
      return ac;
    }, {
      has: {},
      arr: []
    }).arr;
    res.sort((a, b) => {
      return a.getTime() - b.getTime();
    });
    return res;
  }
};
ChromeCalendar.property.min = {
  set: function (value) {
    if (!value) value = new Date(1890, 0, 1);
    if (typeof value == 'number') value = new Date(value);
    value = (0, datetime.beginOfDay)(value);
    value = new Date(Math.max(new Date(1890, 0, 1).getTime(), value.getTime()));
    this._min = value;
    this.domSignal.emit('request_update_buttons');
    this.domSignal.emit('request_update_month');
    this.domSignal.emit('request_update_open_year');
    this.domSignal.emit('request_update_disabled_year_in_era');
  },
  get: function () {
    return this._min;
  }
}; //include maxLimitDate

ChromeCalendar.property.max = {
  set: function (value) {
    if (!value) value = new Date(2090, 0, 1);
    if (typeof value == 'number') value = new Date(value);
    if (value.getTime() > (0, datetime.beginOfDay)(value).getTime()) value = (0, datetime.nextDate)((0, datetime.beginOfDay)(value));
    value = new Date(Math.min(new Date(2090, 0, 1).getTime(), value.getTime()));
    this._max = value;
    this.domSignal.emit('request_update_buttons');
    this.domSignal.emit('request_update_month');
    this.domSignal.emit('request_update_open_year');
    this.domSignal.emit('request_update_disabled_year_in_era');
  },
  get: function () {
    return this._max;
  }
};
ChromeCalendar.property.multiSelect = {
  set: function (value) {
    throw new Error('Not support yet!');
    var lastValue = this.multiSelect;
    value = !!value;

    if (lastValue != value) {
      if (value) {
        this.addClass('multi-select');
      } else {
        this.removeClass('multi-select');
      }

      this._updateMonth(this.$month);
    }
  },
  get: function () {
    return this.hasClass('multi-select');
  }
};
ChromeCalendar.property.level = {
  set: function (value) {
    value = (value || '') + '';
    value = value.toLowerCase();
    if (['day', 'week', 'quarter', 'month', 'year'].indexOf(value) < 0) value = 'day';
    if (this._level === value) return;
    this.attr('data-level', value);
    this._level = value;
    this.domSignal.emit('level_change');
    if (this._level === 'year') this.domSignal.emit('request_update_picked_years');
  },
  get: function () {
    return this._level;
  }
};
ChromeCalendar.prototype.dayInWeekTexts = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
ChromeCalendar.property.startDayOfWeek = {
  set: function (value) {
    value = Math.max(0, Math.min(Math.floor(value || 0), 6));

    if (this._startDayOfWeek !== value) {
      this._startDayOfWeek = value;
      Array.prototype.forEach.call(this.$dayOfWeek.childNodes, function (e, i) {
        e.firstChild.data = this.dayInWeekTexts[(i + value) % 7];
      }.bind(this));
    }

    this._updateMonth(this.$month);
  },
  get: function () {
    return this._startDayOfWeek;
  }
};
ChromeCalendar.property.viewDate = {
  set: function (date) {
    this._viewDate = date;
    this.domSignal.emit('level_change');
  },
  get: function () {
    return this._viewDate;
  }
};
ChromeCalendar.eventHandler = {};

ChromeCalendar.eventHandler.eraScroll = function () {
  this._updateYearInEra();
};

ChromeCalendar.eventHandler.clickEra = function (event) {
  var yearElt = event.target;
  var year = yearElt.__year__;
  if (typeof year !== "number") return;
  this.pickYear(year, event);
};

ChromeCalendar.eventHandler.clickPrev = function () {
  switch (this._level) {
    case "day":
    case 'week':
      this.viewPrevMonth();
      break;

    case "month":
      this.expandYear(Math.min(this._max.getFullYear(), this._viewDate.getFullYear() - 1));
      break;

    case "year":
      if (!this._decadeScrollTimeout || this._decadeScrollTimeout < 0) this.viewPrevDecade(true);
      break;
  }
};

ChromeCalendar.eventHandler.clickNext = function () {
  switch (this._level) {
    case "day":
    case 'week':
      this.viewNexMonth();
      break;

    case "month":
      this.expandYear(Math.max((0, datetime.prevDate)(this._min).getFullYear(), this._viewDate.getFullYear() + 1));
      break;

    case "year":
      if (!this._decadeScrollTimeout || this._decadeScrollTimeout < 0) this.viewNextDecade(true);
      break;
  }
};

ChromeCalendar.eventHandler.clickToday = function (event) {
  this.viewToday();

  switch (this._level) {
    case "day":
      this.pickDate(new Date(), event);
      break;

    case 'week':
      this.pickDate((0, datetime.beginOfWeek)(new Date(), false, this.startDayOfWeek), event);
      break;

    case "month":
      this.expandYear(new Date().getFullYear());
      this.pickMonth((0, datetime.beginOfMonth)(new Date()), event);
      break;

    case "year":
      this.pickYear(new Date().getFullYear());
      this._viewDate = new Date(new Date().getFullYear(), 0, 1);
      this.viewEra(true);
      break;
  }
};

ChromeCalendar.eventHandler.clickTitle = function (event) {
  switch (this._level) {
    case "day":
    case "week":
      this.viewYear();
      break;

    case "month":
      break;

    case "year":
      break;
  }
};

ChromeCalendar.eventHandler.clickMonthsInYear = function (event) {
  var monthElt = event.target;
  var date = monthElt.__date__;
  if (!date) return;

  switch (this._level) {
    case "day":
    case "week":
      this._viewDate = date;
      this.viewMonth();
      break;

    case "month":
    case "quarter":
      this.pickMonth(date, event);
      break;

    case "year":
      break;
  }
};

ChromeCalendar.eventHandler.levelChange = function () {
  switch (this._level) {
    case "day":
    case "week":
      this.viewMonth();
      break;

    case "month":
    case "quarter":
      this.viewYear();
      break;

    case "year":
      this.viewEra();
      break;
  }
};

_ACore.default.install(ChromeCalendar);

ChromeCalendar._session = Math.random() * 10000000000 >> 0;
ChromeCalendar._listener = undefined;

ChromeCalendar.showWhenClick = function (element, calendarProps, anchor, calendarPickListener, darkTheme) {
  var res = {
    calendarProps: Object.assign({
      maxDateLimit: null,
      minDateLimit: null
    }, calendarProps),
    anchor: anchor,
    currentSession: undefined,
    element: element,
    calendarPickListener: calendarPickListener,
    darkTheme: darkTheme,
    setDateValue: function (value) {
      if (this.currentSession == ChromeCalendar._session) {
        ChromeCalendar.$calendar.selectedDates = [value];
      }
    },
    cancel: function () {}
  };

  var clickHandler = function () {
    if (element.hasClass('as-read-only')) return;
    if (ChromeCalendar._session == res.currentSession) return;
    res.currentSession = ChromeCalendar.show(res.element, res.calendarProps, res.anchor, res.calendarPickListener, res.darkTheme);

    var finish = function (event) {
      if (event && event.target && _EventEmitter.default.hitElement(ChromeCalendar.$calendar, event)) return;
      document.body.removeEventListener('click', finish, false);
      ChromeCalendar.close(res.currentSession);
      ChromeCalendar.$calendar.off('pick', finish);
      res.currentSession = undefined;

      res.cancel = function () {};
    };

    setTimeout(function () {
      document.body.addEventListener('click', finish, false);
      ChromeCalendar.$calendar.on('pick', finish);
      res.cancel = finish;
    }, 10);
  };

  res.remove = function () {
    element.removeEventListener('click', clickHandler, false);
  };

  element.addEventListener('click', clickHandler, false);
  return res;
};

ChromeCalendar.show = function (element, calendarProps, anchor, calendarPickListener, darkTheme) {
  ChromeCalendar._session = Math.random() * 10000000000 >> 0;

  function exec() {
    if (!ChromeCalendar.$ctn) {
      ChromeCalendar.$ctn = _('.absol-context-hinge-fixed-container');
      ChromeCalendar.$follower = _('follower').addTo(ChromeCalendar.$ctn);
      ChromeCalendar.$calendar = _('chromecalendar.as-dropdown-box-common-style').on('pick', function (event) {
        if (typeof ChromeCalendar._listener == 'function') {
          ChromeCalendar._listener(event.value);
        }
      }).addTo(ChromeCalendar.$follower);
    }

    ChromeCalendar.$ctn.addTo(document.body); // only one value need

    if (calendarProps instanceof Date) calendarProps = {
      selectedDates: [calendarProps]
    };
    if (calendarProps instanceof Array) calendarProps = {
      selectedDates: calendarProps
    };
    Object.assign(ChromeCalendar.$calendar, calendarProps);
    if (darkTheme) ChromeCalendar.$ctn.addClass('dark');else ChromeCalendar.$ctn.removeClass('dark');
    ChromeCalendar.$follower.followTarget = element;
    ChromeCalendar.$follower.anchor = anchor;
    ChromeCalendar.$calendar.addStyle('visibility', 'hidden'); //for prevent size change blink

    ChromeCalendar._listener = calendarPickListener;
    setTimeout(function () {
      ChromeCalendar.$follower.updatePosition();
      ChromeCalendar.$calendar.removeStyle('visibility');
    }, 2);
  }

  if (document.body) exec();else _Dom.default.documentReady.then(exec);
  return ChromeCalendar._session;
};

ChromeCalendar.close = function (session) {
  if (session !== true && session != ChromeCalendar._session) return;

  function exec() {
    ChromeCalendar.followTarget = undefined;
    ChromeCalendar._listener = undefined;
    ChromeCalendar.$ctn.remove();
  }

  if (document.body) exec();else _Dom.default.documentReady.then(exec);
};

var _default = ChromeCalendar;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CalendarInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CalendarInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.OldCalendarInput = OldCalendarInput;
exports.default = void 0;

require("../css/calendarinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _datetime = require("absol/src/Time/datetime");

var _ChromeCalendar = _interopRequireDefault(require("./ChromeCalendar"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/**
 * @extends AElement
 * @constructor
 */

function CalendarInput() {
  var thisCI = this;
  this.$input = $('input', this);
  this._value = null;
  this._quickOption = _ChromeCalendar.default.showWhenClick(this, {
    minLimitDate: this.minLimitDate || this.minDateLimit,
    maxLimitDate: this.maxLimitDate || this.maxDateLimit,
    selectedDates: [new Date()]
  }, 'auto', function (value) {
    thisCI._value = value;
    thisCI.$input.value = thisCI.formatDateString(value);
    thisCI._quickOption.calendarProps.selectedDates = [value]; //change new option

    thisCI.emit('change', {
      target: thisCI,
      value: value
    }, thisCI);
  });

  _OOP.default.drillProperty(this, this._quickOption.calendarProps, {
    minLimitDate: 'minLimitDate',
    maxLimitDate: 'maxLimitDate',
    minDateLimit: 'minLimitDate',
    maxDateLimit: 'maxLimitDate'
  });
}

CalendarInput.tag = 'CalendarInput'.toLowerCase();

CalendarInput.render = function () {
  return _({
    extendEvent: ['change'],
    class: 'absol-calendar-input',
    child: 'input[type="text"][readonly="true"][value="dd/mm/yyyy"]'
  });
};

CalendarInput.property = {};
CalendarInput.property.value = {
  set: function (value) {
    if (value === null || value === undefined) {
      this.$input.value = this.formatDateString(value);
      this._quickOption.calendarProps.selectedDates = [];
      this._value = value;
      this._quickOption.calendarProps.selectedDates = [new Date()];
    } else {
      if (typeof value == 'number') value = new Date(value);
      this._value = value;
      this.$input.value = this.formatDateString(value);
      this._quickOption.calendarProps.selectedDates = [value];
    }
  },
  get: function () {
    return this._value;
  }
};
CalendarInput.property.disabled = {
  set: function (value) {
    this.$input.disabled = !!value;

    if (value) {
      this.addClass('absol-disabled');
    } else {
      this.removeClass('absol-disabled');
    }
  },
  get: function () {
    return this.$input.disabled;
  }
};
CalendarInput.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
CalendarInput.attribute = {
  disabled: {
    set: function (value) {
      this.$input.attr('disabled', value);
      if (this.$input.disabled) this.addClass('absol-disabled');
    },
    get: function () {
      return this.$input.attr('disabled');
    },
    remove: function () {
      this.$input.attr('disabled', undefined);
      this.removeClass('absol-disabled');
    }
  }
};
CalendarInput.property.dateToString = {
  set: function (value) {
    this._dateToString = value;
    this.$input.value = this.formatDateString(this.value);
  },
  get: function () {
    return this._dateToString;
  }
};

CalendarInput.prototype.formatDateString = function (date) {
  if (!date) {
    return {
      'undefined': 'dd/mm/yyyy',
      'function': '--/--/--',
      'object': 'dd/mm/yyyy',
      'string': typeof this.dateToString
    }[typeof this.dateToString] || '--/--/--';
  }

  if (!this.dateToString) {
    return (0, _datetime.formatDateString)(date);
  } else if (typeof this.dateToString == 'string') {
    return (0, _datetime.formatDateString)(date, this.dateToString);
  } else if (typeof this.dateToString == 'function') {
    return this.dateToString(date);
  }
};

_ACore.default.install(CalendarInput);

function OldCalendarInput() {}

OldCalendarInput.tag = 'calendar-input';

OldCalendarInput.render = function (data) {
  return _({
    tag: 'calendarinput',
    extendEvent: 'changed',
    props: data,
    on: {
      change: function (ev) {
        this.emit('changed', ev.value);
      }
    }
  });
};

_ACore.default.install(OldCalendarInput);

var _default = CalendarInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CheckBoxInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CheckBoxInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/checkboxinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

var tickIcon = _(['<svg class="as-checkbox-input-check-icon" width="18px" height="18px" version="1.1" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg" >', ' <g transform="translate(0 -279)">', '  <path class="bound" d="m3 279.69h12c1.3434 0.0111 2.3298 1.5259 2.3131 2.4775v11.836c0.05005 0.89373-1.1834 2.2964-2.3131 2.3131h-12c-0.82692 0.0166-2.3131-1.1834-2.3131-2.3131v-12.237c0.0022374-1.171 0.3775-2.0759 2.3131-2.0759z" style="stroke-linejoin:round; stroke-width: 1"/>', '  <path class="tick" d="m3.1656 288.66c-0.10159 0.0612-0.11743 0.12506-0.12993 0.18899l3.7473 4.3467c0.066638 0.0459 0.11813 0.0263 0.16832 1e-3 0 0 1.7699-4.2166 4.7251-7.4568 1.4783-1.6208 3.2406-3.3659 3.2406-3.3659 0.0054-0.14125-0.10946-0.15807-0.1754-0.22551 0 0-2.5832 1.6364-4.7524 3.8336-1.8697 1.8939-3.6666 4.4016-3.6666 4.4016z"/>', '  <path class="minus" d="m4 287 h10 v2 h-10z"/>', ' </g>', '</svg>'].join(''));
/***
 * @extends AElement
 * @constructor
 */


function CheckboxInput() {
  this.$input = $('input', this).on('change', this.notifyChange.bind(this));
  this.checked = false;
  this.disabled = false;
  this.readOnly = false;
  this.on('click', this.eventHandler.click);
  this.onchange = null;
}

CheckboxInput.tag = "CheckboxInput".toLowerCase();

CheckboxInput.render = function (data) {
  return _({
    tag: 'label',
    extendEvent: 'change',
    class: 'as-checkbox-input',
    child: [{
      elt: data && data.$input,
      tag: 'input',
      class: 'as-checkbox-input-value',
      attr: {
        type: 'checkbox'
      }
    }, tickIcon.cloneNode(true)]
  });
};
/***
 * as normal, change event will be fired when checkbox change by system
 */


CheckboxInput.prototype.notifyChange = function () {
  var event = {
    checked: this.checked
  };
  this.emit('change', event, this);
};

CheckboxInput.prototype._updateCheckedClass = function () {
  if (this.checked) {
    this.addClass('as-checked');
  } else {
    this.removeClass('as-checked');
  }
};

CheckboxInput.property = {};
CheckboxInput.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }

    this.$input.disabled = !!value;
  },
  get: function () {
    return this.$input.disabled;
  }
};
CheckboxInput.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
/***
 *
 * @type {CheckboxInput}
 */

CheckboxInput.property.checked = {
  set: function (value) {
    this.$input.checked = !!value;

    this._updateCheckedClass();
  },
  get: function () {
    return this.$input.checked;
  }
};
CheckboxInput.attribute = {
  checked: {
    set: function (value) {
      if (value === 'false' || value === null) {
        this.checked = false;
      } else {
        this.checked = true;
      }
    },
    get: function () {
      return this.checked ? 'true' : 'false';
    },
    remove: function () {
      this.checked = false;
    }
  },
  disabled: {
    set: function (value) {
      if (value === 'false' || value === null) {
        this.disabled = false;
      } else {
        this.disabled = true;
      }
    },
    get: function () {
      return this.disabled ? 'true' : 'false';
    },
    remove: function () {
      this.disabled = false;
    }
  }
};
/***
 *
 * @type {CheckboxInput}
 */

CheckboxInput.eventHandler = {};

CheckboxInput.eventHandler.click = function (event) {
  if (this.readOnly) {
    event.preventDefault();
  }

  this._updateCheckedClass();
};

_ACore.default.install(CheckboxInput);

CheckboxInput.autoReplace = function () {
  var placeHolders = Array.prototype.slice.call(document.getElementsByTagName(this.tag));
  var ph;
  var attOfPH;
  var attrs;
  var style;
  var classList;
  var attNode;
  var attrName, attrValue;
  var props;

  for (var i = 0; i < placeHolders.length; ++i) {
    ph = placeHolders[i];
    attOfPH = ph.attributes;
    classList = [];
    style = {};
    attrs = {};
    props = {};

    for (var j = 0; j < attOfPH.length; ++j) {
      attNode = attOfPH[j];
      attrName = attNode.nodeName;
      attrValue = attNode.nodeValue;

      if (attrName == 'style') {
        attrValue.trim().split(';').reduce(function (style, prop) {
          var p = prop.split(':');

          if (p.length == 2) {
            style[p[0].trim()] = p[1].trim();
          }

          return style;
        }, style);
      } else if (attrName == 'class') {
        classList = attrValue.trim().split(/\s+/);
      } else if (attrName == 'onchange') {
        props.onchange = new Function('event', 'sender', attrValue);
      } else {
        attrs[attrName] = attrValue;
      }
    }

    var newElt = _({
      tag: this.tag,
      attr: attrs,
      class: classList,
      style: style,
      props: props
    });

    $(ph).selfReplace(newElt);
  }
};

CheckboxInput.initAfterLoad = function () {
  _Dom.default.documentReady.then(function () {
    CheckboxInput.autoReplace();
  });
};

var _default = CheckboxInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CheckBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CheckBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/checkbox.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _CheckBoxInput = _interopRequireDefault(require("./CheckBoxInput"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var $$ = _ACore.default.$$;
/***
 * @extends AElement
 * @constructor
 */

function CheckBox() {
  this.defineEvent('change');
  /***
   *
   * @type {CheckboxInput}
   */

  this.$input = $('checkboxinput', this).on('change', this.notifyChange.bind(this));
  this.$labels = $$('span', this);
  this.on('click', this.eventHandler.click);

  _OOP.default.drillProperty(this, this.$input, ['checked']);
  /***
   * @type {boolean}
   * @name checked
   * @memberOf CheckBox#
   */

}

CheckBox.tag = 'checkbox';

CheckBox.render = function () {
  return _({
    class: ['absol-checkbox', 'as-no-label'],
    child: [{
      tag: 'span',
      class: ['absol-checkbox-label', 'as-left'],
      child: {
        text: ''
      }
    }, 'checkboxinput', {
      tag: 'span',
      class: ['absol-checkbox-label', 'as-right'],
      child: {
        text: ''
      }
    }]
  });
};

CheckBox.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change',
    checked: this.checked,
    target: this
  }, this);
}; //v, labelText, checked


CheckBox.attribute = {
  checked: {
    set: function (value) {
      if (value === 'false' || value == null) {
        this.checked = false;
      } else {
        this.checked = true;
      }
    },
    get: function () {
      return this.checked ? 'true' : 'false';
    },
    remove: function () {
      this.checked = false;
    }
  },
  disabled: {
    set: function (value) {
      this.disabled = !(value === 'false' || value === null);
    },
    get: function () {
      return this.disabled ? 'true' : 'false';
    },
    remove: function () {
      this.disabled = false;
    }
  },
  readonly: {
    set: function (value) {
      this.readOnly = !(value === 'false' || value === null);
    },
    get: function () {
      return this.readOnly ? 'true' : 'false';
    }
  }
};
CheckBox.property = {};
CheckBox.property.text = {
  get: function () {
    return this._text;
  },
  set: function (value) {
    value = value || '';

    if (value.length === 0) {
      this.addClass('as-no-label');
    } else {
      this.removeClass('as-no-label');
    }

    this._text = value;
    this.$labels[0].firstChild.data = value;
    this.$labels[1].firstChild.data = value;
  }
};
CheckBox.property.disabled = {
  get: function () {
    return this.$input.disabled;
  },
  set: function (value) {
    value = !!value;
    this.$input.disabled = value;

    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  }
};
CheckBox.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
      this.$input.readOnly = true;
    } else {
      this.addClass('as-read-only');
      this.$input.readOnly = false;
    }
  },
  get: function () {
    return this.$input.readOnly;
  }
};
/***
 *
 * @type {{}|CheckBox}
 */

CheckBox.eventHandler = {};

CheckBox.eventHandler.click = function (event) {
  if (!_EventEmitter.default.hitElement(this.$input, event) && !this.readOnly) {
    this.$input.click();
  }
};

_ACore.default.install(CheckBox);

var _default = CheckBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CircleSectionLabel.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CircleSectionLabel.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/circlesectionlabel.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var _g = _Svg.default.ShareInstance._;
var $g = _Svg.default.ShareInstance.$;
var Design = {
  circleHeight: 218 - 36,
  borderWidth: 36,
  textBoxHeight: 146,
  textHeight: 48,
  indexHeight: 54,
  textBoxPaddingLeft: 80,
  indexArrowRadius: (172 - 18) / 2,
  indexArrowStrokeWidth: 18,
  indexArrowStartAngle: -Math.PI / 6,
  indexArrowEndAngle: -7 * Math.PI / 12
};
var StyleSheet = {
  '.as-circle-section-label-text': {
    height: Design.textBoxHeight / Design.textHeight + 'em',
    'padding-left': Design.textBoxPaddingLeft / Design.textHeight + 'em',
    'line-height': Design.textBoxHeight / Design.textHeight + 'em'
  },
  '.as-circle-section-label-index': {
    'font-size': Design.indexHeight / Design.textHeight + 'em',
    height: (Design.circleHeight + Design.borderWidth) / Design.indexHeight + 'em',
    'line-height': (Design.circleHeight + Design.borderWidth) / Design.indexHeight + 'em',
    width: (Design.circleHeight + Design.borderWidth) / Design.indexHeight + 'em'
  }
};

_({
  tag: 'style',
  id: 'circle-section-label-style',
  props: {
    innerHTML: Object.keys(StyleSheet).map(function (key) {
      var style = StyleSheet[key];
      return key + ' {\n' + Object.keys(style).map(function (propName) {
        return propName + ': ' + style[propName] + ';';
      }).join('\n') + '}';
    }).join('\n')
  }
}).addTo(document.head);
/**
 * @extends AElement
 * @constructor
 */


function CircleSectionLabel() {
  this._ident = (Math.random() + '').replace(/[^0-9]/g, '_');
  this.$background = $('.as-circle-section-label-background', this);
  this.$index = $('.as-circle-section-label-index', this);
  this.$text = $('.as-circle-section-label-text', this);
  this.$attachhook = _('attachhook').addTo(this).on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
  });
  this.$attachhook.requestUpdateSize = this.redrawBackground.bind(this);
  this.$svg = _g({
    tag: 'svg',
    attr: {
      width: '0',
      height: '0'
    },
    child: [{
      tag: 'defs',
      child: [{
        tag: 'marker',
        id: 'marker_' + this._ident,
        attr: {
          markerWidth: "4",
          markerHeight: "4",
          refX: "0",
          refY: "1",
          orient: "auto",
          markerUnits: "strokeWidth",
          viewBox: "0 0 4 4"
        },
        child: {
          tag: 'path',
          class: 'as-circle-section-label-arrow-marker-path',
          attr: {
            d: 'M0,0 L0,2 L2,1 z'
          }
        }
      }]
    }, 'rect.as-circle-section-label-text-box', 'circle.as-circle-section-label-index-box', 'path.as-circle-section-label-arrow']
  }).addTo(this.$background);
  this.$indexBox = $g('circle.as-circle-section-label-index-box', this.$svg);
  this.$textBox = $g('rect.as-circle-section-label-text-box', this.$svg); // this.$marker = $g('defs marker', this.$svg);
  // this.$markerPath = $g(' path', this.$marker);

  this.$arrow = $g('path.as-circle-section-label-arrow', this.$svg).attr({
    'marker-end': "url(" + '#marker_' + this._ident + ")"
  });
}

;

CircleSectionLabel.prototype.redrawBackground = function () {
  var indexBound = this.$index.getBoundingClientRect();
  var textBound = this.$text.getBoundingClientRect();
  var cHeight = indexBound.height;
  var cWidth = textBound.right - indexBound.left;
  this.$svg.attr({
    height: cHeight + '',
    width: cWidth + '',
    viewBox: [0, 0, cWidth, cHeight].join(' ')
  });
  var borderWidth = cHeight * Design.borderWidth / (Design.circleHeight + Design.borderWidth);
  var radius = cHeight * Design.circleHeight / (Design.circleHeight + Design.borderWidth) / 2;
  var x0 = indexBound.width / 2;
  var y0 = cHeight / 2;
  this.$indexBox.attr({
    r: radius + '',
    cx: x0,
    cy: y0
  }).addStyle({
    strokeWidth: borderWidth + ''
  });
  var textBoxHeight = textBound.height;
  this.$textBox.attr({
    x: x0 / 2,
    y: (cHeight - textBoxHeight) / 2,
    width: cWidth - x0 - 1,
    height: textBoxHeight,
    rx: textBoxHeight / 2,
    ry: textBoxHeight / 2
  });
  var arrowRadius = cHeight * Design.indexArrowRadius / (Design.circleHeight + Design.borderWidth);
  this.$arrow.attr({
    d: ['M', x0 + arrowRadius * Math.cos(Design.indexArrowStartAngle), y0 + arrowRadius * Math.sin(Design.indexArrowStartAngle), 'A', arrowRadius, arrowRadius, 0, 1, 1, x0 + arrowRadius * Math.cos(Design.indexArrowEndAngle), y0 + arrowRadius * Math.sin(Design.indexArrowEndAngle)].join(' ')
  }).addStyle('stroke-width', cHeight * Design.indexArrowStrokeWidth / (Design.circleHeight + Design.borderWidth));
};

CircleSectionLabel.tag = 'CircleSectionLabel'.toLowerCase();

CircleSectionLabel.render = function () {
  return _({
    class: 'as-circle-section-label',
    child: [{
      class: 'as-circle-section-label-background'
    }, '.as-circle-section-label-index', '.as-circle-section-label-text']
  });
};

CircleSectionLabel.property = {};
CircleSectionLabel.property.index = {
  set: function (value) {
    this._index = value;
    this.$index.clearChild().addChild(_({
      text: value + ''
    }));
  },
  get: function () {
    return this._index;
  }
};
CircleSectionLabel.property.text = {
  set: function (value) {
    this._text = value;
    this.$text.clearChild().addChild(_({
      text: value + ''
    }));
  },
  get: function () {
    return this._text;
  }
};

_ACore.default.install(CircleSectionLabel);

var _default = CircleSectionLabel;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tool/BlurTrigger.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tool/BlurTrigger.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var STATE_INIT = 0;
var STATE_ATTACHED = 1;
var STATE_RELEASED = 2;
var STATE_FIRED = 3;
var STATE_DESTROYED = 4;
/***
 *
 * @param {AElement[]|AElement} eltList
 * @param {"click"|"mousedown"} eventType
 * @param {function} callback
 * @param {number=} initAfter
 * @param {number=} fireDelay
 * @param {*[]=} args
 * @constructor
 */

function BlurTrigger(eltList, eventType, callback, initAfter, fireDelay, args) {
  this.args = args || [];
  this.callback = callback;
  this.eltTargets = eltList || [];
  this.initAfter = initAfter || 0;
  this.fireDelay = fireDelay || 0;
  this.state = STATE_INIT;
  this.eventType = eventType;
  this['ev_mouse'] = this.ev_mouse.bind(this);
  this['ev_blur'] = this.ev_blur.bind(this);

  if (this.initAfter > 0) {
    setTimeout(this._attach.bind(this));
  } else this._attach();
}

BlurTrigger.prototype._attach = function () {
  if (this.state !== STATE_INIT) return;
  document.addEventListener(this.eventType, this.ev_mouse);
  window.addEventListener('blur', this.ev_blur);
  this.state = STATE_ATTACHED;
};

BlurTrigger.prototype._fire = function () {
  if (this.state !== STATE_RELEASED) return;
  this.callback.apply(this, this.args);
  this.state = STATE_FIRED;
};

BlurTrigger.prototype._release = function () {
  if (this.state !== STATE_ATTACHED) return;
  document.removeEventListener(this.eventType, this.ev_mouse);
  window.removeEventListener('blur', this.ev_blur);
  this.state = STATE_RELEASED;
};

BlurTrigger.prototype.destroy = function () {
  if (this.state === 4) return;
  if (this.state === STATE_ATTACHED) this._release();
  this.state = STATE_DESTROYED;
};

BlurTrigger.prototype._prepareFire = function () {
  if (this.fireDelay > 0) {
    setTimeout(this._fire.bind(this), this.fireDelay);
  } else {
    this._fire();
  }
};

BlurTrigger.prototype.ev_mouse = function (event) {
  var hit = false;

  if (this.eltTargets instanceof Array) {
    hit = this.eltTargets.some(function (elt) {
      return (0, _EventEmitter.hitElement)(elt, event);
    });
  } else if (typeof hit === "function") {
    hit = this.eltTargets.call(this, event.target);
  }

  if (!hit) {
    this._release();

    this._prepareFire();
  }
};

BlurTrigger.prototype.ev_blur = function () {
  setTimeout(function () {
    if (this.state !== STATE_ATTACHED) return;
    var tagName = document.activeElement && document.activeElement.tagName || '';
    tagName = tagName.toLowerCase();

    if (tagName === 'iframe') {
      this._release();

      this._prepareFire();
    }
  }.bind(this), 0);
};

var _default = BlurTrigger;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Menu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Menu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MenuButton = MenuButton;
exports.Dropdown = Dropdown;
exports.Dropright = Dropright;
exports.VMenuLine = VMenuLine;
exports.VMenuItem = VMenuItem;
exports.VMenu = VMenu;
exports.HMenuItem = HMenuItem;
exports.HMenu = HMenu;
exports.VRootMenu = VRootMenu;

require("../css/menu.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _BlurTrigger = _interopRequireDefault(require("./tool/BlurTrigger"));




var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function MenuButton() {
  this.$text = $('.absol-vmenu-button-text', this);
  this.$key = $('.absol-vmenu-button-key', this);
  this.$arrow = $('.absol-vmenu-arrow', this);
  this.$iconCtn = $('.absol-vmenu-button-ext-icon-container', this);

  _OOP.default.drillProperty(this, this.$text, 'text', 'innerHTML');

  _OOP.default.drillProperty(this, this.$key, 'key', 'innerHTML');
}

MenuButton.tag = 'menubutton';

MenuButton.render = function () {
  return _({
    tag: 'button',
    class: 'absol-vmenu-button',
    child: [{
      class: 'absol-vmenu-button-ext-icon-container',
      child: 'img.absol-vmenu-button-icon'
    }, '.absol-vmenu-button-text', '.absol-vmenu-button-key', {
      class: 'absol-vmenu-arrow-container',
      child: 'span.absol-vmenu-arrow'
    }]
  });
};

MenuButton.property = {};
MenuButton.property.extendClasses = {
  set: function (value) {
    var self = this;
    this.extendClasses.forEach(function (className) {
      self.removeClass(className);
    });
    this._extendClass = [];
    if (!value) return;

    if (typeof value == 'string') {
      value = value.split(/\s+/).filter(function (c) {
        return c.length > 0;
      });
    }

    if (value instanceof Array) {
      this._extendClass = value;

      this._extendClass.forEach(function (className) {
        self.addClass(className);
      });
    } else {
      throw new Error('Invalid extendClasses');
    }
  },
  get: function () {
    return this._extendClass || [];
  }
};
MenuButton.property.icon = {
  set: function (value) {
    this.$iconCtn.clearChild();
    this._icon = value;

    if (value) {
      _(value).addTo(this.$iconCtn);
    }
  },
  get: function () {
    return this._icon;
  }
};
MenuButton.property.iconSrc = {
  set: function (value) {
    if (value) this.icon = {
      tag: 'img',
      props: {
        src: value
      }
    };else this.icon = value;
  },
  get: function () {
    return this.icon && this.icon.props && this.icon.props.src;
  }
};
MenuButton.property.extendStyle = {
  set: function (value) {
    this.removeStyle(this._extendStyle || {});
    this._extendStyle = value || {};
    this.addStyle(this.extendStyle);
  },
  get: function () {
    return this._extendStyle || {};
  }
};

_ACore.default.install(MenuButton);
/***
 *
 * @extends Follower
 * @constructor
 */


function Dropdown() {
  this.$container = $('.absol-dropdown-content', this);
  this.$container.followTarget = this;
  this.$container.anchor = [1, 2, 6, 5];
}

Dropdown.tag = 'dropdown';

Dropdown.render = function () {
  return _({
    class: ['absol-drop-hidden', 'absol-dropdown'],
    child: 'follower.absol-dropdown-content.as-bscroller'
  });
};

Dropdown.property = {};
Dropdown.property.show = {
  set: function (value) {
    if (value) {
      this.removeClass('absol-drop-hidden'); // ResizeSystem.update();

      if (this.$container.lastChild && this.$container.lastChild.$items) {
        this.$container.lastChild.$items.forEach(function (itemElt) {
          if (itemElt.autoFixParrentSize) {
            itemElt.autoFixParrentSize();
          }
        });
      }

      var aPst = this.findAvailablePosition();

      if (aPst.crampedHeight) {
        this.removeClass('overlap-top'); // this.$container.followTarget = null;?

        this.$container.addStyle({
          'max-height': aPst.maxHeight + 'px'
        });
        this.$container.refollow();
        this.$container.updatePosition();
        this.$container.addStyle('top', this.getBoundingClientRect().top + aPst.posTop + 'px');
      } else {
        this.$container.removeStyle('max-height').removeStyle('top');
        this.$container.refollow();
        this.$container.updatePosition();
      }
    } else {
      this.addClass('absol-drop-hidden');
    }
  },
  get: function () {
    return !this.hasClass('absol-drop-hidden');
  }
};

Dropdown.prototype.findAvailablePosition = function () {
  var outBound = _Dom.default.traceOutBoundingClientRect(document.body);

  var containerBound = this.$container.getBoundingClientRect();
  var bound = this.getBoundingClientRect();
  var distTop = bound.top - outBound.top;
  var distLeft = bound.left - outBound.left;
  var distRight = -bound.right + outBound.right;
  var distBottom = -bound.bottom + outBound.bottom;
  var result = {};
  if (distLeft >= containerBound.width) result.left = true;
  if (distTop >= containerBound.height) result.top = true;
  if (distRight >= containerBound.width) result.right = true;
  if (distBottom >= containerBound.height) result.bottom = true;
  if (distRight + bound.width >= containerBound.width) result.overlapRight = true;
  if (distLeft + bound.width >= containerBound.width) result.overlapLeft = true;
  if (distBottom + bound.height >= containerBound.height) result.overlapBottom = true;
  if (distTop + bound.height >= containerBound.height) result.overlapTop = true;

  if (!result.overlapTop && !result.overlapBottom) {
    result.crampedHeight = true;
    result.maxHeight = outBound.height - 20;
    result.posTop = distBottom - Math.min(containerBound.height, result.maxHeight) + bound.height - 10;
  }

  return result;
};

Dropdown.prototype.addChild = function (child) {
  if (child instanceof Array) {
    for (var i = 0; i < child.length; ++i) this.addChild(child[i]);
  } else {
    if (!this.$trigger) {
      this.super(child);
      this.$trigger = child;
    } else {
      this.$container.addChild(child);
    }
  }
};

Dropdown.prototype.clearChild = function () {
  if (this.$trigger) {
    this.$trigger.selfRemove();
    this.$trigger = undefined;
  }

  this.$container.clearChild();
};

Dropdown.prototype.init = function (props) {
  props = props || {};
  Object.assign(this, props);
};

function Dropright() {
  this.$container = $('.absol-dropright-content', this);
  this.$container.followTarget = this;
  this.$container.anchor = [0, 3, 7, 4];
}

Dropright.tag = 'dropright';

Dropright.render = function () {
  return _({
    class: ['absol-drop-hidden', 'absol-dropright'],
    child: 'follower.absol-dropright-content.as-bscroller',
    data: {
      $trigger: undefined,
      $content: undefined,
      _isShow: false
    }
  });
};

Object.assign(Dropright.prototype, Dropdown.prototype); //is the same

Dropright.prototype.addChild = Dropdown.prototype.addChild;
Dropright.prototype.clearChild = Dropdown.prototype.clearChild;
Dropright.property = Object.assign({}, Dropdown.property);

function VMenuLine() {
  return _('<div class="absol-vmenu-line"><div></div></div>');
}

VMenuLine.tag = 'VMenuLine'.toLowerCase();

function VMenuItem() {
  var thisVM = this;
  this.sync = new Promise(function (rs) {
    _('attachhook').addTo(thisVM).on('error', function () {
      this.remove();
      rs();
    });
  });
  this.$dropper = $('dropright', this);
  this.$vmenu = $('vmenu', this);
  this.$button = $('menubutton', this);
  this.$text = thisVM.$button.$text;
  this.$key = thisVM.$button.$key;
  this.$arrow = thisVM.$button.$arrow;
  this.$iconCtn = thisVM.$button.$iconCtn;

  _OOP.default.drillProperty(this, this.$button, ['text', 'extendClasses', 'extendStyle', 'key', 'icon', 'iconSrc']);

  _OOP.default.drillProperty(this, this.$vmenu, ['activeTab']);

  this.eventHandler = _OOP.default.bindFunctions(this, VMenuItem.eventHandler);
  this.$vmenu.on('press', this.eventHandler.pressItem, true);
  this.$button.on('click', this.eventHandler.clickButton, true);
  this.$button.on('mouseenter', this.eventHandler.enterButton, true);
  this._textMarginRight = 0;
}

VMenuItem.tag = 'VMenuItem'.toLowerCase();

VMenuItem.render = function () {
  return _({
    tag: 'dropright',
    extendEvent: ['press', 'enter'],
    child: ['menubutton', {
      tag: 'vmenu'
    }]
  });
};

VMenuItem.prototype.init = function (props) {
  Object.assign(this, props || {});
  this.sync = this.sync.then(this.autoFixParrentSize.bind(this));
};

VMenuItem.prototype.autoFixParrentSize = function () {
  var parentWidth = this.$dropper.getBoundingClientRect().width; // dropper is fixed parent content size

  if (!parentWidth) return;
  var buttonWidth = this.$button.getBoundingClientRect().width;
  var fontSize = this.$text.getFontSize();
  this._textMarginRight = parentWidth - buttonWidth + this._textMarginRight;
  this.$text.addStyle('margin-right', this._textMarginRight / fontSize + 'em');
};

VMenuItem.eventHandler = {};

VMenuItem.eventHandler.enterButton = function (event) {
  event.menuItem = this;

  var newEvent = _EventEmitter.default.copyEvent(event);

  this.emit('enter', newEvent, this);
};

VMenuItem.eventHandler.pressItem = function (event) {
  var newEvent = _EventEmitter.default.copyEvent(event, {
    target: this
  });

  this.emit('press', newEvent, this);
};

VMenuItem.eventHandler.clickButton = function (event) {
  event.menuDontHide = this.items && this.items.length > 0;
  event.menuItem = this;
  event.vmenuItem = this;

  var newEvent = _EventEmitter.default.copyEvent(event, {
    target: this
  });

  this.emit('press', newEvent, this);
};

VMenuItem.property = {};
VMenuItem.property.items = {
  set: function (items) {
    items = items || [];

    if (items.length > 0) {
      this.$arrow.addClass(['mdi', 'mdi-chevron-right']);
    } else {
      this.$arrow.removeClass(['mdi', 'mdi-chevron-right']);
    }

    this.$vmenu.items = items;
  },
  get: function () {
    return this.$vmenu.items;
  }
};
VMenuItem.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('absol-menu-item-disabled');
    } else {
      this.removeClass('absol-menu-item-disabled');
    }
  },
  get: function () {
    return this.hasClass('absol-menu-item-disabled');
  }
};
VMenuItem.property.hidden = {
  set: function (value) {
    if (value) {
      this.addClass('absol-menu-item-hidden');
    } else {
      this.removeClass('absol-menu-item-hidden');
    }
  },
  get: function () {
    return this.hasClass('absol-menu-item-hidden');
  }
};

function VMenu() {
  var thisVM = this;
  this.sync = new Promise(function (rs) {
    _('attachhook').addTo(thisVM).on('error', function () {
      this.remove();
      rs();
    });
  });
}

VMenu.tag = 'vmenu';

VMenu.render = function () {
  return _({
    class: 'absol-vmenu',
    extendEvent: 'press'
  });
};

VMenu.property = {};
VMenu.property.activeTab = {
  set: function (tabIndex) {
    this._activeTab = tabIndex;

    if (this.$items) {
      for (var i = 0; i < this.$items.length; ++i) {
        var item = this.$items[i];
        item.show = i == tabIndex && !item.disabled;
        item.activeTab = -1;

        if (i == tabIndex && !item.disabled) {
          item.$button && item.items && item.items.length > 0 && item.$button.addClass('absol-vmenu-button-hover');
        } else {
          item.$button && item.$button.removeClass('absol-vmenu-button-hover');
        }
      }
    }
  },
  get: function () {
    return this._activeTab;
  }
};
VMenu.property.extendStyle = {
  set: function (value) {
    this.removeStyle(this._extendStyle || {});
    this._extendStyle = value || {};
    this.addStyle(this.extendStyle);
  },
  get: function () {
    return this._extendStyle || {};
  }
};
VMenu.property.extendClasses = {
  set: function (value) {
    var self = this;
    this.extendClasses.forEach(function (className) {
      self.removeClass(className);
    });
    this._extendClass = [];
    if (!value) return;

    if (typeof value == 'string') {
      value = value.split(/\s+/).filter(function (c) {
        return c.length > 0;
      });
    }

    if (value instanceof Array) {
      this._extendClass = value;

      this._extendClass.forEach(function (className) {
        self.addClass(className);
      });
    } else {
      throw new Error('Invalid extendClasses');
    }
  },
  get: function () {
    return this._extendClass || [];
  }
};
VMenu.eventHandler = {};

VMenu.eventHandler.enterItem = function (event) {
  var tabIndex = event.menuItem._tabIndex;
  this.activeTab = tabIndex;
};

VMenu.eventHandler.pressItem = function (event) {
  this.emit('press', _EventEmitter.default.copyEvent(event, {
    target: this
  }), this);
};

VMenu.property.items = {
  set: function (items) {
    this._childFromItems(items || []);
  },
  get: function () {
    return this.$items;
  }
};

VMenu.prototype.init = function (props) {
  Object.assign(this, props || {});
};

VMenu.prototype._childFromItems = function (items) {
  this.clearChild();
  this.$items = items.map(function (item, index) {
    var itemElt;

    if (typeof item === 'string' && (item.substr(0, 1) === '-' || item.substr(0, 1) === '=')) {
      itemElt = _('vmenuline');
    } else if ((0, _Dom.isDomNode)(item)) {
      itemElt = item;
    } else if (item.child || item.class || item.tag || item.style || typeof item === 'string') {
      itemElt = _(item);
    } else {
      itemElt = _({
        tag: 'vmenuitem',
        props: Object.assign({
          _tabIndex: index
        }, item),
        on: {
          enter: {
            callback: this.eventHandler.enterItem,
            cap: true
          },
          press: {
            callback: this.eventHandler.pressItem,
            cap: true
          }
        }
      });
    }

    this.addChild(itemElt);
    return itemElt;
  }.bind(this)); //todo
};

function HMenuItem() {
  this.blurTrigger = null;
  this.$vmenu = $('vmenu', this);
  this.$dropDown = this;
  this.$button = $('button.absol-hmenu-button', this);

  _OOP.default.drillProperty(this, this.$button, 'text', 'innerHTML');

  _OOP.default.drillProperty(this, this.$vmenu, 'items');

  _OOP.default.drillProperty(this, this.$vmenu, 'activeTab');

  this.$button.on('click', this.eventHandler.clickButton);
  this.$button.on('mouseenter', this.eventHandler.enterButton, true);
  this.$vmenu.on('press', this.eventHandler.pressItem, true); //property show not need because dropdown is itself

  return this;
}

HMenuItem.tag = 'HMenuItem'.toLowerCase();

HMenuItem.render = function () {
  return _({
    tag: 'dropdown',
    extendEvent: ['press', 'enter'],
    child: ['button.absol-hmenu-button', 'vmenu']
  });
};

HMenuItem.eventHandler = {};

HMenuItem.eventHandler.clickButton = function (event) {
  event.menuItem = this;
  event.hmenuItem = this;
  this.emit('press', _EventEmitter.default.copyEvent(event, {
    target: this
  }), this);
};

HMenuItem.eventHandler.enterButton = function (event) {
  event.menuItem = this;
  this.emit('enter', _EventEmitter.default.copyEvent(event, {
    target: this
  }), this);
};

HMenuItem.eventHandler.pressItem = function (event) {
  this.emit('press', _EventEmitter.default.copyEvent(event, {
    target: this
  }), this);
};

HMenuItem.property = {};
HMenuItem.property.disabled = VMenuItem.property.disabled;
HMenuItem.property.hidden = VMenuItem.property.hidden;

HMenuItem.prototype.init = function (props) {
  props = props || {};
  Object.assign(this, props);
};
/***
 * @extends AElement
 * @constructor
 */


function HMenu() {}

HMenu.tag = 'hmenu';

HMenu.render = function () {
  return _({
    class: 'absol-hmenu',
    extendEvent: ['press', 'enter', 'activetab', 'cancel']
  });
};

HMenu.eventHandler = {};

HMenu.eventHandler.pressItem = function (event) {
  /**
   * this.activeTab can be undefined
   * undefine >= 0 => false
   * undefine < 0 => false
   */
  if (event.menuItem.items && event.menuItem.items.length > 0 && !(this.activeTab >= 0)) {
    this.activeTab = event.menuItem._tabIndex;
  } else {
    event.isLeaf = !event.menuItem.items || !event.menuItem.items.length;
    this.emit('press', event, this);
  }
};

HMenu.eventHandler.enterItem = function (event) {
  if (this.activeTab >= 0) {
    this.activeTab = event.menuItem._tabIndex;
  }
};

HMenu.eventHandler.clickSomewhere = function (event) {
  // if (EventEmitter.hitElement(this, event)) return;
  this.activeTab = -1; // window.removeEventListener('blur', this.eventHandler.clickSomewhere);
};

HMenu.prototype._childFromItems = function (items) {
  this.clearChild();
  this.$items = items.map(function (item, index) {
    var res = _({
      tag: 'hmenuitem',
      props: Object.assign({
        _tabIndex: index
      }, item),
      on: {
        press: {
          callback: this.eventHandler.pressItem,
          cap: true
        },
        enter: {
          callback: this.eventHandler.enterItem,
          cap: true
        }
      }
    });

    this.addChild(res);
    return res;
  }.bind(this));
};

HMenu.prototype.init = function (props) {
  Object.assign(this, props || {});
};

HMenu.property = {};
HMenu.property.items = {
  set: function (items) {
    this._childFromItems(items || []);
  },
  get: function () {
    return this.$items;
  }
};
HMenu.property.activeTab = {
  /***
   * @this HMenu
   * @param tabIndex
   */
  set: function (tabIndex) {
    var lastValue = this._activeTab;
    this._activeTab = tabIndex;

    for (var i = 0; i < this.$items.length; ++i) {
      var item = this.$items[i];
      item.show = i == tabIndex && !item.disabled;
      item.activeTab = -1;

      if (i == tabIndex && !item.disabled) {
        item.$button && item.items && item.items.length > 0 && item.$button.addClass('absol-hmenu-button-hover');
      } else {
        item.$button && item.$button.removeClass('absol-hmenu-button-hover');
      }
    }

    if (!(lastValue >= 0) && this._activeTab >= 0) {
      if (this.blurTrigger) {
        this.blurTrigger.destroy();
      }

      this.blurTrigger = new _BlurTrigger.default([this], "click", this.eventHandler.clickSomewhere, 100, 10);
    } else if (lastValue >= 0 && !(this._activeTab >= 0)) {
      if (this.blurTrigger) {
        this.blurTrigger.destroy();
        this.blurTrigger = null;
      }
    }

    if (lastValue >= 0) {
      if (tabIndex >= 0 && tabIndex != lastValue) {
        this.emit('activetab', {
          type: 'activetab',
          tabIndex: tabIndex,
          target: this
        }, this);
      } else if (!(tabIndex >= 0)) {
        this.emit('cancel', {
          type: 'cancel',
          lastActiveIndex: lastValue,
          target: this
        }, this);
      }
    } else {
      if (tabIndex >= 0) {
        this.emit('activetab', {
          type: 'activetab',
          tabIndex: tabIndex,
          target: this
        }, this);
      }
    }
  },
  get: function () {
    return this._activeTab;
  }
};
/***
 * @extends AElement
 * @constructor
 */

function VRootMenu() {
  this._items = [];
  this.items = [];
}

VRootMenu.tag = 'VRootMenu'.toLowerCase();

VRootMenu.render = function () {
  return _({
    class: ['as-v-root-menu'],
    extendEvent: ['press', 'enter', 'activetab', 'cancel']
  });
};

VRootMenu.prototype._childFromItems = function (items) {
  var thisM = this;
  this.clearChild();
  this.$items = items.map(function (item, i) {
    var itemElt;

    if (typeof item === 'string' && (item.substr(0, 1) === '-' || item.substr(0, 1) === '=')) {
      itemElt = _('vmenuline');
    } else if ((0, _Dom.isDomNode)(item)) {
      itemElt = item;
    } else if (item.child || item.class || item.tag || item.style || typeof item === 'string') {
      itemElt = _(item);
    } else {
      itemElt = _({
        tag: 'vmenuitem',
        props: item,
        on: {
          enter: thisM.eventHandler.enterItem,
          press: thisM.eventHandler.pressItem
        }
      });
    }

    itemElt._tabIndex = i;
    thisM.addChild(itemElt);
    return itemElt;
  });
};

VRootMenu.property = Object.assign({}, HMenu.property);
VRootMenu.eventHandler = Object.assign({}, HMenu.eventHandler);

_ACore.default.install([HMenu, VMenuItem, VMenu, Dropright, VMenuLine, Dropdown, HMenuItem, VRootMenu]);
};

moduleFactories["node_modules/absol-acomp/js/ContextMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ContextMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ContextCaptor = ContextCaptor;
exports.default = void 0;

require("../css/contextmenu.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

require("./Menu");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _BoardTable = _interopRequireDefault(require("./BoardTable"));

var _utils = require("./utils");

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var supportContextEvent = false;
var isMobile = _BrowserDetector.default.isMobile;
/**
 * @extends AElement
 * @constructor
 */

function ContextCaptor() {
  this.attachedElt = null;
  this.$textarea = $('textarea', this).attr('readonly', 'true').on('contextmenu', this.eventHandler.contextmenu, true);
  this._ss = 0;
  this._isTouch = false;
  /**
   this._target = null;
   * @type {Vec2}
   */

  this._posStart = null;
  /**
   * @type {Vec2}
   */

  this._posCurrent = null;
  this._touchId = -100;
  this._longPressTimeout = -1;
  this._removeTimeout = -1;
  this._fireContextMenuTimeout = -1;
  this.$target = null;
  this._pointerSession = 0;
  this._lastContextSession = 0;
  this.mousedownEvent = null;
  this.sync = Promise.resolve();
}

;

ContextCaptor.prototype.attachTo = function (elt) {
  if (this.attachedElt) {
    this.attachedElt.removeEventListener('mousedown', this.eventHandler.mousedown);
    this.attachedElt.removeEventListener('touchstart', this.eventHandler.mousedown);
    this.attachedElt = null;
  }

  this.attachedElt = elt;

  if (this.attachedElt) {
    this.attachedElt.addEventListener('mousedown', this.eventHandler.mousedown);
    this.attachedElt.addEventListener('touchstart', this.eventHandler.mousedown);
  }

  return this;
};

ContextCaptor.tag = 'ContextCaptor'.toLowerCase();

ContextCaptor.render = function () {
  return _({
    class: ['absol-context-menu-anchor'],
    extendEvent: 'requestcontextmenu',
    child: ['textarea']
  });
};

ContextCaptor.prototype.showContextMenu = function (x, y, props, onSelectItem) {
  var self = this;

  var anchor = _('.as-context-menu-ctn.absol-context-menu-anchor' + (isMobile ? '.as-anchor-modal' : '')).addTo(document.body);

  var finish = function (event) {
    document.removeEventListener('click', finish);
    document.removeEventListener('touchcancel', finish);
    document.removeEventListener('touchend', finish);
    document.removeEventListener('contextmenu', finish);
    anchor.off('click', touchModal);
    self.off('requestcontextmenu', finish);
    setTimeout(function () {
      anchor.selfRemove(); //
    }, 10);
  };

  function touchModal(event) {
    if (event.target.classList && event.target.classList.contains('as-anchor-modal')) {
      finish(event);
    }
  }

  var vmenu = _({
    tag: 'vmenu',
    props: props,
    on: {
      press: onSelectItem || function () {}
    }
  }).addTo(anchor);

  setTimeout(function () {
    if (!isMobile) {
      var screenSize = _Dom.default.getScreenSize();

      var menuBound = vmenu.getBoundingClientRect();

      if (x + menuBound.width > screenSize.width - 17) {
        x -= menuBound.width;
      }

      if (y + menuBound.height > screenSize.height - 17) {
        y -= menuBound.height;
      }

      anchor.addStyle({
        left: x + 'px',
        top: y + 'px'
      });
    }

    anchor.addClass('absol-active');
  }, 30);
  setTimeout(function () {
    document.addEventListener('click', finish);
    document.addEventListener('contextmenu', finish);
    self.on('requestcontextmenu', finish);
    anchor.on('click', touchModal);
  }, 10);
};

ContextCaptor.prototype._checkNeedHandle = function (target) {
  var current = target;
  var needHandle = false;

  while (current && !needHandle && !current.classList.contains('as-system-context-menu')) {
    if (current.isSupportedEvent && current.isSupportedEvent('contextmenu')) needHandle = true;
    current = current.parentElement;
  }

  return needHandle;
};

ContextCaptor.prototype._fireContextMenuEvent = function () {
  if (this._lastContextSession >= this._pointerSession) return false; // prevent fire multi-times in a pointer session

  var showed = false;
  this._lastContextSession = this._pointerSession;
  var baseEventData = {
    clientX: this._posCurrent.x,
    clientY: this._posCurrent.y,
    target: this.$target
  };
  this.emit('requestcontextmenu', baseEventData, this);
  var self = this;
  var propagation = true;
  var localEvent = Object.assign({
    clientX: this._posCurrent.x,
    clientY: this._posCurrent.y,
    target: this.$target,
    showContextMenu: function (props, onSelectItem) {
      showed = true;
      self.sync = self.sync.then(function () {
        return new Promise(function (rs) {
          setTimeout(function () {
            self.showContextMenu(self._posCurrent.x, self._posCurrent.y, props, onSelectItem);
            rs();
          }, 30);
        });
      });
    },
    stopPropagation: function () {
      propagation = false;
    }
  }, baseEventData);
  Object.defineProperty(localEvent, 'selectedText', {
    get: function () {
      return (0, _utils.getSelectionText)();
    }
  });
  var current = this.$target;

  while (current && propagation) {
    if (current.isSupportedEvent && current.isSupportedEvent('contextmenu')) {
      current.emit('contextmenu', localEvent, current, this);
    }

    current = current.parentElement;
  }

  return showed;
};
/**
 * @type {ContextCaptor}
 */


ContextCaptor.eventHandler = {};

ContextCaptor.eventHandler.mousedown = function (event) {
  if (this._touchId != -100) return;
  this._pointerSession++;
  var target;
  var isTouch;
  var touchId;
  var posCurrent;
  var pointer;

  if (event.type == 'touchstart') {
    isTouch = true;
    pointer = event.changedTouches[0];
    touchId = pointer.identifier;
  } else {
    isTouch = false;
    touchId = -1;
    pointer = event;
  }

  target = pointer.target;
  posCurrent = new _Vec.default(pointer.clientX, pointer.clientY);

  if (isTouch) {
    var dragzone = _BoardTable.default.prototype._findDragZone(target);

    if (dragzone) return;
    var thisCT = this;
    this._longPressTimeout = setTimeout(function () {
      if (!thisCT._checkNeedHandle(target)) return;

      if (thisCT._removeTimeout > 0) {
        clearTimeout(thisCT._removeTimeout);
        thisCT._removeTimeout = -1;
      }

      thisCT._ss++;
      thisCT.moveTo(thisCT._posCurrent);
      thisCT.active(true);
      thisCT._longPressTimeout = -1;

      if (thisCT._fireContextMenuTimeout >= 0) {
        clearTimeout(thisCT._fireContextMenuTimeout);
      } // show if device not support contextmenu event (after 700ms)


      thisCT._fireContextMenuTimeout = setTimeout(function () {
        if (!supportContextEvent) {
          thisCT._fireContextMenuEvent();
        }
      }, 300);
    }, 400);
    this.$target = target;
    this._isTouch = isTouch;
    this._touchId = touchId;
    this._posCurrent = posCurrent;
    this._posStart = posCurrent;
    document.addEventListener('touchmove', thisCT.eventHandler.mousemove);
    document.addEventListener('touchend', thisCT.eventHandler.mousefinish);
    document.addEventListener('touchcancel', thisCT.eventHandler.mousefinish);
  } else {
    if (_EventEmitter.default.isMouseRight(event) && this._checkNeedHandle(target)) {
      if (this._removeTimeout > 0) {
        clearTimeout(this._removeTimeout);
        this._removeTimeout = -1;
      }

      this.$target = target;
      this._isTouch = isTouch;
      this._posCurrent = posCurrent;
      this._posStart = posCurrent;
      this._touchId = touchId;
      this._ss++;
      this.moveTo(this._posCurrent);
      this.active(true);
      document.addEventListener('mousemove', this.eventHandler.mousemove);
      document.addEventListener('mouseup', this.eventHandler.mousefinish);
      document.addEventListener('mouseleave', this.eventHandler.mousefinish);
    }
  }
};
/**
 * @param {Vec2} pos
 */


ContextCaptor.prototype.moveTo = function (pos) {
  this.addStyle({
    left: pos.x - 80 + 'px',
    top: pos.y - 80 + 'px'
  });
};

ContextCaptor.prototype.active = function (flag) {
  if (flag) this.addClass('absol-active');else this.removeClass('absol-active');
};

ContextCaptor.eventHandler.mousemove = function (event) {
  var isTouch = this._isTouch;
  var touchId;
  var pointer;
  var posCurrent;

  if (isTouch) {
    pointer = event.changedTouches[0];
    touchId = pointer.identifier;
  } else {
    isTouch = false;
    touchId = -1;
    pointer = event;
  }

  if (touchId != this._touchId) return;
  posCurrent = new _Vec.default(pointer.clientX, pointer.clientY);
  this._posCurrent = posCurrent;

  if (isTouch) {
    if (this._posStart.sub(posCurrent).abs() > 10) this.eventHandler.mousefinish(event);
  }

  this.moveTo(posCurrent);
};

ContextCaptor.eventHandler.mousefinish = function (event) {
  var isTouch = this._isTouch;
  var touchId;
  var pointer;

  if (isTouch) {
    pointer = event.changedTouches[0];
    touchId = pointer.identifier;
  } else {
    isTouch = false;
    touchId = -1;
    pointer = event;
  }

  if (touchId != this._touchId) return;

  if (isTouch) {
    document.removeEventListener('touchmove', this.eventHandler.mousemove);
    document.removeEventListener('touchend', this.eventHandler.mousefinish);
    document.removeEventListener('touchcancel', this.eventHandler.mousefinish);

    if (this._longPressTimeout > 0) {
      clearTimeout(this._longPressTimeout);
      this._longPressTimeout = -1;
    }
  } else {
    document.removeEventListener('mousemove', this.eventHandler.mousemove);
    document.removeEventListener('mouseup', this.eventHandler.mousefinish);
    document.removeEventListener('mouseleave', this.eventHandler.mousefinish);
  }

  this._touchId = -100;

  if (this._fireContextMenuTimeout >= 0) {
    clearTimeout(this._fireContextMenuTimeout);
  }

  var thisCT = this;
  this._removeTimeout = setTimeout(function () {
    thisCT.active(false);
    thisCT._removeTimeout = -1;
  }, 1);
};

ContextCaptor.eventHandler.contextmenu = function (event) {
  supportContextEvent = true;
  event.preventDefault();

  this._fireContextMenuEvent();
};

ContextCaptor.auto = function () {
  if (ContextCaptor.$elt) return;
  ContextCaptor.$elt = _('contextcaptor');

  _Dom.default.documentReady.then(function () {
    ContextCaptor.$elt.addTo(document.body);
    ContextCaptor.$elt.attachTo(document.body);
  });
};

_ACore.default.install(ContextCaptor);

var _default = ContextCaptor;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DateInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DateInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/dateinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _datetime = require("absol/src/Time/datetime");

var _ChromeCalendar = _interopRequireDefault(require("./ChromeCalendar"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/**
 * @extends AElement
 * @constructor
 */

function DateInput() {
  this._lastValue = null;
  this._value = null;
  this._format = 'dd/mm/yyyy';
  this.$input = $('input', this).on('mouseup', this.eventHandler.mouseup).on('keydown', this.eventHandler.keydown).on('paste', this.eventHandler.paste).on('cut', this.eventHandler.cut).on('focus', this.eventHandler.focus);
  this._minLimitDate = new Date(1890, 0, 1, 0, 0, 0, 0);
  this._maxLimitDate = new Date(2090, 0, 1, 0, 0, 0, 0);
  this.$calendarBtn = $('.as-date-input-icon-ctn', this).on('mousedown', this.eventHandler.mousedownCalendarBtn);
  this._calendarHolder = _ChromeCalendar.default.showWhenClick(this.$calendarBtn, {
    minLimitDate: this._minLimitDate,
    maxLimitDate: this._maxLimitDate,
    selectedDates: [new Date()]
  }, 'auto', this.eventHandler.calendarSelect);
  this._calendarHolder.element = this;
  this._formater = DateInput.formaters[this._format];

  _OOP.default.drillProperty(this, this._calendarHolder.calendarProps, ['minLimitDate', 'maxLimitDate']);

  this.value = null;
}

DateInput.formaters = {
  'dd/mm/yyyy': {
    separator: '/',
    nan: ['dd', 'mm', 'yyyy'],
    dayIdx: 0,
    monthIdx: 1,
    yearIdx: 2
  },
  'dd-mm-yyyy': {
    separator: '-',
    nan: ['dd', 'mm', 'yyyy'],
    dayIdx: 0,
    monthIdx: 1,
    yearIdx: 2
  },
  'dd.mm.yyyy': {
    separator: '.',
    nan: ['dd', 'mm', 'yyyy'],
    dayIdx: 0,
    monthIdx: 1,
    yearIdx: 2
  },
  'yyyy/mm/dd': {
    separator: '/',
    nan: ['yyyy', 'mm', 'dd'],
    dayIdx: 2,
    monthIdx: 1,
    yearIdx: 0
  },
  'yyyy-mm-dd': {
    separator: '-',
    nan: ['yyyy', 'mm', 'dd'],
    dayIdx: 2,
    monthIdx: 1,
    yearIdx: 0
  },
  'mm/dd/yyyy': {
    separator: '/',
    nan: ['mm', 'dd', 'yyyy'],
    dayIdx: 1,
    monthIdx: 0,
    yearIdx: 2
  }
};
DateInput.tag = 'dateinput';

DateInput.render = function () {
  //only support dd/mm/yyyy
  return _({
    class: 'as-date-input',
    extendEvent: ['change'],
    child: [{
      tag: 'input',
      props: {
        value: '__/__/____'
      }
    }, {
      tag: 'button',
      class: 'as-date-input-icon-ctn',
      child: 'span.mdi.mdi-calendar'
    }]
  });
};

DateInput.prototype._autoSelect = function () {
  var slEnd = this.$input.selectionEnd;
  var slStart = this.$input.selectionStart;
  var texts = this.$input.value.split(this._formater.separator);
  var lTexts = texts.reduce(function (ac, cr) {
    ac.push(ac[ac.length - 1] + cr.length + 1);
    return ac;
  }, [0]);

  function indexOf(offset) {
    var l;

    for (var i = 0; i < lTexts.length; ++i) {
      l = lTexts[i];
      if (l > offset) return i;
    }

    return texts.length;
  }

  var i0 = indexOf(slStart);
  var i1 = indexOf(slEnd);

  if (i0 == i1) {
    this.$input.selectionStart = lTexts[i0 - 1];
    this.$input.selectionEnd = lTexts[i0] - 1;
  } else {
    this.$input.selectionStart = 0;
    this.$input.selectionEnd = lTexts[lTexts.length - 1];
  }
};

DateInput.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change',
    target: this,
    value: this._value
  }, this);
};

DateInput.prototype._countSeparator = function (text) {
  return text.replace(new RegExp('[^\\' + this._formater.separator + ']', 'g'), '').length;
};

DateInput.prototype._cleanCharacter = function (text) {
  return text.replace(new RegExp('[^0-9\\' + this._formater.separator + ']', 'g'), '');
};

DateInput.prototype._splitBySeparator = function (text) {
  return text.split(this._formater.separator);
};

DateInput.prototype._onlySeparator = function (text) {
  return text.replace(new RegExp('[^\\' + this._formater.separator + ']', 'g'), '');
};

DateInput.prototype._isAcceptKey = function (key) {
  return !!key.match(new RegExp('[0-9\\' + this._formater.separator + ']', 'i'));
};
/**
 * @type {DateInput}
 */


DateInput.eventHandler = {};

DateInput.eventHandler.paste = function (event) {
  var paste = (event.clipboardData || window.clipboardData).getData('text');
  event.preventDefault();
  paste = this._cleanCharacter(paste);
  var slEnd = this.$input.selectionEnd;
  var slStart = this.$input.selectionStart;
  var sStart = Math.min(slStart, slEnd);
  var sEnd = Math.max(slEnd, slStart);
  var value = this.$input.value;

  var slashPasteCount = this._countSeparator(paste);

  var slashSelectedCount = this._countSeparator(value.substr(sStart, sEnd - sStart));

  if (slashPasteCount < 2) {
    if (slashPasteCount > slashSelectedCount) {
      paste = this._splitBySeparator(paste).slice(0, slashSelectedCount + 1).join(this._formater.separator);
    } else if (slashPasteCount < slashSelectedCount) {
      paste += this._formater.separator.repeat(slashSelectedCount - slashPasteCount);
    }

    slStart = (value.substr(0, sStart) + paste).length;
    slEnd = slStart;
    value = value.substr(0, sStart) + paste + value.substr(sEnd);
  } else {
    value = this._splitBySeparator(paste).slice(0, 3).join(this._formater.separator);
    slStart = value.length;
    slEnd = value.length;
  }

  this.$input.value = value;
  this.$input.selectionStart = slStart;
  this.$input.selectionEnd = slEnd;
};

DateInput.eventHandler.cut = function (event) {
  event.preventDefault();
  var slEnd = this.$input.selectionEnd;
  var slStart = this.$input.selectionStart;
  var sStart = Math.min(slStart, slEnd);
  var sEnd = Math.max(slEnd, slStart);
  var value = this.$input.value;
  this.$input.value = value.substr(0, sStart) + this._onlySeparator(value.substr(sStart, sEnd - sStart)) + value.substr(sEnd);
  this.$input.selectionStart = slStart;
  this.$input.selectionEnd = slStart;
};

DateInput.eventHandler.mouseup = function () {
  setTimeout(this._autoSelect.bind(this), 1);
};

DateInput.eventHandler.focus = function () {
  this.$input.on('blur', this.eventHandler.blur);
};

DateInput.eventHandler.blur = function () {
  var thisIp = this;
  this.$input.off('blur', this.eventHandler.blur);
  var value = this.$input.value;

  var slashValueCount = this._countSeparator(value).length;

  for (var i = slashValueCount; i < 2; ++i) value += this._formater.separator;

  var texts = value.split(this._formater.separator).slice(0, 3);
  var day = parseInt(texts[this._formater.dayIdx]);
  var month = parseInt(texts[this._formater.monthIdx]);
  var year = parseInt(texts[this._formater.yearIdx]);
  if (!isNaN(year)) year = Math.min(2090, Math.max(year, 1890));
  if (!isNaN(month)) month = Math.max(1, Math.min(12, month));

  if (!isNaN(day)) {
    day = Math.max(1, Math.min(31, day));

    if (!isNaN(month)) {
      day = Math.min((0, _datetime.daysInMonth)(2000, month), day);
      if (!isNaN(year)) day = Math.min((0, _datetime.daysInMonth)(year, month), day);
    }
  }

  if (!isNaN(year) && !isNaN(month) && !isNaN(day)) {
    var dateValue = new Date(year, month - 1, day, 0, 0, 0, 0);

    if (this._lastValue == null || (0, _datetime.compareDate)(dateValue, this._lastValue) != 0) {
      this.value = dateValue;
      this.notifyChange();
    }
  } else {
    var values = this._formater.nan.slice();

    values[this._formater.dayIdx] = day;
    values[this._formater.monthIdx] = month;
    values[this._formater.yearIdx] = year;
    this.$input.value = values.map(function (e, i) {
      if (isNaN(e)) return thisIp._formater.nan[i];
      e = e + '';

      while (e.length < thisIp._formater.nan[i].length) e = '0' + e;

      return e;
    }).join(this._formater.separator);

    if (this._lastValue != null) {
      this._value = null;
      this.notifyChange();
    }
  }
};

DateInput.eventHandler.calendarSelect = function (value) {
  this.value = value;
  this.notifyChange();
};

DateInput.eventHandler.keydown = function (event) {
  var slEnd = this.$input.selectionEnd;
  var slStart = this.$input.selectionStart;
  var value = this.$input.value;
  var sStart = Math.min(slStart, slEnd);
  var sEnd = Math.max(slEnd, slStart);
  var selectedValue = value.substr(sStart, sEnd - sStart);

  var slashValueCount = this._countSeparator(value);

  var slashSelectedCount = this._countSeparator(selectedValue);

  var texts = this._splitBySeparator(value);

  var lTexts = texts.reduce(function (ac, cr) {
    ac.push(ac[ac.length - 1] + cr.length + 1);
    return ac;
  }, [0]);

  function indexOf(offset) {
    var l;

    for (var i = 0; i < lTexts.length; ++i) {
      l = lTexts[i];
      if (l > offset) return i;
    }

    return texts.length;
  }

  var i0 = indexOf(slStart);
  var i1 = indexOf(slEnd);

  if (event.key == 'Enter') {
    event.preventDefault();
    this.$input.blur();
  } else if (event.key == 'Meta') {
    event.preventDefault();
  } else if (event.key == 'Backspace') {
    if (slStart == slEnd) {
      if (slStart > 0) {
        if (value.charAt(slStart - 1) == this._formater.separator) {
          event.preventDefault();
          this.$input.value = value;
          this.$input.selectionStart = slStart - 1;
          this.$input.selectionEnd = slStart - 1;
        }
      }
    } else if (i0 != i1) {
      event.preventDefault();
      this.$input.value = value.substr(0, sStart) + this._onlySeparator(selectedValue) + value.substr(sEnd);
      this.$input.selectionStart = slStart;
      this.$input.selectionEnd = slStart;
    }
  } else if (event.key == 'Delete') {
    if (slStart == slEnd) {
      if (slStart < value.length) {
        if (value.charAt(slStart) == this._formater.separator) {
          event.preventDefault();
          this.$input.value = value;
          this.$input.selectionStart = slStart + 1;
          this.$input.selectionEnd = slStart + 1;
        }
      }
    } else if (i0 != i1) {
      event.preventDefault();
      this.$input.value = value.substr(0, sStart) + this._onlySeparator(selectedValue) + value.substr(sEnd);
      this.$input.selectionStart = slStart;
      this.$input.selectionEnd = slStart;
    }
  } else if (!event.ctrlKey && !event.altKey && event.key && event.key.length == 1) {
    if (this._isAcceptKey(event.key)) {
      if (event.key == this._formater.separator) {
        if (slashSelectedCount == 0 && slashValueCount >= 2 && value.charAt(slEnd) != this._formater.separator) {
          event.preventDefault();
        } else if (value.charAt(slEnd) == this._formater.separator) {
          event.preventDefault();
          this.$input.selectionStart = lTexts[i1];
          this.$input.selectionEnd = lTexts[i1 + 1] - 1;
        }
      }
    } else {
      event.preventDefault();
    }
  } else if (!event.ctrlKey && !event.altKey && event.key == "Tab") {
    if (event.shiftKey) {
      if (i0 > 1) {
        event.preventDefault();
        this.$input.selectionStart = lTexts[i1 - 2];
        this.$input.selectionEnd = lTexts[i1 - 1] - 1;
      }
    } else {
      if (i1 < texts.length) {
        event.preventDefault();
        this.$input.selectionStart = lTexts[i1];
        this.$input.selectionEnd = lTexts[i1 + 1] - 1;
      }
    }
  }
};

DateInput.property = {};
DateInput.property.value = {
  set: function (value) {
    if (value === false || value === null || value === undefined) {
      this.$input.value = this._format;
      this._value = null;
    } else if (typeof value == 'string' || typeof value == 'number') {
      this._value = (0, _datetime.beginOfDay)(new Date(value));
      this.$input.value = (0, _datetime.formatDateString)(this._value, this._format);
    } else if (value.getTime) {
      this._value = (0, _datetime.beginOfDay)(value);
      this.$input.value = (0, _datetime.formatDateString)(this._value, this._format);
    }

    this._lastValue = this._value;
    this._calendarHolder.calendarProps.selectedDates = [this._value || new Date()];
  },
  get: function () {
    return this._value;
  }
};
DateInput.property.format = {
  set: function (value) {
    value = value || 'dd/mm/yyyy';
    if (value == this._format) return;

    if (DateInput.formaters[value]) {
      this._formater = DateInput.formaters[value];
      this._format = value;
      this.value = this.value;
    } else {
      throw new Error("Not support format " + value);
    }
  },
  get: function () {
    return this._format;
  }
};
DateInput.property.disabled = {
  set: function (value) {
    value = !!value;
    this.$input.disabled = value;
    if (value) this.addClass('as-disabled');else this.removeClass('as-disabled');
  },
  get: function () {
    return this.$input.disabled;
  }
};

_ACore.default.install(DateInput);

var _default = DateInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ChromeTimePicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ChromeTimePicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/chrometimepicker.css");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _datetime = require("absol/src/Time/datetime");

var _utils = require("./utils");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));




/***
 * @extends AElement
 * @constructor
 */
function ChromeTimePicker() {
  this._hour = null;
  this._minute = null;

  _OOP.default.drillProperty(this, this, 'dayOffset', 'value');

  this.$lists = (0, _ACore.$$)('.as-chrome-time-picker-list', this);
  this.$hourList = this.$lists[0];
  this.$hourList.on('scroll', this.eventHandler.hourScroll).on('click', this.eventHandler.clickHourList);
  this.$hour24List = this.$lists[1];
  this.$hour24List.on('scroll', this.eventHandler.hour24Scroll).on('click', this.eventHandler.clickHour24List);
  this.$minList = this.$lists[2];
  this.$minList.on('scroll', this.eventHandler.minScroll).on('click', this.eventHandler.clickMinList);
  this.$attachhook = (0, _ACore._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$attachhook).on('request_scroll_into_selected', this._scrollIntoSelected.bind(this));
  this.$amBtn = (0, _ACore.$)('.as-chrome-time-picker-btn[data-value="AM"]', this).on('click', this.eventHandler.clickAM);
  this.$pmBtn = (0, _ACore.$)('.as-chrome-time-picker-btn[data-value="PM"]', this).on('click', this.eventHandler.clickPM);
  this.scrollIntoSelected();
  this.hour = null;
  this.minute = null;
  this.s24 = false;
  (0, _ACore.$$)('.as-chrome-time-picker-scroller', this).forEach(this._makeScroller.bind(this));
  /***
   * @memberOf ChromeTimePicker#
   * @type {number}
   * @name min
   */
}

ChromeTimePicker.tag = 'ChromeTimePicker'.toLowerCase();

ChromeTimePicker.render = function () {
  return (0, _ACore._)({
    class: 'as-chrome-time-picker',
    extendEvent: ['change'],
    child: [{
      class: ['as-chrome-time-picker-scroller', 'as-chrome-time-picker-scroller-h12'],
      child: [{
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-up',
        child: 'span.mdi.mdi-chevron-up'
      }, {
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-down',
        child: 'span.mdi.mdi-chevron-down'
      }, {
        class: ['as-chrome-time-picker-viewport', 'as-chrome-time-picker-h12'],
        child: {
          class: 'as-chrome-time-picker-list',
          child: Array(36).fill(0).map(function (u, i) {
            return {
              tag: 'button',
              class: 'as-chrome-time-picker-btn',
              child: {
                tag: 'span',
                child: {
                  text: i % 12 + 1 + ''
                }
              },
              props: {
                __hour__: i % 12 + 1
              }
            };
          })
        }
      }]
    }, {
      class: ['as-chrome-time-picker-scroller', 'as-chrome-time-picker-scroller-h24'],
      child: [{
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-up',
        child: 'span.mdi.mdi-chevron-up'
      }, {
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-down',
        child: 'span.mdi.mdi-chevron-down'
      }, {
        class: ['as-chrome-time-picker-viewport', 'as-chrome-time-picker-h24'],
        child: {
          class: 'as-chrome-time-picker-list',
          child: Array(24 * 3).fill(0).map(function (u, i) {
            return {
              tag: 'button',
              class: 'as-chrome-time-picker-btn',
              child: {
                tag: 'span',
                child: {
                  text: i % 24 + ''
                }
              },
              props: {
                __hour__: i % 24
              }
            };
          })
        }
      }]
    }, {
      class: 'as-chrome-time-picker-scroller',
      child: [{
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-up',
        child: 'span.mdi.mdi-chevron-up'
      }, {
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-down',
        child: 'span.mdi.mdi-chevron-down'
      }, {
        class: 'as-chrome-time-picker-viewport',
        child: {
          class: 'as-chrome-time-picker-list',
          child: Array(180).fill(0).map(function (u, i) {
            return {
              tag: 'button',
              class: 'as-chrome-time-picker-btn',
              child: {
                tag: 'span',
                child: {
                  text: i % 60 + ''
                }
              },
              props: {
                __min__: i % 60
              }
            };
          })
        }
      }]
    }, {
      class: ['as-chrome-time-picker-viewport', 'as-chrome-time-picker-period'],
      child: ['AM', 'PM'].map(function (u) {
        return {
          tag: 'button',
          class: 'as-chrome-time-picker-btn',
          attr: {
            'data-value': u
          },
          child: {
            tag: 'span',
            child: {
              text: u
            }
          },
          props: {
            __APM__: u
          }
        };
      })
    }]
  });
};

ChromeTimePicker.prototype._makeScroller = function (rootElt) {
  var upBtn = (0, _ACore.$)('.as-chrome-time-picker-scroller-up', rootElt);
  var downBtn = (0, _ACore.$)('.as-chrome-time-picker-scroller-down', rootElt);
  var listElt = (0, _ACore.$)('.as-chrome-time-picker-list', rootElt);
  var delta = 0;

  function tick() {
    if (delta === 0) return;
    listElt.scrollTop -= delta;
    requestAnimationFrame(tick);
  }

  function cancel() {
    delta = 0;
    document.body.removeEventListener('mouseup', cancel);
    document.body.removeEventListener('mouseleave', cancel);
  }

  upBtn.on('mousedown', function () {
    delta = 5;
    document.body.addEventListener('mouseup', cancel);
    document.body.addEventListener('mouseleave', cancel);
    tick();
  });
  downBtn.on('mousedown', function () {
    delta = -5;
    document.body.addEventListener('mouseup', cancel);
    document.body.addEventListener('mouseleave', cancel);
    tick();
  });
};

ChromeTimePicker.prototype.scrollIntoSelected = function () {
  this.domSignal.emit('request_scroll_into_selected');
};

ChromeTimePicker.prototype._scrollIntoSelected = function () {
  var hour = this._hour;
  this.$hour24List.scrollTop = (hour + 24) * 28;
  hour = this._hour % 12;
  if (hour === 0) hour = 12;
  this.$hourList.scrollTop = (hour + 11) * 28;
  this.$minList.scrollTop = (this._minute + 60) * 28;
};

ChromeTimePicker.prototype.notifyChange = function (event) {
  this.emit('change', {
    type: 'change',
    originEvent: event,
    dayOffset: this.dayOffset,
    hour: this.hour,
    minute: this.minute,
    target: this
  }, this);
};

ChromeTimePicker.property = {};
ChromeTimePicker.property.hour = {
  set: function (value) {
    if ((0, _utils.isRealNumber)(value)) {
      value = Math.min(23, Math.max(0, Math.floor(value) % 24));
    } else {
      value = null;
    }

    var prevVal = this._hour;

    if (prevVal !== null) {
      this.$hour24List.childNodes[prevVal].removeClass('as-selected');
      this.$hour24List.childNodes[prevVal + 24].removeClass('as-selected');
      this.$hour24List.childNodes[prevVal + 48].removeClass('as-selected');
      prevVal = this._hour % 12;
      if (prevVal === 0) prevVal = 12;
      this.$hourList.childNodes[prevVal - 1].removeClass('as-selected');
      this.$hourList.childNodes[prevVal - 1 + 12].removeClass('as-selected');
      this.$hourList.childNodes[prevVal - 1 + 24].removeClass('as-selected');
    }

    this._hour = value;
    prevVal = this._hour;

    if (prevVal !== null) {
      this.$hour24List.childNodes[prevVal].addClass('as-selected');
      this.$hour24List.childNodes[prevVal + 24].addClass('as-selected');
      this.$hour24List.childNodes[prevVal + 48].addClass('as-selected');
      prevVal = this._hour % 12;
      if (prevVal === 0) prevVal = 12;
      this.$hourList.childNodes[prevVal - 1].addClass('as-selected');
      this.$hourList.childNodes[prevVal - 1 + 12].addClass('as-selected');
      this.$hourList.childNodes[prevVal - 1 + 24].addClass('as-selected');

      if (this._hour >= 12) {
        this.$pmBtn.addClass('as-selected');
        this.$amBtn.removeClass('as-selected');
      } else {
        this.$amBtn.addClass('as-selected');
        this.$pmBtn.removeClass('as-selected');
      }
    } else {
      this.$pmBtn.removeClass('as-selected');
      this.$amBtn.removeClass('as-selected');
    }
  },
  get: function () {
    return this._hour;
  }
};
ChromeTimePicker.property.minute = {
  set: function (value) {
    if ((0, _utils.isRealNumber)(value)) {
      value = Math.min(59, Math.max(0, Math.floor(value) % 60));
    } else {
      value = null;
    }

    var prevVal = this._minute;

    if (prevVal !== null) {
      this.$minList.childNodes[prevVal].removeClass('as-selected');
      this.$minList.childNodes[prevVal + 60].removeClass('as-selected');
      this.$minList.childNodes[prevVal + 120].removeClass('as-selected');
    }

    this._minute = value;
    prevVal = this._minute;

    if (prevVal !== null) {
      this.$minList.childNodes[prevVal].addClass('as-selected');
      this.$minList.childNodes[prevVal + 60].addClass('as-selected');
      this.$minList.childNodes[prevVal + 120].addClass('as-selected');
    }
  },
  get: function () {
    return this._minute;
  }
};
ChromeTimePicker.property.value = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value) && !(value instanceof Date)) {
      value = null;
    }

    if (value && value.getTime) {
      value = value.getTime() - (0, _datetime.beginOfDay)(value).getTime();
      if (!(0, _utils.isRealNumber)(value)) value = null;
    } else if ((0, _utils.isRealNumber)(value)) {
      value = Math.min(_datetime.MILLIS_PER_DAY - 1, Math.max(0, value % _datetime.MILLIS_PER_DAY));
    }

    if ((0, _utils.isRealNumber)(value)) {
      this.hour = Math.floor(value / _datetime.MILLIS_PER_HOUR);
      this.minute = Math.floor(value % _datetime.MILLIS_PER_HOUR / _datetime.MILLIS_PER_MINUTE);
    } else {
      this.hour = null;
      this.minute = null;
    }

    this.domSignal.emit('request_scroll_into_selected');
  },
  get: function () {
    var res = this._hour * _datetime.MILLIS_PER_HOUR + this._minute * _datetime.MILLIS_PER_MINUTE;
    return (0, _utils.isRealNumber)(res) ? res : null;
  }
};
ChromeTimePicker.property.min = {
  set: function (value) {},
  get: function () {}
};
ChromeTimePicker.property.s24 = {
  set: function (value) {
    if (value) {
      this.addClass('as-24h-clock');
    } else {
      this.removeClass('as-24h-clock');
    }
  },
  get: function () {
    return this.hasClass('as-24h-clock');
  }
};
ChromeTimePicker.eventHandler = {};

ChromeTimePicker.eventHandler.hourScroll = function () {
  var y = this.$hourList.scrollTop;
  var dy = 0;
  if (y < 28 * 12) dy = 28 * 12;else if (y > 28 * 24) {
    dy = -28 * 12;
  }

  if (dy !== 0) {
    this.$hourList.scrollTop += dy;
  }
};

ChromeTimePicker.eventHandler.hour24Scroll = function () {
  var y = this.$hour24List.scrollTop;
  var dy = 0;
  if (y < 28 * 24) dy = 28 * 24;else if (y > 28 * 48) {
    dy = -28 * 24;
  }

  if (dy !== 0) {
    this.$hour24List.scrollTop += dy;
  }
};

ChromeTimePicker.eventHandler.minScroll = function () {
  var y = this.$minList.scrollTop;
  var dy = 0;
  if (y < 28 * 60) dy = 28 * 60;else if (y > 28 * 120) {
    dy = -28 * 60;
  }

  if (dy !== 0) {
    this.$minList.scrollTop += dy;
  }
};

ChromeTimePicker.eventHandler.clickHourList = function (event) {
  var hour;
  if ('__hour__' in event.target) hour = event.target.__hour__;
  if ('__hour__' in event.target.parentElement) hour = event.target.parentElement.__hour__;

  if (hour !== undefined) {
    if (this.hour >= 12) {
      this.hour = hour === 12 ? hour : hour + 12;
    } else {
      this.hour = hour === 12 ? 0 : hour;
    }

    if ((hour - 1 + 12) * 28 < this.$hourList.scrollTop) {
      this.$hourList.scrollTop = (hour - 1 + 12) * 28;
    } else if ((hour - 1 + 13) * 28 > this.$hourList.scrollTop + this.$hourList.clientHeight) {
      this.$hourList.scrollTop = (hour - 1 + 13) * 28 - this.$hourList.clientHeight;
    }

    this.notifyChange(event);
  }
};

ChromeTimePicker.eventHandler.clickHour24List = function (event) {
  var hour;
  if ('__hour__' in event.target) hour = event.target.__hour__;
  if ('__hour__' in event.target.parentElement) hour = event.target.parentElement.__hour__;

  if (hour !== undefined) {
    this.hour = hour;

    if ((hour + 24) * 28 < this.$hourList.scrollTop) {
      this.$hourList.scrollTop = (hour + 24) * 28;
    } else if ((hour + 24) * 28 > this.$hourList.scrollTop + this.$hourList.clientHeight) {
      this.$hourList.scrollTop = (hour + 24) * 28 - this.$hourList.clientHeight;
    }

    this.notifyChange(event);
  }
};

ChromeTimePicker.eventHandler.clickMinList = function (event) {
  var min;
  if ('__min__' in event.target) min = event.target.__min__;
  if ('__min__' in event.target.parentElement) min = event.target.parentElement.__min__;

  if (min !== undefined) {
    this.minute = min;

    if ((min + 60) * 28 < this.$minList.scrollTop) {
      this.$minList.scrollTop = (min + 60) * 28;
    } else if ((min + 61) * 28 > this.$minList.scrollTop + this.$minList.clientHeight) {
      this.$minList.scrollTop = (min + 61) * 28 - this.$minList.clientHeight;
    }

    this.notifyChange(event);
  }
};

ChromeTimePicker.eventHandler.clickPM = function (event) {
  if ((0, _utils.isRealNumber)(this.hour)) {
    if (this.hour < 12) this.hour += 12;
  } else {
    this.hour = 12;
  }

  this.notifyChange(event);
};

ChromeTimePicker.eventHandler.clickAM = function (event) {
  if ((0, _utils.isRealNumber)(this.hour)) {
    if (this.hour >= 12) this.hour -= 12;
  } else {
    this.hour = 0;
  }

  this.notifyChange(event);
};

_ACore.default.install(ChromeTimePicker);

var _default = ChromeTimePicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Follower.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Follower.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/follower.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function Follower() {
  this.$attachhook = _('attachhook', this).addTo(this).on('attached', function () {
    this.requestUpdateSize();

    _Dom.default.addToResizeSystem(this);
  });
  this.$attachhook.requestUpdateSize = this.updatePosition.bind(this);
  this.$followTarget = undefined;
  this.$scrollTrackElts = [];
  this._scrollTrackEventHandler = undefined;
  this._anchor = Follower.ANCHOR_PRIORITY;
  this.defineEvent(['updateposition', 'preupdateposition']);
  /***
   * @name followTarget
   * @type {AElement}
   * @memberOf Follower#
   */
}

Follower.tag = 'Follower'.toLowerCase();

Follower.render = function () {
  return _('.absol-follower');
};

Follower.prototype.clearChild = function () {
  var children = Array.prototype.slice.call(this.children);
  var attachhookElt = this.$attachhook;
  children.forEach(function (elt) {
    if (elt != attachhookElt) elt.remove();
  });
}; //Todo: remove child, find child....

/**
 * X = $target.x + F[anchor_index][0] * $target.width + F[anchor_index][1] * $content.width
 * Y = $target.y + F[anchor_index][2] * $target.height + F[anchor_index][3] * $content.height
 */


Follower.ANCHOR_FACTORS = [[1, 0, 0, 0], //0
[0, 0, 1, 0], //1
[1, -1, 1, 0], //2
[0, -1, 0, 0], //3
[0, -1, 1, -1], //4
[1, -1, 0, -1], //5
[0, 0, 0, -1], //6
[1, 0, 1, -1], //7
[1, 0, 0.5, -0.5], //8
[0.5, -0.5, 1, 0], //9
[0, -1, 0.5, -0.5], //10
[0.5, -0.5, 0, -1], //11
[1, 0, 1, 0], //12
[0, -1, 1, 0], //13
[0, -1, 0, -1], //14
[1, 0, 0, -1] //15
];
Follower.ANCHOR_PRIORITY = [1, 6, 2, 5, 0, 7, 3, 4, 9, 11, 8, 10, 12, 15, 13, 14];

Follower.prototype.updatePosition = function () {
  if (!this.$followTarget) return;
  this.emit('preupdateposition', {
    target: this
  }, this);
  var targetBound = this.$followTarget.getBoundingClientRect();

  var screenSize = _Dom.default.getScreenSize();

  var outRect = new _Rectangle.default(0, 0, screenSize.width, screenSize.height);
  var bound = this.getBoundingClientRect();
  var x = 0;
  var y = 0;
  var score;
  var anchors = this._lastAnchor === undefined ? this.anchor : [this._lastAnchor].concat(this.anchor);
  var factor;
  var bestX,
      bestY,
      bestScore = -100000;
  var newContentRect;
  var bestAnchor;

  for (var i = 0; i < anchors.length; ++i) {
    factor = Follower.ANCHOR_FACTORS[anchors[i]];
    x = targetBound.left + factor[0] * targetBound.width + factor[1] * bound.width;
    y = targetBound.top + factor[2] * targetBound.height + factor[3] * bound.height;
    newContentRect = new _Rectangle.default(x, y, bound.width, bound.height);
    score = newContentRect.collapsedSquare(outRect);

    if (score - 10 > bestScore) {
      bestAnchor = anchors[i];
      bestScore = score;
      bestX = x;
      bestY = y;
    }
  }

  if (this._lastAnchor !== bestAnchor) {
    this.removeClass('as-anchor-' + this._lastAnchor);
    this._lastAnchor = bestAnchor;
    this.addClass('as-anchor-' + this._lastAnchor);
  }

  this.addStyle({
    left: bestX + 'px',
    top: bestY + 'px'
  });
  this.emit('updateposition', {
    target: this
  }, this);
};

Follower.prototype.refollow = function () {
  if (!this.$followTarget) return;
  this.updatePosition();
  this.addClass('following');
  if (this._scrollTrackEventHandler) this.unfollow();
  this._scrollTrackEventHandler = this.updatePosition.bind(this);
  this.$scrollTrackElts = [];
  var trackElt = this.$followTarget;

  while (trackElt) {
    if (trackElt.addEventListener) trackElt.addEventListener('scroll', this._scrollTrackEventHandler, false);else trackElt.attachEvent('onscroll', this._scrollTrackEventHandler, false);
    this.$scrollTrackElts.push(trackElt);
    trackElt = trackElt.parentElement;
  }

  if (document.addEventListener) {
    document.addEventListener('scroll', this._scrollTrackEventHandler, false);
  } else {
    document.attachEvent('onscroll', this._scrollTrackEventHandler, false);
  }

  this.$scrollTrackElts.push(document);
};

Follower.prototype.unfollow = function () {
  if (!this._scrollTrackEventHandler) return; // nothing to do

  this.removeClass('following');
  var trackElt;

  for (var i = 0; i < this.$scrollTrackElts.length; ++i) {
    trackElt = this.$scrollTrackElts[i];
    if (trackElt.removeEventListener) trackElt.removeEventListener('scroll', this._scrollTrackEventHandler, false);else trackElt.dettachEvent('onscroll', this._scrollTrackEventHandler, false);
  }

  this.$scrollTrackElts = [];
  this._scrollTrackEventHandler = undefined;
};

Follower.property = {};
Follower.property.followTarget = {
  set: function (elt) {
    if (elt === null || elt === undefined || !elt) {
      this.unfollow();
      this.$followTarget = undefined;
      return;
    } else if (typeof elt == 'string') {
      elt = $(elt) || document.getElementById(elt);
    }

    if (_Dom.default.isDomNode(elt)) {
      this.$followTarget = elt;
      this._lastAncho = undefined;
      this.refollow();
    } else throw new Error("Invalid element");
  },
  get: function () {
    return this.$followTarget;
  }
};
Follower.property.anchor = {
  set: function (value) {
    value = value || Follower.ANCHOR_PRIORITY;
    if (value == 'auto') value = Follower.ANCHOR_PRIORITY;
    if (typeof value == null) value = [value];
    if (!(value instanceof Array)) throw new Error('Invalid anchor ' + value);
    value = value.map(function (x) {
      x = Math.floor(x);

      if (x >= 0 && x < Follower.ANCHOR_FACTORS.length) {
        return x;
      } else throw new Error("Invalid anchor: " + x);
    });
    this._anchor = value;
    this._lastAnchor = undefined;
    this.updatePosition();
  },
  get: function () {
    return this._anchor;
  }
};

_ACore.default.install(Follower);

var _default = Follower;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/Input/keyboard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/Input/keyboard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isFnKey = isFnKey;
exports.isSpaceKey = isSpaceKey;
exports.isCtrlKey = isCtrlKey;
exports.isAltKey = isAltKey;
exports.isShiftKey = isShiftKey;
exports.isMetaKey = isMetaKey;
exports.normalizeKeyBindingIdent = normalizeKeyBindingIdent;
exports.keyboardEventToKeyBindingIdent = keyboardEventToKeyBindingIdent;

function isFnKey(name) {
  return name.match(/^[fF]([2-9]|(1([0-2]?)))$/);
}

function isSpaceKey(name) {
  return name === ' ' || name.match(/^[sS]pace$/);
}

function isCtrlKey(name) {
  return name.match(/(^([cC]ontrol)|ctrl)$/);
}

function isAltKey(name) {
  return name.match(/^[aA]lt$/);
}

function isShiftKey(name) {
  return name.match(/^[sS]hift$/);
}

function isMetaKey(name) {
  return name.toLowerCase().match(/^(command|windows|meta)$/);
}
/***
 *
 * @param {string} text
 * @return {string}
 */


function normalizeKeyBindingIdent(text) {
  var keys = text.trim().toLowerCase().split(/[-+\s_.]+/).filter(function (w) {
    return w.length > 0;
  });
  var values = {
    meta: 1,
    ctrl: 2,
    alt: 3,
    shift: 4
  };
  keys.sort(function (a, b) {
    var va, vb;
    va = values[a] || 100;
    vb = values[b] || 100;
    return va - vb;
  });
  return keys.join('-');
}
/***
 *
 * @param {KeyboardEvent} event
 * @return {string}
 */


function keyboardEventToKeyBindingIdent(event) {
  var keys = [];

  if (event.metaKey) {
    keys.push('meta');
  }

  if (event.ctrlKey) keys.push('ctrl');
  if (event.altKey) keys.push('alt');
  if (event.shiftKey) keys.push('shift');

  if (isSpaceKey(event.key)) {
    keys.push('space');
  } else if (isFnKey(event.key)) {
    keys.push(event.key.toLowerCase());
  } else if (!isMetaKey(event.key) && !isAltKey(event.key) && !isCtrlKey(event.key) && !isShiftKey(event.key)) keys.push(event.key.toLowerCase());

  return keys.join('-');
}
};

moduleFactories["node_modules/absol-acomp/js/DateTimeInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DateTimeInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/datetimeinput.css");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _utils = require("./utils");

var _datetime = require("absol/src/Time/datetime");

var _ChromeTimePicker = _interopRequireDefault(require("./ChromeTimePicker"));

var _ChromeCalendar = _interopRequireDefault(require("./ChromeCalendar"));

var _Follower = _interopRequireDefault(require("./Follower"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _keyboard = require("absol/src/Input/keyboard");




var STATE_NEW = 1;
var STATE_EDITED = 2;
var STATE_NONE = 0;
/***
 * @extends AElement
 * @constructor
 */

function DateTimeInput() {
  this._editingData = {};
  this._value = null;
  this._min = new Date(1890, 0, 1);
  this._max = new Date(new Date(2090, 0, 1).getTime() - 1);
  this._format = 'dd/MM/yyyy hh:mm a';
  this.$attachhook = (0, _ACore._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$attachhook);
  this.domSignal.on('request_auto_select', this._autoSelect.bind(this));
  /***
   *
   * @type {HTMLInputElement | AElement}
   */

  this.$text = (0, _ACore.$)('.as-date-time-input-text', this).on('mousedown', this.eventHandler.mouseDownInput).on('mouseup', this.eventHandler.mouseUpInput).on('dblclick', this.eventHandler.dblclickInput).on('keydown', this.eventHandler.keydown).on('blur', this.eventHandler.inputBlur).on('contextmenu', function (event) {
    event.preventDefault();
  });
  this.$pickerBtn = (0, _ACore.$)('.as-date-time-input-icon-btn', this).on('click', this.eventHandler.clickPickerBtn);
  this.$clearBtn = (0, _ACore.$)('button.as-time-input-clear-btn', this).on('click', this.clear.bind(this));
  this.notNull = false;
  this.min = this._min;
  this.max = this._max;
}

DateTimeInput.tag = 'DateTimeInput'.toLowerCase(); //calendar-clock

DateTimeInput.render = function () {
  return (0, _ACore._)({
    extendEvent: ['change'],
    class: 'as-date-time-input',
    child: [{
      tag: 'input',
      class: 'as-date-time-input-text',
      attr: {
        ondrop: "return false;"
      },
      props: {
        value: 'dd/MM/yyyy hh:mm a'
      }
    }, {
      tag: 'button',
      class: 'as-time-input-clear-btn',
      child: 'span.mdi.mdi-close-circle'
    }, {
      tag: 'button',
      class: 'as-date-time-input-icon-btn',
      child: 'span.mdi.mdi-calendar-clock'
    }]
  });
};

DateTimeInput.prototype.tokenRegex = /([^.\/:\-,\\\s]+)|([.\/:\-,\\]+)/i;
/***
 *
 * @param start
 * @returns {null|{ident: string, length: number, sourceText: string, replace: function(s: string, selecting:boolean):void, text: string, idx: number, elt: (HTMLInputElement|absol.AElement)}}
 */

DateTimeInput.prototype._tokenAt = function (start) {
  var rgx = new RegExp(this.tokenRegex.source, 'g');
  var rgxFormat = new RegExp(this.tokenRegex.source, 'g');
  var s = this.$text.value;
  var format = this._format;
  var tokenMatched = rgx.exec(s);
  var formatToken = rgxFormat.exec(format);
  var tokenMatchedList = [];
  var formatTokenList = [];
  var text, ident;
  var idx;

  while (tokenMatched && formatToken) {
    text = tokenMatched[1];
    ident = formatToken[1];

    if (text && (0, _utils.isDateTimeFormatToken)(ident)) {
      tokenMatchedList.push(tokenMatched);
      formatTokenList.push(formatToken);
    }

    tokenMatched = rgx.exec(s);
    formatToken = rgxFormat.exec(format);
  }

  var bestI = -1;
  var bestD = Infinity;
  var d;

  for (var i = 0; i < tokenMatchedList.length; ++i) {
    tokenMatched = tokenMatchedList[i];
    formatToken = formatTokenList[i];
    text = tokenMatched[1];
    idx = tokenMatched.index;
    d = Math.min(Math.abs(start - idx), Math.abs(start - (idx + text.length)));

    if (d < bestD) {
      bestD = d;
      bestI = i;
    }
  }

  if (bestI >= 0) {
    tokenMatched = tokenMatchedList[bestI];
    formatToken = formatTokenList[bestI];
    text = tokenMatched[1];
    ident = formatToken[1];
    idx = tokenMatched.index;
    return {
      idx: idx,
      text: text,
      length: text.length,
      ident: ident,
      elt: this.$text,
      sourceText: s,
      replace: function (newText, selecting) {
        var left = this.sourceText.substr(0, this.idx);
        var right = this.sourceText.substr(this.idx + this.length);
        this.text = newText;
        this.length = newText.length;
        this.sourceText = left + this.text + right;
        this.elt.value = this.sourceText;

        if (selecting) {
          this.elt.setSelectionRange(this.idx, this.idx + this.length);
        }
      }
    };
  }

  return null;
};

DateTimeInput.prototype._autoSelect = function () {
  var token = this._tokenAt(this.$text.selectionStart);

  var tokenEnd = this._tokenAt(this.$text.selectionEnd);

  if (token) {
    if (tokenEnd.idx === token.idx) {
      this.$text.setSelectionRange(token.idx, token.idx + token.length);
      this._editingData.state = STATE_NEW;
    } else {
      this.$text.select();
      this._editingData.state = STATE_NONE;
    }
  }
};

DateTimeInput.prototype._editNextToken = function () {
  var token = this._tokenAt(this.$text.selectionStart);

  if (!token) return false;
  var cIdx = token.idx;
  var l = this.$text.value.length;

  for (var i = token.idx + token.length; i < l; ++i) {
    token = this._tokenAt(i);

    if (token && token.idx !== cIdx) {
      this.$text.setSelectionRange(token.idx, token.idx + token.length);
      this._editingData.state = STATE_NEW;
      break;
    }
  }
};

DateTimeInput.prototype._editPrevToken = function () {
  var token = this._tokenAt(this.$text.selectionStart);

  if (!token) return false;
  var cIdx = token.idx;
  var l = this.$text.value.length;

  for (var i = token.idx - 1; i >= 0; --i) {
    token = this._tokenAt(i);

    if (token && token.idx !== cIdx) {
      this.$text.setSelectionRange(token.idx, token.idx + token.length);
      this._editingData.state = STATE_NEW;
      break;
    }
  }
};

DateTimeInput.prototype.tokenMap = {
  d: 'd',
  dd: 'd',
  M: 'M',
  MM: 'M',
  y: 'y',
  yyyy: 'y',
  hh: 'h',
  h: 'h',
  mm: 'm',
  m: 'm',
  a: 'a'
};
/***
 *
 * @param {string} s
 * @returns {{}}
 * @private
 */

DateTimeInput.prototype._makeTokenDict = function (s) {
  var rgx = new RegExp(this.tokenRegex.source, 'g');
  var rgxFormat = new RegExp(this.tokenRegex.source, 'g');
  var format = this._format;
  var tokenMap = this.tokenMap;
  var tokenMatched = rgx.exec(s);
  var formatToken = rgxFormat.exec(format);
  var text, ident;
  var idx;
  var res = {};

  while (tokenMatched && formatToken) {
    text = tokenMatched[1];
    ident = formatToken[1];

    if (text) {
      if (tokenMap[ident]) {
        idx = tokenMatched.index;
        res[tokenMap[ident]] = {
          text: text,
          idx: idx,
          length: text.length,
          sourceText: s,
          value: ident === 'a' ? text : parseInt(text)
        };
      }
    }

    tokenMatched = rgx.exec(s);
    formatToken = rgxFormat.exec(format);
  }

  return res;
};
/***
 *
 * @param {Date} date
 * @private
 */


DateTimeInput.prototype._makeValueDict = function (date) {
  var res = {};
  res.d = {
    value: date.getDate()
  };
  res.y = {
    value: date.getFullYear()
  };
  res.M = {
    value: date.getMonth() + 1
  };
  res.m = {
    value: date.getMinutes()
  };
  res.h = {
    value: date.getHours()
  };

  if (res.h.value < 12) {
    if (res.h.value === 0) res.h.value = 12;
    res.a = {
      value: "AM"
    };
  } else {
    if (res.h.value > 12) res.h.value -= 12;
    res.a = {
      value: "PM"
    };
  }

  return res;
};

DateTimeInput.prototype._applyTokenDict = function (format, dict, debug) {
  var rgx = new RegExp(this.tokenRegex.source, 'g');
  var tokenMap = this.tokenMap;
  return format.replace(rgx, function (full, g1, g2, sourceText) {
    if (g1 && tokenMap[g1]) {
      var ident = tokenMap[g1];

      if (ident === 'a') {
        return dict.a && dict.a.value || 'a';
      } else {
        if (dict[ident] && !isNaN(dict[ident].value)) {
          var numberText = dict[ident].value + '';

          while (numberText.length < g1.length) numberText = '0' + numberText;

          return numberText;
        } else {
          return full;
        }
      }
    } else return full;
  });
};

DateTimeInput.prototype._loadValueFromInput = function () {
  var tkDict = this._makeTokenDict(this.$text.value);

  var H = NaN;

  if (tkDict.a.value === 'AM') {
    H = tkDict.h.value % 12;
  } else if (tkDict.a.value === 'PM') {
    H = tkDict.h.value + (tkDict.h.value === 12 ? 0 : 12);
  }

  var date = new Date(tkDict.y.value, tkDict.M.value - 1, tkDict.d.value, H, tkDict.m.value);

  if (isNaN(date.getTime())) {
    this._value = null;
  } else {
    this._value = date;
  }
};

DateTimeInput.prototype.clear = function () {
  var lev = this._lastEmitValue;

  if (this.notNull) {
    this.value = (0, _datetime.formatDateTime)(new Date(Math.max(this.min.getTime(), Math.min(this.max.getTime(), new Date().getTime()))), this.format);
  } else {
    this.value = null;
  }

  this._lastEmitValue = lev;

  this._notifyIfChange();
};

DateTimeInput.prototype._notifyIfChange = function (event) {
  if (!this._lastEmitValue && !this._value) return;
  if (this._lastEmitValue && this._value && this._lastEmitValue.getTime() === this._value.getTime()) return;
  this.emit('change', {
    type: 'change',
    target: this,
    value: this._value,
    originEvent: event
  }, this);
  this._lastEmitValue = this._value;
};

DateTimeInput.prototype._correctingInput = function () {
  var tkDict = this._makeTokenDict(this.$text.value);

  var equalMin = true;
  var equalMax = true;

  if (!isNaN(tkDict.y.value)) {
    tkDict.y.value = Math.max(this._min.getFullYear(), Math.min(this._max.getFullYear(), tkDict.y.value));
    equalMin = tkDict.y.value === this._min.getFullYear();
    equalMax = tkDict.y.value === this._max.getFullYear();
  } else {
    equalMin = false;
    equalMax = false;
  }

  if (!isNaN(tkDict.M.value)) {
    tkDict.M.value = Math.max(1, Math.min(12, tkDict.M.value));

    if (equalMin) {
      tkDict.M.value = Math.max(this._min.getMonth() + 1, tkDict.M.value);
      equalMin = tkDict.M.value === this._min.getMonth() + 1;
    }

    if (equalMax) {
      tkDict.M.value = Math.min(this._max.getMonth() + 1, tkDict.M.value);
      equalMax = this._max.getMonth() + 1;
    }
  } else {
    equalMin = false;
    equalMax = false;
  }

  if (!isNaN(tkDict.d.value)) {
    tkDict.d.value = Math.max(1, Math.min(31, tkDict.d.value));

    if (!isNaN(tkDict.M.value)) {
      tkDict.d.value = Math.min(tkDict.d.value, (0, _datetime.daysInMonth)(isNaN(tkDict.y.value) ? 2020 : tkDict.y.value, tkDict.M.value - 1));
    }

    if (equalMin) {
      tkDict.d.value = Math.max(this._min.getDate(), tkDict.d.value);
      equalMin = tkDict.d.value === this._min.getDate();
    }

    if (equalMax) {
      tkDict.d.value = Math.min(this._max.getDate(), tkDict.d.value);
      equalMax = tkDict.d.value === this._max.getDate();
    }
  } else {
    equalMin = false;
    equalMax = false;
  } //todo: min max


  if (tkDict.a.value === 'AM' || tkDict.a.value === 'PM') {
    if (equalMin) {}
  } else {
    equalMin = false;
    equalMax = false;
  }

  var text = this._applyTokenDict(this._format, tkDict);

  this.$text.value = text;
};

DateTimeInput.prototype._correctingCurrentToken = function () {
  var token = this._tokenAt(this.$text.selectionStart);

  if (!token) return;
  var value;

  if (token.ident === 'a') {
    if (token.text !== 'a' && token.text !== 'AM' && token.text !== 'PM') {
      token.replace('a', false);
    }
  } else {
    value = parseInt(token.text);
    var rqMin = {
      d: 1,
      dd: 1,
      M: 1,
      MM: 1,
      y: 1890,
      yyyy: 1890,
      h: 1,
      hh: 1,
      m: 0,
      mm: 0
    }[token.ident];
    var rqMax = {
      d: 31,
      dd: 31,
      M: 12,
      MM: 12,
      y: 2089,
      yyyy: 2089,
      h: 12,
      hh: 12,
      m: 59,
      mm: 59
    }[token.ident];

    if (rqMin !== undefined) {
      if (!isNaN(value)) {
        if (value < rqMin || value > rqMin) {
          value = Math.max(rqMin, Math.min(rqMax, value));
          token.replace((0, _utils.zeroPadding)(value, token.ident.length), false);
          this._editingData.d = value;
        }
      } else if (token.text !== token.ident) {
        token.replace(token.ident, false);
      }
    }
  }
};

DateTimeInput.prototype._dateFrom = function (value) {
  var typeV = typeof value;

  if (typeV === 'string' || typeV === 'number') {
    value = new Date(value);
  }

  if (!value || !value.getTime) value = null;

  if (value) {
    value = new Date(value.getTime());
    value.setSeconds(0, 0);
  }

  return value || null;
};

DateTimeInput.property = {};
DateTimeInput.property.disabled = {
  set: function (value) {
    this.$text.disabled = !!value;

    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
DateTimeInput.property.notNull = {
  set: function (value) {
    if (value) {
      this.addClass('as-must-not-null');
      if (!this.value) this.value = new Date();
    } else {
      this.removeClass('as-must-not-null');
    }

    this.value = this.value; //update
  },
  get: function () {
    return this.hasClass('as-must-not-null');
  }
};
DateTimeInput.property.format = {
  set: function (value) {
    var dict;

    if (this._value) {
      dict = this._makeValueDict(this._value);
    } else {
      dict = this._makeTokenDict(this.$text.value);
    }

    this._format = value;
    this.$text.value = this._applyTokenDict(value, dict);
  },
  get: function () {
    return this._format;
  }
};
DateTimeInput.property.value = {
  set: function (value) {
    this._value = this._dateFrom(value);
    var dict;

    if (this._value) {
      dict = this._makeValueDict(this._value);
    } else {
      dict = this._makeTokenDict(this.$text.value);
    }

    if (value) {
      this.$text.value = this._applyTokenDict(this._format, dict, true);
    } else {
      this.$text.value = this.format;
    }

    this._lastEmitValue = this._value;
  },
  get: function () {
    return this._value;
  }
};
DateTimeInput.property.min = {
  set: function (value) {
    this._min = this._dateFrom(value) || new Date(1890, 0, 1);
  },
  get: function () {
    return this._min;
  }
};
DateTimeInput.property.max = {
  set: function (value) {
    this._max = this._dateFrom(value) || new Date(new Date(2090, 0, 1).getTime() - 1);
  },
  get: function () {
    return this._max;
  }
};
DateTimeInput.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
DateTimeInput.property.text = {
  get: function () {
    return this.$text.value;
  }
};
DateTimeInput.eventHandler = {};

DateTimeInput.eventHandler.mouseUpInput = function () {
  if (!this.readOnly) {
    this.domSignal.emit('request_auto_select');
  }
};

DateTimeInput.eventHandler.mouseDownInput = function () {
  if (!this.readOnly && document.activeElement === this.$text) {
    this._correctingCurrentToken();
  }
};

DateTimeInput.eventHandler.dblclickInput = function (event) {
  event.preventDefault();
};
/***
 *
 * @param {KeyboardEvent} event
 */


DateTimeInput.eventHandler.keydown = function (event) {
  var kbId = (0, _keyboard.keyboardEventToKeyBindingIdent)(event);

  if (this.readOnly) {
    if (!kbId.match(/^arrow/) && !kbId.match(/^ctrl-[ca]/)) {
      event.preventDefault();
    }

    return;
  }

  var token = this._tokenAt(this.$text.selectionStart);

  var endToken = this._tokenAt(this.$text.selectionEnd);

  if (!token) {
    if (event.key === 'Enter') {
      this._correctingInput();

      this._loadValueFromInput();

      this._notifyIfChange(event);
    }

    return;
  }

  var newTokenText;
  var value;

  if (event.key.startsWith('Arrow') || [' ', ':', '/', '-'].indexOf(event.key) >= 0) {
    event.preventDefault();

    switch (event.key) {
      case 'ArrowLeft':
        this._editPrevToken();

        break;

      case 'ArrowRight':
      case ' ':
      case ':':
      case '/':
      case '-':
        this._editNextToken();

        break;

      case 'ArrowUp':
      case 'ArrowDown':
        switch (token.ident) {
          case 'dd':
          case 'd':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.d = event.key === 'ArrowUp' ? 1 : 31;
            } else {
              this._editingData.d = 1 + (value + (event.key === 'ArrowUp' ? 0 : 29)) % 31;
            }

            newTokenText = '' + this._editingData.d;

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case 'MM':
          case 'M':
            value = parseInt(token.text) - 1;

            if (isNaN(value)) {
              this._editingData.M = event.key === 'ArrowUp' ? 0 : 11;
            } else {
              this._editingData.M = (value + (event.key === 'ArrowUp' ? 1 : 11)) % 12;
            }

            newTokenText = '' + (this._editingData.M + 1);

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case 'yyyy':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.y = new Date().getFullYear();
            } else {
              this._editingData.y = Math.max(1890, Math.min(2089, value + (event.key === 'ArrowUp' ? 1 : -1)));
            }

            newTokenText = this._editingData.y + '';

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case "hh":
          case 'h':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.h = event.key === 'ArrowUp' ? 1 : 12;
            } else {
              this._editingData.h = 1 + (value + (event.key === 'ArrowUp' ? 0 : 10)) % 12;
            }

            newTokenText = this._editingData.h + '';

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case "mm":
          case 'm':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.m = event.key === 'ArrowUp' ? 0 : 59;
            } else {
              this._editingData.m = (value + (event.key === 'ArrowUp' ? 1 : 59)) % 60;
            }

            newTokenText = this._editingData.m + '';

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case 'a':
            value = token.text;
            this._editingData.a = value === 'PM' ? "AM" : "PM";
            newTokenText = this._editingData.a;
            token.replace(newTokenText, true);
            break;
        }

        break;
    }
  } else if (event.key === "Delete" || event.key === 'Backspace') {
    event.preventDefault();

    if (endToken.idx !== token.idx) {
      if (this.notNull) {
        this.$text.value = (0, _datetime.formatDateTime)(new Date(Math.max(this.min.getTime(), Math.min(this.max.getTime(), new Date().getTime()))), this.format);
      } else {
        this.$text.value = this._format;
      }

      this.$text.select();
    } else {
      if (this.notNull) {
        switch (token.ident) {
          case 'HH':
          case 'mm':
          case 'H':
          case 'm':
            token.replace((0, _utils.zeroPadding)(0, token.ident.length), true);
            break;

          case 'h':
          case 'hh':
            token.replace('12', true);
            break;

          case 'M':
          case 'MM':
          case 'dd':
          case 'd':
            token.replace((0, _utils.zeroPadding)(1, token.ident.length), true);
            break;

          case 'y':
          case 'yyyy':
            token.replace((0, _utils.zeroPadding)(Math.max(this.min.getFullYear(), Math.min(this.max.getFullYear(), new Date().getFullYear())), token.ident.length), true);
            break;

          case 'a':
            token.replace('AM', true);
            break;
        }
      } else {
        token.replace(token.ident, true);
      }

      if (event.key === "Delete") this._editNextToken();else this._editPrevToken();
    }
  } else if (event.key === "Enter" || event.key === 'Tab') {
    this._correctingInput();

    this._loadValueFromInput();

    this._notifyIfChange(event);
  } else if (event.ctrlKey) {
    switch (event.key) {
      case 'a':
      case 'A':
        break;

      case 'c':
      case 'C':
        break;

      case 'x':
      case 'X':
        this.domSignal.once('clear_value', function () {
          this.$text.value = this._format;
          this.$text.select();
        }.bind(this));
        this.domSignal.emit('clear_value');
        break;

      default:
        event.preventDefault();
    }
  } else if (event.key.match(/^[0-9]$/g)) {
    event.preventDefault();
    var dVal = parseInt(event.key);

    if (this._editingData.state === STATE_NEW) {
      switch (token.ident) {
        case 'dd':
        case 'd':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;
          this._editingData.d = dVal;

          if (dVal > 3) {
            this._editNextToken();
          }

          break;

        case 'MM':
        case 'M':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;
          this._editingData.M = dVal;

          if (dVal > 1) {
            this._editNextToken();
          }

          break;

        case 'yyyy':
        case 'y':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;
          this._editingData.state_num = 1;
          break;

        case 'm':
        case 'mm':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;

          if (dVal > 5) {
            this._editNextToken();
          }

          break;

        case 'h':
        case 'hh':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;

          if (dVal > 1) {
            this._editNextToken();
          }

          break;
      }
    } else {
      switch (token.ident) {
        case 'dd':
        case 'd':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(1, Math.min(31, dVal));
          this._editingData.d = dVal;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;

        case 'MM':
        case 'M':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(1, Math.min(12, dVal));
          this._editingData.M = dVal - 1;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;

        case 'yyyy':
        case 'y':
          dVal = (parseInt(token.text.replace(/^./, '')) || 0) * 10 + dVal;
          this._editingData.state_num++;

          if (this._editingData.state_num >= 4) {
            // dVal = Math.max(1890, Math.min(2089, dVal));
            token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

            this._editNextToken();
          } else {
            token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          }

          break;

        case 'm':
        case 'mm':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(0, Math.min(59, dVal));
          this._editingData.m = dVal;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;

        case 'h':
        case 'hh':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(1, Math.min(12, dVal));
          this._editingData.h = dVal;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;
      }
    }
  } else if (event.key.match(/^[aApPSCsc]$/) && token.ident === 'a') {
    event.preventDefault();

    if (event.key.match(/^[aAsS]$/)) {
      token.replace('AM', true);
      this._editingData.a = "AM";
    } else {
      token.replace('PM', true);
      this._editingData.a = "PM";
    }

    this._editNextToken();
  } else {
    event.preventDefault();
  }
};

DateTimeInput.eventHandler.inputBlur = function () {
  this._correctingInput();

  this._loadValueFromInput();

  this._notifyIfChange();
};

DateTimeInput.eventHandler.clickPickerBtn = function () {
  this._attachPicker();
};

DateTimeInput.eventHandler.clickOut = function (event) {
  if ((0, _EventEmitter.hitElement)(this.share.$follower, event)) return;

  this._releasePicker();
};

DateTimeInput.eventHandler.clickCancelBtn = function () {
  this._releasePicker();
};

DateTimeInput.eventHandler.calendarPick = function (event) {
  var value = event.value;

  var tkDict = this._makeTokenDict(this.share.pickedValeText);

  if (tkDict.y) {
    tkDict.y.value = value.getFullYear();
  }

  if (tkDict.M) {
    tkDict.M.value = value.getMonth() + 1;
  }

  if (tkDict.d) {
    tkDict.d.value = value.getDate();
  }

  this.share.pickedValeText = this._applyTokenDict(this._format, tkDict);
};

DateTimeInput.eventHandler.clickOKBtn = function (event) {
  this.$text.value = this.share.pickedValeText;

  this._correctingInput();

  this._loadValueFromInput();

  this._notifyIfChange(event);

  this._releasePicker();
};

DateTimeInput.eventHandler.timePick = function (event) {
  var hour = event.hour;
  var minute = event.minute;

  var tkDict = this._makeTokenDict(this.share.pickedValeText);

  if (tkDict.h) {
    tkDict.h.value = 1 + (hour + 11) % 12;

    if (tkDict.a) {
      tkDict.a.value = hour >= 12 ? "PM" : 'AM';
    }
  }

  if (tkDict.m) {
    tkDict.m.value = minute;
  }

  this.share.pickedValeText = this._applyTokenDict(this._format, tkDict);
};

DateTimeInput.prototype.share = {
  $follower: null,
  $calendar: null,
  $timePicker: null,
  $holdingInput: null
};

DateTimeInput.prototype._preparePicker = function () {
  if (!this.share.$follower) {
    this.share.$timePicker = (0, _ACore._)({
      tag: _ChromeTimePicker.default.tag,
      class: 'as-date-time-input-time-picker'
    });
    this.share.$calendar = (0, _ACore._)({
      tag: _ChromeCalendar.default.tag,
      class: 'as-date-time-input-date-picker'
    });
    this.share.$cancelBtn = (0, _ACore._)({
      tag: 'a',
      class: 'as-select-list-box-cancel-btn',
      attr: {
        "data-ml-key": 'txt_cancel'
      }
    });
    this.share.$okBtn = (0, _ACore._)({
      tag: 'a',
      class: 'as-select-list-box-ok-btn',
      attr: {
        "data-ml-key": 'txt_ok'
      }
    });
    this.share.$follower = (0, _ACore._)({
      tag: _Follower.default.tag,
      class: ['as-date-time-input-follower', 'as-dropdown-box-common-style'],
      child: [{
        class: 'as-date-time-input-picker-ctn',
        child: [this.share.$calendar, this.share.$timePicker]
      }, {
        class: 'as-dropdown-box-footer',
        child: [{
          class: 'as-dropdown-box-footer-right',
          child: [this.share.$okBtn, this.share.$cancelBtn]
        }]
      }]
    });
  }
};

DateTimeInput.prototype._attachPicker = function () {
  this._preparePicker();

  if (this.share.$holdingInput) this.share.$holdingInput._releasePicker();
  this.share.pickedValeText = this.$text.value;
  this.share.$holdingInput = this;
  this.share.$follower.addStyle('visibility', 'hidden');
  this.share.$follower.addTo(document.body);
  this.share.$follower.followTarget = this;
  this.$pickerBtn.off('click', this.eventHandler.clickPickerBtn);
  this.share.$calendar.on('pick', this.eventHandler.calendarPick);
  this.share.$timePicker.on('change', this.eventHandler.timePick);
  this.share.$okBtn.on('click', this.eventHandler.clickOKBtn);
  this.share.$cancelBtn.on('click', this.eventHandler.clickCancelBtn);

  var tkDict = this._makeTokenDict(this.$text.value);

  if (tkDict.h && !isNaN(tkDict.h.value)) {
    if (tkDict.a && tkDict.a.value === 'PM') {
      this.share.$timePicker.hour = 12 + tkDict.h.value % 12;
    } else {
      this.share.$timePicker.hour = tkDict.h.value % 12;
    }
  } else {
    this.share.$timePicker.hour = null;
  }

  if (tkDict.m && !isNaN(tkDict.m.value)) {
    this.share.$timePicker.minute = tkDict.m.value;
  } else {
    this.share.$timePicker.minute = null;
  }

  this.share.$timePicker.scrollIntoSelected();
  var date = null;

  if (tkDict.d && !isNaN(tkDict.d.value) && tkDict.M && !isNaN(tkDict.M.value) && tkDict.y && !isNaN(tkDict.y.value)) {
    date = new Date(tkDict.y.value, tkDict.M.value - 1, tkDict.d.value);
    if (isNaN(date.getTime())) date = null;
  }

  if (date) {
    this.share.$calendar.selectedDates = [date];
    this.share.$calendar.viewDate = date;
  } else {
    this.share.$calendar.selectedDates = [];
    var viewDate = null;

    if (tkDict.y && !isNaN(tkDict.y.value)) {
      if (tkDict.M && !isNaN(tkDict.M.value)) {
        if (tkDict.d && !isNaN(tkDict.d.value)) {
          viewDate = new Date(tkDict.y.value, tkDict.M.value - 1, tkDict.d.value);
        } else {
          viewDate = new Date(tkDict.y.value, tkDict.M.value - 1, 1);
        }
      } else {
        viewDate = new Date(tkDict.y.value, 0, 1);
      }
    } else {
      viewDate = new Date();
    }

    if (viewDate && !isNaN(viewDate.getTime())) {
      this.share.$calendar.viewDate = viewDate;
    } else {
      this.share.$calendar.viewDate = new Date();
    }
  }

  setTimeout(function () {
    this.share.$follower.removeStyle('visibility');
    document.body.addEventListener('click', this.eventHandler.clickOut);
  }.bind(this), 5);
};

DateTimeInput.prototype._releasePicker = function () {
  if (this.share.$holdingInput !== this) return;
  this.share.$follower.remove();
  this.share.$holdingInput = null;
  this.share.$calendar.off('pick', this.eventHandler.calendarPick);
  this.share.$timePicker.off('change', this.eventHandler.timePick);
  this.share.$okBtn.off('click', this.eventHandler.clickOKBtn);
  this.share.$cancelBtn.off('click', this.eventHandler.clickCancelBtn);
  document.body.removeEventListener('click', this.eventHandler.clickOut);
  setTimeout(function () {
    this.$pickerBtn.on('click', this.eventHandler.clickPickerBtn);
  }.bind(this));
};

_ACore.default.install(DateTimeInput);

var _default = DateTimeInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DateInput2.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DateInput2.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/dateinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _datetime = require("absol/src/Time/datetime");

var _ChromeCalendar = _interopRequireDefault(require("./ChromeCalendar"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _DateInput = _interopRequireDefault(require("./DateInput"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _DateTimeInput = _interopRequireDefault(require("./DateTimeInput"));

var _utils = require("./utils");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");


var STATE_NEW = 1;
var STATE_EDITED = 2;
var STATE_NONE = 0;
/***
 *
 * @param {Date} date
 * @param level
 * @returns {Date|null}
 */

var dateByLevel = (date, level) => {
  if (!date) return null;

  switch (level) {
    case 'week':
      return (0, _datetime.beginOfWeek)(date);

    case 'month':
      return (0, _datetime.beginOfMonth)(date);

    case 'quarter':
      return (0, _datetime.beginOfQuarter)(date);

    case 'year':
      return (0, _datetime.beginOfYear)(date);

    case 'date':
    default:
      return (0, _datetime.beginOfDay)(date);
  }
};

var _ = _ACore.default._;
var $ = _ACore.default.$;
/**
 * @extends AElement
 * @constructor
 */

function DateInput2() {
  this._lastValue = null;
  this._value = null;
  this._format = 'dd/MM/yyyy';
  this.$input = $('input', this);
  this._editingData = {};
  this.startDayOfWeek = (0, _datetime.getDefaultFirstDayOfWeek)();
  this.$text = this.$input;
  this.$text.on('mousedown', this.eventHandler.mouseDownInput).on('mouseup', this.eventHandler.mouseUpInput).on('dblclick', this.eventHandler.dblclickInput).on('keydown', this.eventHandler.keydown).on('blur', this.eventHandler.inputBlur).on('contextmenu', function (event) {
    event.preventDefault();
  });
  this.$domSignal = _('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('request_auto_select', this._autoSelect.bind(this));
  this._min = new Date(1890, 0, 1, 0, 0, 0, 0);
  this._max = new Date(2090, 0, 1, 0, 0, 0, 0);
  this.$calendarBtn = $('.as-date-input-icon-ctn', this).on('click', this.eventHandler.clickCalendarBtn);
  this.$clearBtn = $('button.as-date-input-clear-btn', this).on('click', this.clear.bind(this));
  this.value = this._value;
  this.format = this._format;
  this.notNull = false;

  _OOP.default.drillProperty(this, this, 'minLimitDate', 'min');

  _OOP.default.drillProperty(this, this, 'minDateLimit', 'min');

  _OOP.default.drillProperty(this, this, 'maxLimitDate', 'max');

  _OOP.default.drillProperty(this, this, 'maxDateLimit', 'max');
}

DateInput2.tag = 'dateinput';

DateInput2.render = function () {
  //only support dd/mm/yyyy
  return _({
    class: 'as-date-input',
    extendEvent: ['change'],
    child: [{
      tag: 'input',
      class: 'as-date-input-text',
      props: {
        value: '__/__/____'
      }
    }, {
      tag: 'button',
      class: 'as-date-input-clear-btn',
      child: 'span.mdi.mdi-close-circle'
    }, {
      tag: 'button',
      class: 'as-date-input-icon-ctn',
      child: 'span.mdi.mdi-calendar'
    }]
  });
};
/**
 * @param {String} text
 */


DateInput2.prototype._verifyFormat = function (text) {
  var regex = new RegExp(_datetime.DATE_TIME_TOKEN_RGX.source, 'g');
  var tokens = text.match(regex);
  var map = {
    d: ['dd', 'd'],
    M: ['M', 'MM'],
    y: ['yy', 'yyyy'],
    Q: ['Q', 'QQ'],
    w: ['w', 'ww']
  };
  var rules = ['dMy', 'My', 'y', 'wy', 'Qy'].map(r => {
    r = r.split('');
    r.sort();
    return r.join('');
  });
  var matched = tokens.reduce((ac, cr) => {
    Object.keys(map).some(key => {
      if (map[key].indexOf(cr) >= 0) {
        ac.push(key);
        return true;
      }

      return false;
    });
    return ac;
  }, []);
  matched.sort();
  matched = matched.join('');
  return rules.indexOf(matched) >= 0;
};

DateInput2.prototype._notifyIfChange = function (event) {
  var oldV = this._explicit(this._lastValue);

  var newV = this._explicit(this._value);

  if (!oldV !== !newV || oldV && newV && (0, _datetime.compareDate)(oldV, newV) !== 0) {
    this._lastValue = this._value;
    this.emit('change', {
      type: 'change',
      target: this,
      value: this._value,
      originEvent: event
    }, this);
  }
};

DateInput2.prototype.notifyChange = function () {
  this._lastValue = this._value;
  this.emit('change', {
    type: 'change',
    target: this,
    value: this._value
  }, this);
};

DateInput2.prototype.focus = function () {
  this.$input.focus();
};

DateInput2.prototype.blur = function () {
  this.$input.blur();
};

DateInput2.prototype.clear = function () {
  this._applyValue(null);

  this._notifyIfChange();
};
/***
 *
 * @param {Date|null} value
 */


DateInput2.prototype._applyValue = function (value) {
  this._value = value;

  if (!value) {
    this.$input.value = this.format;
  } else {
    this.$input.value = (0, _datetime.formatDateTime)(this._value, this._format);
  }

  this._updateNullClass();
};

DateInput2.prototype._updateNullClass = function () {
  var value = this._value;

  if (!value) {
    this.addClass('as-value-null');
  } else {
    this.removeClass('as-value-null');
  }
};

DateInput2.prototype.tokenRegex = _DateTimeInput.default.prototype.tokenRegex;
DateInput2.prototype._autoSelect = _DateTimeInput.default.prototype._autoSelect;
DateInput2.prototype._tokenAt = _DateTimeInput.default.prototype._tokenAt;
DateInput2.prototype._editNextToken = _DateTimeInput.default.prototype._editNextToken;
DateInput2.prototype._editPrevToken = _DateTimeInput.default.prototype._editPrevToken;
DateInput2.prototype._makeTokenDict = _DateTimeInput.default.prototype._makeTokenDict;

DateInput2.prototype._correctingInput = function () {
  var tkDict = this._makeTokenDict(this.$text.value);

  var min = this._min;
  var max = this._max;
  var equalMin;
  var equalMax;

  if (!isNaN(tkDict.y.value)) {
    tkDict.y.value = Math.max(min.getFullYear(), Math.min(max.getFullYear(), tkDict.y.value));
    equalMin = tkDict.y.value === min.getFullYear();
    equalMax = tkDict.y.value === max.getFullYear();
  } else {
    equalMin = false;
    equalMax = false;
  }

  if (tkDict.M && !isNaN(tkDict.M.value)) {
    tkDict.M.value = Math.max(1, Math.min(12, tkDict.M.value));

    if (equalMin) {
      tkDict.M.value = Math.max(min.getMonth() + 1, tkDict.M.value);
      equalMin = tkDict.M.value === min.getMonth() + 1;
    }

    if (equalMax) {
      tkDict.M.value = Math.min(max.getMonth() + 1, tkDict.M.value);
      equalMax = max.getMonth() + 1;
    }
  } else {
    equalMin = false;
    equalMax = false;
  }

  if (tkDict.d && !isNaN(tkDict.d.value)) {
    tkDict.d.value = Math.max(1, Math.min(31, tkDict.d.value));

    if (!isNaN(tkDict.M.value)) {
      tkDict.d.value = Math.min(tkDict.d.value, (0, _datetime.daysInMonth)(isNaN(tkDict.y.value) ? 2020 : tkDict.y.value, tkDict.M.value - 1));
    }

    if (equalMin) {
      tkDict.d.value = Math.max(min.getDate(), tkDict.d.value);
    }

    if (equalMax) {
      tkDict.d.value = Math.min(max.getDate(), tkDict.d.value);
    }
  }

  if (tkDict.w && !isNaN(tkDict.w.value)) {
    if (!isNaN(tkDict.y.value)) {
      tkDict.w.value = Math.max(1, Math.min(tkDict.w.value, 1 + (0, _datetime.weekIndexOf)((0, _datetime.prevDate)(new Date(tkDict.y.value + 1, 0, 1)), false, this._startDayOfWeek)));
    }
  }

  this.$text.value = this._applyTokenDict(this._format, tkDict);
};

DateInput2.prototype._correctingCurrentToken = function () {
  var token = this._tokenAt(this.$text.selectionStart);

  if (!token) return;
  var value;
  value = parseInt(token.text);
  var rqMin = {
    d: 1,
    dd: 1,
    M: 1,
    MM: 1,
    y: 1890,
    yyyy: 1890,
    w: 1,
    ww: 1,
    Q: 1,
    QQ: 1
  }[token.ident];
  var rqMax = {
    d: 31,
    dd: 31,
    M: 12,
    MM: 12,
    y: 2089,
    yyyy: 2089,
    w: 54,
    ww: 54,
    Q: 4,
    QQ: 4
  }[token.ident];

  if (rqMin !== undefined) {
    if (!isNaN(value)) {
      if (value < rqMin || value > rqMin) {
        value = Math.max(rqMin, Math.min(rqMax, value));
        token.replace((0, _utils.zeroPadding)(value, token.ident.length), false);
      }
    } else if (this.notNull) {
      if (token.ident.startsWith('y')) {
        value = new Date().getFullYear();
      } else {
        value = rqMin;
      }

      token.replace((0, _utils.zeroPadding)(value, token.ident.length), false);
    } else if (token.text !== token.ident) {
      token.replace(token.ident, false);
    }
  }
};
/***
 *
 * @param {Date|string|null}date
 * @return {Date|null}
 */


DateInput2.prototype._normalizeValue = function (date) {
  var temp;

  if (date === null || date === undefined || date === false) {
    return null;
  }

  if (typeof date === 'string') {
    temp = new Date(date);

    if (isNaN(temp.getTime())) {
      temp = (0, _datetime.parseDateTime)(date, this._format);
    }

    date = temp;
  } else if (typeof date === 'number') {
    date = new Date(date);
  }

  if (date.getTime && date.getHours) {
    if (isNaN(date.getTime())) {
      return null;
    } else {
      return (0, _datetime.beginOfDay)(date);
    }
  } else {
    return null;
  }
};

DateInput2.prototype._loadValueFromInput = function () {
  var tkDict = this._makeTokenDict(this.$text.value);

  var y = tkDict.y ? tkDict.y.value : new Date().getFullYear();
  var m = tkDict.M ? tkDict.M.value - 1 : 0;
  var d = tkDict.d ? tkDict.d.value : 1;
  var date;

  if (tkDict.w && tkDict.y) {
    date = (0, _datetime.weekInYear)(y, tkDict.w.value - 1);
  } else if (tkDict.Q && tkDict.y) {
    date = new Date(y, (tkDict.Q.value - 1) * 3, 1);
  } else {
    date = new Date(y, m, d);
  }

  if (!date || isNaN(date.getTime())) {
    this._value = null;
  } else {
    this._value = date;
  }

  this._updateNullClass();
};

DateInput2.prototype._explicit = function (value) {
  value = value || null;

  if (this.notNull) {
    value = value || new Date();
  } else if (!value) return null;

  var time = value.getTime();
  time = Math.max(this._min.getTime(), time);
  time = Math.min(this._max.getTime(), time);
  return dateByLevel(new Date(time), this.calendarLevel);
};

DateInput2.prototype._applyTokenDict = function (format, dict, debug) {
  var rgx = new RegExp(this.tokenRegex.source, 'g');
  var tokenMap = this.tokenMap;
  var res = format.replace(rgx, function (full, g1, g2, sourceText) {
    if (g1 && tokenMap[g1]) {
      var ident = tokenMap[g1];

      if (dict[ident] && !isNaN(dict[ident].value)) {
        return (0, _utils.zeroPadding)(dict[ident].value, g1.length);
      } else {
        return full;
      }
    } else return full;
  });
  return res;
};

DateInput2.prototype.focus = function () {
  this.$text.focus();
  this.$text.select();
};

DateInput2.prototype.tokenMap = {
  d: 'd',
  dd: 'd',
  M: 'M',
  MM: 'M',
  y: 'y',
  yyyy: 'y',
  ww: 'w',
  Q: 'Q',
  QQ: 'Q'
};
/**
 * @type {DateInput2}
 */

DateInput2.eventHandler = {};

DateInput2.eventHandler.keydown = function (event) {
  if (this.readOnly) {
    if (!event.ctrlKey || event.key !== 'c') {
      event.preventDefault();
    }

    return;
  }

  var token = this._tokenAt(this.$text.selectionStart);

  var endToken = this._tokenAt(this.$text.selectionEnd);

  if (!token) {
    if (event.key === 'Enter') {
      this._correctingInput();

      this._loadValueFromInput();

      this._notifyIfChange(event);
    }

    return;
  }

  var newTokenText;
  var value;

  if (event.key.startsWith('Arrow') || event.key.match(/^[\-/,\s]$/)) {
    event.preventDefault();

    switch (event.key) {
      case 'ArrowLeft':
        this._editPrevToken();

        break;

      case 'ArrowRight':
      case '-':
      case ',':
      case '/':
      case ' ':
        this._editNextToken();

        break;

      case 'ArrowUp':
      case 'ArrowDown':
        switch (token.ident) {
          case 'dd':
          case 'd':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.d = event.key === 'ArrowUp' ? 1 : 31;
            } else {
              this._editingData.d = 1 + (value + (event.key === 'ArrowUp' ? 0 : 29)) % 31;
            }

            newTokenText = '' + this._editingData.d;

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case 'w':
          case 'ww':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.w = event.key === 'ArrowUp' ? 1 : 54;
            } else {
              this._editingData.w = 1 + (value + (event.key === 'ArrowUp' ? 0 : 52)) % 54;
            }

            newTokenText = (0, _utils.zeroPadding)(this._editingData.w, token.ident.length);
            token.replace(newTokenText, true);
            break;

          case 'Q':
          case 'QQ':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.Q = event.key === 'ArrowUp' ? 1 : 4;
            } else {
              this._editingData.Q = 1 + (value + (event.key === 'ArrowUp' ? 0 : 2)) % 4;
            }

            newTokenText = (0, _utils.zeroPadding)(this._editingData.Q, token.ident.length);
            token.replace(newTokenText, true);
            break;

          case 'MM':
          case 'M':
            value = parseInt(token.text) - 1;

            if (isNaN(value)) {
              this._editingData.M = event.key === 'ArrowUp' ? 0 : 11;
            } else {
              this._editingData.M = (value + (event.key === 'ArrowUp' ? 1 : 11)) % 12;
            }

            newTokenText = '' + (this._editingData.M + 1);

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case 'yyyy':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.y = new Date().getFullYear();
            } else {
              this._editingData.y = Math.max(1890, Math.min(2089, value + (event.key === 'ArrowUp' ? 1 : -1)));
            }

            newTokenText = this._editingData.y + '';

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;
        }

    }
  } else if (event.key === "Delete" || event.key === 'Backspace') {
    event.preventDefault();

    if (endToken.idx !== token.idx) {
      if (this.notNull) {
        this.$text.value = (0, _datetime.formatDateTime)(new Date(Math.min(this.max.getTime(), Math.max(this.min.getTime(), new Date().getTime()))), this._format);
      } else {
        this.$text.value = this._format;
      }

      this.$text.select();
    } else {
      if (this.notNull) {
        switch (token.ident) {
          case 'y':
          case 'yyyy':
            token.replace((0, _utils.zeroPadding)(new Date().getFullYear(), token.ident.length), true);
            break;

          case 'w':
          case 'ww':
          case 'Q':
          case 'QQ':
            token.replace((0, _utils.zeroPadding)(1, token.ident.length), true);
            break;

          case 'M':
          case 'MM':
          case 'd':
          case 'dd':
            token.replace((0, _utils.zeroPadding)(1, token.ident.length), true);
            break;

          default:
            token.replace(token.ident, true);
        }
      } else {
        token.replace(token.ident, true);
      }

      if (event.key === "Delete") this._editNextToken();else this._editPrevToken();
    }
  } else if (event.key === "Enter" || event.key === 'Tab') {
    this._correctingInput();

    this._loadValueFromInput();

    this._notifyIfChange(event);
  } else if (event.ctrlKey) {
    switch (event.key) {
      case 'a':
      case 'A':
        break;

      case 'c':
      case 'C':
        break;

      case 'x':
      case 'X':
        this.domSignal.once('clear_value', function () {
          this.$text.value = this._format;
          this.$text.select();
        }.bind(this));
        this.domSignal.emit('clear_value');
        break;

      default:
        event.preventDefault();
    }
  } else if (event.key.match(/^[0-9]$/g)) {
    event.preventDefault();
    var dVal = parseInt(event.key);

    if (this._editingData.state === STATE_NEW) {
      switch (token.ident) {
        case 'dd':
        case 'd':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;
          this._editingData.d = dVal;

          if (dVal > 3) {
            this._editNextToken();
          }

          break;

        case 'w':
        case 'ww':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;
          this._editingData.d = dVal;

          if (dVal > 6) {
            this._editNextToken();
          }

          break;

        case 'Q':
        case 'QQ':
          dVal = Math.max(1, Math.min(dVal, 4));
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;
          this._editingData.Q = dVal;

          this._editNextToken();

          break;

        case 'MM':
        case 'M':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;
          this._editingData.M = dVal;

          if (dVal > 1) {
            this._editNextToken();
          }

          break;

        case 'yyyy':
        case 'y':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;
          this._editingData.state_num = 1;
          break;
      }
    } else {
      switch (token.ident) {
        case 'dd':
        case 'd':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(1, Math.min(31, dVal));
          this._editingData.d = dVal;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;

        case 'ww':
        case 'w':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(1, Math.min(54, dVal));
          this._editingData.d = dVal;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;

        case 'Q':
        case 'QQ':
          dVal = Math.max(1, Math.min(dVal, 4));
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.Q = dVal;

          this._editNextToken();

          break;

        case 'MM':
        case 'M':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(1, Math.min(12, dVal));
          this._editingData.M = dVal - 1;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;

        case 'yyyy':
        case 'y':
          dVal = (parseInt(token.text.replace(/^./, '')) || 0) * 10 + dVal;
          this._editingData.state_num++;

          if (this._editingData.state_num >= 4) {
            // dVal = Math.max(1890, Math.min(2089, dVal));
            token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

            this._editNextToken();
          } else {
            token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          }

          break;
      }
    }
  } else {
    event.preventDefault();
  }
};

DateInput2.eventHandler.mouseUpInput = _DateTimeInput.default.eventHandler.mouseUpInput;
DateInput2.eventHandler.mouseDownInput = _DateTimeInput.default.eventHandler.mouseDownInput;
DateInput2.eventHandler.dblclickInput = _DateTimeInput.default.eventHandler.dblclickInput;
DateInput2.eventHandler.inputBlur = _DateTimeInput.default.eventHandler.inputBlur;

DateInput2.eventHandler.calendarSelect = function (value) {
  var oldV = this._explicit(this._lastValue);

  this.value = value;

  var newV = this._explicit(this._value);

  if (!oldV !== !newV || oldV && newV && (0, _datetime.compareDate)(oldV, newV) !== 0) {
    this.emit('change', {
      type: 'change',
      target: this,
      value: this._value
    }, this);
  }
};

DateInput2.eventHandler.clickCalendarBtn = function () {
  if (this.readOnly) return;

  this._attachCalendar();
};

DateInput2.eventHandler.clickOut = function (event) {
  if ((0, _EventEmitter.hitElement)(this.share.$calendar, event)) return;

  this._releaseCalendar();
};

DateInput2.eventHandler.calendarPick = function (event) {
  this._applyValue(event.value);

  this._notifyIfChange(event.originEvent || event);

  this._releaseCalendar();
};

DateInput2.property = {};
DateInput2.property.value = {
  set: function (value) {
    value = this._normalizeValue(value);
    if (!value && this.notNull) value = (0, _datetime.beginOfDay)(new Date());
    this._lastValue = value;

    this._applyValue(value);
  },
  get: function () {
    return this._explicit(this._value);
  }
};
/**
 * not support MMM, MMMM, support number only
 * @type {DateInput2}
 */

DateInput2.property.format = {
  set: function (value) {
    value = value || 'dd/MM/yyyy';
    value = value.replace(new RegExp(_datetime.DATE_TIME_TOKEN_RGX.source, 'g'), function (full) {
      if (full === 'mm' || full === 'MMM' || full === 'MMMM' || full === 'mmm' || full === 'mmmm') return 'MM';
      if (full === 'm') return 'M';
      return full;
    });

    if (!this._verifyFormat(value)) {
      value = 'dd/MM/yyyy';
      console.error("Invalid date format: " + value);
    }

    this._format = value;
    this._formatTokens = this._format.match(new RegExp(_datetime.DATE_TIME_TOKEN_RGX.source, 'g')) || [];
    this.value = this.value; //update
  },
  get: function () {
    return this._format;
  }
};
DateInput2.property.disabled = {
  set: function (value) {
    value = !!value;
    this.$input.disabled = value;
    if (value) this.addClass('as-disabled');else this.removeClass('as-disabled');
    this.$text.disabled = value;
  },
  get: function () {
    return this.$input.disabled;
  }
};
DateInput2.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
      this.$input.readOnly = true;
    } else {
      this.removeClass('as-read-only');
      this.$input.readOnly = false;
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
DateInput2.property.text = {
  get: function () {
    return this.$input.value;
  }
};
DateInput2.property.calendarLevel = {
  /***
   * @memberOf DateInput2
   * @name calendarLevel
   * @type {number}
   */
  get: function () {
    if (this._formatTokens.indexOf('d') >= 0 || this._formatTokens.indexOf('dd') >= 0) return 'day';
    if (this._formatTokens.indexOf('w') >= 0 || this._formatTokens.indexOf('ww') >= 0) return 'week';
    if (this._formatTokens.indexOf('M') >= 0 || this._formatTokens.indexOf('MM') >= 0) return 'month';
    if (this._formatTokens.indexOf('Q') >= 0 || this._formatTokens.indexOf('QQ') >= 0) return 'quarter';
    return 'year';
  }
};
DateInput2.property.min = {
  set: function (value) {
    this._min = this._normalizeValue(value) || new Date(1890, 0, 1);
  },
  get: function () {
    return this._min;
  }
};
DateInput2.property.max = {
  set: function (value) {
    this._max = this._normalizeValue(value) || new Date(2090, 0, 1);
  },
  get: function () {
    return this._max;
  }
};
DateInput2.property.notNull = {
  set: function (value) {
    if (value) {
      this.addClass('as-must-not-null');
      if (!this.value) this.value = new Date();
    } else {
      this.removeClass('as-must-not-null');
    }

    this.value = this.value; //update
  },
  get: function () {
    return this.hasClass('as-must-not-null');
  }
};
DateInput2.prototype.share = {
  /***
   * @type {ChromeCalendar}
   */
  $calendar: null,

  /***
   * @type {Follower}
   */
  $follower: null,

  /***
   * @type {DateInput2}
   */
  $holdingInput: null
};

DateInput2.prototype._prepareCalendar = function () {
  if (this.share.$calendar) return;
  this.share.$calendar = _({
    tag: 'chromecalendar',
    class: ['as-date-input-calendar', 'as-dropdown-box-common-style']
  });
  this.share.$follower = _({
    tag: 'follower',
    class: 'as-date-input-follower',
    child: this.share.$calendar
  });
};

DateInput2.prototype._attachCalendar = function () {
  this._prepareCalendar();

  if (this.share.$holdingInput) this.share.$holdingInput._releaseCalendar();
  this.share.$follower.addTo(document.body);
  this.share.$follower.addStyle('visibility', 'hidden');
  this.share.$holdingInput = this;
  this.share.$follower.followTarget = this;
  this.share.$calendar.level = this.calendarLevel;
  this.share.$calendar.startDayOfWeek = this.startDayOfWeek || 0;
  this.share.$calendar.min = this._min;
  this.share.$calendar.max = this._max;
  this.share.$calendar.on('pick', this.eventHandler.calendarPick);
  this.share.$calendar.selectedDates = this.value ? [this.value] : [];
  this.share.$calendar.viewDate = this.value ? this.value : new Date(Math.max(this._min.getTime(), Math.min(this._max.getTime(), new Date().getTime())));
  setTimeout(function () {
    document.body.addEventListener('click', this.eventHandler.clickOut);
    this.share.$follower.removeStyle('visibility');
  }.bind(this), 5);
  this.$calendarBtn.off('click', this.eventHandler.clickCalendarBtn);
};

DateInput2.prototype._releaseCalendar = function () {
  if (this.share.$holdingInput !== this) return;
  this.share.$calendar.off('pick', this.eventHandler.calendarPick);
  this.share.$follower.remove();
  document.body.removeEventListener('click', this.eventHandler.clickOut);
  setTimeout(function () {
    this.$calendarBtn.on('click', this.eventHandler.clickCalendarBtn);
  }.bind(this), 5);
  this.share.$holdingInput = null;
};

_ACore.default.install(DateInput2);

var _default = DateInput2;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/PositionTracker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/PositionTracker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _Element = _interopRequireDefault(require("absol/src/HTML5/Element"));


/***
 * @extends {AElement}
 * @constructor
 */
function PositionTracker() {
  this.defineEvent('positionchange');
  this.$trackScrollParents = [];
  this._scrollTrackEventHandler = this.notifyPositionChange.bind(this);
}

PositionTracker.tag = 'PositionTracker'.toLowerCase();
/***
 *
 * @return {AElement}
 */

PositionTracker.render = function () {
  return _('div');
};

PositionTracker.prototype.notifyPositionChange = function (event) {
  this.emit('positionchange', {
    type: 'positionchange',
    originEvent: event
  });
};

PositionTracker.prototype.startTrackPosition = function () {
  if (this.$trackScrollParents.length > 0) this.stopTrackPosition();
  var trackElt = this;

  while (trackElt) {
    if (trackElt.addEventListener) trackElt.addEventListener('scroll', this._scrollTrackEventHandler, false);else trackElt.attachEvent('onscroll', this._scrollTrackEventHandler, false);
    this.$trackScrollParents.push(trackElt);
    trackElt = trackElt.parentElement;
  }

  if (document.addEventListener) {
    document.addEventListener('scroll', this._scrollTrackEventHandler, false);
  } else {
    document.attachEvent('onscroll', this._scrollTrackEventHandler, false);
  }

  this.$trackScrollParents.push(document);
};

PositionTracker.prototype.stopTrackPosition = function () {
  var trackElt;

  for (var i = 0; i < this.$trackScrollParents.length; ++i) {
    trackElt = this.$trackScrollParents[i];
    if (trackElt.removeEventListener) trackElt.removeEventListener('scroll', this._scrollTrackEventHandler, false);else trackElt.dettachEvent('onscroll', this._scrollTrackEventHandler, false);
  }

  this.$trackScrollParents = [];
};

_ACore.default.install(PositionTracker);

var _default = PositionTracker;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DraggableVStack.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DraggableVStack.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

require("../css/draggablestack.css");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Hanger = _interopRequireDefault(require("./Hanger"));

var _utils = require("./utils");

var _stringGenerate = require("absol/src/String/stringGenerate");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _PositionTracker = _interopRequireDefault(require("./PositionTracker"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @augments Hanger
 * @augments PositionTracker
 * @constructor
 */

function DraggableVStack() {
  _({
    tag: 'PositionTracker'.toLowerCase(),
    elt: this
  });

  this.$cloneContainer = _('.absol-draggable-stack-clone-container');
  this.on('predrag', this.eventHandler.predrag).on('dragstart', this.eventHandler.dragstart).on('drag', this.eventHandler.drag).on('dragend', this.eventHandler.dragend);
  this._state = 0;
  this.friends = [];
  this.$friends = [];
  this._privateDraggableVStackIdent = (0, _stringGenerate.randomIdent)(35);
  this._dragData = null;
  this.on('positionchange', this.eventHandler.scroll);
}

DraggableVStack.tag = 'DraggableVStack'.toLowerCase();

DraggableVStack.render = function () {
  return _({
    tag: 'hanger',
    extendEvent: ['change', 'orderchange', 'itemleave', 'itementer'],
    class: ['absol-draggable-stack', 'absol-draggable-vstack']
  });
};

DraggableVStack.prototype._updateFriends = function () {
  var dict = {};
  dict[this._privateDraggableVStackIdent] = this;
  this.$friends = this.friends.reduce(function (ac, cr) {
    if (_Dom.default.isDomNode(cr)) {
      if (cr._privateDraggableVStackIdent) {
        ac.result.push(cr);
        ac.dict[cr._privateDraggableVStackIdent] = cr;
      }
    } else if (typeof cr === 'string') {
      $(cr, false, function (elt) {
        if (elt._privateDraggableVStackIdent) {
          if (!ac.dict[elt._privateDraggableVStackIdent]) {
            ac.result.push(elt);
            ac.dict[elt._privateDraggableVStackIdent] = elt;
          }
        }
      });
    }

    return ac;
  }, {
    dict: dict,
    result: []
  }).result;
};

DraggableVStack.prototype._findIndex = function (clientY) {
  var childBounds = Array.prototype.map.call(this.childNodes, function (elt) {
    return elt.getBoundingClientRect();
  });
  var childTops = childBounds.map(function (b) {
    return b.top;
  });
  childTops.push((childBounds[childBounds.length - 1] || this.getBoundingClientRect()).bottom);
  var nearestIdx = 0;
  var nearestVal = 10000000;
  var val;

  for (var i = 0; i < childTops.length; ++i) {
    val = Math.abs(clientY - childTops[i]);

    if (val < nearestVal) {
      nearestVal = val;
      nearestIdx = i;
    }
  }

  return nearestIdx;
};
/***
 *
 * @type {DraggableVStack|{}}
 */


DraggableVStack.eventHandler = {};

DraggableVStack.eventHandler.predrag = function (event) {
  var dragzone = this._findDragzone(event.target);

  if (!dragzone) {
    event.cancel();
  }
};

DraggableVStack.eventHandler.dragstart = function (event) {
  this.startTrackPosition();
  event.preventDefault();

  this._updateFriends();

  this._state = 1;
  this.addClass('as-state-drag');
  this._dragData = {
    mouseStartPos: new _Vec.default(event.clientX, event.clientY),
    elt: this._findDirectChild(event.target),
    rootBound: this.getBoundingClientRect(),
    dest: this
  };
  this._dragData.mouseCurrentPos = this._dragData.mouseStartPos;

  this._updateDestChildrenBound();

  this._dragData.idx = Array.prototype.indexOf.call(this.childNodes, this._dragData.elt);
  this._dragData.eltBound = this._dragData.destChildBounds[this._dragData.idx];
  this._dragData.offsetPos = this._dragData.mouseStartPos.sub(new _Vec.default(this._dragData.eltBound.left, this._dragData.eltBound.top));
  this._dragData.eltRelative = new _Vec.default(this._dragData.eltBound.left, this._dragData.eltBound.top).sub(new _Vec.default(this._dragData.rootBound.left, this._dragData.rootBound.top));
  this.$cloneContainer.addTo(document.body);
  this.$cloneContainer.clearChild().addChild($(this._dragData.elt.cloneNode(true)).addStyle({
    boxSizing: 'border-box',
    width: this._dragData.eltBound.width + 'px',
    height: this._dragData.eltBound.height + 'px'
  }));
  this.$cloneContainer.addStyle({
    left: this._dragData.eltBound.left + 'px',
    top: this._dragData.eltBound.top + 'px'
  });

  this._dragData.elt.addClass('dragging');
};

DraggableVStack.eventHandler.drag = function (event) {
  event.preventDefault();
  this._dragData.mouseCurrentPos = new _Vec.default(event.clientX, event.clientY);

  this._updateHoverDest();

  this._updateDraggingPosition();

  this.eventHandler.dragOverflow(event);
};

DraggableVStack.prototype.getClientY = function () {
  var top = 1000000;
  var bottom = -10000000;
  var child;
  var childBound;

  for (var i = 0; i < this.childNodes.length; ++i) {
    child = this.childNodes[i];
    if (child === this.$cloneContainer) continue;

    if (child.getBoundingClientRect) {
      childBound = child.getBoundingClientRect();
      top = Math.min(top, childBound.top);
      bottom = Math.max(bottom, childBound.bottom);
    }
  }

  return {
    top: top,
    bottom: bottom
  };
};

DraggableVStack.eventHandler.dragOverflow = function (event) {
  var scroller = this;

  while (scroller) {
    var overflowStyle = window.getComputedStyle(scroller)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'scroll' || scroller.tagName === 'HTML') && scroller.clientHeight < scroller.scrollHeight) break;
    scroller = scroller.parentElement;
  }

  if (!scroller) return;
  var outBound = scroller.getBoundingClientRect();
  var bBound = this.$cloneContainer.getBoundingClientRect();

  var screenSize = _Dom.default.getScreenSize();

  if (scroller.tagName !== "HTML") {
    outBound = {
      top: Math.max(outBound.top, 0),
      bottom: Math.min(outBound.bottom, screenSize.height)
    };
  } else {
    outBound = {
      top: 0,
      bottom: screenSize.height
    };
  }

  var vy = 0;

  if (bBound.top < outBound.top) {
    vy = bBound.top - outBound.top;
  } else if (bBound.bottom > outBound.bottom) {
    vy = bBound.bottom - outBound.bottom;
  }

  var dt = 1 / 30;

  if (vy !== 0) {
    var copyEvent = {
      type: event.type,
      preventDefault: function () {
        /* noop */
      },
      target: event.target
    };
    copyEvent.clientX = event.clientX;
    copyEvent.clientY = event.clientY;
    var thisBT = this;
    setTimeout(function () {
      if (scroller.scrollHeight > scroller.clientHeight) {
        scroller.scrollTop += (0, _utils.absCeil)(vy * dt);
      }

      if (thisBT._state === 1) {
        thisBT.eventHandler.dragOverflow(copyEvent);
      }
    }, dt * 1000);
  }
};

DraggableVStack.eventHandler.scroll = function (event) {
  this._updateDraggingPosition();
};

DraggableVStack.eventHandler.dragend = function (event) {
  this.stopTrackPosition();
  event.preventDefault();

  this._dragData.dest.removeClass('as-state-drag');

  this.$cloneContainer.remove();

  this._dragData.elt.removeClass('dragging');

  this.removeClass('as-state-no-change');
  this._state = 0;
  var beforeElt;

  if (this._dragData.dest === this) {
    if (this._dragData.idx === this._dragData.destIdx || this._dragData.idx + 1 === this._dragData.destIdx) {//todo
    } else {
      if (this._dragData.destIdx === this.childNodes.length) {
        this._dragData.elt.remove();

        this.addChild(this._dragData.elt);
        this.emit('change', {
          type: 'change',
          fromStack: this,
          toStack: this,
          elt: this._dragData.elt,
          sourceIndex: this._dragData.idx,
          destIndex: this.childNodes.length,
          oldIdx: this._dragData.idx,
          newIdx: this.childNodes.length - 1,
          desc: "Move element to end of stack."
        }, this);
        this.emit('orderchange', {
          type: 'orderchange',
          fromStack: this,
          toStack: this,
          elt: this._dragData.elt,
          oldIdx: this._dragData.idx,
          newIdx: this.childNodes.length - 1,
          desc: "Move element to end of stack."
        }, this);
      } else {
        beforeElt = this.childNodes[this._dragData.destIdx];

        this._dragData.elt.remove();

        this.addChildBefore(this._dragData.elt, beforeElt);
        this.emit('change', {
          type: 'change',
          fromStack: this,
          toStack: this,
          elt: this._dragData.elt,
          sourceIndex: this._dragData.idx,
          destIndex: this._dragData.destIdx,
          oldIdx: this._dragData.idx,
          newIdx: this._dragData.destIdx > this._dragData.idx ? this._dragData.destIdx - 1 : this._dragData.destIdx,
          desc: "Move element to before  this.childNodes[" + this._dragData.destIdx + "]"
        }, this);
        this.emit('orderchange', {
          type: 'orderchange',
          fromStack: this,
          toStack: this,
          elt: this._dragData.elt,
          oldIdx: this._dragData.idx,
          newIdx: this._dragData.destIdx > this._dragData.idx ? this._dragData.destIdx - 1 : this._dragData.destIdx,
          desc: "Move element to before  this.childNodes[" + this._dragData.destIdx + "]"
        }, this);
      }
    }
  } else {
    if (this._dragData.destIdx === this._dragData.dest.childNodes.length) {
      this.emit('orderchange', {
        type: 'itemleave',
        fromStack: this,
        toStack: this._dragData.dest,
        oldIdx: this._dragData.idx,
        newIdx: this.childNodes.length - 1,
        desc: "Move element to end of friend stack."
      }, this);

      this._dragData.elt.remove();

      this._dragData.dest.addChild(this._dragData.elt);

      this._dragData.dest.emit('orderchange', {
        type: 'itementer',
        fromStack: this,
        toStack: this._dragData.dest,
        oldIdx: this._dragData.idx,
        newIdx: this.childNodes.length - 1,
        desc: "Move element to end of friend stack."
      }, this._dragData.dest);

      this.emit('change', {
        type: 'change',
        fromStack: this,
        toStack: this._dragData.dest,
        elt: this._dragData.elt,
        sourceIndex: this._dragData.idx,
        destIndex: this.childNodes.length,
        oldIdx: this._dragData.idx,
        newIdx: this.childNodes.length - 1,
        desc: "Move element to end of friend stack."
      });
    } else {
      beforeElt = this._dragData.dest.childNodes[this._dragData.destIdx];

      this._dragData.elt.remove();

      this.emit('itemleave', {
        type: 'itemleave',
        fromStack: this,
        toStack: this._dragData.dest,
        elt: this._dragData.elt,
        oldIdx: this._dragData.idx,
        newIdx: this._dragData.destIdx,
        desc: "Move element to before friend.childNodes[" + this._dragData.destIdx + "]"
      }, this);

      this._dragData.dest.addChildBefore(this._dragData.elt, beforeElt);

      this._dragData.dest.emit('itementer', {
        type: 'itementer',
        fromStack: this,
        toStack: this._dragData.dest,
        elt: this._dragData.elt,
        oldIdx: this._dragData.idx,
        newIdx: this._dragData.destIdx,
        desc: "Move element to before friend.childNodes[" + this._dragData.destIdx + "]"
      }, this._dragData.dest);

      this.emit('change', {
        type: 'change',
        fromStack: this,
        toStack: this._dragData.dest,
        elt: this._dragData.elt,
        sourceIndex: this._dragData.idx,
        destIndex: this._dragData.destIdx,
        oldIdx: this._dragData.idx,
        newIdx: this._dragData.destIdx,
        desc: "Move element to before friend.childNodes[" + this._dragData.destIdx + "]"
      }, this);
    }
  }
};

DraggableVStack.prototype._updateDestChildrenBound = function () {
  var top0 = this._dragData.dest.getBoundingClientRect().top;

  this._dragData.destChildBounds = Array.prototype.map.call(this._dragData.dest.childNodes, function (elt) {
    return elt.getBoundingClientRect();
  });
  this._dragData.destChildTops = this._dragData.destChildBounds.map(function (bound) {
    return bound.top - top0;
  }).concat([(this._dragData.destChildBounds[this._dragData.destChildBounds.length - 1] || this.getBoundingClientRect()).bottom - top0]);
};

DraggableVStack.prototype._updateHoverDest = function () {
  var bound;
  var newDest;
  var friendElt;
  var friendList = this.$friends.concat([this]);
  var top0;

  for (var i = 0; i < friendList.length; ++i) {
    friendElt = friendList[i];
    bound = _Rectangle.default.fromClientRect(friendElt.getBoundingClientRect());

    if (bound.containsPoint(this._dragData.mouseCurrentPos)) {
      top0 = bound.y;
      newDest = friendElt;
      break;
    }
  }

  if (newDest && this._dragData.dest !== newDest) {
    this._dragData.dest.removeClass('as-state-drag');

    this._dragData.dest = newDest;

    this._dragData.dest.addClass('as-state-drag');

    this._dragData.dest.addStyle('--dest-y', 'unset');

    this._updateDestChildrenBound();
  }
};

DraggableVStack.prototype._updateDraggingPosition = function () {
  var bound = this.getBoundingClientRect();

  var clonePos = this._dragData.mouseCurrentPos.sub(this._dragData.offsetPos);

  this.$cloneContainer.addStyle({
    top: clonePos.y + 'px',
    left: bound.left + 'px'
  });
  this._dragData.destIdx = this._dragData.dest._findIndex(clonePos.y + this._dragData.eltBound.height / 2);

  this._dragData.dest.addStyle('--dest-y', this._dragData.destChildTops[this._dragData.destIdx] + 'px');

  if (this._dragData.dest === this) {
    if (this._dragData.idx === this._dragData.destIdx || this._dragData.idx + 1 === this._dragData.destIdx) {
      this.addClass('as-state-no-change');
    } else {
      this.removeClass('as-state-no-change');
    }
  }
};

DraggableVStack.prototype._autoScrollParentIfNeed = function (delta) {
  //todo: choose which element should be scroll
  if (!(delta > 0)) delta = 10000;
  var bound = this.getBoundingClientRect();
  var cloneBound = this.$cloneContainer.getBoundingClientRect();

  var outBound = _Dom.default.traceOutBoundingClientRect(this.$cloneContainer);

  if (outBound.bottom >= cloneBound.bottom && outBound.top <= cloneBound.top) return;
  var scrollables = [];
  var current = this;

  while (current) {
    var oy = window.getComputedStyle(current);
    oy = oy['overflow-y'] || oy['overflowY'];

    if (oy == 'auto' || oy == 'scroll') {
      scrollables.push(current);
    }

    current = current.parentElement;
  }

  scrollables.push(document.body.parentElement);
};

DraggableVStack.prototype._findDragzone = function (elt) {
  var result = null;

  while (elt && elt != this) {
    if (elt.classList && elt.classList.contains('drag-zone')) {
      result = elt;
      break;
    }

    elt = elt.parentNode;
  }

  if (result) {
    elt = result;

    while (elt && elt != this) {
      if (elt.classList && elt.classList.contains('absol-draggable-stack')) {
        result = null;
        break;
      }

      elt = elt.parentNode;
    }
  }

  return result;
};

DraggableVStack.prototype._findDirectChild = function (elt) {
  while (elt && elt != this) {
    if (elt.parentNode == this) return elt;
    elt = elt.parentNode;
  }

  return undefined;
};

DraggableVStack.property = {};
DraggableVStack.property.friends = {
  set: function (value) {
    if (!(value instanceof Array)) value = [value];
    this._friends = value;
  },
  get: function () {
    return this._friends;
  }
};

_ACore.default.install(DraggableVStack);

var _default = DraggableVStack;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DraggableHStack.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DraggableHStack.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

require("../css/draggablestack.css");

var _DraggableVStack = _interopRequireDefault(require("./DraggableVStack"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _PositionTracker = _interopRequireDefault(require("./PositionTracker"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @augments DraggableVStack
 * @augments PositionTracker
 * @constructor
 */

function DraggableHStack() {
  this._dragData = null;
  this.$cloneContainer = _('.absol-draggable-stack-clone-container');
  this.on('predrag', this.eventHandler.predrag).on('dragstart', this.eventHandler.dragstart).on('drag', this.eventHandler.drag).on('dragend', this.eventHandler.dragend);

  _({
    elt: this,
    tag: _PositionTracker.default
  }).on('positionchange', this._updateDraggingPosition.bind(this));
}

DraggableHStack.tag = "DraggableHStack".toLowerCase();

DraggableHStack.render = function () {
  return _({
    tag: 'hanger',
    extendEvent: 'change',
    class: ['absol-draggable-stack', 'absol-draggable-hstack']
  });
};
/***
 *
 * @param {Rectangle} rect
 * @returns {number}
 * @private
 */


DraggableHStack.prototype._findDropIdx = function (rect) {
  if (!this._dragData) return -1;
  var centerX = rect.x + rect.width / 2;

  var currentBound = _Rectangle.default.fromClientRect(this.getBoundingClientRect());

  var nearestDistance = Math.abs(centerX - currentBound.width); //end of stack

  var cDist;
  var nearestIndex = this._dragData.childBounds.length;
  var childX;

  for (var i = 0; i < this._dragData.childBounds.length; ++i) {
    childX = this._dragData.childBounds[i].x + currentBound.x - this._dragData.bound.x;
    cDist = Math.abs(centerX - childX);

    if (cDist < nearestDistance) {
      nearestDistance = cDist;
      nearestIndex = i;
    }
  }

  return nearestIndex;
};
/***
 *
 * @type {DraggableHStack|{}}
 */


DraggableHStack.eventHandler = {};
DraggableHStack.eventHandler.predrag = _DraggableVStack.default.eventHandler.predrag;

DraggableHStack.eventHandler.dragstart = function (event) {
  this.addClass('as-has-dragging');
  this.startTrackPosition();
  var mousePos = new _Vec.default(event.clientX, event.clientY);

  var elt = this._findDirectChild(event.target);

  var childBounds = Array.prototype.map.call(this.childNodes, function (e) {
    return _Rectangle.default.fromClientRect(e.getBoundingClientRect());
  });
  var eltIdx = Array.prototype.indexOf.call(this.childNodes, elt);
  var eltBound = childBounds[eltIdx];
  var eltMouseOffset = mousePos.sub(new _Vec.default(eltBound.x, eltBound.y));
  this._dragData = {
    mouseStartPos: mousePos,
    mousePos: mousePos,
    bound: _Rectangle.default.fromClientRect(this.getBoundingClientRect()),
    childBounds: childBounds,
    elt: elt,
    eltIdx: eltIdx,
    eltBound: eltBound,
    eltMouseOffset: eltMouseOffset
  };
  this.$cloneContainer.addStyle({
    left: eltBound.x + 'px',
    top: eltBound.y + 'px',
    width: eltBound.width + 'px',
    height: eltBound.height + 'px'
  }).clearChild().addChild($(elt.cloneNode(true))).addTo(document.body);
  elt.addClass('as-dragging');

  this._updateDraggingPosition();
};

DraggableHStack.eventHandler.drag = function (event) {
  event.preventDefault();
  this._dragData.mousePos = new _Vec.default(event.clientX, event.clientY);

  this._updateDraggingPosition();
};

DraggableHStack.eventHandler.dragend = function (event) {
  var thisS = this;
  this.stopTrackPosition();
  this.removeClass('as-has-dragging');

  this._dragData.elt.removeClass('as-dragging');

  if (this._dragData.destIdx == this._dragData.eltIdx || this._dragData.destIdx == this._dragData.eltIdx + 1) {
    this.$cloneContainer.addClass('as-home-going');

    this._updateDraggingPosition();

    setTimeout(function () {
      thisS.$cloneContainer.selfRemove().removeClass('as-home-going');
    }, 100);
  } else {
    if (this._dragData.destIdx === this._dragData.childBounds.length) {
      this._dragData.elt.remove();

      this.addChild(this._dragData.elt);
      this.emit('change', {
        type: 'change',
        elt: this._dragData.elt,
        sourceIndex: this._dragData.eltIdx,
        destIndex: this._dragData.childBounds.length,
        oldIdx: this._dragData.eltIdx,
        newIdx: this._dragData.childBounds.length - 1,
        desc: "Move element to end of stack."
      }, this);
    } else {
      var beforeElt = this.childNodes[this._dragData.destIdx];

      this._dragData.elt.remove();

      this.addChildBefore(this._dragData.elt, beforeElt);
      this.emit('change', {
        type: 'change',
        elt: this._dragData.elt,
        sourceIndex: this._dragData.eltIdx,
        destIndex: this._dragData.destIdx,
        oldIdx: this._dragData.eltIdx,
        newIdx: this._dragData.destIdx > this._dragData.eltIdx ? this._dragData.destIdx - 1 : this._dragData.destIdx,
        desc: "Move element to before  this.childNodes[" + this._dragData.destIdx + "]"
      }, this);
    }

    this.$cloneContainer.selfRemove().removeClass('as-home-going');
  }

  this.removeClass('as-no-change');
};

DraggableHStack.prototype._findDragzone = _DraggableVStack.default.prototype._findDragzone;
DraggableHStack.prototype._findDirectChild = _DraggableVStack.default.prototype._findDirectChild;

DraggableHStack.prototype._updateDraggingPosition = function () {
  var bound = this.getBoundingClientRect();
  var x, y;

  if (this.$cloneContainer.hasClass('as-home-going')) {
    x = this._dragData.eltBound.x - this._dragData.bound.x + bound.left;
    y = this._dragData.eltBound.y - this._dragData.bound.y + bound.top;
  } else {
    y = bound.top + (this._dragData.eltBound.y - this._dragData.bound.y);

    var newPos = this._dragData.mousePos.sub(this._dragData.eltMouseOffset);

    x = newPos.x;
  }

  this.$cloneContainer.addStyle({
    left: x + 'px',
    top: y + 'px'
  });

  var cBound = this._dragData.eltBound.clone();

  cBound.x = x;
  cBound.y = y;

  var destIdx = this._findDropIdx(cBound);

  this._dragData.destIdx = destIdx;
  var destX;

  if (destIdx >= this._dragData.childBounds.length) {
    var lastRect = this._dragData.childBounds[this._dragData.childBounds.length - 1];
    destX = lastRect.x + lastRect.width - this._dragData.bound.x;
  } else {
    destX = this._dragData.childBounds[destIdx].x - this._dragData.bound.x;
  }

  this.addStyle('--dest-x', destX + 'px');

  if (destIdx == this._dragData.eltIdx || destIdx == this._dragData.eltIdx + 1) {
    this.addClass('as-no-change');
  } else {
    this.removeClass('as-no-change');
  }
};

_ACore.default.install(DraggableHStack);

var _default = DraggableHStack;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ExpTree.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ExpTree.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ExpNode = ExpNode;
exports.ExpTree = ExpTree;
exports.ExpGroup = ExpGroup;
exports.default = void 0;

require("../css/exptree.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _utils = require("./utils");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _EventEmitter = _interopRequireWildcard(require("absol/src/HTML5/EventEmitter"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));




var _ = _ACore.default._;
var $ = _ACore.default.$;

_ACore.default.install('toggler-ico', function () {
  var res = _('<svg class="toggler-ico" width="14" height="14" version="1.1" viewBox="0 0 3.7042 3.7042" xmlns="http://www.w3.org/2000/svg" >' + '    <rect style="fill: transparent; stroke: none" x="0" y="0" width="3.7042" height="3.7042"></rect>' + '    <g transform="translate(0 -293.3)" class="toggle-close">' + '        <path d="m0.52917 293.82v2.6458l2.6458-1.3229z" />' + '    </g>' + '    <g transform="translate(0 -293.3)" class="toggle-open">' + '        <path d="m3.175 294.09-2.6458 2.1167h2.6458z"/>' + '    </g>' + '</svg>');

  return res;
});

_ACore.default.install('remove-ico', function () {
  return _('<svg class="remove-ico" width="24" height="24" viewBox="0 0 24 24">\
                <rect style="fill: transparent; stroke: none" x="0" y="0" width="24" height="24"></rect>\
                <path class="close" d="M3,16.74L7.76,12L3,7.26L7.26,3L12,7.76L16.74,3L21,7.26L16.24,12L21,16.74L16.74,21L12,16.24L7.26,21L3,16.74" />\
                <circle class="modified" cx="12" cy="12" r="10" />\
            </svg>');
});
/***
 * @extends AElement
 * @constructor
 */


function ExpNode() {
  var thisEN = this;
  this.$level = $('.absol-exp-node-level', this);
  this.$removeIcon = $('remove-ico', this).on('click', function (event) {
    thisEN.emit('pressremove', {
      target: thisEN,
      type: 'pressremove'
    }, this);
  });
  this.on('keydown', this.eventHandler.buttonKeydown);
  this.$toggleIcon = $('toggler-ico', this);
  this.on('click', event => {
    var toggleBound = this.$toggleIcon.getBoundingClientRect();

    if (toggleBound.width > 0 && event.clientX <= toggleBound.right) {
      this.emit('presstoggle', (0, _EventEmitter.copyEvent)(event, {
        target: thisEN,
        type: 'pressremove'
      }), this);
    } else if (!_EventEmitter.default.hitElement(thisEN.$removeIcon, event)) {
      this.emit('press', (0, _EventEmitter.copyEvent)(event, {
        target: thisEN,
        type: 'press'
      }), this);
    }
  });
  this.$iconCtn = $('div.absol-exp-node-ext-icon', this);
  this.$extIcon = $('img.absol-exp-node-ext-icon', this);
  this.$name = $('span.absol-exp-node-name', this);
  this.$desc = $('span.absol-exp-node-desc', this);
  (0, _utils.contenteditableTextOnly)(this.$name, function (text) {
    return text.replace(/[\\\/\|\?\:\<\>\*\r\n]/, '').trim();
  });

  _OOP.default.drillProperty(thisEN, thisEN.$extIcon, 'extSrc', 'src');

  this._level = 0;
  this.__isExpNode__ = true;
  return thisEN;
}

ExpNode.tag = 'expnode';

ExpNode.render = function () {
  return _({
    tag: 'button',
    extendEvent: ['pressremove', 'press', 'presstoggle'],
    class: 'absol-exp-node',
    child: ['.absol-exp-node-level', 'remove-ico', 'toggler-ico', 'img.absol-exp-node-ext-icon', 'div.absol-exp-node-ext-icon', 'span.absol-exp-node-name', 'span.absol-exp-node-desc']
  });
};

ExpNode.property = {};
ExpNode.property.icon = {
  set: function (value) {
    if (this.$iconP) {
      this.$iconP.remove();
      this.$iconP = undefined;
    }

    if (value && value != null) {
      var newE;

      if (!_Dom.default.isDomNode(value)) {
        newE = _(value);
      }

      this.$iconP = newE;
      this.$iconCtn.addChild(newE);
      this._icon = value;
    } else {
      this._icon = undefined;
    }
  },
  get: function () {
    return this._icon;
  }
};
ExpNode.property.level = {
  set: function (value) {
    value = value || 0;

    if (value !== this.level) {
      this._level = value || 0;
      this.$level.innerHTML = '&nbsp;'.repeat(this._level * 6);
    }
  },
  get: function () {
    return this._level || 0;
  }
};
ExpNode.property.name = {
  set: function (value) {
    value = value + '';
    this._name = value;
    this.$name.clearChild();
    if (value && value.length > 0) this.$name.addChild(_({
      text: value
    }));
  },
  get: function () {
    return this._name || '';
  }
};
ExpNode.property.desc = {
  set: function (value) {
    this._desc = (value || '') + '';
    this.$desc.clearChild();
    this.$desc.addChild(_({
      text: this._desc
    }));
  },
  get: function () {
    return this._desc || '';
  }
};
ExpNode.property.status = {
  set: function (value) {
    this.removeClass('status-open').removeClass('status-close').removeClass('status-modified').removeClass('status-removable');

    if (!value || value == 'none') {//todo
    } else if (value == 'close') {
      this.addClass('status-close');
    } else if (value == 'open') {
      this.addClass('status-open');
    } else if (value == 'removable') {
      this.addClass('status-removable');
    } else if (value == 'modified') {
      this.addClass('status-modified');
    } else {
      throw new Error('Invalid status ' + value);
    }

    this._status = value;
  },
  get: function () {
    return this._status;
  }
};
ExpNode.property.active = {
  set: function (value) {
    if (value) {
      this.addClass('as-active');
      this.addClass('active');
    } else {
      this.removeClass('as-active');
      this.removeClass('active');
    }
  },
  get: function () {
    return this.hasClass('as-active');
  }
};

ExpNode.prototype.rename = function (resolveCallback, rejectCallback) {
  var self = this;
  var span = this.$name;
  var lastName = span.innerHTML;
  span.attr('contenteditable', 'true');
  span.focus();
  document.execCommand('selectAll', false, null);

  function keydowEventHandle(event) {
    var key = event.key;

    if (key == 'Enter') {
      event.preventDefault();
      span.blur();
      span.attr('contenteditable', undefined);
    } else if (key == "ESC") {
      event.preventDefault();
      span.innerHTML = lastName;
      span.blur();
      span.attr('contenteditable', undefined);
    }
  }

  function blurEventHandle(event) {
    finish();
    var curentName = span.innerHTML.replace(/[\\\/\|\?\:\<\>\*\r\n]/, '').trim();

    if (curentName == lastName) {
      rejectCallback && rejectCallback();
    } else {
      if (curentName.length == 0) {
        span.innerHTML = lastName;
        rejectCallback && rejectCallback();
      } else {
        var res = resolveCallback && resolveCallback(curentName);

        if (res === false) {
          span.innerHTML = lastName;
        } else if (res && res.then) {
          res.then(function (result) {
            if (result === false) {
              span.innerHTML = lastName; //faile
            } else {//success
            }
          }, function () {
            //reject value
            span.innerHTML = lastName;
          });
        } else {//success
        }
      }
    }
  }

  function finish() {
    span.off('keydown', keydowEventHandle);
    span.off('blur', blurEventHandle);
    $(document.body).once('click', function () {
      setTimeout(function () {
        span.attr('contenteditable', undefined);
      }, 2);
    });
  }

  span.on('keydown', keydowEventHandle);
  span.on('blur', blurEventHandle);
};

ExpNode.prototype.findNodeBefore = function () {
  var tree = this.parentElement;
  var root;
  var prevTree;
  var res = null;

  if (tree.__isExpTree__) {
    root = tree.getRoot();
    root.visitRecursive(function (cTree) {
      if (cTree === tree) {
        res = prevTree;
      }

      prevTree = cTree;
    });
  }

  return res && res.getNode();
};

ExpNode.prototype.findNodeAfter = function () {
  var tree = this.parentElement;
  var root;
  var prevTree;
  var res = null;

  if (tree.__isExpTree__) {
    root = tree.getRoot();
    root.visitRecursive(function (cTree) {
      if (prevTree === tree) {
        res = cTree;
      }

      prevTree = cTree;
    });
  }

  return res && res.getNode();
};

ExpNode.eventHandler = {};
/****
 *
 * @param {KeyboardEvent} event
 */

ExpNode.eventHandler.buttonKeydown = function (event) {
  if (event.target === this) {
    if (!event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey) {
      var destNode;
      var tree = this.parentElement;
      var parentTree = tree && tree.getParent();

      switch (event.key) {
        case 'ArrowLeft':
          if (tree.status === 'open') {
            tree.status = 'close';
            tree.notifyStatusChange();
          } else {
            destNode = parentTree && parentTree.getNode();
          }

          break;

        case 'ArrowRight':
          if (tree.status === 'close') {
            tree.status = 'open';
            tree.notifyStatusChange();
          } else {
            destNode = this.findNodeAfter();
          }

          break;

        case 'ArrowUp':
          destNode = this.findNodeBefore();
          break;

        case 'ArrowDown':
          destNode = this.findNodeAfter();
          break;

        case 'Space':
          this.click();
          break;
      }

      if (destNode) {
        destNode.focus();
        event.preventDefault();
      }
    }
  }
};
/***
 * @extends AElement
 * @constructor
 */


function ExpTree() {
  var thisET = this;
  this.$node = $('expnode', this).on('press', function (event) {
    thisET.emit('press', Object.assign({}, {
      target: thisET,
      node: this,
      type: 'press'
    }, event), this);
  }).on('pressremove', function (event) {
    thisET.emit('pressremove', Object.assign({}, {
      target: thisET,
      node: this,
      type: 'pressremove'
    }, event), this);
  }).on('presstoggle', this.eventHandler.nodePressToggle);
  this.$itemsContainer = $('.absol-exp-items', thisET);

  _OOP.default.drillProperty(this, this.$node, ['desc', 'name', 'title', 'extSrc', 'active', 'icon']);

  this.__isExpTree__ = true;
  this._level = 0;
}

ExpTree.tag = 'ExpTree'.toLowerCase();

ExpTree.render = function () {
  return _({
    class: 'absol-exp-tree',
    extendEvent: ['press', 'pressremove', 'statuschange'],
    child: ['expnode', '.absol-exp-items']
  });
};

ExpTree.property = {};
ExpTree.property.level = {
  set: function (value) {
    value = value || 0;

    if (value != this.level) {
      this.$node.level = value;
      Array.prototype.forEach.call(this.$itemsContainer.childNodes, function (e) {
        e.level = value + 1;
      });
    }
  },
  get: function () {
    return this.$node.level;
  }
};
ExpTree.property.status = {
  set: function (value) {
    this.$node.status = value;

    if (value != 'open') {
      this.addClass('hide-children');
    } else {
      this.removeClass('hide-children');
    }
  },
  get: function () {
    return this.$node.status;
  }
};
['findChildBefore', 'findChildAfter', 'removeChild', 'clearChild'].forEach(function (key) {
  ExpTree.prototype[key] = function () {
    this.$itemsContainer[key].apply(this.$itemsContainer, arguments);
  };
});

ExpTree.prototype.addChild = function (child) {
  if (!child.__isExpTree__) throw new Error('Child node must be a ExpTree');
  child.level = this.level + 1;
  this.$itemsContainer.addChild(child);
};

ExpTree.prototype.addChildBefore = function (child, at) {
  child.level = this.level + 1;
  this.$itemsContainer.addChildBefore(child, at);
};

ExpTree.prototype.addChildAfter = function (child, at) {
  child.level = this.level + 1;
  this.$itemsContainer.addChildAfter(child, at);
};
/****
 *
 * @return {ExpTree}
 */


ExpTree.prototype.getParent = function () {
  var current = this.parentNode;

  while (current) {
    if (current.__isExpTree__) break;
    current = current.parentNode;
  }

  return current;
};
/***
 *
 * @return {ExpTree}
 */


ExpTree.prototype.getRoot = function () {
  var parent = this.getParent();
  if (!parent) return this;
  return parent.getRoot();
};

ExpTree.prototype.getNode = function () {
  return this.$node;
};

ExpTree.prototype.getChildren = function () {
  return Array.apply(null, this.$itemsContainer.childNodes);
};
/***
 *
 * @param {function(tree: ExpTree): void} cb
 */


ExpTree.prototype.visitRecursive = function (cb) {
  cb(this);
  if (this.status === 'open') Array.prototype.forEach.call(this.$itemsContainer.childNodes, function (child) {
    child.visitRecursive(cb);
  });
};

ExpTree.prototype.getPath = function () {
  var path = [];
  var current = this;

  while (current) {
    path.push(current.name);
    current = current.getParent();
  }

  return path.reverse();
};

ExpTree.prototype.accessByPath = function (path) {
  if (path.length == 0) return this;
  var childs = this.getChildren();
  var res;

  for (var i = 0; i < childs.length; ++i) {
    if (childs[i].name == path[0]) {
      res = childs[i].accessByPath(path.slice(1));
      break;
    }
  }

  return res;
};

ExpTree.prototype.toggle = function () {
  switch (this.status) {
    case 'close':
      this.status = 'open';
      break;

    case 'open':
      this.status = 'close';
      break;
  }
};

ExpTree.prototype.notifyStatusChange = function (props) {
  this.emit('statuschange', Object.assign({
    type: 'statuschange',
    target: this
  }, props), this);
};

ExpTree.eventHandler = {};

ExpTree.eventHandler.nodePressToggle = function (event) {
  this.toggle();
  this.notifyStatusChange({
    originEvent: event
  });
};
/***
 * @extends ExpTree
 * @constructor
 */


function ExpGroup() {
  this.addClass('as-exp-group');
  this.__isExpTree__ = true;
  this.name = '';
}

ExpGroup.tag = 'ExpGroup'.toLowerCase();

ExpGroup.render = function () {
  return _('div');
};
/***
 *
 * @param {function(tree: ExpTree): void} cb
 */


ExpGroup.prototype.visitRecursive = function (cb) {
  Array.prototype.forEach.call(this.childNodes, function (child) {
    child.visitRecursive(cb);
  });
};

ExpGroup.prototype.getParent = function () {
  return null;
};

ExpGroup.prototype.getRoot = function () {
  return this;
};

ExpGroup.prototype.getNode = function () {
  return null;
};

_ACore.default.install(ExpNode);

_ACore.default.install(ExpTree);

_ACore.default.install(ExpGroup);

var _default = ExpTree;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DropPanel.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DropPanel.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/droppanel.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _ExpTree = require("./ExpTree");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/**
 * @extends AElement
 * @constructor
 */

function DropPanel() {
  var thisDP = this;
  /***
   *
   * @type {ExpGroup}
   */

  this.$body = $('.absol-drop-panel-body', this);
  this.$head = $('.absol-drop-panel-head', this).on('click', thisDP.eventHandler.clickHead);
  this.$name = $('.absol-drop-panel-name', thisDP);

  _OOP.default.drillProperty(this, this.$name, 'name', 'innerHTML');

  return thisDP;
}

DropPanel.tag = 'DropPanel'.toLowerCase();

DropPanel.render = function () {
  return _({
    class: 'absol-drop-panel',
    extendEvent: ['toggle'],
    child: [{
      class: 'absol-drop-panel-head',
      child: ['toggler-ico', {
        tag: 'span',
        class: "absol-drop-panel-name"
      }]
    }, {
      tag: 'expgroup',
      class: ['absol-drop-panel-body', 'absol-bscroller']
    }]
  });
};

DropPanel.eventHandler = {};

DropPanel.eventHandler.clickHead = function (event) {
  if (!this._childOfButton(event.target)) {
    var event = {
      target: this,
      isShowed: this.show,
      preventDefault: function () {
        this.prevented = true;
      }
    };
    this.emit('toggle', event, this);

    if (!event.prevented) {
      this.toggle();
    }
  }
};

['findChildBefore', 'findChildAfter', 'removeChild', 'clearChild', 'addChild'].forEach(function (key) {
  DropPanel.prototype[key] = function () {
    this.$body[key].apply(this.$body, arguments);
  };
});

DropPanel.prototype._childOfButton = function (elt) {
  while (elt && elt != this) {
    if (elt.tagName == "BUTTON") {
      return true;
    }

    elt = elt.parentElement;
  }

  return false;
};

DropPanel.prototype.toggle = function () {
  this.show = !this.show;
};

DropPanel.property = {};
DropPanel.property.show = {
  set: function (value) {
    if (value) {
      var maxHeight = parseFloat(this.getComputedStyleValue('max-height').replace('px', ''));
      var headBound = this.$head.getBoundingClientRect();

      if (maxHeight != 'none' && maxHeight != 'auto') {
        this.$body.addStyle('max-height', maxHeight - headBound.height + 'px');
      }

      this.$body.addStyle('height', this.$body.scrollHeight + 'px');
      setTimeout(function () {
        this.$body.removeStyle('height');
        window.dispatchEvent(new Event('resize'));
      }.bind(this), 200);
      this.addClass('show');
    } else {
      this.$body.addStyle('height', this.$body.scrollHeight + 'px');
      setTimeout(function () {
        this.$body.addStyle('height', '0');
      }.bind(this), 0);
      setTimeout(function () {
        this.$body.removeStyle('height');
        window.dispatchEvent(new Event('resize'));
      }.bind(this), 200);
      this.removeClass('show');
    }
  },
  get: function () {
    return this.hasClass('show');
  }
};

_ACore.default.install(DropPanel);

var _default = DropPanel;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DropPanelStack.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DropPanelStack.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/droppanel.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/**
 * @extends AElement
 * @constructor
 */

function DropPanelStack() {
  var res = this;
  this.$attachHook = _('attachhook').on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.updateSize = res.updateSize.bind(res);
  });
  this.sync = new Promise(function (rs) {
    res.$attachHook.once('error', rs);
  });
}

DropPanelStack.tag = 'DropPanelStack'.toLowerCase();

DropPanelStack.render = function () {
  return _({
    class: 'absol-drop-panel-stack',
    child: ['attachhook']
  });
};

DropPanelStack.prototype.updateSize = function () {};

DropPanelStack.prototype.getFreeHeight = function () {
  var childNodes = this.childNodes;
  var sumHeight = 0;
  var bound = this.getBoundingClientRect();
  var childBound;

  for (var i = 0; i < childNodes.length; ++i) {
    var child = childNodes[i];

    if (child.hasClass && child.hasClass('absol-drop-panel')) {
      childBound = child.getBoundingClientRect();
      sumHeight += childBound.height;
    }
  }

  return bound.height - sumHeight;
};

DropPanelStack.prototype.addChild = function (child) {
  var self = this;

  if (child.hasClass('absol-drop-panel')) {
    //remove last event listener off other parent
    if (child.__drop_panel_toggle_listener__) {
      child.off('toggle', child.__drop_panel_toggle_listener__);
    }

    child.__drop_panel_toggle_listener__ = function (event) {
      event.preventDefault();
      self.sync = self.sync.then(function () {
        if (event.isShowed) {
          setTimeout(function () {
            child.removeStyle('max-height');
          }, 200);
          child.toggle();
        } else {
          var headBound = child.$head.getBoundingClientRect();
          var vailableHeight = self.getFreeHeight();

          if (vailableHeight > 3) {
            child.addStyle('max-height', self.getFreeHeight() + headBound.height + 'px');
            child.toggle();
          }
        }

        return new Promise(function (rs) {
          setTimeout(rs, 200);
        });
      });
    };

    child.on('toggle', child.__drop_panel_toggle_listener__);
    this.super(child);
  } else {
    throw new Error('Child element must be a DropPanel');
  }
};

_ACore.default.install('droppanelstack', DropPanelStack);

var _default = DropPanelStack;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/EditableText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/EditableText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/editabletext.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function EditableText() {
  var thisET = this;
  this.$span = $('span', this);
  this.$text = document.createTextNode('');
  this.$span.addChild(this.$text);
  this.$higne = $('.absol-editabe-text-higne', this);
  this.$input = $('input', this);

  _OOP.default.drillProperty(this, this.$input, ['selectionStart', 'selectionEnd']);

  this.sync = new Promise(function (rs) {
    _('attachhook').addTo(thisET).once('error', rs);
  });
  this.$input.on('keydown', this.eventHandler.inputKeyDown, true);
  this.$input.on('change', this.eventHandler.inputChange);
  this.$input.on('blur', this.eventHandler.inputBlur);
}

;
EditableText.tag = 'EditableText'.toLowerCase();

EditableText.render = function () {
  return _({
    class: 'absol-editabe-text',
    extendEvent: ['blur', 'focus', 'change', 'modify'],
    child: [{
      class: 'absol-editabe-text-higne',
      child: '<input type="text">'
    }, 'span']
  });
};

EditableText.prototype.focus = function () {
  this.$input.focus();
};

EditableText.prototype.blur = function () {
  this.$input.blur();
};

EditableText.prototype.select = function () {
  this.$input.select();
};

EditableText.prototype.edit = function (flag, select) {
  this.editing = !!flag;
  this.sync = this.sync.then(function () {
    if (flag) {
      this.focus();
      if (select) this.select();
    } else this.blur();
  }.bind(this));
  return this.sync;
};

EditableText.prototype._update = function () {
  this.sync = this.sync.then(function () {
    return new Promise(function (rs) {
      // setTimeout(function () {
      var bound = this.getBoundingClientRect();
      var higneBound = this.$higne.getBoundingClientRect();
      var fsize = this.getFontSize();
      this.$input.addStyle('width', bound.width + 4 + fsize * 0 + 'px');
      this.$input.addStyle('height', bound.height + 4 + 'px');
      this.$input.addStyle('left', bound.left - higneBound.left - 2 + 'px');
      this.$input.addStyle('top', bound.top - higneBound.top + 'px');
      rs();
    }.bind(this));
  }.bind(this));
};

EditableText.property = {};
EditableText.property.text = {
  set: function (value) {
    this.$text.textContent = value;
    this.$input.value = value;
  },
  get: function () {
    return this.$text.textContent;
  }
};
EditableText.property.editing = {
  set: function (value) {
    if (this._editting === value) return;
    this._editting = !!value;

    if (value) {
      this.$input.value = this.text;

      this._update();

      this.sync = this.sync.then(function () {
        this.addClass('editing');
        this.$input.value = this.text;
        this.$input.addStyle('font', this.$span.getComputedStyleValue('font'));
        this.$input.addStyle('font-style', this.$span.getComputedStyleValue('font-style'));
        this.$input.addStyle('color', this.$span.getComputedStyleValue('color'));
      }.bind(this));
    } else {
      this.removeClass('editing');
    }
  },
  get: function () {
    return !!this._editting;
  }
};
EditableText.eventHandler = {};

EditableText.eventHandler.inputKeyDown = function (event) {
  requestAnimationFrame(function () {
    this.text = this.$input.value;

    this._update();

    event.text = this.text;
    this.emit('modify', event);
  }.bind(this));
};

EditableText.eventHandler.inputChange = function (event) {
  this.editing = false;
  this.emit('change', event);
};

EditableText.eventHandler.inputBlur = function (event) {
  this.editing = false;
  this.emit('blur', event);
};

_ACore.default.install(EditableText);

var _default = EditableText;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Sprite.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Sprite.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.STATE_TO_STRING = exports.ERROR = exports.STOP = exports.PAUSE = exports.RUNNING = exports.START = exports.READY = exports.NOT_READY = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var NOT_READY = 0;
exports.NOT_READY = NOT_READY;
var READY = 1;
exports.READY = READY;
var START = 2;
exports.START = START;
var RUNNING = 3;
exports.RUNNING = RUNNING;
var PAUSE = 4;
exports.PAUSE = PAUSE;
var STOP = 5;
exports.STOP = STOP;
var ERROR = 6;
exports.ERROR = ERROR;
var STATE_TO_STRING = ['NOT_READY', 'READY', 'START', 'RUNNING', 'PAUSE', 'STOP', 'ERROR'];
/**
 * @augments AElement
 * @augments HTMLCanvasElement
 * @constructor
 */

exports.STATE_TO_STRING = STATE_TO_STRING;

function Sprite() {
  this.loadTextureTimeout = 5000;
  this._textureLoaded = false;
  this._state = NOT_READY;
  this.defineEvent(['ready', 'srcerror', 'play', 'resume', 'pause', 'stop', 'reset', 'end', 'frame']);
  this._length = 60;
  this._lastDrawFrame = -1;
  this._frameIndex = 0;
  this._timeout = -1;
  this.ctx = this.getContext('2d');
  this._fps = 10;
  this._lastDrawMilis = 0;
  this._overTime = 0;
  this.draw = this.draw.bind(this);
  this.texture = null;
  this._frames = {
    type: 'grid',
    col: 1,
    row: 1
  };
  this._loop = false;
}

Sprite.cache = {};

Sprite.prototype.draw = function () {
  //todo
  var now = new Date().getTime();
  var dt = this._overTime + now - this._lastDrawMilis;
  var di = Math.floor(dt / 1000 * this._fps);
  var frameIndex = this._frameIndex + di;

  if (this._loop) {
    frameIndex = frameIndex % this._length;
  } else {
    frameIndex = Math.min(this._length - 1, frameIndex);
  }

  if (!isNaN(this._frameIndex) && frameIndex != this._frameIndex) {
    this.drawFrame(this._frameIndex);
  }

  this._overTime = dt - di * 1000 / this._fps;
  var nextTime = now + 1000 / this._fps - this._overTime - new Date().getTime();
  this._lastDrawMilis = now;
  this._frameIndex = frameIndex;
  this._timeout = -1;

  if (this._loop || frameIndex + 1 < this._length) {
    if (this._state == RUNNING) this._timeout = setTimeout(this.draw, nextTime);
  } else this.stop();
};

Sprite.prototype.drawFrame = function (index) {
  if (this._lastDrawFrame == index) return;
  this._lastDrawFrame = index;
  this.ctx.clearRect(0, 0, this.width, this.height);

  if (this._frames.type == 'grid') {
    var imgWidth = this.texture.naturalWidth;
    var imgHeight = this.texture.naturalHeight;
    var sHeight = imgHeight / this._frames.row;
    var sWidth = imgWidth / this._frames.col;
    var sx = index % this._frames.col * sWidth;
    var sy = Math.floor(index / this._frames.col) * sHeight;
    this.ctx.drawImage(this.texture, sx, sy, sWidth, sHeight, 0, 0, this.width, this.height);
  } else {}

  this.emit('frame', {
    name: 'frame',
    target: this,
    frameIndex: index
  }, this);
};

Sprite.prototype.stop = function () {
  this.pause();
  if (this._state != PAUSE) return this;
  this._state = STOP;
  this.emit('stop', {
    name: 'stop',
    target: this
  }, this);
  return this;
};

Sprite.prototype.pause = function () {
  if (this._state != RUNNING) return this;
  this._state = PAUSE;

  if (this._timeout > 0) {
    clearTimeout(this._timeout);
    this._timeout = -1;
  }

  var now = new Date().getTime();
  this._overTime += now - this._lastDrawMilis;
  this.emit('pause', {
    name: 'pause',
    target: this
  }, this);
};

Sprite.prototype.resume = function () {
  if (this._state != START && this._state != PAUSE) return this;
  if (this._state == RUNNING) return this;
  this._state = RUNNING;
  var now = new Date().getTime();
  this._lastDrawMilis = now;
  this.draw();
  this.emit('resume', {
    name: 'pause',
    target: this
  }, this);
};

Sprite.prototype.reset = function () {
  this._frameIndex = 0;
  this._overTime = 0;
};

Sprite.prototype.play = function () {
  if (this._state == ERROR) return this;
  if (this._state == RUNNING) return this;

  if (this._state == READY || this._state == STOP) {
    this.reset();
  }

  this._state = START;
  this.emit('play', {
    name: 'start',
    target: this
  }, this);
  this.resume();
  return this;
};

Sprite.prototype.afterReady = function () {
  var thisSprite = this;
  if (this._state != NOT_READY && this._state != ERROR) return Promise.resolve();else return new Promise(function (rs, rj) {
    thisSprite.once('ready', rs);
    thisSprite.once('srcerror', rj);
  });
};

Sprite.tag = 'sprite';

Sprite.render = function () {
  return _('canvas.as-sprite');
};

Sprite.property = {};
Sprite.property.frames = {
  set: function (value) {
    this.stop();
    this._lastDrawFrame = -1;

    if (value && value.type == 'grid') {
      this._length = value.col * value.row;
    }

    this._frames = value;

    if (this._textureLoaded && this._frames && this._state == NOT_READY) {
      //todo: verify frame
      this._state = READY;
      this.emit('ready', {
        target: this,
        name: 'ready'
      }, this);
    }
  },
  get: function () {
    return this._frames;
  }
};
Sprite.property.frameIndex = {
  set: function (value) {
    value = value || 0;
    if (value < 0) value = this._length - 1;

    if (this._loop) {
      this._frameIndex = value % this._length;
      this._overTime = 0;
    } else {
      this._frameIndex = Math.max(this._length - 1, value);
      this._overTime = 0;
    }

    this.drawFrame(this._frameIndex);
  },
  get: function () {
    return this._frameIndex;
  }
};
Sprite.property.src = {
  set: function (value) {
    this.stop();
    this._lastDrawFrame = -1; //did not draw any thing 

    value = value || [];
    var lastSrc = this._src;
    this._src = value || null;
    if (lastSrc == this._src) return;
    if (!value) this.texture = null;else {
      var cImage;

      if (!Sprite.cache[this._src]) {
        cImage = new Image();
        Sprite.cache[this._src] = cImage;
        cImage.src = this._src;
      } else {
        cImage = Sprite.cache[this._src];
      }

      this.texture = cImage;
      this._state = NOT_READY;
      var thisSprite = this;
      this._textureLoaded = false;

      _Dom.default.waitImageLoaded(this.texture, this.loadTextureTimeout).then(function (rs) {
        if (thisSprite.texture == cImage) {
          thisSprite._textureLoaded = true;

          if (thisSprite._frames) {
            thisSprite._lastDrawFrame = -1;
            thisSprite._state = READY;
            thisSprite.emit('ready', {
              target: thisSprite,
              name: 'ready'
            }, thisSprite);
          }
        }
      }, function () {
        if (thisSprite.texture == cImage) {
          thisSprite._state = ERROR;
          thisSprite.emit('srcerror', {
            target: thisSprite,
            name: 'srcerror'
          }, thisSprite);
        }
      });
    }
  },
  get: function () {
    return this._src;
  }
};
Sprite.property.state = {
  get: function () {
    return STATE_TO_STRING[this._state];
  }
};
Sprite.property.length = {
  get: function () {
    return this._length;
  }
};
Sprite.property.fps = {
  set: function (value) {
    value = Math.max(value || 0, 0);
    this._fps = value;

    if (this._state == RUNNING) {
      clearTimeout(this._timeout);
      this._timeout = -1;
      var now = new Date().getTime();
      this._overTime += now - this._lastDrawMilis;
      this._overTime = Math.min(1000 / this._fps, this._overTime);
      this.draw();
    }
  },
  get: function () {
    return this._fps;
  }
};
Sprite.property.loop = {
  set: function (value) {
    value = !!value;
    this._loop = value;
  },
  get: function () {
    return this._loop;
  }
};

_ACore.default.install(Sprite);

var _default = Sprite;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/EmojiPicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/EmojiPicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/emojipicker.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _EmojiAnims = _interopRequireDefault(require("./EmojiAnims"));

var _Sprite = _interopRequireDefault(require("./Sprite"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function EmojiPicker() {
  var thisPicker = this;
  this._aliveTimeout = 90;
  this._assetRoot = this.attr('data-asset-root');
  /***
   *
   * @type {Sprite}
   */

  this.$previewAnim = $('sprite.as-emoji-picker-preview-anim', this).on('ready', this.eventHandler.previewAnimReady).on('frame', this.eventHandler.previewAnimFrame);
  this.$previewAnim.loop = true;
  this.$previewAnim.src = this._assetRoot + '/anim/x120/' + _EmojiAnims.default[0][1];
  this.$previewAnim.fps = 30;
  this.$desc = $('.as-emoji-picker-preview-desc', this);
  this.$shortcut = $('.as-emoji-picker-preview-shortcut', this);
  this.$desc.clearChild().addChild(_({
    text: _EmojiAnims.default[0][2]
  }));
  this.$shortcut.clearChild().addChild(_({
    text: _EmojiAnims.default[0][0]
  }));
  this.$list = $('.as-emoji-picker-list', this);
  this.$items = _EmojiAnims.default.reduce(function (ac, it) {
    var itemElt = _({
      tag: 'img',
      class: 'as-emoji-picker-item',
      props: {
        src: thisPicker._assetRoot + '/static/x20/' + it[1]
      }
    }).addTo(thisPicker.$list);

    itemElt.on('mouseenter', thisPicker.eventHandler.mouseenterItem.bind(thisPicker, it, itemElt));
    itemElt.on('click', thisPicker.eventHandler.clickItem.bind(thisPicker, it));
    ac[it[0]] = itemElt;
    return ac;
  }, {});
  this.$attachook = _('attachhook').addTo(this).on('error', this.eventHandler.attach);
}

EmojiPicker.assetRoot = function () {
  if (location.hostname.match(/^.*(\.?absol\.cf|absol\.ddns\.net)$/) || location.hostname.match(/^localhost$/)) return 'https://absol.cf/emoji';
  return '/emoji';
}();

EmojiPicker.tag = 'EmojiPicker'.toLowerCase();

EmojiPicker.render = function (data) {
  data = data || {};
  data.assetRoot = data.assetRoot || EmojiPicker.assetRoot;
  return _({
    class: 'as-emoji-picker',
    extendEvent: 'pick',
    attr: {
      'data-asset-root': data.assetRoot
    },
    child: [{
      class: 'as-emoji-picker-preview',
      child: [{
        class: '.as-emoji-picker-preview-anim-ctn',
        child: 'sprite.as-emoji-picker-preview-anim'
      }, '.as-emoji-picker-preview-desc', '.as-emoji-picker-preview-shortcut']
    }, {
      tag: 'bscroller',
      class: 'as-emoji-picker-list'
    }]
  });
};
/**
 * @type {EmojiPicker}
 */


EmojiPicker.eventHandler = {};

EmojiPicker.eventHandler.attach = function () {
  this._aliveTimeout = 90;
  setTimeout(this.$previewAnim.play.bind(this.$previewAnim), 1);
};

EmojiPicker.eventHandler.previewAnimReady = function () {
  this.$previewAnim.frames = {
    type: 'grid',
    col: 1,
    row: this.$previewAnim.texture.naturalHeight / this.$previewAnim.texture.naturalWidth
  };
  this.$previewAnim.play();
};

EmojiPicker.eventHandler.previewAnimFrame = function () {
  if (this._aliveTimeout == 0) {
    var bound = this.getBoundingClientRect();

    if (bound.width == 0) {
      this.$previewAnim.stop();
    } else {
      this._aliveTimeout = 90;
    }
  }

  this._aliveTimeout--;
};

EmojiPicker.eventHandler.mouseenterItem = function (itemData, itemElt, event) {
  if (this.$lastHoverItem == itemElt) return;
  this.$lastHoverItem = itemElt;
  this.$previewAnim.src = this._assetRoot + '/anim/x120/' + itemData[1];
  this.$desc.clearChild().addChild(_({
    text: itemData[2]
  }));
  this.$shortcut.clearChild().addChild(_({
    text: itemData[0]
  }));
};

EmojiPicker.eventHandler.clickItem = function (itemData, event) {
  this.emit('pick', {
    name: 'pick',
    key: itemData[0],
    target: this
  }, this);
};

_ACore.default.install(EmojiPicker);

var _default = EmojiPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/FlexiconInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/FlexiconInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/flexiconinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function FlexiconInput() {
  this.$input = $('.as-flexicon-input-text-input', this);
  this.$iconCtn = $('.as-flexicon-input-icon-ctn', this);
  this.$unitCtn = $('.as-flexicon-input-unit-ctn', this);

  _OOP.default.drillProperty(this, this.$input, ['value', 'readonly']);

  this.on('click', function (event) {
    if (event.target != this.$input) this.$input.focus();
  }.bind(this));
}

FlexiconInput.prototype.on = function () {
  return this.$input.on.apply(this.$input, arguments);
};

FlexiconInput.prototype.once = function () {
  return this.$input.once.apply(this.$input, arguments);
};

FlexiconInput.prototype.off = function () {
  return this.$input.off.apply(this.$input, arguments);
};

FlexiconInput.tag = 'FlexiconInput'.toLowerCase();

FlexiconInput.render = function () {
  return _({
    class: 'as-flexicon-input',
    child: [{
      class: 'as-flexicon-input-icon-ctn'
    }, {
      tag: 'input',
      class: 'as-flexicon-input-text-input',
      attr: {
        type: 'text'
      }
    }, {
      class: 'as-flexicon-input-unit-ctn'
    }]
  });
};

FlexiconInput.property = {};
FlexiconInput.property.icon = {
  set: function (value) {
    value = value || null;
    this._icon = value;
    this.$iconCtn.clearChild();

    if (value == null) {
      this.removeClass('as-flexicon-input-has-icon');
    } else {
      this.addClass('as-flexicon-input-has-icon');
      this.$iconCtn.addChild(_(value));
    }
  },
  get: function () {
    return this._icon;
  }
};
FlexiconInput.property.unit = {
  set: function (value) {
    this._unit = value;

    if (this._unit) {
      this.addClass('as-flexicon-input-has-unit');
      this.$unitCtn.clearChild().addChild(_({
        text: value + ''
      }));
    } else {
      this.removeClass('as-flexicon-input-has-unit');
      this.$unitCtn.clearChild();
    }
  },
  get: function () {
    return this._unit;
  }
};
FlexiconInput.property.disabled = {
  set: function (value) {
    value = !!value;
    this.$input.disabled = value;

    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.$input.disabled;
  }
};
FlexiconInput.property.readOnly = {
  set: function (value) {
    value = !!value;
    this.$input.readOnly = value;

    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};

_ACore.default.install(FlexiconInput);

var _default = FlexiconInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Frame.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Frame.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/frame.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _utils = require("./utils");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function Frame() {
  this.$parent = null; // FrameView or TabView
  //adapter

  (0, _utils.forwardEvent)(this, 'inactive', 'deactive');
}

Frame.tag = 'frame';

Frame.render = function () {
  return _({
    class: 'absol-frame',
    attr: {
      id: (0, _stringGenerate.randomIdent)(12)
    },
    extendEvent: ['attached', 'detached', 'active', 'inactive'] // inactive and active event will be send by parent

  });
};

Frame.prototype.notifyAttached = function (parentElt) {
  this.$parent = parentElt;
  this.emit('attached', {
    type: 'attached',
    target: this,
    parentElt: parentElt
  }, this);
};

Frame.prototype.notifyDetached = function () {
  this.emit('detached', {
    type: 'detached',
    target: this,
    parentElt: this.$parent
  }, this);
  this.$parent = undefined;
};

Frame.prototype.selfRemove = function () {
  if (this.$parent) this.$parent.removeChild(this);else this.super(); // normal remove
};

Frame.prototype.getParent = function () {
  return this.$parent;
};

Frame.prototype.requestActive = function () {
  if (this.$parent) {
    this.$parent.activeFrame(this);
  }
};

_ACore.default.install(Frame);

var _default = Frame;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/FrameView.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/FrameView.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/frameview.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _utils = require("./utils");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function FrameView() {
  this.$containers = []; //adapt

  (0, _utils.forwardEvent)(this, 'inactiveframe', 'deactiveframe');
  (0, _utils.forwardMethod)(this, 'notifyDeactiveFrame', 'notifyInactiveFrame');
}

FrameView.tag = 'frameview';

FrameView.render = function () {
  return _({
    class: 'absol-frame-view',
    extendEvent: ['activeframe', 'inactiveframe']
  });
};

FrameView.prototype.addChild = function (elt) {
  if (elt.hasClass && elt.hasClass('absol-frame')) {
    elt.selfRemove();

    var containerElt = _({
      class: 'absol-frame-view-frame-container',
      child: elt,
      props: {
        __elt__: elt
      }
    });

    this.$containers.push(containerElt);
    this.appendChild(containerElt);
    elt.notifyAttached(this);
  } else {
    throw new Error('Children must be a frame');
  }
};

FrameView.prototype.addLast = function (elt) {
  this.addChild(elt);
  this.activeFrame(elt);
};

FrameView.prototype.removeLast = function () {
  if (this.$containers.length > 0) {
    this.removeChild(this.$containers[this.$containers.length - 1].__elt__);
  }

  if (this.$containers.length > 0) {
    this.activeFrame(this.$containers[this.$containers.length - 1].__elt__);
  }
};

FrameView.prototype.getLength = function () {
  return this.$containers.length;
};

FrameView.prototype.getAllChild = function () {
  return this.$containers.map(function (ctn) {
    return ctn.__elt__;
  });
};

FrameView.prototype.getLast = function () {
  if (this.$containers.length > 0) {
    return this.$containers[this.$containers.length - 1].__elt__;
  }

  return null;
};

FrameView.prototype.addChildBefore = function (elt, at) {
  if (elt.hasClass && elt.hasClass('absol-frame')) {
    elt.selfRemove();
    var index = this.childIndexOf(at);

    if (index < 0) {
      throw new Error('Second param is not a child');
    }

    var index = this.childIndexOf(at);
    var atCtnElt = this.$containers[index];

    var containerElt = _({
      class: 'absol-frame-view-frame-container',
      child: elt,
      props: {
        __elt__: elt
      }
    });

    this.$containers.splice(index, 0, containerElt);
    this.super(containerElt, atCtnElt);
    elt.notifyAttached(this);
  } else {
    throw new Error('Children must be a frame');
  }
};

FrameView.prototype.addChildAfter = function (elt, at) {
  if (elt.hasClass && elt.hasClass('absol-frame')) {
    elt.selfRemove();
    var index = this.childIndexOf(at);

    if (index < 0) {
      throw new Error('Second param is not a child');
    }

    var index = this.childIndexOf(at);
    var atCtnElt = this.$containers[index];

    var containerElt = _({
      class: 'absol-frame-view-frame-container',
      child: elt,
      props: {
        __elt__: elt
      }
    });

    this.$containers.splice(index + 1, 0, containerElt);
    this.super(containerElt, atCtnElt);
    elt.notifyAttached(this);
  } else {
    throw new Error('Children must be a frame');
  }
};

FrameView.prototype.removeChild = function (elt) {
  var ctnEltIndex = this.childIndexOf(elt);

  if (ctnEltIndex >= 0) {
    var ctnElt = this.$containers[ctnEltIndex];
    this.$containers.splice(ctnEltIndex, 1);
    this.super(ctnElt);
  } else {
    throw new Error('Removed element is not a child!');
  }
};

FrameView.prototype.childIndexOf = function (elt) {
  for (var i = 0; i < this.$containers.length; ++i) {
    if (this.$containers[i].__elt__ == elt) return i;
  }

  return -1;
};

FrameView.prototype.findChildBefore = function (elt) {
  var eltIndex = this.childIndexOf(elt);
  if (eltIndex < 0) return -1;
  return this.$containers[eltIndex - 1];
};

FrameView.prototype.findChildAfter = function (elt) {
  var eltIndex = this.childIndexOf(elt);
  if (eltIndex < 0) return -1;
  return this.$containers[eltIndex + 1];
};

FrameView.prototype.clearChild = function () {
  while (this.$containers.length > 0) {
    this.removeChild(this.$containers[0].__elt__);
  }

  return this;
};

FrameView.prototype.findChildById = function (id) {
  var elt;

  for (var i = 0; i < this.$containers.length; ++i) {
    elt = this.$containers[i].__elt__;
    if (elt.getAttribute('id') == id) return elt;
  }

  return undefined;
};

FrameView.prototype.getAllChild = function () {
  return this.$containers.map(function (ctnElt) {
    return ctnElt.__elt__;
  });
};

FrameView.prototype.activeFrame = function (frameElt) {
  var ctnElt, elt;

  for (var i = 0; i < this.$containers.length; ++i) {
    ctnElt = this.$containers[i];
    elt = ctnElt.__elt__;

    if (frameElt === elt) {
      if (!ctnElt.hasClass('absol-active')) {
        ctnElt.addClass('absol-active');
        this.notifyActiveFrame(elt);
      } // else do nothing

    } else {
      if (ctnElt.hasClass('absol-active')) {
        ctnElt.removeClass('absol-active');
        this.notifyInactiveFrame(elt);
      } // else do nonthing

    }
  }

  return this;
};

FrameView.prototype.notifyActiveFrame = function (frameElt, originEvent) {
  frameElt.emit('active', {
    target: frameElt,
    type: 'active',
    originEvent: originEvent
  });
  this.emit('activeframe', {
    type: 'activeframe',
    target: this,
    frameElt: frameElt,
    originEvent: originEvent
  }, this);
};

FrameView.prototype.notifyInactiveFrame = function (frameElt, originEvent) {
  this.emit('inactiveframe', {
    type: 'inactiveframe',
    target: this,
    frameElt: frameElt,
    originEvent: originEvent
  }, this);
};

FrameView.prototype.activeFrameById = function (id) {
  var frameElt = this.findChildById(id);
  if (frameElt) this.activeFrame(frameElt);
  return this;
};

_ACore.default.install(FrameView);

var _default = FrameView;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TabFrame.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TabFrame.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));


var $ = _ACore.default.$;
var _ = _ACore.default._;

function TabFrame() {}

TabFrame.tag = 'tabframe';

TabFrame.render = function () {
  return _({
    tag: 'frame',
    class: 'absol-tab-frame',
    extendEvent: ['requestremove', 'remove']
  }, true);
};

TabFrame.property = {};
TabFrame.property.name = {
  set: function (value) {
    if (typeof name == "undefined") {
      this._name = undefined;
    } else {
      this._name = value + '';
    }

    if (this.$parent) {
      if (this.$parent.notifyUpdateName) this.$parent.notifyUpdateName(this);
    }
  },
  get: function () {
    return this._name;
  }
};
TabFrame.property.modified = {
  set: function (value) {
    this._modified = !!value;

    if (this.$parent) {
      if (this.$parent.notifyUpdateModified) this.$parent.notifyUpdateModified(this);
    }
  },
  get: function () {
    return !!this._modified;
  }
};
TabFrame.property.desc = {
  set: function (value) {
    if (typeof value == "undefined") {
      this._desc = undefined;
    } else {
      this._desc = value + '';
    }

    if (this.$parent) {
      if (this.$parent.notifyUpdateDesc) this.$parent.notifyUpdateDesc(this);
    }
  },
  get: function () {
    return this._desc;
  }
};
TabFrame.attribute = {};
TabFrame.attribute.name = {
  set: function (value) {
    this.name = value;
  },
  get: function () {
    return this.name;
  },
  remove: function () {
    this.name = undefined;
  }
};
TabFrame.attribute.desc = {
  set: function (value) {
    this.desc = value;
  },
  get: function () {
    return this.desc;
  },
  remove: function () {
    this.desc = undefined;
  }
};
TabFrame.attribute.modified = {
  set: function (value) {
    this.modified = value == 'true' || value == '1' || value === true;
  },
  get: function () {
    return this.modified ? 'true' : undefined;
  },
  remove: function () {
    this.desc = false;
  }
};

TabFrame.prototype.requestRemove = function () {
  if (this.$parent && this.$parent.removeTab) {
    this.$parent.removeTab(this.id, false);
  } else {
    this.selfRemove();
  }
};

_ACore.default.install(TabFrame);

var _default = TabFrame;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TabButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TabButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/tabview.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function TabButton() {
  var thisTB = this;
  this._icon = null;
  this.$extIconCtn = $('.as-tab-bar-button-ext-icon-ctn', this);
  this.$close = $('.absol-tabbar-button-close', this);
  this.$iconCtn = $('.absol-tabbar-button-icon-container', this).on('click', function (event) {
    event.tabButtonEventName = 'delete';
    thisTB.emit('close', event);
  });
  this.$modifiedFlag = $('.absol-tabbar-button-modified-flag', this).on('click', function (event) {
    event.tabButtonEventName = 'delete';
    thisTB.emit('close', event);
  });
  this.$textView = $('.absol-tabbar-button-text', this);
  this.on({
    click: function (event) {
      if (event.tabButtonEventName) return;
      event.tabButtonEventName = 'active';
      thisTB.emit('active', event);
    }
  });
}

TabButton.tag = 'TabButton'.toLowerCase();

TabButton.render = function () {
  return _({
    tag: 'button',
    class: 'absol-tabbar-button',
    extendEvent: ['close', 'active'],
    id: (0, _stringGenerate.randomIdent)(20),
    child: [{
      class: 'as-tab-bar-button-ext-icon-ctn'
    }, {
      class: 'absol-tabbar-button-text'
    }, {
      class: 'absol-tabbar-button-icon-container',
      child: [{
        tag: 'span',
        class: ['absol-tabbar-button-close', 'mdi-close', 'mdi'],
        attr: {
          title: 'Close'
        }
      }, {
        tag: 'span',
        class: ['absol-tabbar-button-close-circle', 'mdi-close-circle', 'mdi'],
        attr: {
          title: 'Close'
        }
      }, {
        tag: 'span',
        class: ['absol-tabbar-button-modified-flag', 'mdi', 'mdi-checkbox-blank-circle']
      }]
    }]
  });
};

TabButton.property = {};
TabButton.property.active = {
  set: function (value) {
    this._active = value;
    if (value) this.addClass('absol-tabbar-button-active');else this.removeClass('absol-tabbar-button-active');
  },
  get: function () {
    return this._active;
  }
};
TabButton.property.name = {
  set: function (value) {
    this._name = value || '';
    this.$textView.innerHTML = this._name;
  },
  get: function () {
    return this._name;
  }
};
TabButton.property.desc = {
  set: function (value) {
    this.attr('title', value);
  },
  get: function () {
    return this.attr('title');
  }
};
TabButton.property.icon = {
  set: function (value) {
    value = value || null;
    this._icon = value;
    this.$extIconCtn.clearChild();

    if (this._icon) {
      this.$extIconCtn.addChild(_(value));
    }
  },
  get: function () {
    return this._icon;
  }
};
TabButton.property.modified = {
  set: function (value) {
    if (value) {
      this.addClass('absol-tabbar-button-modified');
    } else {
      this.removeClass('absol-tabbar-button-modified');
    }
  },
  get: function () {
    return this.hasClass('absol-tabbar-button-modified');
  }
};

_ACore.default.install(TabButton);

var _default = TabButton;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TabBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TabBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/tabview.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _TabButton = _interopRequireDefault(require("./TabButton"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends HScroller
 * @constructor
 */

function TabBar() {
  this.$parent = null;
  this.$addBtn = _({
    tag: 'button',
    class: 'as-tab-bar-add-btn',
    child: 'span.mdi.mdi-plus',
    on: {
      click: function () {
        if (this.$parent) {
          this.$parent.emit('pressaddtab', {
            type: 'pressaddtab',
            target: this.$parent
          }, this.$parent);
        }
      }.bind(this)
    }
  });
  this.addChild(this.$addBtn);
  this.defineEvent(['active', 'close']);
  this.on('wheel', function (event) {
    var lastLeft = this.$viewport.scrollLeft;

    if (event.deltaY > 1) {
      this.$viewport.scrollLeft += 50;
    } else if (event.deltaY < -1) {
      this.$viewport.scrollLeft -= 50;
    }

    if (lastLeft != this.$viewport.scrollLeft) event.preventDefault();
  });
  this._tabs = [];
}

TabBar.tag = 'tabbar';

TabBar.render = function () {
  return _('hscroller.absol-tabbar');
};

TabBar.prototype.getAllTabButtons = function () {
  var buttons = [];
  $('tabbutton', this, function (e) {
    buttons.push(e);
  });
  return buttons;
};
/***
 *
 * @param {string} ident
 * @return {TabButton}
 */


TabBar.prototype.getButtonByIdent = function (ident) {
  return $('tabbutton#tabbuton-' + ident, this);
};

TabBar.property = {};
TabBar.property.tabs = {
  set: function (value) {
    this.clearChild();
    this._tabs = [];
    (value || []).forEach(this.addTab.bind(this));
  },
  get: function () {
    //each hold item data
    return this._tabs || [];
  }
};
/***
 *
 * @param {{text}}
 * @return {tabbar}
 */

TabBar.prototype.addTab = function (value) {
  var self = this;
  var props = {};

  if (typeof value == "string") {
    props.name = value;
  } else {
    if (value.name) {
      props.name = value.name;
    } else {
      throw new Error('Tab must has name attribute');
    }

    if (value.desc) props.desc = value.desc;

    if (value.tabIcon) {
      props.icon = value.tabIcon;
    }
  }

  var tabButton = _({
    tag: 'tabbutton',
    props: props,
    on: {
      active: function (event, sender) {
        var prevented = false;
        self.emit('active', {
          target: this,
          value: value,
          preventDefault: function () {
            prevented = true;
          }
        }, self);

        if (!prevented) {
          self.getAllTabButtons().forEach(function (e) {
            e.active = false;
          });
          this.active = true;
        }
      },
      close: function (event, sender) {
        var prevented = false;
        self.emit('close', {
          target: this,
          value: value,
          preventDefault: function () {
            prevented = true;
          }
        }, self);

        if (!prevented) {
          //todo:active other
          this.remove();
        }
      }
    }
  });

  this.addChildBefore(tabButton, this.$addBtn);
  if (value.id) tabButton.attr('id', 'tabbuton-' + value.id);

  this._tabs.push(tabButton);

  this.requestUpdateSize();
  return tabButton;
};

TabBar.prototype.removeTab = function (id) {
  this._tabs = this._tabs.filter(function (value) {
    return value == id;
  });
  $('#tabbuton-' + id, this).remove();
  this.requestUpdateSize();
};

TabBar.prototype.activeTab = function (id) {
  var self = this;
  var activedbtn = $('.absol-tabbar-button-active', this);

  if (activedbtn && activedbtn.attr('id') != id) {
    activedbtn.active = false;
  }

  var mButton = $('#tabbuton-' + id, this);

  if (mButton) {
    mButton.active = true;
    setTimeout(function () {
      self.scrollInto(mButton);
    }, 30);
  }
};

TabBar.prototype.setModified = function (ident, flag) {
  var bt = this.getButtonByIdent(ident);

  if (bt) {
    bt.modified = flag;
  }
};

_ACore.default.install(TabBar);

var _default = TabBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TabView.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TabView.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/tabview.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TabBar = _interopRequireDefault(require("./TabBar"));

var _utils = require("./utils");


var _ = _ACore.default._;
var $ = _ACore.default.$;

function TabView() {
  var thisTV = this;
  /***
   *
   * @type {TabBar}
   */

  this.$tabbar = $('tabbar', this);
  this.$tabbar.$parent = this;
  this.$tabbar.on({
    close: TabView.eventHandler.closeTab.bind(thisTV),
    active: TabView.eventHandler.activeTab.bind(thisTV)
  });
  this._frameHolders = [];
  this._history = [];
  (0, _utils.forwardEvent)(this, 'inactivetab', 'deactivetab');
}

TabView.tag = 'TabView'.toLowerCase();

TabView.render = function () {
  return _({
    class: 'absol-tabview',
    extendEvent: ['activetab', 'inactivetab', 'removetab', 'requestremovetab', 'pressaddtab'],
    child: ['tabbar']
  });
};

TabView.eventHandler = {};

TabView.eventHandler.closeTab = function (event) {
  event.preventDefault();
  var id = event.value.id;
  this.removeTab(id, true);
};

TabView.eventHandler.activeTab = function (event) {
  event.preventDefault();
  var id = event.value.id;
  this.activeTab(id, true);
};

TabView.prototype.activeTab = function (id, userActive) {
  var self = this;
  var resPromise = [];
  var needDeactivatedHolder = [];
  var needActiveHolder = [];

  this._frameHolders.forEach(function (holder) {
    if (holder.containerElt.hasClass('absol-tabview-container-hidden')) {
      if (holder.id == id) {
        needActiveHolder.push(holder);
      }
    } else {
      if (holder.id != id) {
        needDeactivatedHolder.push(holder);
      }
    }
  });

  needDeactivatedHolder.forEach(function (holder) {
    holder.containerElt.addClass('absol-tabview-container-hidden');
    holder.tabFrame.emit('inactive', {
      type: 'inactive',
      target: holder.tabFrame,
      id: holder.id,
      userActive: !!userActive,
      tabButton: holder.tabButton,
      holder: holder
    }, holder.tabFrame);
  });
  needActiveHolder.forEach(function (holder) {
    self._history.push(holder.id);

    holder.containerElt.removeClass('absol-tabview-container-hidden');
    self.$tabbar.activeTab(holder.id);
    holder.tabFrame.emit('active', {
      type: 'active',
      target: holder.tabFrame,
      id: holder.id,
      userActive: !!userActive,
      tabButton: holder.tabButton,
      holder: holder
    }, holder.tabFrame);
    self.emit('activetab', {
      type: 'activetab',
      target: self,
      id: holder.id,
      userActive: !!userActive,
      tabButton: holder.tabButton,
      holder: holder
    }, self);
  });
};

TabView.prototype.removeTab = function (id, userActive) {
  var self = this;
  var resPromise = [];

  this._frameHolders.forEach(function (holder) {
    if (holder.id == id) {
      var eventData = {
        type: 'requestremove',
        id: id,
        userActive: !!userActive,
        target: holder.tabFrame,
        tabFrame: holder.tabFrame,
        tabButton: holder.tabButton,
        holder: holder,
        __promise__: Promise.resolve(),
        waitFor: function (promise) {
          this.__promise__ = promise;
        }
      };
      holder.tabFrame.emit('requestremove', eventData, holder.tabFrame);
      eventData.type = 'requestremovetab';
      eventData.target = self;
      self.emit('requestremovetab', eventData, self);
      resPromise.push(eventData.__promise__.then(function () {
        //if ok
        var eventData2 = {
          type: 'inactive',
          target: holder.tabFrame,
          id: holder.id,
          userActive: !!userActive,
          tabButton: holder.tabButton,
          holder: holder
        };
        if (!holder.containerElt.hasClass('absol-tabview-container-hidden')) holder.tabFrame.emit('inactive', eventData2, holder.tabFrame);
        eventData2.type = 'inactivetab';
        eventData2.target = self;
        if (!holder.containerElt.hasClass('absol-tabview-container-hidden')) self.emit('inactivetab', eventData2, self);
        self._frameHolders = self._frameHolders.filter(function (x) {
          return x.id != id;
        });
        holder.tabFrame.notifyDetached();
        self.$tabbar.removeTab(holder.id);
        holder.containerElt.remove();
        eventData2.type = 'remove';
        eventData2.target = holder.tabFrame;
        holder.tabFrame.emit('remove', eventData2, holder.tabFrame);
        eventData2.type = 'removetab';
        eventData2.target = self;
        self.emit('removetab', eventData2, self);
        self.activeLastTab();
      }, function () {//if reject
      }));
    }
  });

  return Promise.all(resPromise);
};

TabView.prototype.notifyUpdateDesc = function (elt) {
  var holder = this.findHolder(elt);

  if (holder) {
    holder.tabButton.desc = elt.desc;
  }
};

TabView.prototype.notifyUpdateName = function (elt) {
  var holder = this.findHolder(elt);

  if (holder) {
    holder.tabButton.name = elt.name;
  }
};

TabView.prototype.notifyUpdateModified = function (elt) {
  var holder = this.findHolder(elt);

  if (holder) {
    holder.tabButton.modified = elt.modified;
  }
};

TabView.prototype.findHolder = function (elt) {
  for (var i = 0; i < this._frameHolders.length; ++i) {
    var holder = this._frameHolders[i];

    if (holder.tabFrame == elt) {
      return holder;
    }
  }
};

TabView.prototype.addChild = function () {
  var self = this;
  Array.prototype.forEach.call(arguments, function (elt) {
    if (!elt.notifyAttached || !elt.notifyDetached) {
      throw new Error('element is not a tabframe');
    }

    var containerElt = _('.absol-tabview-container.absol-tabview-container-hidden');

    self.appendChild(containerElt); //origin function

    elt.selfRemove();
    var id = elt.attr('id');
    var desc = elt.attr('desc') || undefined;
    var name = elt.attr('name') || 'NoName';
    var tabIcon = elt.tabIcon;
    var modified = elt.modified;
    var tabButton = self.$tabbar.addTab({
      name: name,
      id: id,
      desc: desc,
      modified: modified,
      tabIcon: tabIcon
    });
    containerElt.addChild(elt);
    elt.notifyAttached(self);
    var holder = {};

    _OOP.default.drillProperty(holder, elt, 'id');

    _OOP.default.drillProperty(holder, elt, 'desc');

    _OOP.default.drillProperty(holder, elt, 'name');

    Object.defineProperties(holder, {
      tabButton: {
        value: tabButton,
        writable: false
      },
      tabFrame: {
        value: elt,
        writable: false
      },
      containerElt: {
        value: containerElt,
        writable: false
      }
    });

    self._frameHolders.push(holder);

    self.activeTab(id);
  });
};

TabView.prototype.activeLastTab = function () {
  var dict = this._frameHolders.reduce(function (ac, holder) {
    ac[holder.id] = true;
    return ac;
  }, {});

  while (this._history.length > 0) {
    var id = this._history[this._history.length - 1];

    if (dict[id]) {
      this.activeTab(id);
      break;
    } else {
      this._history.pop();
    }
  }
};

TabView.prototype.getChildAt = function (index) {
  return this._frameHolders[index].tabFrame;
};

TabView.prototype.getAllChild = function () {
  return this._frameHolders.map(function (holder) {
    return holder.tabFrame;
  });
};

TabView.prototype.getActiveTabHolder = function () {
  var holder = null;

  for (var i = 0; i < this._frameHolders.length; ++i) {
    holder = this._frameHolders[i];

    if (!holder.containerElt.hasClass('absol-tabview-container-hidden')) {
      return holder;
    }
  }

  return null;
};

TabView.prototype.getActiveTab = function () {
  var holder = this.getActiveTabHolder();
  return holder && holder.tabFrame;
};

TabView.prototype.getActiveTabId = function () {
  var holder = this.getActiveTabHolder();
  return holder && holder.id;
};

TabView.prototype.getTabById = function (id) {
  var holder = this.getTabHolderById(id);
  return holder && holder.tabFrame;
};

TabView.prototype.getTabHolderById = function (id) {
  var holder = null;

  for (var i = 0; i < this._frameHolders.length; ++i) {
    holder = this._frameHolders[i];

    if (holder.id === id) {
      return holder;
    }
  }

  return null;
};

TabView.prototype.activeFrame = function (elt) {
  if (typeof elt == "string") {
    return this.activeTab(elt);
  } else if (elt && elt.attr) {
    return this.activeTab(elt.attr('id'));
  } else {
    throw new Error("Invalid param, must be id or elt!");
  }
};

TabView.property = {};
TabView.property.historyOfTab = {
  get: function () {
    return this._history.slice();
  }
};

_ACore.default.install('tabview', TabView);

var _default = TabView;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SinglePage.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SinglePage.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/singlepage.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var warned = false;
/***
 * @extends AElement
 * @constructor
 */

function SinglePage() {
  var thisSP = this;
  this._updateIntv = -1;

  this._tick = function () {
    if (this.isDescendantOf(document.body)) {
      if (this.$header) {
        var headerHeight = this.$header.getBoundingClientRect().height;

        if (this._prevHeaderHeight !== headerHeight) {
          _ResizeSystem.default.update();
        }
      }
    } else {
      clearInterval(this._updateIntv);
      this._updateIntv = -1;
    }
  }.bind(this);

  this.$attachhook = $('attachhook', this).on('attached', function () {
    this.updateSize();
    setTimeout(this.updateSize, 20);

    _Dom.default.addToResizeSystem(this);

    if (thisSP._updateIntv < 0) {
      thisSP._updateIntv = setInterval(thisSP._tick, 200);
    }
  });
  this.$attachhook.updateSize = this.updateSize.bind(this);
  this.$header = null;
  this.$footer = null;
  this.$viewport = $('.absol-single-page-scroller-viewport', this);
  this.$scroller = $('.absol-single-page-scroller', this);
}

SinglePage.tag = 'SinglePage'.toLowerCase();

SinglePage.render = function () {
  return _({
    tag: 'tabframe',
    extendEvent: ['sizechange'],
    class: 'absol-single-page',
    child: [{
      class: 'absol-single-page-scroller',
      child: {
        class: 'absol-single-page-scroller-viewport'
      }
    }, 'attachhook']
  });
};

SinglePage.prototype.updateSize = function () {
  if (!this.isDescendantOf(document.body)) return;
  var paddingTop = parseFloat(this.getComputedStyleValue('padding-top').replace('px', '')) || 0;

  if (this.$header) {
    var headerBound = this.$header.getBoundingClientRect();
    var headerMarginTop = parseFloat(this.$header.getComputedStyleValue('margin-top').replace('px', '')) || 0;
    var headerMarginBottom = parseFloat(this.$header.getComputedStyleValue('margin-bottom').replace('px', '')) || 0;
    this.$scroller.addStyle('top', headerBound.height + headerMarginTop + headerMarginBottom + paddingTop + 'px');
    this._prevHeaderHeight = headerBound.height;
  }

  if (this.$footer) {
    var footerBound = this.$footer.getBoundingClientRect();
    this.$viewport.addStyle('padding-bottom', footerBound.height + 'px');
  }

  if (this.isSupportedEvent('sizechange')) this.emit('sizechange', {
    type: 'sizechange',
    target: this
  }, this);
  this.addStyle('--single-page-scroller-height', this.$scroller.clientHeight + 'px');
};

SinglePage.prototype.addChild = function (elt) {
  if (elt.classList.contains('absol-single-page-header')) {
    if (this.firstChild) {
      this.addChildBefore(elt, this.firstChild);
    } else {
      this.appendChild(elt);
    }

    this.$header = $(elt);
    this.updateSize();
  } else if (elt.classList.contains('absol-single-page-footer')) {
    this.$viewport.addChild(elt);
    this.$footer = $(elt);
    this.updateSize();
  } else {
    this.$viewport.addChild(elt);
  }
};

SinglePage.prototype.removeChild = function (elt) {
  if (elt == this.$footer) {
    this.$viewport.removeChild(elt);
    this.$footer = undefined;
    this.updateSize();
  } else if (elt == this.$header) {
    this.super(elt);
    this.$header = undefined;
    this.updateSize();
  } else {
    this.$viewport.removeChild(elt);
  }
};

_ACore.default.install(SinglePage);

var _default = SinglePage;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/HexaSectionLabel.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/HexaSectionLabel.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/hexasectionlabel.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var _g = _Svg.default.ShareInstance._;
var $g = _Svg.default.ShareInstance.$;
var Design = {
  hexaHeight: 425,
  textBoxHeight: 286,
  textHeight: 96,
  indexHeight: 110,
  textBoxPaddingLeft: 127,
  borderWidth: 38
};
var StyleSheet = {
  '.as-hexa-section-label-text': {
    height: Design.textBoxHeight / Design.textHeight + 'em',
    'padding-left': Design.textBoxPaddingLeft / Design.textHeight + 'em',
    'line-height': Design.textBoxHeight / Design.textHeight + 'em'
  },
  '.as-hexa-section-label-index': {
    'font-size': Design.indexHeight / Design.textHeight + 'em',
    height: Design.hexaHeight / Design.indexHeight + 'em',
    'line-height': Design.hexaHeight / Design.indexHeight + 'em',
    width: (Design.hexaHeight + Design.borderWidth) / Math.cos(Math.PI / 6) / Design.indexHeight + 'em'
  }
};

_({
  tag: 'style',
  id: 'hexa-section-label-style',
  props: {
    innerHTML: Object.keys(StyleSheet).map(function (key) {
      var style = StyleSheet[key];
      return key + ' {\n' + Object.keys(style).map(function (propName) {
        return propName + ': ' + style[propName] + ';';
      }).join('\n') + '}';
    }).join('\n')
  }
}).addTo(document.head);
/***
 * @extends AElement
 * @constructor
 */


function HexaSectionLabel() {
  this.$background = $('.as-hexa-section-label-background', this);
  this.$index = $('.as-hexa-section-label-index', this);
  this.$text = $('.as-hexa-section-label-text', this);
  this.$attachhook = _('attachhook').addTo(this).on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
  });
  this.$attachhook.requestUpdateSize = this.redrawBackground.bind(this);
  this.$svg = _g({
    tag: 'svg',
    attr: {
      width: '0',
      height: '0'
    },
    child: ['path.as-hexa-section-label-text-box', 'path.as-hexa-section-label-index-box']
  }).addTo(this.$background);
  this.$indexBox = $g('path.as-hexa-section-label-index-box', this.$svg);
  this.$textBox = $g('path.as-hexa-section-label-text-box', this.$svg);
}

HexaSectionLabel.prototype.redrawBackground = function () {
  var indexBound = this.$index.getBoundingClientRect();
  var textBound = this.$text.getBoundingClientRect();
  var cHeight = indexBound.height;
  var cWidth = textBound.right - indexBound.left;
  this.$svg.attr({
    height: cHeight + '',
    width: cWidth + '',
    viewBox: [0, 0, cWidth, cHeight].join(' ')
  });
  var borderWidth = cHeight * Design.borderWidth / Design.hexaHeight;
  var radius = cHeight / Math.cos(Math.PI / 6) / 2 - borderWidth / 2;
  var x0 = indexBound.width / 2;
  var y0 = cHeight / 2;
  this.$indexBox.attr('d', Array(6).fill(0).map(function (u, i) {
    var angle = Math.PI / 3 + i * Math.PI / 3;
    var x = radius * Math.cos(angle) + x0;
    var y = radius * Math.sin(angle) + y0;
    return (i == 0 ? 'M' : 'L') + x + ' ' + y;
  }).join(' ') + 'Z').addStyle({
    strokeWidth: borderWidth + ''
  });
  var skewX = 18 / 45;
  var textBoxHeight = textBound.height;
  this.$textBox.attr('d', [[x0, (cHeight - textBoxHeight) / 2], [cWidth - 1, (cHeight - textBoxHeight) / 2], [cWidth - 1 - textBoxHeight * skewX, (cHeight - textBoxHeight) / 2 + textBoxHeight], [x0, (cHeight - textBoxHeight) / 2 + textBoxHeight]].map(function (point, i) {
    return (i == 0 ? 'M' : 'L') + point.join(' ');
  }).join(' ') + 'Z');
};

HexaSectionLabel.tag = 'HexaSectionLabel'.toLowerCase();

HexaSectionLabel.render = function () {
  return _({
    class: 'as-hexa-section-label',
    child: [{
      class: 'as-hexa-section-label-background'
    }, '.as-hexa-section-label-index', '.as-hexa-section-label-text']
  });
};

HexaSectionLabel.property = {};
HexaSectionLabel.property.index = {
  set: function (value) {
    this._index = value;
    this.$index.clearChild().addChild(_({
      text: value + ''
    }));
  },
  get: function () {
    return this._index;
  }
};
HexaSectionLabel.property.text = {
  set: function (value) {
    this._text = value;
    this.$text.clearChild().addChild(_({
      text: value + ''
    }));
  },
  get: function () {
    return this._text;
  }
};

_ACore.default.install(HexaSectionLabel);

var _default = HexaSectionLabel;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/VRuler.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/VRuler.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/vruler.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function VRuler() {
  var self = this;
  this.$attachHook = _('attachhook').on('error', function () {
    this.updateSize = self.update.bind(self);

    _Dom.default.addToResizeSystem(this);

    this.updateSize();
  }).addTo(this);
  this.$lines = [];
  this.$numbers = [];
  this.$measureTarget = undefined;
  this._viewingNumberCount = 0;
  this._viewingLineCount = 0;
  this._spacing = 10;
  this._major = 10;
  this._valueFloat = 'top';
}

VRuler.tag = 'vruler';

VRuler.render = function () {
  return _({
    class: 'as-vruler'
  });
};

VRuler.prototype.measureElement = function (elt) {
  if (typeof elt == "string") elt = $(elt);
  this.$measureTarget = elt;
  this.update();
};

VRuler.prototype.update = function () {
  var fontSize = this.getFontSize();
  var measureBound;
  var bound = this.getBoundingClientRect();
  var contentBound = {
    left: bound.left + 1,
    right: bound.right - 1,
    top: bound.top + 1,
    bottom: bound.bottom - 1,
    width: bound.width - 2,
    height: bound.height - 2
  };

  if (this.$measureTarget) {
    measureBound = this.$measureTarget.getBoundingClientRect();
  } else {
    measureBound = contentBound;
  }

  var startOfset = (measureBound[this._valueFloat] - contentBound[this._valueFloat]) * (this.inverse ? -1 : 1) % this._spacing;
  if (startOfset < 0) startOfset += this._spacing;
  var lineIndexOfset = Math.round(((contentBound[this._valueFloat] - measureBound[this._valueFloat]) * (this.inverse ? -1 : 1) + startOfset) / this._spacing);
  var lineCount = Math.floor((contentBound.height - startOfset) / this._spacing) + 1;

  while (this.$lines.length < lineCount) {
    this.$lines.push(_('.as-vruler-line'));
  }

  var i;
  var lineElt;

  for (i = 0; i < lineCount; ++i) {
    lineElt = this.$lines[i];

    if ((i + lineIndexOfset) % this._major == 0) {
      lineElt.addClass('major');
    } else {
      lineElt.removeClass('major');
    }

    lineElt.addStyle(this._valueFloat, startOfset + this._spacing * i - 0.5 + 'px');
  }

  while (this._viewingLineCount < lineCount) {
    this.$lines[this._viewingLineCount++].addTo(this);
  }

  while (this._viewingLineCount > lineCount) {
    this.$lines[--this._viewingLineCount].remove();
  }

  var numberCount = Math.floor((lineCount + lineIndexOfset - 1) / this._major) - Math.ceil(lineIndexOfset / this._major) + 1;

  while (this.$numbers.length < numberCount) {
    this.$numbers.push(_('.as-vruler-major-number'));
  }

  var numberElt;
  var number;
  var majorStartOfset = startOfset;

  if (lineIndexOfset > 0) {
    majorStartOfset += (this._major - lineIndexOfset % this._spacing) * this._spacing;
  } else {
    majorStartOfset += (this._major - (this._spacing + lineIndexOfset % this._spacing)) * this._spacing;
  }

  for (i = 0; i < numberCount; ++i) {
    number = (Math.ceil(lineIndexOfset / this._major) + i) * this._spacing * this._major;
    numberElt = this.$numbers[i];

    if (numberElt.__cacheNumber__ != number) {
      numberElt.__cacheNumber__ = number;
      numberElt.innerHTML = number + '';
    }

    numberElt.addStyle(this._valueFloat, majorStartOfset + this._major * i * this._spacing - 0.7 * 0.5 * fontSize + 'px');
  }

  while (this._viewingNumberCount < numberCount) {
    this.$numbers[this._viewingNumberCount++].addTo(this);
  }

  while (this._viewingNumberCount > numberCount) {
    this.$numbers[--this._viewingNumberCount].remove();
  }
};

VRuler.property = {};
VRuler.property.major = {
  set: function (value) {
    if (value > 0) {
      this._major = value;
      this.update();
    }
  },
  get: function () {
    return this._major;
  }
};
VRuler.property.spacing = {
  set: function (value) {
    if (value > 0) {
      this._spacing = value;
      this.update();
    }
  },
  get: function () {
    return this._spacing;
  }
};
VRuler.property.inverse = {
  set: function (value) {
    this._valueFloat = value ? 'bottom' : 'top';
    this.update();
  },
  get: function () {
    return this._valueFloat == 'bottom';
  }
};

_ACore.default.install('vruler', VRuler);

var _default = VRuler;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/HRuler.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/HRuler.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/hruler.css");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function HRuler() {
  var self = this;
  this.$attachHook = _('attachhook').on('error', function () {
    this.updateSize = self.update.bind(self);

    _Dom.default.addToResizeSystem(this);

    this.updateSize();
  }).addTo(self);
  this.$lines = [];
  this.$numbers = [];
  this._viewingNumberCount = 0;
  this._viewingLineCount = 0;
  this._spacing = 10;
  this._major = 10;
  this.$measureTarget = null;
  this._valueFloat = 'left';
}

HRuler.tag = 'hruler';

HRuler.render = function () {
  return _({
    class: 'as-hruler'
  });
};

HRuler.prototype.measureElement = function (elt) {
  if (typeof elt == "string") elt = $(elt);
  this.$measureTarget = elt;
  this.update();
};

HRuler.prototype.update = function () {
  var fontSize = this.getFontSize();
  var measureBound;
  var bound = this.getBoundingClientRect();
  var contentBound = {
    left: bound.left + 1,
    right: bound.right - 1,
    top: bound.top + 1,
    bottom: bound.bottom - 1,
    width: bound.width - 2,
    height: bound.height - 2
  };

  if (this.$measureTarget) {
    measureBound = this.$measureTarget.getBoundingClientRect();
  } else {
    measureBound = contentBound;
  }

  var startOfset = (measureBound[this._valueFloat] - contentBound[this._valueFloat]) * (this.inverse ? -1 : 1) % this._spacing;
  if (startOfset < 0) startOfset += this._spacing;
  var lineIndexOfset = Math.round(((contentBound[this._valueFloat] - measureBound[this._valueFloat]) * (this.inverse ? -1 : 1) + startOfset) / this._spacing);
  var lineCount = Math.floor((contentBound.width - startOfset) / this._spacing) + 1;

  while (this.$lines.length < lineCount) {
    this.$lines.push(_('.as-hruler-line'));
  }

  var i;
  var lineElt;

  for (i = 0; i < lineCount; ++i) {
    lineElt = this.$lines[i];

    if ((i + lineIndexOfset) % this._major == 0) {
      lineElt.addClass('major');
    } else {
      lineElt.removeClass('major');
    }

    lineElt.addStyle(this._valueFloat, startOfset + this._spacing * i - 0.5 + 'px');
  }

  while (this._viewingLineCount < lineCount) {
    this.$lines[this._viewingLineCount++].addTo(this);
  }

  while (this._viewingLineCount > lineCount) {
    this.$lines[--this._viewingLineCount].remove();
  }

  var numberCount = Math.floor((lineCount + lineIndexOfset - 1) / this._major) - Math.ceil(lineIndexOfset / this._major) + 1;

  while (this.$numbers.length < numberCount) {
    this.$numbers.push(_('.as-hruler-major-number'));
  }

  var numberElt;
  var number;
  var majorStartOfset = startOfset;

  if (lineIndexOfset > 0) {
    majorStartOfset += (this._major - lineIndexOfset % this._spacing) * this._spacing;
  } else {
    majorStartOfset += (this._major - (this._spacing + lineIndexOfset % this._spacing)) * this._spacing;
  }

  for (i = 0; i < numberCount; ++i) {
    number = (Math.ceil(lineIndexOfset / this._major) + i) * this._spacing * this._major;
    numberElt = this.$numbers[i];

    if (numberElt.__cacheNumber__ != number) {
      numberElt.__cacheNumber__ = number;
      numberElt.innerHTML = number + '';
    }

    numberElt.addStyle(this._valueFloat, majorStartOfset + this._major * i * this._spacing - 0.7 * 2.5 * fontSize + 'px');
  }

  while (this._viewingNumberCount < numberCount) {
    this.$numbers[this._viewingNumberCount++].addTo(this);
  }

  while (this._viewingNumberCount > numberCount) {
    this.$numbers[--this._viewingNumberCount].remove();
  }
};

HRuler.property = {};
HRuler.property.major = {
  set: function (value) {
    if (value > 0) {
      this._major = value;
      this.update();
    }
  },
  get: function () {
    return this._major;
  }
};
HRuler.property.spacing = {
  set: function (value) {
    if (value > 0) {
      this._spacing = value;
      this.update();
    }
  },
  get: function () {
    return this._spacing;
  }
};
HRuler.property.inverse = {
  set: function (value) {
    this._valueFloat = value ? 'right' : 'left';
    this.update();
  },
  get: function () {
    return this._valueFloat == 'right';
  }
};

_ACore.default.install(HRuler);

var _default = HRuler;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/IconSprite.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/IconSprite.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function IconSprite() {
  this.$attachhook = _('attachhook').addTo(this).on('error', this.eventHandler.attached);
  this.on('frame', this.eventHandler.frame);
  this._checkRootTimeout = 30;
  this.loop = true;
}

IconSprite.tag = 'iconsprite';

IconSprite.render = function () {
  return _('sprite', true);
};
/**
 * @type {IconSprite}
 */


IconSprite.eventHandler = {};

IconSprite.eventHandler.attached = function () {
  var thisAS = this;
  this._checkRootTimeout = 30;
  this.afterReady().then(function () {
    thisAS.width = thisAS.texture.naturalWidth;
    thisAS.height = thisAS.width;
    thisAS.frames = {
      type: 'grid',
      col: 1,
      row: thisAS.texture.naturalHeight / thisAS.texture.naturalWidth
    };
    thisAS.drawFrame(0);
    thisAS.play();
  });
};

IconSprite.eventHandler.frame = function () {
  this._checkRootTimeout--;

  if (this._checkRootTimeout == 0) {
    if (this.isDescendantOf(document.body)) {
      this._checkRootTimeout = 30;
    } else {
      this.stop();
      this.remove();
    }
  }
};

_ACore.default.install(IconSprite);

var _default = IconSprite;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/LinearColorBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/LinearColorBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/linearcolorbar.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _utils = require("./utils");


var _ = _ACore.default._;
var $ = _ACore.default.$;
var _g = _Svg.default.ShareInstance._;
var $g = _Svg.default.ShareInstance.$;
var Design = {
  textHeight: 56,
  barHeight: 97,
  barBlockWidth: 79,
  barBlockMargin: 19,
  valueTextHeight: 70,
  valueStrokeWidth: 5,
  valueHeight: 99,
  valueWidth: 52,
  valueTripHeight: 32,
  height: 430,
  barY: 201
};
var SyleSheet = {
  '.as-linear-color-bar': {
    height: Design.height / Design.textHeight + 'em'
  },
  '.as-linear-color-value-text': {
    'font-size': Design.valueTextHeight / Design.textHeight + 'em'
  }
};
(0, _utils.buildCss)(SyleSheet);

function LinearColorBar() {
  this._indent = (Math.random() + '').replace(/[^0-9]/g, '_');
  this._extendValue = 0;
  this._value = 0;
  this._valueText = '';
  this.$valueText = $('.as-linear-color-value-text', this);
  this.$minValueText = $('.as-linear-color-min-value-text', this);
  this.$maxValueText = $('.as-linear-color-max-value-text', this);
  this.$background = $('svg.as-linear-color-background', this);
  this._attached = false;
  var thisBar = this;
  this.$attachhook = _('attachhook').addTo(this).on('error', function () {
    thisBar._attached = true;

    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
  });
  this.$background.attr({
    height: 0,
    width: 0
  });
  this.$attachhook.requestUpdateSize = this.redraw.bind(this);
  this.$defs = _g('defs').addTo(this.$background);
  this.$gradient = _g('linearGradient#gradient_' + this._indent).attr({
    x1: "0%",
    y1: "0%",
    x2: "100%",
    y2: "0%"
  }).addTo(this.$defs);
  this.$rect = _g('rect.as-linear-color-bar-rect').attr({
    fill: 'url(#gradient_' + this._indent + ')'
  }).addTo(this.$background);
  this.$splitLine = _g('path.as-linear-color-split-line').addTo(this.$background);
  this.$valueArrow = _g('path.as-linear-color-value-arrow').addTo(this.$background);
  this.colorMapping = 'rainbow';
}

LinearColorBar.prototype.redraw = function () {
  var bBound = this.getBoundingClientRect();
  var cWidth = bBound.width;
  var cHeight = bBound.height;
  var maxTextBound = this.$maxValueText.getBoundingClientRect();
  var minTextBound = this.$minValueText.getBoundingClientRect();
  var valueTextBound = this.$valueText.getBoundingClientRect();
  var valueWidth = Design.valueWidth / Design.height * cHeight;
  var minValueX = valueWidth / 1.5;
  this.$minValueText.addStyle('left', Math.max((minValueX - minTextBound.width) / 2, 0) + 'px');
  var maxValueX = (cWidth - Design.valueWidth) / (1 + this._extendValue);
  var extendX = cWidth - valueWidth / 1.5;
  var valueX = minValueX + this._value * (maxValueX - minValueX);
  this.$valueText.addStyle('left', valueX - valueTextBound.width / 2 + 'px');
  this.$maxValueText.addStyle('left', maxValueX - maxTextBound.width / 2 + 'px');
  var barY = Design.barY / Design.height * cHeight;
  var barHeight = Design.barHeight / Design.height * cHeight;
  this.$rect.attr({
    x: '' + minValueX,
    y: '' + barY,
    width: extendX - minValueX + '',
    height: barHeight
  });
  this.$background.attr({
    height: cHeight + '',
    width: cWidth + '',
    viewBox: [0, 0, cWidth, cHeight].join(' ')
  });
  var valueTripHeight = Design.valueTripHeight / Design.height * cHeight;
  var valueHeight = Design.valueHeight / Design.height * cHeight;
  this.$valueArrow.addStyle('stroke-width', Design.valueStrokeWidth / Design.height * cHeight + '').attr('d', [[[valueX, barY], [valueX - valueWidth / 2, barY - valueTripHeight], [valueX - valueWidth / 2, barY - valueHeight], [valueX + valueWidth / 2, barY - valueHeight], [valueX + valueWidth / 2, barY - valueTripHeight]]].map(function (point, i) {
    return (i == 0 ? 'M' : 'L') + point.join(' ');
  }).join(' ') + 'Z');
  var splitDistMin = (Design.barBlockWidth + Design.barBlockMargin) / Design.height * cHeight;
  var splitCounts = [100, 50, 20, 10, 5, 2, 1];
  var splitDist = maxValueX - minValueX;
  var splitCount = 1;

  for (var i = 0; i < splitCounts.length; ++i) {
    splitDist = (maxValueX - minValueX) / splitCounts[i];

    if (splitDist >= splitDistMin) {
      splitCount = splitCounts[i];
      break;
    }
  }

  this.$splitLine.addStyle('stroke-width', Design.barBlockMargin / Design.height * cHeight + '').attr({
    d: Array(splitCount + 1).fill(0).map(function (u, i) {
      return 'M' + (maxValueX - i * splitDist) + ' ' + (barY - 1) + 'v' + (barHeight + 2);
    }).join(' ')
  });
};

LinearColorBar.prototype._updateGradient = function () {
  var barMax = 1 + this._extendValue;
  var gradientElt = this.$gradient.clearChild();

  this._colorMapping.forEach(function (it) {
    _g({
      tag: 'stop',
      attr: {
        offset: (it.value <= 1 ? it.value / barMax * 100 : 100) + '%'
      },
      style: {
        'stop-color': it.color + '',
        'stop-opacity': '1'
      }
    }).addTo(gradientElt);
  });
};

LinearColorBar.prototype.BUILDIN_COLORS_RANGE = {
  'rainbow': [{
    value: 0,
    color: 'red'
  }, {
    value: 1 / 6,
    color: 'orange'
  }, {
    value: 1 / 3,
    color: 'yellow'
  }, {
    value: 1 / 2,
    color: 'green'
  }, {
    value: 2 / 3,
    color: 'blue'
  }, {
    value: 5 / 6,
    color: 'indigo'
  }, {
    value: 1,
    color: 'violet'
  }, {
    value: Infinity,
    color: 'violet'
  }],
  'rainbow-invert': [{
    value: 0,
    color: 'violet'
  }, {
    value: 1 / 6,
    color: 'indigo'
  }, {
    value: 1 / 3,
    color: 'blue'
  }, {
    value: 1 / 2,
    color: 'green'
  }, {
    value: 2 / 3,
    color: 'yellow'
  }, {
    value: 5 / 6,
    color: 'orange'
  }, {
    value: 1,
    color: 'red'
  }, {
    value: Infinity,
    color: 'violet'
  }],
  'performance': [{
    value: 0,
    color: 'red'
  }, {
    value: 0.5,
    color: 'orange'
  }, {
    value: 1,
    color: 'green'
  }, {
    value: Infinity,
    color: 'green'
  }],
  'performance-invert': [{
    value: 0,
    color: 'green'
  }, {
    value: 0.5,
    color: 'orange'
  }, {
    value: 1,
    color: 'red'
  }, {
    value: Infinity,
    color: 'red'
  }]
};
LinearColorBar.tag = 'LinearColorBar'.toLowerCase();

LinearColorBar.render = function () {
  return _({
    class: 'as-linear-color-bar',
    child: ['svg.as-linear-color-background', '.as-linear-color-value-text', '.as-linear-color-min-value-text', '.as-linear-color-max-value-text']
  });
};

LinearColorBar.property = {};
LinearColorBar.property.valueText = {
  set: function (value) {
    value = value + '';
    this._valueText = value;
    this.$valueText.clearChild().addChild(_({
      text: value
    }));
  },
  get: function () {
    return this._valueText;
  }
};
LinearColorBar.property.minValueText = {
  set: function (value) {
    value = value + '';
    this._minValueText = value;
    this.$minValueText.clearChild().addChild(_({
      text: value
    }));
  },
  get: function () {
    return this._valueText;
  }
};
LinearColorBar.property.maxValueText = {
  set: function (value) {
    value = value + '';
    this._maxValueText = value;
    this.$maxValueText.clearChild().addChild(_({
      text: value
    }));
  },
  get: function () {
    return this._valueText;
  }
};
LinearColorBar.property.value = {
  set: function (value) {
    this._value = value;
  },
  get: function () {
    return this._value;
  }
};
LinearColorBar.property.extendValue = {
  set: function (value) {
    this._extendValue = value;

    this._updateGradient();
  },
  get: function () {
    return this._extendValue;
  }
};
LinearColorBar.property.colorMapping = {
  set: function (value) {
    if (typeof value == "string") value = this.BUILDIN_COLORS_RANGE[value];
    this._colorMapping = value.slice();

    this._colorMapping.sort(function (a, b) {
      return a.value - b.value;
    });

    this._updateGradient();
  },
  get: function () {
    return this._colorMapping;
  }
};

_ACore.default.install(LinearColorBar);

var _default = LinearColorBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MediaInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MediaInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/mediainput.css");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _file = require("absol/src/Converter/file");

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Text = require("absol/src/HTML5/Text");

var _BScroller = _interopRequireDefault(require("./BScroller"));


var MediACore = new _Dom.default();
MediACore.install(_ACore.default);
var _ = MediACore._;
var $ = MediACore.$;

function openFileDialog(props) {
  if (!MediACore.$fileInput) {
    MediACore.$fileInput = _({
      tag: 'input',
      class: 'vmedia-no-show',
      attr: {
        type: 'file'
      },
      props: {}
    }).addTo(document.body);
  }

  props = props || {};

  if (props.accept) {
    if (props.accept instanceof Array) MediACore.$fileInput.attr('accept', props.accept.join(','));else MediACore.$fileInput.attr('accept', props.accept);
  } else {
    MediACore.$fileInput.attr('accept', null);
  }

  if (props.multiple) {
    MediACore.$fileInput.attr('multiple', 'true');
  } else {
    MediACore.$fileInput.attr('multiple');
  }

  MediACore.$fileInput.value = null;
  MediACore.$fileInput.click();
  return new Promise(function (resolve, reject) {
    var finish = false;
    var body = $('body');
    MediACore.$fileInput.once('change', function () {
      finish = true;
      resolve(Array.prototype.map.call(this.files, function (file) {
        return file;
      }));
    });
    body.once('mousedown', function () {
      if (finish) return;
      resolve();
    });
  });
}

function MediaInput() {
  this.$editor = $('.vmedia-media-input-text-container-editor', this);
  this.$editor.on('paste', this.eventHandler.paste);
  this.$editor.on('keydown', this.eventHandler.keydown, true);
  this.$addImagebtn = $('#add-image-btn', this);
  this.$addImagebtn.on('click', this.eventHandler.clickAddImage);
  this.$addFilebtn = $('#add-file-btn', this);
  this.$addFilebtn.on('click', this.eventHandler.clickAddFile);
  this.$imagePreviewContainer = $('.vmedia-media-input-imagepreview-container', this);
  this.on('dragover', this.eventHandler.dragOver);
  this.on('drop', this.eventHandler.drop);
  this.$sendbtn = $('#send-btn', this);
  this.$sendbtn.on('click', this.eventHandler.send);
  this.$toolLeftCtn = $('.vmedia-media-input-tool-container-left', this);
  this.$pluginContentCtn = $('.vmedia-media-input-plugin-content-container', this);
  this.snapData = [];
  this.snapDataHead = 0;
  this.sync = this.afterAttached();
  this.snapText();
}

MediaInput.tag = 'MediaInput'.toLowerCase();

MediaInput.render = function () {
  return _({
    class: 'vmedia-media-input',
    extendEvent: ['send', 'update', 'releaseplugin'],
    child: {
      class: 'vmedia-media-input-text-container',
      child: [{
        class: 'vmedia-media-input-imagepreview-container',
        child: {
          class: 'vmedia-media-input-dropover',
          child: 'download-ico'
        }
      }, {
        class: 'vmedia-media-input-text-container-editor',
        attr: {
          contenteditable: 'true'
        },
        on: {}
      }, {
        class: 'vmedia-media-input-text-container-buttons',
        attr: {
          title: 'Send'
        }
      }, {
        class: 'vmedia-media-input-tool-container',
        child: [{
          class: 'vmedia-media-input-tool-container-left',
          child: [{
            tag: 'button',
            attr: {
              id: 'add-image-btn',
              title: 'Add image'
            },
            child: 'add-image-ico'
          }, {
            tag: 'button',
            attr: {
              id: 'add-file-btn',
              title: 'Add file'
            },
            child: 'add-file-ico'
          }]
        }, {
          class: 'vmedia-media-input-tool-container-right',
          child: [{
            tag: 'button',
            id: 'send-btn',
            attr: {
              title: 'Send'
            },
            child: 'send-ico'
          }]
        }]
      }, '.vmedia-media-input-plugin-content-container.blur']
    }
  });
};

MediaInput.prototype.addImage = function (url, title, data) {
  _({
    tag: 'imagepreview',
    attr: {
      title: title
    },
    props: {
      data: data,
      imgSrc: url
    },
    on: {
      pressremove: function () {
        this.selfRemove();
      }
    }
  }).addTo(this.$imagePreviewContainer);
};

MediaInput.prototype.addFile = function (url, ext, title, data) {
  _({
    tag: 'filepreview',
    attr: {
      title: title
    },
    props: {
      fileSrc: url,
      ext: ext,
      data: data
    },
    on: {
      pressremove: function () {
        this.selfRemove();
      }
    }
  }).addTo(this.$imagePreviewContainer);
};

MediaInput.property = {};
MediaInput.property.text = {
  set: function (value) {
    this.$editor.clearChild();
    value = value || '';
    var lines = value.split(/\r*\n/);
    if (lines.length < 1) return;
    this.$editor.addChild(document.createTextNode(lines[0]));
    lines.shift();
    lines.forEach(function (line) {
      this.$editor.addChild(_({
        child: document.createTextNode(line)
      }));
    }.bind(this));
    this.snapText();
  },
  get: function () {
    return this.getTextFromElements(this.$editor);
  }
};
MediaInput.property.files = {
  get: function () {
    return Array.prototype.filter.call(this.$imagePreviewContainer.childNodes, function (e) {
      return e._azar_extendTags && e._azar_extendTags.filepreview;
    }).map(function (e) {
      return e.data;
    });
  }
};
MediaInput.property.images = {
  get: function () {
    return Array.prototype.filter.call(this.$imagePreviewContainer.childNodes, function (e) {
      return e._azar_extendTags && e._azar_extendTags.imagepreview;
    }).map(function (e) {
      return e.data;
    });
  }
}; // MediaInput.property

MediaInput.property.plugins = {
  set: function (value) {
    this.sync = this.sync.then(this._dettachPlugins.bind(this, this._plugins));

    if (value) {
      if (!(value instanceof Array)) value = [value];
      this._plugins = value;
      this.addClass('has-plugin');
    } else {
      //remove plugin
      this.sync.then(this._dettachPlugins.bind(this));
      this._plugins = null;
      this.removeClass('has-plugin');
    }

    this.sync = this.sync.then(this._attachPlugins.bind(this, this._plugins));
  },
  get: function () {
    return this._plugins || null;
  }
};

MediaInput.prototype.appendText = function (text) {
  var lastBr = null;

  if (this.$editor.childNodes && this.$editor.childNodes.length > 0 && this.$editor.childNodes[this.$editor.childNodes.length - 1].tagName && this.$editor.childNodes[this.$editor.childNodes.length - 1].tagName.toLowerCase() == 'br') {
    lastBr = this.$editor.childNodes[this.$editor.childNodes.length - 1];
  }

  var lines = text.split(/\r?\n/);

  if (lastBr) {
    for (var i = 0; i < lines.length; ++i) {
      if (i > 0) this.$editor.addChild(_('br'));

      var e = _({
        text: lines[i]
      });

      this.$editor.addChild(e);
    }
  } else {
    for (var i = 0; i < lines.length; ++i) {
      if (i > 0) this.$editor.addChildBefore(_('br'), lastBr);

      var e = _({
        text: lines[i]
      });
    }

    this.$editor.addChildBefore(e, lastBr);
  }

  (0, _Text.setSelectionRange)(this.$editor, Infinity);
};

MediaInput.prototype._attachPlugins = function (plugins) {
  if (!plugins) return;
  var self = this;
  plugins.forEach(function (plugin) {
    var oldContent = null;

    var $button = _('button').addTo(self.$toolLeftCtn).on('click', function () {
      if (self._lastActivePlugin == plugin) return;
      self.releasePlugin();
      self._lastActivePlugin = plugin;
      self.$pluginContentCtn.removeClass('blur');
      self.$pluginContentCtn.clearChild();

      if (plugin.getContent) {
        var newContent = plugin.getContent(self, _, $, self.$pluginContentCtn, oldContent);
        oldContent = newContent;
        self.$pluginContentCtn.addChild(newContent);
      }

      var buttonBound = $button.getBoundingClientRect();
      var rootBound = self.$pluginContentCtn.parentNode.getBoundingClientRect();
      self.$pluginContentCtn.addStyle({
        left: buttonBound.left + buttonBound.width / 2 - rootBound.left + 'px',
        bottom: rootBound.bottom - buttonBound.top + 'px'
      });
      if (plugin.onActive) plugin.onActive(self);
      setTimeout(function () {
        var outListener = function (event) {
          if (_EventEmitter.default.hitElement(self.$pluginContentCtn, event)) {} else if (self._lastActivePlugin == plugin) {
            var prevented = true;
            if (plugin.onBlur) plugin.onBlur({
              preventDefault: function () {
                prevented = false;
              }
            });

            if (prevented) {
              self.releasePlugin();
              $(document.body).off('click', outListener);
            }
          } else {
            $(document.body).off('click', outListener);
          }
        };

        $(document.body).on('click', outListener);
        self.once('releaseplugin', function (ev) {
          if (ev.plugin == plugin) {
            $(document.body).off('click', outListener);
          }
        });
      }, 100);
    });

    var btnInners = plugin.getTriggerInner(self, _, $, $button);
    if (!(btnInners instanceof Array)) btnInners = [btnInners];
    btnInners.forEach(function (e) {
      if (typeof e == 'string') {
        e = _({
          text: e
        });
      }

      $button.addChild(e);
    });
    if (plugin.onAttached) plugin.onAttached(self);
  }); //todo

  return true;
};

MediaInput.prototype.releasePlugin = function () {
  if (this._lastActivePlugin) {
    var plugin = this._lastActivePlugin;
    plugin.onDeactived && plugin.onDeactived(self);
    this.$pluginContentCtn.addClass('blur');
    this.emit('releaseplugin', {
      target: this,
      plugin: plugin
    }, this);
    this._lastActivePlugin = null;
  }
};

MediaInput.prototype._dettachPlugins = function (plugins) {
  if (!plugins) return;
  var self = this;
  plugins.forEach(function (plugin) {
    if (plugin.onAttached) plugin.onAttached(self);
  }); //todo

  this._lastActivePlugin = null;
  return true;
};

MediaInput.prototype.focus = function () {
  this.$editor.focus();
  (0, _Text.setSelectionRange)(this.$editor, Infinity);
};

MediaInput.prototype.clear = function () {
  Array.prototype.filter.call(this.$imagePreviewContainer.childNodes, function (e) {
    return e._azar_extendTags && e._azar_extendTags.imagepreview;
  }).forEach(function (e) {
    e.selfRemove();
  });
  Array.prototype.filter.call(this.$imagePreviewContainer.childNodes, function (e) {
    return e._azar_extendTags && e._azar_extendTags.filepreview;
  }).forEach(function (e) {
    return e.selfRemove();
  });
  this.$editor.innerHTML = "";
  this.emit('update', {
    target: this
  }, this);
};

MediaInput.prototype.escapeSpace = function (s) {
  return s.replace(/\s/g, '&nbsp');
};

MediaInput.prototype.unescapeSpace = function (s) {
  return s.replace(/&nbsp/g, ' ');
};

MediaInput.prototype.getTextFromElements = function (element) {
  return (0, _Text.getTextIn)(element); // var self = this;
  // function visit(e, prevE) {
  //     var ac = '';
  //     var isNewLine = false;
  //     if (prevE && prevE.nodeType != Node.TEXT_NODE) {
  //         if (prevE.tagName && prevE.tagName.toLowerCase() == 'br') {
  //             isNewLine = true;
  //         }
  //         else if (Element.prototype.getComputedStyleValue.call(prevE, 'display') == 'block') {
  //             isNewLine = true;
  //         }
  //     }
  //     if (e.nodeType == Node.TEXT_NODE) {
  //         if (isNewLine) ac += '\n';
  //         ac += e.data;
  //     }
  //     else {
  //         var lastE = undefined;
  //         for (var i = 0; i < e.childNodes.length; ++i) {
  //             ac += visit(e.childNodes[i], i > 0 ? e.childNodes[i - 1] : null);
  //         }
  //     }
  //     return ac;
  // }
  // return visit(element);
};

MediaInput.prototype.getElementsFromText = function (text) {
  var newElements = text.split('\n').map(function (text) {
    return document.createTextNode(text);
  }).reduce(function (ac, cr, i, arr) {
    if (i > 0) ac.push(_('br'));
    ac.push(cr);
    return ac;
  }, []);
  return newElements;
}; // MediaInput.prototype.textOnly = function(e) {
//     if (e.nodeType == Node.TEXT_NODE) return e.textContent;
//     if (!e.tagName) return '';
//     if (e.tagName.toLowerCase() == 'br') return '\n';
//     return ($(e).getComputedStyleValue('display') == 'block' ? '\n' : '') + Array.prototype.map.call(e.childNodes, this.textOnly.bind(this)).join('')
// };


MediaInput.prototype.makeTextOnly = function () {
  var self = this;
  var editor = this.$editor;
  Array.apply(null, this.$editor.childNodes).forEach(function (e) {
    e = $(e);
    if (e.nodeType == Node.TEXT_NODE) return;

    if (e.tagName) {
      var tagName = e.tagName.toLowerCase();
      if (tagName == 'br') return;

      if (tagName.match(/img|script|svg|button|iframe|hr|video|canvas/)) {
        e.selfRemove(e);
      }

      if (tagName.match(/select|input|textarea/)) {
        e.selfReplace(document.createTextNode(e.value));
        return;
      }

      var newElements = self.getElementsFromText(self.getTextFromElements(e));
      var lastElement;

      if (e.getComputedStyleValue('display') == 'block') {
        lastElement = _('br');
      } else {
        lastElement = newElements.pop();
      }

      e.selfReplace(lastElement);
      newElements.forEach(function (nE) {
        editor.addChildBefore(nE, lastElement);
      });
    }
  });
  this.emit('update', {
    target: editor
  }, this);
};

MediaInput.eventHandler = {};

MediaInput.eventHandler.keydown = function (event) {
  if (event.key == "Enter") {
    if (!event.ctrlKey && !event.altKey && !event.shiftKey) {
      event.preventDefault();
      this.eventHandler.send(event);
      this.snapText();
    }
  }

  if (event.ctrlKey && event.key == 'z') {
    event.preventDefault();
    this.undoText();
  }

  if (event.ctrlKey && event.key == 'x') {
    setTimeout(this.snapText.bind(this), 100);
  }

  setTimeout(this.emit.bind(this, 'update', event, this), 1);
};

MediaInput.eventHandler.send = function (event) {
  if (this.images.length == 0 && this.text.trim().length == 0 && this.files.length == 0) {
    return;
  }

  this.emit('send', event, this);
  this.snapText();
};

MediaInput.eventHandler.clickAddImage = function (event) {
  openFileDialog({
    accept: 'image/*',
    multiple: true
  }).then(function (files) {
    if (!files) return;
    files.map(function (file) {
      var url = (window.URL || window.webkitURL).createObjectURL(file);
      this.addImage(url, file.name, {
        file: file,
        name: file.name,
        url: url
      });
      this.emit('update', event, this);
    }.bind(this));
  }.bind(this));
};

MediaInput.eventHandler.clickAddFile = function (event) {
  openFileDialog({
    multiple: true
  }).then(function (files) {
    if (!files) return;
    files.map(function (file) {
      var url = (window.URL || window.webkitURL).createObjectURL(file);

      if (file.type.match(/^image/)) {
        this.addImage(url, file.name, {
          file: file,
          name: file.name,
          url: url
        });
      } else {
        var p = file.name.split('.');
        var ext = p.length > 1 ? p[p.length - 1] : '';
        this.addFile(url, ext.toUpperCase(), file.name, {
          file: file,
          name: file.name,
          url: url
        });
      }
    }.bind(this));
    this.emit('update', event, this);
  }.bind(this));
};

MediaInput.eventHandler.dragOver = function (event) {
  event.preventDefault();
  this._lastDragOver = new Date().getTime();
  var currentDragOver = this._lastDragOver;

  if (!this.dragOver) {
    this.dragOver = true;
    this.addClass('dragover');
    this.emit('update', event, this);
  }

  setTimeout(function () {
    this._waitDragFileOut;

    if (this._lastDragOver == currentDragOver) {
      this.removeClass('dragover');
      this.dragOver = false;
      this.emit('update', event, this);
    }
  }.bind(this), 200);
};

MediaInput.eventHandler.drop = function (event) {
  event.preventDefault();

  if (event.dataTransfer.items) {
    for (var i = 0; i < event.dataTransfer.items.length; i++) {
      if (event.dataTransfer.items[i].kind === 'file') {
        var file = event.dataTransfer.items[i].getAsFile();

        if (!file.type && file.size % 4096 == 0) {//todo: folder
        } else {
          this.addSystemFile(file);
          this.emit('update', event, this);
        }
      }
    }
  } else {
    for (var i = 0; i < event.dataTransfer.files.length; i++) {
      var file = event.dataTransfer.files[i];

      if (!file.type && file.size % 4096 == 0) {} else {
        this.addSystemFile(file);
        this.emit('update', event, this);
      }
    }
  }
};

MediaInput.prototype.addSystemFile = function (file) {
  var url = (window.URL || window.webkitURL).createObjectURL(file);

  if (file.type.match(/^image/)) {
    this.addImage(url, file.name, {
      file: file,
      name: file.name,
      url: url
    });
  } else {
    var p = file.name.split('.');
    var ext = p.length > 1 ? p[p.length - 1] : '';
    this.addFile(url, ext.toUpperCase(), file.name, {
      file: file,
      name: file.name,
      url: url
    });
  }
};

MediaInput.eventHandler.paste = function (event) {
  var pasteData = event.clipboardData || window.clipboardData;
  var beforePasteElement = [];
  var self = this;

  function visit(e, ac) {
    ac.push(e);

    if (e.childNodes) {
      for (var i = 0; i < e.childNodes.length; ++i) {
        visit(e.childNodes[i], ac);
      }
    }
  }

  visit(this.$editor, beforePasteElement);

  function relocalCursor() {
    var afterPasteElement = [];
    visit(self.$editor, afterPasteElement);
    var diffElts = afterPasteElement.filter(function (e) {
      return beforePasteElement.indexOf(e) < 0;
    });

    if (diffElts.length > 0) {
      var last = diffElts.pop();

      if (last.nodeType == Node.TEXT_NODE) {
        var range = document.createRange();
        range.selectNodeContents(last);
        range.setStart(last, last.data.length);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
      } else {
        (0, _Text.setSelectionRange)(last, Infinity);
      }
    }
  }
  /**Safari bug */


  if (pasteData && pasteData.items) {
    var items = pasteData.items;
    var isAddImage = false;

    for (var i = 0; i < items.length; i++) {
      if (items[i].type.indexOf('image') !== -1) {
        var blob = items[i].getAsFile();
        var URLObj = window.URL || window.webkitURL;
        var source = URLObj.createObjectURL(blob);
        var file = (0, _file.blobToFile)(blob);
        var buffer = (0, _file.blobToArrayBuffer)(blob).then(function (arrayBuffer) {
          this.addImage(source, 'Clipboard', {
            file: blob,
            name: null,
            url: source,
            blob: blob,
            arrayBuffer: arrayBuffer
          });
          this.emit('update', event, this);
        }.bind(this));
        isAddImage = true;
        this.emit('update', event, this);
      }
    }

    if (isAddImage) event.preventDefault();
    requestAnimationFrame(function () {
      self.makeTextOnly();
      relocalCursor();
    });
  } else {
    requestAnimationFrame(function () {
      var img = $('img', this.$editor, function (img) {
        if (img) {
          img = $(img);
          var source = img.getAttribute('src');
          img.selfRemove();

          _Dom.default.imageToCanvas(img).then(function (canvas) {
            var dataURI = canvas.toDataURL();
            var blob = (0, _file.dataURItoBlob)(dataURI);
            var file = (0, _file.blobToFile)(blob);
            var buffer = (0, _file.blobToArrayBuffer)(blob).then(function (arrayBuffer) {
              this.addImage(source, 'Clipboard', {
                dataURI: dataURI,
                file: blob,
                name: null,
                url: source,
                blob: blob,
                arrayBuffer: arrayBuffer
              });
              this.emit('update', event, this);
            }.bind(this));
          }.bind(this), function (e) {}).catch(function (e) {});
        }
      }.bind(this));
      this.makeTextOnly();
      relocalCursor();
    }.bind(this));
  }
};

MediaInput.prototype.undoText = function () {
  if (this.snapDataHead <= 1) return;
  this.snapDataHead--;
  if (this.snapDataHead <= 0) return;
  var newText = this.snapData[this.snapDataHead - 1];
  this.text = newText;
  (0, _Text.setSelectionRange)(this.$editor, Infinity);
};

MediaInput.prototype.redoText = function () {
  if (this.snapData.length <= this.snapDataHead) return;
  this.snapDataHead++;
  var newText = this.snapData[this.snapDataHead - 1];
  var currentText = this.text;
  this.text = newText;
  (0, _Text.setSelectionRange)(this.$editor, Infinity);
};

MediaInput.prototype.snapText = function () {
  while (this.snapData.length > this.snapDataHead && this.snapData.length > 0) this.snapData.pop();

  var oldText = this.snapData[this.snapDataHead - 1];
  var newText = this.text;
  if (newText == oldText) return;
  this.snapData.push(this.text);
  this.snapDataHead++;
};

function ImagePreview() {
  var res = _({
    extendEvent: 'pressremove',
    class: ['vmedia-media-input-imagepreview', 'vmedia-no-select'],
    child: ['img', 'times-ico']
  });

  res.$img = $('img', res);
  res.$timesIco = $('times-ico', res);
  res.$timesIco.on('click', function (event) {
    res.emit('pressremove', event, res);
  });

  _OOP.default.drillProperty(res, res.$img, 'imgSrc', 'src');

  return res;
}

;

function FilePreview() {
  var res = _({
    extendEvent: 'pressremove',
    class: ['vmedia-media-input-filepreview', 'vmedia-no-select'],
    child: ['attachment-ico', 'times-ico']
  });

  res.$img = $('attachment-ico', res);

  _OOP.default.drillProperty(res, res.$img, 'ext');

  res.$timesIco = $('times-ico', res);
  res.$timesIco.on('click', function (event) {
    res.emit('pressremove', event, res);
  });
  return res;
}

;
MediACore.creator.mediainput = MediaInput;
MediACore.creator.imagepreview = ImagePreview;
MediACore.creator.filepreview = FilePreview;

MediACore.creator['send-ico'] = function () {
  return _(['<svg class="send" width="100" height="100" version="1.1" viewBox="0 0 26.458 26.458">', '    <g transform="translate(0 -270.54)">', '        <path d="m0.64298 272.44 3.1712 9.5402 22.152 1.7742-22.152 1.7482-3.1712 9.4749 25.323-11.223z" />', '    </g>', '</svg>'].join(''));
};

MediACore.creator['add-file-ico'] = function () {
  return _(['<svg class="add-file" width="100" height="100" version="1.1" viewBox="0 0 26.458 26.458" xmlns="http://www.w3.org/2000/svg">', '    <g transform="translate(0 -270.54)">', '        <path d="m4.2431 295.69c-0.74006-0.0759-1.4136-0.33772-2.0047-0.77942-0.19965-0.14919-0.60549-0.55475-0.75233-0.75182-0.45099-0.60524-0.7154-1.2913-0.77699-2.016-0.01275-0.15007-0.01628-2.6111-0.01252-8.7468 0.0049-8.0504 0.0068-8.5472 0.03338-8.6986 0.0883-0.50391 0.22692-0.91024 0.44705-1.3104 0.52794-0.95973 1.452-1.6645 2.5119-1.9158 0.44319-0.10508 0.12729-0.0972 4.1445-0.10308 2.5538-4e-3 3.6864-1e-4 3.7795 0.0121 0.38853 0.0508 0.80777 0.24687 1.2709 0.59434 0.44102 0.33085 0.68272 0.55272 1.7227 1.5813 0.46507 0.45998 1.2812 1.2664 1.8136 1.7921 0.96172 0.94958 1.3847 1.3824 1.696 1.7354 0.61073 0.69257 0.92 1.2063 1.0441 1.7344 0.02613 0.11122 0.02875 0.28598 0.03409 2.2731 0.0047 1.7451 0.0018 2.1574-0.01502 2.178-0.01424 0.0174-0.10685 0.0394-0.2936 0.0699-0.45695 0.0745-1.0078 0.22363-1.4356 0.38862-0.10025 0.0387-0.1888 0.0663-0.19678 0.0613-0.0085-5e-3 -0.01461-0.7983-0.01475-1.9156-2.09e-4 -1.6438-0.0036-1.9208-0.0245-2.0096-0.06972-0.29578-0.28642-0.50043-0.63767-0.60222-0.32942-0.0955-0.31104-0.0947-2.4299-0.10482l-1.9437-9e-3 -0.12495-0.0442c-0.25474-0.0901-0.45899-0.26526-0.5666-0.48578-0.10853-0.22238-0.10356-0.127-0.10407-1.9994-4.63e-4 -1.7153-0.01031-2.1544-0.05446-2.4288-0.06935-0.43095-0.22893-0.69171-0.5027-0.82138l-0.10904-0.0516h-3.1807c-3.4262 0-3.27-4e-3 -3.5482 0.0835-0.68034 0.21325-1.1718 0.754-1.3329 1.4666l-0.0345 0.15261v8.5059c0 8.1045 0.0014 8.5125 0.02871 8.6468 0.08088 0.39719 0.25808 0.72858 0.53956 1.0091 0.28082 0.27984 0.576 0.44186 0.98191 0.53896 0.11389 0.0273 0.36156 0.0293 4.5294 0.0374l4.409 9e-3 0.02019 0.0402c0.0111 0.0221 0.07695 0.15943 0.14632 0.30521s0.17519 0.3518 0.23515 0.45783c0.14341 0.25357 0.43703 0.69284 0.61725 0.92343 0.0793 0.10148 0.14077 0.19003 0.13659 0.19679-0.0073 0.0118-9.9306 0.0132-10.046 1e-3z" />', '        <path transform="matrix(.26458 0 0 .26458 0 270.54)" d="m72.469 65.742v7.4062h-7.4062v7.2852h7.4062v7.2812h7.2793v-7.2812h7.3535v-7.2852h-7.3535v-7.4062zm24.948 11.119a21.371 21.371 0 0 1-21.371 21.371 21.371 21.371 0 0 1-21.371-21.371 21.371 21.371 0 0 1 21.371-21.371 21.371 21.371 0 0 1 21.371 21.371z" style="fill-rule:evenodd;" />', '        <path d="m17.256 283.76 1.921-0.47607-0.04725-4.2884c0-0.50159-0.29516-1.2441-1.0789-2.0168l-4.6989-4.6324c-0.73814-0.72769-1.5947-0.97084-2.1519-0.97084h-7.0235c-2.1533 0.0144-3.4601 2.6226-3.4778 3.4778v17.284c0 2.121 2.2409 3.5346 3.5346 3.5346h10.058l-1.1146-1.9305h-8.6658c-1.1271 0-1.8503-1.1115-1.8503-1.8503v-16.867c0-1.0721 1.1373-1.6977 1.6977-1.6977h6.2175c0.43142 0 0.8103 0.28958 0.8103 1.1742v3.714c0 0.24768 0.36442 0.90967 0.90968 0.90967h3.2537c1.2453 0 1.6905 0.32876 1.6905 1.1613z"  />', '    </g>', '</svg>'].join(''));
};

MediACore.creator['add-image-ico'] = function () {
  return _(['<svg class="add-image" width="100" height="100" version="1.1" viewBox="0 0 26.458 26.458" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="absol/src/HTML5/Elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">', '    <g transform="translate(0 -270.54)">', '        <path d="m24.73 288.69a5.9808 5.9808 0 0 1-5.9808 5.9808 5.9808 5.9808 0 0 1-5.9808-5.9808 5.9808 5.9808 0 0 1 5.9808-5.9808 5.9808 5.9808 0 0 1 5.9808 5.9808zm1.503-0.037a7.5843 7.5843 0 0 1-7.5843 7.5843 7.5843 7.5843 0 0 1-7.5843-7.5843 7.5843 7.5843 0 0 1 7.5843-7.5843 7.5843 7.5843 0 0 1 7.5843 7.5843z" style="fill-rule:evenodd;fill:#414141"/>', '        <path d="m17.869 284.42v3.4127h-3.4081v1.6066h3.4081v3.438h1.6061v-3.438h3.4432v-1.6066h-3.4432v-3.4127z" style="fill-rule:evenodd;fill:#414141"/>', '        <path d="m24.614 281.39v-6.1305c0-1.6957-1.2841-2.6602-2.6602-2.6602h-18.412c-1.4547 0-2.7249 1.0223-2.7249 2.7249v14.986c0 1.2346 0.99768 2.6028 2.586 2.586h6.9542c-0.36184-0.63963-0.51495-1.0286-0.69323-1.6506h-6.4562c-0.29938 0-0.72246-0.40379-0.72246-0.72247v-1.8082l6.0428-6.7569 2.0296 2.0129 0.9605-1.3029-2.9734-3.1488-5.9885 6.7736v-11.426c0-0.24935 0.30766-0.63476 0.63476-0.63476h18.934c0.3592 0 0.84357 0.19284 0.84357 0.84357v5.2285c0.61147 0.22444 1.1564 0.59412 1.6454 1.0858z" style="fill:#414141"/>', '        <circle cx="17.869" cy="277.61" r="1.6891" style="fill-rule:evenodd;fill:#414141"/>', '    </g>', '</svg>'].join(''));
};

MediACore.creator['attachment-ico'] = function () {
  return _(['<svg class="attachment" width="1024" height="1024"  version="1.1" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" >', '    <path d="M145.6 0C100.8 0 64 35.2 64 80v862.4C64 987.2 100.8 1024 145.6 1024h732.8c44.8 0 81.6-36.8 81.6-81.6V324.8L657.6 0h-512z" fill="#8199AF"/>', '    <path d="M960 326.4v16H755.2s-100.8-20.8-99.2-108.8c0 0 4.8 92.8 97.6 92.8H960z" fill="#617F9B"/>', '    <path d="M657.6 0v233.6c0 25.6 17.6 92.8 97.6 92.8H960L657.6 0z" fill="#fff"/>', '    <path d="m491.77 770.31c17.6-19.2 17.6-48 0-67.2s-48-17.6-65.6 0l-147.2 147.2c-17.6 17.6-17.6 48 0 65.6s48 19.2 65.6 0l91.2-89.6c4.8-4.8 4.8-12.8 0-17.6s-14.4-6.4-19.2 0l-57.6 56c-8 8-19.2 8-27.2 0s-8-20.8 0-28.8l56-56c20.8-20.8 54.4-20.8 75.2 0s20.8 54.4 0 75.2l-89.6 89.6c-33.6 33.6-88 33.6-123.2 0-33.6-33.6-33.6-88 0-121.6l147.2-147.2c33.6-33.6 89.6-33.6 123.2 0s33.6 88 0 121.6l-14.4 14.4c-1.6-14.4-6.4-28.8-16-41.6z" style="fill:#fff"/>', '    <path d="m130.09 23.864h504.75v182.93h-545.65v-140.08c0.34155-16.845 13.608-42.414 40.9-42.847z" style="fill-opacity:.29648;fill-rule:evenodd;fill:#fff"/>', '</svg>'].join(''));
};

MediACore.creator['attachment-ico'].property = {
  ext: {
    set: function (value) {
      value = value || '';

      if (this.$ext) {
        this.$ext.selfRemove();
      }

      this.$ext = _Svg.default.ShareInstance._('<text text-anchor="middle" x="321.39" y="170" font-size="145.76" style="fill:white;" >' + value + '</text>').addTo(this);
    },
    get: function () {
      return this._ext || '';
    }
  }
};

MediACore.creator['times-ico'] = function () {
  return _(['<svg class="times" width="100" height="100" version="1.1" viewBox="0 0 26.458 26.458" xmlns="http://www.w3.org/2000/svg">', '    <g transform="translate(0 -270.54)">', '        <path d="m7.7013 276.49 5.4832 5.4832 5.5494-5.5494 1.7874 1.7874-5.5291 5.5291 5.4957 5.4957-1.754 1.754-5.5124-5.5124-5.5542 5.5542-1.7623-1.7623 5.5375-5.5375-5.5208-5.5208zm17.103 7.3351a11.558 11.558 0 0 1-11.558 11.558 11.558 11.558 0 0 1-11.558-11.558 11.558 11.558 0 0 1 11.558-11.558 11.558 11.558 0 0 1 11.558 11.558z" style="fill-rule:evenodd;"/>', '    </g>'].join(''));
};

MediACore.creator['download-ico'] = function () {
  return _(['<svg class="download" width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">', '    <g transform="translate(0,-197)">', '        <path d="m44.888 209.14h13.982c1.1087 0.0459 2.2328 0.74137 2.317 2.3612v23.694h13.622c1.9742-0.18801 3.004 2.6244 1.9175 4.1118l-23.469 23.918c-0.876 0.77477-1.9993 0.77232-2.9362 0l-23.559-24.009c-0.86532-1.0422 0.11658-4.1953 2.3821-4.2047h13.268v-22.939c-0.08167-1.1772 0.78292-2.9507 2.4768-2.9312z" style="fill:#00c3e5"/>', '        <path d="m86.97 276.99a3.5027 3.5696 0 0 1-3.5027 3.5696 3.5027 3.5696 0 0 1-3.5027-3.5696 3.5027 3.5696 0 0 1 3.5027-3.5696 3.5027 3.5696 0 0 1 3.5027 3.5696zm-12.768 0a3.5027 3.5696 0 0 1-3.5027 3.5696 3.5027 3.5696 0 0 1-3.5027-3.5696 3.5027 3.5696 0 0 1 3.5027-3.5696 3.5027 3.5696 0 0 1 3.5027 3.5696zm-60.003-16.135h24.609c9.1206 13.508 17.573 12.942 26.609 0h23.839c2.8529 5e-3 3.5087 2.3205 3.4679 3.8227v18.953c0.04867 1.3083-1.5145 2.9901-2.7505 2.9832h-76.253c-1.049 0.0441-2.6554-1.4851-2.6306-3.1451l-1.56e-4 -18.792c0.0024-1.3549 0.50958-3.7927 3.1091-3.8227z" style="fill-rule:evenodd;fill:#00c3e5"/>', '    </g>', '</svg>'].join(''));
};

MediACore.creator['plus-ico'] = function () {
  return _('<svg class="_7oal" height="24" width="24" viewBox="0 0 24 24"><g fill="none" fill-rule="evenodd"><polygon points="-6,30 30,30 30,-6 -6,-6 "></polygon><path d="m18,11l-5,0l0,-5c0,-0.552 -0.448,-1 -1,-1c-0.5525,0 -1,0.448 -1,1l0,5l-5,0c-0.5525,0 -1,0.448 -1,1c0,0.552 0.4475,1 1,1l5,0l0,5c0,0.552 0.4475,1 1,1c0.552,0 1,-0.448 1,-1l0,-5l5,0c0.552,0 1,-0.448 1,-1c0,-0.552 -0.448,-1 -1,-1m-6,13c-6.6275,0 -12,-5.3725 -12,-12c0,-6.6275 5.3725,-12 12,-12c6.627,0 12,5.3725 12,12c0,6.6275 -5.373,12 -12,12" ></path></g></svg>');
};

_ACore.default.install(MediaInput);

var _default = MediaInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tokenizeiput/TITextController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tokenizeiput/TITextController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.EMPTY_2_SPACES = void 0;

var _EmojiAnims = require("../EmojiAnims");

var _ACore = require("../../ACore");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _EmojiPicker = _interopRequireDefault(require("../EmojiPicker"));

var _utils = require("../utils");

var _tiutils = require("./tiutils");


var EMPTY_2_SPACES = String.fromCharCode(0x2003);
exports.EMPTY_2_SPACES = EMPTY_2_SPACES;
var emojiCSSLoaded = false;

function loadEmojiCSS() {
  if (emojiCSSLoaded) return;
  emojiCSSLoaded = true;

  _Dom.default.documentReady.then(() => {
    var styleSheet = {};

    for (var name in _EmojiAnims.EmojiAnimByIdent) {
      styleSheet['.as-emoji-token[data-text="' + name + '"]'] = {
        'background-image': 'url(' + _EmojiPicker.default.assetRoot + '/static/x20/' + _EmojiAnims.EmojiAnimByIdent[name][1] + ')'
      };
    }

    (0, _utils.buildCss)(styleSheet);
  });
}
/***
 *
 * @param {TokenizeHyperInput} elt
 * @constructor
 */


function TITextController(elt) {
  loadEmojiCSS();
  this.elt = elt;
}

TITextController.prototype.setText = function (text) {
  this.elt.clearChild();
  this.elt.addChild((0, _tiutils.text2ContentElements)(text, {
    tagMap: this.elt.tagMap
  }));
  this.elt.addChild(this.elt.$br);
};

TITextController.prototype.getText = function () {
  var nodes = Array.prototype.slice.call(this.elt.childNodes);

  if ((0, _tiutils.isNewLine)(nodes[nodes.length - 1])) {
    nodes.pop();
  }

  return nodes.map(node => {
    if ((0, _tiutils.isText)(node)) {
      return node.data;
    } else if ((0, _tiutils.isToken)(node)) {
      return node.getAttribute('data-text') || '';
    } else if ((0, _tiutils.isNewLine)(node)) return '\n';
  }).join('');
};
/***
 *
 * @param {Range=} range default: previous selected range
 */


TITextController.prototype.getTextByRange = function (range) {
  range = range || this.elt.selectionCtrl.prevRange;
  if (!range) return this.getText();
  var nodes = Array.prototype.slice.call(this.elt.childNodes);
  if ((0, _tiutils.isNewLine)(nodes[nodes.length - 1])) nodes.pop();
  var startCtn = range.startContainer;
  var startOffset = range.startOffset;
  var endCtn = range.endContainer;
  var endOffset = range.endOffset;

  if (startCtn === this.elt) {
    startCtn = this.elt.childNodes[startOffset - 1];
    startOffset = 0;
  } else if ((0, _tiutils.isTokenText)(startCtn)) {
    startCtn = startCtn.parentElement;
  }

  if (endCtn === this.elt) {
    endCtn = this.elt.childNodes[endOffset];
    endOffset = 0;
  } else if ((0, _tiutils.isTokenText)(endCtn)) {
    endCtn = endCtn.parentElement;
  }

  if (startCtn === endCtn) {
    if ((0, _tiutils.isToken)(startCtn)) {
      return startCtn.getAttribute('data-text');
    } else if ((0, _tiutils.isText)(startCtn)) {
      return startCtn.data.substring(startOffset, endOffset);
    }

    return '';
  }

  var res = '';
  var node;
  var started = false;

  for (var i = 0; i < nodes.length; ++i) {
    node = nodes[i];

    if (started) {
      if (endCtn === node) {
        if ((0, _tiutils.isToken)(endCtn)) {
          res += node.getAttribute('data-text');
        } else if ((0, _tiutils.isText)(node)) {
          res += node.data.substring(0, endOffset);
        }

        break;
      } else {
        if ((0, _tiutils.isToken)(node)) {
          res += node.getAttribute('data-text');
        } else if ((0, _tiutils.isText)(node)) {
          res += node.data;
        } else if ((0, _tiutils.isNewLine)(node)) {
          res += '\n';
        }
      }
    } else {
      if (startCtn === node) {
        started = true;

        if ((0, _tiutils.isText)(node)) {
          res += node.data.substring(startOffset);
        } else if ((0, _tiutils.isToken)(node)) {
          if (startOffset === 0) {
            res += node.getAttribute('data-text');
          }
        }
      }
    }
  }

  return res;
};

TITextController.prototype.applyData = function (text, offset) {
  this.setText(text);
  this.elt.selectionCtrl.setRangeByOffset(offset);
};

TITextController.prototype.insertText = function (text) {
  var range = document.getSelection().getRangeAt(0);
  range.deleteContents();
  this.elt.selectionCtrl.onSelect();
  range = document.getSelection().getRangeAt(0);
  var eltChain = (0, _tiutils.text2ContentElements)(text, {
    tagMap: this.elt.tagMap
  });
  var startCtn = range.startContainer;
  var at;

  if ((0, _tiutils.isTokenText)(startCtn)) {
    at = startCtn.parentElement;
  } else if (startCtn === this.elt) {
    at = this.elt.childNodes[range.startOffset - 1];
  }

  var newNode;

  while (eltChain.length > 0) {
    newNode = eltChain.shift();

    if (!at) {
      this.elt.addChildBefore(newNode, this.elt.firstChild);
      at = newNode;
    } else if ((0, _tiutils.isText)(at) && (0, _tiutils.isText)(newNode)) {
      at.data += newNode.data;
    } else {
      this.elt.addChildAfter(newNode, at);
      at = newNode;
    }
  }
};

var _default = TITextController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tokenizeiput/tiutils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tokenizeiput/tiutils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.tokenizeMessageText = tokenizeMessageText;
exports.findNextTextNode = findNextTextNode;
exports.findPrevTextNode = findPrevTextNode;
exports.text2ContentElements = text2ContentElements;
exports.isToken = exports.isTokenText = exports.getLastTextNode = exports.getFirstTextNode = exports.isNewLine = exports.isText = void 0;

var _EmojiAnims = require("../EmojiAnims");

var _ACore = require("../../ACore");

var _TITextController = require("./TITextController");

function tokenizeMessageText(text) {
  var emojis = _EmojiAnims.EmojiAnimByIdent;
  var splitter = Object.keys(_EmojiAnims.EmojiAnimByIdent).concat(['\n']);
  var tagTokens = text.match(/@\[id:\d+]/g) || [];
  var otherTokens = text.split(/@\[id:\d+]/g);
  var tokens = otherTokens.reduce((ac, cr, i) => {
    ac.push(cr);
    if (i < tagTokens.length) ac.push(tagTokens[i]);
    return ac;
  }, []);
  tokens = splitter.reduce((chain, splitter) => {
    return chain.reduce((ac, token) => {
      var subChain = token.split(splitter);

      for (var i = 0; i < subChain.length; ++i) {
        if (subChain[i]) {
          ac.push(subChain[i]);
        }

        if (i + 1 < subChain.length) {
          ac.push(splitter);
        }
      }

      return ac;
    }, []);
  }, tokens);
  tokens = tokens.map(text => {
    var tagId;

    if (text === '\n') {
      return {
        type: 'NEW_LINE'
      };
    } else if (emojis[text]) {
      return {
        type: 'EMOJI',
        value: text
      };
    } else if (text.match(/^@\[id:\d+]$/)) {
      tagId = text.substring(5, text.length - 1);
      return {
        type: "TAG",
        value: tagId
      };
    } else return {
      type: 'TEXT',
      value: text
    };
  });
  return tokens;
}

var isText = node => {
  return node && node.nodeType === Node.TEXT_NODE;
};

exports.isText = isText;

var isNewLine = node => {
  return node && node.tagName === 'BR';
};
/***
 *
 * @param {Text|AElement}node
 * @returns {null|*}
 */


exports.isNewLine = isNewLine;

var getFirstTextNode = node => {
  if (node.nodeType === Node.TEXT_NODE || node.tagName === 'BR') return node;
  var nodes = node.childNodes;
  var res = null;

  for (var i = 0; i < nodes.length && !res; ++i) {
    res = res || getFirstTextNode(nodes[i]);
  }

  return res;
};

exports.getFirstTextNode = getFirstTextNode;

var getLastTextNode = node => {
  if (node.nodeType === Node.TEXT_NODE || node.tagName === 'BR') return node;
  var nodes = node.childNodes;
  var res = null;

  for (var i = nodes.length - 1; i > 0 && !res; --i) {
    res = res || getLastTextNode(node);
  }

  return res;
};

exports.getLastTextNode = getLastTextNode;

var isTokenText = node => {
  if (node.nodeType !== Node.TEXT_NODE) return false;
  return isToken(node.parentElement);
};

exports.isTokenText = isTokenText;

var isToken = node => {
  return node && node.classList && (node.classList.contains('as-emoji-token') || node.classList.contains('as-tag-token'));
};

exports.isToken = isToken;

function findNextTextNode(root, current) {
  var nextTextNode = node => {
    var res = null;
    var next = node.nextSibling;

    while (next && !res) {
      res = getFirstTextNode(next);
      next = next.nextSibling;
    }

    if (!res && node.parentElement !== root) {
      res = nextTextNode(node.parentElement);
    }

    return res;
  };

  return nextTextNode(current);
}

function findPrevTextNode(root, current) {
  var prevTextNode = node => {
    var res = null;
    var prev = node.previousSibling;

    while (prev && !res) {
      res = getLastTextNode(prev);
      prev = prev.previousSibling;
    }

    if (!res && node.parentElement !== root) {
      res = prevTextNode(node.parentElement);
    }

    return res;
  };

  return prevTextNode(current);
}

function text2ContentElements(text, opt) {
  return tokenizeMessageText(text).map(token => {
    var textOfTag;

    switch (token.type) {
      case 'NEW_LINE':
        return (0, _ACore._)('br');

      case 'EMOJI':
        return (0, _ACore._)({
          tag: 'span',
          class: 'as-emoji-token',
          attr: {
            'data-display': _TITextController.EMPTY_2_SPACES,
            'data-text': token.value
          },
          child: {
            text: _TITextController.EMPTY_2_SPACES
          }
        });

      case 'TAG':
        textOfTag = opt.tagMap && opt.tagMap[token.value];
        return (0, _ACore._)({
          tag: 'span',
          class: 'as-tag-token',
          attr: {
            'data-text': '@[id:' + token.value + ']',
            'data-display': textOfTag ? '@' + textOfTag : '@[id:' + token.value + ']'
          },
          child: {
            text: textOfTag ? '@' + textOfTag : '@[id:' + token.value + ']'
          }
        });

      case 'TEXT':
      default:
        return (0, _ACore._)({
          text: token.value
        });
    }
  });
}
};

moduleFactories["node_modules/absol-acomp/js/messageinput/MessageInputPlugin.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/messageinput/MessageInputPlugin.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _stringGenerate = require("absol/src/String/stringGenerate");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _ACore = require("../../ACore");

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


/***
 * @typedef MessageInputPluginOption
 * @property {string} [id]
 * @property {string|Object|AElement} icon
 * @property {function(_thisAdapter: MessageInputPlugin, _:Dom._, Dom.$):AElement} createContent
 * @property {function(_thisAdapter:MessageInputPlugin):void} onPressTrigger
 * @property {"left"|"right"} popupAlign
 * @property {boolean=} alwaysVisible
 */

/***
 *
 * @param {MessageInput} inputElt
 * @param {MessageInputPluginOption} opt
 * @constructor
 */
function MessageInputPlugin(inputElt, opt) {
  this.opt = opt || {};
  this.inputElt = inputElt;
  this.icon = opt.icon;
  this.id = opt.id || (0, _stringGenerate.randomIdent)(16);
  this.alwaysVisible = !!opt.alwaysVisible;
  this.$icon = null;
  this.$triggerBtn = null;
  this.$content = null;
  this.$popup = null;
  if (opt.createContent) this.createContent = opt.createContent;
  if (opt.onPressTrigger) this.onPressTrigger = opt.onPressTrigger;
  this.autoClose = true;

  if ('autoClose' in opt) {
    this.autoClose = !!opt.autoClose;
  }

  this.popupAlign = opt.popupAlign || 'left';
  this.ev_pressTrigger = this.ev_pressTrigger.bind(this);
  this.ev_pressOut = this.ev_pressOut.bind(this);
}

MessageInputPlugin.prototype.isMessagePlugin = true;

MessageInputPlugin.prototype.ev_pressTrigger = function (event) {
  var value = this.inputElt.$preInput.value;
  this._lastInputSelectPosion = this.inputElt.$preInput.getSelectPosition() || {
    start: value.length,
    end: value.length
  };

  if (this.onPressTrigger) {
    this.onPressTrigger(this);
  } else {
    if (this.isPopupOpened()) {
      this.closePopup();
    } else {
      this.openPopup();
    }
  }
};

MessageInputPlugin.prototype.insertText = function (itext) {
  if (!this._lastInputSelectPosion) {
    throw new Error('Invalid call');
  }

  var text = this.inputElt.$preInput.value;
  var newText = text.substr(0, this._lastInputSelectPosion.start) + itext + text.substr(this._lastInputSelectPosion.end);
  var selected = this._lastInputSelectPosion;
  var newOffset = selected.start + itext.length;
  this.inputElt.$preInput.focus();
  this.inputElt.$preInput.applyData(newText, newOffset);
  this.inputElt.$preInput.commitChange(newText, newOffset);
  this.inputElt.notifySizeChange();
  this.inputElt.$preInput.focus();
};

MessageInputPlugin.prototype.appendText = function (itext) {
  if (!this._lastInputSelectPosion) {
    throw new Error('Invalid call');
  }

  var text = this.inputElt.$preInput.value;
  var newText = text + itext;
  var newOffset = newText.length;
  this.inputElt.$preInput.focus();
  this.inputElt.$preInput.applyData(newText, newOffset);
  this.inputElt.$preInput.commitChange(newText, newOffset);
  this.inputElt.notifySizeChange();
  this.inputElt.$preInput.focus();
};

MessageInputPlugin.prototype.replaceText = function (itext) {
  if (!this._lastInputSelectPosion) {
    throw new Error('Invalid call');
  }

  var newText = itext;
  var newOffset = newText.length;
  this.inputElt.$preInput.focus();
  this.inputElt.$preInput.applyData(newText, newOffset);
  this.inputElt.$preInput.commitChange(newText, newOffset);
  this.inputElt.notifySizeChange();
  this.inputElt.$preInput.focus();
};

MessageInputPlugin.prototype.ev_pressOut = function (event) {
  if (_EventEmitter.default.hitElement(this.getTriggerButton(), event)) return;
  if (_EventEmitter.default.hitElement(this.getPopup(), event)) return;
  if (!this.autoClose) return;
  this.closePopup();
};

MessageInputPlugin.prototype.getIconElt = function () {
  if (!this.$icon) this.$icon = (0, _ACore._)(this.icon);
  return this.$icon;
};

MessageInputPlugin.prototype.getTriggerButton = function () {
  if (!this.$triggerBtn) {
    this.$triggerBtn = (0, _ACore._)({
      tag: 'button',
      class: ['as-message-input-plugin-btn', 'as-message-input-plugin-' + this.id],
      child: this.getIconElt(),
      on: {
        click: this.ev_pressTrigger
      }
    });

    if (this.alwaysVisible) {
      this.$triggerBtn.addClass('as-always-visible');
    }
  }

  return this.$triggerBtn;
};

MessageInputPlugin.prototype.createContent = function (_thisAdapter, _, $) {
  return _({
    tag: 'div'
  });
};
/***
 *
 * @type {null|function(_thisAdapter:MessageInputPlugin):void}
 */


MessageInputPlugin.prototype.onPressTrigger = null;

MessageInputPlugin.prototype.getContent = function () {
  if (!this.$content) this.$content = this.createContent(this.inputElt, _ACore._, _ACore.$);
  return this.$content;
};

MessageInputPlugin.prototype.getPopup = function () {
  if (!this.$popup) {
    this.$popup = (0, _ACore._)({
      class: ['as-message-input-external-tools-popup', 'as-align-' + this.popupAlign],
      child: this.getContent()
    });
  }

  return this.$popup;
};

MessageInputPlugin.prototype.openPopup = function () {
  if (this.isPopupOpened()) return;
  this.inputElt.appendChild(this.getPopup());
  document.body.addEventListener('click', this.ev_pressOut);
  this.onOpen();

  if (this.opt.onOpen) {
    this.opt.onOpen.call(this, this.inputElt, _ACore._, _ACore.$);
  }
};

MessageInputPlugin.prototype.closePopup = function () {
  if (!this.isPopupOpened()) return;

  if (this.opt.onClose) {
    this.opt.onClose.call(this, this.inputElt, _ACore._, _ACore.$);
  }

  this.onClose();
  this.getPopup().remove();
  document.body.removeEventListener('click', this.ev_pressOut);
};

MessageInputPlugin.prototype.isPopupOpened = function () {
  return !!this.getPopup().parentElement;
};

MessageInputPlugin.prototype.onOpen = _noop.default;
MessageInputPlugin.prototype.onClose = _noop.default;
Object.defineProperty(MessageInputPlugin.prototype, 'contentElt', {
  get: function () {
    return this.getContent();
  }
});
var _default = MessageInputPlugin;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/messageinput/MIEmojiPlugin.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/messageinput/MIEmojiPlugin.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _MessageInputPlugin = _interopRequireDefault(require("./MessageInputPlugin"));

var _ACore = require("../../ACore");


/****
 * @extends MessageInputPlugin
 * @constructor
 */
function MIEmojiPlugin(inputElt) {
  _MessageInputPlugin.default.call(this, inputElt, {
    id: 'emoji_picker',
    icon: 'span.mdi.mdi-emoticon-happy-outline'
  });

  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }
}

_OOP.default.mixClass(MIEmojiPlugin, _MessageInputPlugin.default);

MIEmojiPlugin.prototype.createContent = function () {
  return (0, _ACore._)('emojipicker') //.addTo(this.$emojiPickerCtn)
  .on('pick', this.ev_PickEmoji);
};

MIEmojiPlugin.prototype.ev_PickEmoji = function (event) {
  var text = this.inputElt.$preInput.value;
  var selected = this._lastInputSelectPosion;
  var newText = text.substr(0, selected.start) + event.key + text.substr(selected.end);
  var newOffset = selected.start + event.key.length;
  this._lastInputSelectPosion = {
    start: newOffset,
    end: newOffset
  };
  this.inputElt.$preInput.focus();
  this.inputElt.$preInput.applyData(newText, newOffset);
  this.inputElt.$preInput.commitChange(newText, newOffset);
  this.inputElt.notifySizeChange();
  this.inputElt.$preInput.focus();
};

MIEmojiPlugin.prototype.onOpen = function () {
  var value = this.inputElt.$preInput.value;
  this._lastInputSelectPosion = this.inputElt.$preInput.getSelectPosition() || {
    start: value.length,
    end: value.length
  };
  this.inputElt.$preInput.focus();
};

var _default = MIEmojiPlugin;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/assets/exticons/catalog.json"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/assets/exticons/catalog.json ***/
module.exports = ["3g2","3ga","3gp","7z","aa","aac","ac","accdb","accdt","ace","adn","ai","aif","aifc","aiff","ait","amr","ani","apk","app","applescript","asax","asc","ascx","asf","ash","ashx","asm","asmx","asp","aspx","asx","au","aup","avi","axd","aze","bak","bash","bat","bin","blank","bmp","bowerrc","bpg","browser","bz2","bzempty","c","cab","cad","caf","cal","cd","cdda","cer","cfg","cfm","cfml","cgi","chm","class","cmd","code-workspace","codekit","coffee","coffeelintignore","com","compile","conf","config","cpp","cptx","cr2","crdownload","crt","crypt","cs","csh","cson","csproj","css","csv","cue","cur","dart","dat","data","db","dbf","deb","default","dgn","dist","diz","dll","dmg","dng","doc","docb","docm","docx","dot","dotm","dotx","download","dpj","ds_store","dsn","dtd","dwg","dxf","editorconfig","el","elf","eml","enc","eot","eps","epub","eslintignore","exe","f4v","fax","fb2","fla","flac","flv","fnt","folder","fon","gadget","gdp","gem","gif","gitattributes","gitignore","go","gpg","gpl","gradle","gz","h","handlebars","hbs","heic","hlp","hs","hsl","htm","html","ibooks","icns","ico","ics","idx","iff","ifo","image","img","iml","in","inc","indd","inf","info","ini","inv","iso","j2","jar","java","jpe","jpeg","jpg","js","json","jsp","jsx","key","kf8","kmk","ksh","kt","kts","kup","less","lex","licx","lisp","lit","lnk","lock","log","lua","m","m2v","m3u","m3u8","m4","m4a","m4r","m4v","map","master","mc","md","mdb","mdf","me","mi","mid","midi","mk","mkv","mm","mng","mo","mobi","mod","mov","mp2","mp3","mp4","mpa","mpd","mpe","mpeg","mpg","mpga","mpp","mpt","msg","msi","msu","nef","nes","nfo","nix","npmignore","ocx","odb","ods","odt","ogg","ogv","ost","otf","ott","ova","ovf","p12","p7b","pages","part","pcd","pdb","pdf","pem","pfx","pgp","ph","phar","php","pid","pkg","pl","plist","pm","png","po","pom","pot","potx","pps","ppsx","ppt","pptm","pptx","prop","ps","ps1","psd","psp","pst","pub","py","pyc","qt","ra","ram","rar","raw","rb","rdf","rdl","reg","resx","retry","rm","rom","rpm","rpt","rsa","rss","rst","rtf","ru","rub","sass","scss","sdf","sed","sh","sit","sitemap","skin","sldm","sldx","sln","sol","sphinx","sql","sqlite","step","stl","svg","swd","swf","swift","swp","sys","tar","tax","tcsh","tex","tfignore","tga","tgz","tif","tiff","tmp","tmx","torrent","tpl","ts","tsv","ttf","twig","txt","udf","vb","vbproj","vbs","vcd","vcf","vcs","vdi","vdx","vmdk","vob","vox","vscodeignore","vsd","vss","vst","vsx","vtx","war","wav","wbk","webinfo","webm","webp","wma","wmf","wmv","woff","woff2","wps","wsf","xaml","xcf","xfl","xlm","xls","xlsm","xlsx","xlt","xltm","xltx","xml","xpi","xps","xrb","xsd","xsl","xspf","xz","yaml","yml","z","zip","zsh"];

};

moduleFactories["node_modules/absol-acomp/js/messageinput/MessageInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/messageinput/MessageInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseMessage = parseMessage;
exports.prepareIcon = prepareIcon;
exports.MessageQuote = MessageQuote;
exports.default = exports.MODE_EDIT = exports.MODE_NEW = void 0;

require("../../css/messageinput.css");

var _ACore = _interopRequireDefault(require("../../ACore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _utils = require("../utils");

var _EmojiAnims = require("../EmojiAnims");

var _EmojiPicker = _interopRequireDefault(require("../EmojiPicker"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _CMDRunner = _interopRequireDefault(require("absol/src/AppPattern/CMDRunner"));

var _keyboard = require("absol/src/Input/keyboard");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _tiutils = require("../tokenizeiput/tiutils");

var _MessageInputPlugin = _interopRequireDefault(require("./MessageInputPlugin"));

var _MIEmojiPlugin = _interopRequireDefault(require("./MIEmojiPlugin"));

var _catalog = _interopRequireDefault(require("../../assets/exticons/catalog.json"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var $$ = _ACore.default.$$;
/***
 *
 * @typedef {{text:string, desc: string, img?:string, file?:string}|string} MessageInputQuote
 */

var MODE_NEW = 0;
exports.MODE_NEW = MODE_NEW;
var MODE_EDIT = 1;
exports.MODE_EDIT = MODE_EDIT;
var isMobile = _BrowserDetector.default.isMobile;
/***
 * @extends AElement
 * @constructor
 */

function MessageInput() {
  this._cmdRunner = new _CMDRunner.default(this);
  this._keyMaps = {};
  this._plugins = [];
  this._mode = MODE_NEW; //edit

  this._editingText = "";
  prepareIcon();
  /**
   * @type {import('../PreInput').default}
   */

  this.$preInput = $('.as-message-input-pre', this);
  this.$preInput.on('change', this.eventHandler.preInputChange).on('keyup', this.eventHandler.preInputKeyUp).on('keydown', this.eventHandler.preInputKeyDown).on('pasteimg', this.eventHandler.preInputPasteImg).on('focus', this.eventHandler.preInputFocus).on('blur', this.eventHandler.preInputBlur); // //every can make size change

  this._imageFiles = [];
  this._files = [];
  this._latBound = {};
  this.$quote = $('messagequote.as-message-input-quote', this).on('pressremove', this.eventHandler.clickQuoteRemoveBtn);
  this.$left = $('.as-message-input-left', this);
  this.$right = $('.as-message-input-right', this);
  this.$attachmentCtn = $('.as-message-input-attachment-ctn', this);
  this.$fileBtn = $('.as-message-input-plugin-file', this).on('click', this.openFileDialog.bind(this));
  this.$attachmentAddBtn = $('.as-message-input-attachment-add-btn', this).on('click', this.openFileDialog.bind(this));
  this.$sendBtn = $('.as-message-input-plugin-send', this).on('click', this.notifySend.bind(this));
  this.$cancelBtn = $('.as-message-input-plugin-cancel', this).on('click', this.notifyCancel.bind(this));
  this.$attachhook = _('attachhook').addTo(this).on('attached', this.notifySizeChange.bind(this)).on('attached', this._updateSize.bind(this));
  this.on('drop', this.eventHandler.drop).on('dragover', this.eventHandler.dragover);

  _OOP.default.drillProperty(this, this.$preInput, 'tagList');

  this.autoSend = false;
  /***
   *
   * @type {MessageInputQuote|null}
   */

  this.quote = null;
  this.addPlugin(new _MIEmojiPlugin.default(this));
}

MessageInput.MODE_EDIT = MODE_EDIT;
MessageInput.MODE_NEW = MODE_NEW;

MessageInput.iconAssetRoot = function () {
  if (location.hostname.match(/^.*(\.?absol\.cf|absol\.ddns\.net)$/) || location.hostname === 'localhost') return 'https://absol.cf/exticons/vivid';
  return '/vivid_exticons';
}();

MessageInput.tag = 'MessageInput'.toLowerCase();

MessageInput.render = function (data) {
  data = data || {};
  data.iconAssetRoot = data.iconAssetRoot || MessageInput.iconAssetRoot;
  return _({
    attr: {
      'data-icon-asset-root': MessageInput.iconAssetRoot
    },
    class: ['as-message-input'].concat(data.v2 ? ['as-v2'] : []),
    extendEvent: ['sendtext', 'sendimage', 'sendfile', 'sendquote', 'cancel', 'change', 'sizechange', 'send', 'useraddfile'],
    child: [{
      class: 'as-message-input-right',
      child: [{
        tag: 'button',
        class: ['as-message-input-plugin-btn', 'as-message-input-plugin-file'],
        child: 'span.mdi.mdi-attachment.mdi-rotate-90'
      }, {
        tag: 'button',
        class: ['as-message-input-plugin-btn', 'as-message-input-plugin-send'],
        child: 'span.mdi.mdi-send'
      }, {
        tag: 'button',
        class: ['as-message-input-plugin-btn', 'as-message-input-plugin-cancel'],
        child: 'span.mdi.mdi-close'
      }]
    }, {
      class: 'as-message-input-pre-ctn',
      child: ['messagequote.as-message-input-quote.as-removable.as-shorten-text', {
        class: 'as-message-input-left'
      }, {
        class: ['as-message-input-attachment-ctn', 'as-bscroller'],
        child: [{
          tag: 'button',
          class: 'as-message-input-attachment-add-btn',
          child: ['span.mdi.mdi-arrow-down-bold.as-message-input-attachment-add-btn-drop', {
            tag: 'span',
            class: 'as-message-input-attachment-add-btn-plus',
            child: {
              text: "+"
            }
          }]
        }]
      }, (data.v2 ? 'tokenizehyperinput' : 'preinput') + '.as-message-input-pre.absol-bscroller']
    }]
  });
};

MessageInput.prototype.notifyChange = function () {
  this.emit('change', {
    name: 'change',
    target: this
  }, this);

  if (this.autoSend) {
    if (this.files.length > 0 || this.images.length > 0) this.notifySend();
  }
};

MessageInput.prototype.notifySend = function () {
  var eventData = {
    imageRemovePrevented: false,
    fileRemovePrevented: false,
    textRemovePrevented: false,
    quoteRemovePrevented: false,
    target: this,
    files: this.files,
    images: this.images,
    text: this.text
  };

  if (eventData.files.length > 0) {
    this.emit('sendfile', Object.assign(eventData, {
      type: 'sendfile',
      preventDefault: function () {
        this.fileRemovePrevented = true;
      }
    }), this);
  }

  if (eventData.images.length > 0) {
    this.emit('sendimage', Object.assign(eventData, {
      type: 'sendimage',
      preventDefault: function () {
        this.imageRemovePrevented = true;
      }
    }), this);
  }

  if (typeof this.quote === "string" || this.quote) {
    this.emit('sendquote', Object.assign(eventData, {
      type: 'sendquote',
      preventDefault: function () {
        this.quoteRemovePrevented = true;
      }
    }), this);
  }

  if (this.files.length > 0 || eventData.images.length > 0 || eventData.text || typeof this.quote === "string" || this.quote) {
    if (eventData.text) this.$preInput.focus();
    this.emit('send', Object.assign(eventData, {
      type: 'send',
      preventDefault: function () {
        this.imageRemovePrevented = true;
        this.fileRemovePrevented = true;
        this.imageRemovePrevented = true;
        this.quoteRemovePrevented = true;
      }
    }), this);
  }

  if (!eventData.fileRemovePrevented) this.files = [];
  if (!eventData.imageRemovePrevented) this.images = [];
  if (!eventData.textRemovePrevented) this.text = '';
  if (!eventData.quoteRemovePrevented) this.quote = null;
};

MessageInput.prototype.notifyCancel = function () {
  this.emit('cancel', {
    type: 'cancel',
    name: 'send',
    target: this,
    clearAllContent: this.clearAllContent.bind(this)
  }, this);
};

MessageInput.prototype.clearAllContent = function () {
  this.text = '';
  this.quote = null;
  this.files = [];
  this.images = [];
};

MessageInput.prototype.focus = function () {
  var value = this.$preInput.value;
  var range = this.$preInput.getSelectPosition() || {
    start: value.length,
    end: value.length
  };
  this.$preInput.focus();
  this.$preInput.applyData(value, range);
};

MessageInput.prototype.blur = function () {
  this.$preInput.blur();
};

MessageInput.prototype._updateAttachmentClass = function () {
  if (this._imageFiles.length + this._files.length) {
    this.addClass("as-has-attachment");
  } else {
    this.removeClass("as-has-attachment");
  }

  this._updateSize();
};

MessageInput.prototype._updateSize = function () {
  var fs = this.getFontSize() || 14;
  this.addStyle('--right-width', this.$right.getBoundingClientRect().width / fs + 'em');
};

MessageInput.prototype.addImageFiles = function (imageFiles, urls) {
  var thisMi = this;
  Array.prototype.forEach.call(imageFiles, function (file, index) {
    thisMi._imageFiles.push(file);

    var src;

    if (urls) {
      src = urls[index];
    }

    if (!src) {
      src = URL.createObjectURL(file);
    }

    var itemElt = _({
      class: ['as-message-input-attach-preview', 'as-image'],
      attr: {
        title: file.name
      },
      child: [{
        class: 'as-message-input-attach-preview-image',
        style: {
          backgroundImage: 'url(' + src + ')'
        }
      }, {
        tag: 'button',
        class: 'as-message-input-attach-preview-close-btn',
        child: 'span.mdi.mdi-close',
        attr: {
          title: 'remove'
        },
        on: {
          click: function () {
            thisMi._imageFiles = thisMi._imageFiles.filter(function (it) {
              return it !== file;
            });
            itemElt.remove();

            thisMi._updateAttachmentClass();

            thisMi.notifySizeChange();
            thisMi.notifyChange();
          }
        }
      }, {
        class: 'as-message-input-attach-preview-info',
        child: [{
          class: 'as-message-input-attach-preview-name',
          child: {
            text: file.name
          }
        }, {
          class: 'as-message-input-attach-preview-size',
          child: {
            text: (0, _utils.fileSize2Text)(file.size)
          }
        }]
      }]
    }).addTo(thisMi.$attachmentCtn);

    thisMi.$attachmentCtn.addChildBefore(itemElt, thisMi.$attachmentAddBtn);
  });

  this._updateAttachmentClass();

  this.notifySizeChange();
};

MessageInput.prototype.addFiles = function (files) {
  var thisMi = this;
  Array.prototype.forEach.call(files, function (file, index) {
    thisMi._files.push(file);

    MessageInput.iconSupportAsync.then(function (ExtensionIcons) {
      var src;
      var ext = file.name.split('.').pop().toLowerCase();

      if (ExtensionIcons.indexOf(ext) > 0) {
        src = MessageInput.iconAssetRoot + '/' + ext + '.svg';
      } else {
        src = MessageInput.iconAssetRoot + '/' + 'default' + '.svg';
      }

      var itemElt = _({
        class: ['as-message-input-attach-preview', 'as-file'],
        attr: {
          title: file.name
        },
        child: [{
          tag: 'img',
          class: 'as-message-input-attach-preview-file',
          props: {
            src: src
          }
        }, {
          tag: 'button',
          class: 'as-message-input-attach-preview-close-btn',
          child: 'span.mdi.mdi-close',
          attr: {
            title: 'remove'
          },
          on: {
            click: function () {
              thisMi._files = thisMi._files.filter(function (it) {
                return it !== file;
              });
              itemElt.remove();

              thisMi._updateAttachmentClass();

              thisMi.notifySizeChange();
              thisMi.notifyChange();
            }
          }
        }, {
          class: 'as-message-input-attach-preview-info',
          child: [{
            class: 'as-message-input-attach-preview-name',
            child: {
              text: file.name
            }
          }, {
            class: 'as-message-input-attach-preview-size',
            child: {
              text: (0, _utils.fileSize2Text)(file.size)
            }
          }]
        }]
      });

      thisMi.$attachmentCtn.addChildBefore(itemElt, thisMi.$attachmentAddBtn);
    });
  });

  this._updateAttachmentClass();

  thisMi.notifySizeChange();
};

MessageInput.prototype.closeEmoji = function () {
  if (!this.hasClass('as-message-input-show-emoji')) return;
  this.removeClass('as-message-input-show-emoji');
  this.removeChild(this.$emojiPickerCtn);
  $(document.body).off('mousedown', this.eventHandler.mousedownOutEmoji);
};

MessageInput.prototype.notifyAddFiles = function (files) {
  var event = {
    resolvedAsync: Promise.resolve(files),
    files: files,
    resolve: function (result) {
      if (!result) {
        this.resolvedAsync = Promise.resolve(undefined);
      } else if (result.then) {
        this.resolvedAsync = result;
      } else {
        this.resolvedAsync = Promise.resolve(result);
      }
    }
  };
  this.emit('useraddfile', event);
  return event.resolvedAsync;
};

MessageInput.prototype.openFileDialog = function () {
  var thisMi = this;
  (0, _utils.openFileDialog)({
    multiple: true
  }).then(function (files) {
    if (!thisMi.autoSend) thisMi.$preInput.focus();
    thisMi.notifyAddFiles(files).then(function (files) {
      if (files && files.length > 0) thisMi.handleAddingFileByType(files);
    });
  });
};

MessageInput.prototype.handleAddingFileByType = function (files) {
  if (files.length > 0) {
    var imageFiles = [];
    var otherFiles = [];
    var file;

    for (var i = 0; i < files.length; ++i) {
      file = files[i];

      if (!!file.type && file.type.match && file.type.match(/^image\//)) {
        imageFiles.push(file);
      } else {
        otherFiles.push(file);
      }
    }

    this.addImageFiles(imageFiles);
    this.addFiles(otherFiles);
    this.notifyChange();
  }
};

MessageInput.prototype.notifySizeChange = function () {
  var bound = this.getBoundingClientRect();

  if (this._latBound.width != bound.width || this._latBound.height != bound.height) {
    this._latBound.width = bound.width;
    this._latBound.height = bound.height;
    this.emit('sizechange', {
      name: 'sizechange',
      bound: bound,
      target: this
    }, this);
  }
};

MessageInput.prototype.addPlugin = function (option) {
  var plugin;

  if (option.isMessagePlugin) {
    plugin = option;
  } else {
    plugin = new this.PluginConstructor(this, option);
  }

  plugin.idx = this._plugins.length + 1;

  this._plugins.push(plugin);

  this._plugins.sort(function (a, b) {
    var av = typeof a.opt.order === "number" ? a.opt.order : a.idx * 1000;
    var bv = typeof b.opt.order === "number" ? b.opt.order : b.idx * 1000;
    return av - bv;
  });

  var plugins = this._plugins.slice();

  plugins.forEach(pl => pl.getTriggerButton().remove());
  this.$left.addChild(plugins.shift().getTriggerButton());

  while (plugins.length > 0) {
    this.$right.addChildBefore(plugins.shift().getTriggerButton(), this.$right.firstChild);
  }

  return plugin;
};
/***
 *
 * @param {{name?:string, exec:function(_this:MessageInput):void, keyBiding?:string}} option
 */


MessageInput.prototype.addCommand = function (option) {
  option.name = option.name || (0, _stringGenerate.randomIdent)(20);

  this._cmdRunner.add(option.name, option.exec);

  if (option.keyBiding && option.keyBiding.trim) {
    var keyBindingIdent = (0, _keyboard.normalizeKeyBindingIdent)(option.keyBiding);
    this._keyMaps[keyBindingIdent] = option.name;
  }
};

MessageInput.prototype.exeCmd = function (name) {
  var args = Array.prototype.slice.call(arguments);
  args[0] = this;
  args.unshift(name);

  this._cmdRunner.invoke.apply(this._cmdRunner, args);
};

MessageInput.prototype._updateQuote = function () {
  this.$quote.data = this._quote;
  if (this._quote) this.addClass('as-has-quote');else this.removeClass('as-has-quote');

  this._updateSize();

  this.notifySizeChange();
};
/**
 * @type {MessageInput}
 */


MessageInput.eventHandler = {};

MessageInput.eventHandler.preInputChange = function (event) {
  var text = this.$preInput.value;

  if (text.length > 0) {
    this.addClass('as-has-text');
  } else {
    this.removeClass('as-has-text');
  }

  if (text === this._editingText) {
    this.removeClass('as-text-changed');
  } else {
    this.addClass('as-text-changed');
  }

  this._updateSize();

  this.notifySizeChange();
  this.notifyChange();
};

MessageInput.eventHandler.preInputKeyDown = function (event) {
  if (!(event.shiftKey || event.ctrlKey || event.altKey) && event.key === 'Enter') {
    this.notifySend();
    event.preventDefault();
  } else if ((event.shiftKey || event.ctrlKey || event.altKey) && event.key === 'Enter') {
    event.preventDefault();
    var text = this.$preInput.value;
    var selectedPos = this.$preInput.getSelectPosition();
    var newText = text.substr(0, selectedPos.start) + '\n' + text.substr(selectedPos.end);
    this.$preInput.applyData(newText, selectedPos.start + 1);
    this.notifySizeChange();
    this.$preInput.commitChange(newText, selectedPos.start + 1);
  } else if (event.key === "Escape" && this._mode === MODE_EDIT) {
    this.notifyCancel();
    event.preventDefault();
  }

  var keyBindingIdent = (0, _keyboard.keyboardEventToKeyBindingIdent)(event);

  if (this._keyMaps[keyBindingIdent]) {
    event.preventDefault();
    this.exeCmd(this._keyMaps[keyBindingIdent]);
  }

  setTimeout(this.notifySizeChange.bind(this), 1);
};

MessageInput.eventHandler.preInputKeyUp = function (event) {
  var value = this.$preInput.value;
  this._lastInputSelectPosion = this.$preInput.getSelectPosition() || {
    start: value.length,
    end: value.length
  };
  this.notifySizeChange();
};

MessageInput.eventHandler.preInputPasteImg = function (event) {
  if (this._mode == 'edit') return;
  var files = Array.prototype.slice.call(event.imageFiles);
  var urls = event.urls && Array.prototype.slice.call(event.urls);
  this.notifyAddFiles(files).then(function (newFiles) {
    if (!newFiles || newFiles.length === 0) return;
    var newUrls = urls && newFiles.map(function (file) {
      return urls[files.indexOf(file)];
    });
    this.addImageFiles(newFiles, newUrls);
    this.notifyChange();
  }.bind(this));
};

MessageInput.eventHandler.preInputFocus = function () {
  this.addClass('as-focus');
};

MessageInput.eventHandler.preInputBlur = function () {
  this.removeClass('as-focus');
};

MessageInput.eventHandler.clickEmojiBtn = function () {
  this.toggleEmoji();
};

MessageInput.eventHandler.mousedownOutEmoji = function (event) {
  if (_EventEmitter.default.hitElement(this.$emojiPicker, event) || _EventEmitter.default.hitElement(this.$emojiBtn, event)) return;
  this.closeEmoji();
};

MessageInput.eventHandler.pickEmoji = function (event) {
  var text = this.$preInput.value;
  var newText = text.substr(0, this._lastInputSelectPosion.start) + event.key + text.substr(this._lastInputSelectPosion.end);
  var selected = this._lastInputSelectPosion;
  var newOffset = selected.start + event.key.length;
  this._lastInputSelectPosion = {
    start: newOffset,
    end: newOffset
  };
  this.$preInput.focus();
  this.$preInput.applyData(newText, newOffset);
  this.$preInput.commitChange(newText, newOffset);
  this.notifySizeChange();
  this.$preInput.focus(); //older firefox version will be lost focus
  // this.notifyChange();//not need
};

MessageInput.eventHandler.dragover = function (event) {
  event.preventDefault();
  this.addClass('as-drag-hover');
  this.notifySizeChange();
  if (this._hoverTimeout > 0) clearTimeout(this._hoverTimeout);
  var thisMi = this;
  this._hoverTimeout = setTimeout(function () {
    thisMi._hoverTimeout = -1;
    thisMi.removeClass('as-drag-hover');
    thisMi.notifySizeChange();
  }, 200); //todo:

  this._updateSize();
};

MessageInput.eventHandler.drop = function (event) {
  event.preventDefault();
  var files = [];
  var file;

  if (event.dataTransfer.items) {
    for (var i = 0; i < event.dataTransfer.items.length; i++) {
      if (event.dataTransfer.items[i].kind === 'file') {
        file = event.dataTransfer.items[i].getAsFile();

        if (!file.type && file.size % 4096 == 0) {//todo: folder
        } else {
          files.push(file);
        }
      }
    }
  } else {
    for (var i = 0; i < event.dataTransfer.files.length; i++) {
      file = event.dataTransfer.files[i];

      if (!file.type && file.size % 4096 == 0) {} else {
        files.push(file);
      }
    }
  }

  this.notifyAddFiles(files).then(function (files) {
    this.handleAddingFileByType(files);
  }.bind(this));
};

MessageInput.eventHandler.clickQuoteRemoveBtn = function () {
  this.quote = null;
  this.notifyChange();
};

MessageInput.property = {};
MessageInput.property.files = {
  set: function (value) {
    $$('.as-file', this.$attachmentCtn).forEach(function (elt) {
      elt.remove();
    });
    value = value || [];
    this._files = [];
    this.addFiles(value);
  },
  get: function () {
    return this._files;
  }
};
MessageInput.property.images = {
  set: function (value) {
    $$('.as-image', this.$attachmentCtn).forEach(function (elt) {
      elt.remove();
    });
    value = value || [];
    this._imageFiles = [];
    this.addImageFiles(value);
  },
  get: function () {
    return this._imageFiles;
  }
};
MessageInput.property.text = {
  set: function (text) {
    this.$preInput.value = '' + text;

    if (text.length > 0) {
      this.addClass('as-has-text');
    } else {
      this.removeClass('as-has-text');
    }

    if (this._mode === MODE_EDIT) {
      this._editingText = text;
    }

    this.removeClass('as-text-changed');

    this._updateSize();
  },
  get: function () {
    return this.$preInput.value;
  }
};
/**
 * @type {MessageInput}
 */

MessageInput.property.mode = {
  set: function (value) {
    value = value || MODE_NEW;

    if (value === MODE_EDIT || value.toLowerCase && value.toLowerCase() === 'edit') {
      this.addClass('as-mode-edit');
      value = MODE_EDIT;
      this._editingText = this.$preInput.value;
    } else {
      value = MODE_NEW;
      this._editingText = '';
      this.removeClass('as-mode-edit');
    }

    this.removeClass('as-text-changed');
    this._mode = value;

    this._updateSize();
  },
  get: function () {
    return this._mode === MODE_EDIT ? 'edit' : 'new';
  }
};
MessageInput.property.autoSend = {
  set: function (value) {
    if (value) {
      this.addClass('as-auto-send');
    } else {
      this.removeClass('as-auto-send');
    }
  },
  get: function () {
    return this.hasClass('as-auto-send');
  }
};
MessageInput.property.quote = {
  set: function (quote) {
    this._quote = quote;

    this._updateQuote();
  },
  get: function () {
    return this._quote;
  }
};
MessageInput.property.tagMap = {
  set: function (value) {
    this.$preInput.tagMap = value || {};
    this.$quote.tagMap = value || {};
  },
  get: function () {
    return this.$preInput.tagMap;
  }
};

_ACore.default.install(MessageInput);

var _default = MessageInput;
exports.default = _default;
var urlRex = /^(firefox|opera|chrome|https|http|wss|ws):\/\/[^\s]+$/;
/***
 *
 * @param {string}text
 * @param {{emojiAssetRoot?:string, staticSize?:number, animSize?:number, tagMap?:{}, lengthLimit?:number, inline?:boolean}=} data
 * @returns {Array}
 */

function parseMessage(text, data) {
  data = data || {};
  data.emojiAssetRoot = data.emojiAssetRoot || _EmojiPicker.default.assetRoot;
  data.staticSize = data.staticSize || 20;
  data.animSize = data.animSize || 60;
  var tagMap = data.tagMap || {};
  var tokens = (0, _tiutils.tokenizeMessageText)(text).reduce((ac, token) => {
    if (token.type !== 'TEXT') {
      ac.push(token);
      return ac;
    }

    var urls = token.value.match(/(firefox|opera|chrome|https|http|wss|ws):\/\/[^\s]+/g);
    var splitter = Math.random() + '';
    var normals = token.value.replace(/(firefox|opera|chrome|https|http|wss|ws):\/\/[^\s]+/, splitter).split(splitter);

    for (var i = 0; i < normals.length; ++i) {
      if (i > 0) {
        ac.push({
          type: 'URL',
          value: urls[i - 1]
        });
      }

      ac.push({
        type: 'TEXT',
        value: normals[i]
      });
    }

    return ac;
  }, []);

  if (data.lengthLimit > 0) {
    tokens = tokens.reduce((ac, token) => {
      if (ac.l >= data.lengthLimit) {
        return ac;
      }

      switch (token.type) {
        case 'TAG':
          ac.l += ('@' + (tagMap[token.value] ? tagMap[token.value] : '[id:' + token.value + ']')).length;
          break;

        case 'EMOJI':
          ac.l += 1;
          break;

        case 'NEW_LINE':
          ac.l += 1;
          break;

        default:
          ac.l += token.value.length;
      }

      if (ac.l > data.lengthLimit) {
        if (token.type === 'TEXT') {
          token.value = token.value.substring(0, Math.max(0, token.value.length - (ac.l - data.lengthLimit) - 3)) + '...';
          ac.tokens.push(token);
        }
      } else {
        ac.tokens.push(token);
      }

      return ac;
    }, {
      l: 0,
      tokens: []
    }).tokens;
  }

  var res = tokens.reduce((ac, token) => {
    switch (token.type) {
      case 'TAG':
        ac.push({
          tag: 'span',
          class: 'as-tag-token',
          child: {
            text: '@' + (tagMap[token.value] ? tagMap[token.value] : '[id:' + token.value + ']')
          }
        });
        break;

      case 'EMOJI':
        ac.push({
          tag: 'span',
          class: 'as-emoji-text',
          child: {
            text: token.value
          }
        });
        ac.push({
          tag: 'img',
          class: 'as-emoji',
          props: {
            src: data.emojiAssetRoot + '/static/x' + data.staticSize + '/' + _EmojiAnims.EmojiAnimByIdent[token.value][1]
          }
        });
        break;

      case 'NEW_LINE':
        ac.push({
          tag: 'br'
        });
        break;

      case 'URL':
        ac.push({
          tag: 'a',
          class: 'as-protocal-' + token.value.split(':').shift(),
          child: {
            text: token.value
          },
          props: {
            href: token.value,
            target: '_blank'
          }
        });
        break;

      case 'TEXT':
      default:
        ac.push({
          tag: 'span',
          child: {
            text: token.value
          }
        });
        break;
    }

    return ac;
  }, []);

  if (!data.inline && res.length === 2 && res[1].class === 'as-emoji') {
    res[1].tag = 'iconsprite';
    res[1].props.fps = 30;
    res[1].props.src = res[1].props.src.replace('/static/x' + data.staticSize, '/anim/x' + data.animSize);
  }

  return res;
}

MessageInput.parseMessage = parseMessage;

function prepareIcon() {
  if (!MessageInput.iconSupportAsync) {
    MessageInput.iconSupportAsync = Promise.resolve(_catalog.default);
  }

  return MessageInput.iconSupportAsync;
}

function MessageQuote() {
  prepareIcon();
  this._tagMap = {};
  /***
   *
   * @type {null|MessageInputQuote}
   * @private
   */

  this._data = null;
  this.$img = $('.as-message-quote-img', this);
  this.$text = $('.as-message-quote-text', this);
  this.$desc = $('.as-message-quote-desc', this);
  this.$removeBtn = $('.as-message-quote-remove-btn', this).on('click', this.eventHandler.clickRemoveBtn);
  Object.defineProperty(this, '$text', {
    set: function () {
      console.trace();
    },
    get: function () {
      return $('.as-message-quote-text', this);
    }
  });
}

MessageQuote.tag = 'MessageQuote'.toLowerCase();

MessageQuote.render = function () {
  return _({
    extendEvent: 'pressremove',
    class: 'as-message-quote-box',
    child: [{
      class: 'as-message-quote-img'
    }, {
      class: 'as-message-quote-sym',
      child: 'span.mdi.mdi-format-quote-open-outline'
    }, {
      class: 'as-message-quote-content',
      child: [{
        class: 'as-message-quote-text',
        child: {
          text: ''
        }
      }, {
        class: 'as-message-quote-desc',
        child: {
          text: ''
        }
      }]
    }, {
      tag: 'button',
      class: 'as-message-quote-remove-btn',
      child: 'span.mdi.mdi-close'
    }]
  });
};

MessageQuote.property = {};
MessageQuote.eventHandler = {};
MessageQuote.property.removable = {
  set: function (val) {
    if (val) {
      this.addClass('as-removable');
    } else {
      this.removeClass('as-removable');
    }
  },
  get: function () {
    return this.hasClass('as-removable');
  }
};
MessageQuote.property.shortenText = {
  set: function (val) {
    if (val) {
      this.addClass('as-shorten-text');
    } else {
      this.removeClass('as-shorten-text');
    }
  },
  get: function () {
    return this.hasClass('as-shorten-text');
  }
};
MessageQuote.property.data = {
  set: function (quote) {
    this._data = quote;
    var text, desc;
    var file, img;

    if (typeof quote === "string") {
      text = quote;
      desc = '';
    } else if (quote && typeof quote === "object") {
      text = quote.text;
      desc = quote.desc;
      file = quote.file;
      img = quote.img;
    }

    if (text === undefined) {
      this.$text.clearChild();
      this.$desc.firstChild.data = '';
      this.removeClass('as-has-file');
      this.removeClass('as-has-img');
    } else {
      if (file) {
        file = file.toLowerCase().split('.').pop();
        MessageInput.iconSupportAsync.then(function (iconSupport) {
          if (iconSupport.indexOf(file) < 0) file = 'default';
          this.$img.addStyle('background-image', 'url(' + MessageInput.iconAssetRoot + '/' + file + '.svg)');
        }.bind(this));
        this.addClass('as-has-file');
      } else this.removeClass('as-has-file');

      if (img) {
        this.$img.addStyle('background-image', 'url(' + img + ')');
        this.addClass('as-has-img');
      } else this.removeClass('as-has-img');

      if (this.shortenText) text = text.split(/\r?\n/).shift();
      var parsedText = parseMessage(text, {
        tagMap: this.tagMap
      });
      var textEltChain = parsedText.map(function (c) {
        return _(c);
      });
      this.$text.clearChild().addChild(textEltChain);
      this.$desc.firstChild.data = desc;
    }
  },
  get: function () {
    return this._data;
  }
};
MessageQuote.property.tagMap = {
  set: function (value) {
    this._tagMap = value || {};
    this.data = this['data'];
  },
  get: function () {
    return this._tagMap;
  }
};

MessageQuote.eventHandler.clickRemoveBtn = function () {
  this.emit('pressremove', {
    target: this,
    type: 'pressclose'
  }, this);
};

_ACore.default.install(MessageQuote);

MessageInput.prototype.PluginConstructor = _MessageInputPlugin.default;
};

moduleFactories["node_modules/absol-acomp/js/numberinput/NITextController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/numberinput/NITextController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _keyboard = require("absol/src/Input/keyboard");

var _Text = require("absol/src/HTML5/Text");

var _utils = require("../utils");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


/***
 *
 * @param {NumberInput} elt
 * @constructor
 */
function NITextController(elt) {
  this.elt = elt;
  /***
   *
   * @type {HTMLInputElement|AElement}
   */

  this.$input = this.elt.$input;
  Object.keys(NITextController.prototype).forEach(key => {
    if (key.startsWith('on')) this[key] = this[key].bind(this);
  });
  this.elt.$input.on('keydown', this.onKeyDown).on('paste', this.onKeyDown).on('blur', this.onBlur);
}

NITextController.prototype.estimateWidthBy = function (text) {
  if (this.elt.hasClass('as-pressing')) return;
  var bound = this.elt.getBoundingClientRect();
  var width = (0, _Text.measureText)(text, this.$input.getComputedStyleValue('font')).width;
  this.elt.addStyle('--text-width', width + 'px');
  var newBound = this.elt.getBoundingClientRect();
  if (newBound.width !== bound.width) _ResizeSystem.default.update();
};

NITextController.prototype.flushTextToValue = function () {
  var thousandsSeparator = this.elt.thousandsSeparator || '';
  var decimalSeparator = this.elt.decimalSeparator;
  var text = this.$input.value;
  var floatText = text.split(thousandsSeparator).join('').split(decimalSeparator).join('.');
  this.elt._value = parseFloat(floatText);
  if (!(0, _utils.isRealNumber)(this.elt._value)) this.elt._value = 0;
};

NITextController.prototype.flushValueToText = function () {
  var formatter;
  var opt = Object.assign({}, this.elt._format);
  var value = this.elt.value;
  var text, parts;

  if (opt.locales === 'none') {
    if (opt.maximumFractionDigits === 20) {
      text = value + '';
    } else if (opt.maximumFractionDigits === opt.minimumIntegerDigits) {
      text = value.toFixed(opt.maximumFractionDigits);
    } else {
      text = value + '';
      parts = text.split('.');
      parts[1] = parts[1] || '';

      if (parts[1].length < opt.minimumIntegerDigits) {
        text = value.toFixed(opt.minimumIntegerDigits);
      }
    }
  } else {
    formatter = new Intl.NumberFormat(this.elt._format.locales, opt);
    text = formatter.format(this.elt.value);
  }

  delete opt.locales;
  this.$input.value = text;
  this.estimateWidthBy(text);
};

NITextController.prototype.reformat = function () {
  var thousandsSeparator = this.elt.thousandsSeparator || '';
  var decimalSeparator = this.elt.decimalSeparator;
  var caretPos = this.$input.selectionEnd;
  var value = this.$input.value;
  var parts = value.split(decimalSeparator);
  var caretWTSPos = value.substring(0, caretPos).split(thousandsSeparator).join('').length;
  parts[0] = parts[0].split('').filter(x => x.match(/[0-9\-]/)).reduce((ac, c, i, arr) => {
    ac += c;

    if (i + 1 < arr.length && (arr.length - i) % 3 === 1 && arr[i] !== '-') {
      ac += thousandsSeparator;
    }

    return ac;
  }, '');
  if (parts[1]) parts[1] = parts[1].split('').filter(x => x.match(/[0-9]/)).join('');
  var newValue = parts.join(decimalSeparator);
  var newCaretPos = 0;
  var counter = 0;

  for (newCaretPos = 0; newCaretPos < newValue.length && counter < caretWTSPos; ++newCaretPos) {
    if (newValue[newCaretPos].match(/[0-9\-]/) || newValue[newCaretPos] === decimalSeparator) {
      counter++;
    }
  }

  this.$input.value = newValue;
  this.$input.setSelectionRange(newCaretPos, newCaretPos);
  this.estimateWidthBy(newValue);
};

NITextController.prototype.onBlur = function () {
  this.flushValueToText();
  this.elt.notifyChanged({
    by: 'blur'
  });
};
/***
 * @param {KeyboardEvent|ClipboardEvent|{}} event
 * @param {boolean=} event
 */


NITextController.prototype.onKeyDown = function (event, dontInsert) {
  var key = event.type === 'keydown' ? (0, _keyboard.keyboardEventToKeyBindingIdent)(event) : '';

  if (key.length === 1 && !key.match(/[0-9.,\-]/) || key.match(/^shift-.$/)) {
    event.preventDefault();
    return;
  }

  var thousandsSeparator = this.elt.thousandsSeparator;
  var decimalSeparator = this.elt.decimalSeparator;
  var value = this.$input.value;
  var sStart = this.$input.selectionStart;
  var sEnd = this.$input.selectionEnd;
  var sDir = this.$input.selectionDirection;
  var onKeys = {};

  onKeys.unidentified = () => {
    var oldText = this.$input.value;
    setTimeout(() => {
      var newText = this.$input.value;
      if (oldText === newText) return;
      var key = newText[sStart];
      var fakeEvent = {
        type: 'keydown',
        preventDefault: _noop.default,
        key: key
      };

      if (key.match(/^[0-9.]$/)) {
        this.onKeyDown(fakeEvent, true);
      } else {
        this.$input.value = oldText;
        this.$input.setSelectionRange(sStart, sStart);
        this.onKeyDown(fakeEvent);
      }
    }, 10);
  };

  onKeys.paste = () => {
    var clipboardData = event.clipboardData || window.clipboardData;
    var pastedData = clipboardData.getData('Text');
    var hasSeparator = value.indexOf(decimalSeparator) >= 0;
    pastedData = pastedData.split('').filter(c => {
      if (c.match(/[0-9]/)) return true;

      if (!hasSeparator && c === hasSeparator) {
        hasSeparator = true;
        return true;
      }
    }).join('');
    if (this.elt.readOnly) return;

    if (!dontInsert) {
      this.$input.value = value.substring(0, sStart) + pastedData + value.substring(sEnd);
      this.$input.setSelectionRange(sStart + pastedData.length, sStart + pastedData.length);
    }

    this.reformat();
    this.flushTextToValue();
  };

  onKeys.arrowleft = () => {
    if (sStart === sEnd) {
      if (value[sStart - 2] === thousandsSeparator) {
        this.$input.setSelectionRange(sStart - 2, sStart - 2);
      } else if (sStart > 0) {
        this.$input.setSelectionRange(sStart - 1, sStart - 1);
      }
    } else {
      this.$input.setSelectionRange(sStart, sStart);
    }
  };

  onKeys['shift-arrowleft'] = () => {
    var newSStart;
    var newSEnd;

    if (sDir === 'backward') {
      newSStart = sEnd;
      newSEnd = sStart - 1;
    } else {
      newSStart = sStart;
      newSEnd = sEnd - 1;
    }

    if (value[newSEnd - 1] === thousandsSeparator) newSEnd--;
    newSEnd = Math.max(0, newSEnd);

    if (newSStart <= newSEnd) {
      this.$input.setSelectionRange(newSStart, newSEnd, "forward");
    } else {
      this.$input.setSelectionRange(newSEnd, newSStart, "backward");
    }
  };

  onKeys.arrowright = () => {
    if (sStart === sEnd) {
      if (value[sStart] === thousandsSeparator) {
        this.$input.setSelectionRange(sStart + 2, sStart + 2);
      } else if (sStart < value.length) {
        this.$input.setSelectionRange(sStart + 1, sStart + 1);
      }
    } else {
      this.$input.setSelectionRange(sStart, sStart);
    }
  };

  onKeys['shift-arrowright'] = () => {
    var newSStart;
    var newSEnd;

    if (sDir === 'backward') {
      newSStart = sEnd;
      newSEnd = sStart + 1;
    } else {
      newSStart = sStart;
      newSEnd = sEnd + 1;
    }

    if (value[newSEnd - 1] === thousandsSeparator) newSEnd++;
    newSEnd = Math.min(value.length, newSEnd);

    if (newSStart <= newSEnd) {
      this.$input.setSelectionRange(newSStart, newSEnd, "forward");
    } else {
      this.$input.setSelectionRange(newSEnd, newSStart, "backward");
    }
  };

  onKeys.number = () => {
    if (this.elt.readOnly) return;

    if (!dontInsert) {
      this.$input.value = value.substring(0, sStart) + key + value.substring(sEnd);
      this.$input.setSelectionRange(sStart + 1, sStart + 1);
    }

    this.reformat();
    this.flushTextToValue();
  };

  onKeys['-'] = () => {
    if (this.elt.readOnly) return;
    if (value.indexOf('-') >= 0 || sStart > 0) return;
    this.$input.value = '-' + value.substring(sEnd);
    this.$input.setSelectionRange(1, 1);
    this.reformat();
    this.flushTextToValue();
  };

  onKeys.backspace = () => {
    if (this.elt.readOnly) return;
    var delStart, delEnd;

    if (sStart === sEnd) {
      if (sStart > 0) {
        delStart = sStart - 1;
        delEnd = sStart;
      }
    } else {
      delStart = sStart;
      delEnd = sEnd;
    }

    if (delStart === undefined || delEnd === undefined) return;
    this.$input.value = value.substring(0, delStart) + value.substring(delEnd);
    this.$input.setSelectionRange(delStart, delStart);
    this.reformat();
    this.flushTextToValue();
  };

  onKeys.enter = () => {
    if (this.elt.readOnly) return;
    this.flushValueToText();
    this.$input.setSelectionRange(this.$input.value.length, this.$input.value.length);
    this.elt.notifyChanged({
      by: 'enter'
    });
  };

  onKeys.delete = () => {
    if (this.elt.readOnly) return;
    var delStart, delEnd;

    if (sStart === sEnd) {
      if (sStart < value.length) {
        delStart = sStart;
        delEnd = sStart + 1;
        if (value[delStart] === thousandsSeparator) delEnd++;
      }
    } else {
      delStart = sStart;
      delEnd = sEnd;
    }

    this.$input.value = value.substring(0, delStart) + value.substring(delEnd);
    this.$input.setSelectionRange(delStart, delStart);
    this.reformat();
    this.flushTextToValue();
  };

  onKeys.decimalSeparator = () => {
    if (this.elt.readOnly) return;
    var idx = value.indexOf(decimalSeparator);

    if (idx >= 0) {
      if (idx < sStart) {
        this.$input.value = value.substring(0, sStart).replace(decimalSeparator, '') + decimalSeparator + value.substring(sEnd);
        this.$input.setSelectionRange(sStart, sStart);
      } else if (idx < sEnd) {
        this.$input.value = value.substring(0, sStart) + decimalSeparator + value.substring(sEnd);
        this.$input.setSelectionRange(sStart + 1, sStart + 1);
      } else {
        this.$input.value = value.substring(0, sStart) + decimalSeparator + value.substring(sEnd).replace(decimalSeparator, '');
        this.$input.setSelectionRange(sStart + 1, sStart + 1);
      }
    } else {
      this.$input.value = value.substring(0, sStart) + decimalSeparator + value.substring(sEnd);
      this.$input.setSelectionRange(sStart + 1, sStart + 1);
    }

    this.reformat();
    this.flushTextToValue();
  };

  if (key === 'ctrl-x') {
    onKeys.delete();
  } else if (onKeys[event.type]) {
    event.preventDefault();
    onKeys[event.type]();
  } else if (onKeys[key]) {
    event.preventDefault();
    onKeys[key]();
  } else if (key.match(/^[0-9.]$/)) {
    event.preventDefault();
    onKeys.number();
  } else if (key === decimalSeparator) {
    event.preventDefault();
    onKeys.decimalSeparator();
  }
};

var _default = NITextController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/numberinput/NumberInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/numberinput/NumberInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/numberinput.css");

var _ACore = _interopRequireDefault(require("../../ACore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _utils = require("../utils");

var _NITextController = _interopRequireDefault(require("./NITextController"));

var _int = require("absol/src/Math/int");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @typedef NumberInputFormat
 * @property {string} locales
 * @property {string|null} decimalSeparator
 * @property {string|null} thousandSeparator
 */

/***
 * @extends AElement
 * @constructor
 */

function NumberInput() {
  /***
   *
   * @type {HTMLInputElement|AElement}
   */
  this.$input = $('input', this); // .on('keyup', this.eventHandler.keyup)
  // .on('paste', this.eventHandler.paste)
  // .on('change', this.eventHandler.change);

  this.$input.value = '0';
  this._prevValue = 0; //to know whenever the value changed

  this._value = 0;
  this._max = Infinity;
  this._min = -Infinity;
  this._step = 1;
  this._format = this._makeDefaultFormat();
  this.$upBtn = $('.absol-number-input-button-up-container button', this).on('mousedown', this.eventHandler.mouseDownBtn.bind(this, 1));
  this.$downBtn = $('.absol-number-input-button-down-container button', this).on('mousedown', this.eventHandler.mouseDownBtn.bind(this, -1));
  this.textCtrl = new _NITextController.default(this);
  this.$domSignal = _('attachhook').addTo(this);
  this.$domSignal.once('attached', () => {
    this.textCtrl.estimateWidthBy(this.$input.value);
  });
  /****
   * @name min
   * @type {number}
   * @memberOf NumberInput#
   */

  /****
   * @name max
   * @type {number}
   * @memberOf NumberInput#
   */

  /****
   * @name value
   * @type {number}
   * @memberOf NumberInput#
   */

  /****
   * @name format
   * @type {NumberInputFormat}
   * @memberOf NumberInput#
   */

  /****
   * @name thousandsSeparator
   * @type {string|null}
   * @memberOf NumberInput#
   */

  /****
   * @name decimalSeparator
   * @type {string|null}
   * @memberOf NumberInput#
   */

  /****
   * @name readOnly
   * @type {boolean}
   * @memberOf NumberInput#
   */

  /****
   * @name disabled
   * @type {boolean}
   * @memberOf NumberInput#
   */
}

NumberInput.tag = 'NumberInput'.toLowerCase();

NumberInput.render = function () {
  return _({
    class: 'absol-number-input',
    extendEvent: ['change'],
    child: [{
      class: 'absol-number-input-text-container',
      child: 'input[type="text"]'
    }, {
      class: 'absol-number-input-button-up-container',
      child: {
        tag: 'button',
        child: 'span.mdi.mdi-menu-up'
      }
    }, {
      class: 'absol-number-input-button-down-container',
      child: {
        tag: 'button',
        child: 'span.mdi.mdi-menu-down'
      }
    }]
  });
};

NumberInput.prototype._makeDefaultFormat = function () {
  var res = {
    locales: 'vi-VN',
    maximumFractionDigits: 20,
    minimumFractionDigits: 0
  };

  if (window['systemconfig'] && window['systemconfig']['numberFormatLocales']) {
    res.locales = window['systemconfig']['numberFormatLocales'];
  }

  return res;
};
/*****17 number********/


NumberInput.prototype.nextStep = function () {
  var ofs = 0;

  if ((0, _utils.isRealNumber)(this.min)) {
    ofs = this.min;
  }

  var idx = (0, _utils.nearFloor)((this.value - ofs) / this._step, 0.01);
  this._value = Math.min(this._step * (idx + 1) + ofs, this.max);
  this.textCtrl.flushValueToText();
};

NumberInput.prototype.prevStep = function () {
  var ofs = 0;

  if ((0, _utils.isRealNumber)(this.min)) {
    ofs = this.min;
  }

  var idx = (0, _utils.nearFloor)((this.value - ofs) / this._step, 0.01);
  this._value = Math.max(this._step * (idx - 1) + ofs, this.min);
  this.textCtrl.flushValueToText();
};

NumberInput.eventHandler = {};

NumberInput.eventHandler.mouseDownBtn = function (dir, event) {
  if (_EventEmitter.default.isMouseRight(event)) return;
  var self = this;
  var pressing = true;
  var timeout = -1;
  var i = 0;
  this.addClass('as-pressing');

  var tick = () => {
    if (pressing) {
      if (i === 0 || i >= 4) {
        if (dir > 0) this.nextStep();else this.prevStep();

        if (i === 0) {
          this.notifyChanged({
            by: 'press_button'
          });
        } else {
          this.notifyChanged({
            by: 'long_press_button'
          });
        }
      }

      ++i;
      self.__pressingUpTimeout__ = setTimeout(tick, 100);
    }
  };

  var finish = event => {
    pressing = false;
    this.removeClass('as-pressing');

    if (timeout >= 0) {
      clearTimeout(timeout);
      timeout = -1;
    }

    document.removeEventListener('mouseup', finish);
    document.removeEventListener('mouseleave', finish);

    if (event.type === 'mouseup') {
      this.$input.focus();
    }

    this.notifyChanged({
      originEvent: event,
      by: 'press_button'
    });
    this.textCtrl.estimateWidthBy(this.$input.value);
  };

  document.addEventListener('mouseup', finish);
  document.addEventListener('mouseleave', finish);
  tick();
};

NumberInput.prototype.notifyChanged = function (option) {
  option = option || {};
  var value = this.value;

  if (this._prevValue !== value) {
    this.emit('change', Object.assign({
      target: this,
      value: value,
      previousValue: this._prevValue
    }, option || {}), this);
    this._prevValue = value;
    this._prevBy = option.by;
  }
};

NumberInput.property = {};
NumberInput.property.value = {
  set: function (value) {
    if (typeof value != 'number' || isNaN(value)) value = 0;
    this._value = value;
    this._prevValue = this.value;
    this.textCtrl.flushValueToText();
  },
  get: function () {
    var value = Math.min(this.max, Math.max(this._value, this.min));

    if (this._format.maximumFractionDigits === 0) {
      return Math.round(value);
    }

    if (this._format.maximumFractionDigits < 20) return (0, _int.numberAutoFixed)(value, this._format.maximumFractionDigits);
    return value;
  }
};
NumberInput.property.step = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 1;
    if (value === 0) value = 1;
    value = Math.abs(value);
    this._step = value;
  },
  get: function () {
    return this._step;
  }
};
NumberInput.property.max = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) {
      value = Infinity;
    }

    this._max = value;
    this._prevValue = this.value;
    this.textCtrl.flushValueToText();
  },
  get: function () {
    return Math.max(this._max, this._min);
  }
};
NumberInput.property.min = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) {
      value = -Infinity;
    }

    this._min = value;
    this._prevValue = this.value;
    this.textCtrl.flushValueToText();
  },
  get: function () {
    return Math.min(this._min, this._max);
  }
};
NumberInput.prototype.locales2Format = {
  'vi-VN': {
    decimalSeparator: ',',
    thousandsSeparator: '.'
  },
  'en-US': {
    decimalSeparator: '.',
    thousandsSeparator: ','
  },
  'none': {
    decimalSeparator: '.',
    thousandsSeparator: ''
  }
};
NumberInput.property.decimalSeparator = {
  get: function () {
    var lF = this.locales2Format[this._format.locales];
    if (lF) return lF.decimalSeparator;
    return '.';
  },
  set: () => {}
};
NumberInput.property.thousandsSeparator = {
  get: function () {
    var lF = this.locales2Format[this._format.locales];
    if (lF) return lF.thousandsSeparator;
    return null;
  },
  set: () => {}
};
NumberInput.property.disabled = {
  set: function (value) {
    this.$input.disabled = !!value;
    this.$upBtn.disabled = !!value;
    this.$downBtn.disabled = !!value;
    if (value) this.addClass('absol-disabled');else this.removeClass('absol-disabled');
  },
  get: function () {
    return this.$input.disabled;
  }
};
NumberInput.property.readOnly = {
  set: function (value) {
    this.$input.readOnly = !!value;
    if (value) this.addClass('as-read-only');else this.removeClass('as-read-only');
  },
  get: function () {
    return this.$input.readOnly;
  }
};
NumberInput.property.format = {
  /***
   * @this NumberInput
   * @param value
   * @this NumberInput
   */
  set: function (value) {
    if (value in this.locales2Format) {
      this._format = {
        locales: value,
        maximumFractionDigits: this._format.maximumFractionDigits,
        minimumFractionDigits: this._format.minimumFractionDigits
      };
    } else if (!value) {
      this._format = this._makeDefaultFormat();
    } else {
      this._format = Object.assign(this._makeDefaultFormat(), value);
    } // console.log(this._format)


    this.textCtrl.flushValueToText();
  },
  get: function () {
    return this._format;
  }
};
NumberInput.property.floatFixed = {
  set: function (value) {
    if ((0, _utils.isNaturalNumber)(value) && value >= 0 && value < 20) {
      this._format.maximumFractionDigits = Math.floor(value);
      this._format.minimumFractionDigits = Math.floor(value);
    } else {
      this._format.maximumFractionDigits = 20;
      delete this._format.minimumFractionDigits;
    }

    this.textCtrl.flushValueToText();
  },
  get: function () {
    if (this._format.maximumFractionDigits === 20) return null;
    return this._format.maximumFractionDigits;
  }
};

_ACore.default.install('NumberInput'.toLowerCase(), NumberInput);

var _default = NumberInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/NumberSpanInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/NumberSpanInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends  AElement
 * @constructor
 */

function NumberSpanInput() {
  this.ev_keydown = this.ev_keydown.bind(this);
  this.on('keydown', this.ev_keydown, true);
  this.readOnly = false;
  this.value = 0;
  this.on('paste', function (event) {
    event.preventDefault();
  });
}

NumberSpanInput.tag = 'NumberSpanInput'.toLowerCase();

NumberSpanInput.render = function () {
  return _({
    tag: 'span',
    child: {
      text: ''
    }
  });
};

NumberSpanInput.prototype.selectAll = function () {
  var sel;

  if (window.getSelection) {
    sel = window.getSelection();
    sel.removeAllRanges();
    var range = document.createRange();
    range.selectNode(this.childNodes[this.childNodes.length - 1]);
    sel.addRange(range);
  } else {
    console.error("TimePicker: Not support!");
  }
};

NumberSpanInput.prototype.selectEnd = function () {
  var sel;

  if (window.getSelection) {
    sel = window.getSelection();
    sel.removeAllRanges();

    this._autoAddZero();

    var length = this.firstChild.data.length;
    var range = document.createRange();
    range.setStart(this.firstChild, length);
    range.setEnd(this.firstChild, length);
    sel.addRange(range);
  } else {
    console.error("TimePicker: Not support!");
  }
};

NumberSpanInput.prototype.selectNone = function () {
  var sel;

  if (document.activeElement === this) {
    sel = window.getSelection();
    sel.removeAllRanges();
  }
};

NumberSpanInput.prototype._autoAddZero = function () {
  if (!this.firstChild) {
    this.addChild(_({
      text: '0'
    }));
  }
};
/***
 *
 * @param {KeyboardEvent} event
 */


NumberSpanInput.prototype.ev_keydown = function (event) {
  if (event.key && event.key.length == 1 && !event.ctrlKey && !event.altKey) {
    if (event.key.match(/[0-9]/)) {} else {
      event.preventDefault();
    }
  } else if (event.key == 'Enter') {
    event.preventDefault();
  }
};

NumberSpanInput.property = {};
NumberSpanInput.property.readOnly = {
  set: function (value) {
    this.contentEditable = !value;
  },
  get: function () {
    return this.contentEditable === false || this.contentEditable === 'false';
  }
};
/***
 *
 * @type {NumberSpanInput}
 */

NumberSpanInput.property.value = {
  set: function (value) {
    this._autoAddZero();

    this.firstChild.data = value + '';
  },
  get: function () {
    return this.firstChild && this.firstChild.data || '';
  }
};

_ACore.default.install(NumberSpanInput);

var _default = NumberSpanInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/WindowBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/WindowBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));



/**
 * @typedef WindowBoxAction
 * @property icon
 * @property name
 *
 */

/***
 * @extends AElement
 * @constructor
 */
function WindowBox() {
  this.$header = (0, _ACore.$)('.as-window-box-header', this);
  /***
   *
   * @type {WindowBoxAction[]}
   * @private
   */

  this._windowActions = [];
  this.$windowActionButtonCtn = (0, _ACore.$)('.as-window-box-header-button-ctn', this);
  this._windowIcon = null;
  this.$windowIconCtn = (0, _ACore.$)('.as-window-box-header-icon-ctn', this);
  /**
   *
   * @type {Text}
   */

  this.$windowTitleText = (0, _ACore.$)('.as-window-box-header-title', this).firstChild;
  this.$body = (0, _ACore.$)('.as-window-box-body', this);
  /***
   * @type {WindowBoxAction[]}
   * @name windowActions
   */
}

WindowBox.tag = 'WindowBox'.toLowerCase();

WindowBox.render = function () {
  return (0, _ACore._)({
    class: 'as-window-box',
    extendEvent: ['action'],
    child: [{
      class: 'as-window-box-header',
      child: [{
        class: 'as-window-box-header-icon-ctn'
      }, {
        class: 'as-window-box-header-title',
        child: {
          text: ''
        }
      }, {
        class: "as-window-box-header-button-ctn"
      }]
    }, {
      class: 'as-window-box-body'
    }]
  });
};

['addChild', 'addChildBefore', 'addChildAfter', 'clearChild', 'findChildBefore', 'findChildAfter'].forEach(function (key) {
  WindowBox.prototype[key] = function () {
    return this.$body[key].apply(this.$body, arguments);
  };
});
WindowBox.property = {};
WindowBox.property.windowTitle = {
  set: function (value) {
    this.$windowTitleText.data = (value || '') + '';
  },
  get: function () {
    return this.$windowTitleText.data;
  },
  enumerable: true
};
WindowBox.property.windowIcon = {
  /***
   * @this WindowBox
   * @param value
   */
  set: function (value) {
    value = value || null;
    this.$windowIconCtn.clearChild();

    if (value) {
      this.$windowIconCtn.addChild((0, _ACore._)(value));
    }

    this._windowIcon = value;
  },
  get: function () {
    return this._windowIcon;
  },
  enumerable: true
};
WindowBox.property.windowActions = {
  set: function (actions) {
    var self = this;
    this._windowActions = actions || [];
    this.$windowActionButtonCtn.clearChild();

    var buttons = this._windowActions.map(function (action) {
      return (0, _ACore._)({
        tag: 'button',
        class: action.class || [],
        child: action.icon,
        on: {
          click: function (event) {
            self.emit('action', {
              type: 'action',
              target: self,
              actionData: action,
              originalEvent: event
            });
          }
        }
      });
    });

    this.$windowActionButtonCtn.addChild(buttons);
  },
  get: function () {
    return this._windowActions;
  }
};

_ACore.default.install(WindowBox);

var _default = WindowBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/OnsScreenWindow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/OnsScreenWindow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/onscreenwindow.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _WindowBox = _interopRequireDefault(require("./WindowBox"));

var _Hanger = _interopRequireDefault(require("./Hanger"));




var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function OnScreenWindow() {
  var self = this;
  this._lastSize = {
    width: 0,
    height: 0
  };
  /***
   *
   * @type {WindowBox}
   */

  this.$windowBox = $(_WindowBox.default.tag, this);

  _OOP.default.drillProperty(this, this.$windowBox, 'windowTitle');

  _OOP.default.drillProperty(this, this.$windowBox, 'windowActions');

  _OOP.default.drillProperty(this, this.$windowBox, 'windowIcon');

  this.$windowBox.on('action', function (event) {
    self.emit('action', event, self);
  });
  this.$header = _({
    tag: _Hanger.default.tag,
    elt: this.$windowBox.$header
  });
  this.$header.on('dragstart', this.eventHandler.dragStart.bind(this, this.$header, 'move')); //

  this.$bottomResizer = $('.absol-onscreen-window-resizer.absol-onscreen-window-resize-bottom', this);
  this.$bottomResizer.on('dragstart', this.eventHandler.dragStart.bind(this, this.$bottomResizer, 'bottom')); //

  this.$rightResizer = $('.absol-onscreen-window-resizer.absol-onscreen-window-resize-right', this);
  this.$rightResizer.on('dragstart', this.eventHandler.dragStart.bind(this, this.$rightResizer, 'right')); //

  this.$topResizer = $('.absol-onscreen-window-resizer.absol-onscreen-window-resize-top', this);
  this.$topResizer.on('dragstart', this.eventHandler.dragStart.bind(this, this.$topResizer, 'top'));
  this.$leftResizer = $('.absol-onscreen-window-resizer.absol-onscreen-window-resize-left', this);
  this.$leftResizer.on('dragstart', this.eventHandler.dragStart.bind(this, this.$leftResizer, 'left'));
  this.$bottomRightResizer = $('.absol-onscreen-window-resizer.absol-onscreen-window-resize-bottom-right', this);
  this.$bottomRightResizer.on('dragstart', this.eventHandler.dragStart.bind(this, this.$bottomRightResizer, 'bottomRight')); //

  this.$bottomLeftResizer = $('.absol-onscreen-window-resizer.absol-onscreen-window-resize-bottom-left', this);
  this.$bottomLeftResizer.on('dragstart', this.eventHandler.dragStart.bind(this, this.$bottomLeftResizer, 'bottomLeft')); //

  this.$topLeftResizer = $('.absol-onscreen-window-resizer.absol-onscreen-window-resize-top-left', this);
  this.$topLeftResizer.on('dragstart', this.eventHandler.dragStart.bind(this, this.$topLeftResizer, 'topLeft'));
  this.$topRightResizer = $('.absol-onscreen-window-resizer.absol-onscreen-window-resize-top-right', this);
  this.$topRightResizer.on('dragstart', this.eventHandler.dragStart.bind(this, this.$topRightResizer, 'topRight'));
  this.$attachhook = _('attachhook').addTo(this);
  this.$attachhook.requestUpdateSize = this.relocation.bind(this);
  this.$attachhook.on('error', function () {
    _Dom.default.addToResizeSystem(this);
  });
}

OnScreenWindow.tag = 'OnScreenWindow'.toLowerCase();

OnScreenWindow.render = function () {
  return _({
    extendEvent: ['sizechange', 'drag', 'relocation', 'action'],
    class: 'absol-onscreen-window',
    child: [{
      tag: _WindowBox.default.tag,
      class: 'as-window-box'
    }, 'hanger.absol-onscreen-window-resizer.absol-onscreen-window-resize-bottom', 'hanger.absol-onscreen-window-resizer.absol-onscreen-window-resize-top', 'hanger.absol-onscreen-window-resizer.absol-onscreen-window-resize-left', 'hanger.absol-onscreen-window-resizer.absol-onscreen-window-resize-right', 'hanger.absol-onscreen-window-resizer.absol-onscreen-window-resize-bottom-right', 'hanger.absol-onscreen-window-resizer.absol-onscreen-window-resize-bottom-left', 'hanger.absol-onscreen-window-resizer.absol-onscreen-window-resize-top-left', 'hanger.absol-onscreen-window-resizer.absol-onscreen-window-resize-top-right']
  });
};

OnScreenWindow.prototype.maybeSizeChange = function () {
  var bound = this.getBoundingClientRect();

  if (this._lastSize.width !== bound.width || this._lastSize.height !== bound.height) {
    this._lastSize = bound;
    window.dispatchEvent(new Event('resize'));
    this.emit('sizechange', {
      size: bound,
      target: this,
      type: 'sizechange'
    }, this);
  }
};

OnScreenWindow.prototype.moveFators = {
  move: {
    x: 1,
    y: 1,

    /***
     * @this OnScreenWindow
     * @param event
     */
    canMove: function (event) {
      return true;
    },
    cursor: 'move'
  },
  top: {
    y: 1,
    height: -1
  },
  bottom: {
    height: 1,
    cursor: 's-resize'
  },
  bottomRight: {
    height: 1,
    width: 1,
    cursor: 'se-resize'
  },
  bottomLeft: {
    height: 1,
    width: -1,
    x: 1,
    cursor: 'sw-resize'
  },
  topLeft: {
    height: -1,
    width: -1,
    x: 1,
    y: 1,
    cursor: 'nw-resize'
  },
  topRight: {
    height: -1,
    width: 1,
    y: 1,
    cursor: 'ne-resize'
  },
  right: {
    width: 1,
    cursor: 'e-resize'
  },
  left: {
    x: 1,
    width: -1,
    cursor: 'w-resize'
  }
};
/***
 *
 * @type {{}}
 * @memberOf OnScreenWindow#
 */

OnScreenWindow.eventHandler = {};
/***
 * @this OnScreenWindow
 * @param {Hanger} elt
 * @param fN
 * @param event
 */

OnScreenWindow.eventHandler.dragStart = function (elt, fN, event) {
  var factor = this.moveFators[fN];
  if (factor.canMove && !factor.canMove.call(this, event)) return;
  this.movingData = {
    factor: factor,
    screenSize: (0, _Dom.getScreenSize)(),
    modal: _('.absol-onscreen-window-moving-modal').addStyle('cursor', factor.cursor).addTo(document.body),
    elt: elt,
    bound: this.getBoundingClientRect()
  };
  elt.on('drag', this.eventHandler.drag).on('dragend', this.eventHandler.dragEnd);
};
/***
 * @this OnScreenWindow
 * @param event
 */


OnScreenWindow.eventHandler.drag = function (event) {
  var movingData = this.movingData;
  var factor = movingData.factor;
  var bound = movingData.bound;
  var screenSize = movingData.screenSize;
  var dv = event.currentPoint.sub(event.startingPoint);
  var x, y, width, height;

  if (factor.x) {
    x = dv.x * factor.x + bound.left;
    x = Math.min(x, screenSize.width - bound.width);
    x = Math.max(0, x);
    this.addStyle('left', x + 'px');
  }

  if (factor.y) {
    y = dv.y * factor.y + bound.top;
    y = Math.min(y, screenSize.height - bound.height);
    y = Math.max(0, y);
    this.addStyle('top', y + 'px');
  }

  if (factor.width) {
    width = dv.x * factor.width + bound.width;
    this.addStyle('width', width + 'px');
  }

  if (factor.height) {
    height = dv.y * factor.height + bound.height;
    this.addStyle('height', height + 'px');
  }

  this.emit('relocation', {
    type: 'relocation',
    target: this
  }, this);
  this.maybeSizeChange();
};
/***
 * @this OnScreenWindow
 * @param event
 */


OnScreenWindow.eventHandler.dragEnd = function (event) {
  var movingData = this.movingData;
  var elt = movingData.elt;
  elt.off('drag', this.eventHandler.drag).off('dragend', this.eventHandler.dragEnd);
  setTimeout(function () {
    movingData.modal.remove();
  }, 50);
  this.movingData = null;
};

['addChild', 'addChildBefore', 'addChildAfter', 'clearChild', 'findChildBefore', 'findChildAfter'].forEach(function (key) {
  OnScreenWindow.prototype[key] = function () {
    return this.$windowBox[key].apply(this.$windowBox, arguments);
  };
});
OnScreenWindow.property = {};

OnScreenWindow.prototype.relocation = function () {
  var bound = this.getBoundingClientRect();

  var screenSize = _Dom.default.getScreenSize();

  var isRelocated = false;

  if (bound.bottom >= screenSize.height) {
    this.addStyle('top', Math.max(0, screenSize.height - bound.height) + 'px');
    isRelocated = true;
  }

  if (bound.right >= screenSize.width) {
    this.addStyle('left', Math.max(0, screenSize.width - bound.width) + 'px');
    isRelocated = true;
  }

  if (isRelocated) {
    this.emit('relocation', {
      type: 'relocation',
      target: this
    }, this);
  }
};

_ACore.default.install(OnScreenWindow);

var _default = OnScreenWindow;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/PageSelector.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/PageSelector.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/pageselector.css");

var _ACore = _interopRequireDefault(require("../ACore"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function PageSelector() {
  this.$pageCount = $('.absol-page-count', this);
  this.$pageInput = $('.absol-page-number-input input', this);
  this.$pageInput.on('keyup', this.eventHandler.pressEnterKey);
  this.$prevBtn = $('li.page-previous', this);
  this.$nextBtn = $('li.page-next', this);
  this.$firstBtn = $('li.page-first', this);
  this.$lastBtn = $('li.page-last', this);
  this.$nextBtn.on('click', this.eventHandler.clickNext);
  this.$prevBtn.on('click', this.eventHandler.clickPrev);
  this.$firstBtn.on('click', this.eventHandler.clickFirst);
  this.$lastBtn.on('click', this.eventHandler.clickLast);
  this.$buttonContainer = $('.absol-page-number-buttons', this);
  this._buttons = [];
  this._pageOffset = 1;
  this._selectedIndex = 1;
  this._pageCount = 1;
  this._pageRange = 1;
  this.$pageInput.value = this._selectedIndex;
}

PageSelector.tag = 'PageSelector'.toLowerCase();

PageSelector.render = function () {
  return _({
    class: ['absol-page-selector'],
    extendEvent: ['change'],
    child: [{
      class: 'absol-page-number-input',
      child: [{
        tag: 'label',
        child: {
          text: "Page"
        }
      }, {
        tag: 'input',
        attr: {
          type: 'text'
        }
      }, {
        tag: 'span',
        child: {
          text: '/ '
        }
      }, {
        tag: 'span',
        class: 'absol-page-count',
        child: {
          text: '1'
        }
      }]
    }, {
      tag: 'ul',
      class: 'absol-page-number-buttons',
      child: [{
        tag: 'li',
        class: "page-first",
        attr: {
          title: 'First'
        },
        child: 'a.mdi.mdi-chevron-double-left'
      }, {
        tag: 'li',
        attr: {
          title: 'Previous'
        },
        class: 'page-previous',
        child: 'a.mdi.mdi-chevron-left'
      }, {
        tag: 'li',
        attr: {
          title: 'Next'
        },
        class: 'page-next',
        child: 'a.mdi.mdi-chevron-right'
      }, {
        tag: 'li',
        attr: {
          title: 'Last'
        },
        class: 'page-last',
        child: 'a.mdi.mdi-chevron-double-right'
      }]
    }]
  });
};

PageSelector.eventHandler = {};

PageSelector.eventHandler.pressEnterKey = function (event) {
  if (event.keyCode != 13) return;
  var index = parseInt(this.$pageInput.value.trim(), 10);

  if (index < 1 || index > this._pageCount) {
    this.$pageInput.value = this._selectedIndex;
    return;
  }

  this.selectPage(index, true);
};

PageSelector.eventHandler.clickLast = function (event) {
  this.selectPage(this._pageCount, true);
};

PageSelector.eventHandler.clickFirst = function (event) {
  this.selectPage(1, true);
};

PageSelector.eventHandler.clickNext = function (event) {
  if (this._selectedIndex == this._pageCount) return;
  this.selectPage(this._selectedIndex + 1, true);
};

PageSelector.eventHandler.clickPrev = function (event) {
  if (this._selectedIndex == 1) return;
  this.selectPage(this._selectedIndex - 1, true);
};

PageSelector.eventHandler.clickIndex = function (index, event) {
  this.selectPage(index + this._pageOffset, true);
};

PageSelector.prototype._createButton = function (index) {
  var button = _({
    tag: 'li',
    class: 'absol-page-number',
    child: {
      tag: 'a',
      attr: {
        'data-index-text': index + 1
      }
    },
    on: {
      click: PageSelector.eventHandler.clickIndex.bind(this, index)
    }
  });

  this.$buttonContainer.addChildBefore(button, this.$nextBtn);
  return button;
};

PageSelector.prototype.setPageRange = function (pageCount) {
  this._pageRange = pageCount;

  while (this._buttons.length < pageCount) {
    this._buttons.push(this._createButton(this._buttons.length));
  }

  while (this._buttons.length > pageCount) {
    this._buttons.pop().remove();
  }
};

PageSelector.prototype.setStartPage = function (index) {
  this._buttons.forEach(function (e, i) {
    e.firstChild.attr('data-index-text', i + index + '');
  });

  this._pageOffset = index;
};

PageSelector.prototype.selectPage = function (index, userActive) {
  if (index == this._selectedIndex) this.setStartPage(index - parseInt(this._pageRange / 2));
  if (index >= this._pageOffset + this._pageRange) this.setStartPage(index - parseInt(this._pageRange / 2));

  if (index > this._selectedIndex) {
    if (index == this._pageOffset + this._pageRange - 1) this.setStartPage(index - parseInt(this._pageRange / 2));
  }

  if (index < this._selectedIndex) {
    if (index == this._pageOffset) this.setStartPage(index - parseInt(this._pageRange / 2));
  }

  if (index > this._pageCount - parseInt(this._pageRange / 2)) this.setStartPage(this._pageCount - this._pageRange + 1);
  if (index <= parseInt(this._pageRange / 2)) this.setStartPage(1);
  var pageOffset = this._pageOffset;

  this._buttons.forEach(function (e, i) {
    if (i + pageOffset == index) {
      e.addClass('active');
    } else {
      e.removeClass('active');
    }
  });

  if (this._selectedIndex != index) {
    this._selectedIndex = index;
    this.$pageInput.value = index;
    this.emit('change', {
      target: this,
      selectedIndex: index,
      userActive: !!userActive
    }, this);
  }
};

PageSelector.prototype.getSelectedPage = function () {
  return this._selectedIndex;
};

PageSelector.prototype.setPageCount = function (count) {
  this._pageCount = count;
  this.$pageCount.firstChild.data = '' + count;
  this.attr('data-page-count', count);
};

PageSelector.property = {};
PageSelector.property.selectedIndex = {
  set: function (value) {
    this.selectPage(value, false);
  },
  get: function () {
    return this._selectedIndex;
  }
};
PageSelector.property.pageCount = {
  set: function (value) {
    this.setPageCount(value);
  },
  get: function () {
    return this._pageCount;
  }
};
PageSelector.property.pageOffset = {
  set: function (value) {
    this.setStartPage(value);
  },
  get: function () {
    return this._pageOffset;
  }
};
PageSelector.property.pageRange = {
  set: function (value) {
    this.setPageRange(value);
  },
  get: function () {
    return this._pageRange;
  }
};

PageSelector.prototype.init = function (props) {
  props = props || {};
  props.pageOffset = props.pageOffset || 1;
  props.pageRange = props.pageRange || 5;
  props.pageCount = props.pageCount || 15;
  props.selectedIndex = typeof props.selectedIndex == "number" ? props.selectedIndex : props.pageOffset;
  if (props.pageCount < props.pageRange) props.pageRange = props.pageCount;
  this.setPageCount(props.pageCount);
  this.setPageRange(props.pageRange);
  this.setStartPage(props.pageOffset);
  this.selectPage(props.selectedIndex);
  props = Object.assign({}, props);
  delete props.pageOffset;
  delete props.pageRange;
  delete props.pageCount;
  delete props.selectedIndex;
};

_ACore.default.install(PageSelector);

var _default = PageSelector;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/PreInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/PreInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/preinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _file = require("absol/src/Converter/file");

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _printer = require("absol/src/Print/printer");

var _PrintSerialHandlers = require("absol/src/Print/PrintSerialHandlers");


var _ = _ACore.default._;
var $ = _ACore.default.$;
var textDelay = _BrowserDetector.default.isSafari ? 100 : 1;
/***
 * @extends AElement
 * @constructor
 */

function PreInput() {
  this.defineEvent(['pasteimg', 'pastetext', 'change']);
  this.on('paste', this.eventHandler.paste);
  this.on('keydown', this.eventHandler.keydown);
  this.history = [];
  this.value = '';
  this.historyIndex = -1;
  this.commitChange('', 0);
}

PreInput.tag = 'preinput';

PreInput.render = function () {
  return _({
    tag: 'pre',
    class: 'as-preinput',
    attr: {
      contenteditable: 'true'
    },
    child: 'br'
  });
};

PreInput.prototype.applyData = function (text, offset) {
  var textNode = _({
    text: text
  });

  this.clearChild().addChild(textNode).addChild(_('br'));

  if (document.activeElement === this && this.isDescendantOf(document.body)) {
    if (document.getSelection) {
      var sel = document.getSelection();
      sel.removeAllRanges();
      var range = document.createRange();

      if (typeof offset == 'number') {
        range.setStart(textNode, Math.min(text.length, offset));
      } else {
        range.setStart(textNode, Math.min(text.length, offset.start));
        range.setEnd(textNode, Math.min(text.length, offset.end));
      }

      sel.addRange(range);
      this.scrollIntoRange(range);
    } else {
      console.error("PreInput: Not support!");
    }
  }
};

PreInput.prototype.select = function (offset) {
  if (document.activeElement !== this) this.focus();
  this.applyData(this.value, offset);
};

PreInput.prototype.scrollIntoRange = function (range) {
  var elementBound = range.getBoundingClientRect();
  var viewportBound = this.getBoundingClientRect();
  var dBottom = 0;
  if (range.startContainer && range.startContainer.data && range.startContainer.data.charAt(range.startContainer.data.length - 1) == '\n') dBottom += this.getFontSize() * 1.5;
  var currentScrollTop = this.scrollTop;
  var newScrollTop = currentScrollTop;

  if (elementBound.bottom + dBottom > viewportBound.bottom) {
    newScrollTop = currentScrollTop + (elementBound.bottom + dBottom - viewportBound.bottom);
  }

  if (elementBound.top < viewportBound.top) {
    newScrollTop = currentScrollTop - (viewportBound.top - elementBound.top);
  }

  if (newScrollTop != currentScrollTop) {
    this.scrollTop = newScrollTop;
  }

  var currentScrollLeft = this.scrollLeft;
  var newScrollLeft = currentScrollLeft;

  if (elementBound.right > viewportBound.right) {
    newScrollLeft = currentScrollLeft + (elementBound.right - viewportBound.right);
  }

  if (elementBound.left < viewportBound.left) {
    newScrollLeft = currentScrollLeft - (viewportBound.left - elementBound.left);
  }

  if (newScrollLeft != currentScrollLeft) {
    this.scrollLeft = newScrollLeft;
  }
};

PreInput.prototype.undo = function () {
  if (this.historyIndex <= 0) return;
  this.historyIndex--;
  var record = this.history[this.historyIndex];
  this.applyData(record.text, record.offset);
  this.emit('change', {
    target: this,
    value: record.text,
    action: 'undo',
    record: record,
    type: 'change'
  }, this);
};

PreInput.prototype.redo = function () {
  if (this.historyIndex + 1 >= this.history.length) return;
  this.historyIndex++;
  var record = this.history[this.historyIndex];
  this.applyData(record.text, record.offset);
  this.emit('change', {
    target: this,
    value: record.text,
    action: 'redo',
    record: record,
    type: 'change'
  }, this);
};

PreInput.prototype.commitChange = function (text, offset) {
  while (this.historyIndex < this.history.length - 1) {
    this.history.pop();
  }

  var lastText = this.history.length > 0 ? this.history[this.history.length - 1].text : null;

  if (text === lastText) {
    if (this.history[this.history.length - 1].offset != offset) this.history[this.history.length - 1].offset = offset;
  } else {
    this.historyIndex = this.history.length;
    var record = {
      text: text,
      offset: offset
    };
    this.history.push(record);
    this.emit('change', {
      target: this,
      value: record.text,
      action: 'commit',
      record: record,
      type: 'change'
    }, this);
  }
};

PreInput.prototype.waitToCommit = function (text, offset) {
  var thisInput = this;
  if (this._commitTimeout > 0) clearTimeout(this._commitTimeout);
  this._commitTimeout = setTimeout(function () {
    thisInput.commitChange(text, offset);
  }, textDelay);
};

PreInput.prototype.getPosition = function (node, offset) {
  if (!node) return NaN;
  if (node == this) return offset;
  var parent = node.parentElement;
  if (!parent) return NaN;
  var text = '';
  var child;
  var lastBr = false;

  for (var i = 0; i < parent.childNodes.length; ++i) {
    child = parent.childNodes[i];
    if (child == node) break;
    text += this.stringOf(child);
  }

  return this.getPosition(parent, text.length + offset);
};

PreInput.prototype.getSelectPosition = function () {
  if (window.getSelection) {
    var sel = window.getSelection();

    if (sel.getRangeAt && sel.rangeCount) {
      var range = sel.getRangeAt(0);
      var direction = 'forward';
      var cmpPosition = sel.anchorNode.compareDocumentPosition(sel.focusNode);

      if (cmpPosition === 4) {
        direction = 'forward';
      } else if (cmpPosition === 2) {
        direction = 'backward';
      } else if (!cmpPosition && sel.anchorOffset > sel.focusOffset || cmpPosition === Node.DOCUMENT_POSITION_PRECEDING) {
        direction = 'backward';
      }

      var startOffset = this.getPosition(range.startContainer, range.startOffset);
      var endOffset = this.getPosition(range.endContainer, range.endOffset);
      if (isNaN(startOffset)) return null;
      return {
        start: startOffset,
        end: endOffset,
        direction: direction
      };
    }
  } else if (document.selection) {
    console.error('May not support!');
  }
};

PreInput.prototype.stringOf = function (node, parent) {
  if (!node) return '';

  if (node.nodeType === 3) {
    return node.data;
  }

  var res = '';

  if ((node.tagName === 'BR' || node.tagName === 'br') && parent && parent.lastChild !== node) {
    return '\n';
  } else if ((node.tagName === 'DIV' || node.tagName === 'div') && parent && parent.firstChild !== node) {
    res += '\n';
  }

  var thisInput = this;
  return res + Array.prototype.map.call(node.childNodes, function (cNode, index, arr) {
    return thisInput.stringOf(cNode, node);
  }).join('');
};

PreInput.prototype._pasteText = function (text) {
  var sel = window.getSelection();
  var range;

  if (window.getSelection) {
    sel = window.getSelection();

    if (sel.getRangeAt && sel.rangeCount) {
      try {
        range = sel.getRangeAt(0);
        range.deleteContents();

        var textNode = _({
          text: text
        });

        range.insertNode(textNode);

        if (sel.removeRange) {
          sel.removeRange(range);
        } else {
          sel.removeAllRanges();
        }

        range = document.createRange();
        range.setStart(textNode, text.length);
        sel.addRange(range);
        this.scrollIntoRange(range);
        this.commitChange(this.stringOf(this), this.getPosition(textNode, text.length));
      } catch (error) {
        alert(error.message);
      }
    }
  } else if (document.selection && document.selection.createRange) {
    document.selection.createRange().text = text;
    this.commitChange(this.stringOf(this), this.getPosition(textNode, text.length));
    console.error('May not support!');
  }
};
/**
 * @type {PreInput}
 */


PreInput.eventHandler = {};

PreInput.eventHandler.paste = function (event) {
  var thisIp = this;
  var clipboardData = event.clipboardData || window.clipboardData;
  /**Safari bug */

  if (clipboardData) {
    if (clipboardData.items) {
      var items = Array.prototype.slice.call(clipboardData.items);
      var imgItems = items.filter(function (item) {
        return item.type.indexOf('image') >= 0;
      });
      var plainTextItems = items.filter(function (item) {
        return item.type.indexOf('text/plain') >= 0;
      });

      if (imgItems.length > 0) {
        var imgFiles = imgItems.map(function (it) {
          return it.getAsFile();
        });
        this.emit('pasteimg', {
          target: this,
          imageFile: imgFiles[0],
          imageFiles: imgFiles,
          orginEvent: event
        }, this);
      } else if (plainTextItems.length > 0) {
        var plainTextItem = plainTextItems[0]; //only one item

        plainTextItem.getAsString(function (text) {
          thisIp._pasteText(text);
        });
      } else {
        window.ABSOL_DEBUG && console.error("Can not handle clipboard data");
      }

      event.preventDefault();
    } else {
      var text = event.clipboardData.getData('text/plain');

      if (text) {
        event.preventDefault();

        this._pasteText(text);
      } else {
        var currentText = this.stringOf(this);
        var currentSelection = this.getSelectPosition();
        setTimeout(function () {
          var images = [];
          $('img', thisIp, function (elt) {
            images.push(elt);
          });
          Promise.all(images.map(function (img) {
            return _Dom.default.imageToCanvas(img).then(function (canvas) {
              var dataURI = canvas.toDataURL();
              var blob = (0, _file.dataURItoBlob)(dataURI);
              var file = (0, _file.blobToFile)(blob);
              return {
                file: file,
                blob: blob,
                url: dataURI
              };
            }, function (error) {
              console.error(error);
            }).catch(function (error) {
              console.error(error);
            });
          })).then(function (results) {
            results = results.filter(function (it) {
              return !!it;
            });

            if (results.length > 0) {
              var imgFiles = results.map(function (it) {
                return it.file;
              });
              var urls = results.map(function (it) {
                return it.url;
              });
              thisIp.emit('pasteimg', {
                target: this,
                imageFile: imgFiles[0],
                imageFiles: imgFiles,
                urls: urls,
                url: urls[0],
                orginEvent: event
              }, thisIp);
            }
          });
          thisIp.applyData(currentText, currentSelection);
        }, textDelay);
      }
    }
  } else {
    setTimeout(function () {
      if (window.getSelection) {
        var sel = window.getSelection();

        if (sel.getRangeAt && sel.rangeCount) {
          var range = sel.getRangeAt(0);
          var text = this.stringOf(this);
          var offset = this.getPosition(range.startContainer, range.startOffset);
          this.waitToCommit(text, offset);
        }
      } else if (document.selection) {
        console.error('May not support!');
      }
    }.bind(this), textDelay);
  }
};

PreInput.eventHandler.keydown = function (event) {
  if (event.ctrlKey) {
    switch (event.key) {
      case 'z':
        this.undo();
        event.preventDefault();
        break;

      case 'y':
        this.redo();
        event.preventDefault();
        break;

      default:
        break;
    }
  }

  if (!event.ctrlKey && !event.altKey) {
    setTimeout(function () {
      if (window.getSelection) {
        var sel = window.getSelection();

        if (sel.getRangeAt && sel.rangeCount) {
          var range = sel.getRangeAt(0);
          var text = this.stringOf(this);
          var offset = this.getPosition(range.startContainer, range.startOffset);
          this.waitToCommit(text, offset);
        }
      } else if (document.selection) {
        console.error('May not support!');
      }
    }.bind(this), textDelay);
  }
};

PreInput.property = {};
PreInput.property.value = {
  set: function (value) {
    value = value || '';
    this.applyData(value, value.length);
    this.commitChange(value, value.length);
  },
  get: function () {
    return this.stringOf(this);
  }
};
PreInput.property.disabled = {
  set: function (value) {
    value = !!value;
    if (value === this.hasClass('as-disabled')) return;

    if (value) {
      this.addClass('as-disabled');
      this.attr({
        contenteditable: undefined,
        oncut: 'return false',
        onpaste: 'return false',
        onkeydown: 'if(event.metaKey) return true; return false;'
      });
    } else {
      this.removeClass('as-disabled');
      this.attr({
        contenteditable: true,
        oncut: undefined,
        onpaste: undefined,
        onkeydown: undefined
      });
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
PreInput.property.readOnly = {
  set: function (value) {
    value = !!value;
    if (value === this.hasClass('as-read-only')) return;

    if (value) {
      this.addClass('as-read-only');
      this.attr({
        contenteditable: undefined,
        oncut: 'return false',
        onpaste: 'return false',
        onkeydown: 'if(event.metaKey) return true; return false;'
      });
    } else {
      this.removeClass('as-read-only');
      this.attr({
        contenteditable: true,
        oncut: undefined,
        onpaste: undefined,
        onkeydown: undefined
      });
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};

_ACore.default.install(PreInput);

var _default = PreInput;
/*

ShareSerializer.addHandlerBefore({
    id: 'PreInput',
    match: (elt, scope, stack) => {
        if (elt.nodeType !== Node.ELEMENT_NODE) return false;
        return elt.hasClass('as-preinput') || elt.hasClass('as-tokenize-hyper-input');
    },
    exec: (printer, elt, scope, stack, accept) => {
        var O = printer.O;
        var printAttr = computePrintAttr(elt);
        var rect = printAttr.contentBound;
        rect.x -= O.x;
        rect.y -= O.y;

        printer.text(PreInput.prototype.stringOf(elt), rect, printAttr.style);
        return false;
    }
}, '*');

 */

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ProgressBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ProgressBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/progressbar.css");

var _ACore = _interopRequireDefault(require("../ACore"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function ProgressBar() {
  this._value = 0;
  this._variant = null;
  this.$value = $('.as-progress-bar-value', this);
  this._striped = false;
  this._animated = false;
}

ProgressBar.tag = 'ProgressBar'.toLowerCase();

ProgressBar.render = function () {
  return _({
    class: 'as-progress-bar',
    child: {
      class: 'as-progress-bar-value'
    }
  });
};

ProgressBar.property = {};
/**
 * @type {ProgressBar}
 */

ProgressBar.property.variant = {
  set: function (value) {
    if (this._variant) {
      this.removeClass('as-variant-' + this._variant);
    }

    if (value) {
      this.addClass('as-variant-' + value);
    } else {
      value = null;
    }

    this._variant = value;
  },
  get: function () {
    return this._variant;
  }
};
/**
 * @type {ProgressBar}
 */

ProgressBar.property.value = {
  set: function (value) {
    value = Math.max(0, Math.min(1, value || 0));
    this._value = value;
    this.$value.addStyle('width', value * 100 + '%');
  },
  get: function () {
    return this._value;
  }
};
ProgressBar.property.animated = {
  set: function (value) {
    value = !!value;
    this._striped = value;

    if (value) {
      this.addClass('as-animated');
    } else {
      this.removeClass('as-animated');
    }
  },
  get: function () {
    return this._animated;
  }
};
ProgressBar.property.striped = {
  set: function (value) {
    value = !!value;
    this._striped = value;

    if (value) {
      this.addClass('as-striped');
    } else {
      this.removeClass('as-striped');
    }
  },
  get: function () {
    return this._striped;
  }
};

_ACore.default.install(ProgressBar);

var _default = ProgressBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/FollowerToggler.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/FollowerToggler.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function FollowerToggler() {
  this.defineEvent(['close', 'open', 'preopen']);
  this.on('click', this.eventHandler.click);
  this.addClass('as-follower-trigger');
  this.$follower = null;
  this._opened = false;
}

FollowerToggler.tag = 'FollowerToggler'.toLowerCase();

FollowerToggler.render = function () {
  return _('div');
};

FollowerToggler.prototype.toggle = function () {
  if (this._opened) this.close();else this.open();
};

FollowerToggler.prototype.open = function () {
  if (this._opened) return;
  this._opened = true;
  this.addClass('as-follower-trigger-open');
  if (!this.$follower) return;
  this.emit('preopen', {
    name: 'preopen',
    target: this
  }, this);
  var thisTg = this;
  setTimeout(function () {
    thisTg.$follower.refollow();
    thisTg.$follower.removeClass('absol-follower-hidden');
    document.body.addEventListener('click', thisTg.eventHandler.clickBody);
    thisTg.emit('open', {
      name: 'open',
      target: this
    }, this);
  }, 1);
};

FollowerToggler.prototype.close = function () {
  if (!this._opened) return;
  this._opened = false;
  this.removeClass('as-follower-trigger-open');
  if (!this.$follower) return;
  this.$follower.unfollow();
  this.$follower.addClass('absol-follower-hidden');
  document.body.removeEventListener('click', this.eventHandler.clickBody);
  this.emit('close', {
    name: 'close',
    target: this
  }, this);
};

FollowerToggler.prototype.bindFollower = function (elt) {
  if (this.$follower) {
    this.$follower.followTarget = null;
  }

  if (elt && elt.refollow) {
    if (this._opened) elt.removeClass('absol-follower-hidden');else elt.addClass('absol-follower-hidden');
    elt.followTarget = this;
    this.$follower = elt;
  } else {
    throw new Error("Must be a follower!");
  }
};

FollowerToggler.eventHandler = {};

FollowerToggler.eventHandler.clickBody = function (event) {
  if (_EventEmitter.default.hitElement(this, event) || _EventEmitter.default.hitElement(this.$follower, event)) return;
  this.close();
};

FollowerToggler.eventHandler.click = function () {
  this.toggle();
};

_ACore.default.install(FollowerToggler);

var _default = FollowerToggler;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/QuickListButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/QuickListButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/quicklistbutton.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _FollowerToggler = _interopRequireDefault(require("./FollowerToggler"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/****
 * @extends FollowerToggler
 * @constructor
 */

function QuickListButton() {
  this.$shareFollower = QuickListButton.getFollower();

  _({
    tag: 'followertoggler',
    elt: this,
    on: {
      preopen: this.eventHandler.preopen,
      close: this.eventHandler.closeFollower
    }
  });

  this.bindFollower(this.$shareFollower);
  this.$iconCtn.remove();
  this.$content.addChild(this.$iconCtn);
  this._items = this._items;
  this._anchor = [];
  this.$list = null;
  this._listUpdated = true;
  this._opened = false;
  this.anchor = [12, 13, 15, 14]; //todo: add property
}

QuickListButton.$follower = _('follower.as-quick-list-button-follower');

QuickListButton.getFollower = function () {
  if (!QuickListButton.$follower) QuickListButton.$follower = _('follower.as-quick-list-button-follower');
  return QuickListButton.$follower;
};

QuickListButton.tag = 'QuickListButton'.toLowerCase();

QuickListButton.render = function () {
  return _({
    tag: 'flexiconbutton',
    class: 'as-quick-list-button',
    extendEvent: 'select',
    props: {
      text: "+ Thêm",
      icon: 'span.mdi.mdi-menu-down'
    }
  });
};

QuickListButton.property = {};
QuickListButton.property.items = {
  set: function (value) {
    value = value || [];
    this._items = value;
    this._listUpdated = false;
  },
  get: function () {
    return this._items;
  }
};
/**
 * @type {QuickListButton}
 */

QuickListButton.eventHandler = {};

QuickListButton.eventHandler.preopen = function () {
  this.$shareFollower.addTo(document.body);
  this.$shareFollower.anchor = this.anchor;

  if (this.$list == null) {
    this.$list = _('selectlist.absol-bscroller').on('pressitem', this.eventHandler.pressitem);
  }

  if (!this._listUpdated) {
    this._listUpdated = true;
    this.$list.items = this._items;
  }

  this.$shareFollower.addChild(this.$list);
  this.$shareFollower.on({
    preupdateposition: this.eventHandler.preUpdatePosition
  });
};

QuickListButton.eventHandler.preUpdatePosition = function () {
  var bound = this.getBoundingClientRect();

  var screenSize = _Dom.default.getScreenSize();

  var maxHeight = Math.max(screenSize.height - bound.bottom, bound.top) - 10;
  this.$list.addStyle('max-height', maxHeight + 'px');
};

QuickListButton.eventHandler.closeFollower = function () {
  this.$shareFollower.off({
    preupdateposition: this.eventHandler.preUpdatePosition
  });
};

QuickListButton.eventHandler.pressitem = function (event) {
  this.close();
  this.emit('select', Object.assign({}, event, {
    type: 'select',
    target: this
  }));
};

_ACore.default.install(QuickListButton);

var _default = QuickListButton;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CheckboxButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CheckboxButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/checkboxbutton.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _CheckBoxInput = _interopRequireDefault(require("./CheckBoxInput"));


_ACore.default.install('checkboxbutton', _CheckBoxInput.default);

var _default = _CheckBoxInput.default;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectListItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectListItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getTextOfListItem = getTextOfListItem;
exports.getValueOfListItem = getValueOfListItem;
exports.getDescriptionOfListItem = getDescriptionOfListItem;
exports.default = void 0;

require("../css/selectlist.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _CheckboxButton = _interopRequireDefault(require("./CheckboxButton"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 *
 * @extends AElement
 * @constructor
 */

function SelectListItem() {
  this.$text = $('span.absol-selectlist-item-text', this);
  this.$textValue = this.$text.childNodes[0];
  this.$descCtn = $('.absol-selectlist-item-desc-container', this);
  this.$desc = $('span.absol-selectlist-item-desc', this.$descCtn);
  this.$descValue = this.$desc.childNodes[0];
  this.$icon = null;
  this._extendClasses = [];
  this._extendStyle = {};
  this._data = "";
  this._level = 0;
  this._icon = null;

  _OOP.default.drillProperty(this, this, 'noSelect', 'disabled');
  /***
   * @type {AbsolConstructDescriptor|null}
   * @name icon
   * @memberOf SelectListItem#
   */

}

SelectListItem.tag = 'SelectListItem'.toLowerCase();

SelectListItem.render = function () {
  return _({
    class: 'absol-selectlist-item',
    child: [{
      tag: 'span',
      class: 'absol-selectlist-item-text',
      child: {
        text: ''
      }
    }, {
      class: 'absol-selectlist-item-desc-container',
      child: {
        tag: 'span',
        class: 'absol-selectlist-item-desc',
        child: {
          text: ''
        }
      }
    }]
  });
};

SelectListItem.property = {};
SelectListItem.property.extendClasses = {
  set: function (value) {
    var i;

    for (i = 0; i < this._extendClasses.length; ++i) {
      this.removeClass(this._extendClasses[i]);
    }

    this._extendClasses = [];
    if (typeof value == 'string') value = value.trim().split(/\s+/);
    value = value || [];

    for (i = 0; i < value.length; ++i) {
      this._extendClasses.push(value[i]);

      this.addClass(value[i]);
    }
  },
  get: function () {
    return this._extendClasses;
  }
};
SelectListItem.property.extendStyle = {
  set: function (value) {
    this.removeStyle(this._extendStyle);
    this._extendStyle = Object.assign({}, value || {});
    this.addStyle(this._extendStyle);
  },
  get: function () {
    return this._extendClasses;
  }
};
SelectListItem.property.icon = {
  /***
   * @this SelectListItem
   * @param icon
   */
  set: function (icon) {
    if (this.$icon) {
      this.$icon.remove();
      this.$icon = null;
    }

    this._icon = icon || null;

    if (this._icon) {
      this.$icon = _(this._icon);
      this.$icon.addClass('as-select-list-icon');
      this.addChildBefore(this.$icon, this.$text);
    }
  },
  get: function () {
    return this._icon;
  }
};
SelectListItem.property.data = {
  set: function (value) {
    this._data = value;

    if (typeof value == 'string') {
      this.$textValue.data = value;
      this.$descValue.data = '';
      this.level = 0;
      this.extendClasses = '';
      this.extendStyle = {};
      this.lastInGroup = false;
      this.isLeaf = false;
      this.selected = false;
      this.disabled = false;
      this.icon = null;
    } else {
      this.$textValue.data = value.text || '';
      this.$descValue.data = value.desc || '';
      this.level = value.level || 0;
      this.extendClasses = value.extendClasses;
      this.extendStyle = value.extendStyle;
      this.lastInGroup = !!value.lastInGroup;
      this.isLeaf = !!value.isLeaf;
      this.selected = !!value.selected;
      this.disabled = value.disabled || value.noSelect;
      this.icon = value.icon;
    }
  },
  get: function () {
    return this._data;
  }
};
SelectListItem.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
SelectListItem.property.value = {
  get: function () {
    return getValueOfListItem(this._data);
  }
};
SelectListItem.property.text = {
  get: function () {
    return getTextOfListItem(this._data);
  }
};
SelectListItem.property.desc = {
  get: function () {
    return getDescriptionOfListItem(this._data);
  }
};
SelectListItem.property.level = {
  set: function (value) {
    value = value || 0;
    this._level = value;
    this.addStyle('--level', value);
  },
  get: function () {
    return this._level;
  }
};
SelectListItem.property.lastInGroup = {
  set: function (value) {
    if (value) {
      this.addClass('as-last-in-group');
    } else {
      this.removeClass('as-last-in-group');
    }
  },
  get: function () {
    return this.hasClass('as-last-in-group');
  }
};
SelectListItem.property.isLeaf = {
  set: function (value) {
    if (value) {
      this.addClass('as-is-leaf');
    } else {
      this.removeClass('as-is-leaf');
    }
  },
  get: function () {
    return this.hasClass('as-is-leaf');
  }
};
SelectListItem.property.selected = {
  set: function (value) {
    if (value) {
      this.addClass('as-selected');
    } else {
      this.removeClass('as-selected');
    }
  },
  get: function () {
    return this.hasClass('as-selected');
  }
};

_ACore.default.install(SelectListItem);

var _default = SelectListItem;
exports.default = _default;

function getTextOfListItem(item) {
  if (item) {
    if (item.match) {} else if (item.text && item.text.match) {
      return item.text;
    } else return '';
  } else return '';
}

function getValueOfListItem(item) {
  if (item) {
    if (item.match) {
      return item;
    } else if (typeof item === "object") return item.value;else return item;
  } else return item;
}

function getDescriptionOfListItem(item) {
  return item && typeof item == "object" ? item.desc : undefined;
}
};

moduleFactories["node_modules/absol-acomp/js/SelectList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.makeItem = makeItem;
exports.requireItem = requireItem;
exports.releaseItem = releaseItem;
exports.measureMaxDescriptionWidth = measureMaxDescriptionWidth;
exports.measureMaxTextWidth = measureMaxTextWidth;
exports.measureListHeight = measureListHeight;
exports.measureListSize = measureListSize;
exports.default = void 0;

require("../css/selectlist.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _utils = require("./utils");

require("./SelectListItem");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var itemPool = [];

function onMousedownItem(event) {
  if (_EventEmitter.default.isMouseRight(event)) return;
  var thisSL = this.$parent;

  if (thisSL) {
    thisSL.value = this.value;
    thisSL.emit('pressitem', {
      type: 'pressitem',
      target: thisSL,
      itemElt: this,
      value: this.value,
      data: this.data
    });
  }
}

function makeItem() {
  return _({
    tag: 'selectlistitem',
    on: {
      mousedown: onMousedownItem
    }
  });
}

function requireItem($parent) {
  var item;

  if (itemPool.length > 0) {
    item = itemPool.pop();
  } else {
    item = makeItem();
  }

  item.$parent = $parent;
  return item;
}

function releaseItem(item) {
  item.$parent = null;
  item.removeClass('selected');
  itemPool.push(item);
}

;

function measureMaxDescriptionWidth(items) {
  var maxDescWidth = 0;
  var maxText = 0;
  var maxEst = 0;
  var est;

  for (var i = 0; i < items.length; ++i) {
    if (items[i].desc) {
      est = (0, _utils.estimateWidth14)(items[i].desc);

      if (est > maxEst) {
        maxEst = est;
        maxText = items[i].desc;
      }
    }
  }

  if (maxText) maxDescWidth = (0, _utils.measureText)(maxText, 'italic 14px  sans-serif').width;
  return maxDescWidth;
}

;

function measureMaxTextWidth(items) {
  var maxTextWidth = 0;
  var maxText = 0;
  var maxEst = 0;
  var maxLv = 0;
  var est;
  var text;
  var item;

  for (var i = 0; i < items.length; ++i) {
    item = items[i];

    if (item.text) {
      text = item.text;
      est = (0, _utils.estimateWidth14)(text) + 14 * 0.9 * (item.level || 0);

      if (est > maxEst) {
        maxEst = est;
        maxText = text;
        maxLv = item.level || 0;
      }
    }
  }

  if (maxText) maxTextWidth = 14 * 0.9 * maxLv + (0, _utils.measureText)(maxText, '14px Arial, Helvetica, sans-serif').width + 14; //padding left, right 7px

  return maxTextWidth;
}

function measureListHeight(items) {
  var border = 0;
  var n = items.length - 1;
  return items.length * 20 + border;
}

function measureListSize(items) {
  var descWidth = measureMaxDescriptionWidth(items);
  var textWidth = measureMaxTextWidth(items);
  var width = textWidth;

  if (descWidth > 0) {
    width += descWidth + 14;
  }

  var height = measureListHeight(items);
  return {
    width: width,
    height: height,
    descWidth: descWidth,
    textWidth: textWidth
  };
}
/*global absol*/

/***
 * @extends AElement
 * @constructor
 */


function SelectList() {
  var thisSL = this;
  this.defineEvent(['pressitem', 'cancelasync', 'valuevisibilityasync', 'finishasync', 'sizechangeasync']);
  this.$attachhook = _('attachhook').addTo(this);
  this.sync = new Promise(function (rs) {
    thisSL.$attachhook.once('error', rs);
  });
  this.$items = [];
  this.$itemByValue = {}; //quick find element

  this.$selectedItem = undefined;
  this.measuredSize = {
    width: 0,
    height: 0,
    descWidth: 0,
    textWidth: 0
  };
  this._itemSession = 0;
  this._finished = true;
}

;
SelectList.tag = "SelectList".toLowerCase();

SelectList.render = function () {
  return _('.absol-selectlist');
};

SelectList.prototype._updateSelectedItem = function () {
  var newSelectedItemElt = this.$itemByValue[this._selectValue];

  if (newSelectedItemElt != this.$selectedItem) {
    if (this.$selectedItem) {
      this.$selectedItem.removeClass('selected');
    }

    if (newSelectedItemElt) {
      newSelectedItemElt.addClass('selected');
      this.$selectedItem = newSelectedItemElt;
    }
  }
};

SelectList.prototype._requireItems = function (itemCout) {
  var item;

  while (this.$items.length < itemCout) {
    item = requireItem(this);
    this.$items.push(item);
    this.addChild(item);
  }

  while (this.$items.length > itemCout) {
    item = this.$items.pop();
    item.remove();
    releaseItem(item);
  }
};

SelectList.prototype._assignItems = function (from, to) {
  var foundSelected = false;
  var itemElt;
  var item;

  for (var i = from; i < to; ++i) {
    itemElt = this.$items[i];
    item = this._items[i];
    itemElt.data = item;
    itemElt.__index__ = i;

    if (this.$itemByValue[item.value]) {
      console.warn('Value  ' + this.$items[i].value + ' is duplicated!');
    } else {
      this.$itemByValue[item.value] = itemElt;

      if (this._selectValue == item.value) {
        itemElt.addClass('selected');
        this.$selectedItem = itemElt;
        foundSelected = true;
      } else {
        itemElt.removeClass('selected');
      }
    }
  }

  return foundSelected;
};

SelectList.prototype.setItemsAsync = function (items) {
  //start process
  this._finished = false;
  var session = Math.floor(Math.random() * 1000000);
  this._itemSession = session;
  this._items = items || [];
  this.$itemByValue = {};
  this.measuredSize = measureListSize(items);
  this.style.setProperty('--select-list-desc-width', this.measuredSize.descWidth / 14 + 'em'); //addStyle notWork because of convert to cameCase

  var thisSL = this;
  var i = 0;
  var limit = 20;

  function tick() {
    if (thisSL._itemSession != session) {
      thisSL.emit('cancelasync', {
        session: session,
        type: 'cancelasync'
      }, this);
      return;
    }

    if (i >= items.length) {
      thisSL._updateSelectedItem();

      thisSL._finished = false;
      thisSL.emit('finishasync', {
        session: session,
        type: 'finishasync'
      }, this);
      return;
    }

    var n = Math.min(items.length - i, limit);
    var itemCout = i + n;

    thisSL._requireItems(itemCout);

    i = itemCout;

    var foundSelected = thisSL._assignItems(itemCout - n, itemCout);

    if (foundSelected) {
      thisSL.emit('valuevisibilityasync', {
        session: session,
        type: 'valuevisibilityasync',
        itemElt: thisSL.$items[i]
      }, thisSL);
    }

    thisSL.emit('sizechangeasync', {
      session: session,
      type: 'sizechangeasync'
    }, this);
    setTimeout(tick, 2);
  }

  setTimeout(tick, 2);
  return Object.assign({
    session: session
  }, this.measuredSize);
};

SelectList.prototype.setItems = function (items) {
  this._finished = false;
  var session = Math.floor(Math.random() * 1000000);
  this._itemSession = session;
  this._items = items || [];
  this.$itemByValue = {};
  this.measuredSize = measureListSize(items);
  this.style.setProperty('--select-list-desc-width', this.measuredSize.descWidth / 14 + 'em'); //addStyle notWork because of convert to cameCase

  var itemCount = items.length;

  this._requireItems(itemCount);

  this._assignItems(0, itemCount);

  this._finished = true;
  return {
    session: this._itemSession,
    width: this._descWidth + this._textWidth + 14,
    height: this._height
  };
};

SelectList.property = {};
/**
 * @type {SelectList}
 */

SelectList.property.items = {
  set: function (value) {
    value = value || [];
    this.setItems(value);
  },
  get: function () {
    return this._items || [];
  }
};
SelectList.property.value = {
  set: function (value) {
    this._selectValue = value;

    this._updateSelectedItem();
  },
  get: function () {
    return this._selectValue;
  }
};
SelectList.property.item = {
  get: function () {
    if (this.$selectedItem) return this.$selectedItem.data;
    return undefined;
  }
};
SelectList.property.selectedIndex = {
  get: function () {
    throw new Error("selectedIndex getter is deprecated");
  }
};

SelectList.prototype.init = function (props) {
  props = props || {};
  var value = props.value;
  delete props.value;
  this.super(props);
  if (value !== undefined) this.value = value;
};

SelectList.eventHandler = {};

_ACore.default.install(SelectList);

var _default = SelectList;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/QuickMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/QuickMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.QuickMenuInstance = QuickMenuInstance;
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

require("./Menu");

var _utils = require("./utils");

var _Follower = _interopRequireDefault(require("./Follower"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));




var isMobile = _BrowserDetector.default.isMobile;
var _ = _ACore.default._;
var $ = _ACore.default.$;

function QuickMenu() {
  //like context menu without right-click
  this._contextMenuSync = Promise.resolve();
}

QuickMenu.tag = 'QuickMenu'.toLowerCase();

QuickMenu.render = function () {
  return _({
    tag: 'vmenu',
    extendEvent: 'requestcontextmenu',
    class: ['as-quick-menu', 'as-bscroller'],
    style: {
      'overflow-y': 'auto',
      'box-sizing': 'border-box'
    }
  });
};

_ACore.default.install(QuickMenu);
/***
 *
 * @param {AElement} elt
 * @param opt
 * @constructor
 */


function QuickMenuInstance(elt, opt) {
  this.id = (Math.random() * 10000 >> 0) + '' + new Date().getTime();
  /***
   *
   * @type {"OPEN"|"CLOSE"}
   */

  this.state = 'CLOSE';
  this._willAddClickOut = -1;
  this.elt = elt;
  this.opt = opt;

  for (var key in this) {
    if (key.startsWith('_on')) {
      this[key] = this[key].bind(this);
    }
  }

  this._init();
}

QuickMenuInstance.prototype._init = function () {
  this.elt.classList.add('as-quick-menu-trigger');
  if (this.opt.triggerEvent === 'mousedown') $(this.elt).on('contextmenu', function (event) {
    event.preventDefault();
  }).attr('oncontextmenu', "return false;");

  if (this.opt.triggerEvent) {
    this.elt.addEventListener(this.opt.triggerEvent, this._onClick, true);
  } else this.elt.addEventListener('click', this._onClick, true);
};

QuickMenuInstance.prototype._deinit = function () {
  if (this.state === "OPEN") this.close();
  this.elt.classList.remove('as-quick-menu-trigger');

  if (this.opt.triggerEvent) {
    this.elt.removeEventListener(this.opt.triggerEvent, this._onClick, true);
  } else {
    this.elt.removeEventListener('click', this._onClick, true);
  }
};

QuickMenuInstance.prototype.getMenuProps = function () {
  var props;

  if (this.opt.getMenuProps) {
    props = this.opt.getMenuProps();
  } else {
    props = this.opt.menuProps;
  }

  props = props || {};
  return Object.assign({
    extendClasses: [],
    extendStyle: {}
  }, props);
};

QuickMenuInstance.prototype.remove = function () {
  this._deinit();
};

QuickMenuInstance.prototype._onClick = function (event) {
  if (this.opt.triggerEvent === 'mousedown') {
    event.preventDefault();
  }

  var event = (0, _EventEmitter.copyEvent)(event, {
    canceled: false,
    cancel: function () {
      this.canceled = true;
    }
  });

  if (this.opt.onClick) {
    this.opt.onClick.call(this, event);
  }

  if (!event.canceled) this.toggle();
};

QuickMenuInstance.prototype._onClickOut = function (event) {
  if ((0, _EventEmitter.hitElement)(this.elt, event)) return;
  this.close();
};

QuickMenuInstance.prototype.onSelect = function (item) {
  if (this.opt.onSelect) this.opt.onSelect(item.__originalItem__ || item);
  this.close();
};

QuickMenuInstance.prototype.open = function () {
  if (QuickMenu.runningInstance === this) return;
  if (this.state !== "CLOSE") return;
  if (QuickMenu.runningInstance) QuickMenu.runningInstance.close();
  QuickMenu.runningInstance = this;
  this.state = 'OPEN';
  this.elt.classList.add('as-quick-menu-attached');
  this._willAddClickOut = setTimeout(() => {
    this._willAddClickOut = -1;
    document.addEventListener('click', this._onClickOut, false);
    followerElt.updatePosition();
    menuElt.addStyle('visibility', 'visible');
  }, isMobile ? 33 : 2);
  var anchor = this.getAnchor();
  var followerElt = QuickMenu.$follower;
  var menuElt = QuickMenu.$elt;
  this.originProps = this.getMenuProps();
  this.copyProps = Object.assign({}, this.originProps);
  this.copyProps.items = this.originProps.items || [];
  this.copyProps.items = this.copyProps.items.map(function visit(item) {
    var cpyItem = item;
    if (typeof item === "string") cpyItem = item;else if (item && typeof item.text === "string") {
      cpyItem = Object.assign({
        __originalItem__: item
      }, item);
      if (cpyItem.items && cpyItem.items.map) cpyItem.items = cpyItem.items.map(visit);
    }
    return cpyItem;
  });
  Object.assign(menuElt, this.copyProps);
  followerElt.addClass('absol-active');

  if (anchor === 'modal') {
    followerElt.addClass('as-anchor-modal');
    followerElt.anchor = [];
  } else {
    followerElt.removeClass('as-anchor-modal');
    followerElt.anchor = anchor;
  }

  this._onSizeNeedUpdate();

  QuickMenu.$follower.on('preupdateposition', this._onSizeNeedUpdate);
  followerElt.followTarget = this.elt;
  menuElt.addStyle('visibility', 'hidden');
  followerElt.addTo(document.body);
  followerElt.addClass('absol-active');

  if (this.opt.onOpen) {
    try {
      this.opt.onOpen.call(this);
    } catch (err) {
      (0, _safeThrow.default)(err);
    }
  }
};

QuickMenuInstance.prototype.close = function () {
  if (QuickMenu.runningInstance !== this) return;
  if (this.state !== "OPEN") return;

  if (this.opt.onClose) {
    try {
      this.opt.onClose.call(this);
    } catch (err) {
      (0, _safeThrow.default)(err);
    }
  }

  this.state = 'CLOSE';
  this.elt.classList.remove('as-quick-menu-attached');
  QuickMenu.$elt.removeStyle('--available-height');
  var followerElt = QuickMenu.$follower;
  followerElt.addClass('absol-active');
  followerElt.remove();
  QuickMenu.$follower.off('preupdateposition', this._onSizeNeedUpdate);

  if (this._willAddClickOut >= 0) {
    clearTimeout(this._willAddClickOut);
  } else {
    document.removeEventListener('click', this._onClickOut, false);
  }

  QuickMenu.runningInstance = null;
};

QuickMenuInstance.prototype._onSizeNeedUpdate = function () {
  var screenSize = (0, _Dom.getScreenSize)();
  var eltBound = this.elt.getBoundingClientRect();
  var aTop = eltBound.bottom;
  var aBottom = screenSize.height - eltBound.top;
  QuickMenu.$elt.addStyle('--available-height', Math.max(aTop, aBottom) - 10 + 'px');
};

QuickMenuInstance.prototype.toggle = function () {
  if (this.state === "OPEN") {
    this.close();
  } else if (this.state === 'CLOSE') {
    this.open();
  }
};

QuickMenuInstance.prototype.getAnchor = function () {
  var menuAnchors;
  var anchor = this.opt.getAnchor ? this.opt.getAnchor() : this.opt.anchor;

  if (typeof anchor == 'number') {
    menuAnchors = [anchor];
  } else if (anchor instanceof Array) {
    menuAnchors = anchor;
  } else if (anchor === 'modal') {
    menuAnchors = 'modal';
  } else {
    menuAnchors = QuickMenu.PRIORITY_ANCHORS;
  }

  return menuAnchors;
};

QuickMenu.PRIORITY_ANCHORS = [0, 3, 7, 4, 1, 2, 6, 5];
QuickMenu.$elt = _('quickmenu');
/***
 *
 * @type {Follower}
 */

QuickMenu.$follower = _({
  tag: _Follower.default.tag,
  class: 'absol-context-menu-anchor',
  child: QuickMenu.$elt,
  on: {
    preupdateposition: function () {
      var bound = this.getBoundingClientRect();
      var outBound = (0, _Dom.traceOutBoundingClientRect)(this);

      if (bound.bottom < outBound.top || bound.top > outBound.bottom || bound.right < outBound.left || bound.left > outBound.right) {
        QuickMenu.close(QuickMenu._session);
      }
    }
  }
});
/***
 *
 * @type {null|QuickMenuInstance}
 */

QuickMenu.runningInstance = null;
QuickMenu._session = Math.random() * 10000000000 >> 0;
QuickMenu._menuListener = undefined;
QuickMenu.$elt.on('press', function (event) {
  if (QuickMenu.runningInstance) QuickMenu.runningInstance.onSelect((0, _utils.cleanMenuItemProperty)(event.menuItem));
  if (QuickMenu._menuListener) QuickMenu._menuListener((0, _utils.cleanMenuItemProperty)(event.menuItem));
});

QuickMenu.show = function (element, menuProps, anchor, menuListener, darkTheme) {
  var instance = new QuickMenuInstance(element, {
    menuProps: menuProps,
    anchor: anchor,
    onSelect: menuListener,
    darkTheme: darkTheme
  });
  instance.open();
};

QuickMenu.close = function (session) {
  if (QuickMenu.runningInstance && QuickMenu.runningInstance.id === session) QuickMenu.runningInstance.close();
};

QuickMenu.showWhenClick = function (element, menuProps, anchor, menuListener, darkTheme) {
  return new QuickMenuInstance(element, {
    menuProps: menuProps,
    anchor: anchor,
    onSelect: menuListener,
    darkTheme: darkTheme
  });
};
/**
 * @typedef {Object} QuickMenuAdaptor
 * @property {Function} getFlowedElement default is trigger
 * @property {Function} getMenuProps define menuProps if un-change
 * @property {Function} getAnchor default is 'auto', define anchor if un-change
 * @property {Function} onClose callback
 * @property {Function} onOpen callback
 * @property {Function} onSelect calback
 * @property {Function} isDarkTheme default is false, define darkThem if un-change
 *
 *
 * @typedef {Object} QuickMenuDataHolder
 * @property {Function} remove
 *
 * @param {Element} trigger
 * @param {QuickMenuAdaptor} adaptor
 * @returns {QuickMenuDataHolder}
 */


QuickMenu.toggleWhenClick = function (trigger, adaptor) {
  return new QuickMenuInstance(trigger, adaptor);
};

var _default = QuickMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/QuickPath.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/QuickPath.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/quickpath.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _QuickMenu = _interopRequireDefault(require("./QuickMenu"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function QuickPath() {
  this._holders = [];
}
/**
 * @type {QuickPath}
 */


QuickPath.eventHandler = {};
/***
 * @this QuickPath
 * @param event
 */

QuickPath.eventHandler.click = function (event) {
  var button = this._fileButton(event.target);

  if (button) this.pressButton(button);
};

QuickPath.tag = 'QuickPath'.toLowerCase();
/**
 * @returns {QuickPath}
 */

QuickPath.render = function () {
  return _({
    class: 'absol-quick-path',
    extendEvent: ['change', 'press']
  });
};

QuickPath.prototype.updatePath = function () {
  this.clearChild();
  var self = this;
  this._holders = this._path.map(function (data, index) {
    var holder = self._createButton(data, index);

    holder.buttom.addTo(self);
    return holder;
  });
};

QuickPath.prototype._createButton = function (pathItem, index) {
  var buttom = _({
    tag: 'expnode',
    class: 'absol-quick-path-btn',
    attr: {
      'data-index': '' + index
    }
  });

  buttom.status = 'close';
  buttom.name = pathItem.name;

  if (pathItem.icon) {
    buttom.icon = pathItem.icon;
  }

  if (pathItem.iconSrc) {
    buttom.icon = {
      tag: 'img',
      props: {
        src: pathItem.iconSrc
      }
    };
  }

  var thisQuickpath = this;

  if (pathItem.items) {
    _QuickMenu.default.toggleWhenClick(buttom, {
      getAnchor: function () {
        return [1, 2, 6, 5];
      },
      getMenuProps: function () {
        return {
          extendStyle: {
            fontSize: buttom.getComputedStyleValue('font-size')
          },
          items: pathItem.items.map(function (it, menuIndex) {
            var res = {
              text: it.name,
              menuIndex: menuIndex,
              icon: it.iconSrc ? {
                tag: 'img',
                props: {
                  src: it.iconSrc
                }
              } : it.icon || undefined,
              extendStyle: it.extendStyle || {},
              extendClass: it.extendClass || []
            };
            return res;
          })
        };
      },
      onOpen: function () {
        buttom.status = 'open';
        thisQuickpath.emit('press', {
          target: thisQuickpath,
          pathItem: pathItem,
          index: index
        }, thisQuickpath);
      },
      onClose: function () {
        buttom.status = 'close';
      },
      onSelect: function (item) {
        var dataItem = pathItem.items[item.menuIndex];
        thisQuickpath.emit('change', {
          target: thisQuickpath,
          pathItem: pathItem,
          item: dataItem,
          index: index
        }, thisQuickpath);
        thisQuickpath.status = 'close';
      }
    });
  } else {
    buttom.on('click', function () {
      this.emit('press', {
        target: thisQuickpath,
        pathItem: pathItem,
        index: index
      }, thisQuickpath);
    });
  }

  return {
    buttom: buttom
  };
};

QuickPath.prototype.push = function (item) {
  this.path.push(item);

  var holder = this._createButton(item, this.path.length - 1);

  this.addChild(holder, buttom);

  this._holders.push(holder);
};

QuickPath.prototype.clear = function () {
  this.path = [];
  this._holders = [];
};

QuickPath.prototype.pop = function () {
  //todo
  var res = this.path.pop();
  var button = $('button[data-index="' + this.path.length + '"]');
  if (button) button.remove();
  return res;
};

QuickPath.property = {};
/**
 * @typedef PathElement
 * @property {String} name
 * @property {String} icon
 * @property {Array<String>} items
 *
 */

QuickPath.property.path = {
  /**
   * @param {Array<PathElement>} value
   */
  set: function (value) {
    this._path = value || [];
    this.updatePath();
  },
  get: function () {
    return this._path || [];
  }
};
QuickPath.property.textPath = {
  get: function () {
    return this.path.join('/');
  }
};

_ACore.default.install('quickpath', QuickPath);

var _default = QuickPath;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/RadioButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/RadioButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/radiobutton.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function RadioButton() {
  var thisRB = this;
  this.defineEvent('change');
  this.$input = $('input', this).on('change', this.notifyChange.bind(this));

  _OOP.default.drillProperty(this, this.$input, ['value', 'checked']);
}

RadioButton.tag = 'radiobutton';
RadioButton.radioProto = _('<svg class="absol-radio-icon" width="20" height="20" version="1.1" viewBox="0 0 5.2917 5.2917"' + '   xmlns="http://www.w3.org/2000/svg">' + '    <g transform="translate(0 -291.71)">' + '        <circle class="bound" cx="2.6458" cy="294.35" r="2.4626" style="stroke-opacity:.99497;stroke-width:.26458;" />' + '        <circle class="dot" cx="2.6458" cy="294.35"  r= "0.92604" style="fill-rule:evenodd;" />' + '    </g>' + '</svg>');

RadioButton.render = function () {
  return _({
    tag: 'label',
    class: 'absol-radio-button',
    child: [{
      tag: 'input',
      attr: {
        type: 'radio'
      }
    }, RadioButton.radioProto.cloneNode(true)]
  });
};

RadioButton.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change',
    checked: this.checked,
    target: this
  }, this);
};

RadioButton.prototype.getAllFriend = function () {
  return Radio.getAllByName(this.name);
};

RadioButton.attribute = {
  checked: {
    set: function (value) {
      if (value == 'false' || value == null) {
        this.checked = false;
      } else {
        this.checked = true;
      }
    },
    get: function () {
      return this.checked ? 'true' : 'false';
    },
    remove: function () {
      this.checked = false;
    }
  },
  disabled: {
    set: function (value) {
      if (value == 'false' || value == null) {
        this.disabled = false;
      } else {
        this.disabled = true;
      }
    },
    get: function () {
      return this.disabled ? 'true' : 'false';
    },
    remove: function () {
      this.disabled = false;
    }
  },
  name: {
    set: function (value) {
      this.name = value;
    },
    get: function () {
      return this.name;
    },
    remove: function () {
      this.name = null;
    }
  }
};
RadioButton.property = {
  name: {
    set: function (name) {
      if (name == null) this.$input.removeAttribute('name');else this.$input.setAttribute('name', name);
    },
    get: function () {
      return this.$input.getAttribute('name');
    }
  },
  disabled: {
    set: function (value) {
      this.$input.disabled = !!value;

      if (value) {
        this.addClass('disabled');
      } else {
        this.removeClass('disabled');
      }
    },
    get: function () {
      return this.$input.disabled;
    }
  }
};

RadioButton.getAllByName = function (name) {
  return (document.getElementsByTagName('input') || []).filter(function (elt) {
    return elt.getAttribute('type') == 'radio' && elt.getAttribute('name') == name;
  });
};

RadioButton.getValueByName = function (name) {
  var inputs = RadioButton.getAllByName(name);
  var res = null;
  var input;

  for (var i = 0; i < inputs.length; ++i) {
    input = inputs[i];

    if (input.checked) {
      res = input.value;
    }
  }

  return res;
};

RadioButton.autoReplace = function () {
  var placeHolders = Array.prototype.slice.call(document.getElementsByTagName(this.tag));
  var ph;
  var attOfPH;
  var attrs;
  var style;
  var classList;
  var attNode;
  var attrName, attrValue;
  var props;

  for (var i = 0; i < placeHolders.length; ++i) {
    ph = placeHolders[i];
    attOfPH = ph.attributes;
    classList = [];
    style = {};
    attrs = {};
    props = {};

    for (var j = 0; j < attOfPH.length; ++j) {
      attNode = attOfPH[j];
      attrName = attNode.nodeName;
      attrValue = attNode.nodeValue;

      if (attrName == 'style') {
        attrValue.trim().split(';').reduce(function (style, prop) {
          var p = prop.split(':');

          if (p.length == 2) {
            style[p[0].trim()] = p[1].trim();
          }

          return style;
        }, style);
      } else if (attrName == 'class') {
        classList = attrValue.trim().split(/\s+/);
      } else if (attrName == 'onchange') {
        props.onchange = new Function('event', 'sender', attrValue);
      } else {
        attrs[attrName] = attrValue;
      }
    }

    var newElt = _({
      tag: this.tag,
      attr: attrs,
      class: classList,
      style: style,
      props: props
    });

    $(ph).selfReplace(newElt);
  }
};

RadioButton.initAfterLoad = function () {
  _Dom.default.documentReady.then(function () {
    RadioButton.autoReplace();
  });
};

_ACore.default.install('RadioButton'.toLowerCase(), RadioButton);

var _default = RadioButton;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Radio.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Radio.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/radio.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _RadioButton = _interopRequireDefault(require("./RadioButton"));

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var $$ = _ACore.default.$$;
var _svg = _Svg.default.ShareInstance._;
/***
 * @extends AElement
 * @constructor
 */

function Radio() {
  var thisR = this;
  this.defineEvent('change');
  this.$input = $('input', this).on('change', this.notifyChange.bind(this));
  this.$labels = $$('span', this);

  _OOP.default.drillProperty(this, this.$input, ['value', 'checked']);
}

Radio.tag = 'radio';
Radio.radioProto = _('<svg class="absol-radio-icon" width="20" height="20" version="1.1" viewBox="0 0 5.2917 5.2917"' + '   xmlns="http://www.w3.org/2000/svg">' + '    <g transform="translate(0 -291.71)">' + '        <circle class="bound" cx="2.6458" cy="294.35" r="2.4626" style="stroke-opacity:.99497;stroke-width:.26458;" />' + '        <circle class="dot" cx="2.6458" cy="294.35"  r= "0.92604" style="fill-rule:evenodd;" />' + '    </g>' + '</svg>');

Radio.render = function () {
  return _({
    tag: 'label',
    class: 'absol-radio',
    child: [{
      tag: 'input',
      attr: {
        type: 'radio'
      }
    }, {
      tag: 'span',
      class: 'absol-radio-left-label'
    }, Radio.radioProto.cloneNode(true), {
      tag: 'span',
      class: 'absol-radio-right-label'
    }]
  });
};

Radio.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change',
    checked: this.checked,
    target: this
  }, this);
};

Radio.prototype.getAllFriend = function () {
  return Radio.getAllByName(this.name);
};

Radio.attribute = _RadioButton.default.attribute;
Radio.property = {
  name: {
    set: function (name) {
      this.$input.setAttribute('name', name);
    },
    get: function () {
      return this.$input.getAttribute('name');
    }
  },
  text: {
    set: function (value) {
      value = (value || '').trim();
      this.$labels[0].clearChild();
      this.$labels[1].clearChild();

      if (value) {
        this.$labels[0].addChild(_({
          text: value
        }));
        this.$labels[1].addChild(_({
          text: value
        }));
      }
    },
    get: function () {
      return this.$labels[0].firstChild.data;
    }
  },
  disabled: {
    set: function (value) {
      this.$input.disabled = !!value;

      if (value) {
        this.addClass('disabled');
      } else {
        this.removeClass('disabled');
      }
    },
    get: function () {
      return this.$input.disabled;
    }
  }
};

Radio.getAllByName = function (name) {
  return (Array.apply(null, document.getElementsByTagName('input')) || []).filter(function (elt) {
    return elt.getAttribute('type') == 'radio' && elt.getAttribute('name') == name;
  });
};

Radio.getValueByName = function (name) {
  var inputs = Radio.getAllByName(name);
  var res = null;
  var input;

  for (var i = 0; i < inputs.length; ++i) {
    input = inputs[i];

    if (input.checked) {
      res = input.value;
    }
  }

  return res;
};

_ACore.default.install(Radio);

var _default = Radio;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/RemoteSvg.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/RemoteSvg.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _XHR = _interopRequireDefault(require("absol/src/Network/XHR"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function RemoteSvg() {}

RemoteSvg.tag = 'RemoteSvg'.toLowerCase();

RemoteSvg.render = function () {
  return _('svg').defineEvent('load');
};

RemoteSvg.property = {
  src: {
    set: function (value) {
      this._src = value;
      var self = this;
      RemoteSvg.loadIcon(value).then(function (data) {
        self.emit('load', {
          target: self,
          src: value,
          data: data
        }, self);
        self.attr(data.attr);
        self.init(data.props);
      });
    },
    get: function () {
      return this._name;
    }
  }
};
RemoteSvg.attribute = {
  src: {
    set: function (value) {},
    get: function () {},
    remove: function () {}
  }
};
RemoteSvg.__cache__ = {};
RemoteSvg.__div_parser__ = document.createElement('div');

RemoteSvg.loadIcon = function (path) {
  if (RemoteSvg.__cache__[path]) {
    return RemoteSvg.__cache__[path];
  } else {
    RemoteSvg.__cache__[path] = _XHR.default.getRequest(path, 'text').then(function (result) {
      RemoteSvg.__div_parser__.innerHTML = result;
      var svgElt = $('svg', RemoteSvg.__div_parser__);
      var res = {
        attr: {},
        props: {}
      };

      if (svgElt) {
        Array.prototype.forEach.call(svgElt.attributes, function (attribute) {
          res.attr[attribute.name] = attribute.value;
        });
        res.props.innerHTML = svgElt.innerHTML;
      }

      return res;
    }, function () {
      return {};
    });
    return RemoteSvg.__cache__[path];
  }
};

_ACore.default.install(RemoteSvg);

var _default = RemoteSvg;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ResizeBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ResizeBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/resizebox.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Hanger = _interopRequireDefault(require("./Hanger"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends Hanger
 * @constructor
 */

function ResizeBox() {
  this.on({
    draginit: this.eventHandler.rbDragInit,
    dragdeinit: this.eventHandler.rbDragDeinit
  });
  this.hangon = 3;
  this._mousedownEventData = undefined;
  this._mousemoveEventData = undefined;
  this._lastClickTime = 0;
}

ResizeBox.tag = 'ResizeBox'.toLowerCase();

ResizeBox.render = function () {
  return _({
    tag: _Hanger.default.tag,
    class: 'as-resize-box',
    extendEvent: ['beginmove', 'endmove', 'moving', 'click', 'dblclick'],
    //override click event
    child: {
      class: 'as-resize-box-body',
      child: ['.as-resize-box-dot.left-top', '.as-resize-box-dot.top', '.as-resize-box-dot.right-top', '.as-resize-box-dot.right', '.as-resize-box-dot.right-bottom', '.as-resize-box-dot.bottom', '.as-resize-box-dot.left-bottom', '.as-resize-box-dot.left']
    }
  });
};

ResizeBox.eventHandler = {};

ResizeBox.eventHandler.rbDragInit = function (event) {
  var target = event.target;
  if (!target.attr) return;
  if (!target.hasClass('as-resize-box-dot') && !target.hasClass('as-resize-box-body')) return;
  var optionNames = event.target.attr('class').match(/body|left|top|right|bottom/g);
  if (optionNames.length === 0) return;
  this._mouseOptionNames = optionNames;
  this._mouseOptionDict = this._mouseOptionNames.reduce((ac, cr) => {
    ac[cr] = true;
    return ac;
  }, {});
  this.on({
    drag: this.eventHandler.rbDrag,
    dragend: this.eventHandler.rbDragEnd,
    dragstart: this.eventHandler.rbDragStart
  });
  this._dragged = false;
};

ResizeBox.eventHandler.rbDragDeinit = function (event) {
  this.off({
    drag: this.eventHandler.rbDrag,
    dragend: this.eventHandler.rbDragEnd,
    dragstart: this.eventHandler.rbDragStart
  });
  var now = new Date().getTime();

  if (!this._dragged) {
    if (now - this._lastClickTime < 400) {
      this.emit('dblclick', Object.assign({}, event, {
        type: 'dblclick'
      }), this);
      this._lastClickTime = 0;
    } else {
      this.emit('click', Object.assign({}, event, {
        type: 'click'
      }), this);
      this._lastClickTime = now;
    }
  }
};

ResizeBox.eventHandler.rbDrag = function (event) {
  if (this._mousedownEventData.option.body && !this.canMove) return;
  this._dragged = true;
  event.preventDefault();
  this._mousemoveEventData = {
    clientX: event.clientX,
    clientY: event.clientY,
    clientX0: this._mousedownEventData.clientX,
    clientY0: this._mousedownEventData.clientY,
    clientDX: event.clientX - this._mousedownEventData.clientX,
    clientDY: event.clientY - this._mousedownEventData.clientY,
    target: this,
    originEvent: event,
    option: this._mousedownEventData.option,
    type: 'moving',
    begin: true
  };
  this.emit('moving', this._mousemoveEventData, this);
};

ResizeBox.eventHandler.rbDragStart = function (event) {
  event.preventDefault();
  this._optionNames = event.target.attr('class').match(/body|left|top|right|bottom/g);
  this._dragged = true;
  $(document.body).addClass('as-resize-box-overiding').addClass(this._optionNames.join('-'));

  var option = this._optionNames.reduce(function (ac, key) {
    ac[key] = true;
    return ac;
  }, {});

  this._mousedownEventData = {
    clientX: event.clientX,
    clientY: event.clientY,
    target: this,
    originEvent: event,
    prevented: false,
    preventDefault: function () {
      this.prevented = true;
    },
    option: option,
    begin: false,
    type: 'beginmove'
  };
  this.emit('beginmove', this._mousedownEventData, this);
};

ResizeBox.eventHandler.rbDragEnd = function (event) {
  document.body.classList.remove('as-resize-box-overiding');
  document.body.classList.remove(this._optionNames.join('-'));
  this._mousefinishEventData = {
    clientX: event.clientX,
    clientY: event.clientY,
    clientX0: this._mousedownEventData.clientX,
    clientY0: this._mousedownEventData.clientY,
    clientDX: event.clientX - this._mousedownEventData.clientX,
    clientDY: event.clientY - this._mousedownEventData.clientY,
    target: this,
    originEvent: event,
    option: this._mousedownEventData.option,
    type: 'endmove'
  };
  this.emit('endmove', this._mousefinishEventData, this);
};

ResizeBox.property = {};
ResizeBox.property.canMove = {
  set: function (value) {
    if (value) {
      this.addClass('as-can-move');
    } else {
      this.removeClass('as-can-move');
    }
  },
  get: function () {
    return this.hasClass('as-can-move');
  }
};
ResizeBox.property.canResize = {
  set: function (value) {
    if (value) {
      this.addClass('as-can-resize');
    } else {
      this.removeClass('as-can-resize');
    }
  },
  get: function () {
    return this.hasClass('as-can-resize');
  }
};
ResizeBox.property.canClick = {
  set: function (value) {
    if (value) {
      this.addClass('as-can-click');
    } else {
      this.removeClass('as-can-click');
    }
  },
  get: function () {
    return this.hasClass('as-can-click');
  }
};

_ACore.default.install(ResizeBox);

var _default = ResizeBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/assets/icon/spinner.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/assets/icon/spinner.tpl ***/
module.exports = "<svg class=\"as-spinner-ico\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"  viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\">\r\n    <g><circle cx=\"73.801\" cy=\"68.263\" fill=\"#e15b64\" r=\"4\">\r\n        <animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;360 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\" begin=\"0s\"></animateTransform>\r\n    </circle><circle cx=\"68.263\" cy=\"73.801\" fill=\"#f47e60\" r=\"4\">\r\n        <animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;360 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\" begin=\"-0.062s\"></animateTransform>\r\n    </circle><circle cx=\"61.481\" cy=\"77.716\" fill=\"#f8b26a\" r=\"4\">\r\n        <animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;360 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\" begin=\"-0.125s\"></animateTransform>\r\n    </circle><circle cx=\"53.916\" cy=\"79.743\" fill=\"#abbd81\" r=\"4\">\r\n        <animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;360 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\" begin=\"-0.187s\"></animateTransform>\r\n    </circle><circle cx=\"46.084\" cy=\"79.743\" fill=\"#849b87\" r=\"4\">\r\n        <animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;360 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\" begin=\"-0.25s\"></animateTransform>\r\n    </circle><circle cx=\"38.519\" cy=\"77.716\" fill=\"#6492ac\" r=\"4\">\r\n        <animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;360 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\" begin=\"-0.312s\"></animateTransform>\r\n    </circle><circle cx=\"31.737\" cy=\"73.801\" fill=\"#637cb5\" r=\"4\">\r\n        <animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;360 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\" begin=\"-0.375s\"></animateTransform>\r\n    </circle><circle cx=\"26.199\" cy=\"68.263\" fill=\"#6a63b6\" r=\"4\">\r\n        <animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;360 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\" begin=\"-0.437s\"></animateTransform>\r\n    </circle><animateTransform attributeName=\"transform\" type=\"rotate\" calcMode=\"spline\" values=\"0 50 50;0 50 50\" times=\"0;1\" keySplines=\"0.5 0 0.5 1\" repeatCount=\"indefinite\" dur=\"1.4925373134328357s\"></animateTransform></g>\r\n</svg>";

};

moduleFactories["node_modules/absol-acomp/assets/icon/mdi_store_marker_outline.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/assets/icon/mdi_store_marker_outline.tpl ***/
module.exports = "<svg viewBox=\"0 0 24 24\">\r\n    <path fill=\"currentColor\" d=\"M20 6H4V4H20V6M14.3 12C13.5 12.96 13 14.18 13 15.5C13 16.64 13.43 17.86 14 19V20H4V14H3V12L4 7H20L20.7 10.5C20.04 10.18 19.32 10 18.56 10L18.36 9H5.64L5.04 12H14.3M12 14H6V18H12V14M22 15.5C22 18.1 18.5 22 18.5 22S15 18.1 15 15.5C15 13.6 16.6 12 18.5 12S22 13.6 22 15.5M19.7 15.6C19.7 15 19.1 14.4 18.5 14.4S17.3 14.9 17.3 15.6C17.3 16.2 17.8 16.8 18.5 16.8S19.8 16.2 19.7 15.6Z\" />\r\n</svg>";

};

moduleFactories["node_modules/absol-acomp/js/Icons.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Icons.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SpinnerIco = SpinnerIco;
exports.MdiStoreMarkerOutline = MdiStoreMarkerOutline;

var _ACore = _interopRequireDefault(require("../ACore"));

var _spinner = _interopRequireDefault(require("../assets/icon/spinner.tpl"));

var _mdi_store_marker_outline = _interopRequireDefault(require("../assets/icon/mdi_store_marker_outline.tpl"));

require("../css/icons.css");


function SpinnerIco() {
  return _ACore.default._(_spinner.default);
}

SpinnerIco.tag = 'SpinnerIco'.toLowerCase();

_ACore.default.install(SpinnerIco);

function MdiStoreMarkerOutline() {
  return _ACore.default._(_mdi_store_marker_outline.default);
}

MdiStoreMarkerOutline.tag = 'mdi-store-marker-outline';

_ACore.default.install(MdiStoreMarkerOutline);
};

moduleFactories["node_modules/absol-acomp/js/Searcher.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Searcher.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/searcher.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _Icons = require("./Icons");

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

_ACore.default.creator['find-ico'] = function () {
  var res = _('<svg class="find" width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">' + ' <g transform="matrix(-1 0 0 1 99.478 -193.73)">' + '  <path d="m62.128 199.18c-18.859 0-34.148 15.289-34.148 34.148 0 5.4138 1.26 10.533 3.5026 15.081 0.6886 1.3965 1.4698 2.7392 2.3357 4.02-1.9962 2.1685-31.467 31.596-31.404 33.295 0.21757 5.8346 4.9404 8.7289 9.464 7.855 1.3264-0.25627 30.938-30.639 31.774-31.529 1.3906 0.89633 2.8508 1.6948 4.3702 2.3848 4.2995 1.9526 9.0756 3.04 14.105 3.04 18.859 0 34.147-15.288 34.147-34.147 3e-6 -18.859-15.288-34.148-34.147-34.148zm0.49444 8.2454a26.067 26.067 0 0 1 26.068 26.067 26.067 26.067 0 0 1-26.068 26.068 26.067 26.067 0 0 1-26.067-26.068 26.067 26.067 0 0 1 26.067-26.067z"/>' + ' </g>' + '</svg>');

  return res;
};

_ACore.default.creator['times-circle-ico'] = function () {
  var res = _('<svg class="times" width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">\
            <g transform="translate(0,-197)">\
                <path d="m49.979 236.2-14.231-14.231-10.696 10.696 14.257 14.257-14.351 14.351 10.737 10.737 14.292-14.292 14.292 14.292 10.761-10.761-14.257-14.257 14.316-14.316-10.725-10.725zm50.021 10.804a50 50 0 0 1-50 50 50 50 0 0 1-50-50 50 50 0 0 1 50-50 50 50 0 0 1 50 50z" />\
            </g>\
        </svg>');

  return res;
};
/**
 * @extends {AElement}
 * @constructor
 */


function SearchTextInput() {
  var thisSTI = this;
  this.defineEvent(['change', 'modify', 'stoptyping']);
  this.eventHandler = _OOP.default.bindFunctions(this, SearchTextInput.eventHandler);
  this.$button = $('button', this);
  this.$input = $('input', this);
  ['keyup', 'keydown', 'focus', 'blur'].forEach(function (evName) {
    thisSTI.defineEvent(evName);
    thisSTI.$input.on(evName, function (event) {
      thisSTI.emit(evName, event, thisSTI);
    });
  });
  this.$input.on('change', this.eventHandler.inputChange);
  this.$input.on('keyup', this.eventHandler.inputKeyUp);
  this.$button.on('click', function (event) {
    thisSTI.$input.value = '';
    thisSTI.eventHandler.inputKeyUp(event);
    setTimeout(function () {
      thisSTI.focus();
    }, 50);
  });
}

SearchTextInput.tag = 'SearchTextInput'.toLowerCase();

SearchTextInput.render = function () {
  return _({
    class: 'absol-search-text-input',
    child: [{
      class: 'absol-search-text-input-container',
      child: {
        tag: 'input',
        attr: {
          type: 'search',
          placeholder: _LanguageSystem.default.getText('txt_search') || 'Search...'
        }
      }
    }, {
      class: 'absol-search-text-button-container',
      child: {
        tag: 'button',
        child: ['find-ico', 'times-circle-ico', {
          tag: _Icons.SpinnerIco.tag,
          style: {
            margin: 0
          }
        }]
      }
    }]
  });
};

SearchTextInput.property = {
  value: {
    set: function (value) {
      value = value || '';
      this.$input.value = value;
      this._lastTextModified = value;

      if (this.value.length > 0) {
        this.addClass('searching');
      } else {
        this.removeClass('searching');
      }
    },
    get: function () {
      return this.$input.value;
    }
  },
  placeholder: {
    set: function (value) {
      this.$input.attr('placeholder', value);
    },
    get: function () {
      return this.$placeholder.getAttribute('placeholder');
    }
  }
};
SearchTextInput.property.waiting = {
  set: function (value) {
    value = value || false;
    this._waiting = value;

    if (value) {
      this.addClass('as-waiting');
    } else {
      this.removeClass('as-waiting');
    }
  },
  get: function () {
    return this._waiting || false;
  }
};

SearchTextInput.prototype.focus = function () {
  this.$input.focus();
};

SearchTextInput.prototype.blur = function () {
  this.$input.blur();
};

SearchTextInput.eventHandler = {};

SearchTextInput.eventHandler.inputChange = function (event) {
  event.value = this.value;

  if (typeof this.onchange == 'function') {
    this.onchange(event, this);
  }

  this.emit('change', event);
};

SearchTextInput.eventHandler.inputKeyUp = function (event) {
  if (this._lastTextModified != this.value) {
    if (this.value.length > 0) {
      this.addClass('searching');
    } else {
      this.removeClass('searching');
    }

    event.value = this.value;

    if (typeof this.onchange == 'function') {
      this.onchange(event, this);
    }

    this.emit('modify', event);

    if (this._updateTimeOut !== undefined) {
      clearTimeout(this._updateTimeOut);
      this._updateTimeOut = undefined;
    }

    this._updateTimeOut = setTimeout(function () {
      this.emit('stoptyping', event);
    }.bind(this), 500);
    this._lastTextModified = this.value;
  }
};

_ACore.default.creator.searchcrosstextinput = function () {
  var res = _('searchtextinput', true);

  return res;
};

_ACore.default.creator.searchtextinput = SearchTextInput;
var _default = SearchTextInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectMenu2.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectMenu2.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/selectmenu.css");

var _ACore = _interopRequireWildcard(require("../ACore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));




_ACore.default.creator['dropdown-ico'] = function () {
  return (0, _ACore._)(['<svg class="dropdown" width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">', '<g transform="translate(0,-197)">', '<path d="m6.3152 218.09a4.5283 4.5283 0 0 0-3.5673 7.3141l43.361 55.641a4.5283 4.5283 0 0 0 7.1421 7e-3l43.496-55.641a4.5283 4.5283 0 0 0-3.5673-7.3216z" />', '</g>', '</svg>'].join(''));
};
/***
 * @extends AElement
 * @constructor
 */


function SelectMenu() {
  this._value = null;
  this._lastValue = null;
  this.$holderItem = (0, _ACore.$)('.absol-selectmenu-holder-item', this);
  this.$viewItem = (0, _ACore.$)('.absol-selectmenu-holder-item selectlistitem', this);
  /***
   *
   * @type {SelectListBox}
   */

  this.$selectlistBox = (0, _ACore._)({
    tag: 'selectlistbox',
    props: {
      anchor: [1, 6, 2, 5],
      strictValue: true
    },
    on: {
      preupdateposition: this.eventHandler.preUpdateListPosition
    }
  });

  var checkView = () => {
    if (this.isDescendantOf(document.body)) {
      setTimeout(checkView, 10000);
    } else {
      if (this.$selectlistBox.searchMaster) this.$selectlistBox.searchMaster.destroy();
    }
  };

  setTimeout(checkView, 30000);
  this.$selectlistBox.on('pressitem', this.eventHandler.selectListBoxPressItem);
  this.$selectlistBox.followTarget = this;

  _OOP.default.drillProperty(this, this.$selectlistBox, 'enableSearch');

  _OOP.default.drillProperty(this, this, 'selectedvalue', 'value');

  this.strictValue = true;
  this._lastValue = "NOTHING_VALUE";
  this._isFocus = false;
  this.isFocus = false;
  this.on('mousedown', this.eventHandler.click, true);
  /***
   * @name items
   * @type {[]}
   * @memberOf SelectMenu#
   */
}

SelectMenu.tag = 'selectmenu';

SelectMenu.render = function () {
  return (0, _ACore._)({
    class: ['absol-selectmenu', 'as-select-menu'],
    extendEvent: ['change'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: 'absol-selectmenu-holder-item',
      child: 'selectlistitem'
    }, {
      tag: 'button',
      class: 'absol-selectmenu-btn',
      child: ['dropdown-ico']
    }]
  });
};

SelectMenu.prototype.init = function (props) {
  props = props || {};
  Object.keys(props).forEach(function (key) {
    if (props[key] === undefined) delete props[key];
  });

  if ('selectedvalue' in props) {
    props.value = props.selectedvalue;
  }

  if (!('value' in props)) {
    if (props.items && props.items.length > 0) props.value = typeof props.items[0] == 'string' ? props.items[0] : props.items[0].value;
  }

  var value = props.value;
  delete props.value;
  this.super(props);
  this.value = value;
};

SelectMenu.prototype.updateItem = function () {
  var value = this._explicit(this._value);

  var selectedItems = this.$selectlistBox.findDisplayItemsByValue(value);

  if (selectedItems.length >= 1) {
    this.$viewItem.data = selectedItems[0].item;
  } else {
    this.$viewItem.data = {
      text: '',
      value: null
    };
  }
};

SelectMenu.prototype.findItemsByValue = function (value) {
  return this.$selectlistBox.findItemsByValue(value);
};

SelectMenu.prototype._explicit = function (value) {
  var items = this.$selectlistBox.findItemsByValue(value);

  if (items.length > 0 || !this.strictValue || this.items.length === 0) {
    return value;
  } else {
    return this.items[0].value;
  }
};

SelectMenu.property = {};
SelectMenu.property.items = {
  set: function (items) {
    items = items || [];
    this.$selectlistBox.items = items;
    this.addStyle('--select-list-estimate-width', this.$selectlistBox._estimateWidth / 14 + 'em');
    this.addStyle('--select-list-desc-width', this.$selectlistBox._estimateDescWidth / 14 + 'em');
    this.updateItem();
  },
  get: function () {
    return this.$selectlistBox.items;
  }
};
SelectMenu.property.value = {
  set: function (value) {
    this.$selectlistBox.values = [value];
    this._lastValue = value;
    this._value = value;
    this.updateItem();
  },
  get: function () {
    return this._explicit(this._value);
  }
};
/***
 *
 * @type {SelectMenu|{}}
 */

SelectMenu.property.isFocus = {
  set: function (value) {
    var thisSM = this;
    if (!this.items || this.items.length === 0) value = false; //prevent focus

    if (this._isFocus === value) return;
    this._isFocus = !!value;

    if (this._isFocus) {
      document.body.appendChild(this.$selectlistBox);
      this.$selectlistBox.domSignal.$attachhook.emit('attached');
      var bound = this.getBoundingClientRect();
      this.$selectlistBox.addStyle('min-width', bound.width + 'px');
      this.$selectlistBox.refollow();
      this.$selectlistBox.updatePosition();
      setTimeout(function () {
        thisSM.$selectlistBox.focus();
        document.addEventListener('click', thisSM.eventHandler.bodyClick);
      }, 100);
      this.$selectlistBox.viewListAtFirstSelected();
    } else {
      document.removeEventListener('click', thisSM.eventHandler.bodyClick);
      this.$selectlistBox.selfRemove();
      this.$selectlistBox.unfollow();
      this.$selectlistBox.resetSearchState();
    }
  },
  get: function () {
    return this._isFocus;
  }
};
SelectMenu.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
SelectMenu.property.hidden = {
  set: function (value) {
    if (value) {
      this.addClass('as-hidden');
    } else {
      this.removeClass('as-hidden');
    }
  },
  get: function () {
    return this.addClass('as-hidden');
  }
};
SelectMenu.property.selectedIndex = {
  get: function () {
    var selectedItems = this.$selectlistBox.findItemsByValue(this._value);

    if (selectedItems.length > 0) {
      return selectedItems[0].idx;
    }

    return -1;
  }
};
SelectMenu.property.strictValue = {
  set: function (value) {
    if (value) {
      this.attr('data-strict-value', null);
    } else {
      this.attr('data-strict-value', 'false');
    }

    this.updateItem();
  },
  get: function () {
    return !this.attr('data-strict-value') || this.attr('data-strict-value') !== 'false' && this.attr('data-strict-value') !== '0';
  }
};
SelectMenu.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
/**
 * @type {SelectMenu|{}}
 */

SelectMenu.eventHandler = {};

SelectMenu.eventHandler.click = function (event) {
  if (this.readOnly) return;
  if (_EventEmitter.default.isMouseRight(event)) return;
  if (_EventEmitter.default.hitElement(this.$selectlistBox, event)) return;
  this.isFocus = !this.isFocus;
};

SelectMenu.eventHandler.bodyClick = function (event) {
  if (!_EventEmitter.default.hitElement(this, event) && !_EventEmitter.default.hitElement(this.$selectlistBox, event)) {
    setTimeout(function () {
      this.isFocus = false;
    }.bind(this), 5);
  }
};

SelectMenu.eventHandler.selectListBoxPressItem = function (event) {
  this._value = event.data.value;
  this.$selectlistBox.values = [this._value];
  this.updateItem();

  if (this._lastValue !== this.value) {
    event.lastValue = this._lastValue;
    event.value = this.value;
    setTimeout(function () {
      this.emit('change', event, this);
    }.bind(this), 1);
    this._lastValue = this.value;
  }

  setTimeout(function () {
    this.isFocus = false;
  }.bind(this), 50);
};

SelectMenu.eventHandler.preUpdateListPosition = function () {
  var bound = this.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  var availableTop = bound.top - 5;
  var availableBot = screenSize.height - 5 - bound.bottom;
  this.$selectlistBox.addStyle('--max-height', Math.max(availableBot, availableTop) + 'px');
  var outBound = (0, _Dom.traceOutBoundingClientRect)(this);

  if (bound.bottom < outBound.top || bound.top > outBound.bottom || bound.right < outBound.left || bound.left > outBound.right) {
    this.isFocus = false;
  }
};

_ACore.default.install(SelectMenu);

var _default = SelectMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectBoxItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectBoxItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function SelectBoxItem() {
  this._themeClassName = null;
  this.$text = $('.absol-selectbox-item-text', this);
  this.$close = $('.absol-selectbox-item-close', this);
  this.$close.on('click', this.eventHandler.clickClose);
  this.on('click', this.eventHandler.click);
}

;
SelectBoxItem.tag = 'SelectBoxItem'.toLowerCase();

SelectBoxItem.render = function () {
  return _({
    class: ['absol-selectbox-item'],
    extendEvent: ['close', 'press'],
    child: ['.absol-selectbox-item-text', {
      class: 'absol-selectbox-item-close',
      child: '<span class="mdi mdi-close"></span>'
    }]
  });
};

SelectBoxItem.eventHandler = {};

SelectBoxItem.eventHandler.clickClose = function (event) {
  this.emit('close', event);
};

SelectBoxItem.eventHandler.click = function (event) {
  if (!_EventEmitter.default.hitElement(this.$close, event)) {
    this.emit('press', event, this);
  }
};

SelectBoxItem.property = {};
SelectBoxItem.property.data = {
  set: function (value) {
    this._data = value;
    this.$text.clearChild();
    this.$text.addChild(_('<span>' + this.text + '</span>'));

    if (value && value.desc) {
      this.attr('title', value.desc);
    } else {
      this.attr('title', undefined);
    }

    if (this._themeClassName) this.removeClass(this._themeClassName);
    this._themeClassName = null;

    if (this.theme) {
      this._themeClassName = 'as-theme-' + this.theme;
      this.addClass(this._themeClassName);
    }
  },
  get: function () {
    return this._data;
  }
};
SelectBoxItem.property.text = {
  get: function () {
    if (typeof this._data == 'string') return this._data;else return this._data.text;
  }
};
SelectBoxItem.property.value = {
  get: function () {
    if (typeof this._data == 'string') return this._data;else return this._data.value;
  }
};
SelectBoxItem.property.theme = {
  get: function () {
    return this._data.theme || null;
  }
};
SelectBoxItem.property.active = {
  set: function (value) {
    if (value) {
      this.addClass('as-active');
    } else {
      this.removeClass('as-active');
    }
  },
  get: function () {
    return this.hasClass('as-active');
  }
};

_ACore.default.install(SelectBoxItem);

var _default = SelectBoxItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/list/listIndexing.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/list/listIndexing.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.depthIndexingByValue = depthIndexingByValue;
exports.indexingByValue = indexingByValue;

function depthIndexingByValue(items, context) {
  context = context || {
    idx: 0,
    dict: {}
  };
  return items.reduce(function (ac, cr, idx) {
    var value = typeof cr === "string" ? cr : cr.value + '';
    ac[value] = ac[value] || [];
    ac[value].push({
      idx: context.idx++,
      item: cr
    });

    if (cr && cr.items && cr.items.length > 0) {
      depthIndexingByValue(cr.items, context);
    }

    return ac;
  }, context.dict);
}

function indexingByValue(items, dict) {
  return items.reduce(function (ac, cr, idx) {
    var value = typeof cr === "string" ? cr : cr.value + '';
    ac[value] = ac[value] || [];
    ac[value].push({
      idx: idx,
      item: cr
    });
    return ac;
  }, dict || {});
}
};

moduleFactories["node_modules/absol-acomp/js/list/ListSearchFactor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/list/ListSearchFactor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = ListSearchFactor;

function ListSearchFactor(global) {
  /***
   * @typedef SelectionItem2
   * @property {String} text
   * @property {String} desc
   * @property {String} __text__
   * @property {String} __nvnText__
   * @property {Array<String>} __words__
   * @property {Array<String>} __nvnWords__
   * @property {object} __wordDict__
   * @property {object} __nvnWordDict__
   * @module SelectionItem2
   */
  function nonAccentVietnamese(s) {
    return s.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a").replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, "A").replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, "e").replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, "E").replace(/ì|í|ị|ỉ|ĩ/g, "i").replace(/Ì|Í|Ị|Ỉ|Ĩ/g, "I").replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, "o").replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, "O").replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, "u").replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, "U").replace(/ỳ|ý|ỵ|ỷ|ỹ/g, "y").replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, "Y").replace(/đ/g, "d").replace(/Đ/g, "D").replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, "").replace(/\u02C6|\u0306|\u031B/g, "");
  }

  function harmonicMean(a, b) {
    return 2 / (1 / a + 1 / b);
  }

  function wordLike(a, b) {
    var m = a.length;
    var n = b.length;

    function map(i, j) {
      return i * (n + 1) + j;
    }

    var Q = Array((m + 1) * (n + 1)).fill(0);

    for (var i = 0; i < m; ++i) for (var j = 0; j < n; ++j) if (a.charAt(i) == b.charAt(j)) {
      if (Q[map(i + 1, j + 1)]) {
        if (Q[map(i + 1, j + 1)] < Q[map(i, j)] + 1) Q[map(i + 1, j + 1)] = Q[map(i, j)] + 1;
      } else Q[map(i + 1, j + 1)] = Q[map(i, j)] + 1;
    } else Q[map(i + 1, j + 1)] = Math.max(Q[map(i + 1, j)], Q[map(i, j + 1)]);

    return Q[map(m, n)] / harmonicMean(m, n);
  }

  function wordsMatch(sq1, sq2, matchWordPow) {
    matchWordPow = matchWordPow === undefined ? 1 : matchWordPow;
    var m = sq1.length;
    var n = sq2.length;

    function map(i, j) {
      return i * (n + 1) + j;
    }

    var Q = Array((m + 1) * (n + 1)).fill(0);
    var e = 0.0;

    for (var i = 0; i < m; ++i) for (var j = 0; j < n; ++j) {
      e = Math.pow(wordLike(sq1[i], sq2[j]), matchWordPow);

      if (Q[map(i + 1, j + 1)]) {
        if (Q[map(i + 1, j + 1)] < Q[map(i, j)] + e) Q[map(i + 1, j + 1)] = Q[map(i, j)] + e;
      } else Q[map(i + 1, j + 1)] = Q[map(i, j)] + e;

      e = Math.max(Q[map(i + 1, j)], Q[map(i, j + 1)]);
      if (e > Q[map(i + 1, j + 1)]) Q[map(i + 1, j + 1)] = e;
    }

    return Q[map(m, n)];
  }

  var EXTRA_MATCH_SCORE = 9;
  var NVN_EXTRA_MATCH_SCORE = 8;
  var EQUAL_MATCH_SCORE = 10;
  var WORD_MATCH_SCORE = 3;
  var HAS_WORD_SCORE = 30;
  var HAS_NVN_WORD_SCORE = 29;
  /***
   *
   * @param {SelectionItem2} item
   * @returns {*}
   */

  function prepareSearchForItem(item) {
    if (!item.text || !item.text.charAt) item.text = item.text + '';
    var spliter = /[\s/]+/;

    var __text__ = item.text.replace(/([\s\b\-()\[\]"']|&#8239;|&nbsp;|&#xA0;|\s")+/g, ' ').trim().toLowerCase();

    var __nvnText__ = nonAccentVietnamese(__text__);

    item.__words__ = __text__.split(spliter);
    item.__text__ = item.__words__.join(' ');

    item.__words__.sort();

    item.__wordDict__ = item.__words__.reduce((ac, cr, i) => {
      ac[cr] = i + 1;
      return ac;
    }, {});
    item.__nvnWords__ = __nvnText__.split(spliter);
    item.__nvnText__ = item.__nvnWords__.join(' ');

    item.__nvnWords__.sort();

    item.__nvnWordDict__ = item.__nvnWords__.reduce((ac, cr, i) => {
      ac[cr] = i + 1;
      return ac;
    }, {});
    return item;
  }

  function calcItemMatchScore(queryItem, item) {
    var score = 0;
    if (!item.__text__) return 0;
    var hwScore = 0;
    var i;

    for (i = 0; i < queryItem.__words__.length; ++i) {
      if (item.__wordDict__[queryItem.__words__[i]]) {
        hwScore += HAS_WORD_SCORE;
      } else if (item.__nvnWordDict__[queryItem.__nvnWords__[i]]) {
        hwScore += HAS_NVN_WORD_SCORE;
      }
    }

    score = hwScore;

    if (item.__text__ === queryItem.__text__) {
      score += EQUAL_MATCH_SCORE;
    }

    var extraIndex = item.__text__.indexOf(queryItem.__text__);

    if (extraIndex >= 0) {
      score += EXTRA_MATCH_SCORE;
    }

    extraIndex = item.__nvnText__.indexOf(queryItem.__nvnText__);

    if (extraIndex >= 0) {
      score += EXTRA_MATCH_SCORE;
    }

    var n = Math.max(queryItem.__words__.length + 1, 1);
    score = Math.max(score, wordsMatch(queryItem.__words__, item.__words__) / n * 2 * WORD_MATCH_SCORE, wordsMatch(queryItem.__nvnWords__, item.__nvnWords__) / n * 2 * WORD_MATCH_SCORE);
    return score;
  }

  function scoreCmp(a, b) {
    if (b.score === a.score) {
      if (b.item.__nvnText__ > a.item.__nvnText__) return -1;
      return 1;
    }

    return b.score - a.score;
  }

  function keyStringOf(o) {
    var type = typeof o;
    var keys;

    if (o && type === "object") {
      if (o.getTime) {
        return 'd(' + o.getTime() + ')';
      } else if (o.length && o.map) {
        return 'a(' + o.map(val => keyStringOf(val)).join(',') + ')';
      } else {
        keys = Object.keys(o);
        keys.sort();
        return 'o(' + keys.map(key => key + ':' + keyStringOf(o[key])).join(',') + ')';
      }
    } else {
      return type[0] + '(' + o + ')';
    }
  }

  function matchFilter(item, filter) {
    if (!filter) return true;
    var keys = item.keys;
    if (!keys) return false;

    for (var i in filter) {
      if (!keyCmp(keys[i], filter[i])) return false;
    }

    return true;
  }

  function toComparable(x) {
    if (!x) return x;
    var type = typeof x;
    if (type === 'string') return x;
    if (type === "number") return x;
    if (type === "boolean") return x;
    if (type.getTime) return type.getTime();
    return x;
  }

  function keyCmp(itemKey, filterKey) {
    if (itemKey === filterKey) return true;
    if (!itemKey !== !filterKey) return false;
    if (!itemKey || !filterKey) return false;
    var filterKeyString = keyStringOf(filterKey);

    function withFilter(x) {
      var xString = keyStringOf(x);
      var res = xString === filterKeyString;

      if (!res && typeof filterKey === "object") {
        if (filterKey.some) {
          res = filterKey.some(function (y) {
            return keyStringOf(y) === x;
          });
        } else if ('min' in filterKey || 'max' in filterKey) {
          res = true;

          if ('min' in filterKey) {
            res = res && toComparable(x) >= toComparable(filterKey.min);
          }

          if ('max' in filterKey) {
            res = res && toComparable(x) <= toComparable(filterKey.max);
          }
        }
      }

      return res;
    }

    if (itemKey.some) {
      return itemKey.some(withFilter);
    } else return withFilter(itemKey);
  }

  function Slave() {
    this.items = [];
  }

  Slave.prototype.processItems = function (items) {
    this.items = items;
    this.items.forEach(function visit(item) {
      prepareSearchForItem(item);
      if (item.items) item.items.forEach(visit);
    });
  };

  Slave.prototype.callQuery = function (query) {
    prepareSearchForItem(query);
    var minScore = Infinity;
    var maxScore = -Infinity;
    var scoreHolders = this.items.map(function visit(item) {
      var res = {};
      res.score = calcItemMatchScore(query, item);
      res.value = item.value;
      res.maxChildScore = -Infinity;

      if (item.items) {
        res.child = item.items.map(visit);
        res.maxChildScore = res.child.reduce((ac, cr) => Math.max(ac, cr.maxChildScore, cr.score), res.maxChildScore);
      }

      minScore = Math.min(minScore, res.score);
      maxScore = Math.max(maxScore, res.score);
      return res;
    });
    var threshold = maxScore - (maxScore - minScore) / 4;
    if (maxScore < 3) threshold = maxScore - (maxScore - minScore) / 8;
    var resDict = scoreHolders.reduce(function rValue(ac, cr) {
      if (Math.max(cr.maxChildScore, cr.score) >= threshold) ac[cr.value] = [cr.score, cr.maxChildScore];
      if (cr.child) cr.child.reduce(rValue, ac);
      return ac;
    }, {});
    return resDict;
  };

  var slaves = {};

  global.transferSearchItems = function (id, items) {
    if (!slaves[id]) slaves[id] = new Slave();
    slaves[id].processItems(items);
  };

  global.callQuery = function (id, query) {
    if (slaves[id]) return slaves[id].callQuery(query);
    return null;
  };

  global.destroySlave = function (id) {
    delete slaves[id];
  };
}
};

moduleFactories["node_modules/absol-acomp/js/list/ListSearchMaster.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/list/ListSearchMaster.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _stringGenerate = require("absol/src/String/stringGenerate");

var _Thread = _interopRequireDefault(require("absol/src/Network/Thread"));

var _ListSearchFactor = _interopRequireDefault(require("./ListSearchFactor"));

var _utils = require("../utils");


function ListSearchMaster() {
  this.prepare();
  this.id = (0, _stringGenerate.randomIdent)(8);
  this.cache = {};
}

ListSearchMaster.prototype.share = {
  worker: null
};

ListSearchMaster.prototype.prepare = function () {
  if (this.share.worker) return;
  this.share.worker = new _Thread.default({
    methods: {
      init: _ListSearchFactor.default
    },
    extendCode: 'init(this)'
  });
};

ListSearchMaster.prototype.transfer = function (items) {
  this.cache = {};
  return this.share.worker.invoke('transferSearchItems', this.id, items);
};

ListSearchMaster.prototype.query = function (query) {
  var key = (0, _utils.calcDTQueryHash)(query);

  if (!this.cache[key]) {
    this.cache[key] = this.share.worker.invoke('callQuery', this.id, query);
  }

  return this.cache[key];
};

ListSearchMaster.prototype.destroy = function () {
  this.share.worker.invoke('destroySlave', this.id);
};

var _default = ListSearchMaster;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectListBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectListBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.VALUE_NORMAL = exports.VALUE_HIDDEN = void 0;

require("../css/selectlistbox.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _SelectList = require("./SelectList");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _Dom = require("absol/src/HTML5/Dom");

var _listIndexing = require("./list/listIndexing");

var _utils = require("./utils");

var _ListSearchMaster = _interopRequireDefault(require("./list/ListSearchMaster"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var $$ = _ACore.default.$$;
var VALUE_HIDDEN = -1;
exports.VALUE_HIDDEN = VALUE_HIDDEN;
var VALUE_NORMAL = 1;
/***
 * @extends Follower
 * @constructor
 */

exports.VALUE_NORMAL = VALUE_NORMAL;

function SelectListBox() {
  this._initDomHook();

  this._initControl();

  this._initScroller();

  this._initProperty();
  /***
   * @name strictValue
   * @type {boolean}
   * @memberOf SelectListBox#
   */

  /***
   * @name enableSearch
   * @type {boolean}
   * @memberOf SelectListBox#
   */

}

SelectListBox.tag = 'SelectListBox'.toLowerCase();

SelectListBox.render = function () {
  return _({
    tag: 'follower',
    attr: {
      tabindex: 0
    },
    class: 'as-select-list-box',
    extendEvent: ['pressitem'],
    child: [{
      class: 'as-select-list-box-search-ctn',
      child: 'searchtextinput'
    }, {
      class: ['as-bscroller', 'as-select-list-box-scroller'],
      child: [{
        class: ['as-select-list-box-content'],
        child: Array(SelectListBox.prototype.preLoadN).fill('.as-select-list-box-page')
      }]
    }, 'attachhook.as-dom-signal'],
    props: {
      anchor: [1, 6, 2, 5]
    }
  });
};

SelectListBox.prototype.toLoadNextY = 200;
SelectListBox.prototype.preLoadN = 3;
SelectListBox.prototype.itemHeightMode = [20, 30];
SelectListBox.prototype.itemHeight = 20;

SelectListBox.prototype._initDomHook = function () {
  this.$domSignal = $('attachhook.as-dom-signal', this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('viewListAt', this.viewListAt.bind(this));
  this.domSignal.on('viewListAtFirstSelected', this.viewListAtFirstSelected.bind(this));
  this.domSignal.on('viewListAtCurrentScrollTop', this.viewListAtCurrentScrollTop.bind(this));
  this.searchMaster = new _ListSearchMaster.default();
};

SelectListBox.prototype._initControl = function () {
  this._currentOffset = 0;
  this._startItemIdx = 0;
  this.$searchInput = $('searchtextinput', this).on('stoptyping', this.eventHandler.searchModify);
};

SelectListBox.prototype._initScroller = function () {
  this.$content = $('.as-select-list-box-content', this);
  this._estimateHeight = 0;
  this._pageOffsets = Array(this.preLoadN + 1).fill(0);
  this.$listPages = $$('.as-select-list-box-page', this);
  this.$listScroller = $('.as-select-list-box-scroller', this).on('scroll', this.eventHandler.scroll);
};

SelectListBox.prototype._initProperty = function () {
  /***
   *   items  =(search, filler)=> filteredItems =(list to list, tree to list)=>  preDisplayItems =(remove hidden item)=> displayItem
   *
   */
  this._items = [];
  this._itemNodeList = []; // use for tree

  this._values = [];
  this._valueDict = {};
  this._itemNodeHolderByValue = {}; // this._filteredItems = [];// not need , only use when search

  this._preDisplayItems = [];
  this._displayItems = [];
  this._searchCache = {};
  this._displayValue = VALUE_NORMAL;
  this.displayValue = VALUE_NORMAL;
  this.items = [];
};

SelectListBox.prototype._requireItem = function (pageElt, n) {
  var itemElt;

  while (pageElt.childNodes.length > n) {
    itemElt = pageElt.lastChild;
    itemElt.selfRemove();
    (0, _SelectList.releaseItem)(itemElt);
  }

  while (pageElt.childNodes.length < n) {
    itemElt = (0, _SelectList.requireItem)(this);
    pageElt.addChild(itemElt);
  }
};

SelectListBox.prototype._assignItems = function (pageElt, offset) {
  var n = Math.min(this._displayItems.length - offset, pageElt.childNodes.length);
  var itemElt, value;

  for (var i = 0; i < n; ++i) {
    itemElt = pageElt.childNodes[i];
    itemElt.data = this._displayItems[offset + i];
    value = itemElt.value + '';
  }
};

SelectListBox.prototype._itemsToNodeList = function (items) {
  return items;
};
/***
 *
 * @param {Array<{value:String|Number}>} items
 * @return {Array<{value:String|Number}>}
 */


SelectListBox.prototype._filterDisplayItems = function (items) {
  if (this._displayValue === VALUE_NORMAL) return items;
  var dict = this._valueDict;
  return items.filter(function (item) {
    return !dict[item.value + ''];
  });
};

SelectListBox.prototype._updateSelectedItem = function () {
  var valueDict = this._valueDict;
  this.$listPages.forEach(function (pageElt) {
    Array.prototype.forEach.call(pageElt.childNodes, function (itemElt) {
      var value = itemElt.value + '';

      if (valueDict[value]) {
        itemElt.selected = true;
      } else {
        itemElt.selected = false;
      }
    });
  });
};
/***
 *
 * @param {number} offset
 */


SelectListBox.prototype.viewListAt = function (offset) {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('viewListAt', offset);
    return;
  }

  var fontSize = this.$listScroller.getFontSize() || 14;
  offset = Math.max(0, Math.min(offset, this._displayItems.length - 1));
  var screenSize = (0, _Dom.getScreenSize)();
  var maxItem = Math.ceil(Math.max(window.screen.height, screenSize.height) / this.itemHeight);
  var contentBound = this.$content.getBoundingClientRect();
  this._pageOffsets[0] = Math.max(offset - maxItem, 0);

  for (var i = 1; i <= this.preLoadN; ++i) {
    this._pageOffsets[i] = Math.min(this._pageOffsets[i - 1] + maxItem, this._displayItems.length);
  }

  var sIdx, nItem, pageBound;
  var pageElt;

  for (var pageIndex = 0; pageIndex < this.preLoadN; ++pageIndex) {
    sIdx = this._pageOffsets[pageIndex];
    nItem = this._pageOffsets[pageIndex + 1] - sIdx;
    pageElt = this.$listPages[pageIndex];
    pageElt.addStyle('top', this._pageOffsets[pageIndex] * this.itemHeight / 14 + 'em');

    this._requireItem(pageElt, nItem);

    this._assignItems(pageElt, sIdx);

    pageBound = pageElt.getBoundingClientRect();
  }

  this._updateSelectedItem();
};

SelectListBox.prototype.viewListAtFirstSelected = function () {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('viewListAtFirstSelected');
    return;
  }

  if (this._displayValue == VALUE_HIDDEN) {
    return false;
  } else if (this._values.length > 0) {
    var value = this._values[0];
    var itemHolders = this._displayItemHolderByValue[value + ''];

    if (itemHolders) {
      this.domSignal.once('scrollIntoSelected', function () {
        var holder = itemHolders[0];
        this.viewListAt(holder.idx);
        var itemElt = $('.as-selected', this.$listScroller);

        if (itemElt) {
          var scrollBound = this.$listScroller.getBoundingClientRect();
          var itemBound = itemElt.getBoundingClientRect();
          this.$listScroller.scrollTop += itemBound.top - scrollBound.top;
        }
      }.bind(this));
      this.domSignal.emit('scrollIntoSelected');
      return true;
    } else return false;
  } else return false;
};

SelectListBox.prototype.viewListAtCurrentScrollTop = function () {
  if (!this.isDescendantOf(document.body)) {
    this.emit('viewListAtCurrentScrollTop');
    return;
  }

  this.viewListAt(Math.floor(this.$listScroller.scrollTop / this.itemHeight));
};

SelectListBox.prototype.searchItemByText = function (text) {
  text = text.trim().replace(/\s\s+/, ' ');
  if (text.length === 0) return Promise.resolve(this._items);
  this._searchCache[text] = this._searchCache[text] || this.searchMaster.query({
    text: text
  }).then(searchResult => {
    if (!searchResult) return;

    var scoreOf = it => {
      var idx = this.key2idx[it.valueKey];
      var sc = searchResult[idx];
      if (!sc) return -Infinity;
      return Math.max(sc[0], sc[1]) * 1000000 - idx;
    };

    var makeList = originItems => {
      var items = originItems.filter(it => {
        var idx = this.key2idx[it.valueKey];
        if (searchResult[idx]) return true;
        return false;
      }).map(it => {
        var cpItem = Object.assign({}, it);
        if (it.items) cpItem.items = makeList(it.items);
        return cpItem;
      });
      items.sort((a, b) => scoreOf(b) - scoreOf(a));
      return items;
    };

    return makeList(this._items);
  });
  return this._searchCache[text];
};

SelectListBox.prototype.resetSearchState = function () {
  this.$searchInput.value = '';
  this._preDisplayItems = this._itemsToNodeList(this._items);

  this._updateDisplayItem();

  this.domSignal.emit('viewListAt', 0);
  this.$listScroller.scrollTop = 0;
};

SelectListBox.prototype.notifyPressOut = function () {
  this.emit('pressout', {
    target: this,
    type: 'pressout'
  }, this);
};

SelectListBox.prototype.notifyPressClose = function () {
  this.emit('pressclose', {
    target: this,
    type: 'pressclose'
  }, this);
};

SelectListBox.prototype._findFirstPageIdx = function () {
  for (var i = 0; i < this.preLoadN; ++i) {
    if (this._pageOffsets[i + 1] - this._pageOffsets[i] > 0) {
      return i;
    }
  }

  return -1;
};

SelectListBox.prototype._findLastPageIdx = function () {
  for (var i = this.preLoadN - 1; i >= 0; --i) {
    if (this._pageOffsets[i + 1] - this._pageOffsets[i] > 0) {
      return i;
    }
  }

  return -1;
};

SelectListBox.prototype._updateDisplayItemIndex = function () {
  this._displayItemHolderByValue = (0, _listIndexing.indexingByValue)(this._displayItems, {});
};

SelectListBox.prototype._updateItemNodeIndex = function () {
  this._itemNodeHolderByValue = (0, _listIndexing.depthIndexingByValue)(this._items);
};

SelectListBox.prototype._updateDisplayItem = function () {
  this._displayItems = this._filterDisplayItems(this._preDisplayItems);

  this._updateDisplayItemIndex();

  this.$content.addStyle({
    'height': this._displayItems.length * this.itemHeight / 14 + 'em'
  });
};

SelectListBox.prototype.focus = function () {
  if (this.enableSearch) this.$searchInput.focus();
};

SelectListBox.prototype.footerMinWidth = 0;

SelectListBox.prototype._updateItems = function () {
  this._hasIcon = this._items.some(function hasIcon(it) {
    var res = !!it.icon;

    if (!res && it.items) {
      res = it.items.some(hasIcon);
    }

    return res;
  });

  if (this._hasIcon) {
    this.itemHeight = this.itemHeightMode[1];
  } else {
    this.itemHeight = this.itemHeightMode[0];
  }

  this._preDisplayItems = this._itemsToNodeList(this._items);
  this._searchCache = {};
  var estimateSize = (0, _SelectList.measureListSize)(this._itemNodeList);
  this._estimateSize = estimateSize;
  this._estimateWidth = estimateSize.width;
  this._estimateDescWidth = estimateSize.descWidth;

  if (this._hasIcon) {
    this._estimateWidth += 32;
    this.addClass('as-has-icon');
  } else {
    this.removeClass('as-has-icon');
  }

  this.addStyle('--select-list-estimate-width', Math.max(this.footerMinWidth, this._estimateWidth) / 14 + 'em');
  this.addStyle('--select-list-desc-width', this._estimateDescWidth / 14 + 'em');

  this._updateDisplayItem();

  this.idx2key = [];

  var makeSearchItem = it => {
    var res = {
      value: this.idx2key.length
    };
    var valueKey;
    res.text = it.text + '';
    if (it.desc) res.text += it.desc;
    valueKey = (0, _utils.keyStringOf)(it.value);
    it.valueKey = valueKey;
    this.idx2key.push(valueKey);

    if (it.items && it.items.length > 0 && it.items.map) {
      res.items = it.items.map(makeSearchItem);
    }

    return res;
  };

  this.searchingItems = this._items.map(makeSearchItem);
  this.key2idx = this.idx2key.reduce((ac, cr, i) => {
    ac[cr] = i;
    return ac;
  }, {});
  this.searchMaster.transfer(this.searchingItems);
};
/***
 *
 * @param value
 * @returns {{idx: number, item:{text:string, value:number|string}}[]}
 */


SelectListBox.prototype.findDisplayItemsByValue = function (value) {
  return (this._displayItemHolderByValue[value] || []).slice();
};

SelectListBox.prototype._implicit = function (values) {
  if (!(values instanceof Array)) {
    if (values === null || values === undefined) values = [];else values = [values];
  }

  return values.reduce(function (ac, cr) {
    if (!ac.dict[cr]) {
      ac.dict[cr] = true;
      ac.result.push(cr);
    }

    return ac;
  }, {
    result: [],
    dict: {}
  }).result;
};

SelectListBox.prototype._explicit = function (values) {
  if (this.strictValue) {
    return values.filter(function (value) {
      return !!this._itemNodeHolderByValue[value];
    }.bind(this));
  } else {
    return values.slice();
  }
};
/***
 *
 * @param value
 * @returns {{idx: number, item:{text:string, value:number|string}}[]}
 */


SelectListBox.prototype.findItemsByValue = function (value) {
  return (this._itemNodeHolderByValue[value] || []).slice();
};

SelectListBox.property = {};
/***
 *
 * @type {SelectListBox|{}}
 */

SelectListBox.property.items = {
  set: function (items) {
    items = items || [];
    if (!(items instanceof Array)) items = [];
    items = (0, _utils.copySelectionItemArray)(items, {
      removeNoView: true
    });
    this._items = items;
    this._itemNodeList = this._itemsToNodeList(this._items);

    this._updateItemNodeIndex();

    this._updateItems();

    this.viewListAt(0);
  },
  get: function () {
    return this._items;
  }
};
SelectListBox.property.values = {
  set: function (values) {
    values = this._implicit(values);
    this._values = values;
    this._valueDict = values.reduce(function (ac, cr) {
      ac[cr + ''] = true;
      return ac;
    }, {});

    this._updateDisplayItem();

    this.viewListAtCurrentScrollTop();
    if (this._pageOffsets[this.preLoadN] > this._pageOffsets[0]) this._updateSelectedItem();
  },
  get: function () {
    return this._explicit(this._values);
  }
};
SelectListBox.property.strictValue = {
  set: function (value) {
    if (value) {
      this.addClass('as-strict-value');
    } else {
      this.removeClass('as-strict-value');
    }
  },
  get: function () {
    return this.hasClass('as-strict-value');
  }
};
SelectListBox.property.displayValue = {
  set: function (value) {
    this._displayValue = value;
    this._displayItems = this._filterDisplayItems(this._preDisplayItems);

    this._updateItemNodeIndex();

    if (value === VALUE_HIDDEN) {
      this.addClass('as-value-hidden');
    } else {
      this.removeClass('as-value-hidden');
    }
  },
  get: function () {
    return this._displayValue;
  }
};
SelectListBox.property.enableSearch = {
  set: function (value) {
    if (value) this.addClass('as-enable-search');else this.removeClass('as-enable-search');
  },
  get: function () {
    return this.hasClass('as-enable-search');
  }
};
/***
 *
 * @type {SelectListBox|{}}
 */

SelectListBox.eventHandler = {};
/*
*
* @param {MouseEvent} event
*/

SelectListBox.eventHandler.click = function (event) {
  if (event.target === this) this.notifyPressOut();
};
/***
 * @this SelectListBox
 */


SelectListBox.eventHandler.searchModify = function () {
  var text = this.$searchInput.value;
  var searchSession = Math.random() + '';
  this._searchSession = searchSession;
  this.searchItemByText(text).then(searchedItems => {
    if (searchSession !== this._searchSession) return;
    this._preDisplayItems = this._itemsToNodeList(searchedItems);
    this._displayItems = this._filterDisplayItems(this._preDisplayItems);
    this.$content.addStyle({
      'height': this._displayItems.length * this.itemHeight / 14 + 'em'
    });

    this._updateItemNodeIndex();

    this.viewListAt(0);
    this.$listScroller.scrollTop = 0;
    this.updatePosition();
  });
};

SelectListBox.eventHandler.scroll = function () {
  var itemHeight = this.itemHeight * $(document.body).getFontSize() / 14;
  var scrollerBound = this.$listScroller.getBoundingClientRect();

  var topIdx = this._findFirstPageIdx();

  if (!this.$listPages[topIdx]) return;
  var screenSize = (0, _Dom.getScreenSize)();
  var maxItem = Math.ceil(Math.max(window.screen.height, screenSize.height) / itemHeight);
  var topBound = this.$listPages[topIdx].getBoundingClientRect();

  var botIdx = this._findLastPageIdx();

  if (!this.$listPages[botIdx]) return;
  var botBound;
  botBound = this.$listPages[botIdx].getBoundingClientRect();

  if (topBound.top > scrollerBound.top || topBound.bottom < scrollerBound.bottom) {
    this.viewListAt(Math.floor(this.$listScroller.scrollTop / itemHeight));
    return;
  }

  if (this._pageOffsets[topIdx] > 0) {
    if (topBound.top + this.toLoadNextY > scrollerBound.top) {
      this._pageOffsets.unshift(this._pageOffsets.pop());

      this.$listPages.unshift(this.$listPages.pop());
      this._pageOffsets[topIdx] = Math.max(0, this._pageOffsets[topIdx + 1] - maxItem);

      this._requireItem(this.$listPages[topIdx], this._pageOffsets[topIdx + 1] - this._pageOffsets[topIdx]);

      this._assignItems(this.$listPages[topIdx], this._pageOffsets[topIdx]);

      this._updateSelectedItem();

      this.$listPages[topIdx].addStyle('top', this._pageOffsets[topIdx] * itemHeight + 'px');
    }
  }

  if (this._pageOffsets[botIdx + 1] < this._displayItems.length) {
    if (botBound.bottom - this.toLoadNextY < scrollerBound.bottom) {
      this._pageOffsets.push(this._pageOffsets.shift());

      this.$listPages.push(this.$listPages.shift());
      this._pageOffsets[botIdx + 1] = Math.min(this._displayItems.length, this._pageOffsets[botIdx] + maxItem);
      this.$listPages[botIdx].addStyle('top', this._pageOffsets[botIdx] * itemHeight + 'px');

      this._requireItem(this.$listPages[botIdx], this._pageOffsets[botIdx + 1] - this._pageOffsets[botIdx]);

      this._assignItems(this.$listPages[botIdx], this._pageOffsets[botIdx]);

      this._updateSelectedItem();
    }
  }
};

_ACore.default.install(SelectListBox);

var _default = SelectListBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.requireItem = requireItem;
exports.releaseItem = releaseItem;
exports.default = void 0;

require("../css/selectbox.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _SelectMenu = _interopRequireDefault(require("./SelectMenu2"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _PositionTracker = _interopRequireDefault(require("./PositionTracker"));

var _SelectBoxItem = _interopRequireDefault(require("./SelectBoxItem"));

var _SelectListBox = require("./SelectListBox");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function pressCloseEventHandler(event) {
  var parentElt = this.$parent;
  if (!parentElt) return;
  parentElt.eventHandler.pressCloseItem(this, event);
}

function pressHandler(event) {
  var parentElt = this.$parent;
  if (!parentElt) return;
  parentElt.eventHandler.pressItem(this, event);
}
/***
 *
 * @returns {SelectBoxItem}
 */


function makeItem() {
  return _({
    tag: 'selectboxitem',
    on: {
      close: pressCloseEventHandler,
      press: pressHandler
    }
  });
}

var itemPool = [];

function requireItem($parent) {
  var item;

  if (itemPool.length > 0) {
    item = itemPool.pop();
  } else {
    item = makeItem();
  }

  item.$parent = $parent;
  return item;
}

function releaseItem(item) {
  item.$parent = null;
  itemPool.push(item);
}
/***
 * @extends PositionTracker
 * @return {SelectBox}
 * @constructor
 */


function SelectBox() {
  this.on('click', this.eventHandler.click);
  this.$selectlistBox = _({
    tag: 'selectlistbox',
    props: {
      anchor: [1, 6, 2, 5],
      displayValue: _SelectListBox.VALUE_HIDDEN
    },
    on: {
      preupdateposition: this.eventHandler.preUpdateListPosition,
      pressitem: this.eventHandler.selectListBoxPressItem
    }
  });

  _OOP.default.drillProperty(this, this.$selectlistBox, 'enableSearch');

  this.$items = [];
  this._values = [];
  this.items = [];
  this.values = [];
  this.$selectlistBox.followTarget = this;
  this.disableClickToFocus = false;
  this.orderly = true;
  this.itemFocusable = false;
  this._activeValue = undefined;
  return this;
}

SelectBox.tag = 'selectbox';

SelectBox.render = function () {
  return _({
    tag: 'bscroller',
    class: ['absol-selectbox', 'absol-bscroller'],
    extendEvent: ['change', 'add', 'remove', 'activevaluechange'],
    attr: {
      tabindex: '1'
    }
  }, true);
};

SelectBox.prototype._requireItem = function (n) {
  var itemElt;

  while (this.$items.length < n) {
    itemElt = requireItem(this);
    this.addChild(itemElt);
    this.$items.push(itemElt);
  }

  while (this.$items.length > n) {
    itemElt = this.$items.pop();
    this.removeChild(itemElt);
    releaseItem(itemElt);
  }
};

SelectBox.prototype._assignItems = function (items) {
  for (var i = 0; i < this.$items.length && i < items.length; ++i) {
    this.$items[i].data = items[i];
  }
};
/***
 *
 * @param {string[] | number[]} values
 * @private
 */


SelectBox.prototype._getItemsByValues = function (values) {
  var selectListBoxElt = this.$selectlistBox;
  var itemHolders = values.reduce(function (ac, cr) {
    ac.push.apply(ac, selectListBoxElt.findItemsByValue(cr));
    return ac;
  }, []);

  if (this.orderly) {
    itemHolders.sort(function (a, b) {
      return a.idx - b.idx;
    });
  }

  return itemHolders.map(function (holder) {
    return holder.item;
  });
};

SelectBox.prototype._updateItems = function () {
  this.viewItemsByValues(this._values);
};

SelectBox.prototype.viewItemsByValues = function (values) {
  var items = this._getItemsByValues(values);

  var cBound = this.getBoundingClientRect();

  this._requireItem(items.length);

  this._assignItems(items);

  if (this.itemFocusable) {
    this._updateFocusItem();
  }

  var nBound = this.getBoundingClientRect();

  if (nBound.width != cBound.width || nBound.height != cBound.height) {
    _ResizeSystem.default.updateUp(this);
  }
};

SelectBox.property = {};
SelectBox.property.disabled = _SelectMenu.default.property.disabled;
SelectBox.property.hidden = _SelectMenu.default.property.hidden;
SelectBox.property.isFocus = _SelectMenu.default.property.isFocus;

SelectBox.prototype.init = function (props) {
  props = props || [];
  Object.keys(props).forEach(function (key) {
    if (props[key] === undefined) delete props[key];
  });
  this.super(props);
};

SelectBox.prototype._updateFocusItem = function () {
  for (var i = 0; i < this.$items.length; ++i) {
    this.$items[i].active = this.$items[i].value == this._activeValue;
  }
};

SelectBox.prototype.init = _SelectMenu.default.prototype.init;
SelectBox.property.items = {
  set: function (items) {
    items = items || [];
    this.$selectlistBox.items = items;
    this.addStyle('--list-min-width', this.$selectlistBox._estimateWidth + 'px');

    this._updateItems();
  },
  get: function () {
    return this.$selectlistBox.items;
  }
};
SelectBox.property.values = {
  set: function (values) {
    values = values || [];
    values = values instanceof Array ? values : [values];
    this._values = values;
    this.$selectlistBox.values = values;

    this._updateItems();
  },
  get: function () {
    return this._values || [];
  }
};
SelectBox.property.orderly = {
  set: function (value) {
    var needUpdate = this._orderly === this._orderly;

    if (typeof value === 'function') {
      this._orderly;
    } else this._orderly = !!value;

    if (needUpdate) {
      this.values = this.values;
    }
  },
  get: function () {
    return !!this._orderly;
  }
};
SelectBox.property.disableClickToFocus = {
  set: function (value) {
    if (value) {
      this.addClass('as-disable-click-to-focus');
    } else {
      this.removeClass('as-disable-click-to-focus');
    }
  },
  get: function () {
    return this.hasClass('as-disable-click-to-focus');
  }
};
SelectBox.property.itemFocusable = {
  set: function (value) {
    if (value) {
      this.addClass('as-item-focusable');
    } else {
      this.removeClass('as-item-focusable');
    }

    this._updateFocusItem();
  },
  get: function () {
    return this.hasClass('as-item-focusable');
  }
};
SelectBox.property.activeValue = {
  set: function (value) {
    this._activeValue = value;

    if (this.itemFocusable) {
      this._updateFocusItem(); //todo

    }
  },
  get: function () {
    return this._activeValue;
  }
};
SelectBox.eventHandler = Object.assign({}, _SelectMenu.default.eventHandler);

SelectBox.eventHandler.click = function (event) {
  if (event.target === this && !this.disableClickToFocus) {
    this.isFocus = !this.isFocus;
  }
};

SelectBox.eventHandler.bodyClick = function (event) {
  if (!_EventEmitter.default.hitElement(this.$selectlistBox, event) && event.target !== this) {
    this.isFocus = false;
  }
};

SelectBox.eventHandler.selectListBoxPressItem = function (event) {
  var data = event.data;
  var currentValues = this.$selectlistBox.values;
  currentValues.push(data.value);
  this.$selectlistBox.values = currentValues;
  this.$selectlistBox.updatePosition();
  this._activeValue = data.value;

  this._updateItems();

  this.isFocus = false;
  this.emit('add', Object.assign({}, event, {
    type: 'add',
    target: this,
    value: data.value,
    data: data,
    itemData: data
  }), this);
  this.emit('change', Object.assign({}, event, {
    type: 'change',
    action: 'add',
    target: this,
    value: data.value,
    data: data,
    values: this.values
  }), this);
};

SelectBox.eventHandler.pressCloseItem = function (item, event) {
  var value = item.value;
  var data = item.data;
  var currentValues = this.$selectlistBox.values;
  var index = currentValues.indexOf(value);

  if (index >= 0) {
    currentValues.splice(index, 1);
  }

  this.$selectlistBox.values = currentValues;
  this.$selectlistBox.updatePosition();
  this._values = currentValues;

  this._updateItems();

  this.emit('remove', Object.assign({}, event, {
    type: 'change',
    target: this,
    data: data,
    value: value,
    itemData: data
  }), this);
  this.emit('change', Object.assign({}, event, {
    type: 'change',
    action: 'remove',
    target: this,
    data: data,
    value: value,
    itemData: data
  }), this);
};

SelectBox.eventHandler.pressItem = function (item, event) {
  var value = item.value;

  if (this.itemFocusable) {
    var prevActiveValue = this.activeValue;

    if (value !== prevActiveValue) {
      this.activeValue = value;
      this.emit('activevaluechange', {
        target: this,
        originEvent: event,
        prevActiveValue: prevActiveValue,
        activeValue: value
      }, this);
    }
  }
};

SelectBox.eventHandler.pressCloseItem = function (item, event) {
  var value = item.value;
  var data = item.data;
  var index;
  index = this._values.indexOf(value);

  if (index >= 0) {
    this._values.splice(index, 1);

    this._updateItems();

    this.$selectlistBox.values = this._values;
    this.emit('remove', Object.assign({}, event, {
      type: 'change',
      target: this,
      data: data,
      value: value,
      itemData: data
    }), this);
    this.emit('change', Object.assign({}, event, {
      type: 'change',
      action: 'remove',
      target: this,
      data: data,
      value: value,
      itemData: data
    }), this);
  }
};

_ACore.default.install(SelectBox);

var _default = SelectBox;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/String/stringMatching.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/String/stringMatching.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.wordLike = wordLike;
exports.wordsMatch = wordsMatch;
exports.phraseMatch = phraseMatch;
exports.phraseLike = phraseLike;

var _int = require("absol/src/Math/int");

/**
 *
 * @param {String} a
 * @param {String} b
 */
function wordLike(a, b) {
  var m = a.length;
  var n = b.length;

  function map(i, j) {
    return i * (n + 1) + j;
  }

  var Q = Array((m + 1) * (n + 1)).fill(0);

  for (var i = 0; i < m; ++i) for (var j = 0; j < n; ++j) if (a.charAt(i) == b.charAt(j)) {
    if (Q[map(i + 1, j + 1)]) {
      if (Q[map(i + 1, j + 1)] < Q[map(i, j)] + 1) Q[map(i + 1, j + 1)] = Q[map(i, j)] + 1;
    } else Q[map(i + 1, j + 1)] = Q[map(i, j)] + 1;
  } else Q[map(i + 1, j + 1)] = Math.max(Q[map(i + 1, j)], Q[map(i, j + 1)]);

  return Q[map(m, n)] / (0, _int.harmonicMean)(m, n);
}
/**
 *
 * @param {Array<String>} sq1
 * @param {Array<String>} sq2
 */


function wordsMatch(sq1, sq2, matchWordPow) {
  matchWordPow = matchWordPow === undefined ? 1 : matchWordPow;
  var m = sq1.length;
  var n = sq2.length;

  function map(i, j) {
    return i * (n + 1) + j;
  }

  var Q = Array((m + 1) * (n + 1)).fill(0);
  var e = 0.0;

  for (var i = 0; i < m; ++i) for (var j = 0; j < n; ++j) {
    e = Math.pow(wordLike(sq1[i], sq2[j]), matchWordPow);

    if (Q[map(i + 1, j + 1)]) {
      if (Q[map(i + 1, j + 1)] < Q[map(i, j)] + e) Q[map(i + 1, j + 1)] = Q[map(i, j)] + e;
    } else Q[map(i + 1, j + 1)] = Q[map(i, j)] + e;

    e = Math.max(Q[map(i + 1, j)], Q[map(i, j + 1)]);
    if (e > Q[map(i + 1, j + 1)]) Q[map(i + 1, j + 1)] = e;
  }

  return Q[map(m, n)];
}

function phraseMatch(a, b, matchWordPow) {
  matchWordPow = matchWordPow || 1;
  var spliter = /[\s,-\.+?\_]+/;

  var notEmp = function (e) {
    return e.length > 0;
  };

  var sq1 = a.toLowerCase().split(spliter).filter(notEmp);
  var sq2 = b.toLowerCase().split(spliter).filter(notEmp);
  var wordsMatchScore = wordsMatch(sq1, sq2);
  var m = sq1.length;
  var n = sq2.length;
  return wordsMatchScore / Math.max((0, _int.harmonicMean)(m, n), 1);
}

;

function phraseLike(a, b, matchWordPow) {
  matchWordPow = matchWordPow || 1;
  var spliter = /[\s,-\.+?\_]+/;

  var notEmp = function (e) {
    return e.length > 0;
  };

  var sq1 = a.toLowerCase().split(spliter).filter(notEmp);
  var sq2 = b.toLowerCase().split(spliter).filter(notEmp);
  var m = sq1.length;
  var n = sq2.length;
  var wordsMatchScore = wordsMatch(sq1, sq2);
  return wordsMatchScore / Math.max((0, _int.harmonicMean)(m, n), 1);
}
};

moduleFactories["node_modules/absol-acomp/js/SelectTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/selecttable.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _stringMatching = require("absol/src/String/stringMatching");

var _stringFormat = require("absol/src/String/stringFormat");

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

require("./BScroller");

var _Searcher = _interopRequireDefault(require("./Searcher"));


var privateDom = new _Dom.default().install(_ACore.default);
var $ = privateDom.$;
var _ = privateDom._;

function SelectTable() {
  var thisST = this;
  this.$attachhook = _('attachhook').addTo(this);
  this.sync = new Promise(function (rs) {
    thisST.$attachhook.on('error', rs);
  });
  this.$buttonsContainer = $('.absol-select-table-buttons-container', this);
  this.$searchContainer = $('.absol-select-table-searchtextinput-container', this);
  this.$nonselectedItemsContainer = $('.absol-select-table-nonselected-items-container', this);
  this.$selectedItemsContainer = $('.absol-select-table-selected-items-container', this);
  this.$nonselectedSearchItemsContainer = $('.absol-select-table-nonselected-search-items-container', this);
  this.$selectedSearchItemsContainer = $('.absol-select-table-selected-search-items-container', this);
  this.$removeAllBtn = $('button.remove-all', this).on('click', this.eventHandler.removeAllBtnClick);
  this.$addAllBtn = $('button.add-all', this).on('click', this.eventHandler.addAllBtnClick);
  this.$vscrollerSelected = $('bscroller#selected', this);
  this.$vscrollerNonselected = $('bscroller#nonselected', this);
  this.$body = $('.absol-select-table-body', this);
  this.$header = $('.absol-select-table-header', this);
  /***
   *
   * @type {SearchTextInput}
   */

  this.$searchTextInput = $('searchtextinput', this).on('stoptyping', this.eventHandler.searchTextInputModify);

  this.$addAllBtn.updateSize = function () {
    thisST.updateScroller && thisST.updateScroller();
  };

  _Dom.default.addToResizeSystem(this.$addAllBtn);

  return this;
}

SelectTable.tag = 'SelectTable'.toLowerCase();

SelectTable.render = function () {
  return _({
    class: 'absol-select-table',
    extendEvent: ['change', 'addall', 'removeall', 'add', 'remove'],
    child: [{
      class: 'absol-select-table-header',
      child: [{
        class: 'absol-select-table-searchtextinput-container',
        child: 'searchtextinput'
      }, {
        class: 'absol-select-table-buttons-container',
        child: [{
          tag: 'button',
          class: 'add-all',
          props: {
            innerHTML: 'Add All'
          }
        }, {
          tag: 'button',
          class: 'remove-all',
          props: {
            innerHTML: 'Remove All'
          }
        }]
      }]
    }, {
      class: 'absol-select-table-body',
      child: [{
        tag: 'bscroller',
        attr: {
          id: 'nonselected'
        },
        class: ['absol-select-table-items-scroller'],
        child: {
          child: ['.absol-select-table-nonselected-items-container', '.absol-select-table-nonselected-search-items-container']
        }
      }, {
        tag: 'bscroller',
        attr: {
          id: 'selected'
        },
        class: ['absol-select-table-items-scroller'],
        child: {
          child: ['.absol-select-table-selected-items-container', '.absol-select-table-selected-search-items-container']
        }
      }]
    }]
  });
};

SelectTable.prototype.updateButtonsContainerSize = function () {
  var rootBound = this.$buttonsContainer.getBoundingClientRect();
  var containBound = this.$buttonsContainer.getBoundingRecursiveRect();
  var fontSize = this.getFontSize();
  this.$buttonsContainer.addStyle('width', (containBound.width + 1) / fontSize + 'em');
  this.$searchContainer.addStyle('right', (containBound.width + 5) / fontSize + 'em');
};

SelectTable.prototype.addAll = function () {
  Array.apply(null, this.$nonselectedItemsContainer.childNodes).forEach(function (e) {
    e.addTo(this.$selectedItemsContainer);
  }.bind(this));
  this.requestSort();
};

SelectTable.prototype.removeAll = function () {
  Array.apply(null, this.$selectedItemsContainer.childNodes).forEach(function (e) {
    e.addTo(this.$nonselectedItemsContainer);
  }.bind(this));
  this.requestSort();
};

SelectTable.prototype.updateScroller = function () {
  var update = function () {
    if (this.style.height) {
      var height = parseFloat(this.getComputedStyleValue('height').replace('px', ''));
      var headerHeight = parseFloat(this.$header.getComputedStyleValue('height').replace('px', ''));
      var bodyMargin = parseFloat(this.$body.getComputedStyleValue('margin-top').replace('px', ''));
      var borderWidth = 1;
      var availableHeight = height - headerHeight - bodyMargin * 2 - borderWidth * 2;
      this.$vscrollerNonselected.addStyle('max-height', availableHeight + 'px');
      this.$vscrollerSelected.addStyle('max-height', availableHeight + 'px');
    }
  }.bind(this);

  setTimeout(update, 1);
};

SelectTable.prototype.getAllItemElement = function () {
  var selectedItemElements = Array.apply(null, this.$selectedItemsContainer.childNodes);
  var nonselectedItemElements = Array.apply(null, this.$nonselectedItemsContainer.childNodes);
  return selectedItemElements.concat(nonselectedItemElements);
};

SelectTable.prototype.init = function (props) {
  this.super(props);
  this.sync = this.sync.then(this.updateButtonsContainerSize.bind(this));
};

SelectTable.eventHandler = {};

SelectTable.eventHandler.addAllBtnClick = function (event) {
  this.addAll();

  if (this.searching) {
    this.eventHandler.searchTextInputModify(event);
  }

  this.emit('addall', _EventEmitter.default.copyEvent(event, {}), this);
  this.updateScroller();
};

SelectTable.eventHandler.removeAllBtnClick = function (event) {
  this.removeAll();

  if (this.searching) {
    this.eventHandler.searchTextInputModify(event);
  }

  this.emit('removeall', _EventEmitter.default.copyEvent(event, {}), this);
  this.updateScroller();
};

SelectTable.prototype._filter = function (items, filterText) {
  var result = [];

  if (filterText.length == 1) {
    result = items.map(function (item) {
      var res = {
        item: item,
        text: typeof item === 'string' ? item : item.text
      };
      return res;
    }).map(function (it) {
      it.score = 0;
      var text = it.text.replace(/((\&nbsp)|(\s))+/g, ' ').trim();
      it.score += text.toLowerCase().indexOf(filterText.toLowerCase()) >= 0 ? 100 : 0;
      text = (0, _stringFormat.nonAccentVietnamese)(text);
      it.score += text.toLowerCase().indexOf(filterText.toLowerCase()) >= 0 ? 100 : 0;
      return it;
    });
    result.sort(function (a, b) {
      if (b.score - a.score == 0) {
        if ((0, _stringFormat.nonAccentVietnamese)(b.text) > (0, _stringFormat.nonAccentVietnamese)(a.text)) return -1;
        return 1;
      }

      return b.score - a.score;
    });
    result = result.filter(function (x) {
      return x.score > 0;
    });
  } else {
    var its = items.map(function (item) {
      var res = {
        item: item,
        text: typeof item === 'string' ? item : item.text
      };
      var text = res.text.replace(/((\&nbsp)|(\s))+/g, ' ').trim();
      res.score = ((0, _stringMatching.phraseMatch)(text, filterText) + (0, _stringMatching.phraseMatch)((0, _stringFormat.nonAccentVietnamese)(text), (0, _stringFormat.nonAccentVietnamese)(filterText))) / 2;
      if ((0, _stringFormat.nonAccentVietnamese)(text).replace(/s/g, '').toLowerCase().indexOf((0, _stringFormat.nonAccentVietnamese)(filterText).toLowerCase().replace(/s/g, '')) > -1) res.score = 100;
      return res;
    });
    if (its.length == 0) return;
    its.sort(function (a, b) {
      if (b.score - a.score == 0) {
        if ((0, _stringFormat.nonAccentVietnamese)(b.text) > (0, _stringFormat.nonAccentVietnamese)(a.text)) return -1;
        return 1;
      }

      return b.score - a.score;
    });
    var result = its.filter(function (x) {
      return x.score > 0.5;
    });

    if (result.length == 0) {
      var bestScore = its[0].score;
      result = its.filter(function (it) {
        return it.score + 0.001 >= bestScore;
      });
    }

    if (result[0].score == 0) result = [];
  }

  result = result.map(function (e) {
    return e.item;
  });
  return result;
};

SelectTable.prototype._stringcmp = function (s0, s1) {
  if (s0 == s1) return 0;
  if (s0 > s1) return 1;
  return -1;
};

SelectTable.prototype._getString = function (item) {
  if (typeof item == "string") return item;
  return item.text;
};

SelectTable.prototype._equalArr = function (a, b) {
  if (a.length != b.length) return false;

  for (var i = 0; i < a.length; ++i) {
    if (a[i] != b[i] && a[i].text != b[i].text && a[i].value != b[i].value) return false;
  }

  return true;
};

SelectTable.prototype._applySort = function (items, sortFlag) {
  var res = items.slice();

  if (sortFlag == 1 || sortFlag === true) {
    res.sort(function (a, b) {
      return this._stringcmp(this._getString(a), this._getString(b));
    }.bind(this));
  } else if (sortFlag == -1) {
    res.sort(function (a, b) {
      return -this._stringcmp(this._getString(a), this._getString(b));
    }.bind(this));
  } else if (typeof sortFlag == 'function') {
    res.sort(function (a, b) {
      return sortFlag(a, b);
    }.bind(this));
  }

  return res;
};

SelectTable.prototype.requestSort = function () {
  if (!this.sorted || this.sorted == 0) return;
  var selectedItems = this.selectedItems;

  var selectedItemsNew = this._applySort(selectedItems, this.sorted);

  if (!this._equalArr(selectedItems, selectedItemsNew)) {
    this.selectedItems = selectedItemsNew;
  }

  var nonselectedItems = this.nonselectedItems;

  var nonselectedItemsNew = this._applySort(nonselectedItems, this.sorted);

  if (!this._equalArr(nonselectedItems, nonselectedItemsNew)) {
    this.nonselectedItems = nonselectedItemsNew;
  }
};

SelectTable.eventHandler.searchTextInputModify = function (event) {
  var filterText = this.$searchTextInput.value.trim();

  if (filterText.length > 0) {
    var selectedItems = this.selectedItems;
    var nonselectedItems = this.nonselectedItems;
    this.selectedSearchItems = selectedItems;
    this.nonselectedSearchItems = this._filter(nonselectedItems, filterText);
    this.selectedSearchItems = this._filter(selectedItems, filterText);
  } else {}

  this.searching = filterText.length > 0;
};

SelectTable.property = {};
SelectTable.property.disableMoveAll = {
  set: function (value) {
    if (value) this.addClass('disable-move-all');else this.removeClass('disable-move-all');
  },
  get: function () {
    return this.hasClass('disable-move-all');
  }
};
SelectTable.property.removeAllText = {
  set: function (text) {
    this._removeAllText = text; //todo: update remove all text

    if (!text) this.$removeAllBtn.addStyle('display', 'none');else {
      this.$removeAllBtn.removeStyle('display');
      this.$removeAllBtn.innerHTML = this.removeAllText;
      this.updateButtonsContainerSize();
    }
  },
  get: function () {
    return this._removeAllText || 'Remove All';
  }
};
SelectTable.property.addAllText = {
  set: function (text) {
    this._addAllText = text;
    if (!text) this.$addAllBtn.addStyle('display', 'none');else {
      this.$addAllBtn.removeStyle('display');
      this.$addAllBtn.innerHTML = this.removeAllText;
      this.updateButtonsContainerSize();
    }
  },
  get: function () {
    return this._addAllText || 'Add All';
  }
};
SelectTable.property.searching = {
  set: function (value) {
    if (value) {
      this.addClass('searching');
    } else {
      this.removeClass('searching');
    }

    this.updateScroller();
  },
  get: function () {
    return this.hasClass('searching');
  }
};
SelectTable.property.sorted = {
  set: function (value) {
    this._sort = value;
    this.requestSort();
  },
  get: function () {
    return this._sort;
  }
};
SelectTable.property.selectedItems = {
  set: function (items) {
    this.$selectedItemsContainer.clearChild();
    var $nonselectedItemsContainer = this.$nonselectedItemsContainer;
    var $selectedItemsContainer = this.$selectedItemsContainer;
    var self = this;

    if (items instanceof Array) {
      items.map(function (item) {
        return _({
          tag: 'item',
          props: {
            data: item
          },
          on: {
            requestmove: function (event) {
              if (this.parentElement == $selectedItemsContainer) {
                this.addTo($nonselectedItemsContainer);
                self.emit('remove', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), self);
              } else {
                this.addTo($selectedItemsContainer);
                self.emit('add', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), self);
              }

              self.updateScroller();
              self.requestSort();
            }
          }
        }).addTo(this.$selectedItemsContainer);
      }.bind(this));
    } else {// error
    }

    this.updateScroller();
    this.requestSort();
  },
  get: function () {
    return Array.prototype.map.call(this.$selectedItemsContainer.childNodes, function (e) {
      return e.data;
    });
  }
};
SelectTable.property.nonselectedItems = {
  set: function (items) {
    this.$nonselectedItemsContainer.clearChild();
    var $nonselectedItemsContainer = this.$nonselectedItemsContainer;
    var $selectedItemsContainer = this.$selectedItemsContainer;
    var self = this;

    if (items instanceof Array) {
      items.map(function (item) {
        return _({
          tag: 'item',
          props: {
            data: item
          },
          on: {
            requestmove: function (event) {
              if (this.parentElement == $selectedItemsContainer) {
                this.addTo($nonselectedItemsContainer);
                self.emit('remove', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), self);
              } else {
                this.addTo($selectedItemsContainer);
                self.emit('add', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), self);
              }

              self.updateScroller();
              self.requestSort();
            }
          }
        }).addTo(this.$nonselectedItemsContainer);
      }.bind(this));
    } else {// error
    }

    this.updateScroller();
    this.requestSort();
  },
  get: function () {
    return Array.prototype.map.call(this.$nonselectedItemsContainer.childNodes, function (e) {
      return e.data;
    });
  }
};
SelectTable.property.selectedSearchItems = {
  set: function (items) {
    this.$selectedSearchItemsContainer.clearChild();
    var $nonselectedSearchItemsContainer = this.$nonselectedSearchItemsContainer;
    var $selectedSearchItemsContainer = this.$selectedSearchItemsContainer;
    var table = this;

    if (items instanceof Array) {
      items.map(function (item) {
        return _({
          tag: 'item',
          props: {
            data: item
          },
          on: {
            requestmove: function (event) {
              if (this.parentElement == $selectedSearchItemsContainer) {
                this.addTo($nonselectedSearchItemsContainer);
                table.getAllItemElement().filter(function (itemElement) {
                  if (itemElement.data == this.data) {
                    itemElement.addTo(table.$nonselectedItemsContainer);
                    return true;
                  }

                  return false;
                }.bind(this));
                table.emit('remove', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), table);
              } else {
                this.addTo($selectedSearchItemsContainer);
                table.getAllItemElement().filter(function (itemElement) {
                  if (itemElement.data == this.data) {
                    itemElement.addTo(table.$selectedItemsContainer);
                    return true;
                  }

                  return false;
                }.bind(this));
                table.emit('add', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), table);
              }

              table.updateScroller();
              table.requestSort();
            }
          }
        }).addTo(this.$selectedSearchItemsContainer);
      }.bind(this));
    } else {// error
    }

    this.updateScroller();
  },
  get: function () {
    return Array.prototype.map.call(this.$selectedSearchItemsContainer.childNodes, function (e) {
      return e.data;
    });
  }
};
SelectTable.property.nonselectedSearchItems = {
  set: function (items) {
    this.$nonselectedSearchItemsContainer.clearChild();
    var $nonselectedSearchItemsContainer = this.$nonselectedSearchItemsContainer;
    var $selectedSearchItemsContainer = this.$selectedSearchItemsContainer;
    var table = this;

    if (items instanceof Array) {
      items.map(function (item) {
        return _({
          tag: 'item',
          props: {
            data: item
          },
          on: {
            requestmove: function (event) {
              if (this.parentElement == $selectedSearchItemsContainer) {
                this.addTo($nonselectedSearchItemsContainer);
                table.getAllItemElement().filter(function (itemElement) {
                  if (itemElement.data == this.data) {
                    itemElement.addTo(table.$nonselectedItemsContainer);
                    return true;
                  }

                  return false;
                }.bind(this));
                table.emit('remove', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), table);
              } else {
                this.addTo($selectedSearchItemsContainer);
                table.getAllItemElement().filter(function (itemElement) {
                  if (itemElement.data == this.data) {
                    itemElement.addTo(table.$selectedItemsContainer);
                    return true;
                  }

                  return false;
                }.bind(this));
                table.emit('add', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), table);
              }

              table.updateScroller();
              table.requestSort();
            }
          }
        }).addTo(this.$nonselectedSearchItemsContainer);
      }.bind(this));
    } else {// error
    }

    this.updateScroller();
  },
  get: function () {
    return Array.prototype.map.call(this.$nonselectedSearchItemsContainer.childNodes, function (e) {
      return e.data;
    });
  }
};
/*
namespace of selecttable
*/

function Item() {
  var res = _({
    extendEvent: ['requestmove'],
    class: 'absol-select-table-item',
    child: ['span.absol-select-table-item-text', {
      class: 'absol-select-table-item-right-container',
      child: {
        class: 'absol-select-table-item-right-container-table',
        child: {
          class: 'absol-select-table-item-right-container-cell',
          child: ['addicon', 'subicon']
        }
      }
    }]
  });

  res.$text = $('span', res);
  res.eventHandler = _OOP.default.bindFunctions(res, Item.eventHandler);
  res.$rightBtn = $('.absol-select-table-item-right-container', res);
  res.on('dblclick', res.eventHandler.dblclick);
  res.$rightBtn.on('click', res.eventHandler.rightBtClick);
  return res;
}

;
Item.eventHandler = {};

Item.eventHandler.dblclick = function (event) {
  event.preventDefault();
  if (!_EventEmitter.default.hitElement(this.$rightBtn, event)) this.emit('requestmove', event, this);
};

Item.eventHandler.rightBtClick = function (event) {
  this.emit('requestmove', event, this);
};

Item.property = {};
Item.property.data = {
  set: function (value) {
    this._data = value;

    if (value) {
      var text;

      if (typeof value == "string") {
        text = value;
      } else {
        text = value.text;
      }

      this.$text.innerHTML = text;
    }
  },
  get: function () {
    return this._data;
  }
};
Item.property.text = {
  get: function () {
    return this._data ? typeof this._data == 'string' ? this._data : this._data.text : '';
  }
};
/**
 *
 * <svg width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
 <g transform="translate(0,-197)">
 <path d="m39.873 198.21v38.668h-38.668v20.252h38.668v38.668h20.253v-38.668h38.668v-20.252h-38.668v-38.668z" style="fill-rule:evenodd;fill:#5fbbc2;stroke-linejoin:round;stroke-width:2.4109;stroke:#002eea"/>
 </g>
 </svg>
 */

function AddIcon() {
  return _Svg.default.ShareInstance.buildSvg('<svg class="add-icon" width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">' + '<g transform="translate(0,-197)">' + '<path d="m39.873 198.21v38.668h-38.668v20.252h38.668v38.668h20.253v-38.668h38.668v-20.252h-38.668v-38.668z" style="fill-rule:evenodd;stroke-linejoin:round;stroke-width:2.4109;" />' + '</g>' + '</svg>');
}

;

function SubIcon() {
  return _Svg.default.ShareInstance.buildSvg('<svg class="sub-icon" width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">' + ' <g transform="translate(0,-197)">' + '  <path d="m98.795 236.87v20.253h-97.589v-20.253z" style="fill-rule:evenodd;stroke-linejoin:round;stroke-width:2.411;"/>' + ' </g>' + '</svg>');
}

;
privateDom.install({
  subicon: SubIcon,
  addicon: AddIcon,
  item: Item
});
SelectTable.privateDom = privateDom;

_ACore.default.install(SelectTable);

var _default = SelectTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectTable2.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectTable2.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/selecttable.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _stringMatching = require("absol/src/String/stringMatching");

var _stringFormat = require("absol/src/String/stringFormat");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SelectTable = _interopRequireDefault(require("./SelectTable"));


var privateDom = new _Dom.default().install(_ACore.default).install(_SelectTable.default.privateDom);
var $ = privateDom.$;
var _ = privateDom._;

function SelectTable2() {
  var thisST = this;
  this.$attachhook = _('attachhook').addTo(this);
  this.sync = new Promise(function (rs) {
    thisST.$attachhook.on('error', rs);
  });
  this.$buttonsContainer = $('.absol-select-table-buttons-container', this);
  this.$searchContainer = $('.absol-select-table-searchtextinput-container', this);
  this.$nonselectedItemsContainer = $('.absol-select-table-nonselected-items-container', this);
  this.$selectedItemsContainer = $('.absol-select-table-selected-items-container', this);
  this.$nonselectedSearchItemsContainer = $('.absol-select-table-nonselected-search-items-container', this);
  this.$selectedSearchItemsContainer = $('.absol-select-table-selected-search-items-container', this);
  this.$removeAllBtn = $('button.remove-all', this).on('click', this.eventHandler.removeAllBtnClick);
  this.$addAllBtn = $('button.add-all', this).on('click', this.eventHandler.addAllBtnClick);
  this.$vscrollerSelected = $('vscroller#selected', this);
  this.$vscrollerNonselected = $('vscroller#nonselected', this);
  this.$body = $('.absol-select-table-body', this);
  this.$searchTextInput = $('searchtextinput', this).on('stoptyping', this.eventHandler.searchTextInputModify);
}

;
SelectTable2.tag = 'SelectTable2'.toLowerCase();

SelectTable2.render = function () {
  return _({
    class: ['absol-select-table', 'exclude'],
    extendEvent: ['change', 'addall', 'removeall', 'add', 'remove'],
    child: [{
      class: 'absol-select-table-header',
      child: [{
        class: 'absol-select-table-searchtextinput-container',
        child: 'searchtextinput'
      }, {
        class: 'absol-select-table-buttons-container',
        child: [{
          tag: 'button',
          class: 'add-all',
          props: {
            innerHTML: 'Add All'
          }
        }, {
          tag: 'button',
          class: 'remove-all',
          props: {
            innerHTML: 'Remove All'
          }
        }]
      }]
    }, {
      class: 'absol-select-table-body',
      child: [{
        tag: 'vscroller',
        attr: {
          id: 'nonselected'
        },
        class: 'absol-select-table-items-scroller',
        child: {
          child: ['.absol-select-table-nonselected-items-container', '.absol-select-table-nonselected-search-items-container']
        }
      }, {
        tag: 'vscroller',
        attr: {
          id: 'selected'
        },
        class: 'absol-select-table-items-scroller',
        child: {
          child: ['.absol-select-table-selected-items-container', '.absol-select-table-selected-search-items-container']
        }
      }]
    }]
  });
};

SelectTable2.prototype.updateButtonsContainerSize = function () {
  var rootBound = this.$buttonsContainer.getBoundingClientRect();
  var containBound = this.$buttonsContainer.getBoundingRecursiveRect();
  var fontSize = this.getFontSize();
  this.$buttonsContainer.addStyle('width', (containBound.width + 1) / fontSize + 'em');
  this.$searchContainer.addStyle('right', (containBound.width + 5) / fontSize + 'em');
};

SelectTable2.prototype.addAll = function () {
  Array.apply(null, this.$nonselectedItemsContainer.childNodes).forEach(function (e) {
    e.addTo(this.$selectedItemsContainer);
  }.bind(this));
  this.requestSort();
};

SelectTable2.prototype.removeAll = function () {
  Array.apply(null, this.$selectedItemsContainer.childNodes).forEach(function (e) {
    e.addTo(this.$nonselectedItemsContainer);
  }.bind(this));
  this.requestSort();
};

SelectTable2.prototype.updateScroller = function () {
  var update = function () {
    if (this.style.height) {
      var bodyMargin = parseFloat(this.$body.getComputedStyleValue('margin-top').replace('px', '') || 0.14285714285 * 14 + '');
      var bound = this.getBoundingClientRect();
      var bodyBound = this.$body.getBoundingClientRect();
      var bodyRBound = this.$body.getBoundingRecursiveRect();
      var availableHeight = bound.bottom - bodyMargin - bodyBound.top;
      var isOverflowHeight = availableHeight < bodyRBound.height;

      if (isOverflowHeight) {
        this.$vscrollerNonselected.addStyle('max-height', availableHeight + 'px');
        this.$vscrollerSelected.addStyle('max-height', availableHeight + 'px');
        this.$vscrollerSelected.addClass('limited-height');
        this.$vscrollerNonselected.addClass('limited-height');
      } else {
        this.$vscrollerNonselected.removeStyle('max-height');
        this.$vscrollerSelected.removeStyle('max-height');
        this.$vscrollerSelected.removeClass('limited-height');
        this.$vscrollerSelected.removeClass('limited-height');
        this.$vscrollerNonselected.removeClass('limited-height');
      }
    }

    requestAnimationFrame(this.$vscrollerNonselected.requestUpdateSize.bind(this.$vscrollerNonselected));
    requestAnimationFrame(this.$vscrollerSelected.requestUpdateSize.bind(this.$vscrollerSelected));
  }.bind(this);

  setTimeout(update, 1);
};

SelectTable2.prototype.getAllItemElement = function () {
  var selectedItemElements = Array.apply(null, this.$selectedItemsContainer.childNodes);
  var nonselectedItemElements = Array.apply(null, this.$nonselectedItemsContainer.childNodes);
  return selectedItemElements.concat(nonselectedItemElements);
};

SelectTable2.prototype.init = function (props) {
  this.super(props);
  this.sync = this.sync.then(this.updateButtonsContainerSize.bind(this));
};

SelectTable2.eventHandler = {};

SelectTable2.eventHandler.addAllBtnClick = function (event) {
  this.addAll();

  if (this.searching) {
    this.eventHandler.searchTextInputModify(event);
  }

  this.emit('addall', _EventEmitter.default.copyEvent(event, {}), this);
  this.updateScroller();
};

SelectTable2.eventHandler.removeAllBtnClick = function (event) {
  this.removeAll();

  if (this.searching) {
    this.eventHandler.searchTextInputModify(event);
  }

  this.emit('removeall', _EventEmitter.default.copyEvent(event, {}), this);
  this.updateScroller();
};

SelectTable2.prototype._filter = function (items, filterText) {
  var result = [];

  if (filterText.length == 1) {
    result = items.map(function (item) {
      var res = {
        item: item,
        text: typeof item === 'string' ? item : item.text
      };
      return res;
    }).map(function (it) {
      it.score = 0;
      var text = it.text.replace(/((\&nbsp)|(\s))+/g, ' ').trim();
      it.score += text.toLowerCase().indexOf(filterText.toLowerCase()) >= 0 ? 100 : 0;
      text = (0, _stringFormat.nonAccentVietnamese)(text);
      it.score += text.toLowerCase().indexOf(filterText.toLowerCase()) >= 0 ? 100 : 0;
      return it;
    });
    result.sort(function (a, b) {
      if (b.score - a.score == 0) {
        if ((0, _stringFormat.nonAccentVietnamese)(b.text) > (0, _stringFormat.nonAccentVietnamese)(a.text)) return -1;
        return 1;
      }

      return b.score - a.score;
    });
    result = result.filter(function (x) {
      return x.score > 0;
    });
  } else {
    var its = items.map(function (item) {
      var res = {
        item: item,
        text: typeof item === 'string' ? item : item.text
      };
      var text = res.text.replace(/((\&nbsp)|(\s))+/g, ' ').trim();
      res.score = ((0, _stringMatching.phraseMatch)(text, filterText) + (0, _stringMatching.phraseMatch)((0, _stringFormat.nonAccentVietnamese)(text), (0, _stringFormat.nonAccentVietnamese)(filterText))) / 2;
      if ((0, _stringFormat.nonAccentVietnamese)(text).replace(/s/g, '').toLowerCase().indexOf((0, _stringFormat.nonAccentVietnamese)(filterText).toLowerCase().replace(/s/g, '')) > -1) res.score = 100;
      return res;
    });
    if (its.length == 0) return;
    its.sort(function (a, b) {
      if (b.score - a.score == 0) {
        if ((0, _stringFormat.nonAccentVietnamese)(b.text) > (0, _stringFormat.nonAccentVietnamese)(a.text)) return -1;
        return 1;
      }

      return b.score - a.score;
    });
    var result = its.filter(function (x) {
      return x.score > 0.5;
    });

    if (result.length == 0) {
      var bestScore = its[0].score;
      result = its.filter(function (it) {
        return it.score + 0.001 >= bestScore;
      });
    }

    if (result[0].score == 0) result = [];
  }

  result = result.map(function (e) {
    return e.item;
  });
  return result;
};

SelectTable2.prototype._stringcmp = function (s0, s1) {
  if (s0 == s1) return 0;
  if (s0 > s1) return 1;
  return -1;
};

SelectTable2.prototype._getString = function (item) {
  if (typeof item == "string") return item;
  return item.text;
};

SelectTable2.prototype._equalArr = function (a, b) {
  if (a.length != b.length) return false;

  for (var i = 0; i < a.length; ++i) {
    if (a[i] != b[i]) return false;
  }

  return true;
};

SelectTable2.prototype._applySort = function (items, sortFlag) {
  var res = items.slice();

  if (sortFlag == 1 || sortFlag === true) {
    res.sort(function (a, b) {
      return this._stringcmp(this._getString(a), this._getString(b));
    }.bind(this));
  } else if (sortFlag == -1) {
    res.sort(function (a, b) {
      return -this._stringcmp(this._getString(a), this._getString(b));
    }.bind(this));
  } else if (typeof sortFlag == 'function') {
    res.sort(function (a, b) {
      return sortFlag(a, b);
    }.bind(this));
  }

  return res;
};

SelectTable2.prototype.requestSort = function () {
  if (!this.sorted || this.sorted == 0) return;
  var selectedItems = this.selectedItems;

  var selectedItemsNew = this._applySort(selectedItems, this.sorted);

  if (!this._equalArr(selectedItems, selectedItemsNew)) {
    this.selectedItems = selectedItemsNew;
  }

  var nonselectedItems = this.nonselectedItems;

  var nonselectedItemsNew = this._applySort(nonselectedItems, this.sorted);

  if (!this._equalArr(nonselectedItems, nonselectedItemsNew)) {
    this.nonselectedItems = nonselectedItemsNew;
  }
};

SelectTable2.eventHandler.searchTextInputModify = function (event) {
  var filterText = this.$searchTextInput.value.trim();

  if (filterText.length > 0) {
    var selectedItems = this.selectedItems;
    var nonselectedItems = this.nonselectedItems;
    this.selectedSearchItems = selectedItems;
    this.nonselectedSearchItems = this._filter(nonselectedItems, filterText);
    this.selectedSearchItems = this._filter(selectedItems, filterText);
  } else {}

  this.searching = filterText.length > 0;
};

SelectTable2.property = {};
SelectTable2.property.disableMoveAll = {
  set: function (value) {
    if (value) this.addClass('disable-move-all');else this.removeClass('disable-move-all');
  },
  get: function () {
    return this.hasClass('disable-move-all');
  }
};
SelectTable2.property.removeAllText = {
  set: function (text) {
    this._removeAllText = text; //todo: update remove all text

    if (!text) this.$removeAllBtn.addStyle('display', 'none');else {
      this.$removeAllBtn.removeStyle('display');
      this.$removeAllBtn.innerHTML = this.removeAllText;
      this.updateButtonsContainerSize();
    }
  },
  get: function () {
    return this._removeAllText || 'Remove All';
  }
};
SelectTable2.property.addAllText = {
  set: function (text) {
    this._addAllText = text;
    if (!text) this.$addAllBtn.addStyle('display', 'none');else {
      this.$addAllBtn.removeStyle('display');
      this.$addAllBtn.innerHTML = this.removeAllText;
      this.updateButtonsContainerSize();
    }
  },
  get: function () {
    return this._addAllText || 'Add All';
  }
};
SelectTable2.property.searching = {
  set: function (value) {
    if (value) {
      this.addClass('searching');
    } else {
      this.removeClass('searching');
    }

    this.updateScroller();
  },
  get: function () {
    return this.hasClass('searching');
  }
};
SelectTable2.property.sorted = {
  set: function (value) {
    this._sort = value;
    this.requestSort();
  },
  get: function () {
    return this._sort;
  }
};
SelectTable2.property.selectedItems = {
  set: function (items) {
    this.$selectedItemsContainer.clearChild();
    var $nonselectedItemsContainer = this.$nonselectedItemsContainer;
    var $selectedItemsContainer = this.$selectedItemsContainer;
    var self = this;

    if (items instanceof Array) {
      items.map(function (item) {
        return _({
          tag: 'item',
          props: {
            data: item
          },
          on: {
            requestmove: function (event) {
              if (this.parentElement == $selectedItemsContainer) {
                this.addTo($nonselectedItemsContainer);
                self.emit('remove', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), self);
              } else {
                this.addTo($selectedItemsContainer);
                self.emit('add', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), self);
              }

              self.updateScroller();
              self.requestSort();
            }
          }
        }).addTo(this.$selectedItemsContainer);
      }.bind(this));
    } else {// error
    }

    this.updateScroller();
    this.requestSort();
  },
  get: function () {
    return Array.prototype.map.call(this.$selectedItemsContainer.childNodes, function (e) {
      return e.data;
    });
  }
};
SelectTable2.property.nonselectedItems = {
  set: function (items) {
    this.$nonselectedItemsContainer.clearChild();
    var $nonselectedItemsContainer = this.$nonselectedItemsContainer;
    var $selectedItemsContainer = this.$selectedItemsContainer;
    var self = this;

    if (items instanceof Array) {
      items.map(function (item) {
        return _({
          tag: 'item',
          props: {
            data: item
          },
          on: {
            requestmove: function (event) {
              if (this.parentElement == $selectedItemsContainer) {
                this.addTo($nonselectedItemsContainer);
                self.emit('remove', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), self);
              } else {
                this.addTo($selectedItemsContainer);
                self.emit('add', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), self);
              }

              self.updateScroller();
              self.requestSort();
            }
          }
        }).addTo(this.$nonselectedItemsContainer);
      }.bind(this));
    } else {// error
    }

    this.updateScroller();
    this.requestSort();
  },
  get: function () {
    return Array.prototype.map.call(this.$nonselectedItemsContainer.childNodes, function (e) {
      return e.data;
    });
  }
};
SelectTable2.property.selectedSearchItems = {
  set: function (items) {
    this.$selectedSearchItemsContainer.clearChild();
    var $nonselectedSearchItemsContainer = this.$nonselectedSearchItemsContainer;
    var $selectedSearchItemsContainer = this.$selectedSearchItemsContainer;
    var table = this;

    if (items instanceof Array) {
      items.map(function (item) {
        return _({
          tag: 'item',
          props: {
            data: item
          },
          on: {
            requestmove: function (event) {
              if (this.parentElement == $selectedSearchItemsContainer) {
                this.addTo($nonselectedSearchItemsContainer);
                table.getAllItemElement().filter(function (itemElement) {
                  if (itemElement.data == this.data) {
                    itemElement.addTo(table.$nonselectedItemsContainer);
                    return true;
                  }

                  return false;
                }.bind(this));
                table.emit('remove', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), table);
              } else {
                this.addTo($selectedSearchItemsContainer);
                table.getAllItemElement().filter(function (itemElement) {
                  if (itemElement.data == this.data) {
                    itemElement.addTo(table.$selectedItemsContainer);
                    return true;
                  }

                  return false;
                }.bind(this));
                table.emit('add', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), table);
              }

              table.updateScroller();
              table.requestSort();
            }
          }
        }).addTo(this.$selectedSearchItemsContainer);
      }.bind(this));
    } else {// error
    }

    this.updateScroller();
  },
  get: function () {
    return Array.prototype.map.call(this.$selectedSearchItemsContainer.childNodes, function (e) {
      return e.data;
    });
  }
};
SelectTable2.property.nonselectedSearchItems = {
  set: function (items) {
    this.$nonselectedSearchItemsContainer.clearChild();
    var $nonselectedSearchItemsContainer = this.$nonselectedSearchItemsContainer;
    var $selectedSearchItemsContainer = this.$selectedSearchItemsContainer;
    var table = this;

    if (items instanceof Array) {
      items.map(function (item) {
        return _({
          tag: 'item',
          props: {
            data: item
          },
          on: {
            requestmove: function (event) {
              if (this.parentElement == $selectedSearchItemsContainer) {
                this.addTo($nonselectedSearchItemsContainer);
                table.getAllItemElement().filter(function (itemElement) {
                  if (itemElement.data == this.data) {
                    itemElement.addTo(table.$nonselectedItemsContainer);
                    return true;
                  }

                  return false;
                }.bind(this));
                table.emit('remove', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), table);
              } else {
                this.addTo($selectedSearchItemsContainer);
                table.getAllItemElement().filter(function (itemElement) {
                  if (itemElement.data == this.data) {
                    itemElement.addTo(table.$selectedItemsContainer);
                    return true;
                  }

                  return false;
                }.bind(this));
                table.emit('add', _EventEmitter.default.copyEvent(event, {
                  item: item
                }), table);
              }

              table.updateScroller();
              table.requestSort();
            }
          }
        }).addTo(this.$nonselectedSearchItemsContainer);
      }.bind(this));
    } else {// error
    }

    this.updateScroller();
  },
  get: function () {
    return Array.prototype.map.call(this.$nonselectedSearchItemsContainer.childNodes, function (e) {
      return e.data;
    });
  }
};
/*
namespace of selecttable
*/

function Item() {
  var res = _({
    extendEvent: ['requestmove', 'clickadd', 'clickremove', 'clickexclude'],
    class: 'absol-select-table-item',
    child: ['span.absol-select-table-item-text', {
      class: 'absol-select-table-item-right-container',
      child: {
        class: 'absol-select-table-item-right-container-table',
        child: {
          class: 'absol-select-table-item-right-container-row',
          child: [{
            attr: {
              title: 'Add'
            },
            class: ['absol-select-table-item-right-container-cell', 'add'],
            child: 'addicon'
          }, {
            attr: {
              title: 'Remove'
            },
            class: ['absol-select-table-item-right-container-cell', 'remove'],
            child: 'subicon'
          }, {
            attr: {
              title: 'Exclude'
            },
            class: ['absol-select-table-item-right-container-cell', 'exclude'],
            child: 'excludeico'
          }]
        }
      }
    }]
  });

  res.$text = $('span', res);
  res.eventHandler = _OOP.default.bindFunctions(res, Item.eventHandler);
  res.$rightBtn = $('.absol-select-table-item-right-container', res);
  res.on('dblclick', res.eventHandler.dblclick);
  res.$addBtn = $('.absol-select-table-item-right-container-cell.add', res).on('click', res.eventHandler.addBtClick);
  res.$removeBtn = $('.absol-select-table-item-right-container-cell.remove', res).on('click', res.eventHandler.removeBtClick);
  res.$excludeBtn = $('.absol-select-table-item-right-container-cell.exclude', res).on('click', res.eventHandler.excludeBtClick);
  return res;
}

;
Item.eventHandler = {};

Item.eventHandler.dblclick = function (event) {
  event.preventDefault();
  if (!_EventEmitter.default.hitElement(this.$rightBtn, event)) this.emit('requestmove', event, this);
};

Item.eventHandler.rightBtClick = function (event) {
  this.emit('requestmove', event, this);
};

Item.eventHandler.removeBtClick = function (event) {
  this.emit('clickremove', event, this);
};

Item.eventHandler.addBtClick = function (event) {
  this.emit('clickadd', event, this);
};

Item.eventHandler.excludeBtClick = function (event) {
  this.emit('clickexclude', event, this);
};

Item.property = {};
Item.property.data = {
  set: function (value) {
    this._data = value;

    if (value) {
      var text;

      if (typeof value == "string") {
        text = value;
      } else {
        text = value.text;
      }

      this.$text.innerHTML = text;
    }
  },
  get: function () {
    return this._data;
  }
};
Item.property.text = {
  get: function () {
    return this._data ? typeof this._data == 'string' ? this._data : this._data.text : '';
  }
};

function ExcludeIco() {
  return _('<svg class="exclude-icon" width="24" height="24" viewBox="0 0 24 24">\
            <path  d="M8.27,3L3,8.27V15.73L8.27,21H15.73C17.5,19.24 21,15.73 21,15.73V8.27L15.73,3M9.1,5H14.9L19,9.1V14.9L14.9,19H9.1L5,14.9V9.1M11,15H13V17H11V15M11,7H13V13H11V7" />\
        </svg>');
}

privateDom.install({
  item: Item,
  excludeico: ExcludeIco
}); // not completed yet

_ACore.default.install('selecttable2', SelectTable2);

var _default = SelectTable2;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SpanInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SpanInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/spaninput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _utils = require("./utils");

var _Text = require("absol/src/HTML5/Text");


var _ = _ACore.default._;
var $ = _ACore.default.$;

function SpanInput() {
  this.defineEvent(['change']);
  this._inputType = 0;
  this._lastValue = null;
  this.on('paste', this.eventHandler.paste).on('keyup', this.eventHandler.keyup).on('keydown', this.eventHandler.keydown).on('blur', this.eventHandler.blur);
}

SpanInput.prototype.notifyValueChange = function (event) {
  var cValue = this.value;

  if (this._lastValue != cValue && (this._inputType != 1 || !isNaN(this._lastValue) || !isNaN(cValue))) {
    this._lastValue = cValue;
    this.emit('change', {
      type: 'change',
      value: cValue,
      originEvent: event
    }, this);
  }
};

SpanInput.eventHandler = {};

SpanInput.eventHandler.keyup = function (event) {
  if (this._inputType == 0) {
    this.notifyValueChange(event);
  } else if (this._inputType == 1) {
    this.eventHandler.numberKeyup(event);
  }
};

SpanInput.eventHandler.keydown = function (event) {
  if (this._inputType == 0) {} else if (this._inputType == 1) {
    this.eventHandler.numberKeydown(event);
  }
};

SpanInput.eventHandler.numberBlur = function (value) {
  this.notifyValueChange(event);
};

SpanInput.eventHandler.textBlur = function (event) {
  this.notifyValueChange(event);
};

SpanInput.eventHandler.blur = function (event) {
  if (this._inputType == 0) {
    this.eventHandler.textBlur(event);
  } else if (this._inputType == 1) {
    this.eventHandler.numberKeydown(event);
  }
};

SpanInput.eventHandler.numberKeyup = function (event) {
  this.notifyValueChange();
};

SpanInput.eventHandler.numberKeydown = function (event) {
  var key = event.key;

  if (key == 'Enter') {
    event.preventDefault();
    this.blur();
    this.notifyValueChange();
    return;
  }

  if (key && key.length == 1 && !event.ctrlKey && !event.altKey) {
    if (key.match(/[0-9.\-\+]/)) {
      if (key == '.' && this.text.indexOf('.') >= 0) event.preventDefault();
      if ((key == '+' || key == '-') && (this.text.indexOf('+') >= 0 || this.text.indexOf('-') >= 0 || getCaretPosition(this) > 0)) event.preventDefault();
    } else event.preventDefault();
  }
};

SpanInput.eventHandler.paste = function (event) {
  event.preventDefault();

  if (event.clipboardData && event.clipboardData.getData) {
    var text = event.clipboardData.getData("text/plain");
    if (this._inputType == 1) text = text.replace(/[^0-9.\-+]/g, '');
    document.execCommand("insertHTML", false, text);

    if (this._inputType == 1) {
      if (isNaN(this.value)) {
        this.value = NaN;
      }
    }
  } else if (window.clipboardData && window.clipboardData.getData) {
    var text = window.clipboardData.getData("Text");
    if (this._inputType == 1) text = text.replace(/[^0-9.\-+]/g, '');
    (0, _utils.insertTextAtCursor)(text);

    if (this._inputType == 1) {
      if (isNaN(this.value)) {
        this.value = NaN;
      }
    }
  }
};

SpanInput.property = {};
SpanInput.property.value = {
  set: function (value) {
    if (this._inputType == 1 && isNaN(value)) value = null;
    this.clearChild();
    if (value !== null) this.addChild(_({
      text: value + ''
    }));
  },
  get: function () {
    if (this._inputType == 1) {
      return parseFloat(this.text);
    } else {
      return this.text;
    }
  }
};
SpanInput.property.type = {
  set: function (value) {
    var index = ['text', 'number'].indexOf(value);
    if (index < 0) index = 0;
    this._inputType = index;

    if (index == 1) {
      this.addClass('absol-span-input-empty-minus');
    } else {
      this.removeClass('absol-span-input-empty-minus');
    }
  },
  get: function () {
    return ['text', 'number'][this._inputType];
  }
};
SpanInput.property.text = {
  get: function () {
    return (0, _Text.getTextIn)(this);
  }
};
SpanInput.tag = 'spaninput';

SpanInput.render = function () {
  return _('span.absol-span-input[contenteditable="true"]');
};

_ACore.default.install(SpanInput);

var _default = SpanInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/StaticTabbar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/StaticTabbar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/statictabbar.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _stringGenerate = require("absol/src/String/stringGenerate");


var $ = _ACore.default.$;
var _ = _ACore.default._;

function StaticTabbar() {
  var thisST = this;
  this.$activeBox = $('.absol-static-tabbar-active-box', this);
  this.$hline = $('.absol-static-tabbar-hline', this);
  this.$buttons = [];
  this._btDict = {};
  this._activedButton = undefined;
  this.sync = new Promise(function (resolve) {
    _('attachhook').on('error', function () {
      this.remove();
      resolve();
    }).addTo(thisST);
  });
  return this;
}

StaticTabbar.tag = 'StaticTabbar'.toLowerCase();

StaticTabbar.render = function () {
  return _({
    class: 'absol-static-tabbar',
    extendEvent: 'change',
    child: [{
      class: 'absol-static-tabbar-active-box',
      child: '.absol-static-tabbar-hline'
    }]
  });
};

StaticTabbar.prototype.fireChange = function (data) {
  this.emit('change', {
    target: this,
    data,
    value: this.value
  }, self);
};

StaticTabbar.property = {};
StaticTabbar.property.items = {
  set: function (value) {
    this.$buttons.forEach(function (e) {
      e.remove();
    });
    this._items = value;
    var self = this;
    this.$buttons = this.items.map(function (tab) {
      var ident = tab.value || (0, _stringGenerate.randomIdent)();

      var button = _({
        tag: 'button',
        class: 'absol-static-tabbar-button',
        id: 'tab-' + ident,
        child: {
          tag: 'span',
          child: {
            text: tab.text
          }
        },
        on: {
          click: function (event) {
            if (self.value != tab.value) {
              self.value = ident;
              self.fireChange(tab);
            }
          }
        }
      }).addTo(self);

      self._btDict[ident] = button;
      return button;
    });

    if (this.value !== undefined) {
      this.sync.then(this.activeTab.bind(this, this.value));
    }
  },
  get: function () {
    return this._items || [];
  }
};
StaticTabbar.property.value = {
  set: function (value) {
    this._value = value;

    if (this.$buttons.length > 0) {
      this.sync.then(this.activeTab.bind(this, value));
    }
  },
  get: function () {
    return this._value;
  }
};

StaticTabbar.prototype.activeTab = function (ident) {
  if (this._activedButton) this._activedButton.removeClass('active');
  var button = this._btDict[ident];
  this._activedButton = button;

  if (button) {
    button.addClass('active');
    var bound = this.getBoundingClientRect();
    var buttonBound = button.getBoundingClientRect();
    var dx = buttonBound.left - bound.left;
    var fontSize = this.getFontSize();
    this.$activeBox.addStyle({
      left: dx / fontSize + 'em',
      width: buttonBound.width / fontSize + 'em'
    });
  } else {
    this.$activeBox.addStyle({
      left: '0',
      width: '0'
    });
  }
};

_ACore.default.install('statictabbar', StaticTabbar);

var _default = StaticTabbar;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Switch.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Switch.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/switch.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _CheckBoxInput = _interopRequireDefault(require("./CheckBoxInput"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function Switch() {
  var thisS = this;
  this.$input = $('input', this);
  this.$input.on('click', function (event) {
    thisS.emit('change', event, thisS);
  });

  _OOP.default.drillProperty(this, this.$input, 'checked');

  _OOP.default.drillProperty(this, this.$input, 'isOn', 'checked');

  this.on('click', function (event) {
    if (this.readOnly) event.preventDefault();
  }, true);
}

Switch.tag = 'switch';

Switch.render = function () {
  return _({
    tag: 'label',
    class: 'absol-switch',
    extendEvent: 'change',
    child: ['input[type="checkbox"]', 'span.absol-switch-slider']
  });
};

Switch.attribute = {
  checked: {
    set: function (value) {
      if (value == 'false' || value == null) {
        this.checked = false;
      } else {
        this.checked = true;
      }
    },
    get: function () {
      return this.checked ? 'true' : 'false';
    },
    remove: function () {
      this.checked = false;
    }
  },
  disabled: {
    set: function (value) {
      if (value == 'false' || value == null) {
        this.disabled = false;
      } else {
        this.disabled = true;
      }
    },
    get: function () {
      return this.disabled ? 'true' : 'false';
    },
    remove: function () {
      this.disabled = false;
    }
  }
};
Switch.property = {
  disabled: {
    set: function (value) {
      this.$input.disabled = !!value;

      if (value) {
        this.addClass('disabled');
      } else {
        this.removeClass('disabled');
      }
    },
    get: function () {
      return this.$input.disabled;
    }
  },
  readOnly: _CheckBoxInput.default.property.readOnly
};

_ACore.default.install('switch', Switch);

var _default = Switch;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tablescroller/TSLMoveTool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tablescroller/TSLMoveTool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Hanger = _interopRequireDefault(require("../Hanger"));

var _ACore = require("../../ACore");

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));


/***
 *
 * @param {TableScroller} elt
 * @constructor
 */
function TSLMoveTool(elt) {
  this.elt = elt;
  this.$table = null;
  Object.keys(TSLMoveTool.prototype).forEach(key => {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  });
  this.init();
}

TSLMoveTool.prototype.init = function () {
  this.elt = (0, _ACore._)({
    tag: _Hanger.default,
    elt: this.elt,
    on: {
      predrag: this.ev_preDrag,
      dragstart: this.ev_dragStart,
      drag: this.ev_drag,
      dragend: this.ev_dragEnd
    }
  });
};

TSLMoveTool.prototype.onAttachTable = function () {};

TSLMoveTool.prototype.ev_preDrag = function (event) {
  var e = event.target;
  var isOK = false;

  while (e && e.tagName !== 'TABLE') {
    if (e.classList && e.classList.contains('as-drag-zone')) {
      isOK = true;
      break;
    }

    e = e.parentElement;
  }

  if (isOK) {
    event.preventDefault();
  } else {
    event.cancel();
  }
};

TSLMoveTool.prototype._findRowIdx = function (y) {
  var newY = _Rectangle.default.fromClientRect(this.elt.$originTableBody.getBoundingClientRect()).y;

  var oldY = this.dragData.bodyBound.y;
  var dy = newY - oldY;
  var yArr = this.dragData.rowBounds.map(rect => rect.y + dy + rect.height / 2);
  if (this.dragData.rowBounds.length === 0) yArr.push(0);
  var low = 0;
  var high = yArr.length - 1;
  var mid0, mid1;

  while (low < high) {
    mid0 = low + high >> 1;
    mid1 = mid0 + 1;

    if (Math.abs(y - yArr[mid0]) < Math.abs(y - yArr[mid1])) {
      high = mid0;
    } else {
      low = mid1;
    }
  }

  return low;
};

TSLMoveTool.prototype.ev_dragStart = function (event) {
  var t = this.findRow(event.target);
  if (!t) return;
  this.elt.addClass('as-dragging');
  this.dragData = Object.assign({}, t);
  this.dragData.copy.addClass('as-dragging');
  this.dragData.original.addClass('as-dragging');

  var rowBound = _Rectangle.default.fromClientRect(this.dragData.original.getBoundingClientRect());

  var bodyBound = _Rectangle.default.fromClientRect(this.elt.$originTableBody.getBoundingClientRect());

  this.dragData.mouseOffset = event.currentPoint.sub(rowBound.A());
  this.dragData.rowIdx = Array.prototype.indexOf.call(this.elt.$originTableBody.childNodes, this.dragData.original);
  this.dragData.newRowIdx = this.dragData.rowIdx;
  this.dragData.rowBound = rowBound;
  this.dragData.bodyBound = bodyBound;
  this.dragData.rowOffset = rowBound.A().sub(bodyBound.A());
  this.dragData.rowBounds = Array.prototype.map.call(this.elt.$originTableBody.childNodes, elt => _Rectangle.default.fromClientRect(elt.getBoundingClientRect()));
};

TSLMoveTool.prototype.ev_drag = function (event) {
  if (!this.dragData) return;

  var bodyBound = _Rectangle.default.fromClientRect(this.elt.$originTableBody.getBoundingClientRect());

  var rowA = bodyBound.A().add(this.dragData.rowOffset);
  var rowTransformed = event.currentPoint.sub(this.dragData.mouseOffset);
  var transform = rowTransformed.sub(rowA);
  var originalRow = this.dragData.original;
  originalRow.addStyle('transform', `translate(0, ${transform.y}px )`);
  this.dragData.copy.addStyle('transform', `translate(0, ${transform.y}px )`);
  this.dragData.hiddenCells = Array.prototype.filter.call(this.dragData.original.childNodes, e => e.tagName === 'TD').slice(0, this.elt.fixedCol);
  this.dragData.hiddenCells.forEach(e => (0, _ACore.$)(e).addClass('as-transparent-fix'));

  var newIdx = this._findRowIdx(rowTransformed.y + this.dragData.rowBound.height / 2);

  this.dragData.newRowIdx = newIdx;
  var rows = this.elt.$originTableBody.childNodes;
  var curIdx = this.dragData.rowIdx; // var copyRows = this.elt.$f

  var rowBound = this.dragData.rowBound;
  rows.forEach((elt, i) => {
    if (elt === originalRow) return;
    var copyElt = this.elt.leftCopyRows[elt.getAttribute('data-id')];
    var dy = 0;

    if (i >= Math.min(newIdx, curIdx) && i <= Math.max(newIdx, curIdx)) {
      if (i > curIdx && i <= newIdx) {
        dy = -rowBound.height;
      } else if (i >= newIdx && i < curIdx) {
        dy = rowBound.height;
      }
    }

    elt.addStyle('transform', `translate(0, ${dy}px)`);
    copyElt.addStyle('transform', `translate(0, ${dy}px)`);
  });
};

TSLMoveTool.prototype.ev_dragEnd = function (event) {
  this.dragData.original.removeStyle('transform');
  this.dragData.copy.removeStyle('transform');
  this.dragData.copy.removeClass('as-dragging');
  this.dragData.original.removeClass('as-dragging');
  this.elt.removeClass('as-dragging');
  this.elt.removeClass('as-has-new-pos');
  this.dragData.hiddenCells.forEach(e => e.removeClass('as-transparent-fix'));
  var rows = this.elt.$originTableBody.childNodes;
  rows.forEach(elt => {
    var copyElt = this.elt.leftCopyRows[elt.getAttribute('data-id')];
    elt.addStyle('transform', 'translate(0, 0)');
    copyElt.addStyle('transform', 'translate(0, 0)');
  });
  var at, copyAt;

  if (this.dragData.newRowIdx !== this.dragData.rowIdx) {
    at = rows[this.dragData.newRowIdx];
    copyAt = this.elt.leftCopyRows[at.attr('data-id')];

    if (this.dragData.rowIdx < this.dragData.newRowIdx) {
      (0, _ACore.$)(at.parentElement).addChildAfter(this.dragData.original, at);
      (0, _ACore.$)(copyAt.parentElement).addChildAfter(this.dragData.copy, copyAt);
    } else {
      (0, _ACore.$)(at.parentElement).addChildBefore(this.dragData.original, at);
      (0, _ACore.$)(copyAt.parentElement).addChildBefore(this.dragData.copy, copyAt);
    }

    this.elt.reindexRows();
    this.elt.emit('orderchange', {
      target: this.elt,
      from: this.dragData.rowIdx,
      to: this.dragData.newRowIdx
    }, this.elt);
  }
};

TSLMoveTool.prototype.findRow = function (fromElt) {
  var e = fromElt;
  var rowElt;

  while (e) {
    if (e.tagName === 'TR') {
      rowElt = e;
      break;
    }

    e = e.parentElement;
  }

  if (!rowElt) return null;
  var id = rowElt.getAttribute('data-id');
  return {
    original: (0, _ACore.$)(this.elt.originalRows[id]),
    copy: (0, _ACore.$)(this.elt.leftCopyRows[id])
  };
};

var _default = TSLMoveTool;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tablescroller/TableScroller.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tablescroller/TableScroller.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/tablescroller.css");

var _ACore = _interopRequireDefault(require("../../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _TSLMoveTool = _interopRequireDefault(require("./TSLMoveTool"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _utils = require("../utils");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));


var $ = _ACore.default.$;
var _ = _ACore.default._;

var sliceCellArray = (cells, start, end) => {
  if (typeof start !== "number") start = 0;
  if (typeof end !== "number") start = Infinity;
  var res = [];
  cells = cells.slice();
  var cell, colSpan;
  var n = 0;

  while (cells.length > 0) {
    cell = cells.shift();
    colSpan = parseInt(cell.getAttribute('colspan') || '1') || 1;
    n += colSpan;
    if (n > start && n <= end) res.push(cell);
  }

  return res;
};
/***
 * @extends {AElement}
 * @constructor
 */


function TableScroller() {
  this.$originCtn = $('.as-table-scroller-origin-table-ctn', this);
  this.$originTable = undefined;
  this.$originContent = undefined;
  this.$fixedYHeaderScroller = $('.as-table-scroller-fixed-y-header-scroller', this);
  this.$fixedYHeader = $('.as-table-scroller-fixed-y-header', this);
  this.$fixedXYHeader = $('.as-table-scroller-fixed-xy-header', this);
  this.$fixXCol = $('.as-table-scroller-fixed-x-col', this);
  this.$attachHook = $('attachhook', this);
  this.$attachHook.requestUpdateSize = this.updateContentSize.bind(this);
  this.$attachHook.on('attached', function () {
    _Dom.default.addToResizeSystem(this);
  });
  this.$domSignal = _('attachhook');
  this.appendChild(this.$domSignal);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('requestUpdateContent', this.updateContent.bind(this));
  this.$vscrollbar = $('.absol-table-scroller-vscrollbar-container vscrollbar', this);
  this.$hscrollbar = $('.absol-table-scroller-hscrollbar-container hscrollbar', this);
  this.$vscroller = $('.as-table-scroller-vertical-scroller', this);
  this.$hscroller = $('.as-table-scroller-horizontal-scroller', this);
  this.$leftLine = $('.absol-table-scroller-left-line', this).addStyle('display', 'none');
  this.$headLine = $('.absol-table-scroller-head-line', this);
  this.scrollCtr = new ScrollController(this);
  this.moveTool = new _TSLMoveTool.default(this);
  this._swappedPairs = [];
  this.originalRows = {};
  this.leftCopyRows = {};
  /***
   * @name fixedCol
   * @type {number}
   * @memberOf TableScroller#
   */
}

TableScroller.tag = 'TableScroller'.toLowerCase();

TableScroller.render = function () {
  return _({
    class: 'absol-table-scroller',
    extendEvent: ['orderchange', 'preupdatesize', 'sizeupdated'],
    child: [{
      class: 'absol-table-scroller-content',
      child: [{
        class: 'as-table-scroller-vertical-scroller',
        child: [{
          class: 'as-table-scroller-horizontal-scroller-viewport',
          child: [{
            class: 'as-table-scroller-fixed-x-col-ctn',
            child: {
              tag: 'table',
              class: 'as-table-scroller-fixed-x-col'
            }
          }, {
            class: 'as-table-scroller-horizontal-scroller',
            child: [{
              class: 'as-table-scroller-origin-table-ctn'
            }]
          }]
        }]
      }, {
        class: 'as-table-scroller-fixed-y-header-ctn',
        child: {
          class: 'as-table-scroller-fixed-y-header-scroller',
          child: {
            tag: 'table',
            class: 'as-table-scroller-fixed-y-header'
          }
        }
      }, {
        class: 'as-table-scroller-fixed-xy-header-ctn',
        child: {
          tag: 'table',
          class: 'as-table-scroller-fixed-xy-header'
        }
      }, '.absol-table-scroller-viewport', '.absol-table-scroller-fixed-viewport', //place holder
      {
        class: 'absol-table-scroller-header-hscroller',
        child: '.absol-table-scroller-header-hscroller-viewport'
      }, {
        class: 'absol-table-scroller-left-vscroller',
        child: '.absol-table-scroller-left-vscroller-viewport'
      }, '.absol-table-scroller-head-line', '.absol-table-scroller-left-line']
    }, {
      class: 'absol-table-scroller-vscrollbar-container',
      child: {
        tag: 'vscrollbar'
      }
    }, {
      class: 'absol-table-scroller-hscrollbar-container',
      child: {
        tag: 'hscrollbar'
      }
    }, 'attachhook']
  });
};

TableScroller.scrollSize = 17; //default 

_Dom.default.getScrollSize().then(function (size) {
  TableScroller.scrollSize = size.width; //default scroller

  TableScroller.$style = _('style[id="table-scroller-css"]').addTo(document.head);
  TableScroller.$style.innerHTML = ['body .absol-table-scroller {', '    --scrollbar-width: ' + (size.width + 0) + 'px', '}'].join('\n');

  _Dom.default.updateResizeSystem();

  setTimeout(_Dom.default.updateResizeSystem.bind(_Dom.default), 30); // css load delay
});

TableScroller.eventHandler = {};

TableScroller.prototype.clearChild = function () {
  this.$fixXCol.clearChild();
  this.$fixedYHeader.clearChild();
  this.$fixedXYHeader.clearChild();
  this.$originTable = null;
  return this;
};

TableScroller.prototype.addChild = function (elt) {
  if (this.$originTable) {
    throw new Error('Only one table is accepted!');
  }

  this.$originContent = elt;
  this.$originTable = $('table', this.$originContent);
  this.$originCtn.addChild(this.$originTable);
  this.requestUpdateContent();
};

TableScroller.prototype._revertWrapped = function () {
  var pair;

  while (this._swappedPairs.length > 0) {
    pair = this._swappedPairs.pop();
    (0, _utils.swapChildrenInElt)(pair[0], pair[1]);
  }
};

TableScroller.prototype._makeDataIdent = function () {
  this.originalRows = {};
  Array.prototype.slice.call(this.$originTableBody.childNodes).forEach((elt, i) => {
    var id;

    if (elt.tagName === 'TR') {
      id = elt.getAttribute('data-id') || (0, _stringGenerate.randomIdent)(12) + '_' + i;
      elt.setAttribute('data-id', id);
      this.originalRows[id] = $(elt);
    } else {
      elt.remove();
    }
  });
};

TableScroller.prototype._updateFixedYHeader = function () {
  var head = $(this.$originTableThead.cloneNode(false));
  var headRows = Array.prototype.filter.call(this.$originTableThead.childNodes, elt => elt.tagName === 'TR').map(tr => {
    var copyTr = $(tr.cloneNode(false));
    copyTr.$origin = tr;
    var cells = Array.prototype.filter.call(tr.childNodes, elt => elt.tagName === 'TH' || elt.tagName === 'TD').map(td => $(Object.assign(td.cloneNode(true), {
      $origin: td
    })));
    copyTr.addChild(cells);
    sliceCellArray(cells, this.fixedCol).forEach(elt => {
      (0, _utils.swapChildrenInElt)(elt, elt.$origin);

      this._swappedPairs.push([elt, elt.$origin]);
    });
    return copyTr;
  });
  head.addChild(headRows);
  this.$fixedYHeader.clearChild().addChild(head);
  this.$fixedYHeader.attr('class', this.$originTable.attr('class')).addClass('as-table-scroller-fixed-y-header');
};

TableScroller.prototype._updateFixedYHeaderSize = function () {
  var bound = this.$originTable.getBoundingClientRect();
  this.$fixedYHeader.addStyle('width', bound.width + 'px');
  Array.prototype.forEach.call(this.$fixedYHeader.firstChild.firstChild.childNodes, elt => {
    elt.addStyle('width', elt.$origin.getBoundingClientRect().width + 'px');
  });
  this.$headLine.addStyle('top', this.$fixedYHeader.getBoundingClientRect().height - 1 + 'px');
};

TableScroller.prototype._updateFixedXCol = function () {
  this.$fixXCol.clearChild();
  var head = $(this.$originTableThead.cloneNode(false));
  var headRows = Array.prototype.filter.call(this.$originTableThead.childNodes, elt => elt.tagName === 'TR').map(tr => {
    var copyTr = $(tr.cloneNode(false));
    copyTr.$origin = tr;
    var cells = Array.prototype.filter.call(tr.childNodes, elt => elt.tagName === 'TH' || elt.tagName === 'TD');
    cells = sliceCellArray(cells, 0, this.fixedCol).map(td => $(Object.assign(td.cloneNode(true), {
      $origin: td
    })));
    copyTr.addChild(cells);
    return copyTr;
  });
  head.addChild(headRows);
  var body = $(this.$originTableBody.cloneNode());
  var rows = Array.prototype.filter.call(this.$originTableBody.childNodes, elt => elt.tagName === 'TR').map(tr => {
    var copyTr = $(tr.cloneNode(false));
    copyTr.$origin = tr;
    var id = copyTr.attr('data-id');
    this.leftCopyRows[id] = copyTr;
    var cells = Array.prototype.filter.call(tr.childNodes, elt => elt.tagName === 'TH' || elt.tagName === 'TD');
    cells = sliceCellArray(cells, 0, this.fixedCol).map(td => $(Object.assign(td.cloneNode(true), {
      $origin: td
    })));
    cells.forEach(elt => {
      (0, _utils.swapChildrenInElt)(elt, elt.$origin);

      this._swappedPairs.push([elt, elt.$origin]);
    });
    copyTr.addChild(cells);
    return copyTr;
  });
  body.addChild(rows);
  this.$fixXCol.addChild(head).addChild(body);
  this.$fixXCol.attr('class', this.$originTable.attr('class')).addClass('as-table-scroller-fixed-x-col');
};

TableScroller.prototype._updateFixedXColSize = function () {
  if (this.fixedCol === 0) return;
  var bound = this.$originTable.getBoundingClientRect();
  this.$fixXCol.addStyle('height', bound.height + 'px');
  Array.prototype.forEach.call(this.$fixXCol.firstChild.childNodes, elt => {
    elt.addStyle('height', elt.$origin.getBoundingClientRect().height + 'px');
  });
  Array.prototype.forEach.call(this.$fixXCol.firstChild.firstChild.childNodes, elt => {
    elt.addStyle('width', elt.$origin.getBoundingClientRect().width + 'px');
  });
  Array.prototype.forEach.call(this.$fixXCol.lastChild.childNodes, elt => {
    elt.addStyle('height', elt.$origin.getBoundingClientRect().height + 'px');
  });
};

TableScroller.prototype._updateFixedXYHeader = function () {
  var head = $(this.$originTableThead.cloneNode(false));
  var headRows = Array.prototype.filter.call(this.$originTableThead.childNodes, elt => elt.tagName === 'TR').map(tr => {
    var copyTr = _('tr');

    copyTr.$origin = tr;
    var cells = Array.prototype.filter.call(tr.childNodes, elt => elt.tagName === 'TH' || elt.tagName === 'TD');
    cells = sliceCellArray(cells, 0, this.fixedCol).map(td => $(Object.assign(td.cloneNode(true), {
      $origin: td
    })));
    copyTr.addChild(cells);
    cells.forEach(cell => {
      (0, _utils.swapChildrenInElt)(cell, cell.$origin);

      this._swappedPairs.push([cell, cell.$origin]);
    });
    return copyTr;
  });
  head.addChild(headRows);
  this.$fixedXYHeader.clearChild().addChild(head);
  this.$fixedXYHeader.attr('class', this.$originTable.attr('class')).addClass('as-table-scroller-fixed-xy-header');
};

TableScroller.prototype._updateFixedXYHeaderSize = function () {
  Array.prototype.forEach.call(this.$fixedXYHeader.firstChild.childNodes, elt => {
    elt.addStyle('height', elt.$origin.getBoundingClientRect().height + 'px');
  });
  Array.prototype.forEach.call(this.$fixedXYHeader.firstChild.firstChild.childNodes, elt => {
    elt.addStyle('width', elt.$origin.getBoundingClientRect().width + 'px');
  });
  this.$leftLine.addStyle('left', this.$fixedXYHeader.getBoundingClientRect().width - 1 + 'px');
};

TableScroller.prototype.updateContent = function () {
  if (!this.$originTable) return;

  this._revertWrapped();

  this.$originTableThead = $('thead', this.$originTable);
  this.$originTableBody = $('tbody', this.$originTable);

  this._makeDataIdent();

  this._updateFixedYHeader();

  this._updateFixedXCol();

  this._updateFixedXYHeader();

  this.reindexRows();
  this.updateContentSize();
};

TableScroller.prototype._updateScrollStatus = function () {
  var bound = this.getBoundingClientRect();
  var tableBound = this.$originTable.getBoundingClientRect();

  if (bound.width < tableBound.width) {
    this.addClass('as-scroll-horizontal');
    this.$vscrollbar.outerHeight = bound.height - 17;
  } else {
    this.$vscrollbar.outerHeight = bound.height;
    this.removeClass('as-scroll-horizontal');
  }

  if (bound.height < tableBound.height) {
    this.addClass('as-scroll-vertical');
    this.$hscrollbar.outerWidth = bound.width - 17;
  } else {
    this.$hscrollbar.outerWidth = bound.width;
    this.removeClass('as-scroll-vertical');
  }

  this.$vscrollbar.innerHeight = tableBound.height;
  this.$hscrollbar.innerWidth = tableBound.width;
};

TableScroller.prototype.updateContentSize = function () {
  if (!this.$originTable) return;

  this._updateScrollStatus();

  this._updateFixedYHeaderSize();

  this._updateFixedXColSize();

  this._updateFixedXYHeaderSize();
};

TableScroller.prototype.reindexRows = function () {
  if (!this.$originTableBody) return;
  Array.prototype.filter.call(this.$originTableBody.childNodes, elt => elt.tagName === 'TR').forEach((elt, i) => {
    if (elt.$idx === null) return;
    elt.$idx = elt.$idx || $('.as-table-scroller-row-index', elt) || null;
    if (elt.$idx) elt.$idx.attr('data-idx', i + 1);
  });
  Array.prototype.forEach.call(this.$fixXCol.lastChild.childNodes, (elt, i) => {
    if (elt.$idx === null) return;
    elt.$idx = elt.$idx || $('.as-table-scroller-row-index', elt) || null;
    if (elt.$idx) elt.$idx.attr('data-idx', i + 1);
  });
};

TableScroller.prototype.removeRow = function (row) {
  if ($(row).isDescendantOf(this)) {
    row.remove();
    this.requestUpdateContent();
  }

  return this;
};

TableScroller.prototype.addRowBefore = function (row, bf) {
  if (!this.$originTableBody) return this;
  this.$originTableBody.addChildBefore(row, bf);
  this.requestUpdateContent();
  return this;
};

TableScroller.prototype.addRowAfter = function (row, at) {
  if (!this.$originTableBody) return this;
  this.$originTableBody.addChildAfter(row, at);
  this.requestUpdateContent();
  return this;
};

TableScroller.prototype.requestUpdateContent = function () {
  this.domSignal.emit('requestUpdateContent');
};

TableScroller.property = {};
TableScroller.property.fixedCol = {
  set: function (value) {
    value = value || 0;
    this._fixedCol = value;
    if (value === 0) this.$leftLine.addStyle('display', 'none');else this.$leftLine.removeStyle('display');
    this.requestUpdateContent(); // this.$domSignal.emit('requestUpdateContent');
  },
  get: function () {
    return this._fixedCol || 0;
  }
};

_ACore.default.install(TableScroller);

var _default = TableScroller;
/***
 *
 * @param {TableScroller} elt
 * @constructor
 */

exports.default = _default;

function ScrollController(elt) {
  this.elt = elt;
  Object.keys(this.constructor.prototype).filter(k => k.startsWith('ev_')).forEach(k => this[k] = this[k].bind(this));
  this.vscrollTarget = null;
  this.hscrollTarget = null;
  this.elt.$vscroller.on('scroll', this.ev_vScrollerScroll);
  this.elt.$vscrollbar.on('scroll', this.ev_vScrollbarScroll);
  this.elt.$hscroller.on('scroll', this.ev_hScrollerScroll);
  this.elt.$hscrollbar.on('scroll', this.ev_hScrollbarScroll);
  this.elt.$fixedYHeaderScroller.on('scroll', this.ev_fixedYHeaderScroll);
}

ScrollController.prototype.ev_vScrollerScroll = function (event) {
  var now = new Date().getTime();
  if (this.vscrollTarget && now - this.vscrollTarget.time < 100 && this.vscrollTarget.elt !== this.elt.$vscroller) return;
  this.elt.$vscrollbar.innerOffset = this.elt.$vscroller.scrollTop;
  this.vscrollTarget = {
    time: now,
    elt: this.elt.$vscroller
  };
};

ScrollController.prototype.ev_vScrollbarScroll = function (event) {
  var now = new Date().getTime();
  if (this.vscrollTarget && now - this.vscrollTarget.time < 100 && this.vscrollTarget.elt !== this.elt.$vscrollbar) return;
  this.elt.$vscroller.scrollTop = this.elt.$vscrollbar.innerOffset;
  this.vscrollTarget = {
    time: now,
    elt: this.elt.$vscrollbar
  };
};

ScrollController.prototype.ev_hScrollerScroll = function (event) {
  var now = new Date().getTime();
  if (this.hscrollTarget && now - this.hscrollTarget.time < 100 && this.hscrollTarget.elt !== this.elt.$hscroller) return;
  this.elt.$hscrollbar.innerOffset = this.elt.$hscroller.scrollLeft;
  this.elt.$fixedYHeaderScroller.scrollLeft = this.elt.$hscroller.scrollLeft;
  this.hscrollTarget = {
    time: now,
    elt: this.elt.$hscroller
  };
};

ScrollController.prototype.ev_fixedYHeaderScroll = function (event) {
  var now = new Date().getTime();
  if (this.hscrollTarget && now - this.hscrollTarget.time < 100 && this.hscrollTarget.elt !== this.elt.$fixedYHeaderScroller) return;
  this.elt.$hscrollbar.innerOffset = this.elt.$fixedYHeaderScroller.scrollLeft;
  this.elt.$hscroller.scrollLeft = this.elt.$fixedYHeaderScroller.scrollLeft;
  this.hscrollTarget = {
    time: now,
    elt: this.elt.$fixedYHeaderScroller
  };
};

ScrollController.prototype.ev_hScrollbarScroll = function (event) {
  var now = new Date().getTime();
  if (this.hscrollTarget && now - this.hscrollTarget.time < 100 && this.hscrollTarget.elt !== this.elt.$hscrollbar) return;
  this.elt.$hscroller.scrollLeft = this.elt.$hscrollbar.innerOffset >> 0;
  this.vscrollTarget = {
    time: now,
    elt: this.elt.$hscrollbar
  };
};
};

moduleFactories["node_modules/absol-acomp/js/TableVScroller.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TableVScroller.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/tablevscroller.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _utils = require("./utils");




var _ = _ACore.default._;
var $ = _ACore.default.$;

function TableVScroller() {
  var thisTS = this;
  this.$attachHook = $('attachhook', this);

  this.$attachHook.updateSize = () => {
    this.updateStyle();
    this.updateSize();
  };

  this.sync = new Promise(function (rs) {
    thisTS.$attachHook.on('attached', rs);
  });
  this.$viewport = $('.absol-table-vscroller-viewport', this);
  this.$attachHook.on('attached', function () {
    _Dom.default.addToResizeSystem(thisTS.$attachHook);

    this.updateSize();
  });
  this.$topTable = $('.absol-table-vscroller-head', this);
  this.$headLine = $('.absol-table-vscroller-head-line', this);
  this.swappedContentPairs = [];
}

TableVScroller.tag = 'TableVScroller'.toLowerCase();

TableVScroller.render = function () {
  return _({
    class: 'absol-table-vscroller',
    child: ['.absol-table-vscroller-viewport', 'table.absol-table-vscroller-head', '.absol-table-vscroller-head-line', 'attachhook']
  });
};

TableVScroller.prototype.clearChild = function () {
  this.$viewport.clearChild();
  this.$topTable.clearChild();
};

TableVScroller.prototype.addChild = function (elt) {
  if (this.$viewport.childNodes.length == 0) {
    this.$table = $('table', elt);

    if (this.$table) {
      this.$viewport.addChild(elt);
      this.update();
    } else {
      throw new Error('Element must be a table!');
    }
  } else {
    throw new Error("Only 1 table accepted!");
  }
};

TableVScroller.prototype._trackBackgroundColor = function (element) {
  var current = this.$thead;
  var res;

  while (current && !res && res != 'rgba(0, 0, 0, 0)') {
    res = window.getComputedStyle(element).getPropertyValue('background-color');
    current = current.parentNode;
  }

  if (res == 'rgba(0, 0, 0, 0)') return 'white';
  return res;
};

TableVScroller.prototype.updateStyle = function () {
  if (!this.$thead) return;
  var clazz = this.$table.attr('class');

  if (clazz) {
    clazz = clazz.trim().split(/\s+/);

    for (var i = 0; i < clazz.length; ++i) {
      this.$topTable.addClass(clazz[i]);
    }
  }

  var bgColor = this._trackBackgroundColor(this.$thead);

  this.$topTable.addStyle('background-color', bgColor);
};

TableVScroller.prototype.updateSize = function () {
  if (!this.$thead) return;
  var theadBound = this.$thead.getBoundingClientRect();
  var tableBound = this.$table.getBoundingClientRect();
  this.$topTable.addStyle({
    width: tableBound.width + 'px',
    height: theadBound.height + 'px'
  });
  this.$headLine.addStyle({
    top: theadBound.height + 'px',
    maxWidth: tableBound.width + 'px'
  });

  if (this.$viewport.clientHeight < this.$viewport.scrollHeight) {
    this.addClass('scroll-v');
  } else {
    this.removeClass('scroll-v');
  }

  var realNodes = this.$tr.childNodes;
  var topNodes = this.$topTr.childNodes;
  var widthStyle;
  var displayStyle;

  for (var i = 0; i < realNodes.length; ++i) {
    if (!realNodes[i].tagName) continue;
    widthStyle = $(realNodes[i]).getComputedStyleValue('width');
    displayStyle = realNodes[i].getComputedStyleValue('display');

    if (!widthStyle) {
      widthStyle = realNodes[i].getBoundingClientRect().width;

      if (!widthStyle) {
        displayStyle = 'none';
      }

      widthStyle += 'px';
    } // console.trace(getAncestorElementOf(realNodes[i]), widthStyle, displayStyle)


    $(topNodes[i]).attr('style', realNodes[i].attr('style')).addStyle('width', widthStyle).addStyle('display', displayStyle);
  }

  this.$topTable.removeStyle('display');
};

TableVScroller.prototype.updateContent = function () {
  this.swappedContentPairs.forEach((originElt, copyElt) => {
    this.swappedContentPairs.push([originElt, copyElt]);
  });
  this.swappedContentPairs = [];
  var elt = this.$table;
  this.$thead = $('thead', elt);
  this.$tr = $('tr', this.$thead);
  this.$topThead = (0, _Dom.depthClone)(this.$thead, (originElt, copyElt) => {
    if (originElt.tagName === 'TH') {
      (0, _utils.swapChildrenInElt)(originElt, copyElt);
      this.swappedContentPairs.push([originElt, copyElt]);
    }
  });
  this.$topTr = $('tr', this.$topThead);
  this.$topTable.clearChild().addChild(this.$topThead).addStyle('display', 'none');
};

TableVScroller.prototype.update = function () {
  if (!this.$table) return;
  this.updateContent();
  this.updateStyle();
  this.updateSize();
};

_ACore.default.install(TableVScroller);

var _default = TableVScroller;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/list/search.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/list/search.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = prepareSearchForItem;
exports.prepareSearchForList = prepareSearchForList;
exports.calcItemMatchScore = calcItemMatchScore;
exports.searchListByText = searchListByText;
exports.searchTreeListByText = searchTreeListByText;

var _stringFormat = require("absol/src/String/stringFormat");

var _stringMatching = require("absol/src/String/stringMatching");

var UNCASE_MATCH_SCORE = 4;
var UVN_MATCH_SCORE = 3;
var EXTRA_MATCH_SCORE = 9;
var NVN_EXTRA_MATCH_SCORE = 8;
var EQUAL_MATCH_SCORE = 10;
var WORD_MATCH_SCORE = 3;
var HAS_WORD_SCORE = 30;
var HAS_NVN_WORD_SCORE = 29;
/***
 *
 * @param {SelectionItem} item
 * @returns {*}
 */

function prepareSearchForItem(item) {
  if (!item.text || !item.text.charAt) item.text = item.text + '';
  var spliter = /\s+/;

  var __text__ = item.text.replace(/([\s\b\-()\[\]"']|&#8239;|&nbsp;|&#xA0;|\s")+/g, ' ').trim().toLowerCase();

  var __words__ = __text__.split(spliter);

  __text__ = __words__.join(' ');

  var __wordDict__ = __words__.reduce((ac, cr, i) => {
    ac[cr] = ac[cr] || i + 1;
    return ac;
  }, {});

  var __textNoneCase__ = __text__;

  var __nvnText__ = (0, _stringFormat.nonAccentVietnamese)(__text__);

  var __nvnTextNoneCase__ = __nvnText__;

  var __nvnWordDict__ = __words__.reduce((ac, cr, i) => {
    ac[cr] = ac[cr] || i + 1;
    return ac;
  }, {});

  Object.defineProperties(item, {
    __text__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __text__
    },
    __words__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __text__.split(spliter)
    },
    __wordDict__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __wordDict__
    },
    __textNoneCase__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __textNoneCase__
    },
    __wordsNoneCase__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __textNoneCase__.split(spliter)
    },
    __nvnText__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __nvnText__
    },
    __nvnWords__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __nvnText__.split(spliter)
    },
    __nvnWordDict__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __nvnWordDict__
    },
    __nvnTextNoneCase__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __nvnTextNoneCase__
    },
    __nvnWordsNoneCase__: {
      configurable: true,
      enumerable: false,
      writable: true,
      value: __nvnTextNoneCase__.split(spliter)
    }
  });
  return item;
}

function prepareSearchForList(items) {
  var item;

  for (var i = 0; i < items.length; ++i) {
    if (typeof items[i] == 'string') {
      items[i] = {
        text: items[i],
        value: items[i]
      };
    }

    item = items[i];
    prepareSearchForItem(item);
    if (item.items) prepareSearchForList(item.items);
  }

  return items;
}

function calcItemMatchScore(queryItem, item) {
  var score = 0;
  if (!item.__text__) return 0;
  var hwScore = 0;
  var i;

  for (i = 0; i < queryItem.__words__.length; ++i) {
    if (item.__wordDict__[queryItem.__words__[i]]) {
      hwScore += HAS_WORD_SCORE;
    } else if (item.__nvnWordDict__[queryItem.__nvnWords__[i]]) {
      hwScore += HAS_NVN_WORD_SCORE;
    }
  }

  score = hwScore;

  if (item.__text__ === queryItem.__text__) {
    score += EQUAL_MATCH_SCORE;
  }

  var extraIndex = item.__text__.indexOf(queryItem.__text__);

  if (extraIndex >= 0) {
    score += EXTRA_MATCH_SCORE;
  }

  extraIndex = item.__nvnText__.indexOf(queryItem.__nvnText__);

  if (extraIndex >= 0) {
    score += EXTRA_MATCH_SCORE;
  }

  var n = Math.max(queryItem.__words__.length + 1, 1);
  score = Math.max(score, (0, _stringMatching.wordsMatch)(queryItem.__words__, item.__words__), (0, _stringMatching.wordsMatch)(queryItem.__nvnWords__, item.__nvnWords__)) / n * 2 * WORD_MATCH_SCORE;
  return score;
}
/***
 *
 * @param  {String} query
 * @param {Array<SelectionItem>} items
 */


function searchListByText(query, items) {
  query = (query || '').trim();
  if (query.length == 0 || items.length == 0) return items;
  var queryItem = prepareSearchForItem({
    text: query
  });
  var its = items.map(function (item) {
    return {
      item: item,
      score: calcItemMatchScore(queryItem, item)
    };
  });
  its.sort(function (a, b) {
    if (b.score - a.score == 0) {
      if (b.item.__nvnText__ > a.item.__nvnText__) return -1;
      return 1;
    }

    return b.score - a.score;
  });
  var midValue = (its[0].score + its[its.length - 1].score) / 2;
  if (midValue === 0) midValue += 0.1;
  if (midValue < 1) midValue = 1;
  return its.filter(function (it) {
    return it.score >= midValue;
  }).map(function (it) {
    return it.item;
  });
}
/***
 *
 * @param  {String} query
 * @param {Array<SelectionItem>} items
 */


function searchTreeListByText(query, items) {
  query = (query || '').trim();
  if (query.length == 0 || items.length == 0) return items;
  var queryItem = prepareSearchForItem({
    text: query
  });
  var gmaxScore = 0;
  var gminScore = 1000;

  function makeScoreRecursive(item) {
    var score = calcItemMatchScore(queryItem, item);
    gmaxScore = Math.max(score, gmaxScore);
    gminScore = Math.min(score, gminScore);
    var children = (item.items || []).map(function (item) {
      return makeScoreRecursive(item);
    });
    var maxScore = children.reduce(function (ac, cr) {
      return Math.max(ac, cr.maxScore);
    }, score);
    return {
      score: score,
      maxScore: maxScore,
      item: item,
      children: children
    };
  }

  function sortcmp(a, b) {
    return b.maxScore - a.maxScore;
  }

  function filterItems(nodes, medScore) {
    nodes.sort(sortcmp);
    return nodes.filter(function (node) {
      return node.maxScore >= medScore;
    }).map(function (node) {
      var res;

      if (typeof node.item == 'string') {
        res = node.item;
      } else {
        res = Object.assign({}, node.item);
        res.ref = node.item;

        if (node.children && node.children.length > 0) {
          res.items = filterItems(node.children, medScore);
          if (res.items.length == 0) delete res.items;
        }
      }

      return res;
    });
  }

  var scoredItems = items.map(makeScoreRecursive);
  var medianScore = (gminScore + gmaxScore) / 2;
  var items = filterItems(scoredItems, medianScore);
  return items;
}
};

moduleFactories["node_modules/absol-acomp/js/SelectMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/selectmenu.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _search = require("./list/search");

var _SelectList = _interopRequireDefault(require("./SelectList"));


/*global absol*/
var _ = _ACore.default._;
var $ = _ACore.default.$;

_ACore.default.creator['dropdown-ico'] = function () {
  return _(['<svg class="dropdown" width="100mm" height="100mm" version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">', '<g transform="translate(0,-197)">', '<path d="m6.3152 218.09a4.5283 4.5283 0 0 0-3.5673 7.3141l43.361 55.641a4.5283 4.5283 0 0 0 7.1421 7e-3l43.496-55.641a4.5283 4.5283 0 0 0-3.5673-7.3216z" />', '</g>', '</svg>'].join(''));
};

function SelectMenu() {
  var thisSM = this;
  this._items = [];
  this._value = null;
  this._lastValue = null;
  this.$holderItem = $('.absol-selectmenu-holder-item', this);
  this.$anchorCtn = SelectMenu.getAnchorCtn();
  this.$anchor = _('.absol-selectmenu-anchor.absol-disabled').addTo(this.$anchorCtn);
  this.$anchorContentCtn = _('.absol-selectmenu-anchor-content-container').addTo(this.$anchor);
  this.$dropdownBox = _('.absol-selectmenu-dropdown-box').addTo(this.$anchorContentCtn);
  this.$searchTextInput = _('searchtextinput').addStyle('display', 'none').addTo(this.$dropdownBox);
  this.$vscroller = _('bscroller').addTo(this.$dropdownBox);
  this.$selectlist = _('selectlist', this).addTo(this.$vscroller).on('sizechangeasync', this.eventHandler.listSizeChangeAsync).on('valuevisibilityasync', this.eventHandler.listValueVisibility);
  this.$scrollTrackElts = [];
  this.$removableTrackElts = [];
  this._itemsByValue = {};
  this.$searchTextInput.on('stoptyping', this.eventHandler.searchModify);
  this._searchCache = {};
  this.$selectlist.on('pressitem', this.eventHandler.selectlistPressItem, true);
  this.$selectlist.on('pressitem', function () {
    thisSM.isFocus = false;
  }, true);
  this._lastValue = "NOTHING_VALUE";
  this._resourceReady = true;
  this.on('mousedown', this.eventHandler.click, true);
  this.on('blur', this.eventHandler.blur);
  this.selectListBound = {
    height: 0,
    width: 0
  };
  this.$attachhook = $('attachhook', this).on('error', this.eventHandler.attached);
  this.sync = new Promise(function (rs) {
    $('attachhook', this).once('error', function () {
      rs();
    });
  });
  this._selectListScrollSession = null;
  this._itemIdxByValue = null;
  return this;
}

SelectMenu.tag = 'selectmenu-old';

SelectMenu.render = function () {
  return _({
    class: ['absol-selectmenu'],
    extendEvent: ['change', 'minwidthchange'],
    attr: {
      tabindex: '1'
    },
    child: ['.absol-selectmenu-holder-item', {
      tag: 'button',
      class: 'absol-selectmenu-btn',
      child: ['dropdown-ico']
    }, 'attachhook']
  });
};

SelectMenu.optimizeResource = true; // //will remove after SelectMenu completed

SelectMenu.getRenderSpace = function () {
  if (!SelectMenu.getRenderSpace.warned) {
    console.warn('SelectMenu.getRenderSpace() will be removed in next version');
  }

  SelectMenu.getRenderSpace.warned = true;

  if (!SelectMenu.$renderSpace) {
    SelectMenu.$renderSpace = _('.absol-selectmenu-render-space').addTo(document.body);
  }

  return SelectMenu.$renderSpace;
};

SelectMenu.getAnchorCtn = function () {
  if (!SelectMenu.$anchorCtn) {
    SelectMenu.$anchorCtn = _('.absol-selectmenu-anchor-container').addTo(document.body);
  }

  return SelectMenu.$anchorCtn;
};

SelectMenu.prototype.updateItem = function () {
  this.$holderItem.clearChild();

  if (this._itemsByValue[this.value]) {
    var elt = _({
      tag: 'selectlistitem',
      props: {
        data: this._itemsByValue[this.value]
      }
    }).addTo(this.$holderItem);

    elt.$descCtn.addStyle('width', this.$selectlist._descWidth + 'px');
  }
};

SelectMenu.prototype._dictByValue = function (items) {
  var dict = {};
  var item;

  for (var i = 0; i < items.length; ++i) {
    item = items[i];
    dict[item.value + ''] = item;
  }

  return dict;
};

SelectMenu.prototype.init = function (props) {
  props = props || {};
  Object.keys(props).forEach(function (key) {
    if (props[key] === undefined) delete props[key];
  });

  if (!('value' in props)) {
    if (props.items && props.items.length > 0) props.value = typeof props.items[0] == 'string' ? props.items[0] : props.items[0].value;
  }

  var value = props.value;
  delete props.value;
  this.super(props);
  this.value = value;
};

SelectMenu.property = {};
SelectMenu.property.items = {
  set: function (value) {
    this._searchCache = {};
    this._itemIdxByValue = null;
    /**
     * verity data
     */

    if (value) {
      value.forEach(function (it) {
        if (it && it.text) {
          it.text = it.text + '';
        }
      });
    }

    this._items = value;
    this._itemsByValue = this._dictByValue(value);

    if (!this._itemsByValue[this.value] && value.length > 0) {
      this.value = value[0].value;
    } else this.updateItem();

    this.$dropdownBox.removeStyle('min-width');
    this.selectListBound = this.$selectlist.setItemsAsync(value || []);
    this.style.setProperty('--select-list-desc-width', this.$selectlist.measuredSize.descWidth + 'px');
    this._resourceReady = true;
    this.addStyle('min-width', this.selectListBound.width + 2 + 23 + 'px');
    this.emit('minwidthchange', {
      target: this,
      value: this.selectListBound.width + 2 + 23,
      type: 'minwidthchange'
    }, this);
  },
  get: function () {
    return this._items || [];
  }
};
SelectMenu.property.value = {
  set: function (value) {
    this.$selectlist.value = value;
    this._lastValue = value;
    this.updateItem();
  },
  get: function () {
    return this.$selectlist.value;
  }
};
SelectMenu.property.enableSearch = {
  set: function (value) {
    this._enableSearch = !!value;

    if (value) {
      this.$searchTextInput.removeStyle('display');
    } else {
      this.$searchTextInput.addStyle('display', 'none');
    }
  },
  get: function () {
    return !!this._enableSearch;
  }
};

SelectMenu.prototype.updateDropdownPostion = function (updateAnchor) {
  if (!this.isFocus) {
    this.$anchorContentCtn.removeStyle('left').removeStyle('top');
    this.$dropdownBox.removeStyle('min-width');
    return;
  }

  var bound = this.getBoundingClientRect();

  if (!updateAnchor) {
    var outBound = _Dom.default.traceOutBoundingClientRect(this);

    if (!this.isFocus || bound.top > outBound.bottom || bound.bottom < outBound.top) {
      this.isFocus = false;
      return;
    }

    var anchorOutBound = _Dom.default.traceOutBoundingClientRect(this.$anchor);

    var searchBound = this.$searchTextInput.getBoundingClientRect();
    var availableTop = bound.top - anchorOutBound.top - (this.enableSearch ? searchBound.height + 8 : 0) - 20;
    var availableBottom = anchorOutBound.bottom - bound.bottom - (this.enableSearch ? searchBound.height + 8 : 0) - 20;

    if (this.forceDown || availableBottom >= this.selectListBound.height || availableBottom > availableTop) {
      this.isDropdowUp = false;

      if (this.$dropdownBox.firstChild != this.$searchTextInput) {
        this.$searchTextInput.selfRemove();
        this.$dropdownBox.addChildBefore(this.$searchTextInput, this.$vscroller);
      }

      this.$vscroller.addStyle('max-height', availableBottom + 'px');
    } else {
      this.isDropdowUp = true;

      if (this.$dropdownBox.lastChild !== this.$searchTextInput) {
        this.$searchTextInput.selfRemove();
        this.$dropdownBox.addChild(this.$searchTextInput);
      }

      this.$vscroller.addStyle('max-height', availableTop + 'px');
    }

    this.$dropdownBox.addStyle('min-width', bound.width + 'px');
  }

  var anchorBound = this.$anchor.getBoundingClientRect();

  if (this.isDropdowUp) {
    this.$anchorContentCtn.addStyle({
      left: bound.left - anchorBound.left + 'px',
      top: bound.top - anchorBound.top - this.$dropdownBox.clientHeight - 1 + 'px'
    });
  } else {
    this.$anchorContentCtn.addStyle({
      left: bound.left - anchorBound.left + 'px',
      top: bound.bottom - anchorBound.top + 'px'
    });
  }
};

SelectMenu.prototype.scrollToSelectedItem = function () {
  var self = this;
  setTimeout(function () {
    if (self.$selectlist.$selectedItem) {
      var fistChildBound = self.$selectlist.childNodes[1].getBoundingClientRect();
      var lastChildBound = self.$selectlist.lastChild.getBoundingClientRect();
      var listBound = {
        top: fistChildBound.top,
        height: lastChildBound.bottom - fistChildBound.top,
        bottom: lastChildBound.bottom
      };
      var itemBound = self.$selectlist.$selectedItem.getBoundingClientRect();

      if (self.isDropdowUp) {
        var scrollBound = self.$vscroller.getBoundingClientRect();
        self.$vscroller.scrollTop = Math.max(itemBound.bottom - scrollBound.height - listBound.top, 0);
      } else {
        self.$vscroller.scrollTop = itemBound.top - listBound.top;
      }
    }
  }.bind(this), 3);
};

SelectMenu.prototype.startTrackScroll = function () {
  var trackElt = this.parentElement;

  while (trackElt) {
    if (trackElt.addEventListener) {
      trackElt.addEventListener('scroll', this.eventHandler.scrollParent, false);
    } else {
      trackElt.attachEvent('onscroll', this.eventHandler.scrollParent, false);
    }

    this.$scrollTrackElts.push(trackElt);
    trackElt = trackElt.parentElement;
  }

  if (document.addEventListener) {
    document.addEventListener('scroll', this.eventHandler.scrollParent, false);
    document.addEventListener('wheel', this.eventHandler.wheelDocument, true);
  } else {
    document.attachEvent('onscroll', this.eventHandler.scrollParent, false);
  }

  this.$scrollTrackElts.push(document);
};

SelectMenu.prototype.stopTrackScroll = function () {
  var trackElt;

  for (var i = 0; i < this.$scrollTrackElts.length; ++i) {
    trackElt = this.$scrollTrackElts[i];

    if (trackElt.removeEventListener) {
      trackElt.removeEventListener('scroll', this.eventHandler.scrollParent, false);
    } else {
      trackElt.dettachEvent('onscroll', this.eventHandler.scrollParent, false);
    }
  }

  this.$scrollTrackElts = [];
};

SelectMenu.prototype.startListenRemovable = function () {
  var removableElt = this.parentElement;

  while (removableElt) {
    if (removableElt.isSupportedEvent && removableElt.isSupportedEvent('remove')) {
      removableElt.on('remove', this.eventHandler.removeParent);
    }

    removableElt = removableElt.parentElement;
  }
};

SelectMenu.prototype.stopListenRemovable = function () {
  var removableElt;

  while (this.$removableTrackElts.length > 0) {
    removableElt = this.$removableTrackElts.pop();
    removableElt.off('remove', this.eventHandler.removeParent);
  }
};

SelectMenu.prototype._releaseResource = function () {
  this.$selectlist.items = [];
};

SelectMenu.prototype._requestResource = function () {
  this.$selectlist.items = this._items || [];
};

SelectMenu.property.isFocus = {
  set: function (value) {
    var self = this;
    value = !!value;
    if (value == this.isFocus) return;
    this._isFocus = value;

    if (value) {
      this.startTrackScroll();
      this.selectListScrollToken = null; //force scroll

      var isAttached = false;
      setTimeout(function () {
        if (isAttached) return;
        $('body').on('mousedown', self.eventHandler.bodyClick);
        isAttached = true;
      }, 1000);
      $('body').once('click', function () {
        setTimeout(function () {
          if (isAttached) return;
          $('body').on('mousedown', self.eventHandler.bodyClick);
          isAttached = true;
        }, 10);
      });

      if (this.enableSearch) {
        setTimeout(function () {
          self.$searchTextInput.focus();
        }, 50);
      }

      this.updateDropdownPostion();
      this.scrollToSelectedItem();
      this.$anchor.removeClass('absol-disabled');
    } else {
      this.$anchor.addClass('absol-disabled');
      this.stopTrackScroll();
      $('body').off('mousedown', this.eventHandler.bodyClick);
      setTimeout(function () {
        if (self.$searchTextInput.value != 0) {
          self.$searchTextInput.value = '';
          self.$selectlist.items = self.items;
          self._resourceReady = true;
          self.$selectlist.removeClass('as-searching');
        }
      }, 100);
      this.updateItem();
    }
  },
  get: function () {
    return !!this._isFocus;
  }
};
SelectMenu.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('disabled');
    } else {
      this.removeClass('disabled');
    }
  },
  get: function () {
    return this.hasClass('disabled');
  }
};
SelectMenu.property.hidden = {
  set: function (value) {
    if (value) {
      this.addClass('hidden');
    } else {
      this.removeClass('hidden');
    }
  },
  get: function () {
    return this.addClass('hidden');
  }
};
SelectMenu.property.selectedIndex = {
  get: function () {
    if (!this._itemIdxByValue) {
      this._itemIdxByValue = {};

      for (var i = 0; i < this._items.length; ++i) {
        this._itemIdxByValue[this._items[i].value] = i;
      }
    }

    var idx = this._itemIdxByValue[this._value];
    return idx >= 0 ? idx : -1;
  }
};
/**
 * @type {SelectMenu}
 */

SelectMenu.eventHandler = {};

SelectMenu.eventHandler.attached = function () {
  if (this._updateInterval) return;
  if (!this.$anchor.parentNode) this.$anchor.addTo(this.$anchorCtn);
  this.$attachhook.updateSize = this.$attachhook.updateSize || this.updateDropdownPostion.bind(this);

  _Dom.default.addToResizeSystem(this.$attachhook);

  this.stopListenRemovable();
  this.startListenRemovable();

  if (!this._resourceReady) {
    this._requestResource();

    this._resourceReady = true;
  }

  this._updateInterval = setInterval(function () {
    if (!this.isDescendantOf(document.body)) {
      clearInterval(this._updateInterval);
      this._updateInterval = undefined;
      this.$anchor.selfRemove();
      this.stopTrackScroll();
      this.stopListenRemovable();
      this.eventHandler.removeParent();
    }
  }.bind(this), 10000);
};

SelectMenu.eventHandler.scrollParent = function (event) {
  var self = this;

  if (this._scrollFrameout > 0) {
    this._scrollFrameout = 10;
    return;
  }

  this._scrollFrameout = this._scrollFrameout || 10;

  function update() {
    self.updateDropdownPostion(false);
    self.scrollToSelectedItem();
    self._scrollFrameout--;
    if (self._scrollFrameout > 0) requestAnimationFrame(update);
  }

  update();
};

SelectMenu.eventHandler.removeParent = function (event) {
  this._releaseResource();

  this._resourceReady = false;
};

SelectMenu.eventHandler.click = function (event) {
  if (_EventEmitter.default.isMouseRight(event)) return;
  this.isFocus = !this.isFocus;
};

SelectMenu.eventHandler.bodyClick = function (event) {
  if (!_EventEmitter.default.hitElement(this, event) && !_EventEmitter.default.hitElement(this.$anchor, event)) {
    setTimeout(function () {
      this.isFocus = false;
    }.bind(this), 5);
  }
};

SelectMenu.eventHandler.selectlistPressItem = function (event) {
  this.updateItem();

  if (this._lastValue != this.value) {
    event.lastValue = this._lastValue;
    event.value = this.value;
    setTimeout(function () {
      this.emit('change', event, this);
    }.bind(this), 1);
    this._lastValue = this.value;
  }
};

SelectMenu.eventHandler.searchModify = function (event) {
  var filterText = this.$searchTextInput.value.replace(/((\&nbsp)|(\s))+/g, ' ').trim();

  if (filterText.length == 0) {
    this._resourceReady = true;
    this.$selectlist.items = this.items;
    this.scrollToSelectedItem();
    this.$selectlist.removeClass('as-searching');
  } else {
    this.$selectlist.addClass('as-searching');
    var view = [];

    if (!this._searchCache[filterText]) {
      if (this._items.length > 0 && !this._items[0].__nvnText__) {
        (0, _search.prepareSearchForList)(this._items);
      }

      view = (0, _search.searchListByText)(filterText, this._items);
      this._searchCache[filterText] = view;
    } else {
      view = this._searchCache[filterText];
    }

    this.$selectlist.items = view;
    this._resourceReady = true;
    this.$vscroller.scrollTop = 0;
  }

  this.selectListBound = this.$selectlist.getBoundingClientRect();
  this.updateDropdownPostion(true);
};

SelectMenu.eventHandler.listSizeChangeAsync = function () {
  this.updateDropdownPostion();
};

SelectMenu.eventHandler.listValueVisibility = function (event) {
  if (!this.isFocus) return;
  if (this._selectListScrollSession == event.session) return;
  this._selectListScrollSession = event.session;
  this.scrollToSelectedItem();
};

_ACore.default.install(SelectMenu);

var _default = SelectMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TextArea2.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TextArea2.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/textarea2.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _SelectMenu = _interopRequireDefault(require("./SelectMenu"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 *
 *  @augments HTMLTextAreaElement
 *  @augments AElement
 *
 * @constructor
 */

function TextArea2() {
  this.on('keydown', this.eventHandler.keydown);
  this.on('paste', this.eventHandler.paste);
  this.on('cut', this.eventHandler.paste);
}

TextArea2.tag = 'TextArea2'.toLowerCase();

TextArea2.render = function () {
  return _('textarea.absol-textarea2');
};

TextArea2.getRenderPre = function () {
  if (!TextArea2.$preSpace) {
    TextArea2.$preSpace = _('textarea').addStyle({
      'overflow': 'hidden',
      'height': '12px',
      'resize': 'none'
    }).addTo(_SelectMenu.default.getRenderSpace());
  }

  return TextArea2.$preSpace;
};

TextArea2.prototype.updateSize = function () {
  var heightStyle = this._measureHeight(this.value);

  this.addStyle('height', heightStyle);
};

TextArea2.eventHandler = {};

TextArea2.eventHandler.keydown = function (event) {
  if (event.altKey || event.ctrlKey) return;
  var key = event.key;
  var selectPost = this.getInputSelection();
  var leftText = this.value.substring(0, selectPost.start);
  var rightText = this.value.substring(selectPost.end);
  var middText = '';

  if (key == 'Enter') {
    middText = '\n';
  } else if (key == 'Backspace') {
    if (leftText.length > 0) {
      leftText = leftText.substring(0, leftText.length - 1);
    }
  } else if (key == 'Delete') {
    if (selectPost.start < selectPost.end) {
      middText = '';
    } else if (rightText.length > 0) {
      rightText = rightText.substring(1);
    }
  } else if (key.length == 1) {
    //char
    middText = key;
  } else {
    return;
  }

  var newText = leftText + middText + rightText;

  var heightStyle = this._measureHeight(newText);

  this.addStyle('height', heightStyle);
};

TextArea2.eventHandler.paste = function (event) {
  // var text  = 
  var cl = event.clipboardData || window.clipboardData;
  var middText = cl.getData('Text') || '';
  var selectPost = this.getInputSelection();
  var leftText = this.value.substring(0, selectPost.start);
  var rightText = this.value.substring(selectPost.end);
  var newText = leftText + middText + rightText;

  var heightSyle = this._measureHeight(newText);

  this.addStyle('height', heightSyle);
};

TextArea2.eventHandler.cut = function (event) {
  // var text  = 
  var cl = event.clipboardData || window.clipboardData;
  var selectPost = this.getInputSelection();
  var leftText = this.value.substring(0, selectPost.start);
  var rightText = this.value.substring(selectPost.end);
  var newText = leftText + rightText;

  var heightSyle = this._measureHeight(newText);

  this.addStyle('height', heightSyle);
};

TextArea2.prototype._measureHeight = function (text) {
  var pre = TextArea2.getRenderPre();
  pre.addStyle('padding-left', this.getComputedStyleValue('padding-left'));
  pre.addStyle('padding-right', this.getComputedStyleValue('padding-right'));
  pre.addStyle('padding-top', this.getComputedStyleValue('padding-top'));
  pre.addStyle('padding-bottom', this.getComputedStyleValue('padding-bottom'));
  pre.addStyle('width', this.getComputedStyleValue('width'));
  pre.addStyle('height', this.getFontSize() + 'px');
  pre.addStyle('boder', this.getComputedStyleValue('boder'));
  pre.addStyle('font-size', this.getComputedStyleValue('font-size'));
  pre.addStyle('font-family', this.getComputedStyleValue('font-family'));
  pre.value = text;
  var result = pre.scrollHeight + 'px';
  return result;
};
/**
 * Return an object with the selection range or cursor position (if both have the same value)
 * @param {DOMElement} el A dom element of a textarea or input text.
 * @return {Object} reference Object with 2 properties (start and end) with the identifier of the location of the cursor and selected text.
 **/


TextArea2.prototype.getInputSelection = function () {
  var start = 0,
      end = 0,
      normalizedValue,
      range,
      textInputRange,
      len,
      endRange;

  if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
    start = this.selectionStart;
    end = this.selectionEnd;
  } else {
    range = document.selection.createRange();

    if (range && range.parentElement() == this) {
      len = this.value.length;
      normalizedValue = this.value.replace(/\r\n/g, "\n"); // Create a working TextRange that lives only in the input

      textInputRange = this.createTextRange();
      textInputRange.moveToBookmark(range.getBookmark()); // Check if the start and end of the selection are at the very end
      // of the input, since moveStart/moveEnd doesn't return what we want
      // in those cases

      endRange = this.createTextRange();
      endRange.collapse(false);

      if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
        start = end = len;
      } else {
        start = -textInputRange.moveStart("character", -len);
        start += normalizedValue.slice(0, start).split("\n").length - 1;

        if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
          end = len;
        } else {
          end = -textInputRange.moveEnd("character", -len);
          end += normalizedValue.slice(0, end).split("\n").length - 1;
        }
      }
    }
  }

  return {
    start: start,
    end: end
  };
};

_ACore.default.install(TextArea2);

var _default = TextArea2;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TextClipboard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TextClipboard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/textclipboard.css");

var _ACore = _interopRequireDefault(require("../ACore"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function TextClipboard() {
  this.$textarea = _('<textarea class="absol-text-clipboard" wrap="off" autocorrect="off"' + ' autocapitalize="off" spellcheck="false"></textarea>').addTo(this);
}

TextClipboard.tag = 'TextClipboard'.toLowerCase();

TextClipboard.render = function () {
  return _({
    style: {
      positon: 'fixed',
      opacity: 0,
      width: '1px',
      height: '1px',
      top: 0,
      left: 0
    }
  });
};

TextClipboard.prototype.copy = function (text) {
  this.$textarea.value = text;
  this.$textarea.select();
  document.execCommand('copy');
};

TextClipboard.prototype.paste = function () {
  this.$textarea.select();
  document.execCommand('paste');
};

_ACore.default.install(TextClipboard);

var _default = TextClipboard;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TimeInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TimeInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/timeinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _datetime = require("absol/src/Time/datetime");

var _ChromeTimePicker = _interopRequireDefault(require("./ChromeTimePicker"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _DateTimeInput = _interopRequireDefault(require("./DateTimeInput"));

var _utils = require("./utils");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


var STATE_NEW = 1;
var STATE_EDITED = 2;
var STATE_NONE = 0;
var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends {AElement}
 * @constructor
 */

function TimeInput() {
  this._editingData = {};
  this._isOpenPicker = false;
  this._lastEmitValue = null;
  this._min = 0;
  this._hour = null;
  this._minute = null;
  this._format = 'hh:mm a';
  this.$clockBtn = $('.as-time-input-icon-btn', this).on('click', this.eventHandler.clickClockBtn);
  this.$text = $('input', this).on('mousedown', this.eventHandler.mouseDownInput).on('mouseup', this.eventHandler.mouseUpInput).on('dblclick', this.eventHandler.dblclickInput).on('keydown', this.eventHandler.keydown).on('blur', this.eventHandler.inputBlur).on('contextmenu', function (event) {
    event.preventDefault();
  });
  this.$clearBtn = $('button.as-time-input-clear-btn', this).on('click', this.clear.bind(this));
  this.$domSignal = _('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('request_auto_select', this._autoSelect.bind(this));

  _OOP.default.drillProperty(this, this, 'dayOffset', 'value');

  this.dayOffset = null;
  this.hour = null;
  this.minute = null;
  this.disabled = false;
  this.notNull = true;
  /***
   * @memberOf TimeInput#
   * @name min
   * @type {number}
   */

  /***
   * @memberOf TimeInput#
   * @name s24
   * @type {boolean}
   * @readonly
   */
}

TimeInput.tag = 'timeinput';

TimeInput.render = function () {
  return _({
    class: 'ac-time-input',
    extendEvent: ['change'],
    child: [{
      tag: 'input',
      class: 'as-time-input-text',
      attr: {
        type: 'text'
      }
    }, {
      tag: 'button',
      class: 'as-time-input-clear-btn',
      child: 'span.mdi.mdi-close-circle'
    }, {
      tag: 'button',
      class: 'as-time-input-icon-btn',
      child: 'span.mdi.mdi-clock-outline'
    }]
  });
};

TimeInput.prototype._autoSelect = _DateTimeInput.default.prototype._autoSelect;
TimeInput.prototype.tokenMap = {
  h: 'h',
  H: 'H',
  HH: 'H',
  hh: 'h',
  m: 'm',
  mm: 'm',
  a: 'a'
};
TimeInput.prototype.tokenRegex = _DateTimeInput.default.prototype.tokenRegex;
TimeInput.prototype._tokenAt = _DateTimeInput.default.prototype._tokenAt;
TimeInput.prototype._editNextToken = _DateTimeInput.default.prototype._editNextToken;
TimeInput.prototype._editPrevToken = _DateTimeInput.default.prototype._editPrevToken;
TimeInput.prototype._makeTokenDict = _DateTimeInput.default.prototype._makeTokenDict;

TimeInput.prototype._makeValueDict = function (hour, minute) {
  var res = {};

  if (typeof hour == 'number' && hour >= 0 && hour < 24) {
    res.h = {
      value: 1 + (hour - 1) % 12
    };
    res.H = {
      value: hour
    };
    res.a = {
      value: hour >= 12 ? 'PM' : 'AM'
    };
  } else {
    res.h = {
      value: NaN
    };
    res.H = {
      value: NaN
    };
    res.a = {
      value: 'a'
    };
  }

  if (typeof minute === "number" && minute >= 0 && minute < 60) {
    res.m = {
      value: minute
    };
  } else {
    res.m = {
      value: NaN
    };
  }

  return res;
};

TimeInput.prototype._applyValue = function (hour, minute) {
  this._hour = hour;
  this._minute = minute;
  this.$text.value = this._applyTokenDict(this._format, this._makeValueDict(hour, minute));

  this._updateNullClass();
};

TimeInput.prototype._updateNullClass = function () {
  if (this._hour == null && this._minute == null) {
    this.addClass('as-value-null');
  } else {
    this.removeClass('as-value-null');
  }
};

TimeInput.prototype._applyTokenDict = function (format, dict) {
  var rgx = new RegExp(this.tokenRegex.source, 'g');
  var tokenMap = this.tokenMap;
  return format.replace(rgx, function (full, g1, g2, sourceText) {
    if (g1 && g1 === 'a') {
      return dict[g1].value;
    } else if (g1 && tokenMap[g1]) {
      var ident = tokenMap[g1];

      if (dict[ident] && !isNaN(dict[ident].value)) {
        return (0, _utils.zeroPadding)(dict[ident].value, g1.length);
      } else {
        return full;
      }
    } else return full;
  });
};

TimeInput.prototype._correctingInput = function () {
  var tkDict = this._makeTokenDict(this.$text.value); // TODO: check min, max,

};

TimeInput.prototype._correctingCurrentToken = function () {
  var token = this._tokenAt(this.$text.selectionStart);

  if (!token) return;
  var value;

  if (token.ident === 'a') {
    if (token.text !== 'a' && token.text !== 'AM' && token.text !== 'PM') {
      token.replace('a', false);
    }
  } else {
    value = parseInt(token.text);
    var rqMin = {
      h: 1,
      hh: 1,
      m: 0,
      mm: 0,
      H: 0,
      HH: 0
    }[token.ident];
    var rqMax = {
      H: 23,
      HH: 23,
      h: 12,
      hh: 12,
      m: 59,
      mm: 59
    }[token.ident];

    if (rqMin !== undefined) {
      if (!isNaN(value)) {
        if (value < rqMin || value > rqMin) {
          value = Math.max(rqMin, Math.min(rqMax, value));
          token.replace((0, _utils.zeroPadding)(value, token.ident.length), false);
          this._editingData[this.tokenMap[token.ident]] = value;
        }
      } else if (token.text !== token.ident) {
        token.replace(token.ident, false);
      }
    }
  }
};

TimeInput.prototype._loadValueFromInput = function () {
  var tkDick = this._makeTokenDict(this.$text.value);

  var hour = NaN;
  var minute = NaN;

  if (tkDick.H) {
    hour = Math.min(23, Math.max(0, tkDick.H.value));
  } else if (tkDick.h) {
    hour = Math.min(12, Math.max(1, tkDick.h.value));

    if (tkDick.a && tkDick.a.value === 'PM') {
      hour += 12;
    }
  }

  if (tkDick.m) {
    minute = Math.min(59, Math.max(0, tkDick.m.value));
  }

  this._hour = isNaN(hour) ? null : hour;
  this._minute = isNaN(minute) ? null : minute;

  this._updateNullClass();
};

TimeInput.prototype.clear = function (event) {
  this._applyValue(null, null);

  this._notifyIfChange(event);
};

TimeInput.prototype._notifyIfChange = function (event) {
  if (this._lastEmitValue === this.dayOffset) return;
  this.emit('change', {
    type: 'change',
    target: this,
    dayOffset: this.dayOffset,
    hour: this.hour,
    minute: this.minute,
    originEvent: event
  }, this);
  this._lastEmitValue = this.dayOffset;
};

TimeInput.property = {};
TimeInput.property.hour = {
  set: function (value) {
    if (typeof value == "number") {
      value = value % 24 || 0;
    } else {
      value = null;
    }

    this._applyValue(value, this._minute);

    this._lastEmitValue = this.dayOffset;
  },
  get: function () {
    return this._hour;
  }
};
TimeInput.property.minute = {
  set: function (value) {
    if (typeof value == "number") {
      value = value % 60 || 0;
    } else {
      value = null;
    }

    this._applyValue(this._hour, value);

    this._lastEmitValue = this.dayOffset;
  },
  get: function () {
    return this._minute;
  }
};
TimeInput.property.value = {
  set: function (value) {
    if (typeof value == "number" || value && value.getTime) {
      value = value || 0;
      if (value.getTime) value = value.getTime() - (0, _datetime.beginOfDay)(value).getTime();else {
        value = value % _datetime.MILLIS_PER_DAY;
      }
      this.hour = Math.floor(value / _datetime.MILLIS_PER_HOUR);
      this.minute = Math.floor(value % _datetime.MILLIS_PER_HOUR / _datetime.MILLIS_PER_MINUTE);
    } else {
      this.hour = null;
      this.minute = null;
    }
  },
  get: function () {
    if (this._hour === null || this._minute === null) return null;
    return this._hour * _datetime.MILLIS_PER_HOUR + this._minute * _datetime.MILLIS_PER_MINUTE;
  }
};
TimeInput.property.disabled = {
  set: function (value) {
    value = !!value;
    this._disabled = value;
    if (value) this.addClass('as-disabled');else this.removeClass('as-disabled');
    this.$text.disabled = value;
  },
  get: function () {
    return this._disabled;
  }
};
TimeInput.property.format = {
  enumerable: true,
  configurable: true,
  set: function (value) {
    if (typeof value !== "string") value = "hh:mm a";
    value = value || 'hh:mm a';
    this._format = value;
    this.dayOffset = this['dayOffset'];
  },
  get: function () {
    return this._format;
  }
};
TimeInput.property.s24 = {
  get: function () {
    var t = this.format.match(new RegExp(this.tokenRegex.source, 'g'));
    return !t || t.indexOf('a') < 0;
  }
};
TimeInput.property.notNull = {
  set: function (value) {
    if (value) {
      if (this.dayOffset === null) {
        this.dayOffset = 0;
      }

      this.addClass('as-must-not-null');
    } else {
      this.removeClass('as-must-not-null');
    }
  },
  get: function () {
    return this.hasClass('as-must-not-null');
  }
};
TimeInput.property.readOnly = {
  set: function (value) {
    value = !!value;
    if (value) this.addClass('as-read-only');else this.removeClass('as-read-only');
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
TimeInput.property.min = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    value = Math.floor(value);
    value = Math.max(0, Math.min(_datetime.MILLIS_PER_DAY, value));
    this._min = value;
  },
  get: function () {
    return this._min;
  }
};
TimeInput.eventHandler = {};

TimeInput.eventHandler.clickClockBtn = function () {
  this._attachPicker(this);
};

TimeInput.eventHandler.mouseUpInput = _DateTimeInput.default.eventHandler.mouseUpInput;
TimeInput.eventHandler.mouseDownInput = _DateTimeInput.default.eventHandler.mouseDownInput;
TimeInput.eventHandler.dblclickInput = _DateTimeInput.default.eventHandler.dblclickInput;
TimeInput.eventHandler.inputBlur = _DateTimeInput.default.eventHandler.inputBlur;

TimeInput.eventHandler.clickOut = function (event) {
  if ((0, _EventEmitter.hitElement)(this.share.$picker, event)) return;

  this._releasePicker();
};

TimeInput.eventHandler.pickerChange = function (event) {
  this._applyValue(event.hour, event.minute);

  this._notifyIfChange(event);

  _ResizeSystem.default.requestUpdateSignal();
};
/***
 *
 * @param {KeyboardEvent} event
 */


TimeInput.eventHandler.keydown = function (event) {
  var token = this._tokenAt(this.$text.selectionStart);

  var endToken = this._tokenAt(this.$text.selectionEnd);

  if (!token) {
    if (event.key === 'Enter') {
      this._correctingInput();

      this._loadValueFromInput();

      this._notifyIfChange(event);
    }

    return;
  }

  var newTokenText;
  var value;

  if (event.key.startsWith('Arrow')) {
    event.preventDefault();

    switch (event.key) {
      case 'ArrowLeft':
        this._editPrevToken();

        break;

      case 'ArrowRight':
        this._editNextToken();

        break;

      case 'ArrowUp':
      case 'ArrowDown':
        switch (token.ident) {
          case "H":
          case "HH":
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.H = event.key === 'ArrowUp' ? 0 : 23;
            } else {
              this._editingData.H = (value + (event.key === 'ArrowUp' ? 1 : 23)) % 24;
            }

            newTokenText = (0, _utils.zeroPadding)(this._editingData.H, token.ident.length);
            token.replace(newTokenText, true);
            break;

          case "hh":
          case 'h':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.h = event.key === 'ArrowUp' ? 1 : 12;
            } else {
              this._editingData.h = 1 + (value + (event.key === 'ArrowUp' ? 0 : 10)) % 12;
            }

            newTokenText = this._editingData.h + '';

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case "mm":
          case 'm':
            value = parseInt(token.text);

            if (isNaN(value)) {
              this._editingData.m = event.key === 'ArrowUp' ? 0 : 59;
            } else {
              this._editingData.m = (value + (event.key === 'ArrowUp' ? 1 : 59)) % 60;
            }

            newTokenText = this._editingData.m + '';

            while (newTokenText.length < token.ident.length) newTokenText = '0' + newTokenText;

            token.replace(newTokenText, true);
            break;

          case 'a':
            value = token.text;
            this._editingData.a = value === 'PM' ? "AM" : "PM";
            newTokenText = this._editingData.a;
            token.replace(newTokenText, true);
            break;
        }

        break;
    }
  } else if (event.key === "Delete" || event.key === 'Backspace') {
    event.preventDefault();

    if (endToken.idx !== token.idx) {
      if (this.notNull) {
        this.$text.value = (0, _datetime.formatDateTime)((0, _datetime.beginOfDay)(new Date()), this.format);
      } else {
        this.$text.value = this._format;
      }

      this.$text.select();
    } else {
      if (this.notNull) {
        token.replace(token.ident === 'a' ? 'AM' : (0, _utils.zeroPadding)(token.ident === 'hh' || token.ident === 'h' ? 12 : 0, token.ident.length), true);
      } else {
        token.replace(token.ident, true);
      }

      if (event.key === "Delete") this._editNextToken();else this._editPrevToken();
    }
  } else if (event.key === "Enter" || event.key === 'Tab') {
    this._correctingInput();

    this._loadValueFromInput();

    this._notifyIfChange(event);
  } else if (event.ctrlKey) {
    switch (event.key) {
      case 'a':
      case 'A':
        break;

      case 'c':
      case 'C':
        break;

      case 'x':
      case 'X':
        this.domSignal.once('clear_value', function () {
          this.$text.value = this._format;
          this.$text.select();
        }.bind(this));
        this.domSignal.emit('clear_value');
        break;

      default:
        event.preventDefault();
    }
  } else if (event.key.match(/^[0-9]$/g)) {
    event.preventDefault();
    var dVal = parseInt(event.key);

    if (this._editingData.state === STATE_NEW) {
      switch (token.ident) {
        case 'm':
        case 'mm':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;

          if (dVal > 5) {
            this._editNextToken();
          }

          break;

        case 'h':
        case 'hh':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;

          if (dVal > 1) {
            this._editNextToken();
          }

          break;

        case 'H':
        case 'HH':
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);
          this._editingData.state = STATE_EDITED;

          if (dVal > 2) {
            this._editNextToken();
          }

          break;
      }
    } else {
      switch (token.ident) {
        case 'm':
        case 'mm':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(0, Math.min(59, dVal));
          this._editingData.m = dVal;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;

        case 'h':
        case 'hh':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(1, Math.min(12, dVal));
          this._editingData.h = dVal;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;

        case 'H':
        case 'HH':
          dVal = (parseInt(token.text.split('').pop()) || 0) * 10 + dVal;
          dVal = Math.max(0, Math.min(23, dVal));
          this._editingData.H = dVal;
          token.replace((0, _utils.zeroPadding)(dVal, token.ident.length), true);

          this._editNextToken();

          break;
      }
    }
  } else if (event.key.match(/^[aApPSCsc]$/) && token.ident === 'a') {
    event.preventDefault();

    if (event.key.match(/^[aAsS]$/)) {
      token.replace('AM', true);
      this._editingData.a = "AM";
    } else {
      token.replace('PM', true);
      this._editingData.a = "PM";
    }

    this._editNextToken();
  } else {
    event.preventDefault();
  }
};

TimeInput.prototype.share = {
  $picker: null,
  $holdingInput: null,
  $follower: null
};

TimeInput.prototype._preparePicker = function () {
  if (this.share.$picker) return;
  this.share.$picker = _({
    tag: _ChromeTimePicker.default.tag,
    class: ['as-time-input-picker', 'as-dropdown-box-common-style']
  });
  this.share.$follower = _({
    tag: 'follower',
    class: 'as-time-input-follower',
    child: this.share.$picker
  });
};

TimeInput.prototype._attachPicker = function () {
  this._preparePicker();

  if (this.share.$holdingInput) this.share.$holdingInput._releasePicker();
  this.share.$holdingInput = this;
  this.share.$follower.addTo(document.body);
  this.share.$follower.followTarget = this;
  this.share.$follower.addStyle('visibility', 'hidden');
  this.share.$picker.hour = this.hour || 0;
  this.share.$picker.minute = this.minute || 0;
  this.share.$picker.s24 = this.s24;
  this.share.$picker.min = this.min;
  this.share.$picker.domSignal.emit('request_scroll_into_selected');
  this.$clockBtn.off('click', this.eventHandler.clickClockBtn);
  this.share.$picker.on('change', this.eventHandler.pickerChange);
  setTimeout(function () {
    document.body.addEventListener('click', this.eventHandler.clickOut);
    this.share.$follower.removeStyle('visibility');
  }.bind(this), 5);
};

TimeInput.prototype._releasePicker = function () {
  if (this.share.$holdingInput !== this) return; // this.share.$calendar.off('pick', this.eventHandler.calendarPick);

  this.share.$follower.remove();
  document.body.removeEventListener('click', this.eventHandler.clickOut);
  this.share.$picker.off('change', this.eventHandler.pickerChange);
  setTimeout(function () {
    this.$clockBtn.on('click', this.eventHandler.clickClockBtn);
  }.bind(this), 5);
  this.share.$holdingInput = null;
};

_ACore.default.install(TimeInput);

var _default = TimeInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TimePicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TimePicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.isTouchDevice = void 0;

require("../css/timepicker.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _datetime = require("absol/src/Time/datetime");

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _NumberSpanInput = _interopRequireDefault(require("./NumberSpanInput"));


//todo: add this to absol
var isTouchDevice = _BrowserDetector.default.hasTouch && !_BrowserDetector.default.os.type.match(/windows|X11|Ubuntu|Linux/); //todo: re select text after click

exports.isTouchDevice = isTouchDevice;
var _ = _ACore.default._;
var $ = _ACore.default.$;
var $g = _Svg.default.ShareInstance.$;
var _g = _Svg.default.ShareInstance._;

function TimePicker() {
  this._hour = 0;
  this._minute = 0;
  this._lastDayOffset = 0;
  this._state = 'none';
  this._mode = 'CLOCK';
  this._latBound = {
    width: 0,
    height: 0
  };
  var thisPicker = this;
  if (isTouchDevice) this.addClass('ac-time-picker-touch');
  this.$attachook = _('attachhook').addTo(this).on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
    thisPicker.addStyle('font-size', thisPicker.getComputedStyleValue('font-size'));
  });
  this.$attachook.requestUpdateSize = this.updateSize.bind(this);
  /***
   *
   * @type {NumberSpanInput}
   */

  this.$hour = $('.ac-time-picker-hour', this).on({
    focus: this.eventHandler.focusHour,
    keydown: this.eventHandler.keydownHour,
    blur: this.eventHandler.blurHour
  });
  /***
   *
   * @type {NumberSpanInput}
   */

  this.$minute = $('.ac-time-picker-minute', this).on({
    keydown: this.eventHandler.keydownMinute,
    focus: this.eventHandler.focusMinute,
    blur: this.eventHandler.blurMinute
  });
  this.$hourInput = $('.ac-time-picker-hour-input', this).on({
    click: this.eventHandler.clickHourInput,
    keydown: this.eventHandler.keydownHourInput,
    blur: this.eventHandler.blurHourInput
  });
  this.$minuteInput = $('.ac-time-picker-minute-input', this).on({
    click: this.eventHandler.clickMinuteInput,
    keydown: this.eventHandler.keydownMinuteInput,
    blur: this.eventHandler.blurMinuteInput
  }); //only support if is none touch device

  if (isTouchDevice) {
    this.$hour.readOnly = true;
    this.$hour.on('click', this._editHourState.bind(this));
    this.$minute.readOnly = true;
    this.$minute.on('click', this._editMinuteState.bind(this));
  }

  this.$clock = $g('.ac-time-picker-clock', this).on(isTouchDevice ? 'touchstart' : 'mousedown', this.eventHandler.mousedownClock);
  this._clockWidth = 400;
  this._clockHeight = 400;
  this._clockRadius = 150;
  this._clockRadiusInner = 100;
  this.$clockContent = $g('.ac-time-picker-clock-content', this);
  this.$clockHourCtn = $g('.ac-time-picker-clock-hour-ctn', this);
  this.$clockMinuteCtn = $g('.ac-time-picker-clock-minute-ctn', this);
  this.$hourNumbers = Array(24).fill(0).map(function (u, i) {
    var h = i;
    if (h == 0) h = 12;else if (h == 12) h = '00';
    return _g({
      tag: 'text',
      attr: {
        'text-anchor': 'middle'
      },
      class: 'ac-time-picker-clock-hour-' + (i < 12 ? 'am' : 'pm'),
      child: {
        text: h + ''
      }
    }).addTo(thisPicker.$clockHourCtn);
  });
  this.$minuteNumbers = Array(12).fill(0).map(function (u, i) {
    return _g({
      tag: 'text',
      attr: {
        'text-anchor': 'middle'
      },
      class: 'ac-time-picker-clock-minute',
      child: {
        text: i * 5 + ''
      }
    }).addTo(thisPicker.$clockMinuteCtn);
  });
  this.$selectCtn = $g('.ac-time-picker-clock-select-ctn', this);
  this.$clockCenter = _g({
    tag: 'circle',
    class: 'ac-time-picker-clock-center',
    attr: {
      cx: "0",
      cy: '0'
    }
  }).addTo(this.$selectCtn);
  this.$clockSelectLine = _g({
    tag: 'path',
    class: 'ac-time-picker-clock-select-line'
  }).addTo(this.$selectCtn);
  this.$clockSelectCicle = _g({
    tag: 'circle',
    class: 'ac-time-picker-clock-select-circle',
    attr: {
      cx: 0,
      cy: 0
    }
  }).addTo(this.$selectCtn);
  this.$clockSelectCenter = _g({
    tag: 'circle',
    class: 'ac-time-picker-clock-select-center'
  }).addTo(this.$selectCtn);
  this.$finishBtn = $('.ac-time-picker-finish-btn', this).on('click', this.finishSelect.bind(this));
  this.$cancelBtn = $('.ac-time-picker-cancel-btn', this).on('click', this.cancelSelect.bind(this));
  this.$keyboardBtn = $('.ac-time-picker-keyboard-btn', this).on('click', this.timeMode.bind(this));
  this.$clockBtn = $('.ac-time-picker-clock-btn', this).on('click', this.clockMode.bind(this));
}

;

TimePicker.prototype.updateSize = function () {
  // var 
  this._fontSize = this.getFontSize();
  var cBound = this.$clock.getBoundingClientRect();
  this._clockWidth = cBound.width;
  this._clockHeight = cBound.height;
  this.$clock.attr({
    width: this._clockWidth,
    height: this._clockHeight,
    viewBox: '0 0 ' + this._clockWidth + ' ' + this._clockHeight
  });
  this.$clockContent.attr('transform', 'translate(' + this._clockWidth / 2 + ',' + this._clockHeight / 2 + ')');
  var clockRadius = this._clockWidth / 2 - this._fontSize;
  var clockRadiusInner = clockRadius - this._fontSize * 1.5;
  this._clockRadius = clockRadius;
  this._clockRadiusInner = clockRadiusInner;
  this.$clockCenter.attr('r', this._fontSize / 5);
  this.$clockSelectCicle.attr({
    r: this._fontSize * 0.7,
    cx: clockRadius
  });
  this.$clockSelectCenter.attr({
    r: this._fontSize / 10,
    cx: clockRadius
  });
  this.$hourNumbers.forEach(function (elt, i) {
    var angle = Math.PI * (i - 3) / 6;
    var r = i < 12 ? clockRadius : clockRadiusInner;
    var box = elt.getBBox();
    var x = r * Math.cos(angle);
    var y = r * Math.sin(angle) + box.height / 2;
    elt.attr({
      x: x,
      y: y
    });
  });
  this.$minuteNumbers.forEach(function (elt, i) {
    var angle = Math.PI * (i - 3) / 6;
    var box = elt.getBBox();
    var x = clockRadius * Math.cos(angle);
    var y = clockRadius * Math.sin(angle) + box.height / 3;
    elt.attr({
      x: x,
      y: y
    });
  });
  this.updateSelectPosition();
  this.notifySizeChange();
};

TimePicker.prototype.updateSelectPosition = function () {
  var angle, radius;

  if (this._state == "EDIT_MINUTE") {
    angle = Math.PI * (this._minute - 15) / 30;
    radius = this._clockRadius;
  } else if (this._state == "EDIT_HOUR") {
    angle = Math.PI * (this._hour - 3) / 6;

    if (this._hour > 0 && this._hour <= 12) {
      radius = this._clockRadius;
    } else {
      radius = this._clockRadiusInner;
    }
  } else {
    return;
  }

  this._drawSelect(radius, angle);
};

TimePicker.prototype.editHour = function () {
  this.clockMode();

  if (this.$hour.readOnly) {
    this._editHourState();
  } else {
    this.$hour.focus();
  }
};

TimePicker.prototype._drawSelect = function (radius, angle) {
  var x = radius * Math.cos(angle);
  var y = radius * Math.sin(angle);
  this.$clockSelectCicle.attr({
    cx: x,
    cy: y
  });
  this.$clockSelectCenter.attr({
    cx: x,
    cy: y
  });
  this.$clockSelectLine.attr('d', 'M0,0L' + x + ',' + y);
};

TimePicker.prototype.notifyChange = function (force) {
  if (this._lastDayOffset != this.dayOffset || force) {
    this.emit('change', {
      target: this,
      hour: this.hour,
      minute: this.minute,
      dayOffset: this.dayOffset,
      name: 'change'
    }, this);
    this._lastDayOffset = this.dayOffset;
  }
};

TimePicker.prototype.notifySizeChange = function () {
  var bound = this.getBoundingClientRect();

  if (this._latBound.width != bound.width || this._latBound.height != bound.height) {
    this._latBound.width = bound.width;
    this._latBound.height = bound.height;
    this.emit('sizechange', {
      name: 'sizechange',
      bound: bound,
      target: this
    }, this);
  }
};

TimePicker.tag = 'TimePicker';

TimePicker.render = function () {
  return _({
    extendEvent: ['change', 'finish', 'cancel', 'sizechange'],
    class: ['ac-time-picker', 'ac-time-picker-clock-mode'],
    //clock mode is default
    child: [{
      class: 'ac-time-picker-set-clock',
      child: [{
        class: 'ac-time-picker-set-clock-header',
        child: [{
          tag: 'numberspaninput',
          class: 'ac-time-picker-hour',
          props: {
            value: 0,
            zeroInt: 2
          }
        }, {
          tag: 'span',
          text: ':'
        }, {
          tag: 'numberspaninput',
          class: 'ac-time-picker-minute',
          props: {
            value: 0,
            zeroInt: 2
          }
        }]
      }, _g({
        tag: 'svg',
        class: 'ac-time-picker-clock',
        child: [{
          class: 'ac-time-picker-clock-content',
          child: ['.ac-time-picker-clock-select-ctn', '.ac-time-picker-clock-hour-ctn', '.ac-time-picker-clock-minute-ctn']
        }]
      })]
    }, {
      class: 'ac-time-picker-set-time',
      child: [{
        class: 'ac-time-picker-set-time-header',
        child: {
          text: 'Set time'
        }
      }, {
        class: 'ac-time-picker-set-time-label',
        child: {
          text: 'Type in time'
        }
      }, {
        class: 'ac-time-picker-set-time-input-group',
        child: [{
          class: 'ac-time-picker-set-time-input-hm',
          child: [{
            tag: 'input',
            class: 'ac-time-picker-hour-input',
            attr: {
              type: 'number',
              placeHolder: '00',
              tabindex: '2'
            }
          }, {
            tag: 'span',
            child: {
              text: ':'
            }
          }, {
            tag: 'input',
            class: 'ac-time-picker-minute-input',
            attr: {
              type: 'number',
              placeHolder: '00',
              tabindex: '3'
            }
          }]
        }, {
          class: 'ac-time-picker-set-time-input-label-hm',
          child: [{
            tag: 'span',
            child: {
              text: 'hour'
            }
          }, {
            tag: 'span',
            style: {
              visibility: 'hidden'
            },
            child: {
              text: ':'
            }
          }, {
            tag: 'span',
            child: {
              text: 'minute'
            }
          }]
        }]
      }]
    }, {
      class: 'ac-time-picker-footer',
      child: [{
        tag: 'button',
        class: 'ac-time-picker-keyboard-btn',
        child: 'span.mdi.mdi-keyboard-outline'
      }, {
        tag: 'button',
        class: 'ac-time-picker-clock-btn',
        child: 'span.mdi.mdi-clock-outline'
      }, {
        class: 'ac-time-picker-footer-right',
        child: [{
          tag: 'button',
          class: 'ac-time-picker-cancel-btn',
          attr: {
            tabindex: '4'
          },
          child: {
            text: 'CANCEL'
          }
        }, {
          tag: 'button',
          attr: {
            tabindex: '4'
          },
          class: 'ac-time-picker-finish-btn',
          child: {
            text: 'OK'
          }
        }]
      }]
    }]
  });
};

TimePicker.prototype.clockMode = function () {
  if (this._mode == "CLOCK") return;
  this._mode = 'CLOCK';
  this.removeClass('ac-time-picker-time-mode').addClass('ac-time-picker-clock-mode');
  this.$hour.value = this._hour < 10 ? '0' + this._hour : this._hour;
  this.$minute.value = this._minute < 10 ? '0' + this._minute : this._minute;

  this._editHourState();

  this.updateSize();

  this._showSelectHour(this._hour);
};

TimePicker.prototype.timeMode = function () {
  if (this._mode == "TIME") return;
  this._mode = 'TIME';
  this.addClass('ac-time-picker-time-mode').removeClass('ac-time-picker-clock-mode');
  this.$hourInput.value = this._hour < 10 ? '0' + this._hour : this._hour;
  this.$minuteInput.value = this._minute < 10 ? '0' + this._minute : this._minute;
  this.editHourInput();
  this.updateSize();
};

TimePicker.prototype._editHourState = function () {
  this._state = "EDIT_HOUR";
  this._preHour = this._hour;
  this.removeClass('ac-time-picker-edit-minute').addClass('ac-time-picker-edit-hour').removeClass('ac-time-picker-edit-hour-input').removeClass('ac-time-picker-edit-minute-input');
  this.updateSize();
};

TimePicker.prototype._editMinuteState = function () {
  this._state = "EDIT_MINUTE";
  this._preMinute = this._minute;
  this.addClass('ac-time-picker-edit-minute').removeClass('ac-time-picker-edit-hour').removeClass('ac-time-picker-edit-hour-input').removeClass('ac-time-picker-edit-minute-input');
  this.updateSize();
};

TimePicker.prototype.editHourInput = function () {
  var thisPicker = this;
  this._state = "EDIT_HOUR_INPUT";
  this._preHour = this._hour;
  this.removeClass('ac-time-picker-edit-minute').removeClass('ac-time-picker-edit-hour').addClass('ac-time-picker-edit-hour-input').removeClass('ac-time-picker-edit-minute-input');
  this.updateSize();
  setTimeout(function () {
    thisPicker.$hourInput.focus();
    thisPicker.$hourInput.select();
  }, 10);
};

TimePicker.prototype.editMinuteInput = function () {
  var thisPicker = this;
  this._state = "EDIT_MINUTE_INPUT";
  this._preMinute = this._minute;
  this.removeClass('ac-time-picker-edit-minute').removeClass('ac-time-picker-edit-hour').removeClass('ac-time-picker-edit-hour-input').addClass('ac-time-picker-edit-minute-input');
  this.updateSize();
  setTimeout(function () {
    thisPicker.$minuteInput.focus();
    thisPicker.$minuteInput.select();
  }, 1);
};

TimePicker.prototype.finishSelect = function () {
  this.emit('finish', {
    target: this,
    hour: this.hour,
    minute: this.minute,
    dayOffset: this.dayOffset,
    name: 'finish'
  }, this);
};

TimePicker.prototype.cancelSelect = function () {
  this.emit('cancel', {
    target: this,
    name: 'cancel'
  }, this);
};

TimePicker.eventHandler = {};

TimePicker.eventHandler.focusHour = function () {
  this._editHourState();

  this.$hour.selectAll();
};

TimePicker.eventHandler.blurHour = function () {
  var newText = this.$hour.value;
  var hour = parseFloat(newText) || 0;
  if (hour < 0 || hour >= 24) hour = this._preHour;
  this.$hour.value = hour < 10 ? '0' + hour : hour;
  this._hour = hour;

  this._showSelectHour(hour);

  this.notifyChange();
};

TimePicker.eventHandler.focusMinute = function () {
  this._editMinuteState();

  this.$minute.selectAll();
};

TimePicker.eventHandler.blurMinute = function () {
  var newText = this.$minute.innerHTML;
  var minute = parseFloat(newText) || 0;
  if (minute < 0 || minute >= 60) minute = this._preMinute;
  this.$minute.value = minute < 10 ? '0' + minute : minute;
  this._minute = minute;

  this._showSelectByMinuteText();

  this.notifyChange();
};

TimePicker.eventHandler.clickHourInput = function () {
  if (this._state != 'EDIT_HOUR') this.editHourInput();else {
    this.$hourInput.focus();
    this.$hourInput.select();
  }
};

TimePicker.eventHandler.clickMinuteInput = function () {
  if (this._state != 'EDIT_MINUTE_INPUT') this.editMinuteInput();else {
    this.$minuteInput.focus();
    this.$minuteInput.select();
  }
};

TimePicker.eventHandler.blurHourInput = function () {
  var hour = parseFloat(this.$hourInput.value) || 0;
  if (hour < 0 || hour >= 24) hour = this._preHour;
  this.hour = hour;
};

TimePicker.eventHandler.blurMinuteInput = function () {
  var minute = parseFloat(this.$minuteInput.value) || 0;
  if (minute < 0 || minute >= 60) minute = this._preMinute;
  this.minute = minute;
};

TimePicker.property = {};
TimePicker.property.hour = {
  set: function (value) {
    value = value % 24 || 0;
    this._hour = value;
    var text = (value < 10 ? '0' : '') + value + '';
    this.$hour.clearChild().addChild(_({
      text: text
    }));
    this.$hourInput.value = text;
    this.updateSelectPosition();
  },
  get: function () {
    return this._hour;
  }
};
TimePicker.property.minute = {
  set: function (value) {
    value = value % 60 || 0;
    this._minute = value;
    var text = (value < 10 ? '0' : '') + value + '';
    this.$minute.value = text;
    this.$minuteInput.value = text;
    this.updateSelectPosition();
  },
  get: function () {
    return this._minute;
  }
};
TimePicker.property.dayOffset = {
  set: function (value) {
    value = value || 0;
    if (value.getTime) value = value.getTime() - (0, _datetime.beginOfDay)(value).getTime();else {
      value = value % _datetime.MILLIS_PER_DAY;
    }
    this.hour = Math.floor(value / _datetime.MILLIS_PER_HOUR);
    this.minute = Math.floor(value % _datetime.MILLIS_PER_HOUR / _datetime.MILLIS_PER_MINUTE);
  },
  get: function () {
    return this._hour * _datetime.MILLIS_PER_HOUR + this._minute * _datetime.MILLIS_PER_MINUTE;
  }
};

TimePicker.prototype._showSelectHour = function (hour) {
  var radius;
  var angle = Math.PI * (hour - 3) / 6;

  if (hour < 24 && hour > 12 || hour == 0) {
    radius = this._clockRadiusInner;
  } else if (hour <= 12) {
    radius = this._clockRadius;
  } else {
    return;
  }

  this._drawSelect(radius, angle);
};

TimePicker.prototype._showSelectByHourText = function () {
  var hour = parseFloat(this.$hour.innerHTML) || 0;
  if (hour < 0 || hour >= 24) return;

  this._showSelectHour(hour);
};

TimePicker.prototype._showSelectMinute = function (minute) {
  var angle = Math.PI * (minute - 15) / 30;

  this._drawSelect(this._clockRadius, angle);
};

TimePicker.prototype._showSelectByMinuteText = function () {
  var minute = parseFloat(this.$minute.innerHTML) || 0;
  if (minute < 0 || minute >= 60) return;

  this._showSelectMinute(minute);
};
/***
 *
 * @param {KeyboardEvent} event
 */


TimePicker.eventHandler.keydownHour = function (event) {
  var thisPicker = this;

  if (event.key == 'Enter' || event.key == 'Tab') {
    event.preventDefault();
    this.$hour.blur();

    this._editMinuteState();

    setTimeout(function () {
      thisPicker.$minute.focus();
      thisPicker.$minute.selectAll();
    }, 30);
  } else {
    setTimeout(function () {
      var newText = thisPicker.$hour.value;
      var hour = parseFloat(newText) || 0;
      if (hour < 0 || hour >= 24) hour = thisPicker._preHour;else {
        thisPicker._hour = hour;

        thisPicker._showSelectHour(hour);
      }
    }, 30);
  }
};

TimePicker.eventHandler.keydownMinute = function (event) {
  var thisPicker = this;

  if (event.key == 'Enter') {
    this.$minute.blur();
    event.preventDefault();
    setTimeout(this.finishSelect.bind(this), 30);
  } else if (event.key == 'Tab') {
    this.$minute.selectNone();
    this.$finishBtn.focus();
    event.preventDefault();
  } else {
    setTimeout(function () {
      var newText = thisPicker.$minute.value;
      var minute = parseFloat(newText) || 0;
      if (minute < 0 || minute >= 60) minute = thisPicker._preMinute;else {
        thisPicker._minute = minute;

        thisPicker._showSelectMinute(minute);
      }
    }, 30);
  }
};

TimePicker.eventHandler.keydownHourInput = function (event) {
  var thisPicker = this;

  if (isTouchDevice && event.key == "Unidentified" || event.key && event.key.length == 1 && !event.ctrlKey && !event.altKey) {
    if (event.key.match(/[0-9]/)) {
      setTimeout(this.notifyChange.bind(this), 2);
    } else {
      event.preventDefault();
    }
  } else if (event.key == 'Enter') {
    event.preventDefault();
    this.$hourInput.blur();
    this.editMinuteInput();
  } else if (!event.key && !event.key.toLowerCase().match(/arrow|back/)) {
    var cText = this.$hourInput.value;
    setTimeout(function () {
      var newText = thisPicker.$hourInput.value;

      if (cText != newText) {
        var hour = parseFloat(newText) || 0;
        if (hour < 0 || hour >= 24) hour = thisPicker._preHour;
        thisPicker.hour = hour;
        thisPicker.$hourInput.blur();
        thisPicker.editMinuteInput();
        thisPicker.notifyChange();
      }
    }, 1);
  }
};

TimePicker.eventHandler.keydownMinuteInput = function (event) {
  var thisPicker = this;

  if (isTouchDevice && event.key == "Unidentified" || event.key.length == 1 && !event.ctrlKey && !event.altKey) {
    if (isTouchDevice && event.key == "Unidentified" || event.key.match(/[0-9]/)) {
      setTimeout(this.notifyChange.bind(this), 2);
    } else {
      event.preventDefault();
    }
  } else if (event.key == 'Enter') {
    this.$minute.blur();
    this.eventHandler.blurMinuteInput();
    event.preventDefault();
    setTimeout(this.finishSelect.bind(this), 100);
  } else if (event.key == "Backspace") {} else if (event.key != 'Enter') {
    var cText = this.$minuteInput.value;
    setTimeout(function () {
      var newText = thisPicker.$minuteInput.value;

      if (cText != newText) {
        var minute = parseFloat(newText) || 0;
        if (minute < 0 || minute >= 60) minute = thisPicker._preMinute;
        thisPicker.minute = minute;
        thisPicker.$minuteInput.focus();
        thisPicker.$minuteInput.select();
        thisPicker.notifyChange();
      }
    }, 1);
  }
};

TimePicker.eventHandler.dragOnClock = function (event) {
  event = event.changedTouches && event.changedTouches[0] || event;
  var cBound = this.$clock.getBoundingClientRect();
  var cx = (cBound.left + cBound.right) / 2;
  var cy = (cBound.top + cBound.bottom) / 2;
  var x = event.clientX - cx;
  var y = event.clientY - cy;
  var angle = Math.atan2(y, x);
  var radius = Math.sqrt(x * x + y * y);
  var index;

  if (this._state == "EDIT_HOUR") {
    angle += Math.PI * 2;
    index = Math.round(angle / (Math.PI / 6));
    var hour = (index + (12 + 3)) % 12;

    if (radius < (this._clockRadiusInner + this._clockRadius) / 2) {
      if (hour != 0) hour += 12;
    } else {
      if (hour == 0) hour = 12;
    }

    this._hour = hour;

    this._showSelectHour(hour);

    this.$hour.value = hour < 10 ? '0' + hour : hour;
    this.$hour.selectEnd();
  } else if (this._state == "EDIT_MINUTE") {
    radius = this._clockRadius;
    angle += Math.PI * 2;
    index = Math.round(angle / (Math.PI / 30));
    angle = index * (Math.PI / 30);
    var minute = (index + (60 + 15)) % 60;
    this._minute = minute;
    this.$minute.value = minute < 10 ? '0' + minute : minute;

    this._showSelectMinute(minute);

    this.$minute.selectEnd();
    this.notifyChange();
  } else {
    return;
  }
};

TimePicker.eventHandler.mousedownClock = function (event) {
  event.preventDefault();
  this.eventHandler.dragOnClock(event);
  document.body.addEventListener(isTouchDevice ? 'touchmove' : 'mousemove', this.eventHandler.mousemoveClock);
  document.body.addEventListener(isTouchDevice ? 'touchend' : 'mouseup', this.eventHandler.mousefinishClock);
  if (!isTouchDevice) document.body.addEventListener('mouseleave', this.eventHandler.mousefinishClock);
};

TimePicker.eventHandler.mousemoveClock = function (event) {
  event.preventDefault();
  this.eventHandler.dragOnClock(event);
};

TimePicker.eventHandler.mousefinishClock = function () {
  document.body.removeEventListener('mousemove', this.eventHandler.mousemoveClock);
  document.body.removeEventListener('mouseup', this.eventHandler.mousefinishClock);
  document.body.removeEventListener('mouseleave', this.eventHandler.mousefinishClock);

  if (this._state == 'EDIT_HOUR') {
    if (this.$minute.readOnly) {
      this._editMinuteState();
    } else {
      this.$minute.focus();
    }
  } else if (this._state == 'EDIT_MINUTE') {
    this.$minute.selectAll(); // refocus
  }
};

_ACore.default.install('timepicker', TimePicker);

var _default = TimePicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Tooltip.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Tooltip.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.updateTooltipPosition = updateTooltipPosition;
exports.default = void 0;

require("../css/tooltip.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));




var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function ToolTip() {
  this.$content = $('.absol-tooltip-content', this);
  this.$arrow = $('.absol-tooltip-arrow', this);
}

ToolTip.tag = 'ToolTip'.toLowerCase();

ToolTip.render = function () {
  return _({
    class: 'absol-tooltip',
    child: [{
      class: 'absol-tooltip-content'
    }, '.absol-tooltip-arrow']
  });
};

['addChild', 'addChildBefore', 'addChildAfter', 'clearChild'].forEach(function (key) {
  ToolTip.prototype[key] = function () {
    return this.$content[key].apply(this.$content, arguments);
  };
});

_ACore.default.install(ToolTip);

function updateTooltipPosition(toolTipClass) {
  var element = toolTipClass.$element;
  if (!element) return;
  var orientation = toolTipClass._orientation;
  var tBound = toolTipClass.$tooltip.$content.getBoundingClientRect();
  var ebound = element.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  var sMargin = Math.round(Math.min(5, screenSize.width / 100, screenSize.height));
  screenSize.width = Math.min(screenSize.width, document.body.getBoundingClientRect().width);
  var fontSize = toolTipClass.$tooltip.getFontSize();
  var dx = 0;
  var dy = 0;
  var arrowPos = null;
  var aHCenter = ebound.left + ebound.width / 2 > tBound.width / 2 && screenSize.width - ebound.left - ebound.width / 2 > tBound.width / 2;
  var aVCenter = ebound.top + ebound.height / 2 > tBound.height / 2 && screenSize.height - ebound.top - ebound.height / 2 > tBound.height / 2;
  var aTop = tBound.height < ebound.top - sMargin;
  var aBottom = tBound.height < screenSize.height - sMargin - ebound.bottom;
  var aRight = tBound.width < screenSize.width - sMargin - ebound.right;
  var aLeft = tBound.width < ebound.left - sMargin;
  var aHLeft = ebound.left + ebound.width / 2 - tBound.width / 2 < sMargin && ebound.left + ebound.width / 2 >= sMargin + fontSize / 2;
  var aHRight = ebound.left + ebound.width / 2 + tBound.width / 2 > screenSize.width - sMargin && ebound.left + ebound.width / 2 < screenSize.width - sMargin - fontSize / 2;
  var aVTop = ebound.top + ebound.width / 2 - tBound.height / 2 < sMargin && ebound.top + ebound.height / 2 >= sMargin + fontSize / 2;
  var aVBottom = ebound.top + ebound.width / 2 + tBound.height / 2 <= screenSize.height - sMargin && ebound.top + ebound.height / 2 > screenSize.height - sMargin - fontSize / 2;

  if (orientation === 'auto' && aHCenter) {
    if (aTop) {
      orientation = 'top';
    } else if (aBottom) {
      orientation = 'bottom';
    }
  }

  if (orientation === 'auto' && aVCenter) {
    if (aRight) {
      orientation = 'right';
    } else if (aLeft) {
      orientation = 'left';
    }
  }

  if ((orientation === 'auto' || orientation === 'top' || orientation === 'bottom') && aHLeft) {
    if (aTop || orientation === 'auto') orientation = "top";else if (aBottom || orientation === 'auto') orientation = 'bottom';

    if (aTop || aBottom) {
      dx += tBound.width / 2 - (ebound.left + ebound.width / 2) + sMargin;
      arrowPos = tBound.width / 2 - dx + 'px';
    }
  }

  if ((orientation === 'auto' || orientation === 'top' || orientation === 'bottom') && aHRight) {
    if (aTop || orientation === 'auto') orientation = "top";else if (aBottom || orientation === 'auto') orientation = 'bottom';

    if (aTop || aBottom) {
      dx -= tBound.width / 2 - (screenSize.width - (ebound.left + ebound.width / 2)) + sMargin;
      arrowPos = tBound.width / 2 - dx + 'px';
    }
  }

  if ((orientation === 'auto' || orientation === 'left' || orientation === 'right') && aVTop) {
    if (aLeft || orientation === 'auto') orientation = "left";else if (aRight || orientation === 'auto') {
      orientation = 'right';
    }

    if (aLeft || aRight) {
      dy += tBound.height / 2 - (ebound.top + ebound.height / 2) + sMargin;
      arrowPos = tBound.height / 2 - dy + 'px';
    }
  }

  if ((orientation === 'auto' || orientation === 'left' || orientation === 'right') && aVBottom) {
    if (aLeft || orientation === 'auto') orientation = "left";else if (aRight || orientation === 'auto') {
      orientation = 'right';
    }

    if (aLeft || aRight) {
      dy -= tBound.height / 2 - (screenSize.height - (ebound.top + ebound.height / 2)) + sMargin;
      arrowPos = tBound.height / 2 - dx + 'px';
    }
  }

  if (orientation === 'auto') {
    if (aRight) {
      if (aTop) {
        orientation = 'ne';
      } else if (aBottom) {
        orientation = 'se';
      }
    } else if (aLeft) {
      if (aTop) {
        orientation = 'nw';
      } else if (aBottom) {
        orientation = 'sw';
      }
    }
  }

  if (orientation === 'auto') orientation = "error";
  toolTipClass.$tooltip.removeClass('top').removeClass('left').removeClass('right').removeClass('bottom').removeClass('ne').removeClass('nw').removeClass('se').removeClass('sw').addClass(orientation);
  tBound = toolTipClass.$tooltip.getBoundingClientRect();

  if (orientation == 'top') {
    dy += ebound.top - tBound.height;
    dx += ebound.left + ebound.width / 2 - tBound.width / 2;
  } else if (orientation == 'left') {
    dy += ebound.top + ebound.height / 2 - tBound.height / 2;
    dx += ebound.left - tBound.width;
  } else if (orientation == 'right') {
    dy += ebound.top + ebound.height / 2 - tBound.height / 2;
    dx += ebound.right;
  } else if (orientation == 'bottom') {
    dy += ebound.bottom;
    dx += ebound.left + ebound.width / 2 - tBound.width / 2;
  } else if (orientation === 'ne') {
    dy += ebound.top - tBound.height;
    dx += ebound.right;
  } else if (orientation === 'nw') {
    dy += ebound.top - tBound.height;
    dx += ebound.left - tBound.width;
  } else if (orientation === 'se') {
    dy += ebound.bottom;
    dx += ebound.right;
  } else if (orientation === 'sw') {
    dy += ebound.bottom;
    dx += ebound.left - tBound.width;
  } else {
    throw new Error("Invalid orientation, orientation: ['left', 'right', 'top', 'bottom', 'auto', 'nw', 'ne', 'sw', 'se']");
  }

  if (arrowPos) {
    toolTipClass.$tooltip.addStyle('--tool-tip-arrow-pos', arrowPos);
  } else {
    toolTipClass.$tooltip.removeStyle('--tool-tip-arrow-pos');
  }

  toolTipClass.$holder.addStyle({
    top: dy + 'px',
    left: dx + 'px'
  });
}

ToolTip.$holder = _('.absol-tooltip-root-holder');
ToolTip.$tooltip = _('tooltip.top').addTo(ToolTip.$holder);
ToolTip.$element = undefined;
ToolTip.$content = undefined;
ToolTip._orientation = 'top';
ToolTip._session = Math.random() * 10000000000 >> 0;

ToolTip.updatePosition = function () {
  if (!ToolTip.$element) return;
  updateTooltipPosition(ToolTip);
};

ToolTip.$tooltip.$arrow.updateSize = ToolTip.updatePosition.bind(ToolTip);

ToolTip.show = function (element, content, orientation) {
  orientation = orientation || 'auto';

  if (typeof content == 'string') {
    content = _({
      tag: 'span',
      style: {
        'white-space': 'nowrap'
      },
      props: {
        innerHTML: content
      }
    });
  }

  $('', content, function (elt) {
    if (elt.tagName == "IMG" && elt.src) {
      _Dom.default.waitImageLoaded(elt).then(ToolTip.updatePosition.bind(ToolTip));
    } else if (elt.sync) {
      elt.sync.then(ToolTip.updatePosition.bind(ToolTip));
    }
  });
  var currentSession = Math.random() * 10000000000 >> 0;
  ToolTip.$holder.addTo(document.body);

  _Dom.default.addToResizeSystem(ToolTip.$tooltip.$arrow);

  ToolTip.$element = element;
  ToolTip._session = currentSession;
  ToolTip.$content = content;
  ToolTip._orientation = orientation;
  ToolTip.$tooltip.clearChild().addChild(content);
  ToolTip.$holder.removeStyle('visibility');
  ToolTip.$tooltip.removeClass('top').removeClass('left').removeClass('right').removeClass('bottom').removeClass('ne').removeClass('nw').removeClass('auto');
  ToolTip.$tooltip.addClass(orientation);
  ToolTip.updatePosition();
  return currentSession;
};

ToolTip.close = function (session) {
  if (session === true || session === this._session) {
    ToolTip.$holder.addStyle('visibility', 'hidden');
    ToolTip.$tooltip.clearChild();
    ToolTip.$holder.addStyle({
      top: false,
      left: false
    });
  }
};

ToolTip.closeTooltip = ToolTip.close;

ToolTip.showWhenClick = function (element, content, orientation) {
  var mSession = undefined;
  element.addEventListener('click', function () {
    if (mSession !== undefined) return;
    mSession = ToolTip.show(element, content, orientation);

    var finish = function (event) {
      if (!_EventEmitter.default.hitElement(content, event)) {
        $(document.body).off('click', finish);
        ToolTip.closeTooltip(mSession);
        mSession = undefined;
      }
    };

    setTimeout(function () {
      $(document.body).on('click', finish);
    }, 100);
  });
};

var _default = ToolTip;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TreeListItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TreeListItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/treelist.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function TreeListItem() {
  var thisTI = this;
  this.$list = $('treelist', this).on('press', function (event, sender) {
    thisTI.emit('press', event, this);
  });
  this.$parent = $('.absol-tree-list-item-parent', this).on('mousedown', this.eventHandler.clickParent);
  this.$text = $('span.absol-tree-list-item-text', this);
  this.$desc = $('span.absol-tree-list-item-desc', this);
  this.$descCtn = $('.absol-tree-list-item-desc-container', this);
  this.$list.level = 1;

  _OOP.default.drillProperty(this, this.$list, 'items');
}

TreeListItem.tag = 'TreeListItem'.toLowerCase();

TreeListItem.render = function () {
  return _({
    extendEvent: ['press', 'clickparent'],
    class: 'absol-tree-list-item',
    child: [{
      class: 'absol-tree-list-item-parent',
      child: ['span.absol-tree-list-item-text', {
        class: 'absol-tree-list-item-desc-container',
        child: 'span.absol-tree-list-item-desc'
      }]
    }, 'treelist']
  });
};

TreeListItem.eventHandler = {};

TreeListItem.eventHandler.clickParent = function (event) {
  event.preventDefault();
  var prevented = false;
  var self = this;
  this.emit('press', {
    target: self,
    preventDefault: function () {
      prevented = true;
    },
    isPrevented: function () {
      return prevented;
    },
    data: this.data
  }, this);

  if (!prevented) {
    var top = self.getTopLevelElt();
    $('treelistitem', top, function (e) {
      if (e != self) e.active = false;
    });
    self.active = true;
  }
};

TreeListItem.prototype.getTopLevelElt = function () {
  var current = this;

  while (current) {
    var parent = current.parentNode;
    if (!parent || !parent.classList.contains('absol-tree-list') && !parent.classList.contains('absol-tree-list-item')) break;
    current = current.parentNode;
  }

  return current;
};

TreeListItem.property = {
  text: {
    set: function (value) {
      value = value + '';
      this.$text.innerHTML = value;
    },
    get: function () {
      return this.$text.innerHTML;
    }
  },
  desc: {
    set: function (value) {
      value = value + '';
      this.$desc.innerHTML = value;
    },
    get: function () {
      return this.$desc.innerHTML;
    }
  },
  level: {
    set: function (value) {
      value = value || 0;
      if (value == this.level) return;
      this._level = value;
      this.$parent.addStyle('padding-left', this._level * 0.4 * 3 + 'em');
      this.$list.level = value + 1;
    },
    get: function () {
      return this._level || 0;
    }
  },
  active: {
    set: function (value) {
      if (value) {
        this.addClass('active');
      } else {
        this.removeClass('active');
      }
    },
    get: function () {
      return this.hasClass('active');
    }
  },
  data: {
    set: function (value) {
      this._data = value;
    },
    get: function () {
      return this._data;
    }
  },
  value: {
    get: function () {
      var data = this.data;
      if (typeof data == 'string') return data;

      if (typeof data.value == "undefined") {
        return data.text;
      } else {
        return data.value;
      }
    }
  }
};
TreeListItem.property.extendClasses = {
  set: function (value) {
    var self = this;
    this.extendClasses.forEach(function (className) {
      self.$parent.removeClass(className);
    });
    this._extendClass = [];
    if (!value) return;

    if (typeof value == 'string') {
      value = value.split(/\s+/).filter(function (c) {
        return c.length > 0;
      });
    }

    if (value instanceof Array) {
      this._extendClass = value;

      this._extendClass.forEach(function (className) {
        self.$parent.addClass(className);
      });
    } else {
      throw new Error('Invalid extendClasses');
    }
  },
  get: function () {
    return this._extendClass || [];
  }
};
TreeListItem.property.extendStyle = {
  set: function (value) {
    this.$parent.removeStyle(this._extendStyle || {});
    this._extendStyle = value || {};
    this.$parent.addStyle(this.extendStyle);
  },
  get: function () {
    return this._extendStyle || {};
  }
};

_ACore.default.install(TreeListItem);

var _default = TreeListItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TreeList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TreeList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/treelist.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _TreeListItem = _interopRequireDefault(require("./TreeListItem"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function TreeList() {}

TreeList.tag = 'treelist';

TreeList.render = function () {
  return _({
    class: 'absol-tree-list',
    extendEvent: 'press'
  });
};

TreeList.prototype.realignDescription = function (extMarginLeft) {
  extMarginLeft = extMarginLeft || 0;
  var maxWidth = 0;
  var ctns = [];
  $('.absol-tree-list-item-desc-container', this, function (elt) {
    ctns.push(elt);
    var bound = elt.getBoundingClientRect();
    maxWidth = Math.max(maxWidth, bound.width);
  });
  var fontSize = this.getFontSize();
  var cntWidth = maxWidth / fontSize + 'em';
  var extMarginRight = maxWidth / fontSize + extMarginLeft + 'em';
  ctns.forEach(function (e) {
    e.addStyle('width', cntWidth);
  });
  $('span.absol-tree-list-item-text', this, function (elt) {
    elt.addStyle('margin-right', extMarginRight);
  });
  return this;
};

TreeList.prototype.clearItems = function () {
  this._items = [];
  this.clearChild();
};

TreeList.prototype.getAllItem = function () {
  return this._items || [];
};

TreeList.prototype.getAllItemElement = function () {
  return Array.apply(null, this.childNodes);
};

TreeList.prototype.addItem = function (item) {
  var self = this;
  var props = {
    level: this.level,
    data: item
  };

  if (typeof item == 'string') {
    props.text = item;
  } else {
    props.text = item.text;

    if (item.items) {
      props.items = item.items;
    }

    if (item.desc) {
      props.desc = item.desc;
    }

    if (item.extendClasses) {
      props.extendClasses = item.extendClasses;
    }

    if (item.extendStyle) {
      props.extendStyle = item.extendStyle;
    }
  }

  var elt = _({
    tag: 'treelistitem',
    props: props,
    on: {
      press: function (event) {
        self.emit('press', event, this);
      }
    }
  });

  this.addChild(elt);

  this._items.push(item);

  return this;
};

TreeList.property = {};
TreeList.property.items = {
  set: function (value) {
    this.clearItems();
    (value || []).forEach(this.addItem.bind(this));
  },
  get: function () {
    return this.getAllItem();
  }
};
TreeList.property.level = {
  set: function (value) {
    value = value || 0;
    if (this.level == value) return;
    this._level = value;
    this.getAllItemElement().forEach(function (e) {
      e.level = value;
    });
  },
  get: function () {
    return this._level || 0;
  }
};

_ACore.default.install(TreeList);

var _default = TreeList;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/list/treeListToList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/list/treeListToList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = treeListToList;

/***
 *
 * @param {Array<SelectionItem>} items
 * @returns {Array<SelectionItem>}
 */
function treeListToList(items) {
  var arr = [];

  function visit(level, node) {
    Object.defineProperty(node, 'level', {
      configurable: true,
      writable: true,
      value: level
    });
    arr.push(node);
    if (node.items && node.items.length > 0) node.items.forEach(visit.bind(null, level + 1));
  }

  items.forEach(visit.bind(null, 0));
  return arr;
}
};

moduleFactories["node_modules/absol-acomp/js/SelectTreeBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectTreeBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SelectListBox = _interopRequireDefault(require("./SelectListBox"));

var _treeListToList = _interopRequireDefault(require("./list/treeListToList"));

var _ACore = _interopRequireDefault(require("../ACore"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var $$ = _ACore.default.$$;
/***
 * @extends SelectListBox
 * @constructor
 */

function SelectTreeBox() {
  _SelectListBox.default.call(this);
}

SelectTreeBox.tag = 'SelectTreeBox'.toLowerCase();

SelectTreeBox.render = function () {
  return _SelectListBox.default.render().addClass('as-select-tree-box');
};

Object.assign(SelectTreeBox.prototype, _SelectListBox.default.prototype);
SelectTreeBox.property = Object.assign({}, _SelectListBox.default.property);
SelectTreeBox.eventHandler = Object.assign({}, _SelectListBox.default.eventHandler);

SelectTreeBox.prototype._itemsToNodeList = function (items) {
  return (0, _treeListToList.default)(items);
};

_ACore.default.install(SelectTreeBox);

var _default = SelectTreeBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectTreeMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectTreeMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/selecttreemenu.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SelectMenu = _interopRequireDefault(require("./SelectMenu2"));

var _SelectTreeBox = _interopRequireDefault(require("./SelectTreeBox"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends SelectMenu
 * @constructor
 */

function SelectTreeMenu() {
  this._items = [];
  this._value = null;
  this._lastValue = null;
  this.$holderItem = $('.absol-selectmenu-holder-item', this);
  this.$viewItem = $('.absol-selectmenu-holder-item selectlistitem', this);
  /***
   *
   * @type {SelectTreeBox}
   */

  this.$selectlistBox = _({
    tag: 'selecttreebox',
    props: {
      anchor: [1, 6, 2, 5]
    },
    on: {
      preupdateposition: this.eventHandler.preUpdateListPosition
    }
  });
  this.$selectlistBox.on('pressitem', this.eventHandler.selectListBoxPressItem);
  this.$selectlistBox.followTarget = this;

  _OOP.default.drillProperty(this, this.$selectlistBox, 'enableSearch');

  this._lastValue = "NOTHING_VALUE";
  this._isFocus = false;
  this.isFocus = false;
  this.on('mousedown', this.eventHandler.click, true);
}

SelectTreeMenu.tag = 'SelectTreeMenu'.toLowerCase();

SelectTreeMenu.render = function () {
  return _SelectMenu.default.render().addClass('as-select-tree-menu');
};

SelectTreeMenu.eventHandler = Object.assign({}, _SelectMenu.default.eventHandler);
SelectTreeMenu.property = Object.assign({}, _SelectMenu.default.property);
Object.assign(SelectTreeMenu.prototype, _SelectMenu.default.prototype);

_ACore.default.install(SelectTreeMenu);

var _default = SelectTreeMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/WidthHeightSizer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/WidthHeightSizer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/widthheightresizer.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Draggable = _interopRequireDefault(require("./Draggable"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


//can replace with other module
var _ = _ACore.default._;
var $ = _ACore.default.$;

function WidthHeightResizer() {
  var res = _({
    extendEvent: 'sizechange',
    class: 'absol-width-height-resizer',
    child: ['.absol-width-height-resizer-content', '.absol-width-height-resizer-anchor-bot-right', '.absol-width-height-resizer-anchor-bot-left', '.absol-width-height-resizer-anchor-top-right', '.absol-width-height-resizer-anchor-top-left']
  });

  res.eventHandler = _OOP.default.bindFunctions(res, WidthHeightResizer.eventHandler);
  res.$anchorBotRight = $('.absol-width-height-resizer-anchor-bot-right', res);
  res.$anchorTopRight = $('.absol-width-height-resizer-anchor-top-right', res);
  res.$anchorBotLeft = $('.absol-width-height-resizer-anchor-bot-left', res);
  res.$anchorTopLeft = $('.absol-width-height-resizer-anchor-top-left', res);
  res.$content = $('.absol-width-height-resizer-content', res);
  (0, _Draggable.default)(res.$anchorBotRight).on('drag', res.eventHandler.dragBotRight).on('predrag', res.eventHandler.preDrag);
  (0, _Draggable.default)(res.$anchorTopRight).on('drag', res.eventHandler.dragTopRight).on('predrag', res.eventHandler.preDrag);
  (0, _Draggable.default)(res.$anchorBotLeft).on('drag', res.eventHandler.dragBotLeft).on('predrag', res.eventHandler.preDrag);
  (0, _Draggable.default)(res.$anchorTopLeft).on('drag', res.eventHandler.dragTopLeft).on('predrag', res.eventHandler.preDrag);
  return res;
}

['addChild', 'addChildBefore', 'addChildAfter', 'clearChild'].forEach(function (key) {
  WidthHeightResizer.prototype[key] = function () {
    return this.$content[key].apply(this.$content, arguments);
  };
});
WidthHeightResizer.tag = 'WidthHeightResizer'.toLowerCase();
WidthHeightResizer.eventHandler = {};

WidthHeightResizer.eventHandler.preDrag = function (event) {
  this._whrWidth = parseFloat(this.getComputedStyleValue('width').replace('px', ''));
  this._whrHeight = parseFloat(this.getComputedStyleValue('height').replace('px', ''));
};

WidthHeightResizer.eventHandler.dragBotRight = function (event) {
  var newEvent = {
    target: this,
    data: {}
  };

  if (event.moveDX != 0) {
    this.addStyle('width', this._whrWidth + event.moveDX + 'px');
    newEvent.data.changeWidth = true;
  }

  if (event.moveDY != 0) {
    this.addStyle('height', this._whrHeight + event.moveDY + 'px');
    newEvent.data.changeHeight = true;
  }

  newEvent.data.height = this.getComputedStyleValue('height');
  newEvent.data.width = this.getComputedStyleValue('width');
  this.emit('sizechange', newEvent);
};

WidthHeightResizer.eventHandler.dragTopRight = function (event) {
  var newEvent = {
    target: this,
    data: {}
  };

  if (event.moveDX != 0) {
    this.addStyle('width', this._whrWidth + event.moveDX + 'px');
    newEvent.data.changeWidth = true;
  }

  if (event.moveDY != 0) {
    this.addStyle('height', this._whrHeight - event.moveDY + 'px');
    newEvent.data.changeHeight = true;
  }

  newEvent.data.height = this.getComputedStyleValue('height');
  newEvent.data.width = this.getComputedStyleValue('width');
  this.emit('sizechange', newEvent);
};

WidthHeightResizer.eventHandler.dragBotLeft = function (event) {
  var newEvent = {
    target: this,
    data: {}
  };

  if (event.moveDX != 0) {
    this.addStyle('width', this._whrWidth - event.moveDX + 'px');
    newEvent.data.changeWidth = true;
  }

  if (event.moveDY != 0) {
    this.addStyle('height', this._whrHeight + event.moveDY + 'px');
    newEvent.data.changeHeight = true;
  }

  newEvent.data.height = this.getComputedStyleValue('height');
  newEvent.data.width = this.getComputedStyleValue('width');
  this.emit('sizechange', newEvent);
};

WidthHeightResizer.eventHandler.dragTopLeft = function (event) {
  var newEvent = {
    target: this,
    data: {}
  };

  if (event.moveDX != 0) {
    this.addStyle('width', this._whrWidth - event.moveDX + 'px');
    newEvent.data.changeWidth = true;
  }

  if (event.moveDY != 0) {
    this.addStyle('height', this._whrHeight - event.moveDY + 'px');
    newEvent.data.changeHeight = true;
  }

  newEvent.data.height = this.getComputedStyleValue('height');
  newEvent.data.width = this.getComputedStyleValue('width');
  this.emit('sizechange', newEvent);
};

_ACore.default.creator.widthheightresizer = WidthHeightResizer;
var _default = WidthHeightResizer;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TrackBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TrackBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/trackbar.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Hanger = _interopRequireDefault(require("./Hanger"));

var _int = require("absol/src/Math/int");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends Hanger
 * @constructor
 */

function TrackBar() {
  this.$bar = $('.absol-trackbar', this);
  this.$button = $('.absol-trackbar-button', this);
  this.$line = $('.absol-trackbar-line', this);
  this.on('predrag', this.eventHandler.predrag).on('drag', this.eventHandler.drag);
  this.leftValue = 0;
  this.rightValue = 1;
  this._dragValue = 0;
}

TrackBar.tag = 'trackbar';

TrackBar.render = function () {
  return _({
    tag: 'hanger',
    extendEvent: 'change',
    class: 'absol-trackbar',
    child: [{
      class: 'absol-trackbar-line',
      child: '.absol-trackbar-button'
    }, 'attachhook']
  });
};

TrackBar.prototype._updateValue = function () {
  var left = (0, _int.map)(this.value, this.leftValue, this.rightValue, 0, 100);
  this.$button.addStyle('left', left + '%');
};

TrackBar.eventHandler = {};

TrackBar.eventHandler.predrag = function (event) {
  if (event.target === this || this.readOnly) {
    event.cancel();
  } else {
    event.preventDefault();
    var lineBound = this.$line.getBoundingClientRect();
    var newValue = this.leftValue + (this.rightValue - this.leftValue) * (event.clientX - lineBound.left) / lineBound.width;
    newValue = Math.max(this.leftValue, Math.min(this.rightValue, newValue));

    if (newValue !== this.value) {
      this.value = newValue;
      event.trackbarValue = this.value;
      this._dragValue = this.value;
      this.emit('change', event);
    }
  }
};

TrackBar.eventHandler.drag = function (event) {
  var lineWidth = this.$line.getBoundingClientRect().width;
  var d = event.currentPoint.sub(event.startingPoint);
  var delta = d.x / lineWidth * (this.rightValue - this.leftValue);
  var newValue = Math.max(this.leftValue, Math.min(this.rightValue, this._dragValue + delta));

  if (newValue != this.value) {
    this.value = newValue;
    event.trackbarValue = this.value;
    this.emit('change', event);
  }
};

TrackBar.property = {};
TrackBar.property.value = {
  set: function (value) {
    value = parseFloat(value + '');
    if (isNaN(value)) value = 0;
    this._value = value;

    this._updateValue();
  },
  get: function () {
    return Math.max(this.leftValue, Math.min(this.rightValue, this._value));
  }
};
TrackBar.property.leftValue = {
  set: function (value) {
    value = parseFloat(value + '');
    if (isNaN(value)) value = 0;
    this._leftValue = value;

    this._updateValue();
  },
  get: function () {
    return this._leftValue || 0;
  }
};
TrackBar.property.rightValue = {
  set: function (value) {
    value = parseFloat(value + '');
    if (isNaN(value)) value = 1;
    this._rightValue = value;

    this._updateValue();
  },
  get: function () {
    return this._rightValue || 1;
  }
};
TrackBar.property.disabled = {
  get: function () {
    return this.hasClass('as-disabled');
  },
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  }
};
TrackBar.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};

_ACore.default.install(TrackBar);

var _default = TrackBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TrackBarInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TrackBarInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/trackbarinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 *
 * @extends {AElement}
 * @constructor
 */

function TrackBarInput() {
  var thisTI = this;
  this.$trackbar = $('trackbar', this);
  this.$input = $('flexiconinput', this);
  absol.OOP.drillProperty(this, this.$input, ['unit', 'icon']);
  this.$trackbar.on('change', function () {
    thisTI.$input.value = thisTI.value + '';
    thisTI.emit('change', thisTI.value);
  });
  this.$input.on('keyup', this.eventHandler.inputChange);
  this.inputTextWidth = 2;
  this.valueFixed = undefined;
  return this;
}

TrackBarInput.tag = 'TrackBarInput'.toLowerCase();

TrackBarInput.render = function () {
  return _({
    class: 'absol-trackbar-input',
    extendEvent: 'change',
    child: ['trackbar', 'flexiconinput']
  });
};

TrackBarInput.prototype.init = function (props) {
  props = props || {};
  props.leftValue = props.leftValue || 0;
  props.value = props.value || props.leftValue;
  Object.assign(this, props);
  this.value = props.value;
};

TrackBarInput.prototype._calInputTextWidth = function () {
  var l = Math.max(this.leftValue.toFixed(this.valueFixed || 0).length, this.rightValue.toFixed(this.valueFixed || 0).length, 2);

  if (this.valueFixed > 0) {
    l -= 0.8;
  }

  this.inputTextWidth = l;
}; // absol.OOP.drillProperty(this, this.$trackbar, ['leftValue', 'rightValue']);


TrackBarInput.property = {};
TrackBarInput.property.leftValue = {
  set: function (value) {
    this.$trackbar.leftValue = value;

    this._calInputTextWidth();
  },
  get: function () {
    return this.$trackbar.leftValue;
  }
};
TrackBarInput.property.rightValue = {
  set: function (value) {
    this.$trackbar.rightValue = value;

    this._calInputTextWidth();
  },
  get: function () {
    return this.$trackbar.rightValue;
  }
};
TrackBarInput.property.value = {
  set: function (value) {
    this.$trackbar.value = value || 0;
    this.$input.value = this.value + '';
  },
  get: function () {
    return parseFloat((this.valueFixed === undefined ? this.$trackbar.value : this.$trackbar.value.toFixed(this.valueFixed)) + '');
  }
};
TrackBarInput.property.valueFixed = {
  set: function (value) {
    if (value === undefined || value === null) value = undefined;
    this._valueFixed = value;
    this.$input.value = this.value + '';

    this._calInputTextWidth();
  },
  get: function () {
    return this._valueFixed;
  }
};
TrackBarInput.property.inputTextWidth = {
  set: function (value) {
    if (typeof value == 'number') {
      this._inputTextWidth = value;
      this.addStyle('--input-width', 3 + (value - 2) * 0.42 + 0.3 + 'em');
    } else {
      this._inputTextWidth = value;
      this.addStyle('--input-width', value);
    }
  },
  get: function () {
    return this._inputTextWidth;
  }
};
TrackBarInput.property.disabled = {
  get: function () {
    return this.hasClass('as-disabled');
  },
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }

    this.$input.disabled = !!value;
    this.$trackbar.disabled = !!value;
  }
};
TrackBarInput.property.readOnly = {
  set: function (value) {
    value = !!value;

    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }

    this.$input.readOnly = value;
    this.$trackbar.readOnly = value;
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
TrackBarInput.eventHandler = {};

TrackBarInput.eventHandler.inputChange = function (event) {
  var newValue = parseFloat(this.$input.value);

  if (!isNaN(newValue)) {
    newValue = Math.max(this.leftValue, Math.min(this.rightValue, newValue));
    this.$trackbar.value = newValue;
    this.emit('change', this.value);
  }
};

var _default = TrackBarInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ButtonRange.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ButtonRange.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/buttonrange.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _ButtonArray = _interopRequireDefault(require("./ButtonArray"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var ChevronLeft = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 410.258 410.258" style="enable-background:new 0 0 410.258 410.258;" xml:space="preserve">\n' + '<polygon points="298.052,24 266.052,0 112.206,205.129 266.052,410.258 298.052,386.258 162.206,205.129 "/>\n' + '</svg>';
var ChevronRight = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\n' + '\t viewBox="0 0 410.258 410.258" style="enable-background:new 0 0 410.258 410.258;" xml:space="preserve">\n' + '<polygon points="144.206,0 112.206,24 248.052,205.129 112.206,386.258 144.206,410.258 298.052,205.129 "/>\n' + '</svg>';
/***
 * @extends AElement
 * @constructor
 */

function ButtonRange() {
  this._dict = {};
  this._pool = [];
  this._items = [];
  this.$lastActiveBtn = null;
  this._value = undefined;
  this._lastValue = this._value;
  this.$scroller = $('.as-button-range-scroller', this).on('wheel', this.eventHandler.wheel);
  this.$prevBtn = $('.as-button-range-left-btn', this).on('click', this.prevValue.bind(this));
  this.$nextBtn = $('.as-button-range-right-btn', this).on('click', this.nextValue.bind(this));
  this._scrollTimeout = -1;
  this._scrollToSelected = this._scrollToSelected.bind(this);
  this.$attachhook = $('attachhook', this).on('error', this.eventHandler.attached);
  this.autoWidth = false;
}

ButtonRange.tag = 'buttonrange';

ButtonRange.render = function () {
  return _({
    extendEvent: ['change'],
    class: 'as-button-range',
    child: [{
      class: 'as-button-range-scroller'
    }, {
      class: 'as-button-range-left-ctn',
      child: {
        tag: 'button',
        class: 'as-button-range-left-btn',
        child: ChevronLeft
      }
    }, {
      class: 'as-button-range-right-ctn',
      child: {
        tag: 'button',
        class: 'as-button-range-right-btn',
        child: ChevronRight
      }
    }, 'attachhook']
  });
};

ButtonRange.prototype._updateUnderlinePosition = function () {
  if (!this.$lastActiveBtn) return;
  var scrollerFirstBound = this.$scroller.firstChild.getBoundingClientRect();
  if (scrollerFirstBound.width === 0) return;
  var activeBound = this.$lastActiveBtn.getBoundingClientRect();
  this.addStyle({
    '--underline-left': activeBound.left - scrollerFirstBound.left + 'px',
    '--underline-width': activeBound.width + 'px'
  });
};

ButtonRange.prototype.updateSize = function () {
  if (this.autoWidth) {
    if (this.$scroller.childNodes.length > 0) {
      var left = this.$scroller.firstChild.getBoundingClientRect().left;
      var right = this.$scroller.lastChild.getBoundingClientRect().right;

      if (left < right) {
        var fontSize = this.getFontSize() || 14;
        this.addStyle('width', (right - left + 2) / fontSize + 2 + 'em');
      }
    }
  }

  this._updateUnderlinePosition();

  this._scrollToSelected();
};

ButtonRange.prototype._newButton = function () {
  var button = _({
    tag: 'button',
    class: 'as-button-range-item',
    child: {
      text: 'null'
    }
  });

  button.on('click', this.eventHandler.clickItem.bind(this, button));
  return button;
};

ButtonRange.prototype._requestButton = function (items) {
  var button;

  if (this._pool.length > 0) {
    button = this._pool.pop();
  } else {
    button = this._newButton();
  }

  return button;
};

ButtonRange.prototype._assignButton = function (button, data) {
  button._data = data;
  button.childNodes[0].data = data.text;
};

ButtonRange.prototype._releaseButton = function (button) {
  this._pool.push(button);
};

ButtonRange.prototype._requireButton = function (n) {
  var child;

  while (this.$scroller.childNodes.length > n) {
    child = this.$scroller.lastChild;

    this._releaseButton(child);

    this.$scroller.removeChild(child);
  }

  while (this.$scroller.childNodes.length < n) {
    this.$scroller.addChild(this._requestButton());
  }
};

ButtonRange.prototype._assignButtonList = function (items) {
  var item;

  for (var i = 0; i < items.length; ++i) {
    item = this._getFullFormat(items[i]);

    this._assignButton(this.$scroller.childNodes[i], item);

    this._dict[item.ident] = {
      elt: this.$scroller.childNodes[i],
      data: item
    };
  }
};

ButtonRange.prototype._scrollToSelected = function () {
  if (this._scrollTimeout >= 0) return;
  if (!this.$lastActiveBtn) return;
  var scrollerBound = this.$scroller.getBoundingClientRect();
  if (scrollerBound.width === 0) return;
  var activeBound = this.$lastActiveBtn.getBoundingClientRect();
  var dx, speed;

  if (activeBound.left < scrollerBound.left - 1) {
    dx = activeBound.left - scrollerBound.left;
    if (dx < -500) dx = -500;
    speed = Math.sqrt(-dx * 2 + 4);
    this.$scroller.scrollLeft -= speed;
  } else if (activeBound.right - 1 > scrollerBound.right) {
    dx = activeBound.right - scrollerBound.right;
    if (dx > 500) dx = 500;
    speed = Math.sqrt(dx * 2 + 4);
    this.$scroller.scrollLeft += speed;
  } else {
    return;
  }

  var thisBR = this;
  this._scrollTimeout = setTimeout(function () {
    thisBR._scrollTimeout = -1;

    thisBR._scrollToSelected();
  }, 20);
};

ButtonRange.prototype.nextValue = function (userAction) {
  var currentIndex = this._findActiveIndex();

  var nextIndex;
  var nextValue;

  if (currentIndex < 0) {
    nextIndex = 0;
  } else {
    nextIndex = Math.min(this._items.length - 1, currentIndex + 1);
  }

  if (nextIndex >= 0) {
    nextValue = this._getFullFormat(this._items[nextIndex]).value;
    this.value = nextValue;
    if (userAction) this.notifyChange();
  }
};

ButtonRange.prototype.prevValue = function (userAction) {
  var currentIndex = this._findActiveIndex();

  var prevIndex;
  var prevValue;

  if (currentIndex < 0) {
    prevIndex = 0;
  } else {
    prevIndex = Math.max(0, currentIndex - 1);
  }

  if (prevIndex >= 0 && prevIndex < this._items.length && prevIndex != currentIndex) {
    prevValue = this._getFullFormat(this._items[prevIndex]).value;
    this.value = prevValue;
    if (userAction) this.notifyChange();
  }
};

ButtonRange.prototype._findActiveIndex = function () {
  var item;
  var value = this._value;

  for (var i = 0; i < this._items.length; ++i) {
    item = this._items[i];
    if (item === value || item && item.value === value) return i;
  }

  return -1;
};

ButtonRange.prototype._getFullFormat = function (item) {
  var res = {};

  if (typeof item == 'string' || typeof item == 'number' || typeof item == 'boolean' || item === null || item === undefined) {
    res.ident = item + '';
    res.value = item;
    res.text = item + '';
  } else if (item && typeof item == 'object') {
    res.value = item.value;
    res.ident = res.value + '';
    res.text = item.text;
  }

  return res;
};

ButtonRange.prototype.notifyChange = function () {
  this.emit('change', {
    target: this,
    value: this.value,
    type: 'change'
  }, this);
};

ButtonRange.property = {};
/**
 * @type {ButtonRange}
 */

ButtonRange.property.items = {
  set: function (items) {
    items = items || [];
    this._items = items;

    this._requireButton(items.length);

    this._assignButtonList(items);

    if (items.length > 0) {
      if (!this._dict[this._value + '']) {
        this._value = this._getFullFormat(items[0]).value;
      }
    }

    this.value = this._value;
    this.updateSize();
  },
  get: function () {
    return this._items;
  }
};
ButtonRange.property.value = {
  set: function (value) {
    this._value = value;
    this._lastValue = this._value;

    if (this.$lastActiveBtn) {
      this.$lastActiveBtn.removeClass('as-active');
      this.$lastActiveBtn = null;
    }

    var hodler = this._dict[value + ''];

    if (hodler) {
      hodler.elt.addClass('as-active');
      this.$lastActiveBtn = hodler.elt;
    }

    var activeIndex = this._findActiveIndex();

    this.$prevBtn.disabled = activeIndex === 0;
    this.$nextBtn.disabled = activeIndex === this._items.length - 1;

    this._updateUnderlinePosition();

    this._scrollToSelected();
  },
  get: function () {
    return this._value;
  }
};
ButtonRange.eventHandler = {};

ButtonRange.eventHandler.clickItem = function (item, event) {
  if (this._lastValue != item._data.value) {
    this.value = item._data.value;
    this.notifyChange();
  }
};

ButtonRange.eventHandler.attached = function () {
  if (this.style.width === 'auto') this.autoWidth = true;

  _Dom.default.addToResizeSystem(this.$attachHook);

  this.updateSize();
};

ButtonRange.eventHandler.wheel = function (event) {
  var prevLeft = this.$scroller.scrollLeft;

  if (event.deltaY < 0) {
    this.$scroller.scrollLeft -= 100;
  } else if (event.deltaY > 0) {
    this.$scroller.scrollLeft += 100;
  }

  if (prevLeft !== this.$scroller.scrollLeft) event.preventDefault();
};

_ACore.default.install(ButtonRange);

var _default = ButtonRange;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DropZone.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DropZone.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/dropzone.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function DropZone() {
  this.defineEvent(['fileenter', 'fileleave', 'filedrop']);
  this.addClass('as-drop-zone');
  this.on('dragover', this.eventHandler.dragZoneFileOver).on('drop', this.eventHandler.dropZoneFileDrop);
  this._fileOverTimeout = -1;
}

DropZone.tag = 'dropzone';

DropZone.render = function () {
  return _('div');
};

DropZone.eventHandler = {};

DropZone.eventHandler.dragZoneFileOver = function (event) {
  event.preventDefault();

  if (this._fileOverTimeout > 0) {
    clearTimeout(this._fileOverTimeout);
  } else {
    this.addClass('as-drag-over');
    this.emit('fileenter', event, this);
  }

  this._fileOverTimeout = setTimeout(this.eventHandler.dragZoneFileOverEnd, 200);
};
/***
 *
 * @param {DragEvent} event
 */


DropZone.eventHandler.dropZoneFileDrop = function (event) {
  if (this._fileOverTimeout > 0) {
    clearTimeout(this._fileOverTimeout);
    this._fileOverTimeout = -1;
  }

  event.preventDefault();
  this.removeClass('as-drag-over');
  event._files = null;
  if (!event.hasOwnProperty('files')) Object.defineProperty(event, 'files', {
    get: function () {
      if (this._files) return this._files;
      var files = [];
      var file;

      if (event.dataTransfer.items) {
        for (var i = 0; i < event.dataTransfer.items.length; i++) {
          if (event.dataTransfer.items[i].kind === 'file') {
            file = event.dataTransfer.items[i].getAsFile();
            files.push(file);
          }
        }
      } else {
        // Use DataTransfer interface to access the file(s)
        for (var i = 0; i < event.dataTransfer.files.length; i++) {
          files.push(event.dataTransfer.files[i]);
        }
      }

      this._files = files;
      return this._files;
    }
  });
  this.emit('filedrop', event, this);
};

DropZone.eventHandler.dragZoneFileOverEnd = function () {
  this._fileOverTimeout = -1;
  this.removeClass('as-drag-over');
  this.emit('fileleave', {
    type: 'fileleave'
  }, this);
};

_ACore.default.install(DropZone);

var _default = DropZone;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/RadioInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/RadioInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/radioinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


//new tech, not working version
var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends Element
 * @constructor
 */

function RadioInput() {
  this.$input = $('input', this).on('change', this.notifyChange.bind(this));
  this.checked = false;
  this.disabled = false;
  this.on('click', this.eventHandler.click);
  this.onchange = null;
}

RadioInput.tag = "RadioInput".toLowerCase();

RadioInput.render = function (data) {
  return _({
    tag: 'label',
    extendEvent: 'change',
    class: 'as-radio-input',
    child: [{
      elt: data && data.$input,
      tag: 'input',
      class: 'as-radio-input-value',
      attr: {
        type: 'radio'
      }
    }, {
      class: ['as-radio-input-check-mark']
    }]
  });
};
/***
 * as normal, change event will be fired when radio change by system
 */


RadioInput.prototype.notifyChange = function () {
  var event = {
    checked: this.checked
  };
  this.emit('change', event, this);
};

RadioInput.prototype._updateCheckedClass = function () {
  if (this.checked) {
    this.addClass('as-checked');
  } else {
    this.removeClass('as-checked');
  }
};

RadioInput.property = {};
RadioInput.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }

    this.$input.disabled = !!value;
  },
  get: function () {
    this.$input.disabled;
  }
};
/***
 *
 * @type {RadioInput}
 */

RadioInput.property.checked = {
  set: function (value) {
    this.$input.checked = !!value;

    this._updateCheckedClass();
  },
  get: function () {
    return this.$input.checked;
  }
};
RadioInput.attribute = {
  checked: {
    set: function (value) {
      if (value === 'false' || value === null) {
        this.checked = false;
      } else {
        this.checked = true;
      }
    },
    get: function () {
      return this.checked ? 'true' : 'false';
    },
    remove: function () {
      this.checked = false;
    }
  },
  disabled: {
    set: function (value) {
      if (value === 'false' || value === null) {
        this.disabled = false;
      } else {
        this.disabled = true;
      }
    },
    get: function () {
      return this.disabled ? 'true' : 'false';
    },
    remove: function () {
      this.disabled = false;
    }
  }
};
/***
 *
 * @type {RadioInput}
 */

RadioInput.eventHandler = {};

RadioInput.eventHandler.click = function () {
  this._updateCheckedClass();
};

_ACore.default.install(RadioInput);

RadioInput.autoReplace = function () {
  var placeHolders = Array.prototype.slice.call(document.getElementsByTagName(this.tag));
  var ph;
  var attOfPH;
  var attrs;
  var style;
  var classList;
  var attNode;
  var attrName, attrValue;
  var props;

  for (var i = 0; i < placeHolders.length; ++i) {
    ph = placeHolders[i];
    attOfPH = ph.attributes;
    classList = [];
    style = {};
    attrs = {};
    props = {};

    for (var j = 0; j < attOfPH.length; ++j) {
      attNode = attOfPH[j];
      attrName = attNode.nodeName;
      attrValue = attNode.nodeValue;

      if (attrName == 'style') {
        attrValue.trim().split(';').reduce(function (style, prop) {
          var p = prop.split(':');

          if (p.length == 2) {
            style[p[0].trim()] = p[1].trim();
          }

          return style;
        }, style);
      } else if (attrName == 'class') {
        classList = attrValue.trim().split(/\s+/);
      } else if (attrName == 'onchange') {
        props.onchange = new Function('event', 'sender', attrValue);
      } else {
        attrs[attrName] = attrValue;
      }
    }

    var newElt = _({
      tag: this.tag,
      attr: attrs,
      class: classList,
      style: style,
      props: props
    });

    $(ph).selfReplace(newElt);
  }
};

RadioInput.initAfterLoad = function () {
  _Dom.default.documentReady.then(function () {
    RadioInput.autoReplace();
  });
};

var _default = RadioInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/OnScreenWidget.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/OnScreenWidget.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/onscreenwidget.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Hanger = _interopRequireDefault(require("./Hanger"));

var _Dom = require("absol/src/HTML5/Dom");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _stringGenerate = require("absol/src/String/stringGenerate");


var _ = _ACore.default._;
var $ = _ACore.default.$;
var $$ = _ACore.default.$$;
/***
 * @extends Hanger
 * @constructor
 */

function OnScreenWidget() {
  this.id = 'unset-id-' + (0, _stringGenerate.randomIdent)();
  this.on({
    dragstart: this.eventHandler.widgetStartDrag,
    drag: this.eventHandler.widgetDrag,
    dragend: this.eventHandler.widgetDragEnd
  });
  this.addEventListener('click', function (event) {
    if (!this._preventClick) this.emit('click', event, this);
  });
  this.$attachhook = _('attachhook').addTo(this);
  this.$attachhook.on('attached', this.eventHandler.attached);
  this.config = null;
}

OnScreenWidget.tag = 'OnScreenWidget'.toLowerCase();

OnScreenWidget.render = function () {
  return _({
    tag: 'hanger',
    extendEvent: 'click',
    class: ['as-onscreen-widget', 'as-size-loading'],
    props: {
      hangOn: 3
    }
  });
};

OnScreenWidget.prototype.configPrefix = 'on-screen-widget-';

OnScreenWidget.prototype._genConfig = function () {
  this._widgetBound = this.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  return {
    cx: (this._widgetBound.left + this._widgetBound.width / 2) * 100 / screenSize.width,
    cy: (this._widgetBound.top + this._widgetBound.height / 2) * 100 / screenSize.height
  };
};

OnScreenWidget.prototype._saveConfig = function () {
  var id = this.id || '';
  if (id.startsWith('unset-id-') || !this.config) return;
  localStorage.setItem(this.configPrefix + id, JSON.stringify(this.config));
};

OnScreenWidget.prototype._loadConfig = function () {
  var id = this.id || '';
  if (id.startsWith('unset-id-')) return;
  var config = null;

  try {
    config = JSON.parse(localStorage.getItem(this.configPrefix + id));

    if (typeof config !== "object" || typeof config.cx !== "number" || typeof config.cy !== 'number') {
      config = this.config || this._genConfig();
    }
  } catch (error) {
    config = this.config || this._genConfig();
  }

  var cx = config.cx || 0;
  var cy = config.cy || 0;
  this.addStyle({
    '--cx': cx / 100,
    '--cy': cy / 100
  });
  this.config = config;
};

OnScreenWidget.prototype._updateCSSSize = function () {
  var bound = this.getBoundingClientRect();
  this.addStyle({
    '--client-height': bound.height + 'px',
    '--client-width': bound.width + 'px'
  });
  this.removeClass('as-size-loading');
};
/***
 *
 * @type {OnScreenWidget|{}}
 */


OnScreenWidget.eventHandler = {};

OnScreenWidget.eventHandler.attached = function () {
  var images = $$('img', this);
  var syncs = images.map(function (img) {
    if (img.classList.contains('absol-attachhook')) return Promise.resolve();
    return (0, _Dom.waitImageLoaded)(img, 100);
  });
  var thisW = this;
  Promise.all(syncs).then(function () {
    thisW._updateCSSSize();

    thisW._loadConfig();
  });
};

OnScreenWidget.eventHandler.widgetStartDrag = function (event) {
  this._widgetBound = this.getBoundingClientRect();
  this._preventClick = true;
};

OnScreenWidget.eventHandler.widgetDrag = function (event) {
  event.preventDefault();
  var screenSize = (0, _Dom.getScreenSize)();
  var p0 = new _Vec.default(this._widgetBound.left, this._widgetBound.top);
  var dv = event.currentPoint.sub(event.startingPoint);
  var p1 = p0.add(dv);
  var cx = (p1.x - 2) * 100 / (screenSize.width - this._widgetBound.width - 4);
  var cy = (p1.y - 2) * 100 / (screenSize.height - this._widgetBound.height - 4);
  cx = Math.max(0, Math.min(100, cx));
  cy = Math.max(0, Math.min(100, cy));
  this.addStyle({
    '--cx': cx / 100,
    '--cy': cy / 100
  });

  if (this.config) {
    this.config.cx = cx;
    this.config.cy = cy;
  }
};

OnScreenWidget.eventHandler.widgetDragEnd = function () {
  var thisWG = this;
  setTimeout(function () {
    thisWG._preventClick = false;
  }, 100);

  this._saveConfig();
};

_ACore.default.install(OnScreenWidget);

var _default = OnScreenWidget;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/RibbonSplitButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/RibbonSplitButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/ribbonsplitbutton.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _QuickMenu = _interopRequireDefault(require("./QuickMenu"));

var _utils = require("./utils");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function RibbonSplitButton() {
  this.$icon = null;
  this._icon = null;
  this.$text = $('.as-ribbon-split-button-text', this);
  this.$primaryBtn = $('.as-ribbon-split-button-primary', this).on('click', this.eventHandler.clickPrimaryBtn);
  this.$extendBtn = $('.as-ribbon-split-button-extend', this);
  this.$extendText = $('.as-ribbon-split-button-text', this.$extendBtn);
  this._menuHolder = null;
}

RibbonSplitButton.tag = 'RibbonSplitButton'.toLowerCase();

RibbonSplitButton.render = function () {
  return _({
    extendEvent: ['press', 'select'],
    attr: {
      'tabindex': '0'
    },
    class: ['as-ribbon-split-button', 'as-no-dropdown'],
    child: {
      class: 'as-ribbon-split-button-content',
      child: [{
        tag: 'button',
        attr: {
          'tabindex': '-1'
        },
        class: 'as-ribbon-split-button-primary',
        child: {
          tag: 'span',
          class: 'as-ribbon-split-button-text'
        }
      }, {
        tag: 'button',
        attr: {
          'tabindex': '-1'
        },
        class: 'as-ribbon-split-button-extend',
        child: ['span.as-ribbon-split-button-text', 'span.mdi.mdi-chevron-down']
      }]
    }
  });
};

RibbonSplitButton.property = {};
RibbonSplitButton.property.items = {
  set: function (items) {
    var thisB = this;
    this._items = items || [];

    if (this._items && this._items.length > 0) {
      if (!this._menuHolder) {
        this.removeClass('as-no-dropdown');
        this._menuHolder = _QuickMenu.default.toggleWhenClick(this.$extendBtn || this, {
          getMenuProps: function () {
            return {
              extendStyle: {
                'min-width': thisB.getBoundingClientRect().width + 'px'
              },
              items: thisB._items
            };
          },
          getFlowedElement: function () {
            return thisB;
          },
          anchor: [1, 2, 6, 5],
          onSelect: function (item) {
            thisB.emit('select', {
              item: (0, _utils.cleanMenuItemProperty)(item),
              type: 'select',
              target: thisB
            });
          }
        });
      }
    } else {
      if (this._menuHolder) {
        this.addClass('as-no-dropdown');

        this._menuHolder.remove();

        this._menuHolder = null;
      }
    }
  },
  get: function () {
    return this._items;
  }
};
RibbonSplitButton.property.text = {
  set: function (value) {
    value = value || '';
    this.$text.attr('data-text', value);
    if (this.$extendText) this.$extendText.attr('data-text', value);
  },
  get: function () {
    return this.$text.attr('data-text') | '';
  }
};
RibbonSplitButton.property.icon = {
  set: function (icon) {
    icon = icon || null;
    this._icon = icon;
    if (this.$icon) this.$primaryBtn.removeChild(this.$icon);

    if (icon) {
      this.$icon = _(icon);
      this.$primaryBtn.addChildBefore(this.$icon, this.$text);
      if (this.$icon.addClass) this.$icon.addClass('as-ribbon-split-button-icon');
    } else {
      this.$icon = null;
    }
  },
  get: function () {
    return this._icon;
  }
};
RibbonSplitButton.eventHandler = {};

RibbonSplitButton.eventHandler.clickPrimaryBtn = function () {
  this.emit('press', {
    type: 'press',
    target: this,
    item: (0, _utils.cleanMenuItemProperty)(this)
  });
};

_ACore.default.install(RibbonSplitButton);

var _default = RibbonSplitButton;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/RibbonButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/RibbonButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/ribbonbutton.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _RibbonSplitButton = _interopRequireDefault(require("./RibbonSplitButton"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function RibbonButton() {
  this.$icon = null;
  this._icon = null;
  this.$text = $('.as-ribbon-button-text', this);
  this.$textNode = this.$text.firstChild;
  this._menuHolder = null;
}

RibbonButton.tag = 'RibbonButton'.toLowerCase();

RibbonButton.render = function () {
  return _({
    tag: 'button',
    extendEvent: ['select'],
    attr: {
      'tabindex': '0'
    },
    class: ['as-ribbon-button', 'as-no-dropdown'],
    child: [{
      tag: 'span',
      class: 'as-ribbon-button-text',
      child: {
        text: ''
      }
    }, 'span.mdi.mdi-chevron-down']
  });
};

RibbonButton.property = Object.assign({}, _RibbonSplitButton.default.property);
RibbonButton.property.icon = {
  set: function (icon) {
    icon = icon || null;
    this._icon = icon;
    if (this.$icon) this.removeChild(this.$icon);

    if (icon) {
      this.$icon = _(icon);
      this.addChildBefore(this.$icon, this.$text);
      if (this.$icon.addClass) this.$icon.addClass('as-ribbon-button-icon');
    } else {
      this.$icon = null;
    }
  },
  get: function () {
    return this._icon;
  }
};
RibbonButton.eventHandler = {};

_ACore.default.install(RibbonButton);

var _default = RibbonButton;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TimeSelectInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TimeSelectInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/timeselectinput.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _datetime = require("absol/src/Time/datetime");

var _TimeInput = _interopRequireDefault(require("./TimeInput"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _utils = require("./utils");

var _Dom = require("absol/src/HTML5/Dom");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function TimeSelectInput() {
  /***
   *
   * @type {SelectListBox}
   */
  this.$selectlistBox = _({
    tag: 'selectlistbox',
    props: {
      anchor: [1, 6, 2, 5]
    },
    on: {
      preupdateposition: this.eventHandler.preUpdateListPosition
    }
  });
  this.$text = $('.as-time-select-input-text', this).on('change', this.eventHandler.textChange).on('keyup', this.eventHandler.textKeyUp).on('keydown', this.eventHandler.textKeyDown);
  this.$toggleBtn = $('absol-selectmenu-btn', this);
  this.$selectlistBox.on('pressitem', this.eventHandler.selectListBoxPressItem);
  this.$selectlistBox.followTarget = this;

  this._makeTimeList(0, _datetime.MILLIS_PER_DAY, _datetime.MILLIS_PER_MINUTE * 15);

  this._hour = 0;
  this._minute = 0;
  this._lastDayOffset = 0;
  this.dayOffset = 0;
  this.on('click', this.eventHandler.click);
}

TimeSelectInput.tag = 'TimeSelectInput'.toLowerCase();

TimeSelectInput.render = function () {
  return _({
    class: 'as-time-select-input',
    extendEvent: 'change',
    attr: {
      tabindex: 0
    },
    child: [{
      tag: 'input',
      class: 'as-time-select-input-text',
      attr: {
        type: 'text'
      }
    }, {
      tag: 'button',
      class: 'absol-selectmenu-btn',
      child: ['dropdown-ico']
    }]
  });
};

TimeSelectInput.prototype._makeTimeList = function (start, end, step) {
  var items = [];

  for (var t = 0; t < end; t += step) {
    items.push({
      text: this._mil2Text(t),
      value: t
    });
  }

  this.$selectlistBox.items = items;
  this.addStyle('--list-min-width', this.$selectlistBox._estimateWidth / 14 + 'em');
};

TimeSelectInput.prototype.textRegx = /^((1[0-2])|[1-9]):([0-5][0-9]) (AM|PM)$/;

TimeSelectInput.prototype._mil2Text = function (mil) {
  if (mil < 0) {
    mil = mil + Math.ceil(-mil / _datetime.MILLIS_PER_DAY) * _datetime.MILLIS_PER_DAY;
  }

  var min = Math.floor(mil / _datetime.MILLIS_PER_MINUTE);
  var hour = Math.floor(min / 60) % 24;
  min = min % 60;
  return (hour % 12 == 0 ? 12 : hour % 12) + ':' + (min < 10 ? '0' : '') + min + ' ' + (hour < 12 ? 'AM' : 'PM');
};
/***
 *
 * @param {string} s
 * @private
 */


TimeSelectInput.prototype._text2mil = function (s) {
  s = s.toLowerCase();
  var nums = s.match(/[0-9]+/g) || [0, 0];

  while (nums.length < 2) {
    nums.push(0);
  }

  var h = (0, _utils.positiveIntMod)(parseInt(nums[0]), 24);
  var m = (0, _utils.positiveIntMod)(parseInt(nums[1]), 60);
  var pm = s.indexOf('pm') > 0 || h > 12;

  if (pm) {
    if (h < 12) h += 12;
  } else {
    if (h == 12) h = 0;
  }

  return h * _datetime.MILLIS_PER_HOUR + m * _datetime.MILLIS_PER_MINUTE;
};

TimeSelectInput.prototype.isActive = function () {
  return document.activeElement == this || _AElement.default.prototype.isDescendantOf.call(document.activeElement, this) || _AElement.default.prototype.isDescendantOf.call(document.activeElement, this.$selectlistBox);
};

TimeSelectInput.prototype._updateValueText = function () {
  this.$text.value = this._mil2Text(this.dayOffset);
};

TimeSelectInput.prototype.notifyCanBeChange = function () {
  var dayOffset = this.dayOffset;

  if (this._lastDayOffset !== dayOffset) {
    this.emit('change', {
      type: 'change',
      lastDayOffset: this._lastDayOffset,
      dayOffset: dayOffset,
      target: this
    }, this);
    this._lastDayOffset = dayOffset;
  }
};

TimeSelectInput.property = {};
TimeSelectInput.property.isFocus = {
  get: function () {
    return this.hasClass('as-focus');
  },
  set: function (value) {
    value = !!value;
    if (this.isFocus == value) return;

    if (value) {
      this.addClass('as-focus');
    } else {
      this.removeClass('as-focus');
    }

    var thisI = this;

    if (value) {
      document.body.appendChild(this.$selectlistBox);
      this.$selectlistBox.domSignal.$attachhook.emit('attached');
      var bound = this.getBoundingClientRect();
      this.$selectlistBox.addStyle('min-width', bound.width + 'px');
      this.$selectlistBox.refollow();
      this.$selectlistBox.updatePosition();
      setTimeout(function () {
        if (thisI.enableSearch) {
          thisI.$selectlistBox.$searchInput.focus();
        }

        $(document.body).on('click', thisI.eventHandler.bodyClick);
      }, 1);
      this.$selectlistBox.viewListAtFirstSelected();
    } else {
      $(document.body).off('click', thisI.eventHandler.bodyClick);
      this.$selectlistBox.selfRemove();
      this.$selectlistBox.unfollow();
      this.$selectlistBox.resetSearchState();
    }
  }
};
TimeSelectInput.property.hour = {
  set: function (value) {
    this._hour = (0, _utils.positiveIntMod)(value, 24);
    this._lastDayOffset = this.dayOffset;

    this._updateValueText();
  },
  get: function () {
    return this._hour;
  }
};
TimeSelectInput.property.minute = {
  set: function (value) {
    this._minute = (0, _utils.positiveIntMod)(value, 60);
    this._lastDayOffset = this.dayOffset;

    this._updateValueText();
  },
  get: function () {
    return this._minute;
  }
};
TimeSelectInput.property.dayOffset = _TimeInput.default.property.dayOffset;
TimeSelectInput.property.disabled = {
  set: function (value) {
    this.$text.disabled = !!value;

    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
/***
 *
 * @type {{}|TimeSelectInput}
 */

TimeSelectInput.eventHandler = {};

TimeSelectInput.eventHandler.selectListBoxPressItem = function (event) {
  var lastValue = this._lastDayOffset;
  var value = event.value;

  var text = this._mil2Text(value);

  this.dayOffset = value;
  this.$selectlistBox.values = [value];
  this.focus();
  setTimeout(function () {
    this.isFocus = false;
  }.bind(this), 100);
  this._lastDayOffset = lastValue; // restore last value after set dayOffset

  this.notifyCanBeChange();
};

TimeSelectInput.eventHandler.preUpdateListPosition = function () {
  var bound = this.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  var availableTop = bound.top - 5;
  var availableBot = screenSize.height - 5 - bound.bottom;
  this.$selectlistBox.addStyle('--max-height', Math.max(availableBot, availableTop) + 'px');
  var outBound = (0, _Dom.traceOutBoundingClientRect)(this);

  if (bound.bottom < outBound.top || bound.top > outBound.bottom || bound.right < outBound.left || bound.left > outBound.right) {
    this.isFocus = false;
  }
};

TimeSelectInput.eventHandler.textChange = function () {
  setTimeout(function () {
    if (!this.textRegx.test(this.$text.value)) {
      this.$text.value = this._mil2Text(this.dayOffset);
    }
  }.bind(this), 10);
};
/***
 *
 * @param {KeyboardEvent} event
 */


TimeSelectInput.eventHandler.textKeyDown = function (event) {
  if (event.key == 'Enter') {
    this.isFocus = false;
    this.$text.blur();
    this.notifyCanBeChange();
  }
};

TimeSelectInput.eventHandler.textKeyUp = function (event) {
  var s = this.$text.value;

  var mil = this._text2mil(s);

  this._hour = Math.floor(mil / _datetime.MILLIS_PER_HOUR);
  this._minute = Math.floor(mil / _datetime.MILLIS_PER_MINUTE) % 60;
  this.$selectlistBox.values = [mil];
  this.$selectlistBox.viewListAtFirstSelected();
};

TimeSelectInput.eventHandler.click = function (event) {
  if (!_EventEmitter.default.hitElement(this.$text, event)) {
    this.isFocus = !this.isFocus;
    setTimeout(function () {
      if (this.isFocus && this.$text != document.activeElement) {
        this.$text.select();
      }
    }.bind(this), 1);
  } else {
    if (!this.isFocus) this.isFocus = true;
  }
};

TimeSelectInput.eventHandler.bodyClick = function (event) {
  if (_EventEmitter.default.hitElement(this, event) || _EventEmitter.default.hitElement(this.$selectlistBox, event)) return;
  this.isFocus = false;
};

_ACore.default.install(TimeSelectInput);

var _default = TimeSelectInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Snackbar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Snackbar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/snackbar.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _Dom = require("absol/src/HTML5/Dom");


var _ = _ACore.default._;
var $ = _ACore.default.$;
var t = document.createElement;
/***
 * @extends AElement
 * @constructor
 */

function SnackBar() {
  // OOP.drillProperty(this, this.firstChild, 'message', 'data');

  /***
   *
   * @type {*}
   */
  this._message = null;
  this.message = null;
}

SnackBar.tag = 'SnackBar'.toLowerCase();

SnackBar.render = function () {
  return _({
    class: 'as-snackbar'
  });
};

SnackBar.property = {};
SnackBar.property.message = {
  set: function (value) {
    this._message = value;

    if (value instanceof Array) {
      this.clearChild();
      this.addChild(value.map(function (item) {
        return _(item);
      }));
    } else if (typeof value === 'string') {
      this.innerHTML = value;
    } else if ((0, _Dom.isDomNode)(value)) {
      this.clearChild().addChild(value);
    } else if (value && typeof value === 'object' && (value.text || value.props || value.tag || value.attr || value.style || value.child || value.child && value.child instanceof Array)) {
      this.clearChild().addChild(_(value));
    } else {
      this.clearChild();
      this._message = null;
    }
  },
  get: function () {
    return this._message;
  }
};

_ACore.default.install(SnackBar);

SnackBar.$instance = _('snackbar');
SnackBar._removeTimeout = -1;

SnackBar.show = function (message) {
  if (SnackBar._removeTimeout > 0) {
    clearTimeout(SnackBar._removeTimeout);
  }

  if (!SnackBar.$instance.parentElement) document.body.appendChild(SnackBar.$instance);
  SnackBar.$instance.removeClass('as-hiding');
  SnackBar._removeTimeout = setTimeout(function () {
    SnackBar.$instance.addClass('as-show');
    SnackBar.$instance.message = message;
    SnackBar._removeTimeout = setTimeout(function () {
      SnackBar.$instance.removeClass('as-show').addClass('as-hiding');
      SnackBar._removeTimeout = setTimeout(function () {
        SnackBar.$instance.remove();
        SnackBar._removeTimeout = -1;
        SnackBar.$instance.removeClass('as-hiding');
      }, 500);
    }, 3000);
  }, 1);
};

var _default = SnackBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MultiSelectMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MultiSelectMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/multiselectmenu.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _SelectMenu = _interopRequireDefault(require("./SelectMenu2"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _PositionTracker = _interopRequireDefault(require("./PositionTracker"));

require("./SelectBoxItem");

var _SelectListBox = require("./SelectListBox");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _SelectBox = require("./SelectBox");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @augments SelectBox
 * @augments PositionTracker
 * @constructor
 */

function MultiSelectMenu() {
  this.on('click', this.eventHandler.click);
  /***
   *
   * @type {SelectListBox}
   */

  this.$selectlistBox = _({
    tag: 'selectlistbox',
    props: {
      anchor: [1, 6, 2, 5],
      displayValue: _SelectListBox.VALUE_HIDDEN
    },
    on: {
      preupdateposition: this.eventHandler.preUpdateListPosition,
      pressitem: this.eventHandler.selectListBoxPressItem
    }
  });
  this.$itemCtn = $('.as-multi-select-menu-item-ctn', this);
  this.$attachhook = $('attachhook', this).on('attached', this.eventHandler.attached);

  _OOP.default.drillProperty(this, this.$selectlistBox, 'enableSearch');

  this.$items = [];
  this._values = [];
  this.items = [];
  this.values = [];
  this.$selectlistBox.followTarget = this;
  this.disableClickToFocus = false;
  this.orderly = true;
  this.itemFocusable = false;
  this._activeValue = undefined;
  this.strictValue = true;
}

MultiSelectMenu.tag = 'MultiSelectMenu'.toLowerCase();

MultiSelectMenu.render = function () {
  return _({
    class: ['as-multi-select-menu'],
    extendEvent: ['change', 'add', 'remove', 'activevaluechange'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: ['as-multi-select-menu-item-ctn', 'as-bscroller']
    }, {
      tag: 'button',
      class: 'as-multi-select-menu-toggle-btn',
      child: 'dropdown-ico'
    }, 'attachhook']
  });
};

MultiSelectMenu.prototype._requireItem = function (n) {
  var itemElt;

  while (this.$items.length < n) {
    itemElt = (0, _SelectBox.requireItem)(this);
    this.$itemCtn.addChild(itemElt);
    this.$items.push(itemElt);
  }

  while (this.$items.length > n) {
    itemElt = this.$items.pop();
    this.$itemCtn.removeChild(itemElt);
    (0, _SelectBox.releaseItem)(itemElt);
  }
};

MultiSelectMenu.prototype._assignItems = function (items) {
  for (var i = 0; i < this.$items.length && i < items.length; ++i) {
    this.$items[i].data = items[i];
  }
};
/***
 *
 * @param {string[] | number[]} values
 * @private
 */


MultiSelectMenu.prototype._getItemsByValues = function (values) {
  var selectListBoxElt = this.$selectlistBox;
  var itemHolders = values.reduce(function (ac, cr) {
    ac.push.apply(ac, selectListBoxElt.findItemsByValue(cr));
    return ac;
  }, []);

  if (this.orderly) {
    if (typeof this.orderly === 'function') {
      itemHolders.sort(this.orderly);
    } else {
      itemHolders.sort(function (a, b) {
        return a.idx - b.idx;
      });
    }
  }

  return itemHolders.map(function (holder) {
    return holder.item;
  });
};

MultiSelectMenu.prototype._updateItems = function () {
  this.viewItemsByValues(this._values);
};

MultiSelectMenu.prototype.viewItemsByValues = function (values) {
  var cBound = this.getBoundingClientRect();

  var items = this._getItemsByValues(values);

  this._requireItem(items.length);

  this._assignItems(items);

  if (this.itemFocusable) {
    this._updateFocusItem();
  }

  var nBound = this.getBoundingClientRect();

  if (nBound.width != cBound.width || nBound.height != cBound.height) {
    _ResizeSystem.default.updateUp(this);
  }
};

MultiSelectMenu.property = {};
MultiSelectMenu.property.disabled = _SelectMenu.default.property.disabled;
MultiSelectMenu.property.hidden = _SelectMenu.default.property.hidden;
MultiSelectMenu.property.isFocus = _SelectMenu.default.property.isFocus;
MultiSelectMenu.property.readOnly = _SelectMenu.default.property.readOnly;

MultiSelectMenu.prototype.init = function (props) {
  props = props || [];
  Object.keys(props).forEach(function (key) {
    if (props[key] === undefined) delete props[key];
  });
  this.super(props);
};

MultiSelectMenu.prototype._updateFocusItem = function () {
  for (var i = 0; i < this.$items.length; ++i) {
    this.$items[i].active = this.$items[i].value == this._activeValue;
  }
};

MultiSelectMenu.prototype.init = _SelectMenu.default.prototype.init;

MultiSelectMenu.prototype._implicit = function (values) {
  if (values === null || values === undefined) values = [];

  if (!(values instanceof Array)) {
    values = [values];
  }

  values = values.filter(function (value) {
    var type = typeof value;
    return type === 'string' || type === 'number' || type === "boolean" || value === null || value === undefined;
  }).reduce(function (ac, cr) {
    if (!ac.dict[cr]) {
      ac.dict[cr] = true;
      ac.result.push(cr);
    }

    return ac;
  }, {
    result: [],
    dict: {}
  }).result;
  return values;
};

MultiSelectMenu.prototype._explicit = function (values) {
  var selectListBoxElt = this.$selectlistBox;
  var strictValue = this.strictValue;
  values = values.filter(function (value) {
    if (!strictValue) return true;
    var cts = selectListBoxElt.findItemsByValue(value);
    if (cts && cts.length > 0) return true;
    return false;
  });
  return values;
};

MultiSelectMenu.property.items = {
  set: function (items) {
    items = items || [];
    this.$selectlistBox.items = items;
    this.addStyle('--list-min-width', this.$selectlistBox._estimateWidth + 'px');

    this._updateItems();
  },
  get: function () {
    return this.$selectlistBox.items;
  }
};
MultiSelectMenu.property.values = {
  set: function (values) {
    values = this._implicit(values);
    this._values = values;
    this.$selectlistBox.values = values;

    this._updateItems();
  },
  get: function () {
    return this._explicit(this._values);
  }
};
MultiSelectMenu.property.orderly = {
  set: function (value) {
    var needUpdate = this._orderly === this._orderly;

    if (typeof value === 'function') {
      this._orderly;
    } else this._orderly = !!value;

    if (needUpdate) {
      this.values = this.values;
    }
  },
  get: function () {
    return !!this._orderly;
  }
};
MultiSelectMenu.property.disableClickToFocus = {
  set: function (value) {
    if (value) {
      this.addClass('as-disable-click-to-focus');
    } else {
      this.removeClass('as-disable-click-to-focus');
    }
  },
  get: function () {
    return this.hasClass('as-disable-click-to-focus');
  }
};
MultiSelectMenu.property.itemFocusable = {
  set: function (value) {
    if (value) {
      this.addClass('as-item-focusable');
    } else {
      this.removeClass('as-item-focusable');
    }

    this._updateFocusItem();
  },
  get: function () {
    return this.hasClass('as-item-focusable');
  }
};
MultiSelectMenu.property.activeValue = {
  set: function (value) {
    this._activeValue = value;

    if (this.itemFocusable) {
      this._updateFocusItem(); //todo

    }
  },
  get: function () {
    return this._activeValue;
  }
};
MultiSelectMenu.property.strictValue = {
  set: function (value) {
    if (value) {
      this.attr('data-strict-value', null);
    } else {
      this.attr('data-strict-value', 'false');
    }
  },
  get: function () {
    var data = this.attr('data-strict-value');
    return !data || data != 'false' && data !== '0';
  }
};
MultiSelectMenu.eventHandler = Object.assign({}, _SelectMenu.default.eventHandler);

MultiSelectMenu.eventHandler.attached = function () {
  var maxHeightStyle = this.getComputedStyleValue('max-height') || 'none';

  if (maxHeightStyle.match(/[0-9-]+px/)) {
    this.addStyle('--multi-select-menu-max-height', maxHeightStyle);
    this.addStyle('max-height', 'unset');
  } else if (maxHeightStyle !== 'none') {
    console.warn('Can not adapt max-height:', maxHeightStyle);
  }
};

MultiSelectMenu.eventHandler.click = function (event) {
  if ((event.target === this || event.target === this.$itemCtn) && !this.disableClickToFocus && !this.readOnly) {
    this.isFocus = !this.isFocus;
  }
};

MultiSelectMenu.eventHandler.bodyClick = function (event) {
  if (!_EventEmitter.default.hitElement(this.$selectlistBox, event) && event.target !== this && event.target !== this.$itemCtn) {
    this.isFocus = false;
  }
};

MultiSelectMenu.eventHandler.selectListBoxPressItem = function (event) {
  var data = event.data;
  var currentValues = this.$selectlistBox.values;
  currentValues.push(data.value);
  this.$selectlistBox.values = currentValues;
  this.$selectlistBox.updatePosition();
  this._values = currentValues.slice();
  this._activeValue = data.value;

  this._updateItems();

  this.isFocus = false;
  this.emit('add', Object.assign({}, event, {
    type: 'add',
    target: this,
    value: data.value,
    data: data,
    itemData: data
  }), this);
  this.emit('change', Object.assign({}, event, {
    type: 'change',
    action: 'add',
    target: this,
    value: data.value,
    data: data,
    values: this.values
  }), this);
};

MultiSelectMenu.eventHandler.pressItem = function (item, event) {
  var value = item.value;

  if (this.itemFocusable) {
    var prevActiveValue = this.activeValue;

    if (value !== prevActiveValue) {
      this.activeValue = value;
      this.emit('activevaluechange', {
        target: this,
        originEvent: event,
        prevActiveValue: prevActiveValue,
        activeValue: value
      }, this);
    }
  }
};

MultiSelectMenu.eventHandler.pressCloseItem = function (item, event) {
  var value = item.value;
  var data = item.data;
  var index;
  index = this._values.indexOf(value);

  if (index >= 0) {
    this._values.splice(index, 1);

    this._updateItems();

    this.$selectlistBox.values = this._values;
    this.emit('remove', Object.assign({}, event, {
      type: 'change',
      target: this,
      data: data,
      value: value,
      itemData: data
    }), this);
    this.emit('change', Object.assign({}, event, {
      type: 'change',
      action: 'remove',
      target: this,
      data: data,
      value: value,
      itemData: data
    }), this);
  }
};

_ACore.default.install(MultiSelectMenu);

var _default = MultiSelectMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CountdownClock.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CountdownClock.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _Element = _interopRequireDefault(require("absol/src/HTML5/Element"));

require("../css/countdownclock.css");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _int = require("absol/src/Math/int");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function CountdownClock() {
  var thisC = this;
  this.$attachhook = _('attachhook').addTo(this).on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdateSize();

    if (thisC.autoStart) {
      thisC.start();
    }
  });
  this.$attachhook.requestUpdateSize = this._updateBorder.bind(this);
  this._tick = this._tick.bind(this);
  this.$border = $(".as-countdown-clock-border", this);
  this.$min = $(".as-countdown-clock-min", this);
  this.$sec = $(".as-countdown-clock-sec", this);
  this._prevText = -1;
  this._startTime = new Date().getTime();
  this._totalSecond = 60;
  this._remainSecond = 0;
  this.totalSecond = 60;
  this.remainSecond = 0;
  this._intvId = -1;
}

CountdownClock.tag = 'CountdownClock'.toLowerCase();

CountdownClock.render = function () {
  return _({
    extendEvent: ['finish', 'update'],
    class: 'as-countdown-clock',
    child: [{
      class: 'as-countdown-clock-text',
      child: [{
        tag: 'span',
        class: 'as-countdown-clock-min',
        child: {
          text: 0
        }
      }, {
        text: ':'
      }, {
        tag: 'span',
        class: 'as-countdown-clock-sec',
        child: {
          text: '60'
        }
      }]
    }, {
      class: 'as-countdown-clock-border-wrapper',
      child: {
        class: 'as-countdown-clock-border'
      }
    }]
  });
};

CountdownClock.prototype._makePolygon = function (end) {
  var n = Math.ceil(Math.max(end / 0.2, 2));
  var fan = Array(n).fill(0).map(function (u, i) {
    var angle = -Math.PI / 2 + end * i / n;
    return [(0, _int.numberAutoFixed)(50 + 60 * Math.cos(angle), 5) + '%', (0, _int.numberAutoFixed)(50 + 60 * Math.sin(angle), 5) + '%'].join(' ');
  });
  fan.push('50% 50%');
  return 'polygon(' + fan.join(', ') + ')';
};

CountdownClock.prototype._setBorderValue = function (val) {
  if (val >= 1 || !isFinite(val)) {
    this.$border.removeStyle("clip-path");
    return;
  }

  var bound = this.$border.getBoundingClientRect();
  var angle = val * Math.PI * 2;
  this.$border.addStyle("-webkit-clip-path", this._makePolygon(angle));
  this.$border.addStyle("clip-path", this._makePolygon(angle));
};

CountdownClock.prototype._updateBorder = function () {
  this._setBorderValue(this._remainSecond / Math.max(0.001, this._totalSecond));
};

CountdownClock.prototype._updateText = function () {
  if (this._prevText === this.remainSecond) return;
  var remainSecond = this.remainSecond;
  var min = Math.floor(remainSecond / 60);
  var sec = remainSecond % 60;
  this.$sec.innerHTML = (sec < 10 ? "0" : "") + sec;
  this.$min.innerHTML = min;
};

CountdownClock.prototype._tick = function () {
  var now = new Date().getTime();
  var prevSec = this.remainSecond;
  this.remainSecond = Math.max(0, Math.ceil(this.totalSecond - (now - this._startTime) / 1000));

  if (prevSec !== this.remainSecond) {
    this._updateText();

    this.emit('update', {
      target: this,
      type: 'update'
    }, this);

    if (this.remainSecond === 0) {
      clearInterval(this._intvId);
      this._intvId = -1;
      this.emit('finish', {
        target: this,
        type: 'finish'
      }, this);
    }
  }
};

CountdownClock.prototype.start = function () {
  if (this.remainSecond == 0) this.remainSecond = this.totalSecond;
  this._startTime = new Date().getTime() - (this.totalSecond - this.remainSecond) * 1000;
  this.resume();
};

CountdownClock.prototype.resume = function () {
  if (this._intvId > 0) return;
  this._intvId = setInterval(this._tick, 200);
};

CountdownClock.prototype.pause = function () {
  if (this._intvId > 0) {
    clearInterval(this._intvId);
    this._intvId = -1;
  }
};

CountdownClock.prototype.stop = function () {
  this.pause();
  this.remainSecond = 0;
};

CountdownClock.prototype.reset = function () {
  this.remainSecond = this.totalSecond;
  this._startTime = new Date().getTime();
};

CountdownClock.property = {};
CountdownClock.property.totalSecond = {
  set: function (value) {
    if (!(value >= 0)) {
      value = 0;
    }

    this._totalSecond = value;

    this._updateBorder();
  },
  get: function () {
    return this._totalSecond;
  }
};
CountdownClock.property.remainSecond = {
  set: function (value) {
    if (!(value >= 0)) {
      value = 0;
    }

    this._remainSecond = value;

    this._updateBorder();

    this._updateText();
  },
  get: function () {
    return this._remainSecond;
  }
};

_ACore.default.install(CountdownClock);

var _default = CountdownClock;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/VariantColors.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/VariantColors.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/variantcolors.css");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


function VariantColor() {
  this.keys = ['primary', 'secondary', 'success', 'info', 'warning', 'error', 'danger', 'light', 'dark', 'link', 'note'];
  this.base = {
    primary: "#007bff",
    secondary: "#6c757d",
    success: "#28a745",
    info: "#17a2b8",
    warning: "#ffc107",
    error: "#ff4052",
    danger: "#dc3545",
    light: "#f8f9fa",
    dark: "#343a40",
    link: "#007bff",
    note: '#ffff88'
  };
  this.mediumContract = {
    primary: '#e2edd5',
    secondary: '#fca75b',
    success: '#fce8e8',
    info: '#fcf5e8',
    warning: '#5e5a75',
    error: '#e0dfce',
    danger: "#e5e8d5",
    light: '#7a5b3c',
    dark: "#bf7d3b",
    link: "#dde8c9",
    note: '#1e1ec8'
  };

  _Dom.default.documentReady.then(this.loadFromCss.bind(this));
}

VariantColor.prototype.has = function (name) {
  return this.keys.indexOf(name) >= 0;
};

VariantColor.prototype.loadFromCss = function () {
  this.base = this.keys.reduce(function (ac, name) {
    var style = window.getComputedStyle(document.body);
    ac[name] = style.getPropertyValue('--variant-color-' + name);
    return ac;
  }, {});
  this.mediumContract = this.keys.reduce(function (ac, name) {
    var style = window.getComputedStyle(document.body);
    ac[name] = style.getPropertyValue('--variant-medium-contract-color-' + name);
    return ac;
  }, {});
};

var _default = new VariantColor();

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Toast.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Toast.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/toast.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Element = _interopRequireDefault(require("absol/src/HTML5/Element"));

var _VariantColors = _interopRequireDefault(require("./VariantColors"));

var _utils = require("./utils");

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));




var $ = _ACore.default.$;
var _ = _ACore.default._;
var toastBg = {
  success: "#a4f3b6",
  info: "#67d5e7"
};
var toastTextColor = {
  success: '#454040',
  info: '#48433b'
};
(0, _utils.buildCss)(_VariantColors.default.keys.reduce(function (ac, cr) {
  var color = _Color.default.parse(toastBg[cr] || _VariantColors.default.base[cr]);

  var textColor = color.getContrastYIQ();
  var headerColor = toastTextColor[cr] || _VariantColors.default.mediumContract[cr] || color.getHightContrastColor();
  ac['.as-toast.as-variant-' + cr + ' .as-toast-variant-color'] = {
    'background-color': color.toString('hex6')
  };
  ac['.as-toast.as-variant-background.as-variant-' + cr] = {
    'background-color': color.toString('hex6'),
    color: textColor.toString('hex6')
  };
  ac['.as-toast.as-variant-background.as-variant-' + cr + ' .as-toast-header'] = {
    color: headerColor.toString('hex6')
  };
  return ac;
}, {}));
/***
 * @extends {AElement}
 * @constructor
 */

function Toast() {
  this._state = 0;
  this.$closeBtn = $('.as-toast-close-btn', this).on('click', this.disappear.bind(this));
  this.$title = $('.as-toast-title', this);
  this.$timeText = $('.as-toast-time-text', this);
  this.$body = $('.toast-body', this);
  this.$attachhook = $('attachhook', this).on('attached', this.appear.bind(this));

  _OOP.default.drillProperty(this, this.$title.firstChild, 'htitle', 'data');

  this._message = null;
  this.$message = null;
  this.disappearTimeout = 0;
  this.htitle = 'Toast.htitle';
  this.timeText = new Date();
  this.message = null;
  this.variant = null;
}

Toast.tag = 'toast';
['addChild', 'removeChild', 'clearChild', 'addChildBefore', 'addChildAfter'].forEach(function (key) {
  Toast.prototype[key] = function () {
    this.$body[key].apply(this.$body, arguments);
  };
});

Toast.render = function () {
  return _({
    extendEvent: ['appeared', 'disappeared'],
    class: ['as-toast', 'as-not-appeared'],
    child: [{
      class: 'as-toast-header',
      child: ['.as-toast-variant-color', {
        tag: 'strong',
        class: 'as-toast-title',
        child: {
          text: "Absol Js"
        }
      }, {
        tag: 'smal',
        class: 'as-toast-time-text',
        child: {
          text: '20 mis ago'
        }
      }, {
        tag: 'button',
        class: 'as-toast-close-btn',
        child: {
          tag: 'span',
          child: {
            text: '×'
          }
        }
      }]
    }, {
      class: 'toast-body'
    }, 'attachhook']
  });
};

Toast.prototype.disappear = function () {
  if (this._state !== 2) return;
  this._state = 3;
  this.addClass('as-disappearing');
  setTimeout(function () {
    this.removeClass('as-disappeared').removeClass('as-disappearing').addClass('as-not-appeared');
    this.remove();
    this.emit('disappeared', {
      target: this,
      type: 'disappeared'
    }, this);
  }.bind(this), 500);
};

Toast.prototype.appear = function () {
  if (this._state !== 0) return;
  this._state = 1;
  this.addClass('as-appearing');
  setTimeout(function () {
    this.removeClass('as-not-appeared').addClass('as-appeared').removeClass('as-appearing');
    this._state = 2;
    this.emit('appeared', {
      target: this,
      type: 'appeared'
    }, this);

    if (this.disappearTimeout > 0 && this.disappearTimeout < Infinity) {
      setTimeout(this.disappear.bind(this), this.disappearTimeout);
    }
  }.bind(this), 100);
};

Toast.property = {};
Toast.property.variant = {
  set: function (value) {
    if (this._variant && this._variant !== value) {
      this.removeClass('as-variant-' + this._variant);
    }

    if (_VariantColors.default.has(value) || ['sticky-note'].indexOf(value) >= 0) {
      this._variant = value;
      this.addClass('as-variant-' + this._variant);
    }
  },
  get: function () {
    return this._variant;
  }
};
Toast.property.message = {
  set: function (value) {
    if (typeof value !== "string" || value.length === 0) {
      value = null;
    }

    if (value) {
      if (!this.$message) {
        this.$message = _({
          class: 'as-toast-message',
          child: {
            text: ''
          }
        });
      }

      if (!this.$message.parentElement) this.$body.addChild(this.$message);
      this.$message.firstChild.data = value;
    } else {
      if (this.$message && this.$message.parentElement) {
        this.$message.remove();
      }
    }

    this._message = value;
  },
  get: function () {
    return this._message;
  }
};
Toast.property.timeText = {
  set: function (value) {
    if (value instanceof Date) {
      value = value.toLocaleTimeString();
    } else {
      value = value + '';
    }

    this.$timeText.firstChild.data = value;
  },
  get: function () {
    return this.$timeText.firstChild.data;
  }
};
Toast.$toastList = _('.as-toast-list.as-se.as-bscroller');
Toast.$toastList4Pos = {
  se: Toast.$toastList,
  sw: _('.as-toast-list.as-sw.as-bscroller'),
  nw: _('.as-toast-list.as-nw.as-bscroller'),
  ne: _('.as-toast-list.as-ne.as-bscroller'),
  sc: _('.as-toast-list.as-sc.as-bscroller')
};

_Dom.default.documentReady.then(function () {
  Toast.$toastList.addTo(document.body);
  Toast.$toastList4Pos.sw.addTo(document.body);
  Toast.$toastList4Pos.nw.addTo(document.body);
  Toast.$toastList4Pos.ne.addTo(document.body);
  Toast.$toastList4Pos.sc.addTo(document.body);
});
/***
 *
 * @param {AbsolConstructDescriptor|{}} aObject,
 * @param {"se"|"sw"|"ne"|"nw"|"sc" } [pos="se"]
 * @return {AElementNS|AElement|Text}
 */


Toast.make = function (aObject, pos) {
  if (!Toast.$toastList4Pos[pos]) pos = "se";
  aObject = aObject || {};
  if (typeof aObject !== "object") throw new Error("param must be AbsolConstructDescriptor object!");

  if ((0, _Dom.isDomNode)(aObject)) {} else {
    aObject.tag = aObject.tag || 'toast';
  }

  var toastElt = _(aObject);

  var toastListElt = Toast.$toastList4Pos[pos] || Toast.$toastList;
  toastListElt.addChild(toastElt);
  return toastElt;
};

_ACore.default.install(Toast);

var _default = Toast;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/PageIndicator.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/PageIndicator.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

require("../css/pageindicator.css");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function PageIndicator() {
  this._idx = -1;
  this.length = 0;
  this.idx = -1;
}

PageIndicator.tag = 'PageIndicator'.toLowerCase();

PageIndicator.render = function () {
  return _({
    class: 'as-page-indicator',
    child: []
  });
};

PageIndicator.property = {};
PageIndicator.property.length = {
  set: function (value) {
    value = value || 0;
    value = Math.max(0, value);

    while (this.childNodes.length < value) {
      this.addChild(_('button.as-page-indicator-item'));
    }

    while (this.childNodes.length > value) {
      this.removeChild(this.childNodes[this.childNodes.length - 1]);
    }

    this.idx = this._idx; //update
  },
  get: function () {
    return this.childNodes.length;
  }
};
PageIndicator.property.idx = {
  set: function (value) {
    var activeElt = this.childNodes[this._idx];
    if (activeElt) activeElt.removeClass('as-active');
    this._idx = value;
    activeElt = this.childNodes[this._idx];
    if (activeElt) activeElt.addClass('as-active');
  },
  get: function () {
    return this._idx;
  }
};

_ACore.default.install(PageIndicator);

var _default = PageIndicator;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/EmojiPickerTooltip.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/EmojiPickerTooltip.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/emojipickertooltip.css");

var _Tooltip = require("./Tooltip");

var _ACore = _interopRequireDefault(require("../ACore"));

var _EmojiPicker = _interopRequireDefault(require("./EmojiPicker"));

var _EmojiAnims = _interopRequireDefault(require("./EmojiAnims"));

var _PositionTracker = _interopRequireDefault(require("./PositionTracker"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _Dom = require("absol/src/HTML5/Dom");

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _PageIndicator = _interopRequireDefault(require("./PageIndicator"));

var _Hanger = _interopRequireDefault(require("./Hanger"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
var isMobile = _BrowserDetector.default.isMobile;
/***
 * @augments Tooltip
 * @augments AElement
 * @augments Hanger
 * @constructor
 */

function EmojiPickerTooltip() {
  if (isMobile) {
    _({
      tag: _Hanger.default.tag,
      elt: this,
      on: {
        predrag: this.eventHandler.preDragTT,
        dragstart: this.eventHandler.dragStartTT,
        drag: this.eventHandler.dragTT,
        dragend: this.eventHandler.dragEndTT
      }
    });
  }

  this.$iconList = $('.as-emoji-picker-tooltip-icon-list', this);
  this.$leftBtn = $('.as-emoji-picker-tooltip-left-btn', this).on('click', this.eventHandler.clickLeft);
  this.$scroller = $('.as-emoji-picker-tooltip-scroller', this);
  this.$rightBtn = $('.as-emoji-picker-tooltip-right-btn', this).on('click', this.eventHandler.clickRight);
  this.$removeBtn = $('.as-emoji-picker-tooltip-remove-btn', this).on('click', this.eventHandler.clickRemove);
  this.$pageIndicatior = $('pageindicator', this);
  this._iconButtonCache = {};
  this._icons = [];
  this.icons = EmojiPickerTooltip.defaultIcons;
}

EmojiPickerTooltip.tag = 'EmojiPickerTooltip'.toLowerCase();
EmojiPickerTooltip.defaultIcons = [';(', '(sarcastic)', ':O', '(cwl)', '(heart)', '(y)', '(n)', '(rock)', '(facepalm)', '(xd)', ':$', '(waiting)', '(headbang)', '(ghost)', '(clap)', '(punch)', '(ok)', '(angry)'];
EmojiPickerTooltip.emojiDict = _EmojiAnims.default.reduce(function (ac, cr) {
  ac[cr[0]] = {
    imageFileName: cr[1],
    text: cr[0],
    desc: cr[2]
  };
  return ac;
}, {});

EmojiPickerTooltip.render = function () {
  return _({
    tag: 'tooltip',
    extendEvent: ['pick'],
    class: ['as-emoji-picker-tooltip'].concat(isMobile ? ['as-mobile'] : []),
    child: [{
      tag: 'button',
      class: 'as-emoji-picker-tooltip-left-btn',
      child: 'span.mdi.mdi-chevron-left'
    }, {
      class: 'as-emoji-picker-tooltip-scroller',
      child: {
        class: 'as-emoji-picker-tooltip-icon-list'
      }
    }, {
      tag: 'button',
      class: 'as-emoji-picker-tooltip-right-btn',
      child: 'span.mdi.mdi-chevron-right'
    }, {
      tag: 'button',
      attr: {
        title: 'Remove Emoji'
      },
      class: 'as-emoji-picker-tooltip-remove-btn',
      child: 'span.mdi.mdi-close'
    }, {
      tag: 'pageindicator',
      class: 'as-emoji-picker-tooltip-page-indicator',
      props: {
        length: 3,
        idx: 0
      }
    }]
  }, true);
};
/*var */


EmojiPickerTooltip.prototype._makeIconBtn = function (iconText) {
  var icon = EmojiPickerTooltip.emojiDict[iconText];
  var url = _EmojiPicker.default.assetRoot + '/anim/x40/' + icon.imageFileName;

  var spriteElt = _({
    tag: 'sprite',
    class: 'as-emoji-picker-tooltip-icon',
    attr: {
      title: icon.desc
    },
    props: {
      src: url,
      loop: true,
      fps: 30,
      debug: true
    },
    on: {
      ready: function () {
        this.frames = {
          type: 'grid',
          col: 1,
          row: this.texture.naturalHeight / this.texture.naturalWidth
        };
        this.frameIndex = 0;
      }
    }
  });

  var buttonElt = _({
    tag: 'button',
    class: 'as-emoji-picker-tooltip-icon-btn',
    child: spriteElt,
    on: {
      click: this.eventHandler.clickIconBtn.bind(null, icon)
    }
  });

  buttonElt.on('mouseenter', function () {
    spriteElt.play();
  }).on('mouseleave', function () {
    spriteElt.stop();
    spriteElt.frameIndex = 0;
  });
  return buttonElt;
};

EmojiPickerTooltip.prototype._updateIconList = function () {
  this.$iconList.clearChild();
  var iconText;

  for (var i = 0; i < this._icons.length; ++i) {
    iconText = this._icons[i];
    this._iconButtonCache[iconText] = this._iconButtonCache[iconText] || this._makeIconBtn(iconText);
    this.$iconList.addChild(this._iconButtonCache[iconText]);
  }
};

EmojiPickerTooltip.property = {};
EmojiPickerTooltip.property.icons = {
  set: function (icons) {
    this._icons = icons || [];

    this._updateIconList();

    this.viewOffset = 0;
    this.$pageIndicatior.length = Math.ceil(this._icons.length / 6);
  },
  get: function () {
    return this._icons;
  }
};
EmojiPickerTooltip.property.viewOffset = {
  set: function (value) {
    this._viewOffset = Math.max(0, Math.min(value, this._icons.length - 6));
    this.$iconList.addStyle('left', -(100 * this._viewOffset / 6) + '%');
    this.$leftBtn.disabled = this._viewOffset === 0;
    this.$rightBtn.disabled = this._viewOffset === this._icons.length - 6;
    this.$pageIndicatior.idx = Math.floor(this._viewOffset / 6);
  },
  get: function () {
    return this._viewOffset;
  }
};
EmojiPickerTooltip.eventHandler = {};

EmojiPickerTooltip.eventHandler.clickLeft = function () {
  this.viewOffset -= 6;
};

EmojiPickerTooltip.eventHandler.clickRight = function () {
  this.viewOffset += 6;
};

EmojiPickerTooltip.eventHandler.clickIconBtn = function (icon) {
  if (this._preventClick) return;
  this.emit('pick', Object.assign({
    type: 'pick',
    icon: icon,
    target: this
  }, icon), this);
};

EmojiPickerTooltip.eventHandler.clickRemove = function () {
  this.emit('pick', Object.assign({
    type: 'pressremove',
    icon: "REMOVE",
    target: this
  }), this);
};

EmojiPickerTooltip.eventHandler.preDragTT = function (event) {
  var scrollerBound = this.$scroller.getBoundingClientRect();
  var listBound = this.$iconList.getBoundingClientRect();
  this._scrollData = {
    left: listBound.left - scrollerBound.left,
    scrollerWidth: scrollerBound.width,
    newLeft: listBound.left - scrollerBound.left
  };
};

EmojiPickerTooltip.eventHandler.dragStartTT = function () {
  this.addClass('as-scrolling');
  this._preventClick = true;
};

EmojiPickerTooltip.eventHandler.dragTT = function (event) {
  event.preventDefault();
  var dx = event.currentPoint.sub(event.startingPoint).x;
  var newLeft = Math.min(0, Math.max(-this._scrollData.scrollerWidth * 2, this._scrollData.left + dx));
  this._scrollData.newLeft = newLeft;
  this.$iconList.addStyle('left', newLeft + 'px');
};

EmojiPickerTooltip.eventHandler.dragEndTT = function (event) {
  event.preventDefault();
  this.removeClass('as-scrolling');
  var dOffset = (this._scrollData.left - this._scrollData.newLeft) / this._scrollData.scrollerWidth;

  if (dOffset > 0.25) {
    dOffset = 1;
  } else if (dOffset < -0.25) {
    dOffset = -1;
  } else {
    dOffset = 0;
  }

  this.viewOffset += dOffset * 6;
  setTimeout(function () {
    this._preventClick = false;
  }.bind(this), 5);
};

_ACore.default.install(EmojiPickerTooltip);

EmojiPickerTooltip._session = Math.random() * 10000000000 >> 0;

function prepare() {
  if (EmojiPickerTooltip.$holder) return;
  EmojiPickerTooltip.$holder = _('.absol-tooltip-root-holder');
  EmojiPickerTooltip.$tooltip = _('emojipickertooltip.top').addTo(EmojiPickerTooltip.$holder).on('pick', function (event) {
    EmojiPickerTooltip._listener && EmojiPickerTooltip._listener(event.icon);
  });
  /***
   *
   * @type {PositionTracker|undefined}
   */

  EmojiPickerTooltip.$element = undefined;
  EmojiPickerTooltip.$content = undefined;
  EmojiPickerTooltip._orientation = 'auto';
  EmojiPickerTooltip._session = Math.random() * 10000000000 >> 0;
  EmojiPickerTooltip._listener = undefined;
  EmojiPickerTooltip._scrollOutListener = undefined;
  EmojiPickerTooltip.$tooltip.$arrow.updateSize = EmojiPickerTooltip.updatePosition;
}

EmojiPickerTooltip.updatePosition = function () {
  if (!EmojiPickerTooltip.$element) return;

  var outBound = _Rectangle.default.fromClientRect((0, _Dom.traceOutBoundingClientRect)(EmojiPickerTooltip.$element));

  var eBound = _Rectangle.default.fromClientRect(EmojiPickerTooltip.$element.getBoundingClientRect());

  if (!outBound.isCollapse(eBound, 0)) {
    EmojiPickerTooltip._scrollOutListener && EmojiPickerTooltip._scrollOutListener();
  }

  (0, _Tooltip.updateTooltipPosition)(EmojiPickerTooltip);
};

EmojiPickerTooltip.updatePosition = EmojiPickerTooltip.updatePosition.bind(EmojiPickerTooltip);

EmojiPickerTooltip.show = function (element, menuListener, orientation) {
  prepare();

  if (EmojiPickerTooltip.$element) {
    EmojiPickerTooltip.$element.stopTrackPosition();
    EmojiPickerTooltip.$element.off('positionchange', EmojiPickerTooltip.updatePosition);
  }

  if (!element.startTrackPosition) {
    _({
      tag: _PositionTracker.default.tag,
      elt: element
    });
  }

  element.startTrackPosition();
  EmojiPickerTooltip.$element = element;
  EmojiPickerTooltip.$element.on('positionchange', EmojiPickerTooltip.updatePosition);
  EmojiPickerTooltip._listener = menuListener;
  EmojiPickerTooltip._session = Math.random() * 10000000000 >> 0;
  EmojiPickerTooltip._orientation = orientation || 'auto';
  EmojiPickerTooltip.$holder.addTo(document.body);

  _ResizeSystem.default.add(EmojiPickerTooltip.$tooltip.$arrow);

  EmojiPickerTooltip.$tooltip.viewOffset = 0;
  EmojiPickerTooltip.$tooltip.addClass('top').removeClass('left').removeClass('right').removeClass('bottom').removeClass('ne').removeClass('nw').removeClass('auto');
  EmojiPickerTooltip.updatePosition();
  return EmojiPickerTooltip._session;
};

EmojiPickerTooltip.close = function (token) {
  if (EmojiPickerTooltip._session !== token) return;

  if (EmojiPickerTooltip.$element) {
    EmojiPickerTooltip.$element.stopTrackPosition();
    EmojiPickerTooltip.$element.off('positionchange', EmojiPickerTooltip.updatePosition);
  }

  EmojiPickerTooltip.$element = undefined;
  EmojiPickerTooltip._listener = undefined;
  EmojiPickerTooltip._session = Math.random() * 10000000000 >> 0;
  EmojiPickerTooltip.$holder.remove();
};

EmojiPickerTooltip.toggleWhenClick = function (trigger, adaptor) {
  var res = {
    trigger: trigger,
    adaptor: adaptor,
    currentSession: undefined
  };

  function clickHandler(event) {
    if (res.currentSession === EmojiPickerTooltip._session) return;
    res.currentSession = EmojiPickerTooltip.show(res.adaptor.getFlowedElement ? res.adaptor.getFlowedElement() : trigger, res.adaptor.onSelect, res.adaptor.orientation || 'auto');
    if (res.adaptor.onOpen) res.adaptor.onOpen();

    var finish = function (event) {
      if (event && ((0, _EventEmitter.hitElement)(EmojiPickerTooltip.$tooltip.$leftBtn, event) || (0, _EventEmitter.hitElement)(EmojiPickerTooltip.$tooltip.$rightBtn, event)) || event && event.target && event.target.classList.contains('absol-tooltip-content')) return;
      document.body.removeEventListener('click', finish, false);
      EmojiPickerTooltip.close(res.currentSession);
      if (adaptor.onClose) adaptor.onClose();
      res.currentSession = undefined;
      if (EmojiPickerTooltip._scrollOutListener === EmojiPickerTooltip) EmojiPickerTooltip._scrollOutListener = undefined;
    };

    EmojiPickerTooltip._scrollOutListener = finish;
    setTimeout(function () {
      document.body.addEventListener('click', finish, false);
    }, 10);
  }

  res.remove = function () {
    trigger.removeEventListener('click', clickHandler, false);
    trigger.classList.remove('as-emoji-picker-tooltip-trigger');
  };

  trigger.addEventListener('click', clickHandler, false);
  trigger.classList.add('as-emoji-picker-tooltip-trigger');
  return res;
};

var _default = EmojiPickerTooltip;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/EmojiUserListTooltip.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/EmojiUserListTooltip.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/emojiuserlisttooltip.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _Tooltip = _interopRequireDefault(require("./Tooltip"));

var _EmojiPicker = _interopRequireDefault(require("./EmojiPicker"));

var _EmojiPickerTooltip = _interopRequireDefault(require("./EmojiPickerTooltip"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @augments ToolTip
 * @augments AElement
 * @constructor
 */

function EmojiUserListTooltip() {
  this._text = null;
  this._users = [];
  this.$sprite = _({
    tag: 'sprite',
    class: 'as-emoji-user-list-tooltip-emoji',
    props: {
      fps: 30,
      loop: true
    },
    on: {
      ready: function () {
        this.frames = {
          type: 'grid',
          col: 1,
          row: this.texture.naturalHeight / this.texture.naturalWidth
        };
      }
    }
  });
  this.appendChild(this.$sprite);
  this.text = '(heart)';
  this.user = [];
}

EmojiUserListTooltip.tag = 'EmojiUserListTooltip'.toLowerCase();

EmojiUserListTooltip.render = function () {
  return _({
    tag: 'tooltip',
    class: 'as-emoji-user-list-tooltip'
  }, true);
};

EmojiUserListTooltip.prototype._updateUsers = function () {
  var thisT = this;
  this.$content.clearChild();

  this._users.forEach(function (user) {
    var elt = _({
      class: 'as-emoji-user-list-tooltip-user',
      child: [{
        class: 'as-emoji-user-list-tooltip-avatar',
        style: {
          backgroundImage: 'url(' + user.avatar + ')'
        }
      }, {
        class: 'as-emoji-user-list-tooltip-name',
        child: {
          text: user.name
        }
      }]
    });

    if (user.onclick) {
      elt.addClass('as-clickable');
      elt.on('click', user.onclick.bind(user));
    }

    thisT.$content.addChild(elt);
  });
};

EmojiUserListTooltip.prototype.playEmoji = function () {
  this.$sprite.afterReady().then(this.$sprite.play.bind(this.$sprite));
};

EmojiUserListTooltip.prototype.stopEmoji = function () {
  this.$sprite.stop();
};

EmojiUserListTooltip.property = {};
EmojiUserListTooltip.property.users = {
  set: function (users) {
    this._users = users || [];

    this._updateUsers();
  },
  get: function () {
    return this._users;
  }
};
EmojiUserListTooltip.property.text = {
  set: function (value) {
    if (value === this._text) return;
    var icon = _EmojiPickerTooltip.default.emojiDict[value];
    if (!value) return;
    var url = _EmojiPicker.default.assetRoot + '/anim/x60/' + icon.imageFileName;
    this._text = value;
    this.$sprite.src = url;
  },
  get: function () {
    return this._text;
  }
};

_ACore.default.install(EmojiUserListTooltip);

var _default = EmojiUserListTooltip;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/EmojiCounter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/EmojiCounter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/emojicounter.css");

var _ACore = _interopRequireDefault(require("../ACore"));

var _EmojiPickerTooltip = _interopRequireDefault(require("./EmojiPickerTooltip"));

var _EmojiPicker = _interopRequireDefault(require("./EmojiPicker"));

var _Tooltip = _interopRequireWildcard(require("./Tooltip"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _Dom = require("absol/src/HTML5/Dom");

var _EmojiUserListTooltip = _interopRequireDefault(require("./EmojiUserListTooltip"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));




var $ = _ACore.default.$;
var _ = _ACore.default._;
var isMobile = _BrowserDetector.default.isMobile;
/***
 * @extends AElement
 * @constructor
 */

function EmojiCounter() {
  /***
   *
   * @type {Sprite}
   */
  this.$sprite = $('sprite', this);
  this.$num = $('.as-emoji-counter-num', this);
  this.$numText = this.$num.firstChild;
  this._text = '(heart)';
  this.text = this._text;
  this._count = 0;
  this.count = 0;
  this._checkInterval = -1;

  if (isMobile) {
    this.attr('tabindex', '1');
    this.on('focus', this.eventHandler.mouseEnter);
  } else {
    this.on('mouseenter', this.eventHandler.mouseEnter);
  }

  this._tooltipSession = null;
  this._tooltipFinishTimeout = -1;
}

EmojiCounter.tag = 'EmojiCounter'.toLowerCase();

EmojiCounter.render = function () {
  var icon = _EmojiPickerTooltip.default.emojiDict['(heart)'];
  var url = _EmojiPicker.default.assetRoot + '/anim/x40/' + icon.imageFileName;
  return _({
    class: 'as-emoji-counter',
    child: [{
      tag: 'sprite',
      class: 'as-emoji-counter-sprite',
      props: {
        src: url,
        loop: true,
        fps: 30,
        debug: true
      },
      on: {
        ready: function () {
          this.frames = {
            type: 'grid',
            col: 1,
            row: this.texture.naturalHeight / this.texture.naturalWidth
          };
          this.frameIndex = 0;
        }
      }
    }, {
      tag: 'span',
      class: 'as-emoji-counter-num',
      child: {
        text: '0'
      }
    }]
  });
};

EmojiCounter.property = {};
EmojiCounter.property.text = {
  set: function (value) {
    var icon = _EmojiPickerTooltip.default.emojiDict[value];
    if (!icon) return;
    if (this._text === value) return;
    this.$sprite.src = _EmojiPicker.default.assetRoot + '/anim/x40/' + icon.imageFileName;
    this._text = value;
  },
  get: function () {
    return this._text;
  }
};
EmojiCounter.property.count = {
  set: function (value) {
    this.$numText.data = value + '';

    if (value === 1 && this._count != 1) {
      this.$numText.remove();
    } else if (value != 1 && this._count == 1) {
      this.$num.addChild(this.$numText);
    }

    if (value == 0) this.addClass('as-zero');else this.removeClass('as-zero');
    this._count = value;
  },
  get: function () {
    return this._count;
  }
};

_ACore.default.install(EmojiCounter);

EmojiCounter.eventHandler = {};

EmojiCounter.eventHandler.loop = function () {
  if (!this.isDescendantOf(document.body)) this.eventHandler.finishHover();
  if (this.getBoundingClientRect().width === 0) this.eventHandler.finishHover();
};

EmojiCounter.eventHandler.mouseEnter = function () {
  if (this._tooltipFinishTimeout > 0) {
    clearTimeout(this._tooltipFinishTimeout);
  }

  if (this._checkInterval > 0) return;
  this.$sprite.play();
  this._checkInterval = setInterval(this.eventHandler.loop, 1000);
  this.on('mouseleave', this.eventHandler.finishHover);

  if (this.users && this.users.length > 0) {
    prepare();
    EmojiCounter._session = Math.random() * 10000000000 >> 0;
    this._tooltipSession = EmojiCounter._session;
    EmojiCounter.$element = this;
    EmojiCounter.$holder.addTo(this);
    EmojiCounter.$tooltip.text = this.text;
    EmojiCounter.$tooltip.users = this.users;
    EmojiCounter.$tooltip.playEmoji();
    (0, _Tooltip.updateTooltipPosition)(EmojiCounter);
  }
};

EmojiCounter.eventHandler.finishHover = function () {
  if (this._tooltipFinishTimeout > 0) {
    clearTimeout(this._tooltipFinishTimeout);
  }

  this._tooltipFinishTimeout = setTimeout(function () {
    this._tooltipFinishTimeout = -1;
    this.$sprite.stop();
    this.off('mouseleave', this.eventHandler.finishHover);

    if (this._checkInterval > 0) {
      clearInterval(this._checkInterval);
      this._checkInterval = -1;
    }

    if (this._tooltipSession === EmojiCounter._session) {
      EmojiCounter._session = Math.random() * 10000000000 >> 0;
      EmojiCounter.$holder.remove();
      EmojiCounter.$tooltip.stopEmoji();
    }
  }.bind(this), 500);
};

function prepare() {
  if (EmojiCounter.$holder) return;
  EmojiCounter.$holder = _('.absol-tooltip-root-holder');
  EmojiCounter.$tooltip = _('EmojiUserListTooltip.top'.toLowerCase()).addTo(EmojiCounter.$holder);
  EmojiCounter._scrollOutListener = undefined;
  EmojiCounter._orientation = 'top';
  EmojiCounter._session = Math.random() * 10000000000 >> 0;
  _EmojiPickerTooltip.default._listener = undefined;
  EmojiCounter.$element = null;
  EmojiCounter.$tooltip.$arrow.updateSize = EmojiCounter.updatePosition;
}

EmojiCounter.updatePosition = function () {
  if (!EmojiCounter.$element) return;

  var outBound = _Rectangle.default.fromClientRect((0, _Dom.traceOutBoundingClientRect)(EmojiCounter.$element));

  var eBound = _Rectangle.default.fromClientRect(EmojiCounter.$element.getBoundingClientRect());

  if (!outBound.isCollapse(eBound, 0)) {
    _EmojiPickerTooltip.default._scrollOutListener && EmojiCounter._scrollOutListener();
  }

  (0, _Tooltip.updateTooltipPosition)(EmojiCounter);
};

EmojiCounter.updatePosition = EmojiCounter.updatePosition.bind(EmojiCounter);
var _default = EmojiCounter;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/EmojiCounterList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/EmojiCounterList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

var _EmojiPickerTooltip = _interopRequireDefault(require("./EmojiPickerTooltip"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function EmojiCounterList() {
  this._counters = [];
  this.counters = [];
}

EmojiCounterList.tag = 'EmojiCounterList'.toLowerCase();

EmojiCounterList.render = function () {
  return _({
    class: 'as-emoji-counter-list'
  });
};

EmojiCounterList.iconOrdering = _EmojiPickerTooltip.default.defaultIcons.reduce(function (ac, cr, idx) {
  ac[cr] = idx + 1;
  return ac;
}, {});

EmojiCounterList.prototype._updateCounters = function () {
  var newCounters = this._counters;
  var newCounterNameArr = Object.keys(newCounters);
  newCounterNameArr.sort(function (a, b) {
    return (EmojiCounterList.iconOrdering[a] || 1000) - (EmojiCounterList.iconOrdering[b] || 1000);
  });
  var counterElements = Array.prototype.filter.call(this.childNodes, function (e) {
    return e.hasClass && e.hasClass('as-emoji-counter');
  });
  var newCounterElements = [];
  var elt, name;
  var oe, on;

  while (counterElements.length > 0 || newCounterNameArr.length > 0) {
    elt = counterElements[0];
    name = newCounterNameArr[0];

    if (elt && name) {
      if (elt.text === name) {
        newCounterElements.push(elt);
        counterElements.shift();
        newCounterNameArr.shift();
      } else {
        oe = EmojiCounterList.iconOrdering[elt.text];
        on = EmojiCounterList.iconOrdering[name];

        if (oe < on) {
          newCounterElements.push(elt);
          counterElements.shift();
        } else {
          newCounterElements.push(name);
          newCounterNameArr.shift();
        }
      }
    } else if (elt) {
      newCounterElements.push(elt);
      counterElements.shift();
    } else {
      newCounterElements.push(name);
      newCounterNameArr.shift();
    }
  }

  var cElt, prevElt;

  while (newCounterElements.length > 0) {
    cElt = newCounterElements.pop();

    if (typeof cElt === "string") {
      cElt = _({
        tag: 'emojicounter',
        props: {
          text: cElt,
          users: newCounters[cElt].users || [],
          count: newCounters[cElt].count
        }
      });

      if (!prevElt) {
        this.addChild(cElt);
      } else {
        this.addChildBefore(cElt, prevElt);
      }

      prevElt = cElt;
    } else {
      if (newCounters[cElt.text]) {
        cElt.count = newCounters[cElt.text].count;
        cElt.users = newCounters[cElt.text].users || [];
        prevElt = cElt;
      } else {
        cElt.remove();
      }
    }
  }
};

EmojiCounterList.property = {};
EmojiCounterList.property.counters = {
  set: function (counters) {
    this._counters = Object.keys(counters || {}).reduce(function (ac, key) {
      var counter = counters[key];

      if (typeof counter === "object") {
        if (counter.count > 0 && _EmojiPickerTooltip.default.emojiDict[key]) {
          ac[key] = counter;
        }
      }

      return ac;
    }, {});

    this._updateCounters();
  },
  get: function () {
    return this._counters;
  }
};

_ACore.default.install(EmojiCounterList);

var _default = EmojiCounterList;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/RotatedText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/RotatedText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/rotatedtext.css");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




/***
 * @extends AElement
 * @constructor
 */
function RotatedText() {
  this.$attachHook = (0, _ACore.$)('attachhook', this);
  this.$attachHook.requestUpdateSize = this.eventHandler.positionChange;
  this.$attachHook.on('attached', this.eventHandler.attached);
  this.$anchor = (0, _ACore.$)('.as-rotated-text-anchor', this);
  this.$content = (0, _ACore.$)('.as-rotated-text-content', this);
  this.$contentText = this.$content.firstChild;
  this.$trackElts = [];
  this._angle = 0;
  this.angle = 0;
  this.text = '';
  this._trackInterval = -1;
}

RotatedText.tag = 'RotatedText';

RotatedText.render = function () {
  return (0, _ACore._)({
    tag: 'span',
    class: 'as-rotated-text',
    child: ['attachhook', {
      class: 'as-rotated-text-anchor',
      child: {
        tag: 'span',
        class: 'as-rotated-text-content',
        child: {
          text: ''
        }
      }
    }]
  });
};

RotatedText.prototype._trackPosition = function () {
  this._cancelTrackPosition();

  var parent = this.parentElement;

  while (parent) {
    parent.addEventListener('scroll', this.eventHandler.positionChange);
    this.$trackElts.push(parent);
    parent = parent.parentElement;
  }

  document.addEventListener('scroll', this.eventHandler.positionChange);
  this.$trackElts.push(document);
  this._trackInterval = setInterval(this.eventHandler.intervalCheck, 3000);
};

RotatedText.prototype._cancelTrackPosition = function () {
  if (this._trackInterval >= 0) {
    clearInterval(this._trackInterval);
    this._trackInterval = -1;
  }

  while (this.$trackElts.length > 0) {
    this.$trackElts.pop().removeEventListener('scroll', this.eventHandler.positionChange);
  }
};

RotatedText.property = {};
RotatedText.property.text = {
  get: function () {
    return this.$contentText.data;
  },
  set: function (value) {
    value = value || '';
    value = value + '';
    this.$contentText.data = value;
  }
};
RotatedText.property.angle = {
  set: function (value) {
    value = value || 0;
    var matched;

    if (typeof value === 'number') {
      this._angle = value;
      this.$content.addStyle('transform', 'rotate(' + value + 'deg)');
    } else if (value.match) {
      matched = value.match(/([0-9.+\-e]+)deg/);

      if (matched) {
        value = parseFloat(matched[1]);

        if (isFinite(value)) {
          this._angle = value;
          this.$content.addStyle('transform', 'rotate(' + this._angle + 'deg)');
        }

        return;
      }

      matched = value.match(/([0-9.+\-e]+)rad/);

      if (matched) {
        value = parseFloat(matched[1]);

        if (isFinite(value)) {
          this._angle = value * 180 / Math.PI;
          this.$content.addStyle('transform', 'rotate(' + this._angle + 'deg)');
        }
      }
    }
  },
  get: function () {
    return this._angle;
  }
};
RotatedText.eventHandler = {};

RotatedText.eventHandler.attached = function () {
  _ResizeSystem.default.add(this);

  this.eventHandler.positionChange();
  this.$content.addStyle('transform-origin', Math.round(0.3 * this.$content.getFontSize()) + 'px 50%');

  this._trackPosition();
};

RotatedText.eventHandler.detached = function () {
  this._cancelTrackPosition();
};

RotatedText.eventHandler.intervalCheck = function () {
  if (!this.isDescendantOf(document.body)) {
    this.eventHandler.detached();
  }
};

RotatedText.eventHandler.positionChange = function () {
  var bound = this.getBoundingClientRect();
  this.$anchor.addStyle({
    top: Math.round(bound.top) + 'px',
    left: Math.round(bound.left) + 'px'
  });
};

_ACore.default.install(RotatedText);

var _default = RotatedText;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/VerticalTreeDiagram.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/VerticalTreeDiagram.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.VerticalTreeDiagramNode = VerticalTreeDiagramNode;
exports.default = void 0;

require("../css/verticaltreediagram.css");

var _ACore = _interopRequireWildcard(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));




function VerticalTreeDiagramNode() {
  this.$childCtn = (0, _ACore.$)('.as-vertical-tree-diagram-child-ctn', this);
  this.$name = (0, _ACore.$)('.as-vertical-tree-diagram-node-name', this);

  _OOP.default.drillProperty(this, this.$name.firstChild, 'name', 'data');

  this.name = "UndefinedNodeName";
}

VerticalTreeDiagramNode.tag = 'VerticalTreeDiagramNode'.toLowerCase();

VerticalTreeDiagramNode.render = function () {
  return (0, _ACore._)({
    class: 'as-vertical-tree-diagram-node',
    child: [{
      class: 'as-vertical-tree-diagram-node-name-ctn',
      child: {
        class: 'as-vertical-tree-diagram-node-name',
        child: {
          text: ""
        }
      }
    }, {
      class: 'as-vertical-tree-diagram-child-ctn'
    }]
  });
};

['addChild', 'removeChild', 'clearChild', 'addChildBefore', 'addChildAfter', 'findChildBefore', 'findChildAfter'].forEach(function (name) {
  VerticalTreeDiagramNode.prototype[name] = function () {
    this.$childCtn[name].apply(this.$childCtn, arguments);

    if (this.$childCtn.childNodes.length > 0) {
      this.addClass('as-has-child');

      if (this.$childCtn.childNodes.length === 1) {
        this.addClass('as-has-1-child');
      } else {
        this.removeClass('as-has-1-child');
      }
    } else {
      this.removeClass('as-has-child');
      this.removeClass('as-has-1-child');
    }
  };
});

function VerticalTreeDiagram(data) {
  this.data = data || {};
}

VerticalTreeDiagram.tag = 'VerticalTreeDiagram'.toLowerCase();

VerticalTreeDiagram.render = function () {
  return (0, _ACore._)(VerticalTreeDiagramNode.tag, true);
};

VerticalTreeDiagram.property = {};
VerticalTreeDiagram.property.data = {
  set: function (data) {
    data = data || {};
    this._data = data;

    function makeNode(nodeData) {
      return (0, _ACore._)({
        tag: VerticalTreeDiagramNode.tag,
        props: {
          name: nodeData.name
        },
        child: nodeData.child && nodeData.child.length > 0 && nodeData.child.map(makeNode) || []
      });
    }

    this.name = data.name + '';
    this.clearChild();
    if (data.child) this.addChild(data.child.map(makeNode));
  },
  get: function () {
    return this._data;
  }
};

_ACore.default.install(VerticalTreeDiagramNode);

_ACore.default.install(VerticalTreeDiagram);

var _default = VerticalTreeDiagram;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TokenField.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TokenField.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _SelectBoxItem = _interopRequireDefault(require("./SelectBoxItem"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

require("../css/tokenfield.css");

var _utils = require("./utils");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Text = require("absol/src/HTML5/Text");

var _Dom = require("absol/src/HTML5/Dom");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function TokenField() {
  this.on('click', this.eventHandler.click);
  this.$input = (0, _ACore.$)('input', this).on('keydown', this.eventHandler.inputKeyDown).on('focus', this.eventHandler.inputInteract).on('click', this.eventHandler.inputInteract).on('keydown', this.eventHandler.inputInteract);
  this.$attachhook = (0, _ACore.$)('attachhook', this).on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdateSize();
  });
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  /***
   *
   * @type {SelectListBox}
   */

  this.$selectlistBox = (0, _ACore._)({
    tag: 'selectlistbox',
    props: {
      anchor: [1, 6, 2, 5]
    },
    on: {
      preupdateposition: this.eventHandler.preUpdateListPosition
    }
  });
  this.$selectlistBox.on('pressitem', this.eventHandler.selectListBoxPressItem);
  this.$selectlistBox.followTarget = this;
  this.autocomplete = null;
  this.separator = ' ';
  this.placeHolder = '';
}

TokenField.tag = 'TokenField'.toLowerCase();

TokenField.render = function () {
  return (0, _ACore._)({
    class: 'as-token-field',
    extendEvent: ['change'],
    child: [{
      tag: 'input',
      class: 'as-token-field-input-text',
      attr: {
        type: 'text',
        tabindex: '1'
      }
    }, 'attachhook']
  });
};

TokenField.prototype._makeItem = function (text) {
  var itemElt = (0, _ACore._)({
    tag: _SelectBoxItem.default.tag,
    class: 'as-token-field-item',
    attr: {
      tabindex: 1
    },
    props: {
      data: {
        text: text,
        value: text
      }
    }
  });
  itemElt.on({
    keydown: this.eventHandler.itemKeyDown.bind(this, itemElt),
    close: this.eventHandler.itemClose.bind(this, itemElt),
    focus: this.eventHandler.itemFocus.bind(this, itemElt)
  });
  return itemElt;
};

TokenField.prototype._appendItem = function (itemElt) {
  this.addChildBefore(itemElt, this.$input);
};

TokenField.prototype._updateInputWidth = function () {
  var lastItem = this.findChildBefore(this.$input);

  if (lastItem) {
    var lastItemBound = lastItem.getBoundingClientRect();
    var bound = this.getBoundingClientRect();
    var aRight = bound.right - 4 - lastItemBound.right;

    if (aRight > 60) {
      this.$input.addStyle('width', aRight + 'px');
    } else {
      this.$input.addStyle('width', '100%');
    }
  } else {
    this.$input.addStyle('width', '100%');
  }
};

TokenField.prototype._isSeparatorKey = function (key) {
  if (key === 'Enter') return true;
  if (this.separator === ' ') return key === ' ';
  if (this.separator === '\n') return key === 'Enter';
  if (this.separator === '\t') return key === 'Tab';
  return key === this.separator;
};

TokenField.prototype.updateSize = function () {
  this._updateInputWidth();
};

TokenField.prototype._notifyChange = function (data) {
  this.emit('change', Object.assign({
    type: 'change',
    target: this
  }, data), this);
};

TokenField.prototype._searchInList = function () {
  if (this._searchTimeout > 0) {
    clearTimeout(this._searchTimeout);
  }

  this._searchTimeout = setTimeout(function () {
    var text = this.$input.value;

    if (this.$selectlistBox.isDescendantOf(document.body)) {
      this.$selectlistBox.$searchInput.value = text;
      this.$selectlistBox.eventHandler.searchModify();

      if (this.$selectlistBox._displayItems.length === 0) {
        this.$selectlistBox.addStyle('visibility', 'hidden');
      } else {
        this.$selectlistBox.removeStyle('visibility');
      }
    }
  }.bind(this), 100);
};

TokenField.eventHandler = {};
TokenField.property = {};
TokenField.property.separator = {
  set: function (value) {
    if (typeof value !== "string") value = ' ';
    this._separator = value;
  },
  get: function () {
    return this._separator;
  }
};
TokenField.property.placeHolder = {
  set: function (value) {
    this.$input.attr('placeholder', value || '');
  },
  get: function () {
    return this.$input.attr('placeholder');
  }
};
TokenField.property.items = {
  set: function (items) {
    items = items || [];

    while (this.firstChild && this.firstChild && this.firstChild.hasClass('as-token-field-item')) {
      this.firstChild.remove();
    }

    for (var i = 0; i < items.length; ++i) {
      this._appendItem(this._makeItem(items[i]));
    }
  },
  get: function () {
    return Array.prototype.slice.call(this.childNodes).filter(function (elt) {
      return elt.hasClass && elt.hasClass('as-token-field-item');
    }).map(function (elt) {
      return elt.data.value;
    });
  }
};
TokenField.property.autocomplete = {
  set: function (value) {
    this._autocomplete = value || null;

    if (this._autocomplete) {
      this.$selectlistBox.items = this._autocomplete.map(function (it) {
        return {
          value: it + '',
          text: it + ''
        };
      });
    } else {
      this.$selectlistBox.items = [];
    }
  },
  get: function () {
    return this._autocomplete;
  }
};

TokenField.eventHandler.inputKeyDown = function (event) {
  if (this._isSeparatorKey(event.key)) {
    var text = this.$input.value;

    if (text.length > 0) {
      this.$input.value = '';

      var newItem = this._makeItem(text);

      this._appendItem(newItem);

      this.updateSize();

      this._notifyChange({
        action: 'add',
        item: text,
        itemElt: newItem
      });

      this.eventHandler.inputOut();
    }

    event.preventDefault();
  } else if (event.key.startsWith('Arrow') || event.key === 'Backspace') {
    if (this.$input.selectionStart === 0 && this.$input.selectionEnd === 0) {
      if (event.key === 'ArrowLeft' || event.key === 'Backspace') {
        event.preventDefault();
        var prevChild = this.findChildBefore(this.$input);
        if (prevChild) prevChild.focus();
      } else if (event.key === 'ArrowUp') {
        var item, itemBound;
        var inputBound = this.$input.getBoundingClientRect();
        var anchorPos = new _Vec.default(inputBound.left + 5, inputBound.top + inputBound.height / 2);
        var minDis = Infinity;
        var dis;
        var aboveItem;

        for (var i = 0; i < this.childNodes.length; ++i) {
          item = this.childNodes[i];

          if (item.hasClass && item.hasClass('as-token-field-item')) {
            itemBound = item.getBoundingClientRect();

            if (itemBound.bottom < inputBound.top) {
              dis = new _Vec.default(itemBound.left + itemBound.width / 2, itemBound.top + itemBound.height / 2).sub(anchorPos).abs();

              if (dis < minDis) {
                minDis = dis;
                aboveItem = item;
              }
            }
          }
        }

        if (aboveItem) {
          aboveItem.focus();
          event.preventDefault();
        }
      }
    } else {
      this._searchInList();
    }
  } else {
    this._searchInList();
  }
};

TokenField.eventHandler.inputInteract = function (event) {
  var lt = this._lastInteractTime;
  this._lastInteractTime = new Date().getTime();

  if (lt && this._lastInteractTime - lt < 100) {
    return;
  }

  if (this.$selectlistBox.isDescendantOf(document.body)) return;
  this.$selectlistBox.addTo(document.body);
  this.$selectlistBox.domSignal.$attachhook.emit('attached');

  this._searchInList();

  var bound = this.getBoundingClientRect();
  this.$selectlistBox.addStyle('min-width', bound.width + 'px');
  this.$selectlistBox.refollow();
  this.$selectlistBox.updatePosition();
  setTimeout(document.addEventListener.bind(document, 'click', this.eventHandler.inputOut), 100);
};

TokenField.eventHandler.inputOut = function (event) {
  if (event && ((0, _EventEmitter.hitElement)(this.$selectlistBox, event) || (0, _EventEmitter.hitElement)(this.$input, event))) return;
  document.removeEventListener('click', this.eventHandler.inputOut);
  this.$selectlistBox.remove();
  this._lastInteractTime = new Date().getTime();
};

TokenField.eventHandler.itemKeyDown = function (itemElt, event) {
  var nextElt;

  if (event.key === 'Delete' || event.key === 'Backspace') {
    if (event.key === 'Delete') {
      nextElt = this.findChildAfter(itemElt);
    } else {
      nextElt = this.findChildBefore(itemElt) || this.$input;
    }

    itemElt.remove();

    this._notifyChange({
      item: itemElt.data.value,
      action: 'remove',
      itemElt: itemElt
    });

    if (nextElt === this.$input) {
      this.$input.focus();
      (0, _Text.setCaretPosition)(this.$input, 0);
    } else {
      nextElt.focus();
    }
  } else if (event.key === 'ArrowLeft') {
    nextElt = this.findChildBefore(itemElt);
    if (nextElt) nextElt.focus();
  } else if (event.key === 'ArrowRight') {
    nextElt = this.findChildAfter(itemElt);

    if (nextElt === this.$input) {
      this.$input.focus();
      (0, _Text.setCaretPosition)(this.$input, 0);
    } else {
      nextElt.focus();
    }
  } else if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
    var currentItemBound = itemElt.getBoundingClientRect();
    var center = new _Vec.default(currentItemBound.left + currentItemBound.width / 2, currentItemBound.top + currentItemBound.height / 2);
    var childElt, itemBound, dis;
    var minDis = Infinity;
    var i;

    if (event.key === 'ArrowUp') {
      for (i = 0; i < this.childNodes.length; ++i) {
        childElt = this.childNodes[i];

        if (childElt.hasClass && childElt.hasClass('as-token-field-item') || childElt === this.$input) {
          itemBound = childElt.getBoundingClientRect();

          if (itemBound.bottom < currentItemBound.top) {
            dis = new _Vec.default(itemBound.left + itemBound.width / 2, itemBound.top + itemBound.height / 2).sub(center).abs();

            if (dis < minDis) {
              minDis = dis;
              nextElt = childElt;
            }
          }
        }
      }
    } else {
      for (i = 0; i < this.childNodes.length; ++i) {
        childElt = this.childNodes[i];

        if (childElt.hasClass && childElt.hasClass('as-token-field-item') || childElt === this.$input) {
          itemBound = childElt.getBoundingClientRect();

          if (itemBound.top > currentItemBound.bottom) {
            dis = new _Vec.default(itemBound.left + itemBound.width / 2, itemBound.top + itemBound.height / 2).sub(center).abs();

            if (dis < minDis) {
              minDis = dis;
              nextElt = childElt;
            }
          }
        }
      }
    }

    if (nextElt) {
      nextElt.focus();
    }
  }
};

TokenField.eventHandler.itemFocus = function (itemElt) {
  this.eventHandler.inputOut();
};

TokenField.eventHandler.itemClose = function (itemElt) {
  itemElt.remove();

  this._notifyChange({
    action: 'remove',
    item: itemElt.data.value,
    itemElt: itemElt
  });

  this.$input.focus();
};

TokenField.eventHandler.click = function (event) {
  if (event.target === this) this.$input.focus();
};

TokenField.eventHandler.preUpdateListPosition = function () {
  var bound = this.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  var availableTop = bound.top - 5;
  var availableBot = screenSize.height - 5 - bound.bottom;
  this.$selectlistBox.addStyle('--max-height', Math.max(availableBot, availableTop) + 'px');
  var outBound = (0, _Dom.traceOutBoundingClientRect)(this);

  if (bound.bottom < outBound.top || bound.top > outBound.bottom || bound.right < outBound.left || bound.left > outBound.right) {// this.isFocus = false;
    //
  }
};

TokenField.eventHandler.selectListBoxPressItem = function (event) {
  var text = event.data.value;

  var newItem = this._makeItem(text);

  this._appendItem(newItem);

  this.updateSize();

  this._notifyChange({
    action: 'add',
    item: text,
    itemElt: newItem
  });

  this.eventHandler.inputOut();
  this.$input.focus();
  this.$input.value = '';
};

_ACore.default.install(TokenField);

var _default = TokenField;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DVExpTree.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DVExpTree.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ExpTree = _interopRequireDefault(require("./ExpTree"));

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/dvexptree.css");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends ExpTree
 * @constructor
 */
function DVExpTree() {
  this.injectInput();
}

DVExpTree.tag = 'DVExpTree'.toLowerCase();

DVExpTree.render = function () {
  return (0, _ACore._)({
    tag: _ExpTree.default.tag,
    extendEvent: ['radiochange', 'indexclick'],
    class: 'as-dv-exp-tree'
  }, true);
};

DVExpTree.prototype.injectInput = function () {
  this.$radio = (0, _ACore._)({
    tag: 'radiobutton',
    on: {
      change: this.eventHandler.radioChange
    }
  });
  this.$node.insertBefore(this.$radio, this.$node.$extIcon);
  this.$index = (0, _ACore._)({
    tag: 'span',
    class: 'as-dv-exp-tree-index',
    on: {
      click: this.eventHandler.indexClick
    }
  });
  this.$node.insertBefore(this.$index, this.$node.$desc);
  this.$node.on('click', this.eventHandler.clickInNode);
};

DVExpTree.property = {};
DVExpTree.property.radioName = {
  enumerable: true,
  set: function (value) {
    if (!value) {
      this.removeClass('as-has-radio');
      this.$radio.name = undefined;
    } else {
      this.addClass('as-has-radio');
      this.$radio.name = value + '';
    }
  },
  get: function () {
    return this.$radio.name;
  }
};
DVExpTree.property.radioValue = {
  enumerable: true,
  set: function (value) {
    this.$radio.value = value;
  },
  get: function () {
    return this.$radio.value;
  }
};
DVExpTree.property.radioChecked = {
  enumerable: true,
  set: function (value) {
    this.$radio.checked = value;
  },
  get: function () {
    return this.$radio.checked;
  }
};
DVExpTree.property.hasIndex = {
  enumerable: true,
  set: function (value) {
    if (value) this.addClass('as-has-index-input');else this.removeClass('as-has-index-input');
  },
  get: function () {
    return this.hasClass('as-has-index-input');
  }
};
DVExpTree.property.indexValue = {
  enumerable: true,
  set: function (value) {
    this.$index.innerHTML = value;
  },
  get: function () {
    return this.$index.innerHTML;
  }
};
DVExpTree.eventHandler = {};

DVExpTree.eventHandler.radioChange = function (event) {
  this.emit('radiochange', Object.assign({}, event, {
    target: this,
    radioElt: this.$radio
  }), this);
};

DVExpTree.eventHandler.indexClick = function (event) {
  this.emit('indexclick', Object.assign({}, event, {
    target: this,
    indexInput: this.$index
  }), this);
};

DVExpTree.eventHandler.clickInNode = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$index, event) || (0, _EventEmitter.hitElement)(this.$radio, event) || (0, _EventEmitter.hitElement)(this.$node.$toggleIcon, event)) return;
  if ((0, _EventEmitter.hitElement)(this.$node, event) && this.radioName) this.$radio.click();
};

_ACore.default.install(DVExpTree);

var _default = DVExpTree;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/Attributes.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/Attributes.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Ref = _interopRequireDefault(require("./Ref"));


/***
 *
 * @param {Object} node
 * @constructor
 */

/***
 * @typedef {{get?:function, set?: function, descriptor?: Object|function, export?: function}} AttributeHandler
 */

/***
 *
 * @param {Object} node
 * @constructor
 */
function Attributes(node) {
  Object.defineProperty(this, '$$node', {
    enumerable: false,
    configurable: true,
    writable: false,
    value: node
  });
  Object.defineProperty(this, '_definedProperties', {
    enumerable: false,
    writable: false,
    value: {}
  });
  Object.defineProperty(this, '_definedComputedHandlers', {
    enumerable: false,
    writable: false,
    value: {}
  });
}

Object.defineProperty(Attributes.prototype, 'loadAttributeHandlers', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (newHandlers) {
    var self = this;
    var definedHandlers = this._definedProperties;
    var definedComputedHandlers = this._definedComputedHandlers;
    Object.keys(this._definedProperties).forEach(function (key) {
      if (!newHandlers[key]) {
        delete definedHandlers[key];
        delete definedComputedHandlers[key];
        delete self[key];
      }
    });
    Object.keys(newHandlers).forEach(function (key) {
      if (definedHandlers[key] !== newHandlers[key]) {
        self.defineProperty(key, newHandlers[key]);
      }
    });
  }
});
Object.defineProperty(Attributes.prototype, 'defineProperty', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (name, handler) {
    var self = this;
    this._definedProperties[name] = handler;
    var hadValue = !!(name in this);
    var privateValueRef = new _Ref.default(this[name]);
    var objectDescriptor = {
      enumerable: true,
      configurable: true,
      set: function (value) {
        if (handler.set) privateValueRef.set(handler.set.apply(self.$$node, Array.prototype.slice.call(arguments).concat([privateValueRef])));else privateValueRef.set(value);
      },
      get: function () {
        if (handler.get) return handler.get.apply(self.$$node, Array.prototype.slice.call(arguments).concat([privateValueRef]));else return privateValueRef.get();
      }
    };
    Object.defineProperty(this, name, objectDescriptor);
    this._definedComputedHandlers[name] = objectDescriptor;
    objectDescriptor.ref = privateValueRef;
    if (hadValue) this[name] = privateValueRef.get();
  }
});
Object.defineProperty(Attributes.prototype, 'getProperty', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (name) {
    var args = Array.prototype.slice.call(arguments, 1);
    var handler = this._definedComputedHandlers[name];

    if (handler) {
      return handler.get.apply(this, args);
    } else return this[name];
  }
});
Object.defineProperty(Attributes.prototype, 'setProperty', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (name, value) {
    var args = Array.prototype.slice.call(arguments, 1);
    var handler = this._definedComputedHandlers[name];

    if (handler) {
      return handler.set.apply(this, args);
    } else this[name] = value;
  }
});
Object.defineProperty(Attributes.prototype, 'export', {
  enumerable: false,
  configurable: true,
  value: function () {
    var self = this;
    return Object.keys(this).reduce(function (ac, key) {
      var value;
      var handler = self._definedProperties[key];
      var computedHandler = self._definedComputedHandlers[key];
      var exporter = handler && handler.export;

      if (exporter) {
        value = exporter.call(self.$$node, computedHandler.ref);
      } else {
        value = self[key];
      }

      if (value !== undefined) ac[key] = value;
      return ac;
    }, {});
  }
});
Object.defineProperty(Attributes.prototype, 'getPropertyDescriptor', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (name) {
    var handler = this._definedProperties[name];
    if (handler && typeof handler.descriptor === "function") return handler.descriptor.call(this.$$node);
    var value = this[name];
    return handler && handler.descriptor || {
      type: typeof value
    };
  }
});
var _default = Attributes;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CheckListItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CheckListItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.measureMaxCheckboxTextWidth = measureMaxCheckboxTextWidth;
exports.measureCheckListHeight = measureCheckListHeight;
exports.measureCheckListSize = measureCheckListSize;
exports.default = void 0;

require("../css/checklistitem.css");

var _ACore = _interopRequireWildcard(require("../ACore"));

var _CheckboxButton = _interopRequireDefault(require("./CheckboxButton"));

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _SelectListItem = _interopRequireDefault(require("./SelectListItem"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _utils = require("./utils");

var _SelectList = require("./SelectList");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




function measureMaxCheckboxTextWidth(items) {
  var maxTextWidth = 0;
  var maxText = 0;
  var maxEst = 0;
  var maxLv = 0;
  var est;
  var text;
  var item;

  for (var i = 0; i < items.length; ++i) {
    item = items[i];

    if (item.text) {
      text = item.text;
      est = (0, _utils.estimateWidth14)(text) + 14 * 1.25 * (item.level || 0);

      if (est > maxEst) {
        maxEst = est;
        maxText = text;
        maxLv = item.level || 0;
      }
    }
  }

  if (maxText) maxTextWidth = 18 + 14 * (1.25 + 0.35) * maxLv + (0, _utils.measureText)(maxText, '14px Arial, Helvetica, sans-serif').width + 14; //padding left, right 7px, checkbox 18px

  return maxTextWidth;
}

function measureCheckListHeight(items) {
  var border = 0;
  var n = items.length - 1;
  return items.length * 25 + border;
}

function measureCheckListSize(items) {
  var descWidth = (0, _SelectList.measureMaxDescriptionWidth)(items);
  var textWidth = measureMaxCheckboxTextWidth(items);
  var width = textWidth;

  if (descWidth > 0) {
    width += descWidth + 14;
  }

  var height = measureCheckListHeight(items);
  return {
    width: width,
    height: height,
    descWidth: descWidth,
    textWidth: textWidth
  };
}
/***
 * @extends SelectListItem
 * @constructor
 */


function CheckListItem() {
  this.$text = (0, _ACore.$)('span.absol-selectlist-item-text', this);
  this.$textValue = this.$text.childNodes[0];
  this.$descCtn = (0, _ACore.$)('.absol-selectlist-item-desc-container', this);
  this.$desc = (0, _ACore.$)('span.absol-selectlist-item-desc', this.$descCtn);
  this.$descValue = this.$desc.childNodes[0];
  this.$checkbox = (0, _ACore.$)(_CheckboxButton.default.tag, this).on('change', this.eventHandler.checkboxChange);
  this.$icon = null;
  this._icon = null;
  this._viewData = new _Attributes.default(this);

  this._viewData.loadAttributeHandlers(this.viewHandlers);

  _OOP.default.drillProperty(this, this._viewData, 'extendClasses');

  _OOP.default.drillProperty(this, this._viewData, 'extendStyle');

  this.level = 0;
  this.selected = false;
  this.on('click', this.eventHandler.clickText);
}

CheckListItem.tag = 'CheckListItem'.toLowerCase();

CheckListItem.render = function () {
  return (0, _ACore._)({
    extendEvent: ['select'],
    class: ['as-check-list-item', "absol-selectlist-item"],
    child: [{
      tag: _CheckboxButton.default.tag,
      class: 'as-check-list-item-checkbox'
    }, {
      tag: 'span',
      class: 'absol-selectlist-item-text',
      child: {
        text: ''
      }
    }, {
      class: 'absol-selectlist-item-desc-container',
      child: {
        tag: 'span',
        class: 'absol-selectlist-item-desc',
        child: {
          text: ''
        }
      }
    }]
  });
};

CheckListItem.property = {
  text: _SelectListItem.default.property.text,
  value: _SelectListItem.default.property.value,
  icon: _SelectListItem.default.property.icon
};
CheckListItem.property.data = {
  set: function (value) {
    this._data = value;
    var viewData = {
      text: '',
      desc: '',
      noSelect: false,
      extendStyle: null,
      extendClasses: null,
      icon: null
    };

    if (typeof value === 'string') {
      viewData.text = value;
    } else {
      Object.assign(viewData, value);
    }

    Object.assign(this._viewData, viewData);
  },
  get: function () {
    return this._data;
  }
};
CheckListItem.property.selected = {
  set: function (value) {
    this.$checkbox.checked = !!value;
  },
  get: function () {
    return this.$checkbox.checked;
  }
};
CheckListItem.property.level = {
  set: function (value) {
    value = value || 0;
    this._level = value;
    this.$checkbox.addStyle('margin-left', value * 1.75 + 'em');
  },
  get: function () {
    return this._level;
  }
};
CheckListItem.prototype.viewHandlers = {};
CheckListItem.prototype.viewHandlers.text = {
  set: function (value) {
    this.$textValue.data = value;
  },
  get: function () {
    return this.$textValue.data;
  }
};
CheckListItem.prototype.viewHandlers.desc = {
  set: function (value) {
    this.$descValue.data = value;
  },
  get: function () {
    return this.$descValue.data;
  }
};
CheckListItem.prototype.viewHandlers.extendClasses = {
  set: function (value, ref) {
    var prevVal = ref.get() || [];
    var i;

    for (i = 0; i < prevVal.length; ++i) {
      this.removeClass(prevVal[i]);
    }

    var newVal = [];
    if (typeof value == 'string') value = value.trim().split(/\s+/);
    value = value || [];

    for (i = 0; i < value.length; ++i) {
      newVal.push(value[i]);
      this.addClass(value[i]);
    }

    return newVal;
  }
};
CheckListItem.prototype.viewHandlers.extendStyle = {
  /***
   *
   * @param value
   * @param {Ref} ref
   */
  set: function (value, ref) {
    this.removeStyle(ref.get() || {});
    this._extendStyle = Object.assign({}, value || {});
    this.addStyle(this._extendStyle);
  },
  get: function () {
    return this._extendClasses;
  }
};
CheckListItem.prototype.viewHandlers.noSelect = {
  set: function (value) {
    if (value) this.addClass('as-no-select');else this.removeClass('as-no-select');
    return value;
  }
};
CheckListItem.prototype.viewHandlers.icon = {
  set: function (icon) {
    this.icon = icon;
  },
  get: function () {
    return this.icon;
  }
};
CheckListItem.eventHandler = {};

CheckListItem.eventHandler.clickText = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$checkbox, event)) return;
  this.$checkbox.checked = !this.$checkbox.checked;
  this.emit('select', {
    target: this,
    type: 'select',
    originalEvent: event.originalEvent || event.originEvent || event,
    selected: this.selected
  });
};

CheckListItem.eventHandler.checkboxChange = function (event) {
  this.emit('select', {
    target: this,
    type: 'select',
    originalEvent: event.originalEvent || event.originEvent || event,
    selected: this.selected
  });
};

_ACore.default.install(CheckListItem);

var _default = CheckListItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tool/TextMeasurement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tool/TextMeasurement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function TextMeasurement(opts) {
  opts = opts || {};
  this.chars = opts.chars || (" !\"$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "[\\]^_abcdefghijklmnopqrstuvwxyz{|}" + "¥©ÀÁÂÃÈÉÊÌÍÒÓÔÕÙÚÝàáâãèéêìíñòóôõùúýĂăĐđĨĩŨũƠơƯưẠ̌̀́̃̉Р" + "ийксуẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊị" + "ỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹ–’“”…₫€?").split('');
  this.computed = Object.assign({}, opts.computed || {});
}

TextMeasurement.prototype.compute = function (font) {
  if (this.computed[font]) return true;
  if (!('document' in window)) return false;

  if (!this.canvas) {
    this.canvas = document.createElement('canvas');
    this.ctx = this.canvas.getContext('2d');
  }

  var ctx = this.ctx;
  ctx.font = font;
  var data = {};
  var charBoxes = {};
  data.charBoxes = charBoxes;
  var c, d, i, j;
  var metrics;
  var n = this.chars.length;
  var chars = this.chars;

  for (i = 0; i < n; ++i) {
    c = chars[i];
    metrics = ctx.measureText(c);
    charBoxes[c] = metrics.width;
  }

  var spacing = {};
  data.spacing = spacing;
  var pair;

  for (i = 0; i < n; ++i) {
    c = chars[i];

    for (j = 0; j < n; ++j) {
      d = chars[j];
      pair = c + d;
      metrics = ctx.measureText(pair);
      spacing[pair] = metrics.width - charBoxes[c] - charBoxes[d];
    }
  }

  this.computed[font] = data;
  return true;
};
/***
 *
 * @param {string} text
 * @param {string=} font
 * @return {number}
 */


TextMeasurement.prototype.measureTextWidth = function (text, font) {
  var l = text.length;
  if (l === 0) return 0;
  var width = 0;
  var data = this.computed[font];
  var charBoxes = data.charBoxes;
  var spacing = data.spacing;
  var c, pc;
  pc = text[0];
  width += charBoxes[pc] || charBoxes['0'];

  for (var i = 1; i < l; ++i) {
    c = text[i];
    width += spacing[pc + c];
    width += charBoxes[c] || charBoxes['0'];
    pc = c;
  }

  return width;
};

var _default = TextMeasurement;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CheckListBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CheckListBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.makeItem = makeItem;
exports.requireItem = requireItem;
exports.releaseItem = releaseItem;
exports.CheckListBox = CheckListBox;
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _Follower = _interopRequireDefault(require("./Follower"));

var _SelectListBox = _interopRequireWildcard(require("./SelectListBox"));

var _CheckListItem = _interopRequireDefault(require("./CheckListItem"));

require("../css/checklistbox.css");

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));

var _utils = require("./utils");

var _Dom = require("absol/src/HTML5/Dom");

var _stringGenerate = require("absol/src/String/stringGenerate");

var _ListSearchMaster = _interopRequireDefault(require("./list/ListSearchMaster"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _TextMeasurement = _interopRequireDefault(require("./tool/TextMeasurement"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




var itemPool = [];

function makeItem() {
  return (0, _ACore._)({
    tag: _CheckListItem.default,
    on: {
      select: function (event) {
        this.$parent.eventHandler.itemSelect(this, event);
      }
    }
  });
}

function requireItem($parent) {
  var item;

  if (itemPool.length > 0) {
    item = itemPool.pop();
  } else {
    item = makeItem();
  }

  item.$parent = $parent;
  return item;
}

function releaseItem(item) {
  item.$parent = null;
  item.selected = false;
  itemPool.push(item);
}

function fillItemToPage($parent, $page, n) {
  while ($page.childNodes.length > n) {
    releaseItem($page.lastChild);
    $page.removeChild($page.lastChild);
  }

  while ($page.childNodes.length < n) {
    $page.addChild(requireItem($parent));
  }
}

var mTextMeasurement = null;

var measureTextWidth = text => {
  if (!mTextMeasurement) {
    mTextMeasurement = new _TextMeasurement.default();
    mTextMeasurement.compute('14px arial');
  }

  return mTextMeasurement.measureTextWidth(text, '14px arial');
};
/***
 * @extends SelectListBox
 * @constructor
 */


function CheckListBox() {
  this._items = [];
  this._valueDict = {};
  this.itemHolders = [];
  this._holderDict = {};
  this._estimateWidth = 100;
  this.$scroller = (0, _ACore.$)('.as-select-list-box-scroller', this);
  this.$content = (0, _ACore.$)('.as-select-list-box-content', this);
  this.$pages = (0, _ACore.$$)('.as-select-list-box-page', this);
  this.$searchInput = (0, _ACore.$)('searchtextinput', this).on('stoptyping', this.eventHandler.searchModify);
  this.pagingCtrl = new CLPagingController(this);
  this.searchMaster = new _ListSearchMaster.default();

  this._initDomHook();

  this._initFooter();

  this.domSignal.on('viewListAtValue', this.viewListAtValue.bind(this));
  /***
   * @name selectedAll
   * @type {boolean}
   * @memberOf CheckListBox#
   */
}

CheckListBox.tag = 'CheckListBox'.toLowerCase();

CheckListBox.render = function () {
  return (0, _ACore._)({
    tag: _Follower.default.tag,
    extendEvent: ['change', 'cancel', 'close'],
    attr: {
      tabindex: 0
    },
    class: ['as-select-list-box', 'as-check-list-box'],
    child: [{
      class: 'as-select-list-box-search-ctn',
      child: 'searchtextinput'
    }, {
      class: ['as-bscroller', 'as-select-list-box-scroller'],
      child: [{
        class: 'as-select-list-box-content',
        child: Array(3).fill('.as-select-list-box-page')
      }]
    }, {
      class: 'as-dropdown-box-footer',
      child: [{
        tag: 'checkbox',
        class: 'as-select-list-box-check-all',
        props: {
          checked: false,
          text: _LanguageSystem.default.getText('txt_check_all') || _LanguageSystem.default.getText('txt_all') || 'Check All'
        }
      }, {
        class: 'as-dropdown-box-footer-right',
        child: [{
          tag: 'a',
          class: 'as-select-list-box-cancel-btn',
          attr: {
            'data-ml-key': 'txt_cancel'
          }
        }, {
          tag: 'a',
          class: 'as-select-list-box-close-btn',
          attr: {
            'data-ml-key': 'txt_close'
          }
        }]
      }]
    }, 'attachhook.as-dom-signal'],
    props: {
      anchor: [1, 6, 2, 5]
    }
  });
};

Object.assign(CheckListBox.prototype, _SelectListBox.default.prototype);
CheckListBox.property = {};
CheckListBox.eventHandler = {};
CheckListBox.prototype.footerMinWidth = 110;

CheckListBox.prototype._initDomHook = function () {
  this.$domSignal = (0, _ACore.$)('attachhook.as-dom-signal', this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('viewListAt', this.viewListAt.bind(this));
  this.domSignal.on('viewListAtFirstSelected', this.viewListAtFirstSelected.bind(this));
  this.domSignal.on('viewListAtCurrentScrollTop', this.viewListAtCurrentScrollTop.bind(this));
  this.domSignal.on('updateCheckedAll', () => {
    this.$checkAll.checked = this.selectedAll;
  });
};

CheckListBox.prototype._initFooter = function () {
  this.$checkAll = (0, _ACore.$)('.as-select-list-box-check-all', this).on('change', this.eventHandler.checkAllChange);
  this.$cancelBtn = (0, _ACore.$)('.as-select-list-box-cancel-btn', this).on('click', this.eventHandler.clickCancelBtn);
  this.$closeBtn = (0, _ACore.$)('.as-select-list-box-close-btn', this);
  if (this.$closeBtn) //mobile ref
    this.$closeBtn.on('click', this.eventHandler.clickCloseBtn);
};

CheckListBox.prototype.viewListAtFirstSelected = _noop.default;

CheckListBox.prototype.viewListAtValue = function (value) {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('viewListAtValue', value);
  }

  this.pagingCtrl.viewListAtValue(value);
};

CheckListBox.prototype.findItemsByValue = function (value) {
  return this._holderDict[(0, _utils.keyStringOf)(value)];
};

CheckListBox.prototype.notifyChange = function (data) {
  this.emit('change', Object.assign({
    target: this,
    type: 'change'
  }, data), this);
};

CheckListBox.prototype.focus = _SelectListBox.default.prototype.focus;
CheckListBox.property.values = {
  set: function (values) {
    values = values || [];
    var dict = values.reduce((ac, cr) => {
      var key = (0, _utils.keyStringOf)(cr);
      ac[key] = cr;
      return ac;
    }, {});
    this._valueDict = dict;
    this.itemHolders.forEach(function visit(holder) {
      holder.selected = holder.valueKey in dict;
      if (holder.children) holder.children.forEach(visit);
    });
    this.pagingCtrl.updateSelected();
    this.domSignal.emit('updateCheckedAll');
  },
  get: function () {
    return this.itemHolders.reduce(function visit(ac, holder) {
      if (holder.selected && !holder.data.noSelect) ac.push(holder.data.value);
      if (holder.children) holder.children.reduce(visit, ac);
      return ac;
    }, []);
  }
};

CheckListBox.prototype.resetSearchState = function () {
  this.$searchInput.value = '';
  this.pagingCtrl.viewArr(this.itemHolders);
};

CheckListBox.property.enableSearch = _SelectListBox.default.property.enableSearch;
CheckListBox.property.items = {
  set: function (items) {
    items = items || [];
    items = (0, _utils.copySelectionItemArray)(items, {
      removeNoView: true
    });
    this._items = items;
    this.itemHolders = items.map(it => new CLHolder(this, it));
    var res = this.itemHolders.reduce(function visit(ac, cr) {
      var textWidth = 3.5 * 14 + 1.75 * 14 * cr.level + 14 + measureTextWidth(cr.data.text + '') + 7 + 17;
      if (cr.data.icon) textWidth += 32;
      ac.textWidth = Math.max(ac.textWidth, textWidth);

      if (cr.data.desc) {
        ac.descWidth = Math.max(ac.descWidth, measureTextWidth(cr.data.desc + ''));
      }

      ac.dict[cr.valueKey] = ac.dict[cr.valueKey] || [];
      ac.dict[cr.valueKey].push({
        idx: ac.idx++,
        item: cr.data,
        holder: cr
      });
      if (cr.children) cr.children.reduce(visit, ac);
      return ac;
    }, {
      idx: 0,
      dict: {},
      textWidth: 50,
      descWidth: 0
    });
    this._holderDict = res.dict;
    this._estimateWidth = res.textWidth + (res.descWidth ? res.descWidth + 30 : 0);
    this.$scroller.scrollTop = 0;
    this.pagingCtrl.viewArr(this.itemHolders);
    this.searchMaster.transfer(this.itemHolders.map(it => it.getSearchItem()));
    this.domSignal.emit('updateCheckedAll');
  },
  get: function () {
    return (0, _utils.copySelectionItemArray)(this._items);
  }
};
CheckListBox.property.selectedAll = {
  get: function () {
    return this.itemHolders.length > 0 && this.itemHolders.every(function visit(holder) {
      var res = holder.selected || holder.data.noSelect;

      if (res && holder.children) {
        res = holder.children.every(visit);
      }

      return res;
    });
  }
};
/***
 * @this CheckListBox
 * @param event
 */

CheckListBox.eventHandler.checkAllChange = function (event) {
  var checked = this.$checkAll.checked;
  var changed = false;

  var visit = holder => {
    var canCheck = checked && !holder.data.noSelect;

    if (holder.selected !== canCheck) {
      changed = true;
      holder.selected = canCheck;
    }

    if (canCheck) {
      this._valueDict[holder.valueKey] = holder.data.value;
    } else {
      delete this._valueDict[holder.valueKey];
    }

    if (holder.children) holder.children.forEach(visit);
  };

  this.itemHolders.forEach(visit);
  this.pagingCtrl.updateSelected();

  if (changed) {
    this.notifyChange({
      originalEvent: event.originalEvent || event.originEvent || event,
      action: checked ? 'check_all' : "uncheck_all"
    }, this);
  }
};
/***
 * @this CheckListBox
 * @param itemElt
 * @param event
 */


CheckListBox.eventHandler.itemSelect = function (itemElt, event) {
  var selected = itemElt.selected;
  var holder = itemElt.clHolder;
  holder.selected = selected;

  if (selected) {
    this._valueDict[holder.valueKey] = holder.data.value;
  } else {
    delete this._valueDict[holder.valueKey];
  }

  this.notifyChange({
    originalEvent: event.originalEvent || event.originEvent || event,
    action: selected ? 'check' : 'uncheck',
    value: holder.data.value,
    itemData: holder.data
  });
  this.domSignal.emit('updateCheckedAll');
};
/***
 * @this CheckListBox
 * @param event
 */


CheckListBox.eventHandler.clickCancelBtn = function (event) {
  this.emit('cancel', {
    type: 'cancel',
    target: this,
    originalEvent: event
  }, this);
};
/***
 * @this CheckListBox
 * @param event
 */


CheckListBox.eventHandler.clickCloseBtn = function (event) {
  this.emit('close', {
    type: 'close',
    target: this,
    originalEvent: event
  }, this);
};
/**
 * @this {CheckListBox}
 */


CheckListBox.eventHandler.searchModify = function () {
  var text = this.$searchInput.value;

  if (text) {
    this.searchMaster.query({
      text: text
    }).then(result => {
      if (text !== this.$searchInput.value) return;
      var arr = this.itemHolders.filter(it => !!result[it.id]);
      arr.sort((a, b) => result[b.id][1] - result[a.id][1]);
      var searchHolders = arr.map(holder => new CLHolderRef(this, holder, null, result));
      this.$scroller.scrollTop = 0;
      this.pagingCtrl.viewArr(searchHolders);

      _ResizeSystem.default.update();
    });
  } else {
    this.pagingCtrl.viewArr(this.itemHolders.reduce((ac, holder) => holder.toArray(ac), []));

    _ResizeSystem.default.update();
  }
};

_ACore.default.install(CheckListBox);

function CLHolder(boxElt, data, parent) {
  this.id = (0, _stringGenerate.randomIdent)(8);
  this.parent = parent;
  this.level = parent ? parent.level + 1 : 0;
  this.boxElt = boxElt;
  this.data = data;
  this.valueKey = (0, _utils.keyStringOf)(data.value);
  this.itemElt = null;
  this.children = null;
  this.selected = this.valueKey in boxElt._valueDict;

  if (data.items && data.items.length > 0) {
    this.children = data.items.map(it => new CLHolder(boxElt, it, this));
  }
}

CLHolder.prototype.toArray = function (ac) {
  ac = ac || [];
  ac.push(this);
  if (this.children) this.children.reduce((ac, holder) => holder.toArray(ac), ac);
  return ac;
};

CLHolder.prototype.attachView = function (itemElt) {
  if (itemElt.clHolder) itemElt.clHolder.detachView();
  itemElt.clHolder = this;
  this.itemElt = itemElt;
  itemElt.data = this.data;
  itemElt.level = this.level;
  itemElt.selected = this.selected;
};

CLHolder.prototype.detachView = function () {
  if (this.itemElt) {
    this.itemElt.clHolder = null;
    this.itemElt = null;
  }
};

CLHolder.prototype.getSearchItem = function () {
  var res = {
    value: this.id
  };
  res.text = this.data.text + '';
  if (this.data.desc) res.text += '/' + this.data.desc;
  if (this.children) res.items = this.children.map(c => c.getSearchItem());
  return res;
};

function CLHolderRef(boxElt, origin, parent, result) {
  this.origin = origin;
  this.data = origin.data;
  this.parent = parent;
  this.level = origin.level;

  _OOP.default.drillProperty(this, origin, 'selected');

  var arr, children;

  if (origin.children) {
    arr = origin.children.filter(it => !!result[it.id]);
    arr.sort((a, b) => result[b.id][1] - result[a.id][1]);
    children = arr.map(holder => new CLHolderRef(boxElt, holder, this, result));
    if (children.length > 0) this.children = children;
  }
}

_OOP.default.mixClass(CLHolderRef, CLHolder);
/***
 *
 * @param {CheckListBox} boxElt
 * @constructor
 */


function CLPagingController(boxElt) {
  this.boxElt = boxElt;
  this.$pages = boxElt.$pages;
  this.$content = boxElt.$content;
  this.$scroller = boxElt.$scroller.on('scroll', this.ev_scroll.bind(this));
  this.itemPerPage = Math.ceil((0, _Dom.getScreenSize)().height / this.itemHeight * 2);
  this.holderArr = [];
  this.holderDict = {};
}

CLPagingController.prototype.itemHeight = 30;

CLPagingController.prototype.ev_scroll = function (event) {
  if (this.pageN <= 2) return;
  var top = this.$scroller.scrollTop;
  var pageIdx = Math.min(this.pageN - 1, Math.max(0, Math.floor(top / this.itemHeight / this.itemPerPage)));
  if (pageIdx === this.pageIdx) return;

  if (pageIdx === this.pageIdx - 1) {
    this.pageIdx = pageIdx;
    this.$pages.unshift(this.$pages.pop());

    if (pageIdx > 0) {
      this.$pages[0].removeStyle('display').addStyle('top', (pageIdx - 1) * this.itemPerPage * this.itemHeight + 'px');
      fillItemToPage(this.boxElt, this.$pages[0], this.itemPerPage);
      Array.prototype.forEach.call(this.$pages[0].childNodes, (elt, i) => this.holderArr[(pageIdx - 1) * this.itemPerPage + i].attachView(elt));
    } else {
      this.$pages[0].addStyle('display', 'none');
    }
  } else if (pageIdx === this.pageIdx + 1) {
    this.pageIdx = pageIdx;
    this.$pages.push(this.$pages.shift());

    if (pageIdx + 1 < this.pageN) {
      this.$pages[2].removeStyle('display').addStyle('top', (pageIdx + 1) * this.itemPerPage * this.itemHeight + 'px');
      fillItemToPage(this.boxElt, this.$pages[2], Math.min(this.itemPerPage, this.holderArr.length - this.itemPerPage * (pageIdx + 1)));
      Array.prototype.forEach.call(this.$pages[2].childNodes, (elt, i) => this.holderArr[(pageIdx + 1) * this.itemPerPage + i].attachView(elt));
    } else {
      this.$pages[2].addStyle('display', 'none');
    }
  } else {
    this.update();
  }
};

CLPagingController.prototype.update = function () {
  var top = this.$content.scrollTop;
  var pageIdx = Math.floor(top / this.itemHeight / this.itemPerPage);
  this.pageIdx = pageIdx;
  var ii = (pageIdx - 1) * this.itemPerPage;
  var pageElt;
  var itemInPage;

  for (var pi = 0; pi < 3; ++pi) {
    pageElt = this.$pages[pi];

    if (ii < 0 || ii >= this.holderArr.length) {
      ii += this.itemPerPage;
      pageElt.addStyle('display', 'none');
    } else {
      itemInPage = Math.min(this.itemPerPage, this.holderArr.length - ii);
      fillItemToPage(this.boxElt, pageElt, itemInPage);
      pageElt.removeStyle('display').addStyle('top', this.itemHeight * ii + 'px');
      Array.prototype.forEach.call(pageElt.childNodes, (child, i) => {
        this.holderArr[ii].attachView(child);
        ii++;
      });
    }
  }
};

CLPagingController.prototype.viewListAtValue = function (value) {
  var idx = this.holderDict[(0, _utils.keyStringOf)(value)];
  if (idx === undefined) return;
  var bound = this.$scroller.getBoundingClientRect();
  var y = idx * this.itemHeight;
  var maxY = this.holderArr.length * this.itemHeight - bound.height;
  this.$scroller.scrollTop = Math.min(maxY, y);
};

CLPagingController.prototype.viewArr = function (itemHolders) {
  this.holderArr = itemHolders.reduce((ac, holder) => holder.toArray(ac), []);
  this.holderDict = this.holderArr.reduce((ac, cr, idx) => {
    ac[cr.valueKey] = idx;
    return ac;
  }, {});
  this.pageN = Math.ceil(this.holderArr.length / this.itemPerPage);
  this.$content.addStyle('height', this.holderArr.length * this.itemHeight + 'px');
  this.update();
};

CLPagingController.prototype.updateSelected = function () {
  this.$pages.forEach(pageElt => {
    Array.prototype.forEach.call(pageElt.childNodes, itemElt => {
      if (itemElt.clHolder) itemElt.selected = itemElt.clHolder.selected;
    });
  });
};
/**********************************************************************************************************************/

/***
 * @extends SelectListBox
 * @constructor
 */


function CheckListBoxV1() {
  this._initDomHook();

  this._initControl();

  this._initScroller();

  this._initFooter();

  this._initProperty();

  this.domSignal.on('viewListAtValue', this.viewListAtValue.bind(this));
}

CheckListBoxV1.tag = 'CheckListBox'.toLowerCase();

CheckListBoxV1.render = function () {
  return (0, _ACore._)({
    tag: _Follower.default.tag,
    extendEvent: ['change', 'cancel', 'close'],
    attr: {
      tabindex: 0
    },
    class: ['as-select-list-box', 'as-check-list-box'],
    child: [{
      class: 'as-select-list-box-search-ctn',
      child: 'searchtextinput'
    }, {
      class: ['as-bscroller', 'as-select-list-box-scroller'],
      child: [{
        class: 'as-select-list-box-content',
        child: Array(this.prototype.preLoadN).fill('.as-select-list-box-page')
      }]
    }, {
      class: 'as-dropdown-box-footer',
      child: [{
        tag: 'checkbox',
        class: 'as-select-list-box-check-all',
        props: {
          checked: false,
          text: _LanguageSystem.default.getText('txt_check_all') || _LanguageSystem.default.getText('txt_all') || 'Check All'
        }
      }, {
        class: 'as-dropdown-box-footer-right',
        child: [{
          tag: 'a',
          class: 'as-select-list-box-cancel-btn',
          attr: {
            'data-ml-key': 'txt_cancel'
          }
        }, {
          tag: 'a',
          class: 'as-select-list-box-close-btn',
          attr: {
            'data-ml-key': 'txt_close'
          }
        }]
      }]
    }, 'attachhook.as-dom-signal'],
    props: {
      anchor: [1, 6, 2, 5]
    }
  });
};

Object.assign(CheckListBoxV1.prototype, _SelectListBox.default.prototype);
CheckListBoxV1.property = Object.assign({}, _SelectListBox.default.property);
CheckListBoxV1.eventHandler = Object.assign({}, _SelectListBox.default.eventHandler);
CheckListBoxV1.prototype.itemHeightMode = [25, 30];
CheckListBoxV1.prototype.itemHeight = 25;
CheckListBoxV1.prototype.footerMinWidth = 110;

CheckListBoxV1.prototype._initFooter = function () {
  this.$checkAll = (0, _ACore.$)('.as-select-list-box-check-all', this).on('change', this.eventHandler.checkAllChange);
  this.$cancelBtn = (0, _ACore.$)('.as-select-list-box-cancel-btn', this).on('click', this.eventHandler.clickCancelBtn);
  this.$closeBtn = (0, _ACore.$)('.as-select-list-box-close-btn', this);
  if (this.$closeBtn) //mobile ref
    this.$closeBtn.on('click', this.eventHandler.clickCloseBtn);
};

CheckListBoxV1.prototype._requireItem = function (pageElt, n) {
  var itemElt;

  while (pageElt.childNodes.length > n) {
    itemElt = pageElt.lastChild;
    itemElt.selfRemove();
    releaseItem(itemElt);
  }

  while (pageElt.childNodes.length < n) {
    itemElt = requireItem(this);
    pageElt.addChild(itemElt);
  }
};

CheckListBoxV1.prototype.viewListAtFirstSelected = _noop.default;

CheckListBoxV1.prototype.viewListAtValue = function (value) {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('viewListAtValue', value);
    return;
  }

  if (this._displayValue == _SelectListBox.VALUE_HIDDEN) {
    return false;
  }

  var itemHolders = this._displayItemHolderByValue[value + ''];

  if (itemHolders) {
    this.domSignal.once('scrollIntoValue', function () {
      var holder = itemHolders[0];
      this.viewListAt(holder.idx);
      var itemElt = (0, _ACore.$)('.as-check-list-item', this.$listScroller, function (elt) {
        return elt.value === value;
      });

      if (itemElt) {
        var scrollBound = this.$listScroller.getBoundingClientRect();
        var itemBound = itemElt.getBoundingClientRect();
        this.$listScroller.scrollTop += itemBound.top - scrollBound.top;
      }
    }.bind(this));
    this.domSignal.emit('scrollIntoValue');
    return true;
  } else return false;
};

CheckListBoxV1.prototype.focus = _SelectListBox.default.prototype.focus;
CheckListBoxV1.property.values = {
  set: function (value) {
    _SelectListBox.default.property.values.set.apply(this, arguments);

    this.$checkAll.checked = this._values.length === this.items.length;
  },
  get: _SelectListBox.default.property.values.get
};
/***
 * @this CheckListBoxV1
 * @param event
 */

CheckListBoxV1.eventHandler.checkAllChange = function (event) {
  var checked = this.$checkAll.checked;

  if (checked) {
    this._values = this.items.map(function (cr) {
      return typeof cr === "object" ? cr.value : cr;
    });
    this._valueDict = this._values.reduce(function (ac, value) {
      ac[value + ''] = true;
      return ac;
    }, {});
  } else {
    this._values = [];
    this._valueDict = {};
  }

  this._updateSelectedItem();

  this.emit('change', {
    target: this,
    type: 'change',
    originalEvent: event.originalEvent || event.originEvent || event,
    action: checked ? 'check_all' : "uncheck_all"
  }, this);
};
/***
 * @this CheckListBoxV1
 * @param itemElt
 * @param event
 */


CheckListBoxV1.eventHandler.itemSelect = function (itemElt, event) {
  var selected = itemElt.selected;
  var value = itemElt.value;
  var itemData = itemElt.data;
  var idx;

  if (selected) {
    this._values.push(value);

    this._valueDict[value + ''] = true;
  } else {
    idx = this._values.indexOf(value);
    delete this._valueDict[value + ''];

    if (idx >= 0) {
      this._values.splice(idx, 1);
    } else {
      console.error("Violation data");
    }
  }

  this.emit('change', {
    target: this,
    type: 'change',
    originalEvent: event.originalEvent || event.originEvent || event,
    action: selected ? 'check' : 'uncheck',
    value: value,
    itemData: itemData
  }, this);
};
/***
 * @this CheckListBoxV1
 * @param event
 */


CheckListBoxV1.eventHandler.clickCancelBtn = function (event) {
  this.emit('cancel', {
    type: 'cancel',
    target: this,
    originalEvent: event
  }, this);
};
/***
 * @this CheckListBoxV1
 * @param event
 */


CheckListBoxV1.eventHandler.clickCloseBtn = function (event) {
  this.emit('close', {
    type: 'close',
    target: this,
    originalEvent: event
  }, this);
};

_ACore.default.install(CheckListBoxV1);

var _default = CheckListBoxV1;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MultiCheckMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MultiCheckMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _MultiSelectMenu = _interopRequireDefault(require("./MultiSelectMenu"));

var _ACore = _interopRequireWildcard(require("../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _CheckListBox = require("./CheckListBox");

var _EventEmitter = _interopRequireWildcard(require("absol/src/HTML5/EventEmitter"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




/***
 * @extends MultiSelectMenu
 * @constructor
 */
function MultiCheckMenu() {
  this.addClass('as-multi-check-menu');
  this.on('click', this.eventHandler.click);
  /***
   * @type {CheckListBox}
   */

  this.$selectlistBox = (0, _ACore._)({
    tag: _CheckListBox.CheckListBox,
    //use new version
    props: {
      anchor: [1, 6, 2, 5]
    },
    on: {
      preupdateposition: this.eventHandler.preUpdateListPosition,
      change: this.eventHandler.selectListBoxChange,
      cancel: this.eventHandler.selectListBoxCancel,
      close: this.eventHandler.selectListBoxClose
    }
  });
  this.$itemCtn = (0, _ACore.$)('.as-multi-select-menu-item-ctn', this);
  this.$attachhook = (0, _ACore.$)('attachhook', this).on('attached', this.eventHandler.attached);
  this.$attachhook.requestUpdateSize = this.updateSize();

  _OOP.default.drillProperty(this, this.$selectlistBox, 'enableSearch');

  this._isFocus = false;
  this.$items = [];
  this._tempValues = [];
  this._values = [];
  this.items = [];
  this.values = [];
  this.$selectlistBox.followTarget = this;
  this.disableClickToFocus = false;
  this.orderly = true;
  this.itemFocusable = false;
  this._activeValue = undefined;
}

MultiCheckMenu.tag = 'MultiCheckMenu'.toLowerCase();
MultiCheckMenu.render = _MultiSelectMenu.default.render;
Object.assign(MultiCheckMenu.prototype, _MultiSelectMenu.default.prototype);
MultiCheckMenu.property = Object.assign({}, _MultiSelectMenu.default.property);
MultiCheckMenu.eventHandler = Object.assign({}, _MultiSelectMenu.default.eventHandler);

MultiCheckMenu.prototype.updateSize = function () {
  var bound;

  if (this._isFocus) {
    bound = this.getBoundingClientRect();
    this.$selectlistBox.addStyle('min-width', Math.max(bound.width, this.$selectlistBox.getFontSize() * 15.5) + 'px');
    this.$selectlistBox.refollow();
    this.$selectlistBox.updatePosition();
  }
};

MultiCheckMenu.prototype.findItemsByValue = function (value) {
  return this.$selectlistBox.findItemsByValue(value);
};

MultiCheckMenu.eventHandler.click = function (event) {
  if ((event.target === this || event.target === this.$itemCtn) && !this.isFocus && !this.readOnly) {
    this.isFocus = true;
  }
};

MultiCheckMenu.eventHandler.bodyClick = function (event) {
  var isRemovedItem = !_AElement.default.prototype.isDescendantOf.call(event.target, document.body) && (event.target.classList.contains('absol-selectbox-item-close') || event.target.parentElement && event.target.parentElement.classList.contains('absol-selectbox-item-close'));

  if (this.isFocus && !_EventEmitter.default.hitElement(this.$selectlistBox, event) && !isRemovedItem && (!(0, _EventEmitter.hitElement)(this.$itemCtn, event) || event.target === this.$itemCtn)) {
    this.eventHandler.selectListBoxPressItem(event); //to notify something remove, add

    this.isFocus = false;
  }
};

MultiCheckMenu.eventHandler.selectListBoxChange = function (event) {
  var idx;

  switch (event.action) {
    case 'check':
      idx = this._tempValues.indexOf(event.value);

      if (idx < 0) {
        this._tempValues.push(event.value);
      }

      break;

    case 'uncheck':
      idx = this._tempValues.indexOf(event.value);

      if (idx >= 0) {
        this._tempValues.splice(idx, 1);
      }

      break;

    case 'check_all':
      this._tempValues = this.$selectlistBox.values;
      break;

    case 'uncheck_all':
      this._tempValues = [];
      break;
  }

  setTimeout(function () {
    this.viewItemsByValues(this._tempValues);
    var bound = this.getBoundingClientRect();
    this.$selectlistBox.addStyle('min-width', Math.max(bound.width, this.$selectlistBox.getFontSize() * 15.5) + 'px');
    this.$selectlistBox.refollow();
    this.$selectlistBox.updatePosition();

    _ResizeSystem.default.requestUpdateSignal();
  }.bind(this), 1);
};

MultiCheckMenu.eventHandler.selectListBoxCancel = function (event) {
  this.viewItemsByValues(this._values);
  this.isFocus = false;
  this.$selectlistBox.values = this._values;
};

MultiCheckMenu.eventHandler.selectListBoxClose = function (event) {
  this.eventHandler.selectListBoxPressItem(event); //to notify something remove, add

  this.isFocus = false;
};

MultiCheckMenu.property.isFocus = {
  set: function (value) {
    if (!this._isFocus && value) {
      this._tempValues = this._values.slice();
      this.$selectlistBox.values = this._values;
      this.activeValue = null;
    }

    var thisSM = this;
    if (!this.items || this.items.length === 0) value = false; //prevent focus

    if (this._isFocus === value) return;
    this._isFocus = !!value;

    if (this._isFocus) {
      thisSM.off('click', this.eventHandler.click);
      document.body.appendChild(this.$selectlistBox);
      this.$selectlistBox.domSignal.$attachhook.emit('attached');
      var bound = this.getBoundingClientRect();
      this.$selectlistBox.addStyle('min-width', Math.max(bound.width, this.$selectlistBox.getFontSize() * 15.5) + 'px');
      this.$selectlistBox.refollow();
      this.$selectlistBox.updatePosition();
      setTimeout(function () {
        thisSM.$selectlistBox.focus();
        document.addEventListener('mousedown', thisSM.eventHandler.bodyClick);
      }, 100);
      this.$selectlistBox.viewListAtFirstSelected();
    } else {
      document.removeEventListener('mousedown', thisSM.eventHandler.bodyClick);
      document.addEventListener('mouseup', function mup() {
        setTimeout(function () {
          thisSM.on('click', thisSM.eventHandler.click);
          document.removeEventListener('mouseup', mup);
        }, 5);
      });
      this.$selectlistBox.selfRemove();
      this.$selectlistBox.unfollow();
      this.$selectlistBox.resetSearchState();
    }
  },
  get: _MultiSelectMenu.default.property.isFocus.get
};
MultiCheckMenu.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
/***
 * call after close checklistbox
 * @param event
 */

MultiCheckMenu.eventHandler.selectListBoxPressItem = function (event) {
  var prevValues = this._values;
  var prevDict = prevValues.reduce(function (ac, cr) {
    ac[cr + ''] = cr;
    return ac;
  }, {});
  this.$selectlistBox.updatePosition();
  var curValues = this.$selectlistBox.values;
  var changed = false;
  var curDict = curValues.reduce(function (ac, cr) {
    ac[cr + ''] = cr;
    return ac;
  }, {});
  this._values = curValues.slice();
  prevValues.forEach(function (value) {
    if (value + '' in curDict) return;
    var holders = this.$selectlistBox.findItemsByValue(value);
    if (!holders || holders.length === 0) return;
    var item = holders[0].item;
    this.emit('remove', Object.assign({}, event, {
      type: 'remove',
      target: this,
      value: item.value,
      data: item,
      itemData: item
    }), this);
    changed = true;
  }.bind(this));
  curValues.forEach(function (value) {
    if (value + '' in prevDict) return;
    var holders = this.$selectlistBox.findItemsByValue(value);
    if (!holders || holders.length === 0) return;
    var item = holders[0].item;
    this.emit('add', Object.assign({}, event, {
      type: 'add',
      target: this,
      value: item.value,
      data: item,
      itemData: item
    }), this);
    changed = true;
  }.bind(this));

  this._updateItems();

  this.isFocus = false;
  if (changed) this.emit('change', Object.assign({}, event, {
    type: 'change',
    action: 'submit',
    target: this,
    values: this.values
  }), this);
};

MultiCheckMenu.eventHandler.pressCloseItem = function (item, event) {
  var value = item.value;
  var data = item.data;
  var currentValues;
  var index;

  if (this.isFocus) {
    currentValues = this.$selectlistBox.values;
    index = currentValues.indexOf(value);

    if (index >= 0) {
      currentValues.splice(index, 1);
    }

    this.$selectlistBox.values = currentValues;
    this.$selectlistBox.updatePosition();
    this.viewItemsByValues(this.$selectlistBox.values);

    _ResizeSystem.default.requestUpdateSignal();
  } else {
    index = this._values.indexOf(value);

    if (index >= 0) {
      this._values.splice(index, 1);

      this._updateItems();

      this.emit('remove', Object.assign({}, event, {
        type: 'change',
        target: this,
        data: data,
        value: value,
        itemData: data
      }), this);
      this.emit('change', Object.assign({}, event, {
        type: 'change',
        action: 'remove',
        target: this,
        data: data,
        value: value,
        itemData: data
      }), this);
    }
  }
};

MultiCheckMenu.eventHandler.pressItem = function (item, event) {
  var value = item.value;

  if (this.itemFocusable && !this.isFocus) {
    var prevActiveValue = this.activeValue;

    if (value !== prevActiveValue) {
      this.activeValue = value;
      this.emit('activevaluechange', {
        target: this,
        originEvent: event,
        prevActiveValue: prevActiveValue,
        activeValue: value
      }, this);
    }
  } else if (this.isFocus) {
    this.$selectlistBox.viewListAtValue(value);
  }
};

_ACore.default.install(MultiCheckMenu);

var _default = MultiCheckMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ChromeTime24Picker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ChromeTime24Picker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/chrometimepicker.css");

require("../css/chrometime24picker.css");

var _ChromeTimePicker = _interopRequireDefault(require("./ChromeTimePicker"));

var _datetime = require("absol/src/Time/datetime");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _utils = require("./utils");




/**
 *
 * @param {number} leftOffset
 */
function calcMinHMTime(leftOffset) {
  var h = Math.floor(leftOffset / _datetime.MILLIS_PER_HOUR);
  var m = Math.floor(leftOffset / _datetime.MILLIS_PER_MINUTE) % 60;

  if (leftOffset % _datetime.MILLIS_PER_MINUTE > 0) {
    if (m === 59) {
      h++;
      m = 0;
    } else {
      m++;
    }
  }

  var offset = h * _datetime.MILLIS_PER_HOUR + m * _datetime.MILLIS_PER_MINUTE;
  return {
    m: m,
    h: h,
    offset: offset
  };
}
/***
 * @extends AElement
 * @constructor
 */


function ChromeTime24Picker() {
  this.$lists = (0, _ACore.$$)('.as-chrome-time-picker-list', this);
  (0, _ACore.$$)('.as-chrome-time-picker-scroller', this).forEach(_ChromeTimePicker.default.prototype._makeScroller.bind(this));
  this.$hours = (0, _ACore.$$)('.as-chrome-time-picker-h24 .as-chrome-time-picker-btn', this);
  this.$minutes = (0, _ACore.$$)('.as-chrome-time-picker-m60 .as-chrome-time-picker-btn', this);
  this.$lists[0].on('click', this.eventHandler.clickHour24List);
  this.$lists[1].on('click', this.eventHandler.clickMinList);
  this.$domSignal = (0, _ACore._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$attachhook);
  this.domSignal.on('scrollToSelectedMinute', this._scrollToSelectedMinute.bind(this)).on('scrollToSelectedHour', this._scrollToSelectedHour.bind(this));
  this._dayOffset = 0;
  this._value = 0;
  this.dayOffset = new Date();
  this.value = 2 * _datetime.MILLIS_PER_MINUTE;
}

ChromeTime24Picker.tag = 'ChromeTime24Picker'.toLowerCase();

ChromeTime24Picker.render = function () {
  return (0, _ACore._)({
    extendEvent: 'change',
    class: ['as-chrome-time-24-picker', 'as-chrome-time-picker'],
    child: [{
      class: ['as-chrome-time-picker-scroller', 'as-chrome-time-24-picker-hour'],
      child: [{
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-up',
        child: 'span.mdi.mdi-chevron-up'
      }, {
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-down',
        child: 'span.mdi.mdi-chevron-down'
      }, {
        class: ['as-chrome-time-picker-viewport', 'as-chrome-time-picker-h24'],
        child: {
          class: 'as-chrome-time-picker-list',
          child: Array(24).fill(0).map(function (u, i) {
            return {
              tag: 'button',
              class: 'as-chrome-time-picker-btn',
              child: [{
                tag: 'span',
                child: {
                  text: i + ''
                }
              }, {
                tag: 'span',
                class: 'as-chrome-time-24-picker-tomorrow-text',
                child: {
                  text: ' (Hôm sau)'
                }
              }],
              props: {
                __hour__: i
              }
            };
          })
        }
      }]
    }, {
      class: 'as-chrome-time-picker-scroller',
      child: [{
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-up',
        child: 'span.mdi.mdi-chevron-up'
      }, {
        tag: 'button',
        class: 'as-chrome-time-picker-scroller-down',
        child: 'span.mdi.mdi-chevron-down'
      }, {
        class: ['as-chrome-time-picker-viewport', 'as-chrome-time-picker-m60'],
        child: {
          class: 'as-chrome-time-picker-list',
          child: Array(60).fill(0).map(function (u, i) {
            return {
              tag: 'button',
              class: 'as-chrome-time-picker-btn',
              child: {
                tag: 'span',
                child: {
                  text: i + ''
                }
              },
              props: {
                __min__: i
              }
            };
          })
        }
      }]
    }]
  });
};

ChromeTime24Picker.prototype._updateHourNumbers = function () {
  var mH = calcMinHMTime(this.dayOffset).h;

  for (var i = 0; i < this.$hours.length; ++i) {
    this.$hours[i].firstChild.firstChild.data = (mH + i) % 24;

    if (mH + i >= 24) {
      this.$hours[i].addClass('as-in-tomorrow');
    } else {
      this.$hours[i].removeClass('as-in-tomorrow');
    }
  }
};

ChromeTime24Picker.prototype._updateMinuteNumbers = function () {
  var minHM = calcMinHMTime(this.dayOffset);
  var h = minHM.h;
  var m = minHM.m;
  var vH = Math.floor((this.dayOffset + this.value) / _datetime.MILLIS_PER_HOUR);

  for (var i = 0; i < this.$minutes.length; ++i) {
    if (vH === h && i < m) {
      this.$minutes[i].disabled = true;
    } else {
      this.$minutes[i].disabled = false;
    }
  }
};

ChromeTime24Picker.prototype._updateSelectedHour = function () {
  var h = Math.floor(this.dayOffset / _datetime.MILLIS_PER_HOUR);
  var vH = Math.floor((this.dayOffset + this.value) / _datetime.MILLIS_PER_HOUR);
  var d = vH - h;

  for (var i = 0; i < this.$hours.length; ++i) {
    if (i === d) {
      this.$hours[i].addClass('as-selected');
      this.$selectedHour = this.$hours[i];
    } else {
      this.$hours[i].removeClass('as-selected');
    }
  }

  this._scrollToSelectedHour();
};

ChromeTime24Picker.prototype._updateSelectedMinute = function () {
  var vM = Math.floor((this.dayOffset + this.value) / _datetime.MILLIS_PER_MINUTE) % 60;

  for (var i = 0; i < this.$minutes.length; ++i) {
    if (vM === i) {
      this.$minutes[i].addClass('as-selected');
      this.$selectedMinute = this.$minutes[i];
    } else {
      this.$minutes[i].removeClass('as-selected');
    }
  }

  this._scrollToSelectedMinute();
};

ChromeTime24Picker.prototype._update = function () {
  this._updateHourNumbers();

  this._updateMinuteNumbers();

  this._updateSelectedHour();

  this._updateSelectedMinute();
};

ChromeTime24Picker.prototype._scrollToSelectedHour = function () {
  if (this.isDescendantOf(document.body)) {
    if (this.$selectedHour) {
      (0, _utils.vScrollIntoView)(this.$selectedHour);
    }
  } else {
    this.domSignal.emit('scrollToSelectedHour');
  }
};

ChromeTime24Picker.prototype._scrollToSelectedMinute = function () {
  if (this.isDescendantOf(document.body)) {
    if (this.$selectedMinute) {
      (0, _utils.vScrollIntoView)(this.$selectedMinute);
    }
  } else {
    this.domSignal.emit('scrollToSelectedMinute');
  }
};

ChromeTime24Picker.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change'
  }, this);
};

ChromeTime24Picker.property = {};
ChromeTime24Picker.property.dayOffset = {
  /***
   *
   * @param {number|Date} value
   */
  set: function (value) {
    if (typeof value === "number") {
      value = Math.max(0, value % _datetime.MILLIS_PER_DAY); //10p
    } else if (value instanceof Date) {
      value = Math.max(0, (value.getTime() - (0, _datetime.beginOfDay)(value).getTime()) % _datetime.MILLIS_PER_DAY);
    } else value = 0;

    this._dayOffset = value;

    this._update();
  },
  get: function () {
    return this._dayOffset;
  }
};
ChromeTime24Picker.property.value = {
  /***
   * @this ChromeTime24Picker
   * @param value
   */
  set: function (value) {
    this._value = value;

    this._update();
  },
  get: function () {
    return this._value;
  }
};
ChromeTime24Picker.property.hour = {
  get: function () {
    return Math.floor((this.dayOffset + this.value) / _datetime.MILLIS_PER_HOUR);
  }
};
ChromeTime24Picker.property.minute = {
  get: function () {
    return Math.floor((this.dayOffset + this.value) / _datetime.MILLIS_PER_MINUTE) % 60;
  }
};
ChromeTime24Picker.eventHandler = {};

ChromeTime24Picker.eventHandler.clickHour24List = function (event) {
  var minHM = calcMinHMTime(this.dayOffset);
  var h = minHM.h;
  var vM = Math.floor((this.dayOffset + this.value) / _datetime.MILLIS_PER_MINUTE) % 60;
  var hour;
  var minChanged = false;
  var prevValue = this._value;
  if ('__hour__' in event.target) hour = event.target.__hour__;
  if ('__hour__' in event.target.parentElement) hour = event.target.parentElement.__hour__;

  if (hour !== undefined) {
    if (hour === 0 && minHM.m > vM) {
      vM = minHM.m;
      minChanged = true;
    }

    this._value = (h + hour) * _datetime.MILLIS_PER_HOUR + vM * _datetime.MILLIS_PER_MINUTE - this.dayOffset;

    this._updateSelectedHour();

    this._updateMinuteNumbers();

    if (minChanged) this._updateSelectedMinute();
    if (prevValue !== this._value) this.notifyChange(event);
  }
};

ChromeTime24Picker.eventHandler.clickMinList = function (event) {
  var vH = Math.floor((this.dayOffset + this.value) / _datetime.MILLIS_PER_HOUR);
  var min;
  var prevValue = this._value;
  if ('__min__' in event.target) min = event.target.__min__;
  if ('__min__' in event.target.parentElement) min = event.target.parentElement.__min__;

  if (min !== undefined) {
    this._value = vH * _datetime.MILLIS_PER_HOUR + min * _datetime.MILLIS_PER_MINUTE - this.dayOffset;

    this._updateSelectedMinute();

    this.notifyChange(event);
    if (prevValue !== this._value) this.notifyChange(event);
  }
};

_ACore.default.install(ChromeTime24Picker);

var _default = ChromeTime24Picker;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/Time24Input.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/Time24Input.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _ChromeTime24Picker = _interopRequireDefault(require("./ChromeTime24Picker"));

var _datetime = require("absol/src/Time/datetime");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _utils = require("./utils");

var _TimeInput = _interopRequireDefault(require("./TimeInput"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




/**
 * @extends AElement
 * @constructor
 */
function Time24Input() {
  this.$clockBtn = (0, _ACore.$)('.as-time-input-icon-btn', this).on('click', this.eventHandler.clickClockBtn);
  this.$text = (0, _ACore.$)('.as-time-input-text', this);
  this.$clearBtn = (0, _ACore.$)('button.as-time-input-clear-btn', this).on('click', this.clear.bind(this));
  this._dayOffset = 0;
  this._value = 0;
  this._format = 'HH:mm';
  this.dayOffset = this._dayOffset;
  this.value = this._value;
  this.format = this._format;
  this.notNull = true;
}

Time24Input.tag = 'Time24Input'.toLowerCase();

Time24Input.render = function () {
  return (0, _ACore._)({
    class: ['ac-time-input', 'as-time-24-input'],
    extendEvent: ['change'],
    child: [{
      tag: 'input',
      class: 'as-time-input-text',
      attr: {
        readOnly: 'true',
        type: 'text'
      }
    }, {
      tag: 'button',
      class: 'as-time-input-clear-btn',
      child: 'span.mdi.mdi-close-circle'
    }, {
      tag: 'button',
      class: 'as-time-input-icon-btn',
      child: 'span.mdi.mdi-clock-outline'
    }]
  });
};

Time24Input.prototype._updateText = function () {
  var text;

  if ((0, _utils.isRealNumber)(this._value) && (0, _utils.isRealNumber)(this._dayOffset)) {
    text = (0, _datetime.formatDateTime)(new Date((0, _datetime.beginOfDay)(new Date()).getTime() + this._value + this._dayOffset), this._format);
    if (this._value + this._dayOffset >= _datetime.MILLIS_PER_DAY) text += ' (Hôm sau)';
    this.removeClass('as-value-null');
  } else {
    text = this._format;
    this.addClass('as-value-null');
  }

  this.$text.value = text;
};

Time24Input.prototype._notifyChange = function (event) {
  this.emit('change', {
    type: 'change',
    originalEvent: event.originalEvent || event.originEvent || event
  }, this);
};

Time24Input.prototype.clear = function (event) {
  if (this._value !== null && !this.notNull) {
    this.value = null;

    this._notifyChange(event);
  }
};

Time24Input.prototype.share = {
  $picker: null,

  /***
   * @type Time24Input
   */
  $holdingInput: null,
  $follower: null
};

Time24Input.prototype._preparePicker = function () {
  if (this.share.$picker) return;
  this.share.$picker = (0, _ACore._)({
    tag: _ChromeTime24Picker.default.tag,
    class: 'as-dropdown-box-common-style'
  });
  this.share.$follower = (0, _ACore._)({
    tag: 'follower',
    class: 'as-chrome-time-24-picker-follower',
    child: this.share.$picker
  });
};

Time24Input.prototype._attachPicker = function () {
  this._preparePicker();

  if (this.share.$holdingInput) {
    this.share.$holdingInput._releasePicker();
  }

  this.share.$holdingInput = this;
  this.share.$follower.addTo(document.body);
  this.share.$follower.followTarget = this;
  this.share.$follower.addStyle('visibility', 'hidden');
  this.share.$picker.on('change', this.eventHandler.pickerChange);
  this.$clockBtn.off('click', this.eventHandler.clickClockBtn);
  this.share.$picker.dayOffset = (0, _utils.isRealNumber)(this._dayOffset) ? this._dayOffset : 0;
  this.share.$picker.value = (0, _utils.isRealNumber)(this._value) ? this._value : 0;
  setTimeout(function () {
    document.body.addEventListener('click', this.eventHandler.clickOut);
    this.share.$follower.removeStyle('visibility');
  }.bind(this), 5);
};

Time24Input.prototype._releasePicker = function () {
  if (this.share.$holdingInput !== this) return;
  this.share.$picker.off('change', this.eventHandler.pickerChange);
  this.share.$follower.remove();
  this.share.$follower.followTarget = null;
  this.share.$holdingInput = null;
  document.body.removeEventListener('click', this.eventHandler.clickOut);
  setTimeout(function () {
    this.$clockBtn.on('click', this.eventHandler.clickClockBtn);
  }.bind(this), 10);
};

Time24Input.property = {};
Time24Input.property.dayOffset = {
  set: function (value) {
    this._dayOffset = (0, _utils.isRealNumber)(value) ? value : null;

    this._updateText();
  },
  get: function () {
    return this._dayOffset;
  }
};
Time24Input.property.value = {
  set: function (value) {
    this._value = (0, _utils.isRealNumber)(value) ? value : this.notNull ? 0 : null;

    this._updateText();
  },
  get: function () {
    return this._value;
  }
};
Time24Input.property.displayTime = {
  get: function () {
    if ((0, _utils.isRealNumber)(this._value) && (0, _utils.isRealNumber)(this._dayOffset)) {
      return this._value + this._dayOffset;
    } else {
      return null;
    }
  }
};
Time24Input.property.notNull = {
  set: function (value) {
    if (value) {
      if (this.value === null) {
        this.value = 0;
      }

      this.addClass('as-must-not-null');
    } else {
      this.removeClass('as-must-not-null');
    }
  },
  get: function () {
    return this.hasClass('as-must-not-null');
  }
};
Time24Input.property.disabled = {
  set: function (value) {
    value = !!value;
    this._disabled = value;
    if (value) this.addClass('as-disabled');else this.removeClass('as-disabled');
    this.$text.disabled = value;
  },
  get: function () {
    return this._disabled;
  }
};
Time24Input.property.readOnly = _TimeInput.default.property.readOnly;
Time24Input.property.format = {
  set: function (value) {
    this._format = value || 'HH:mm';

    this._updateText();
  },
  get: function () {
    return this._format;
  }
};
Time24Input.eventHandler = {};

Time24Input.eventHandler.pickerChange = function (event) {
  if (this.dayOffset === null) this.dayOffset = 0;
  this.value = this.share.$picker.value;

  this._notifyChange(event);

  _ResizeSystem.default.requestUpdateSignal();
};

Time24Input.eventHandler.clickOut = function (event) {
  if ((0, _EventEmitter.hitElement)(this.share.$follower, event)) return;

  this._releasePicker();
};

Time24Input.eventHandler.clickClockBtn = function () {
  this._attachPicker();
};

_ACore.default.install(Time24Input);

var _default = Time24Input;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TimeRange24Input.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TimeRange24Input.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _TimeInput = _interopRequireDefault(require("./TimeInput"));

var _Time24Input = _interopRequireDefault(require("./Time24Input"));

require("../css/timerange24input.css");

var _utils = require("./utils");

var _datetime = require("absol/src/Time/datetime");




/***
 * @extends AElement
 * @constructor
 */
function TimeRange24Input() {
  /***
   *
   * @type {TimeInput}
   */
  this.$offset = (0, _ACore.$)(_TimeInput.default.tag, this);
  this.$offset.on('change', this.eventHandler.offsetChange);
  /***
   *
   * @type {Time24Input}
   */

  this.$duration = (0, _ACore.$)(_Time24Input.default.tag, this);
  this.$duration.on('change', this.eventHandler.durationChange);
  /***
   * @type {number}
   * @name dayOffset
   * @memberOf TimeRange24Input#
   */

  /***
   * @type {number}
   * @name duration
   * @memberOf TimeRange24Input#
   */

  /***
   * @type {string}
   * @name format
   * @memberOf TimeRange24Input#
   */
}

TimeRange24Input.tag = 'TimeRange24Input'.toLowerCase();

TimeRange24Input.render = function () {
  return (0, _ACore._)({
    extendEvent: ['change'],
    class: 'as-time-range-24-input',
    child: [{
      tag: _TimeInput.default.tag,
      props: {
        format: 'HH:mm'
      }
    }, _Time24Input.default.tag]
  });
};

TimeRange24Input.prototype.init = function (props) {
  props = props || {};
  var cpProps = Object.assign(props);

  if ('notNull' in props) {
    this.notNull = props.notNull;
    delete cpProps.notNull;
  }

  if ('dayOffset' in props) {
    this.dayOffset = props.dayOffset;
    delete cpProps.dayOffset;
  }

  Object.assign(this, cpProps);
};

TimeRange24Input.prototype._updateTextData = function () {
  var dayOffset = this.dayOffset;
  var duration = this.duration;
  var format = this.format;
  var bD = (0, _datetime.beginOfDay)(new Date()).getTime();
  var text = (0, _datetime.formatDateTime)(new Date(bD + dayOffset), format || 'HH:mm');
  text += ' - ' + (0, _datetime.formatDateTime)(new Date(bD + dayOffset + duration), format || 'HH:mm');
  this.attr('data-text', text);
};

TimeRange24Input.property = {};
TimeRange24Input.property.notNull = {
  /***
   * @this TimeRange24Input
   * @param value
   */
  set: function (value) {
    value = !!value;
    this.$offset.notNull = value;
    this.$duration.notNull = value;

    this._updateTextData();
  },
  get: function () {
    return this.$offset.notNull;
  }
};
TimeRange24Input.property.disabled = {
  set: function (value) {
    value = !!value;

    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }

    this.$offset.disabled = value;
    this.$duration.disabled = value;
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
TimeRange24Input.property.dayOffset = {
  set: function (value) {
    var notNull = this.notNull;

    if ((0, _utils.isRealNumber)(value)) {
      value = value << 0;
      value = value % _datetime.MILLIS_PER_DAY;
      value = (value + _datetime.MILLIS_PER_DAY) % _datetime.MILLIS_PER_DAY;
      value = Math.floor(value / _datetime.MILLIS_PER_MINUTE) * _datetime.MILLIS_PER_MINUTE;
    } else {
      value = notNull ? 0 : null;
    }

    this.$offset.dayOffset = value;
    this.$duration.dayOffset = value;

    this._updateTextData();
  },
  get: function () {
    return this.$offset.dayOffset;
  }
};
TimeRange24Input.property.duration = {
  /***
   * @this TimeRange24Input
   * @param value
   */
  set: function (value) {
    var notNull = this.notNull;

    if ((0, _utils.isRealNumber)(value)) {
      value = Math.floor(Math.min(_datetime.MILLIS_PER_DAY, Math.max(0, value)));
      value = Math.floor(value / _datetime.MILLIS_PER_MINUTE) * _datetime.MILLIS_PER_MINUTE;
    } else {
      value = notNull ? 0 : null;
    }

    this.$duration.value = value;

    this._updateTextData();
  },
  get: function () {
    return this.$duration.value;
  }
};
TimeRange24Input.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
      this.$offset.readOnly = true;
      this.$duration.readOnly = true;
    } else {
      this.removeClass('as-read-only');
      this.$offset.readOnly = false;
      this.$duration.readOnly = false;
    }
  },
  get: function () {
    return this.containsClass('as-read-only');
  }
};
TimeRange24Input.eventHandler = {};

TimeRange24Input.eventHandler.offsetChange = function (event) {
  this.$duration.dayOffset = this.$offset.dayOffset;

  this._updateTextData();

  this.emit('change', {
    type: 'change',
    property: 'dayOffset',
    originalEvent: event.originalEvent || event.originEvent || event
  });
};

TimeRange24Input.eventHandler.durationChange = function (event) {
  if (this.$duration.dayOffset !== null && this.$offset.dayOffset === null) {
    this.$offset.dayOffset = this.$duration.dayOffset;
  }

  this._updateTextData();

  this.emit('change', {
    type: 'change',
    property: 'duration',
    originalEvent: event.originalEvent || event.originEvent || event
  });
};

_ACore.default.install(TimeRange24Input);

var _default = TimeRange24Input;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CheckTreeItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CheckTreeItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _ExpTree = require("./ExpTree");

var _SelectListItem = require("./SelectListItem");

require("../css/checktreeitem.css");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");



/***
 * @extends ExpNode
 * @constructor
 */
function CheckTreeItem() {
  this._itemData = null;
  this.$name = (0, _ACore.$)('span.absol-exp-node-name', this);
  this.$desc = (0, _ACore.$)('span.absol-exp-node-desc', this);
  this.$iconCtn = (0, _ACore.$)('div.absol-exp-node-ext-icon', this);
  this.$level = (0, _ACore.$)('.absol-exp-node-level', this);
  this.$checkbox = (0, _ACore.$)('checkboxbutton', this).on('change', this.eventHandler.checkboxChange);
  this.$toggleIcon = (0, _ACore.$)('toggler-ico', this);
  this.on('click', this.eventHandler.click);
}

CheckTreeItem.tag = 'CheckTreeItem'.toLowerCase();

CheckTreeItem.render = function () {
  return (0, _ACore._)({
    tag: 'button',
    extendEvent: ['select', 'presstoggle'],
    class: ['as-check-tree-item', 'absol-exp-node'],
    child: ['.absol-exp-node-level', 'toggler-ico', 'checkboxbutton', 'img.absol-exp-node-ext-icon', 'div.absol-exp-node-ext-icon', 'span.absol-exp-node-name', 'span.absol-exp-node-desc']
  });
};

CheckTreeItem.property = {};
CheckTreeItem.property.icon = _ExpTree.ExpNode.property.icon;
CheckTreeItem.property.text = _ExpTree.ExpNode.property.name;
CheckTreeItem.property.level = _ExpTree.ExpNode.property.level;
CheckTreeItem.property.desc = _ExpTree.ExpNode.property.desc;
CheckTreeItem.property.status = _ExpTree.ExpNode.property.status;
CheckTreeItem.property.data = {
  set: function (itemData) {
    this._itemData = itemData;
    var text = (0, _SelectListItem.getTextOfListItem)(itemData);
    this.text = text;
    this.attr('title', itemData.value + '');
    var desc = (0, _SelectListItem.getDescriptionOfListItem)(itemData);
    this.desc = desc;

    if (itemData && itemData.icon) {
      this.icon = itemData.icon;
    } else {
      this.icon = null;
    }

    this.noSelect = itemData.noSelect;
  },
  get: function () {
    return this._itemData;
  }
};
CheckTreeItem.property.selected = {
  set: function (value) {
    this.$checkbox.disabled = value === 'empty';

    if (value === 'all') {
      this.$checkbox.removeClass('as-has-minus').removeClass('as-has-minus');
      this.$checkbox.checked = true;
    } else if (value === 'child') {
      this.$checkbox.checked = false;
      this.$checkbox.addClass('as-has-minus');
    } else if (value === 'empty') {
      this.$checkbox.removeClass('as-has-minus');
      this.$checkbox.checked = false;
    } else {
      this.$checkbox.removeClass('as-has-minus');
      this.$checkbox.checked = false;
    }
  },
  get: function () {
    if (this.$checkbox.checked) {
      return 'all';
    } else {
      if (this.$checkbox.hasClass('as-has-minus')) {
        return 'child';
      } else {
        return 'none';
      }
    }
  }
};
CheckTreeItem.property.noSelect = {
  set: function (value) {
    if (value) {
      this.addClass('as-no-select');
    } else {
      this.removeClass('as-no-select');
    }
  },
  get: function () {
    return this.hasClass('as-no-select');
  }
};
CheckTreeItem.eventHandler = {};

CheckTreeItem.eventHandler.checkboxChange = function (event) {
  this.emit('select', {
    type: 'select',
    target: this,
    originalEvent: event.originalEvent || event.originEvent || event
  });
};

CheckTreeItem.eventHandler.click = function (event) {
  var tBound;

  if (this.status === 'open' || this.status === 'close') {
    tBound = this.$toggleIcon.getBoundingClientRect();

    if (event.clientX <= tBound.right || this.noSelect) {
      this.emit('presstoggle', {
        type: 'presstoggle',
        target: this,
        originalEvent: event
      }, this);
    } else if (!(0, _EventEmitter.hitElement)(this.$checkbox, event) && !this.$checkbox.disabled) {
      this.$checkbox.checked = !this.$checkbox.checked;
      this.eventHandler.checkboxChange(event);
    }
  } else {
    if (!(0, _EventEmitter.hitElement)(this.$checkbox, event) && !this.noSelect && !this.$checkbox.disabled) {
      this.$checkbox.checked = !this.$checkbox.checked;
      this.eventHandler.checkboxChange(event);
    }
  }
};

_ACore.default.install(CheckTreeItem);

var _default = CheckTreeItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CPUViewer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CPUViewer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

require("../css/cpuviewer.css");




/***
 * @extends AElement
 * @constructor
 */
function CPUViewer() {
  /***
   *
   * @type {HTMLCanvasElement}
   */
  this.$canvas = (0, _ACore.$)('canvas', this);
  this.ctx = this.$canvas.getContext('2d');
  this.offsetTime = 0;
  this.inv = -1;
  this.usage = Array(120).fill(0);
  this.holdStart = 0;
  this.holdTime = 0;
  this.logOffset = 0;
  this.counter = 0;
  this['tick'] = this.tick.bind(this);
}

CPUViewer.tag = 'CPUViewer'.toLowerCase();

CPUViewer.render = function () {
  return (0, _ACore._)({
    class: 'as-cpu-viewer',
    child: {
      tag: 'canvas',
      attr: {
        width: '120px',
        height: '50px'
      }
    }
  });
};

CPUViewer.prototype.start = function () {
  if (this.inv < 0) {
    this.offsetTime = new Date().getTime();
    setInterval(this.tick, 250);
  }
};

CPUViewer.prototype.stop = function () {
  if (this.inv > 0) {
    clearInterval(this.inv);
    this.inv = -1;
  }
};

CPUViewer.prototype.tick = function () {
  while (this.holdTime > 250) {
    this.holdTime -= 250;
    this.usage.push(100);
  }

  this.usage.push(this.holdTime * 100 / 250);

  while (this.usage.length > 120) {
    this.usage.shift();
  }

  this.ctx.fillStyle = 'black';
  this.ctx.fillRect(0, 0, 120, 50);
  var y;
  this.ctx.fillStyle = 'yellow';

  for (var x = 0; x < this.usage.length; ++x) {
    y = this.usage[x] / 2;
    this.ctx.fillRect(x, 50 - y, 1, y);
  }

  var now = new Date().getTime();
  this.logOffset = now;
  this.holdStart = now;
  this.holdTime = 0;
};

CPUViewer.prototype.hold = function () {
  if (this.counter === 0) {
    this.holdStart = new Date().getTime();
  }

  this.counter++;
};

CPUViewer.prototype.release = function () {
  if (this.counter <= 0) return;
  this.counter--;

  if (this.counter === 0) {
    this.holdTime += new Date().getTime() - this.holdStart;
  }
};
/***
 *
 * @type {CPUViewer}
 */


CPUViewer.instance = null;
CPUViewer.state = 'NOT_INIT';

CPUViewer.start = function () {
  if (!this.instance) {
    this.instance = (0, _ACore._)('cpuviewer');
    this.state = "NOT_ATTACHED";
  }

  if (this.state === "NOT_ATTACHED") {
    this.state = "RUNNING";

    _Dom.default.documentReady.then(function () {
      document.body.appendChild(this.instance);
    }.bind(this));
  }

  this.instance.start();

  CPUViewer.hold = function () {
    this.instance.hold();
  };

  CPUViewer.release = function () {
    this.instance.release();
  };
};

CPUViewer.stop = function () {
  if (!this.instance) return;
  if (this.state !== "RUNNING") return;
  this.instance.stop();
  this.instance.remove();
  this.state = 'NOT_ATTACHED';
};

CPUViewer.hold = function () {};

CPUViewer.release = function () {};

_ACore.default.install(CPUViewer);

var _default = CPUViewer;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CheckTreeBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CheckTreeBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.TreeNodeHolder = TreeNodeHolder;
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _Dom = require("absol/src/HTML5/Dom");

var _CheckTreeItem = _interopRequireDefault(require("./CheckTreeItem"));

require("../css/checktreebox.css");

var _utils = require("./utils");

var _search = require("./list/search");

var _CPUViewer = _interopRequireDefault(require("./CPUViewer"));

var _SelectListBox = _interopRequireDefault(require("./SelectListBox"));

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));




/***
 * @extends Follower
 * @constructor
 */
function CheckTreeBox() {
  this._initControl();

  this._initScroller();

  this._initDomHook();

  this._initProperty();

  this._initFooter();
  /***
   * @name strictValue
   * @memberOf CheckTreeBox#
   * @type {boolean}
   */

}

CheckTreeBox.tag = 'CheckTreeBox'.toLowerCase();
CheckTreeBox.prototype.preLoadN = 3;
CheckTreeBox.prototype.itemHeight = 28;
CheckTreeBox.prototype.itemInPage = 36;

CheckTreeBox.prototype._initScroller = function () {
  this.$scroller = (0, _ACore.$)('.as-check-tree-box-scroller', this).on('scroll', this.eventHandler.scroll);
  this.itemInPage = Math.max(36, Math.ceil((0, _Dom.getScreenSize)().height / this.itemHeight));
  this.$content = (0, _ACore.$)('.as-check-tree-box-content', this);
  this.$pages = (0, _ACore.$$)('.as-select-list-box-page', this);
  this.$pages.forEach(function (p) {
    p.__viewOffset__ = -1;
  });
};

CheckTreeBox.prototype._initDomHook = function () {
  this.$domSignal = (0, _ACore._)('attachhook');
  this.appendChild(this.$domSignal);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('viewListAt', this.viewListAt.bind(this));
};

CheckTreeBox.prototype._initProperty = function () {
  this.scale14 = (0, _ACore.$)(document.body).getFontSize() / 14;
  this._items = [];
  this._values = [];
  this.itemHolderByValue = {};
  /***
   *
   * @type {TreeNodeHolder[]}
   */

  this.rootHolders = [];
  /***
   *
   * @type {TreeNodeHolder[]}
   */

  this.holders = [];
  /***
   *
   * @type {TreeNodeHolder[]}
   */

  this.rootViewHolders = [];
  /***
   *
   * @type {TreeNodeHolder[]}
   */

  this.viewHolders = [];
  this.enableSearch = true;
};

CheckTreeBox.prototype._initControl = function () {
  this.cache = {};
  this.$searchInput = (0, _ACore.$)('searchtextinput', this).on('stoptyping', this.eventHandler.searchModify);
};

CheckTreeBox.prototype._initFooter = function () {
  this.$checkAll = (0, _ACore.$)('.as-select-list-box-check-all', this).on('change', this.eventHandler.checkAllChange);
  this.$cancelBtn = (0, _ACore.$)('.as-select-list-box-cancel-btn', this).on('click', this.eventHandler.clickCancelBtn);
  this.$closeBtn = (0, _ACore.$)('.as-select-list-box-close-btn', this).on('click', this.eventHandler.clickCloseBtn);
};

CheckTreeBox.prototype.focus = _SelectListBox.default.prototype.focus;

CheckTreeBox.render = function () {
  return (0, _ACore._)({
    tag: 'follower',
    extendEvent: ['change', 'toggleitem', 'cancel', 'close'],
    class: ['as-check-tree-box', 'as-select-list-box', 'as-anchor-1'],
    child: [{
      class: 'as-select-list-box-search-ctn',
      child: 'searchtextinput'
    }, {
      class: ['as-check-tree-box-scroller', 'as-bscroller', 'as-select-list-box-scroller'],
      child: {
        class: ['as-check-tree-box-content', 'as-select-list-box-content'],
        child: Array(this.prototype.preLoadN).fill('.as-select-list-box-page')
      }
    }, {
      class: 'as-dropdown-box-footer',
      child: [{
        tag: 'checkbox',
        class: 'as-select-list-box-check-all',
        props: {
          checked: false,
          text: _LanguageSystem.default.getText('txt_check_all') || _LanguageSystem.default.getText('txt_all') || 'Check All'
        }
      }, {
        class: 'as-dropdown-box-footer-right',
        child: [{
          tag: 'a',
          class: 'as-select-list-box-cancel-btn',
          attr: {
            "data-ml-key": 'txt_cancel'
          }
        }, {
          tag: 'a',
          class: 'as-select-list-box-close-btn',
          attr: {
            "data-ml-key": 'txt_close'
          }
        }]
      }]
    }],
    props: {
      anchor: [1, 6, 2, 5]
    }
  });
};

CheckTreeBox.prototype.HolderClass = TreeNodeHolder;

CheckTreeBox.prototype.depthIndexing = function (items, arr, rootArr) {
  var res = {};
  var count = 0;
  var self = this;
  var HolderClass = this.HolderClass;
  /***
   *
   * @param {TreeNodeHolder|null} root
   * @param items
   */

  function scan(root, items) {
    items.forEach(function visit(item) {
      var value = item.value + '';
      res[value] = res[value] || [];
      var node = new HolderClass(self, item, count++, root);
      res[value].push(node);
      arr && arr.push(node);

      if (root) {
        root.child.push(node);
      } else if (rootArr) {
        rootArr.push(node);
      }

      if (res[value].length > 1) {
        console.log("Duplicate value", res[value]);
      }

      if (item.items && item.items.length > 0) scan(node, item.items);
    });
  }

  scan(null, items);
  return res;
};

CheckTreeBox.prototype.findItemHoldersByValue = function (value) {
  return (this.itemHolderByValue[value] || []).slice();
};

CheckTreeBox.prototype.viewListAt = function (offset) {
  offset = offset || 0;

  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('viewListAt', offset);
    return;
  }

  this.noTransition();
  var midPage = this.$pages.length >> 1;
  var startOffset = Math.max(0, offset - midPage * this.itemInPage);
  var cOffset;
  var itemN = this.viewHolders.length;

  for (var i = 0; i < this.$pages.length; ++i) {
    cOffset = startOffset + i * this.itemInPage;

    if (cOffset < itemN) {
      this.$pages[i].__viewOffset__ = cOffset;
      this.$pages[i].removeStyle('display').addStyle('top', cOffset * this.itemHeight / 14 + 'em');

      this._fillPage(this.$pages[i], Math.min(this.itemInPage, itemN - cOffset));

      this._assignItems(this.$pages[i], cOffset);
    } else {
      this.$pages[i].__viewOffset__ = -1;
      this.$pages[i].addStyle('display', 'none');
    }
  }
};

CheckTreeBox.prototype.noTransition = function () {
  if (this.hasClass('as-no-transition')) return;
  this.addClass('as-no-transition');
  setTimeout(function () {
    this.removeClass('as-no-transition');
  }.bind(this), 100);
};

CheckTreeBox.prototype._pool = [];

CheckTreeBox.prototype._releaseItem = function (item) {
  if (item.nodeHolder && item.nodeHolder.itemElt === item) {
    item.nodeHolder.itemElt = null;
  }

  this._pool.push(item);
};

CheckTreeBox.prototype._requestItem = function () {
  var res = this._pool.pop() || (0, _ACore._)({
    tag: _CheckTreeItem.default.tag,
    props: {
      menuElt: this
    },
    on: {
      presstoggle: function (event) {
        this.menuElt.eventHandler.toggleItem(this, event);
      },
      select: function (event) {
        this.menuElt.eventHandler.selectItem(this, event);
      }
    }
  });
  res.menuElt = this;
  return res;
};

CheckTreeBox.prototype._fillPage = function (pageElt, n) {
  while (pageElt.childNodes.length > n) {
    this._releaseItem(pageElt.lastChild);

    pageElt.removeChild(pageElt.lastChild);
  }

  while (pageElt.childNodes.length < n) {
    pageElt.addChild(this._requestItem());
  }
};

CheckTreeBox.prototype._assignItems = function (pageElt, offset) {
  for (var i = 0; i < pageElt.childNodes.length; ++i) {
    this.viewHolders[offset + i].itemElt = pageElt.childNodes[i];
  }
};

CheckTreeBox.prototype._resetView = function () {
  this.$searchInput.value = '';
  this.viewHolders = this.rootHolders.reduce(function (ac, holder) {
    return holder.toArray(ac);
  }, []);
  this.rootViewHolders = this.rootHolders;
  this.updateContentSize();
  this.viewListAt(0);
};

CheckTreeBox.prototype.resetSearchState = function () {
  this._resetView();
};

CheckTreeBox.prototype._calcEstimateSize = function () {
  this.estimateSize = {
    width: 0,
    height: 0
  };
  var holders = this.holders.slice();
  var n = holders.length;
  var holder;
  var longestHolder = null;
  var longest = 0;
  var w;

  for (var i = 0; i < n; ++i) {
    holder = holders[i];
    w = holder.calcEstimateWidth();

    if (w > longest) {
      longest = w;
      longestHolder = holder;
    }
  }

  if (longestHolder) {
    this.estimateSize.width = longestHolder.calcWidth() * this.scale14;
    this.estimateSize.height = this.itemHeight * n;
  }

  this.addStyle('--select-list-estimate-width', (Math.max(145, this.estimateSize.width) + 17) / 14 + 'rem');
};

CheckTreeBox.prototype.updateContentSize = function () {
  this.$content.addStyle('height', this.viewHolders.length * this.itemHeight / 14 + 'em');
};

CheckTreeBox.prototype._updateToValues = function () {
  var values = [];
  this.rootHolders.forEach(function visit(node) {
    if (node.selected === 'all') {
      values.push(node.item.value);
    } else if (node.selected === 'child') {
      node.child.forEach(visit);
    }
  });
  this._values = values;
};

CheckTreeBox.prototype._updateFromValues = function () {
  var values = this._values;

  var valueDict = this._values.reduce(function (ac, cr) {
    ac[cr] = true;
    return ac;
  }, {});

  this.rootHolders.forEach(function visit(node) {
    var selectedAllCount = 0;
    var selectedChildCount = 0;
    var cNode;
    var value = node.item.value;

    if (valueDict[value]) {
      node.selectAll(true);
    } else {
      for (var i = 0; i < node.child.length; ++i) {
        cNode = node.child[i];
        visit(cNode);

        if (cNode.selected === 'all') {
          selectedAllCount++;
        } else if (cNode.selected === 'child') {
          selectedChildCount++;
        }
      }

      if (node.child > 0 && selectedAllCount === node.child.length) {
        node.selected = 'all';
      } else if (selectedAllCount + selectedChildCount > 0) {
        node.selected = 'child';
      } else {
        node.selected = 'none';
      }

      if (node.itemElt) node.itemElt.selected = node.selected;
    }
  });
  this.updateCheckedAll();
};

CheckTreeBox.prototype.updateCheckedAll = function () {
  var holders = this.rootHolders;
  if (holders.length === 0) return;
  var c = 0;

  for (var i = 0; i < holders.length; ++i) {
    if (holders[i].selected === 'all') c++;else break;
  }

  var noSelect = this.rootHolders.some(function (holder) {
    return holder.item.noSelect;
  });
  this.$checkAll.checked = c === holders.length;

  if (noSelect) {
    this.$checkAll.addClass('as-no-select');
  } else {
    this.$checkAll.removeClass('as-no-select');
  }
};

CheckTreeBox.prototype._implicit = function (values) {
  return values || [];
};

CheckTreeBox.prototype._explicit = function (values) {
  return values;
};

CheckTreeBox.property = {};
CheckTreeBox.property.items = {
  /***
   * @this CheckTreeBox
   * @param items
   */
  set: function (items) {
    _CPUViewer.default.hold();

    this.cache = {};
    items = items || [];
    this._items = items;
    (0, _search.prepareSearchForList)(items);
    this.holders = [];
    this.itemHolderByValue = this.depthIndexing(items, this.holders, this.rootHolders);

    this._calcEstimateSize();

    this._resetView();

    this.values = this['values']; //update

    _CPUViewer.default.release();
  },
  get: function () {
    return this._items;
  }
};
CheckTreeBox.property.values = {
  /***
   * @this CheckTreeBox
   * @param values
   */
  set: function (values) {
    this._values = this._implicit(values);

    this._updateFromValues();
  },
  get: function () {
    return this._explicit(this._values);
  }
};
CheckTreeBox.property.viewValues = {
  get: function () {
    return this._values;
  }
};
CheckTreeBox.property.enableSearch = {
  set: function (value) {
    if (value) this.addClass('as-enable-search');else this.removeClass('as-enable-search');
  },
  get: function () {
    return this.hasClass('as-enable-search');
  }
};
CheckTreeBox.eventHandler = {};

CheckTreeBox.eventHandler.toggleItem = function (item, event) {
  this.noTransition();
  var nodeHolder = item.nodeHolder;

  if (!nodeHolder) {
    console.error("Load error, item was not assigned TreeNodeHolder!");
  } else nodeHolder.toggle();
};

CheckTreeBox.eventHandler.selectItem = function (item, event) {
  var nodeHolder = item.nodeHolder;

  if (!nodeHolder) {
    console.error("Load error, item was not assigned TreeNodeHolder!");
    return;
  }

  this.noTransition();

  _CPUViewer.default.hold();

  var ref = nodeHolder.findReferenceNode();
  var targetNode = ref || nodeHolder;
  var selected = item.selected;

  if (selected === 'all') {
    targetNode.selectAll();
  } else {
    targetNode.unselectAll();
  }

  if (ref) {
    nodeHolder.getRoot().updateSelectedFromRef();
  }

  this._updateToValues();

  this.updateCheckedAll();
  this.emit('change', {
    type: 'change',
    target: this
  }, this);

  _CPUViewer.default.release();
};
/***
 * @this CheckTreeBox
 */


CheckTreeBox.eventHandler.scroll = function () {
  _CPUViewer.default.hold();

  var itemHeight = this.itemHeight * this.getFontSize() / 14;
  var scrollTop = this.$scroller.scrollTop;
  var scrollBottom = scrollTop + this.$scroller.clientHeight;
  var startOffset = this.$pages[0].__viewOffset__;
  var endOffset = this.$pages[this.$pages.length - 1].__viewOffset__;

  if (endOffset === -1) {
    endOffset = this.viewHolders.length;
  } else {
    endOffset += this.$pages[this.$pages.length - 1].childNodes.length;
  }

  var needLoad = 0;
  if (startOffset > 0 && startOffset * itemHeight + 200 > scrollTop) needLoad = -1;

  if (needLoad === 0 && this.viewHolders.length > endOffset && endOffset * itemHeight - 200 < scrollBottom) {
    needLoad = 1;
  }

  var page2Load;

  if (needLoad < 0) {
    page2Load = this.$pages.pop();
    this.$pages.unshift(page2Load);
    page2Load.__viewOffset__ = Math.max(0, startOffset - this.itemInPage);

    this._fillPage(page2Load, startOffset - page2Load.__viewOffset__);

    this._assignItems(page2Load, page2Load.__viewOffset__);

    page2Load.removeStyle('display');
    page2Load.addStyle('top', page2Load.__viewOffset__ * itemHeight + 'px');
  } else if (needLoad > 0) {
    for (var i = 0; i < this.$pages.length; ++i) {
      if (this.$pages[i].__viewOffset__ === -1) {
        page2Load = this.$pages[i];
        break;
      }
    }

    if (!page2Load) {
      page2Load = this.$pages.shift();
      this.$pages.push(page2Load);
    }

    page2Load.__viewOffset__ = endOffset;

    this._fillPage(page2Load, Math.min(this.itemInPage, this.viewHolders.length - endOffset));

    this._assignItems(page2Load, page2Load.__viewOffset__);

    page2Load.removeStyle('display');
    page2Load.addStyle('top', page2Load.__viewOffset__ * itemHeight + 'px');
  }

  _CPUViewer.default.release();
};
/***
 * @this CheckTreeBox
 */


CheckTreeBox.eventHandler.searchModify = function () {
  _CPUViewer.default.hold();

  var self = this;
  var text = this.$searchInput.value.trim();

  if (text.length === 0) {
    this._resetView();

    _CPUViewer.default.release();

    return;
  }

  var searchData;

  if (this.cache[text]) {
    searchData = this.cache[text];
  } else {
    searchData = {};
    searchData.items = (0, _search.searchTreeListByText)(text, this._items);
    searchData.rootViewHolders = [];
    var temp1 = [];
    var temp2 = [];
    self.depthIndexing(searchData.items, temp1);
    searchData.items.forEach(function visit(it) {
      if (it.ref.items && it.ref.items.length > 0 && (!it.items || it.items.length === 0)) {
        it.items = it.ref.items;
        it.doNotInitOpen = true;
      } else if (it.items && it.items.length > 0) {
        it.items.forEach(visit);
      }
    });
    self.depthIndexing(searchData.items, temp2, searchData.rootViewHolders);
    searchData.viewHolders = [];

    while (temp1.length > 0 && temp2.length > 0) {
      if (temp1[0].item === temp2[0].item) {
        searchData.viewHolders.push(temp2.shift());
        temp1.shift();
      } else {
        temp2.shift();
      }
    }
  }

  searchData.viewHolders.forEach(function (it) {
    if (it.status === 'close') {
      if (!it.item.doNotInitOpen) it.status = 'open';
    }
  });
  this.viewHolders = searchData.viewHolders.slice();
  this.rootViewHolders = searchData.rootViewHolders.slice();
  this.viewHolders.forEach(function (node) {
    var ref = node.findReferenceNode();
    node.selected = ref.selected;
    if (node.itemElt) node.itemElt.selected = node.selected;
  });
  this.updateContentSize();
  this.viewListAt(0);
  this.updatePosition();

  _CPUViewer.default.release();
};

CheckTreeBox.prototype.updateSelectedInViewIfNeed = function () {
  if (this.viewHolders.length > 0) {
    if (this.viewHolders[0].findReferenceNode()) {
      this.viewHolders.forEach(function (node) {
        var ref = node.findReferenceNode();
        node.selected = ref.selected;
        if (node.itemElt) node.itemElt.selected = node.selected;
      });
    }
  }
};

CheckTreeBox.eventHandler.checkAllChange = function (event) {
  _CPUViewer.default.hold();

  var checkedAll = this.$checkAll.checked;
  var changed = false;
  var holders = this.rootHolders;
  var holder;

  for (var i = 0; i < holders.length; ++i) {
    holder = holders[i];

    if (checkedAll) {
      if (holder.selected !== 'all') {
        holder.selectAll();
        changed = true;
      }
    } else {
      if (holder.selected !== 'none') {
        holder.unselectAll();
        changed = true;
      }
    }
  }

  if (this.rootViewHolders !== this.rootHolders) {
    this.rootViewHolders.forEach(function (holder) {
      holder.updateSelectedFromRef();
    });
  }

  if (changed) {
    this._updateToValues();

    this.emit('change', {
      type: 'change',
      target: this
    }, this);
  }

  _CPUViewer.default.release();
};

CheckTreeBox.eventHandler.clickCancelBtn = function (event) {
  this.emit('cancel', {
    type: 'cancel',
    target: this,
    originalEvent: event
  }, this);
};

CheckTreeBox.eventHandler.clickCloseBtn = function (event) {
  this.emit('close', {
    type: 'close',
    target: this,
    originalEvent: event
  }, this);
};

_ACore.default.install(CheckTreeBox);

var _default = CheckTreeBox;
/***
 *
 * @param {CheckTreeBox} boxElt
 * @param {SelectionItem} item
 * @param {number} idx
 * @param {TreeNodeHolder} parent
 * @constructor
 */

exports.default = _default;

function TreeNodeHolder(boxElt, item, idx, parent) {
  this.boxElt = boxElt;
  this.item = item;
  this.idx = idx;
  this.parent = parent;
  this.status = item.items && item.items.length > 0 ? 'close' : 'none';
  this.selected = 'none';
  /***
   *
   * @type {TreeNodeHolder[]}
   */

  this.child = [];
  this.level = parent ? parent.level + 1 : 0;
  this._elt = null;
}

TreeNodeHolder.prototype.findIdxInView = function () {
  var holders = this.boxElt.viewHolders;
  var start = 0;
  var end = holders.length - 1;
  var mid;
  var idx = this.idx;
  var holderIdx;

  while (start < end) {
    mid = start + end >> 1;
    holderIdx = holders[mid].idx;

    if (holderIdx < idx) {
      start = mid + 1;
    } else if (holderIdx > idx) {
      end = mid - 1;
    } else {
      return mid;
    }
  }

  holderIdx = holders[start].idx;
  if (holderIdx === idx) return start;
  return -1;
};

TreeNodeHolder.prototype.toggle = function () {
  _CPUViewer.default.hold();

  var idx = this.findIdxInView();
  var status = this.status;

  if (status === 'close') {
    this.itemElt.status = 'open';
    this.status = 'open';
    var arr = this.toArray();
    arr.shift();
    this.boxElt.viewHolders.splice.apply(this.boxElt.viewHolders, [idx + 1, 0].concat(arr));
    this.boxElt.updateContentSize();
    this.boxElt.viewListAt(idx);
    this.boxElt.emit('toggleitem', {
      type: 'toggleiteion',
      target: this.boxElt,
      nodeHolder: this,
      status: 'open'
    }, this.boxElt);
  } else if (status === 'open') {
    this.itemElt.status = 'close';
    this.status = 'close';
    var l = 0;

    while (this.boxElt.viewHolders[idx + 1 + l] && this.boxElt.viewHolders[idx + 1 + l].isDescendantOf(this)) ++l;

    this.boxElt.viewHolders.splice(idx + 1, l);
    this.boxElt.updateContentSize();
    this.boxElt.viewListAt(idx);
    this.boxElt.emit('toggleitem', {
      type: 'toggleiteion',
      target: this.boxElt,
      nodeHolder: this,
      status: 'close'
    }, this.boxElt);
  }

  _CPUViewer.default.release();
};
/***
 *
 * @param {boolean=} isDownUpdate
 */


TreeNodeHolder.prototype.selectAll = function (isDownUpdate) {
  if (this.selected === 'all') return;
  this.selected = 'all';
  if (this.itemElt) this.itemElt.selected = this.selected;
  this.child.forEach(function (child) {
    child.selectAll(true);
  });

  if (!isDownUpdate) {
    if (this.parent) this.parent.updateUp();
  }
};
/***
 *
 * @param {boolean=} isDownUpdate
 */


TreeNodeHolder.prototype.unselectAll = function (isDownUpdate) {
  if (this.selected === 'none') return;
  this.selected = 'none';
  if (this.itemElt) this.itemElt.selected = this.selected;
  this.child.forEach(function (child) {
    child.unselectAll(true);
  });

  if (!isDownUpdate) {
    if (this.parent) this.parent.updateUp();
  }
};

TreeNodeHolder.prototype.updateUp = function () {
  var childSelectAll = 0;
  var childSelectChild = 0;

  if (this.child.length > 0) {
    for (var i = 0; i < this.child.length; ++i) {
      if (this.child[i].selected === 'all') {
        childSelectAll++;
      } else if (this.child[i].selected === 'child') {
        childSelectChild++;
      }
    }

    if (childSelectAll === this.child.length) {
      this.selected = 'all';
    } else if (childSelectChild + childSelectAll > 0) {
      this.selected = 'child';
    } else {
      this.selected = 'none';
    }

    if (this.itemElt) {
      this.itemElt.selected = this.selected;
    }
  }

  if (this.parent) this.parent.updateUp();
};

TreeNodeHolder.prototype.calcEstimateWidth = function () {
  var width = 12; //padding

  width += 23 * this.level;
  width += 14.7 + 5; //toggle icon

  width += 16; //checkbox

  if (this.item.icon) width += 21; //icon

  width += 7 + (0, _utils.estimateWidth14)(this.item.text); //margin-text

  if (this.item.desc) width += 6 + (0, _utils.estimateWidth14)(this.item.desc) * 0.85;
  return width;
};

TreeNodeHolder.prototype.calcWidth = function () {
  var width = 12; //padding

  width += 23 * this.level;
  width += 14.7 + 5; //toggle icon

  width += 16; //checkbox

  if (this.item.icon) width += 21; //icon

  width += 7 + (0, _utils.measureText)(this.item.text, '14px arial').width; //margin-text

  if (this.item.desc) width += 6 + (0, _utils.measureText)(this.item.desc, '11.9px arial').width * 0.85;
  return width;
};

TreeNodeHolder.prototype.isDescendantOf = function (parent) {
  var cr = this.parent;

  while (cr) {
    if (parent === cr) return true;
    cr = cr.parent;
  }

  return false;
};
/***
 *
 * @param {TreeNodeHolder[]=} ac
 * @return {TreeNodeHolder[]}
 */


TreeNodeHolder.prototype.toArray = function (ac) {
  ac = ac || [];
  ac.push(this);

  if (this.status === 'open') {
    for (var i = 0; i < this.child.length; ++i) {
      this.child[i].toArray(ac);
    }
  }

  return ac;
};

Object.defineProperty(TreeNodeHolder.prototype, 'itemElt', {
  set: function (elt) {
    if (this._elt === elt) return;

    if (this._elt) {
      if (this._elt.nodeHolder === this) {
        this._elt.nodeHolder = null;
      }
    }

    if (elt) {
      if (elt.nodeHolder) {
        elt.nodeHolder.itemElt = null;
      }

      elt.nodeHolder = this;
      this._elt = elt;
      elt.data = this.item;
      elt.level = this.level;
      elt.status = this.status;
      elt.selected = this.selected;
    } else {
      this._elt = null;
    }
  },
  get: function () {
    return this._elt;
  }
});

TreeNodeHolder.prototype.findReferenceNode = function () {
  var value = this.item.value;
  var holders = this.boxElt.findItemHoldersByValue(value);
  var holder;

  for (var i = 0; i < holders.length; ++i) {
    holder = holders[i];
    if ((holder.item === this.item.ref || holder.item === this.item) && holder !== this) return holder;
  }

  return null;
};

TreeNodeHolder.prototype.getRoot = function () {
  if (!this.parent) return this;
  return this.parent.getRoot();
};

TreeNodeHolder.prototype.updateSelectedFromRef = function () {
  var ref = this.findReferenceNode();
  if (!ref) return;
  var selected = ref.selected;
  this.selected = selected;
  if (this.itemElt) this.itemElt.selected = selected;
  this.child.forEach(function (c) {
    c.updateSelectedFromRef();
  });
};
};

moduleFactories["node_modules/absol-acomp/js/CheckTreeLeafOnlyBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CheckTreeLeafOnlyBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.TreeLeafOnlyNodeHolder = TreeLeafOnlyNodeHolder;
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _CheckTreeBox = _interopRequireWildcard(require("./CheckTreeBox"));

var _CheckTreeItem = _interopRequireDefault(require("./CheckTreeItem"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));




/***
 * Only tree has leaf can be selected
 * @extends CheckTreeBox
 * @constructor
 */
function CheckTreeLeafOnlyBox() {
  _CheckTreeBox.default.apply(this, arguments);
}

CheckTreeLeafOnlyBox.tag = 'CheckTreeLeafOnlyBox'.toLowerCase();

CheckTreeLeafOnlyBox.render = function () {
  return (0, _ACore._)({
    tag: 'follower',
    extendEvent: ['change', 'toggleitem', 'cancel', 'close'],
    class: ['as-check-tree-leaf-only-box', 'as-check-tree-box', 'as-select-list-box', 'as-anchor-1'],
    child: [{
      class: 'as-select-list-box-search-ctn',
      child: 'searchtextinput'
    }, {
      class: ['as-check-tree-box-scroller', 'as-bscroller', 'as-select-list-box-scroller'],
      child: {
        class: ['as-check-tree-box-content', 'as-select-list-box-content'],
        child: Array(this.prototype.preLoadN).fill('.as-select-list-box-page')
      }
    }, {
      class: 'as-dropdown-box-footer',
      child: [{
        tag: 'checkbox',
        class: 'as-select-list-box-check-all',
        props: {
          checked: false,
          text: _LanguageSystem.default.getText('txt_check_all') || _LanguageSystem.default.getText('txt_all') || 'Check All'
        }
      }, {
        class: 'as-dropdown-box-footer-right',
        child: [{
          tag: 'a',
          class: 'as-select-list-box-cancel-btn',
          attr: {
            "data-ml-key": 'txt_cancel'
          }
        }, {
          tag: 'a',
          class: 'as-select-list-box-close-btn',
          attr: {
            "data-ml-key": 'txt_close'
          }
        }]
      }]
    }],
    props: {
      anchor: [1, 6, 2, 5]
    }
  });
};

Object.assign(CheckTreeLeafOnlyBox.prototype, _CheckTreeBox.default.prototype);
CheckTreeLeafOnlyBox.property = Object.assign({}, _CheckTreeBox.default.property);
CheckTreeLeafOnlyBox.eventHandler = Object.assign({}, _CheckTreeBox.default.eventHandler);
CheckTreeLeafOnlyBox.prototype._pool = [];

CheckTreeLeafOnlyBox.prototype._requestItem = function () {
  var res = this._pool.pop() || (0, _ACore._)({
    tag: _CheckTreeItem.default.tag,
    class: 'as-check-tree-leaf-only-item',
    props: {
      menuElt: this
    },
    on: {
      presstoggle: function (event) {
        this.menuElt.eventHandler.toggleItem(this, event);
      },
      select: function (event) {
        this.menuElt.eventHandler.selectItem(this, event);
      }
    }
  });
  res.menuElt = this;
  return res;
};

CheckTreeLeafOnlyBox.prototype.HolderClass = TreeLeafOnlyNodeHolder;

CheckTreeLeafOnlyBox.prototype.depthIndexing = function (items, arr, rootArr) {
  var res = {};
  var count = 0;
  var self = this;
  var HolderClass = this.HolderClass;
  /***
   *
   * @param {TreeLeafOnlyNodeHolder|null} root
   * @param items
   */

  function scan(root, items) {
    items.forEach(function visit(item) {
      var value = item.value + '';
      res[value] = res[value] || [];
      var node = new HolderClass(self, item, count++, root);
      res[value].push(node);
      arr && arr.push(node);

      if (root) {
        root.child.push(node);
      } else if (rootArr) {
        rootArr.push(node);
      }

      if (res[value].length > 1) {
        console.log("Duplicate value", res[value]);
      }

      if (item.items && item.items.length > 0) scan(node, item.items);

      if (item.isLeaf) {
        if (!item.items || item.items.length === 0) {
          node.leafCount = 1;
        } else {
          console.error("Invalid item", item);
        }
      }

      if (root) {
        root.leafCount += node.leafCount;
      }

      if (node.leafCount === 0) {
        node.selected = 'empty';
      }
    });
  }

  scan(null, items);
  return res;
};

CheckTreeLeafOnlyBox.prototype._updateFromValues = function () {
  var valueDict = this.values.reduce(function (ac, cr) {
    ac[cr] = true;
    return ac;
  }, {});
  this.rootHolders.forEach(function visit(node) {
    var selectedAllCount = 0;
    var selectedChildCount = 0;
    var emptyChildCount = 0;
    var cNode;
    var value = node.item.value;

    if (valueDict[value]) {
      node.selectAll(true);
    } else {
      for (var i = 0; i < node.child.length; ++i) {
        cNode = node.child[i];
        visit(cNode);

        if (cNode.selected === 'all') {
          selectedAllCount++;
        } else if (cNode.selected === 'child') {
          selectedChildCount++;
        } else if (cNode.selected === 'empty') {
          emptyChildCount++;
        }
      }

      if (node.child > 0 && selectedAllCount > 0 && selectedAllCount + emptyChildCount === node.child.length) {
        node.selected = 'all';
      } else if (selectedAllCount + selectedChildCount > 0) {
        node.selected = 'child';
      } else if (node.selected !== 'empty') {
        node.selected = 'none';
      }

      if (node.itemElt) node.itemElt.selected = node.selected;
    }
  });
  this.updateCheckedAll();
};

_ACore.default.install(CheckTreeLeafOnlyBox);

var _default = CheckTreeLeafOnlyBox;
/***
 * @extends TreeNodeHolder
 * @constructor
 */

exports.default = _default;

function TreeLeafOnlyNodeHolder() {
  _CheckTreeBox.TreeNodeHolder.apply(this, arguments);
  /***
   * @memberOf  TreeLeafOnlyNodeHolder#
   * @type {number}
   */


  this.leafCount = 0;
}

_OOP.default.mixClass(TreeLeafOnlyNodeHolder, _CheckTreeBox.TreeNodeHolder);
/***
 *
 * @param {boolean=} isDownUpdate
 */


TreeLeafOnlyNodeHolder.prototype.selectAll = function (isDownUpdate) {
  if (this.selected === 'empty') return;
  return _CheckTreeBox.TreeNodeHolder.prototype.selectAll.apply(this, arguments);
};

TreeLeafOnlyNodeHolder.prototype.unselectAll = function (isDownUpdate) {
  if (this.selected === 'empty') return;
  return _CheckTreeBox.TreeNodeHolder.prototype.unselectAll.apply(this, arguments);
};

TreeLeafOnlyNodeHolder.prototype.updateUp = function () {
  var childSelectAll = 0;
  var childSelectChild = 0;
  var childEmpty = 0;

  if (this.child.length > 0) {
    for (var i = 0; i < this.child.length; ++i) {
      if (this.child[i].selected === 'all') {
        childSelectAll++;
      } else if (this.child[i].selected === 'child') {
        childSelectChild++;
      } else if (this.child[i].selected === 'empty') {
        childEmpty++;
      }
    }

    if (childEmpty === this.child.length) {
      this.selected = 'empty';
    } else if (childSelectAll + childEmpty === this.child.length) {
      this.selected = 'all';
    } else if (childSelectChild + childSelectAll > 0) {
      this.selected = 'child';
    } else {
      this.selected = 'none';
    }

    if (this.itemElt) {
      this.itemElt.selected = this.selected;
    }
  }

  if (this.parent) this.parent.updateUp();
};
};

moduleFactories["node_modules/absol-acomp/js/MultiCheckTreeMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MultiCheckTreeMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _CheckTreeBox = _interopRequireDefault(require("./CheckTreeBox"));

var _ACore = _interopRequireWildcard(require("../ACore"));

var _CPUViewer = _interopRequireDefault(require("./CPUViewer"));

var _SelectBoxItem = _interopRequireDefault(require("./SelectBoxItem"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _Dom = require("absol/src/HTML5/Dom");

var _MultiSelectMenu = _interopRequireDefault(require("./MultiSelectMenu"));

var _CheckTreeLeafOnlyBox = _interopRequireDefault(require("./CheckTreeLeafOnlyBox"));

var _utils = require("./utils");




/***
 * @extends AElement
 * @constructor
 */
function MultiCheckTreeMenu() {
  this._items = [];
  this._values = [];
  this._viewValues = [];
  /***
   * @type {CheckTreeBox|CheckTreeLeafOnlyBox}
   */

  this.$checkTreeBox = (0, _ACore._)({
    tag: _CheckTreeBox.default.tag,
    on: {
      change: this.eventHandler.boxChange,
      preupdateposition: this.eventHandler.preUpdateListPosition,
      toggleitem: this.eventHandler.boxToggleItem,
      cancel: this.eventHandler.boxCancel,
      close: this.eventHandler.boxClose
    }
  });
  this.$itemCtn = (0, _ACore.$)('.as-multi-select-menu-item-ctn', this);
  this.$checkTreeBox.followTarget = this;
  this.on('click', this.eventHandler.click);
  this.enableSearch = false;
  /**
   * parent will be selected if all off leaf selected, sub tree can not select if had no leaf
   * @name leafOnly
   * @type {boolean}
   * @memberOf MultiCheckTreeMenu#
   */

  /***
   * todo: TREE has noSelect
   */
}

MultiCheckTreeMenu.tag = 'MultiCheckTreeMenu'.toLowerCase();

MultiCheckTreeMenu.render = function () {
  return (0, _ACore._)({
    class: ['as-multi-select-menu', 'as-multi-check-tree-menu'],
    extendEvent: ['change'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: ['as-multi-select-menu-item-ctn', 'as-bscroller']
    }, {
      tag: 'button',
      class: 'as-multi-select-menu-toggle-btn',
      child: 'dropdown-ico'
    }, 'attachhook']
  });
};

MultiCheckTreeMenu.prototype.tokenPool = [];

MultiCheckTreeMenu.prototype._requestToken = function () {
  var token = this.tokenPool.pop();

  if (!token) {
    token = (0, _ACore._)({
      tag: _SelectBoxItem.default.tag,
      props: {
        menu: this
      },
      on: {
        close: function (event) {
          setTimeout(function () {
            if (this.menu) this.menu.eventHandler.pressCloseToken(this, event);
          }.bind(this), 1);
        }
      }
    });
  }

  return token;
};

MultiCheckTreeMenu.prototype._releaseToken = function (token) {
  token.menu = null;
  this.tokenPool.push(token);
};

MultiCheckTreeMenu.prototype._filToken = function (n) {
  while (this.$itemCtn.childNodes.length > n) {
    this.$itemCtn.removeChild(this.$itemCtn.lastChild);
  }

  while (this.$itemCtn.childNodes.length < n) {
    this.$itemCtn.addChild(this._requestToken());
  }
};

MultiCheckTreeMenu.prototype._assignTokens = function (items) {
  for (var i = 0; i < items.length; ++i) {
    this.$itemCtn.childNodes[i].data = items[i];
  }
};

MultiCheckTreeMenu.prototype._switchLeafMode = function () {
  var enableSearch = this.enableSearch;

  if (this.leafOnly) {
    this.$checkTreeBox = (0, _ACore._)({
      tag: _CheckTreeLeafOnlyBox.default.tag,
      on: {
        change: this.eventHandler.boxChange,
        preupdateposition: this.eventHandler.preUpdateListPosition,
        toggleitem: this.eventHandler.boxToggleItem,
        cancel: this.eventHandler.boxCancel,
        close: this.eventHandler.boxClose
      }
    });
    this._explicit = this._leafOnlyExplicit;
  } else {
    this.$checkTreeBox = (0, _ACore._)({
      tag: _CheckTreeBox.default.tag,
      on: {
        change: this.eventHandler.boxChange,
        preupdateposition: this.eventHandler.preUpdateListPosition,
        toggleitem: this.eventHandler.boxToggleItem,
        cancel: this.eventHandler.boxCancel,
        close: this.eventHandler.boxClose
      }
    });
    this._explicit = this._normalExplicit;
  }

  this.$checkTreeBox.followTarget = this;
  this.$checkTreeBox.items = this._items;
  this.$checkTreeBox.values = this._values;
  this.$checkTreeBox.enableSearch = enableSearch;
};

MultiCheckTreeMenu.prototype._implicit = function (values) {
  values = values || [];
  var valueDict = (values || []).reduce(function (ac, cr) {
    ac[cr + ''] = true;
    return ac;
  }, {});
  var resDict = {};

  function depthRemoveValueDict(node) {
    if (valueDict[node.value]) delete valueDict[node.value];

    if (node.items && node.items.length) {
      node.items.forEach(depthRemoveValueDict);
    }
  }

  var leafOnly = this.leafOnly;
  var scan;
  var leafCount = {};
  var leafScan;

  if (leafOnly) {
    leafScan = function (node) {
      if (node.isLeaf) {
        leafCount[node.value] = 1;
      } else {
        leafCount[node.value] = 0;
      }

      if (node.items && node.items.length > 0) {
        if (!node.isLeaf) {
          node.items.forEach(leafScan);
          leafCount[node.value] = node.items.reduce(function (ac, cr) {
            return ac + (leafCount[cr.value] || 0);
          }, 0);
        } else {
          console.error("Invalid item:", node);
        }
      }
    };

    this._items.forEach(leafScan);

    scan = function scan(node) {
      if (!leafCount[node.value]) {
        depthRemoveValueDict(node);
        return true;
      }

      if (valueDict[node.value] && leafCount[node.value] > 0) return true;
      if (!node.items || node.items.length === 0) return false;
      var cs = node.items.map(scan);

      if (cs.every(function (e) {
        return e;
      })) {
        depthRemoveValueDict(node);
        return true;
      } else {
        node.items.forEach(function (nd, i) {
          if (cs[i] && leafCount[nd.value] > 0) resDict[nd.value] = nd;
        });
        return false;
      }
    };
  } else {
    scan = function scan(node) {
      if (valueDict[node.value]) {
        depthRemoveValueDict(node);
        return true;
      }

      if (!node.items || node.items.length === 0) return false;
      var cs = node.items.map(scan);

      if (cs.every(function (e) {
        return e;
      })) {
        depthRemoveValueDict(node);
        return true;
      } else {
        node.items.forEach(function (nd, i) {
          if (cs[i]) resDict[nd.value] = nd;
        });
        return false;
      }
    };
  }

  var csRoot = this._items.map(scan);

  this._items.forEach(function (nd, i) {
    if (csRoot[i] && (!leafOnly || leafCount[nd.value] > 0)) resDict[nd.value] = nd;
  });

  var eValues = values.reduce(function (ac, cr) {
    if (valueDict[cr.value]) ac.push(cr.value);
    return ac;
  }, []);

  for (var key in resDict) {
    eValues.push(resDict[key].value);
  }

  return eValues;
};

MultiCheckTreeMenu.prototype._normalExplicit = function (values) {
  var valueDict = values.reduce(function (ac, cr) {
    ac[cr] = true;
    return ac;
  }, {});

  function scanMerge(node) {
    var selected = valueDict[node.value];

    if (selected) {
      return {
        s: true,
        v: [node.value]
      };
    }

    var childRes;

    if (node.items && node.items.length > 0) {
      childRes = node.items.map(function (node) {
        return scanMerge(node);
      });
    } else {
      return null;
    }

    var all = childRes.every(function (res) {
      return res && res.s;
    });
    var res = null;

    if (all) {
      res = {
        s: 'A',
        v: [node.value]
      };
    } else {
      res = {
        v: childRes.reduce(function (ac, cr) {
          if (cr && cr.v.length > 0) ac = ac.concat(cr.v);
          return ac;
        }, [])
      };
      if (res.v.length === 0) res = null;
    }

    return res;
  }

  var merged = this._items.map(function (node) {
    return scanMerge(node);
  }).reduce(function (ac, cr) {
    if (cr && cr.v.length > 0) ac = ac.concat(cr.v);
    return ac;
  }, []);

  var mergedDict = merged.reduce(function (ac, cr) {
    ac[cr] = true;
    return ac;
  }, {});
  var res = [];

  function noSelectScan(node, selected) {
    selected = selected || mergedDict[node.value];

    if (!node.noSelect && selected) {
      res.push(node.value);
    } else {
      if (node.items && node.items.length > 0) {
        node.items.forEach(function (item) {
          noSelectScan(item, selected);
        });
      }
    }
  }

  this._items.forEach(function (item) {
    noSelectScan(item, false);
  });

  return res;
};

MultiCheckTreeMenu.prototype._leafOnlyExplicit = function (values) {
  var valueDict = values.reduce(function (ac, cr) {
    ac[cr] = true;
    return ac;
  }, {});
  var res = [];

  function scan(node, selected) {
    selected = selected || valueDict[node.value];
    if (node.isLeaf && selected) res.push(node.value);

    if (node.items && node.items.length > 0) {
      node.items.forEach(function (cNode) {
        scan(cNode, selected);
      });
    }
  }

  this._items.forEach(function (node) {
    scan(node, false);
  });

  return res;
};

MultiCheckTreeMenu.prototype._explicit = MultiCheckTreeMenu.prototype._normalExplicit;

MultiCheckTreeMenu.prototype.findItemsByValues = function (values) {
  return values.map(function (value) {
    var holders = this.$checkTreeBox.findItemHoldersByValue(value);
    if (holders.length > 0) return holders[0].item;
    return null;
  }.bind(this)).filter(function (it) {
    return !!it;
  });
};

MultiCheckTreeMenu.prototype.viewValues = function (values) {
  var items = this.findItemsByValues(values);

  this._filToken(items.length);

  this._assignTokens(items);

  this._viewValues = values;

  if (this.isFocus) {
    var bound = this.getBoundingClientRect();
    this.$checkTreeBox.addStyle('min-width', bound.width + 'px');

    _ResizeSystem.default.update();
  }
};

MultiCheckTreeMenu.prototype.commitView = function () {
  var values = this._values;
  var views = this._viewValues;
  var changed = values.length !== views.length;
  var viewDict;

  if (!changed) {
    viewDict = views.reduce(function (ac, cr) {
      ac[cr] = true;
      return ac;
    }, {});
    changed = values.some(function (value) {
      return !viewDict[value];
    });
  }

  if (changed) {
    this._values = views.slice();
    this.emit('change', {
      type: 'change',
      target: this
    }, this);
  }
};

MultiCheckTreeMenu.prototype.cancelView = function () {
  this.$checkTreeBox.values = this._values;
  this.viewValues(this._normalExplicit(this._values));
};

MultiCheckTreeMenu.prototype.init = function (props) {
  props = props || {};
  var cProps = Object.assign({}, props);

  if ('leafOnly' in props) {
    this.leafOnly = props.leafOnly;
    delete cProps.leafOnly;
  }

  if ('items' in props) {
    this.items = props.items;
    delete cProps.items;
  }

  if ('values' in props) {
    this.values = props.values;
    delete cProps.values;
  }

  Object.assign(this, cProps);
};

MultiCheckTreeMenu.property = {};
MultiCheckTreeMenu.property.isFocus = {
  /***
   * @this MultiCheckTreeMenu
   * @param value
   */
  set: function (value) {
    var self = this;
    value = !!value;
    var c = this.hasClass('as-focus');
    if (value === c) return;

    _CPUViewer.default.hold();

    if (value) {
      self.off('click', self.eventHandler.click);
      var bound = this.getBoundingClientRect();
      this.$checkTreeBox.addStyle('min-width', bound.width + 'px');
      this.addClass('as-focus');
      document.body.appendChild(this.$checkTreeBox);
      this.$checkTreeBox.updatePosition();

      if (this._focusTimeout > 0) {
        clearTimeout(this._focusTimeout);
      }

      this._focusTimeout = setTimeout(function () {
        document.addEventListener('mousedown', this.eventHandler.clickOut);
        this._focusTimeout = -1;
        this.$checkTreeBox.focus();
      }.bind(this), 5);
    } else {
      this.removeClass('as-focus');
      this.$checkTreeBox.selfRemove();
      this.$checkTreeBox.resetSearchState();
      document.removeEventListener('mousedown', this.eventHandler.clickOut);

      function waitMouseUp() {
        document.removeEventListener('mouseup', waitMouseUp);
        setTimeout(function () {
          self.on('click', self.eventHandler.click);
        }, 5);
      } // document.addEventListener('mouseup', waitMouseUp);why?


      setTimeout(waitMouseUp, 100);
    }

    _CPUViewer.default.release();
  },
  get: function () {
    return this.hasClass('as-focus');
  }
};
MultiCheckTreeMenu.property.items = {
  set: function (items) {
    this._items = (0, _utils.copySelectionItemArray)(items || [], {
      removeNoView: true
    });
    this.$checkTreeBox.items = this._items;
    this.addStyle('--list-min-width', Math.max(145 + 20, this.$checkTreeBox.estimateSize.width) + 'px');
    this.values = this._values; //update
  },
  get: function () {
    return this.$checkTreeBox.items;
  }
};
MultiCheckTreeMenu.property.values = {
  /***
   * @this MultiCheckTreeMenu
   * @param values
   */
  set: function (values) {
    values = values || [];
    this.pendingValues = values;

    if (this.items.length > 0) {
      values = this._implicit(values);
    } else {
      values = values || [];
    }

    this.$checkTreeBox.values = values;
    this._values = values;
    values = this.$checkTreeBox.values.slice(); //correct wrong item

    this.viewValues(this._normalExplicit(values));
  },

  /***
   * @this MultiCheckTreeMenu
   */
  get: function () {
    if ('pendingValues' in this) return this._explicit(this.pendingValues);
    return this._explicit(this._values);
  }
};
MultiCheckTreeMenu.property.checkedValues = {
  get: function () {
    var values = this.values;
    var items = this.items;
    return (0, _utils.rootTreeValues2CheckedValues)(items, values);
  }
};
MultiCheckTreeMenu.property.leafOnly = {
  set: function (value) {
    if (!!value === this.hasClass('as-leaf-only')) return;

    if (value) {
      this.addClass('as-leaf-only');
    } else {
      this.removeClass('as-leaf-only');
    }

    this._switchLeafMode();
  },
  get: function () {
    return this.hasClass('as-leaf-only');
  }
};
MultiCheckTreeMenu.property.disabled = _MultiSelectMenu.default.property.disabled;
MultiCheckTreeMenu.property.readOnly = _MultiSelectMenu.default.property.readOnly;
MultiCheckTreeMenu.eventHandler = {};
/***
 * @this MultiCheckTreeMenu
 * @param event
 */

MultiCheckTreeMenu.eventHandler.clickOut = function (event) {
  if (event.target === this || event.target === this.$itemCtn || !(0, _EventEmitter.hitElement)(this, event) && !(0, _EventEmitter.hitElement)(this.$checkTreeBox, event)) {
    this.commitView();
    this.isFocus = false;
  }
};
/***
 * @this MultiCheckTreeMenu
 * @param event
 */


MultiCheckTreeMenu.eventHandler.boxClose = function (event) {
  this.commitView();
  this.isFocus = false;
};
/***
 * @this MultiCheckTreeMenu
 * @param event
 */


MultiCheckTreeMenu.eventHandler.click = function (event) {
  if (!this.readOnly && (event.target === this || event.target === this.$itemCtn)) {
    this.isFocus = true;
  }
};
/***
 * @this MultiCheckTreeMenu
 * @param event
 */


MultiCheckTreeMenu.eventHandler.boxChange = function (event) {
  delete this.pendingValues;
  this.viewValues(this._normalExplicit(this.$checkTreeBox.values));

  _ResizeSystem.default.update();
};

MultiCheckTreeMenu.eventHandler.boxCancel = function (event) {
  this.cancelView();
  this.isFocus = false;
};
/***
 * @this MultiCheckTreeMenu
 * @param {SelectBoxItem} tokenElt
 * @param event
 */


MultiCheckTreeMenu.eventHandler.pressCloseToken = function (tokenElt, event) {
  var value = tokenElt.value;
  var holders = this.$checkTreeBox.findItemHoldersByValue(value);
  holders.forEach(function (holder) {
    holder.unselectAll();
  });
  this.$checkTreeBox.updateCheckedAll();
  this.$checkTreeBox.updateSelectedInViewIfNeed();

  var newValues = this._viewValues.filter(function (v) {
    return v !== value;
  });

  if (this.isFocus) {
    this.viewValues(newValues);
  } else {
    this.values = newValues;
    this.emit('change', {
      type: 'change',
      target: this
    }, this);
  }
};

MultiCheckTreeMenu.eventHandler.preUpdateListPosition = function () {
  var bound = this.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  var availableTop = bound.top - 5;
  var availableBot = screenSize.height - 5 - bound.bottom;
  this.$checkTreeBox.addStyle('--max-height', Math.max(availableBot, availableTop) + 'px');
  var outBound = (0, _Dom.traceOutBoundingClientRect)(this);

  if (bound.bottom < outBound.top || bound.top > outBound.bottom || bound.right < outBound.left || bound.left > outBound.right) {
    this.isFocus = false;
  }
};

MultiCheckTreeMenu.eventHandler.boxToggleItem = function (event) {
  var bound = this.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  var availableTop = bound.top - 5;
  var availableBot = screenSize.height - 5 - bound.bottom;
  this.$checkTreeBox.addStyle('--max-height', (this.$checkTreeBox._lastAnchor < 4 ? availableBot : availableTop) + 'px');
  this.$checkTreeBox.updatePosition();
};

MultiCheckTreeMenu.property.enableSearch = {
  set: function (value) {
    this.$checkTreeBox.enableSearch = !!value;
  },
  get: function () {
    return this.$checkTreeBox.enableSearch;
  }
};

_ACore.default.install(MultiCheckTreeMenu);

var _default = MultiCheckTreeMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/FileInputBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/FileInputBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/fileinputbox.css");

var _ACore = _interopRequireWildcard(require("../ACore"));

var _DropZone = _interopRequireDefault(require("./DropZone"));

var _utils = require("./utils");

var _catalog = _interopRequireDefault(require("../assets/exticons/catalog.json"));

var _FileSaver = require("absol/src/Network/FileSaver");

var _MessageInput = _interopRequireDefault(require("./messageinput/MessageInput"));




/***
 * @extends AElement
 * @constructor
 */
function FileInputBox() {
  this.$fileSize = (0, _ACore.$)('.as-file-input-box-file-size', this);
  this.$fileName = (0, _ACore.$)('.as-file-input-box-file-name', this);
  this.$bg = (0, _ACore.$)('.as-file-input-box-background', this);
  this.$input = (0, _ACore.$)('input', this).on('change', this.eventHandler.input_fileChange);
  this.$trigger = (0, _ACore._)({
    elt: (0, _ACore.$)('.as-file-input-box-trigger', this),
    tag: _DropZone.default.tag,
    on: {
      fileenter: this.eventHandler.input_fileEnter,
      fileleave: this.eventHandler.input_fileLeave,
      filedrop: this.eventHandler.input_fileDrop
    }
  });
  this.$downloadBtn = (0, _ACore.$)('.as-file-input-box-download-btn', this).on('click', this.download.bind(this));
  this.$removeBtn = (0, _ACore.$)('.as-file-input-box-remove-btn', this).on('click', this.clearValue.bind(this, true));
  this._value = null;
  this._fileSize = null;
  this._fileName = null;
  this._fileType = null;
  this._valueInfo = null;
  this._thumbnail = null;
  /***
   * default true
   * @name allowUpload
   * @type {boolean}
   * @memberOf FileInputBox#
   */

  this.allowUpload = true;
  /***
   * @name value
   * @type {null|any}
   * @memberOf FileInputBox#
   */

  /***
   * @name thumbnail
   * @type {null|any}
   * @memberOf FileInputBox#
   */

  /***
   * @name fileSize
   * @type {null|number}
   * @memberOf FileInputBox#
   */

  /***
   * @name fileType
   * @type {null|string}
   * @memberOf FileInputBox#
   */

  /***
   * @name fileName
   * @type {null|string}
   * @memberOf FileInputBox#
   */

  /***
   * default: false
   * @name downloadable
   * @type {boolean}
   * @memberOf FileInputBox#
   */
}

FileInputBox.tag = 'FileInputBox'.toLowerCase();

FileInputBox.render = function () {
  return (0, _ACore._)({
    extendEvent: ['change'],
    class: 'as-file-input-box',
    child: ['.as-file-input-box-background', {
      tag: 'label',
      class: 'as-file-input-box-trigger',
      child: {
        tag: 'input',
        attr: {
          type: 'file',
          accept: '*',
          title: null
        }
      }
    }, {
      class: 'as-file-input-box-upload-overlay',
      child: 'span.mdi.mdi-upload'
    }, {
      class: 'as-file-input-box-info',
      child: [{
        tag: 'span',
        class: 'as-file-input-box-file-name',
        child: {
          text: ''
        }
      }, 'br', {
        tag: 'span',
        class: 'as-file-input-box-file-size',
        child: {
          text: ''
        }
      }]
    }, {
      class: 'as-file-input-box-action-left',
      child: {
        tag: 'button',
        class: 'as-file-input-box-remove-btn',
        child: 'span.mdi.mdi-close'
      }
    }, {
      class: 'as-file-input-box-action-right',
      child: {
        tag: 'button',
        class: 'as-file-input-box-download-btn',
        child: 'span.mdi.mdi-download'
      }
    }, {
      class: 'as-file-input-box-checked',
      child: 'span.mdi.mdi-check-bold'
    }]
  });
};

FileInputBox.prototype.download = function () {
  var value = this.value;

  if (value) {
    if (value && value.name && value.url) {
      (0, _FileSaver.saveAs)(value.url, value.name);
    } else {
      (0, _FileSaver.saveAs)(value, this.fileName);
    }
  }
};

FileInputBox.prototype.clearValue = function (userAction, event) {
  if (this.value) {
    this.value = null;

    if (userAction) {
      this.emit('change', {
        type: 'change',
        originalEvent: event,
        action: 'clear',
        target: this
      }, this);
    }
  }
};

FileInputBox.prototype._updateThumbnail = function () {
  var previewUrl;
  var thumbnail = this.thumbnail;
  var fileType = this.fileType;

  if (thumbnail) {
    if (typeof thumbnail === "string") {
      previewUrl = thumbnail;
    } else if (thumbnail instanceof Blob || thumbnail instanceof File) {
      thumbnail.url = thumbnail.url || URL.createObjectURL(thumbnail);
      previewUrl = thumbnail.url;
    }
  }

  if (!previewUrl) {
    if (_catalog.default.indexOf(fileType) >= 0) {
      previewUrl = _MessageInput.default.iconAssetRoot + '/' + fileType + '.svg';
    } else {
      previewUrl = _MessageInput.default.iconAssetRoot + '/' + 'blank' + '.svg';
    }
  }

  if (previewUrl) {
    this.$bg.addStyle('backgroundImage', 'url("' + encodeURI(previewUrl) + '")');
  } else {
    this.$bg.removeStyle('backgroundImage');
  }
};

FileInputBox.prototype._updateFileName = function () {
  var fileName = this.fileName;

  if (fileName) {
    this.$fileName.firstChild.data = fileName;
    this.addClass('as-has-file-name');
  } else {
    this.$fileName.firstChild.data = '';
    this.removeClass('as-has-file-name');
  }
};

FileInputBox.prototype._updateFileSize = function () {
  var fileSize = this.fileName;

  if (fileSize === null) {
    this.$fileSize.firstChild.data = '';
    this.removeClass('as-has-file-size');
  } else {
    this.$fileSize.firstChild.data = (0, _utils.fileSize2Text)(fileSize);
    this.addClass('as-has-file-size');
  }
};

FileInputBox.property = {};
FileInputBox.property.value = {
  set: function (value) {
    value = value || null;
    this._value = value;
    this._valueInfo = (0, _utils.fileInfoOf)(value);

    this._updateThumbnail();

    this._updateFileName();

    this._updateFileSize();

    if (value) {
      this.addClass('as-has-value');
    } else {
      this.removeClass('as-has-value');
    }
  },
  get: function () {
    return this._value;
  }
};
FileInputBox.property.fileType = {
  set: function (value) {
    this._fileType = value;

    this._updateThumbnail();
  },

  /***
   * @this FileInputBox
   * @return {*}
   */
  get: function () {
    return this._fileType || this._valueInfo && this._valueInfo.type || null;
  }
};
FileInputBox.property.fileName = {
  set: function (value) {
    value = typeof value === 'string' ? value : null;
    this._fileName = value;

    this._updateFileName();
  },
  get: function () {
    return this._fileName || this._valueInfo && this._valueInfo.name || null;
  }
};
FileInputBox.property.fileSize = {
  set: function (value) {
    if ((0, _utils.isRealNumber)(value)) value = Math.max(0, value);else value = null;
    this._fileSize = value;

    this._updateFileSize();
  },
  get: function () {
    if (typeof this._fileSize === "number") return this._fileSize;
    if (this._valueInfo && typeof this._valueInfo.size === "number") return this._valueInfo.size;
    return null;
  }
};
FileInputBox.property.thumbnail = {
  set: function (value) {
    this._thumbnail = value || null;

    this._updateThumbnail();
  },
  get: function () {
    return this._thumbnail;
  }
};
FileInputBox.property.allowUpload = {
  set: function (value) {
    if (value) {
      this.addClass('as-allow-upload');
    } else {
      this.removeClass('as-allow-upload');
    }
  },
  get: function () {
    return this.hasClass('as-allow-upload');
  }
};
FileInputBox.property.downloadable = {
  set: function (value) {
    if (value) {
      this.addClass('as-downloadable');
    } else {
      this.removeClass('as-downloadable');
    }
  },
  get: function () {
    return this.hasClass('as-downloadable');
  }
};
FileInputBox.property.removable = {
  set: function (value) {
    if (value) {
      this.addClass('as-removable');
    } else {
      this.removeClass('as-removable');
    }
  },
  get: function () {
    return this.hasClass('as-removable');
  }
};
FileInputBox.property.accept = {
  set: function (value) {
    if (!value) value = null;
    this.$input.attr('accept', value + '');
  },
  get: function () {
    return this.$input.attr('accept') || null;
  }
};
FileInputBox.property.checked = {
  set: function (value) {
    if (value) {
      this.addClass('as-checked');
    } else {
      this.removeClass('as-checked');
    }
  },
  get: function () {
    return this.hasClass('as-checked');
  }
};
FileInputBox.eventHandler = {};

FileInputBox.eventHandler.input_fileChange = function (event) {
  var files = Array.prototype.slice.call(this.$input.files);

  if (files.length > 0) {
    this.value = files[0];
    this.emit('change', {
      type: 'change',
      originalEvent: event,
      file: files[0],
      action: 'file_dialog',
      target: this
    }, this);
  }
};

FileInputBox.eventHandler.input_fileEnter = function (event) {};

FileInputBox.eventHandler.input_fileLeave = function (event) {};

FileInputBox.eventHandler.input_fileDrop = function (event) {
  var files = Array.prototype.slice.call(event.files);
  var accept = this.accept;
  var file;

  if (files.length > 0) {
    file = files[0];
    if (!(0, _utils.fileAccept)(accept, file.type) && !(0, _utils.fileAccept)(accept, file.name)) file = null;
  }

  if (file) {
    this.value = file;
    this.emit('change', {
      type: 'change',
      originalEvent: event,
      file: file,
      action: 'drop',
      target: this
    }, this);
  }
};

_ACore.default.install(FileInputBox);

var _default = FileInputBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/CountdownText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/CountdownText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.remainSecondToText = remainSecondToText;
exports.default = void 0;

var _ACore = _interopRequireDefault(require("../ACore"));

require("../css/countdownclock.css");

require("../css/countdowntext.css");

var _datetime = require("absol/src/Time/datetime");

var _utils = require("./utils");


var _ = _ACore.default._;
var $ = _ACore.default.$;
var tokenCache = {};

function remainSecondToText(remainSecond, format) {
  var tokens = tokenCache[format];

  if (!tokens) {
    tokens = (format.match(new RegExp(_datetime.DATE_TIME_TOKEN_RGX.source, 'g')) || []).reduce(function (ac, cr) {
      ac[cr] = true;
      return ac;
    }, {});
    tokenCache[format] = tokens;
  }

  var newText;
  var sec, min, hour;
  sec = Math[tokens['ms'] || tokens['mss'] ? 'floor' : 'ceil'](remainSecond);
  min = Math.floor(remainSecond / 60);
  hour = Math.floor(remainSecond / 60 / 60);
  newText = format.replace(new RegExp(_datetime.DATE_TIME_TOKEN_RGX.source, 'g'), function (all) {
    switch (all) {
      case 'D':
        return Math.floor(remainSecond / 60 / 60 / 24) + '';

      case 'HH':
      case 'H':
      case 'hh':
        if (tokens['D']) {
          return (0, _utils.zeroPadding)(hour % 24, all.length);
        } else {
          return (0, _utils.zeroPadding)(hour, all.length);
        }

      case 'mm':
      case 'M':
      case 'MM':
        if (tokens['HH'] || tokens['hh']) {
          return (0, _utils.zeroPadding)(min % 60, all.length);
        } else {
          return (0, _utils.zeroPadding)(min, all.length);
        }

      case 'ss':
      case 'S':
      case 'SS':
        if (tokens['m'] || tokens['mm']) {
          return (0, _utils.zeroPadding)(sec % 60, all.length);
        } else {
          return (0, _utils.zeroPadding)(sec, all.length);
        }

      case 'cs':
        return (0, _utils.zeroPadding)(Math.ceil(remainSecond * 100) % 100, 2);

      case 'ms':
        return (0, _utils.zeroPadding)(Math.ceil(remainSecond * 1000) % 1000, 3);

      default:
        return all;
    }
  });
  return newText;
}
/***
 * @extends AElement
 * @constructor
 */


function CountdownText() {
  this.addClass('as-countdown-text');
  this.defineEvent('update');
  this.defineEvent('finish');
  this.text = '';
  this._format = 'HH:mm';
  this.format = 'HH:mm';
  this.fps = 5;
  this._finishTime = null;
  this.finishTime = null;
  this['_tick'] = this._tick.bind(this);
  setTimeout(this.start.bind(this), 0); //auto start

  /***
   * @type {number}
   * @name remainSecond
   * @memberOf CountdownText#
   */

  /***
   * @type {Date}
   * @name finishTime
   * @memberOf CountdownText#
   */

  /***
   * @type {string}
   * @name format
   * @memberOf CountdownText#
   */
}

CountdownText.tag = 'CountdownText'.toLowerCase();

CountdownText.render = function () {
  return _('span');
};

CountdownText.prototype.buildinFormat = {
  'standard': function (remainSecond) {
    if (remainSecond >= 24 * 3600) {
      return remainSecondToText(remainSecond, 'D ngày HH:mm:ss');
    } else {
      return remainSecondToText(remainSecond, 'HH:mm:ss');
    }
  }
};

CountdownText.prototype._tick = function () {
  var remainSecond = this.remainSecond;
  var prevText = this.text;
  var newText;
  var format = this._format;
  if (this.buildinFormat[format]) format = this.buildinFormat[format];

  if (typeof format === "function") {
    newText = format.call(this, remainSecond);
  } else if (typeof format === "string") {
    newText = remainSecondToText(remainSecond, format);
  }

  if (prevText !== newText) {
    this.text = newText;
    this.innerHTML = newText;
    this.emit('update', {
      target: this,
      type: 'update'
    }, this);
  }

  if (remainSecond <= 0) {
    this.stop();
    this.emit('finish', {
      target: this,
      type: 'update'
    }, this);
  }
};

CountdownText.prototype.start = function () {
  this.resume();
};

CountdownText.prototype.resume = function () {
  if (this._intvId > 0) return;
  this._intvId = setInterval(this._tick, 1000 / this.fps);
};

CountdownText.prototype.pause = function () {
  if (this._intvId > 0) {
    clearInterval(this._intvId);
    this._intvId = -1;
  }
};

CountdownText.prototype.stop = function () {
  this.pause();
};

CountdownText.property = {};
CountdownText.property.format = {
  set: function (value) {
    if (typeof value === "string" || typeof value === 'function') {
      this._format = value || 'HH:mm';
    } else {
      this._format = 'HH:mm';
    }
  },
  get: function () {
    return this._format;
  }
};
CountdownText.property.remainSecond = {
  set: function (value) {
    if (!(value >= 0)) {
      value = 0;
    }

    this.finishTime = new Date(new Date().getTime() + value);
  },
  get: function () {
    if (this.finishTime !== null) {
      return Math.max(0, (this.finishTime.getTime() - new Date().getTime()) / 1000);
    } else return null;
  }
};
CountdownText.property.finishTime = {
  set: function (value) {
    if (typeof value === "number" || typeof value === 'string') {
      value = new Date(value);
    }

    if (!value || !value.getTime) value = null;
    if (value && value.getTime && isNaN(value.getTime())) value = null;
    this._finishTime = value;
  },
  get: function () {
    return this._finishTime;
  }
};
CountdownText.property.fps = {
  set: function (value) {
    this._fps = (0, _utils.isRealNumber)(value) ? value : 200;

    if (this._intvId > 0) {
      clearInterval(this._intvId);
      this._intvId = setInterval(this._tick, 1000 / this._fps);
    }
  },
  get: function () {
    return this._fps;
  }
};

_ACore.default.install(CountdownText);

var _default = CountdownText;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/LoadingCubeModal.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/LoadingCubeModal.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _stringGenerate = require("absol/src/String/stringGenerate");



/***
 * @extends Modal
 * @constructor
 */
function LoadingCubeModal() {}

LoadingCubeModal.tag = 'LoadingCubeModal'.toLowerCase();

LoadingCubeModal.render = function () {
  return (0, _ACore._)({
    tag: 'modal',
    class: 'as-loading-cube-modal',
    child: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; background: rgb(241, 242, 243); display: block; shape-rendering: auto;" width="200px" height="200px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">\n' + '<g transform="translate(26.666666666666668,26.666666666666668)">\n' + '  <rect x="-20" y="-20" width="40" height="40" fill="#13a9df">\n' + '    <animateTransform attributeName="transform" type="scale" repeatCount="indefinite" dur="1s" keyTimes="0;1" values="1.1500000000000001;1" begin="-0.3s"></animateTransform>\n' + '  </rect>\n' + '</g>\n' + '<g transform="translate(73.33333333333333,26.666666666666668)">\n' + '  <rect x="-20" y="-20" width="40" height="40" fill="#4be44c">\n' + '    <animateTransform attributeName="transform" type="scale" repeatCount="indefinite" dur="1s" keyTimes="0;1" values="1.1500000000000001;1" begin="-0.2s"></animateTransform>\n' + '  </rect>\n' + '</g>\n' + '<g transform="translate(26.666666666666668,73.33333333333333)">\n' + '  <rect x="-20" y="-20" width="40" height="40" fill="#e2d58b">\n' + '    <animateTransform attributeName="transform" type="scale" repeatCount="indefinite" dur="1s" keyTimes="0;1" values="1.1500000000000001;1" begin="0s"></animateTransform>\n' + '  </rect>\n' + '</g>\n' + '<g transform="translate(73.33333333333333,73.33333333333333)">\n' + '  <rect x="-20" y="-20" width="40" height="40" fill="#e1e7e7">\n' + '    <animateTransform attributeName="transform" type="scale" repeatCount="indefinite" dur="1s" keyTimes="0;1" values="1.1500000000000001;1" begin="-0.1s"></animateTransform>\n' + '  </rect>\n' + '</g>\n' + '</svg>'
  });
};

LoadingCubeModal.share = {
  token: null,
  $elt: null
};
/***
 *
 * @return {String}
 */

LoadingCubeModal.show = function () {
  if (!LoadingCubeModal.share.$elt) LoadingCubeModal.share.$elt = (0, _ACore._)(LoadingCubeModal.tag);

  if (!LoadingCubeModal.share.$elt.isDescendantOf(document.body)) {
    document.body.appendChild(LoadingCubeModal.share.$elt);
  }

  LoadingCubeModal.share.token = (0, _stringGenerate.randomIdent)(9);
  return LoadingCubeModal.share.token;
};
/***
 *
 * @param {String} token
 * @return {Boolean}
 */


LoadingCubeModal.close = function (token) {
  if (LoadingCubeModal.share.$elt && LoadingCubeModal.share.$elt.isDescendantOf(document.body) && (!token || token === LoadingCubeModal.share.token)) {
    this.share.$elt.remove();
    LoadingCubeModal.share.token = null;
    return true;
  }

  return false;
};

_ACore.default.install(LoadingCubeModal);

var _default = LoadingCubeModal;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectTreeLeafBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectTreeLeafBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _Follower = _interopRequireDefault(require("./Follower"));

var _ExpTree = _interopRequireDefault(require("./ExpTree"));

require("../css/selecttreeleafmenu.css");

var _SelectListBox = _interopRequireDefault(require("./SelectListBox"));

var _search = _interopRequireWildcard(require("./list/search"));

var _utils = require("./utils");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




function isBranchStatus(status) {
  return status === 'open' || status === 'close';
}

function invertStatus(status) {
  return {
    open: 'close',
    close: 'open'
  }[status] || 'none';
}
/***
 * @extends Follower
 * @constructor
 */


function SelectTreeLeafBox() {
  this._initControl();

  this._searchCache = {};
  this._value = null;
  this._items = [];
  this.strictValue = true;
  this.$items = [];
  this.$itemByValue = {};
  this.$selectedItem = null;
  this.$dislayItems = this.$items;
  this.$dislayItemByValue = this.$itemByValue;
  this.$content = (0, _ACore.$)('.as-select-tree-leaf-box-content', this);
  this._savedStatus = {};
  this.estimateSize = {
    width: 0,
    height: 0
  };
}

SelectTreeLeafBox.tag = 'SelectTreeLeafBox'.toLowerCase();

SelectTreeLeafBox.render = function () {
  return (0, _ACore._)({
    tag: _Follower.default,
    attr: {
      tabindex: 0
    },
    class: ['as-select-tree-leaf-box', 'as-select-list-box'],
    extendEvent: ['pressitem'],
    child: [{
      class: 'as-select-list-box-search-ctn',
      child: 'searchtextinput'
    }, {
      class: ['as-bscroller', 'as-select-list-box-scroller', 'as-select-tree-leaf-box-content'],
      child: []
    }, 'attachhook.as-dom-signal'],
    props: {
      anchor: [1, 6, 2, 5]
    }
  });
};

SelectTreeLeafBox.prototype._initControl = function () {
  this.$searchInput = (0, _ACore.$)('searchtextinput', this).on('stoptyping', this.eventHandler.searchModify);
};

SelectTreeLeafBox.prototype.resetSearchState = function () {
  var value = this.$searchInput.value;

  if (value.length > 0) {
    this.$searchInput.value = '';

    if (value.trim().length) {
      this.$content.clearChild();
      this.$content.addChild(this.$items);
      this.$dislayItems = this.$items;
      this.$dislayItemByValue = this.$itemByValue;

      this._updateSelectedItem();
    }
  }
};

SelectTreeLeafBox.prototype._findFirstLeaf = function () {
  var found = false;

  function visit(item) {
    if (item.isLeaf) {
      found = item;
      return true;
    }

    if (item.items && item.items.length > 0) {
      item.items.some(visit);
    }

    return !!found;
  }

  this._items.some(visit);

  return found;
};

SelectTreeLeafBox.prototype._makeTree = function (item, dict, savedStatus) {
  var self = this;
  var status = 'none';
  var isLeaf = item.isLeaf;

  if (item.items && item.items.length > 0) {
    status = 'close';
  }

  if (isBranchStatus(status) && isBranchStatus(savedStatus[item.value])) {
    status = savedStatus[item.value];
  }

  var nodeElt = (0, _ACore._)({
    tag: _ExpTree.default.tag,
    class: 'as-select-tree-leaf-item',
    props: {
      name: item.text,
      desc: item.desc,
      icon: item.icon,
      status: status,
      itemData: item
    },
    on: {
      'statuschange': this.updatePosition.bind(this)
    }
  });
  nodeElt.getNode().on({
    press: function (event) {
      if (isBranchStatus(nodeElt.status)) {
        nodeElt.status = invertStatus(nodeElt.status);
        savedStatus[item.value] = nodeElt.status;
        self.updatePosition();
      } else if (isLeaf) {
        self.emit('pressitem', {
          item: item,
          target: self,
          itemElt: nodeElt,
          originalEvent: event
        }, self);
      }
    }
  });

  if (dict) {
    if (dict[item.value] && !this.warned) {
      this.warned = true;
      console.warn(this, 'has duplicated value, element will not work correctly!', item);
    }

    dict[item.value] = nodeElt;
  }

  if (item.isLeaf) {
    nodeElt.addClass('as-is-leaf');
  }

  if (item.items && item.items.length > 0) {
    item.items.forEach(function (item1) {
      nodeElt.addChild(self._makeTree(item1, dict, savedStatus));
    });
  }

  return nodeElt;
};

SelectTreeLeafBox.prototype._estimateItemWidth = function (item, level) {
  var width = 12; //padding

  width += 12 * level;
  width += 14.7 + 5; //toggle icon

  if (item.icon) width += 21; //icon

  width += 7 + (0, _utils.estimateWidth14)(item.text) + 5 + 7; //margin-text

  if (item.desc) width += 6 + (0, _utils.estimateWidth14)(item.desc) * 0.85;
  return width;
};

SelectTreeLeafBox.prototype.viewToSelected = function () {
  var selectedNode = this.$selectedItem;
  if (!selectedNode) return;
  selectedNode.scrollIntoView();
  var parent = selectedNode.getParent();

  while (parent && parent.getParent) {
    if (parent.status === 'close') {
      parent.getNode().emit('press');
    }

    parent = parent.getParent();
  }
};

SelectTreeLeafBox.prototype._calcEstimateSize = function (items) {
  var self = this;
  var width = 0;
  var height = 0;

  function visit(item, level) {
    var itemWidth = self._estimateItemWidth(item, level);

    width = Math.max(width, itemWidth);
    height += 28;

    if (item.items && item.items.length) {
      item.items.forEach(function (item) {
        visit(item, level + 1);
      });
    }
  }

  items.forEach(function (item) {
    visit(item, 0);
  });
  return {
    width: width,
    height: height
  };
};

SelectTreeLeafBox.prototype._updateSelectedItem = function () {
  if (this.$selectedItem) {
    this.$selectedItem.removeClass('as-selected');
    this.$selectedItem = null;
  }

  this.$selectedItem = this.$dislayItemByValue[this._value];

  if (this.$selectedItem) {
    this.$selectedItem.addClass('as-selected');
  }
};

SelectTreeLeafBox.prototype.focus = _SelectListBox.default.prototype.focus;
SelectTreeLeafBox.property = {};
SelectTreeLeafBox.eventHandler = {};
SelectTreeLeafBox.property.items = {
  /***
   * @this SelectTreeLeafBox
   * @param items
   */
  set: function (items) {
    var self = this;
    this._savedStatus = {};
    this._searchCache = {};
    items = items || [];
    this._items = items;
    (0, _search.prepareSearchForList)(items);
    this.$content.clearChild();
    this.$itemByValue = {};
    this.$dislayItemByValue = this.$itemByValue;
    this.$items = items.map(function (item) {
      return self._makeTree(item, self.$itemByValue, self._savedStatus);
    });
    this.$dislayItems = this.$items;
    this.$content.addChild(this.$items);
    this.estimateSize = this._calcEstimateSize(items);
    this.addStyle('--select-list-estimate-width', this.estimateSize.width + 'px');
    var firstLeaf;

    if (this._value === null || this._value === undefined || this.strictValue && !this.$itemByValue[this._value]) {
      firstLeaf = this._findFirstLeaf();

      if (firstLeaf) {
        this.value = firstLeaf.value;
      }
    }

    this._updateSelectedItem();

    self.updatePosition();
  },
  get: function () {
    return this._items;
  }
};
SelectTreeLeafBox.property.value = {
  set: function (value) {
    this._value = value;

    this._updateSelectedItem();
  },
  get: function () {
    return this._value;
  }
};
SelectTreeLeafBox.property.enableSearch = _SelectListBox.default.property.enableSearch;

SelectTreeLeafBox.prototype._search = function (query) {
  var self = this;
  var queryItem = (0, _search.default)({
    text: query
  });
  var minScore = Infinity;
  var maxScore = -Infinity;

  function makeScoreTree(item) {
    var holder = {
      item: item,
      score: (0, _search.calcItemMatchScore)(queryItem, item),
      childrenScore: 0,
      children: []
    };
    minScore = Math.min(minScore, holder.score);
    maxScore = Math.max(maxScore, holder.score);
    var children;

    if (item.items && item.items.length > 0) {
      children = item.items.map(makeScoreTree);
      holder.children = children;
      holder.childrenScore = holder.children.reduce(function (ac, cr) {
        return Math.max(ac, cr.score, cr.childrenScore);
      }, 0);
    }

    return holder;
  }

  var treeScores = this._items.map(makeScoreTree);

  var midScore = (maxScore + minScore) / 2;
  var savedStatus = {};

  function filterTree(scoredTrees, ignore) {
    return scoredTrees.filter(function (holder) {
      return ignore || holder.score >= midScore || holder.childrenScore >= midScore;
    }).map(function makeTree(holder) {
      var item = Object.assign({}, holder.item);

      if (!ignore && holder.children && holder.children.length > 0) {
        if (holder.childrenScore >= midScore) {
          savedStatus[item.value] = 'open';
          item.items = filterTree(holder.children, false);
        } else {
          savedStatus[item.value] = 'close';
          item.items = filterTree(holder.children, true);
        }
      }

      return item;
    });
  }

  var resultItems = filterTree(treeScores, false);
  var dict = {};
  var $items = resultItems.map(function (item) {
    return self._makeTree(item, dict, savedStatus);
  });
  return {
    $items: $items,
    items: resultItems,
    savedStatus: Object.assign({}, savedStatus),
    originSavedStatus: savedStatus,
    dict: dict
  };
};
/***
 * @this SelectTreeLeafBox
 */


SelectTreeLeafBox.eventHandler.searchModify = function () {
  var query = this.$searchInput.value.trim();

  if (query.length === 0) {
    this.$content.clearChild().addChild(this.$items);
    this.$dislayItemByValue = this.$itemByValue;
    this.$dislayItems = this.$items;

    this._updateSelectedItem();

    this.updatePosition();
    return;
  }

  if (!this._searchCache[query]) {
    this._searchCache[query] = this._search(query);
  }

  var searchData = this._searchCache[query];
  searchData.savedStatus = Object.assign(searchData.savedStatus, searchData.originSavedStatus);

  for (var val in searchData.dict) {
    if (isBranchStatus(searchData.dict[val].status)) {
      if (searchData.savedStatus[val]) {
        searchData.dict[val].status = searchData.savedStatus[val];
      }
    }
  }

  this.$content.clearChild().addChild(searchData.$items);
  this.$dislayItemByValue = searchData.dict;
  this.$dislayItems = searchData.$items;

  this._updateSelectedItem();

  this.updatePosition();
};

_ACore.default.install(SelectTreeLeafBox);

var _default = SelectTreeLeafBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/SelectTreeLeafMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/SelectTreeLeafMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _SelectTreeLeafBox = _interopRequireDefault(require("./SelectTreeLeafBox"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _Dom = require("absol/src/HTML5/Dom");

var _SelectMenu = _interopRequireDefault(require("./SelectMenu2"));

var _utils = require("./utils");




/***
 * @extends AElement
 * @constructor
 */
function SelectTreeLeafMenu() {
  this.$selectBox = (0, _ACore._)({
    tag: _SelectTreeLeafBox.default.tag,
    on: {
      pressitem: this.eventHandler.pressItem,
      preupdateposition: this.eventHandler.preUpdateListPosition
    }
  });

  _OOP.default.drillProperty(this, this.$selectBox, 'enableSearch');

  this.$holderItem = (0, _ACore.$)('selectlistitem', this);
  this.on('click', this.eventHandler.click.bind(this));
}

SelectTreeLeafMenu.tag = 'SelectTreeLeafMenu'.toLowerCase();

SelectTreeLeafMenu.render = function () {
  return (0, _ACore._)({
    class: ['absol-selectmenu', 'as-select-menu', 'as-select-tree-leaf-menu'],
    extendEvent: ['change'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: 'absol-selectmenu-holder-item',
      child: 'selectlistitem'
    }, {
      tag: 'button',
      class: 'absol-selectmenu-btn',
      child: ['dropdown-ico']
    }]
  });
};

SelectTreeLeafMenu.prototype.init = function (props) {
  props = props || {};
  Object.keys(props).forEach(function (key) {
    if (props[key] === undefined) delete props[key];
  });

  if (props.strictValue) {
    this.strictValue = props.strictValue;
    delete props.strictValue;
  }

  var hasValue = ('value' in props);
  var value = props.value;
  delete props.value;
  this.super(props);
  if (hasValue) this.value = value;
};

SelectTreeLeafMenu.property = {};
SelectTreeLeafMenu.property.items = {
  set: function (items) {
    items = (0, _utils.copySelectionItemArray)(items || [], {
      removeNoView: true
    });
    this.$selectBox.items = items;
    this.addStyle('--select-list-estimate-width', this.$selectBox.estimateSize.width + 'px');

    if (this.$selectBox.$selectedItem) {
      this.$holderItem.data = this.$selectBox.$selectedItem.itemData;
    } else {
      this.$holderItem.data = {
        text: ''
      };
    }
  },
  get: function () {
    return this.$selectBox.items;
  }
};
SelectTreeLeafMenu.property.value = {
  set: function (value) {
    this.$selectBox.value = value;

    if (this.$selectBox.$selectedItem) {
      this.$holderItem.data = this.$selectBox.$selectedItem.itemData;
    } else {
      this.$holderItem.data = {
        text: ''
      };
    }
  },
  get: function () {
    return this.$selectBox.value;
  }
};
SelectTreeLeafMenu.property.strictValue = {
  set: function (value) {
    this.$selectBox.strictValue = !!value;
    if (value) this.addClass('as-strict-value');else this.removeClass('as-strict-value');
  },
  get: function () {
    return this.hasClass('as-strict-value');
  }
};
SelectTreeLeafMenu.property.isFocus = {
  /**
   * @this SelectTreeLeafMenu
   * @param value
   */
  set: function (value) {
    value = !!value;
    var isFocus = this.hasClass('as-focus');
    if (value === isFocus) return;
    var bound;

    if (value) {
      this.addClass('as-focus');
      bound = this.getBoundingClientRect();
      this.$selectBox.addStyle('min-width', bound.width + 'px');
      document.body.appendChild(this.$selectBox);
      this.$selectBox.addStyle('visibility', 'hidden');
      this.$selectBox.followTarget = this;
      this.$selectBox.updatePosition();
      this.off('click', this.eventHandler.click);
      setTimeout(function () {
        document.addEventListener('click', this.eventHandler.clickOut);
        this.$selectBox.removeStyle('visibility');
        this.$selectBox.focus();
      }.bind(this), 5);
      this.$selectBox.viewToSelected();
    } else {
      this.removeClass('as-focus');
      document.removeEventListener('click', this.eventHandler.clickOut);
      this.$selectBox.remove();
      setTimeout(function () {
        this.on('click', this.eventHandler.click);
      }.bind(this), 100);
      this.$selectBox.resetSearchState();
    }
  },
  get: function () {
    return this.hasClass('as-focus');
  }
};
SelectTreeLeafMenu.property.disabled = _SelectMenu.default.property.disabled;
SelectTreeLeafMenu.eventHandler = {};

SelectTreeLeafMenu.eventHandler.clickOut = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$selectBox, event)) return;
  this.isFocus = false;
};

SelectTreeLeafMenu.eventHandler.click = function (event) {
  if (!this.disabled) this.isFocus = true;
};

SelectTreeLeafMenu.eventHandler.pressItem = function (event) {
  this.$selectBox.value = event.item.value;
  this.$holderItem.data = event.item;
  var prevValue = this._value;
  this._value = event.item.value;
  this.isFocus = false;

  if (prevValue !== this._value) {
    this.emit('change', {
      item: event,
      type: 'change',
      target: this,
      originalEvent: event.originalEvent || event.originalEvent || event
    }, this);
  }
};

SelectTreeLeafMenu.eventHandler.preUpdateListPosition = function () {
  var bound = this.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  var availableTop = bound.top - 5;
  var availableBot = screenSize.height - 5 - bound.bottom;
  this.$selectBox.addStyle('--max-height', Math.max(availableBot, availableTop) + 'px');
  var outBound = (0, _Dom.traceOutBoundingClientRect)(this);

  if (bound.bottom < outBound.top || bound.top > outBound.bottom || bound.right < outBound.left || bound.left > outBound.right) {
    this.isFocus = false;
  }
};

_ACore.default.install(SelectTreeLeafMenu);

var _default = SelectTreeLeafMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MultiCheckTreeLeafBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MultiCheckTreeLeafBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _Follower = _interopRequireDefault(require("./Follower"));

var _ExpTree = _interopRequireDefault(require("./ExpTree"));

require("../css/selecttreeleafmenu.css");

var _SelectListBox = _interopRequireDefault(require("./SelectListBox"));

var _search = _interopRequireWildcard(require("./list/search"));

var _utils = require("./utils");

var _CheckBoxInput = _interopRequireDefault(require("./CheckBoxInput"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




function isBranchStatus(status) {
  return status === 'open' || status === 'close';
}

function invertStatus(status) {
  return {
    open: 'close',
    close: 'open'
  }[status] || 'none';
}
/***
 * @extends Follower
 * @constructor
 */


function MultiCheckTreeLeafBox() {
  this._initControl();

  this._searchCache = {};
  this._items = [];
  this._values = [];
  this.strictValue = true;
  this.$items = [];
  this.$itemByValue = {};
  this.$dislayItems = this.$items;
  this.$dislayItemByValue = this.$itemByValue;
  this.$content = (0, _ACore.$)('.as-select-tree-leaf-box-content', this);
  this._savedStatus = {};
  this.estimateSize = {
    width: 0,
    height: 0
  };
}

MultiCheckTreeLeafBox.tag = 'MultiCheckTreeLeafBox'.toLowerCase();

MultiCheckTreeLeafBox.render = function () {
  return (0, _ACore._)({
    tag: _Follower.default,
    attr: {
      tabindex: 0
    },
    class: ['as-select-tree-leaf-box', 'as-select-list-box'],
    extendEvent: ['change'],
    child: [{
      class: 'as-select-list-box-search-ctn',
      child: 'searchtextinput'
    }, {
      class: ['as-bscroller', 'as-select-list-box-scroller', 'as-select-tree-leaf-box-content'],
      child: []
    }, 'attachhook.as-dom-signal'],
    props: {
      anchor: [1, 6, 2, 5]
    }
  });
};

MultiCheckTreeLeafBox.prototype.focus = _SelectListBox.default.prototype.focus;

MultiCheckTreeLeafBox.prototype._initControl = function () {
  this.$searchInput = (0, _ACore.$)('searchtextinput', this).on('stoptyping', this.eventHandler.searchModify);
};

MultiCheckTreeLeafBox.prototype.resetSearchState = function () {
  var value = this.$searchInput.value;

  if (value.length > 0) {
    this.$searchInput.value = '';

    if (value.trim().length) {
      this.$content.clearChild();
      this.$content.addChild(this.$items);
      this.$dislayItems = this.$items;
      this.$dislayItemByValue = this.$itemByValue;

      this._updateSelectedItems();
    }
  }

  this.updatePosition();
};

MultiCheckTreeLeafBox.prototype._findFirstLeaf = function () {
  var found = false;

  function visit(item) {
    if (item.isLeaf) {
      found = item;
      return true;
    }

    if (item.items && item.items.length > 0) {
      item.items.some(visit);
    }

    return !!found;
  }

  this._items.some(visit);

  return found;
};

MultiCheckTreeLeafBox.prototype._makeTree = function (item, dict, savedStatus) {
  var self = this;
  var status = 'none';
  var isLeaf = item.isLeaf;

  if (item.items && item.items.length > 0) {
    status = 'close';
  }

  if (isBranchStatus(status) && isBranchStatus(savedStatus[item.value])) {
    status = savedStatus[item.value];
  }

  var treeElt = (0, _ACore._)({
    tag: _ExpTree.default.tag,
    class: 'as-select-tree-leaf-item',
    props: {
      name: item.text,
      desc: item.desc,
      icon: item.icon,
      status: status,
      itemData: item
    },
    on: {
      'statuschange': this.updatePosition.bind(this)
    }
  });
  var nodeElt = treeElt.getNode().on({
    press: function (event) {
      if (isBranchStatus(treeElt.status)) {
        treeElt.status = invertStatus(treeElt.status);
        savedStatus[item.value] = treeElt.status;
        self.updatePosition();
      } else if (isLeaf) {
        if (!(0, _EventEmitter.hitElement)(checkboxElt, event)) {
          var checked = !checkboxElt.checked;
          checkboxElt.checked = checked;

          var idx = self._values.indexOf(item.value);

          var changed = false;

          if (checked && idx < 0) {
            changed = true;

            self._values.push(item.value);
          } else if (!checked && idx >= 0) {
            changed = true;

            self._values.splice(idx, 1);
          }

          if (changed) self.emit('change', {
            item: item,
            target: self,
            itemElt: treeElt,
            originalEvent: event
          }, self);
        }
      }
    }
  });
  var checkboxElt = null;

  if (isLeaf) {
    checkboxElt = (0, _ACore._)({
      tag: _CheckBoxInput.default.tag,
      on: {
        change: function (event) {
          var checked = checkboxElt.checked;

          var idx = self._values.indexOf(item.value);

          var changed = false;

          if (checked && idx < 0) {
            changed = true;

            self._values.push(item.value);
          } else if (!checked && idx >= 0) {
            changed = true;

            self._values.splice(idx, 1);
          }

          if (changed) self.emit('change', {
            item: item,
            target: self,
            itemElt: treeElt,
            originalEvent: event
          }, self);
        }
      }
    });
    nodeElt.addChildAfter(checkboxElt, nodeElt.$toggleIcon);
    treeElt.$checkbox = checkboxElt;
  }

  if (dict) {
    if (dict[item.value] && !this.warned) {
      this.warned = true;
      console.warn(this, 'has duplicated value, element will not work correctly!', item);
    }

    dict[item.value] = treeElt;
  }

  if (isLeaf) {
    treeElt.addClass('as-is-leaf');
  }

  if (item.items && item.items.length > 0) {
    item.items.forEach(function (item1) {
      treeElt.addChild(self._makeTree(item1, dict, savedStatus));
    });
  }

  return treeElt;
};

MultiCheckTreeLeafBox.prototype._estimateItemWidth = function (item, level) {
  var width = 12; //padding

  width += 12 * level;
  width += 14.7 + 5; //toggle icon

  if (item.icon) width += 21; //icon

  width += 7 + (0, _utils.estimateWidth14)(item.text) + 5 + 7; //margin-text

  if (item.desc) width += 6 + (0, _utils.estimateWidth14)(item.desc) * 0.85;
  if (item.isLeaf) width += 16;
  return width;
};

MultiCheckTreeLeafBox.prototype.viewToSelected = function () {
  var selectedNode = this.$selectedItem;
  if (!selectedNode) return;
  selectedNode.scrollIntoView();
  var parent = selectedNode.getParent();

  while (parent && parent.getParent) {
    if (parent.status === 'close') {
      parent.getNode().emit('press');
    }

    parent = parent.getParent();
  }
};

MultiCheckTreeLeafBox.prototype._calcEstimateSize = function (items) {
  var self = this;
  var width = 0;
  var height = 0;

  function visit(item, level) {
    var itemWidth = self._estimateItemWidth(item, level);

    width = Math.max(width, itemWidth);
    height += 28;

    if (item.items && item.items.length) {
      item.items.forEach(function (item) {
        visit(item, level + 1);
      });
    }
  }

  items.forEach(function (item) {
    visit(item, 0);
  });
  return {
    width: width,
    height: height
  };
};

MultiCheckTreeLeafBox.prototype._updateSelectedItems = function () {
  var dict = this._values.reduce(function (ac, cr) {
    ac[cr] = true;
    return ac;
  }, {});

  var itemElt;

  for (var val in this.$dislayItemByValue) {
    itemElt = this.$dislayItemByValue[val];

    if (itemElt.$checkbox) {
      itemElt.$checkbox.checked = !!dict[itemElt.itemData.value];
    }
  }
};

MultiCheckTreeLeafBox.property = {};
MultiCheckTreeLeafBox.eventHandler = {};
MultiCheckTreeLeafBox.property.items = {
  /***
   * @this MultiCheckTreeLeafBox
   * @param items
   */
  set: function (items) {
    var self = this;
    this._savedStatus = {};
    this._searchCache = {};
    items = (0, _utils.copySelectionItemArray)(items || [], {
      removeNoView: true
    });
    this._items = items;
    (0, _search.prepareSearchForList)(items);
    this.$content.clearChild();
    this.$itemByValue = {};
    this.$dislayItemByValue = this.$itemByValue;
    this.$items = items.map(function (item) {
      return self._makeTree(item, self.$itemByValue, self._savedStatus);
    });
    this.$dislayItems = this.$items;
    this.$content.addChild(this.$items);
    this.estimateSize = this._calcEstimateSize(items);
    this.addStyle('--select-list-estimate-width', this.estimateSize.width + 'px');

    this._updateSelectedItems();

    this.updatePosition();
  },
  get: function () {
    return this._items;
  }
};
MultiCheckTreeLeafBox.property.values = {
  set: function (values) {
    this._values.splice(0, this._values.length);

    values = values || [];
    var arr = this._values;
    values.reduce(function (ac, cr) {
      if (!ac[cr]) {
        ac[cr] = true;
        arr.push(cr);
      }

      return ac;
    }, {});

    this._updateSelectedItems();
  },
  get: function () {
    return this._values;
  }
};
MultiCheckTreeLeafBox.property.enableSearch = _SelectListBox.default.property.enableSearch;

MultiCheckTreeLeafBox.prototype._search = function (query) {
  var self = this;
  var queryItem = (0, _search.default)({
    text: query
  });
  var minScore = Infinity;
  var maxScore = -Infinity;

  function makeScoreTree(item) {
    var holder = {
      item: item,
      score: (0, _search.calcItemMatchScore)(queryItem, item),
      childrenScore: 0,
      children: []
    };
    minScore = Math.min(minScore, holder.score);
    maxScore = Math.max(maxScore, holder.score);
    var children;

    if (item.items && item.items.length > 0) {
      children = item.items.map(makeScoreTree);
      holder.children = children;
      holder.childrenScore = holder.children.reduce(function (ac, cr) {
        return Math.max(ac, cr.score, cr.childrenScore);
      }, 0);
    }

    return holder;
  }

  var treeScores = this._items.map(makeScoreTree);

  var midScore = (maxScore + minScore) / 2;
  var savedStatus = {};

  function filterTree(scoredTrees, ignore) {
    return scoredTrees.filter(function (holder) {
      return ignore || holder.score >= midScore || holder.childrenScore >= midScore;
    }).map(function makeTree(holder) {
      var item = Object.assign({}, holder.item);

      if (!ignore && holder.children && holder.children.length > 0) {
        if (holder.childrenScore >= midScore) {
          savedStatus[item.value] = 'open';
          item.items = filterTree(holder.children, false);
        } else {
          savedStatus[item.value] = 'close';
          item.items = filterTree(holder.children, true);
        }
      }

      return item;
    });
  }

  var resultItems = filterTree(treeScores, false);
  var dict = {};
  var $items = resultItems.map(function (item) {
    return self._makeTree(item, dict, savedStatus);
  });
  return {
    $items: $items,
    items: resultItems,
    savedStatus: Object.assign({}, savedStatus),
    originSavedStatus: savedStatus,
    dict: dict
  };
};
/***
 * @this MultiCheckTreeLeafBox
 */


MultiCheckTreeLeafBox.eventHandler.searchModify = function () {
  var query = this.$searchInput.value.trim();

  if (query.length === 0) {
    this.$content.clearChild().addChild(this.$items);
    this.$dislayItemByValue = this.$itemByValue;
    this.$dislayItems = this.$items;

    this._updateSelectedItems();

    this.updatePosition();
    return;
  }

  if (!this._searchCache[query]) {
    this._searchCache[query] = this._search(query);
  }

  var searchData = this._searchCache[query];
  searchData.savedStatus = Object.assign(searchData.savedStatus, searchData.originSavedStatus);

  for (var val in searchData.dict) {
    if (isBranchStatus(searchData.dict[val].status)) {
      if (searchData.savedStatus[val]) {
        searchData.dict[val].status = searchData.savedStatus[val];
      }
    }
  }

  this.$content.clearChild().addChild(searchData.$items);
  this.$dislayItemByValue = searchData.dict;
  this.$dislayItems = searchData.$items;

  this._updateSelectedItems();

  this.updatePosition();
};

_ACore.default.install(MultiCheckTreeLeafBox);

var _default = MultiCheckTreeLeafBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MultiCheckTreeLeafMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MultiCheckTreeLeafMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _MultiCheckTreeLeafBox = _interopRequireDefault(require("./MultiCheckTreeLeafBox"));

var _SelectTreeLeafMenu = _interopRequireDefault(require("./SelectTreeLeafMenu"));

var _SelectBoxItem = _interopRequireDefault(require("./SelectBoxItem"));

var _MultiSelectMenu = _interopRequireDefault(require("./MultiSelectMenu"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SelectMenu = _interopRequireDefault(require("./SelectMenu2"));




/****
 * Only leafs have checkbox
 * @extends AElement
 * @constructor
 */
function MultiCheckTreeLeafMenu() {
  this.$selectBox = (0, _ACore._)({
    tag: _MultiCheckTreeLeafBox.default.tag,
    on: {
      change: this.eventHandler.selectBoxChange,
      preupdateposition: this.eventHandler.preUpdateListPosition
    }
  });
  this.$selectlistBox = this.$selectBox;

  _OOP.default.drillProperty(this, this.$selectBox, 'enableSearch');

  this.on('click', this.eventHandler.click);
  this.$itemCtn = (0, _ACore.$)('.as-multi-select-menu-item-ctn', this);
}

MultiCheckTreeLeafMenu.tag = 'MultiCheckTreeLeafMenu'.toLowerCase();

MultiCheckTreeLeafMenu.render = function () {
  return (0, _ACore._)({
    class: ['as-multi-select-menu', 'as-multi-check-tree-leaf-menu'],
    extendEvent: ['change'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: ['as-multi-select-menu-item-ctn', 'as-bscroller']
    }, {
      tag: 'button',
      class: 'as-multi-select-menu-toggle-btn',
      child: 'dropdown-ico'
    }, 'attachhook']
  });
};

MultiCheckTreeLeafMenu.prototype._updateSelectedItems = function () {
  var values = this.$selectBox.values;

  while (this.$itemCtn.childNodes.length > values.length) {
    this.$itemCtn.removeChild(this.$itemCtn.lastChild);
  }

  while (this.$itemCtn.childNodes.length < values.length) {
    this.$itemCtn.addChild(this._makeItem());
  }

  var item;

  for (var i = 0; i < values.length; ++i) {
    item = this.$selectBox.$itemByValue[values[i]] && this.$selectBox.$itemByValue[values[i]].itemData;

    if (item) {
      this.$itemCtn.childNodes[i].data = item;
      this.$itemCtn.childNodes[i].removeStyle('display', 'none');
    } else {
      this.$itemCtn.childNodes[i].addStyle('display', 'none');
    }
  }
};

MultiCheckTreeLeafMenu.prototype._makeItem = function () {
  var itemElt = (0, _ACore._)({
    tag: _SelectBoxItem.default.tag
  });
  itemElt.on('close', this.eventHandler.itemPressClose.bind(null, itemElt));
  return itemElt;
};

MultiCheckTreeLeafMenu.prototype.init = function (props) {
  props = props || {};
  var cProps = Object.assign({}, props);

  if ('items' in props) {
    this.items = props.items;
    delete cProps.items;
  }

  if ('values' in props) {
    this.values = props.values;
    delete cProps.values;
  }

  Object.assign(this, cProps);
};

MultiCheckTreeLeafMenu.property = {};
MultiCheckTreeLeafMenu.property.items = {
  set: function (items) {
    this.$selectBox.items = items;
    this.addStyle('--select-list-estimate-width', Math.max(145 + 20, this.$selectBox.estimateSize.width) + 'px');

    this._updateSelectedItems();
  },
  get: function () {
    return this.$selectBox.items;
  }
};
MultiCheckTreeLeafMenu.property.values = {
  set: function (values) {
    values = values || [];
    this.pendingValues = values;
    this.$selectBox.values = values;

    this._updateSelectedItems();
  },
  get: function () {
    if ('pendingValues' in this) return this.pendingValues;
    return this.$selectBox.values.slice().filter(value => {
      return !!this.$selectBox.$itemByValue[value];
    });
  }
};
MultiCheckTreeLeafMenu.property.isFocus = _SelectTreeLeafMenu.default.property.isFocus;
MultiCheckTreeLeafMenu.property.disabled = _MultiSelectMenu.default.property.disabled;
MultiCheckTreeLeafMenu.property.readOnly = _MultiSelectMenu.default.property.readOnly;
MultiCheckTreeLeafMenu.eventHandler = {};
MultiCheckTreeLeafMenu.eventHandler.clickOut = _SelectTreeLeafMenu.default.eventHandler.clickOut;
MultiCheckTreeLeafMenu.eventHandler.preUpdateListPosition = _SelectMenu.default.eventHandler.preUpdateListPosition;

MultiCheckTreeLeafMenu.eventHandler.click = function (event) {
  if (!this.readOnly && (event.target === this || event.target === this.$itemCtn)) {
    this.isFocus = true;
  }
};

MultiCheckTreeLeafMenu.eventHandler.selectBoxChange = function () {
  delete this.pendingValues;

  this._updateSelectedItems();

  this.emit('change', {
    type: 'change',
    target: this
  }, this);
};

MultiCheckTreeLeafMenu.eventHandler.itemPressClose = function (itemElt, event) {
  delete this.pendingValues;
  var item = itemElt.data;
  this.$selectBox.values = this.$selectBox.values.filter(function (value) {
    return value !== item.value;
  });

  this._updateSelectedItems();

  this.emit('change', {
    type: 'change',
    target: this
  }, this);
};

_ACore.default.install(MultiCheckTreeLeafMenu);

var _default = MultiCheckTreeLeafMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/FileListItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/FileListItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/filelistinput.css");

var _catalog = _interopRequireDefault(require("../assets/exticons/catalog.json"));

var _MessageInput = _interopRequireDefault(require("./messageinput/MessageInput"));

var _utils = require("./utils");

var _QuickMenu = _interopRequireDefault(require("./QuickMenu"));

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));

var _CheckBoxInput = _interopRequireDefault(require("./CheckBoxInput"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function FileListItem() {
  this.$parent = null;
  this.$icon = (0, _ACore.$)('.as-file-list-item-icon', this);
  this.$name = (0, _ACore.$)('.as-file-list-item-name', this);
  this.$quickMenuBtn = (0, _ACore.$)('.as-file-list-item-quick-btn', this);
  this.$check = (0, _ACore.$)('.as-file-list-item-check', this);
  this.value = null;
  this.fileType = null;
  this.fileName = '';

  _OOP.default.drillProperty(this, this.$check, 'checked');

  this.on('click', this.eventHandler.click);

  _QuickMenu.default.toggleWhenClick(this.$quickMenuBtn, {
    getMenuProps: () => {
      var list = this.parentElement;
      if (list.disabled) return;
      var self = this;
      var itemElt = this;
      var menuItems = [];
      menuItems.push({
        text: _LanguageSystem.default.getText('txt_download') || "Download",
        icon: 'span.mdi.mdi-download',
        cmd: 'download'
      });

      if (!list.readOnly) {
        if (itemElt) menuItems.push({
          text: _LanguageSystem.default.getText('txt_delete') || "Delete",
          icon: 'span.mdi.mdi-delete',
          cmd: 'delete'
        });
        menuItems.push({
          text: _LanguageSystem.default.getText('txt_delete_all') || "Delete All",
          icon: 'span.mdi.mdi-delete-empty',
          cmd: 'delete_all'
        });
      }

      return {
        items: menuItems
      };
    },
    onSelect: function (menuItem) {
      var itemElt = this;
      var self = this.parentElement;
      var files;

      switch (menuItem.cmd) {
        case 'download':
          self.downloadFileItemElt(itemElt);
          break;

        case 'delete':
          self.deleteFileItemElt(itemElt);
          self.emit('change', {
            type: 'change',
            item: itemElt.fileData,
            target: this,
            action: 'delete'
          }, this);
          break;

        case 'delete_all':
          files = self.files;
          self.files = [];
          self.emit('change', {
            type: 'change',
            items: files,
            target: this,
            action: 'delete_all'
          }, this);
          break;
      }
    }.bind(this)
  });

  this.$check.on('change', function (event) {
    if (this.$parent) {
      this.$parent.emit('check', {
        target: this.$parent,
        elt: this,
        type: 'check'
      }, this.$parent);
    }
  }.bind(this));
  /***
   * @name checked
   * @type {boolean}
   * @memberOf FileListItem#
   */
}

FileListItem.tag = 'FileListItem'.toLowerCase();

FileListItem.render = function () {
  return (0, _ACore._)({
    class: 'as-file-list-item',
    child: [{
      tag: _CheckBoxInput.default,
      class: 'as-file-list-item-check'
    }, {
      tag: 'img',
      class: 'as-file-list-item-icon',
      props: {
        src: _MessageInput.default.iconAssetRoot + '/' + 'blank' + '.svg'
      }
    }, {
      class: 'as-file-list-item-name',
      child: {
        text: '..'
      }
    }, {
      tag: 'button',
      class: 'as-file-list-item-quick-btn',
      child: 'span.mdi.mdi-dots-vertical'
    }]
  });
};

FileListItem.property = {};
FileListItem.property.fileType = {
  set: function (value) {
    this._fileType = value;

    if (value) {
      if (_catalog.default.indexOf(value) >= 0) this.$icon.src = _MessageInput.default.iconAssetRoot + '/' + value + '.svg';else this.$icon.src = _MessageInput.default.iconAssetRoot + '/' + 'blank' + '.svg';
    } else {
      this.$icon.src = _MessageInput.default.iconAssetRoot + '/' + 'blank' + '.svg';
    }
  },
  get: function () {
    return this._fileType;
  }
};
FileListItem.property.fileName = {
  set: function (value) {
    this.$name.firstChild.data = value + '';
  },
  get: function () {
    return this.$name.firstChild.data;
  }
};
FileListItem.property.value = {
  set: function (value) {
    value = value || null;
    var info = (0, _utils.fileInfoOf)(value);
    var type = info.type || null;
    var size = info.size || null;
    var name = info.name || null;
    this._value = value;
    this.fileSize = size;
    this.fileName = name;
    this.fileType = type;

    if (value) {
      this.addClass('as-has-value');
    } else {
      this.removeClass('as-has-value');
    }
  },
  get: function () {
    return this._value;
  }
};
FileListItem.eventHandler = {};
/***
 * @this FileListItem
 * @param event
 */

FileListItem.eventHandler.click = function (event) {
  if (!(0, _EventEmitter.isMouseLeft)(event)) return;
  if ((0, _EventEmitter.hitElement)(this.$check, event) || (0, _EventEmitter.hitElement)(this.$quickMenuBtn, event)) return;

  if (this.$parent && this.$parent.showCheck) {
    this.$check.checked = !this.$check.checked;
    this.$check.notifyChange();
  }
};

_ACore.default.install(FileListItem);

var _default = FileListItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/FileListInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/FileListInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _FileListItem = _interopRequireDefault(require("./FileListItem"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _ContextMenu = _interopRequireDefault(require("./ContextMenu"));

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));

var _FileSaver = require("absol/src/Network/FileSaver");

var _DropZone = _interopRequireDefault(require("./DropZone"));

var _utils = require("./utils");

var _FileInputBox = _interopRequireDefault(require("./FileInputBox"));




/***
 * @extends AElement
 * @constructor
 */
function FileListInput() {
  _ContextMenu.default.auto();

  this.$add = (0, _ACore.$)('.as-file-list-input-add', this);
  this.$attachhook = (0, _ACore.$)('attachhook', this);
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$attachhook.on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdateSize();
  });
  this.on('filedrop', this.eventHandler.input_fileDrop);
  this.on('contextmenu', this.eventHandler.itemContext);
  this.$addedFile = (0, _ACore.$)('input', this.$add).on('change', this.eventHandler.clickAdd);
  /***
   *
   * @type {FileInputBox[]}
   */

  this.$fileItems = [];
  this.$activeItem = null;
  this._files = [];
  /***
   * @name files
   * @memberOf FileListInput#
   * @type {*}
   *
   */

  /***
   * @name readOnly
   * @memberOf FileListInput#
   * @type {boolean}
   */

  /***
   * @name disabled
   * @memberOf FileListInput#
   * @type {boolean}
   */

  /***
   * @name multiple
   * @memberOf FileListInput#
   * @type {boolean}
   */

  /***
   * @name droppable
   * @memberOf FileListInput#
   * @type {boolean}
   */
}

FileListInput.tag = 'FileListInput'.toLowerCase();

FileListInput.render = function () {
  return (0, _ACore._)({
    tag: _DropZone.default.tag,
    class: ['as-file-list-input', 'as-bscroller', 'as-empty', 'as-droppable'],
    extendEvent: ['change', 'contextmenu', 'check'],
    child: [{
      tag: 'label',
      class: 'as-file-list-input-add',
      child: [{
        tag: 'input',
        attr: {
          type: 'file',
          accept: '*',
          title: null
        }
      }, {
        class: 'as-file-list-input-add-icon-ctn',
        child: 'span.mdi.mdi-upload-outline'
      }, 'attachhook']
    }, {
      tag: 'span',
      class: 'as-file-list-drag-file-text',
      child: {
        text: '(Kéo thả  file vào đây để tải lên)'
      }
    }, {
      class: 'as-file-list-input-upload-overlay',
      child: 'span.mdi.mdi-upload'
    }]
  });
};

FileListInput.prototype.defaultChecked = false;

FileListInput.prototype.updateSize = function () {
  var bound, px, n;
  var requireWidth = this.getComputedStyleValue('--item-require-width') || '300px';

  if (requireWidth.match(/%$/)) {
    this.addStyle('--item-width', requireWidth);
  } else if (requireWidth.match(/px$/)) {
    bound = this.getBoundingClientRect();
    px = parseFloat(requireWidth.replace('px', ''));

    if (!isNaN(px) && px > 0) {
      n = Math.max(1, Math.floor((bound.width - 10 - 2) / px));
      this.addStyle('--item-width', Math.floor(100 / n) + '%');
    } else {
      this.removeStyle('--item-width');
    }
  } else {
    this.removeStyle('--item-width');
  }
};

FileListInput.prototype._makeFileItem = function (file) {
  var fileElt = (0, _ACore._)({
    tag: _FileListItem.default.tag,
    props: {
      $parent: this,
      allowUpload: false,
      fileData: file,
      checked: this.defaultChecked
    }
  });
  fileElt.on('mousedown', this.eventHandler.mouseDownItem.bind(this, fileElt));
  fileElt.value = file;
  return fileElt;
};

FileListInput.prototype.add = function (file, idx) {
  if (!(0, _utils.isNaturalNumber)(idx)) idx = Infinity;
  idx = Math.min(this.$fileItems.length, idx);

  var fileElt = this._makeFileItem(file);

  var bf = this.$fileItems[idx];

  if (bf) {
    this.$fileItems.splice(idx, 0, fileElt);

    this._files.splice(idx, 0, file);

    this.addChildBefore(fileElt, bf);
  } else {
    this.$fileItems.push(fileElt);

    this._files.push(file);

    this.addChildBefore(fileElt, this.$add);
  }

  this._updateCountClass();
};

FileListInput.prototype._updateCountClass = function () {
  if (this._files.length > 0) {
    this.removeClass('as-empty');
  } else {
    this.addClass('as-empty');
  }
};

FileListInput.prototype.activeFileItemElt = function (itemElt) {
  if (this.$activeItem !== itemElt) {
    if (this.$activeItem) {
      this.$activeItem.removeClass('as-active');
    }

    this.$activeItem = itemElt;

    if (this.$activeItem) {
      this.$activeItem.addClass('as-active');
    }
  }
};

FileListInput.prototype.downloadFileItemElt = function (fileElt) {
  var fileData = fileElt.fileData;
  var name = fileData.name || fileElt.fileName;
  var file;

  if (fileData instanceof File || fileData instanceof Blob) {
    file = fileData;
  } else if (typeof fileData === 'object') {
    if (fileData.url) file = fileData.url;
  } else if (typeof fileData === "string") {
    file = fileData;
  }

  if (file) {
    (0, _FileSaver.saveAs)(file, name);
  }
};

FileListInput.prototype.deleteFileItemElt = function (fileElt) {
  var fileData = fileElt.fileData;

  var idx = this._files.indexOf(fileData);

  if (idx >= 0) {
    this._files.splice(idx, 1);
  }

  fileElt.remove();
};

FileListInput.prototype._findFileItemElt = function (target) {
  while (target && target !== this) {
    if (target.hasClass && target.hasClass('as-file-list-item')) {
      return target;
    }

    target = target.parentElement;
  }

  return null;
};

FileListInput.prototype.getChildren = function () {
  return this.$fileItems.slice();
};

FileListInput.property = {};
FileListInput.property.files = {
  /***
   * @this FileListInput
   * @param files
   */
  set: function (files) {
    files = files || [];
    files = files.slice();
    var self = this;
    this.$fileItems.forEach(function (fileElt) {
      fileElt.remove();
    });
    files = files || [];
    this._files = files;
    this.$fileItems = files.map(function (file) {
      var elt = self._makeFileItem(file);

      self.addChildBefore(elt, self.$add);
      return elt;
    });

    this._updateCountClass();
  },

  /***
   * @this FileListInput
   */
  get: function () {
    return (this._files || []).slice();
  }
};
FileListInput.property.readOnly = {
  set: function (value) {
    value = !!value;

    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }

    this.$fileItems.forEach(function (fileElt) {
      fileElt.removable = !value;
    });
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
FileListInput.property.droppable = {
  set: function (value) {
    value = !!value;

    if (value) {
      this.addClass('as-droppable');
    } else {
      this.removeClass('as-droppable');
    }

    this.$fileItems.forEach(function (fileElt) {
      fileElt.removable = !value;
    });
  },
  get: function () {
    return this.hasClass('as-droppable');
  }
};
FileListInput.property.multiple = {
  set: function (value) {
    this.$addedFile.multiple = !!value;
  },
  get: function () {
    return this.$addedFile.multiple;
  }
};
FileListInput.property.accept = {
  set: function (value) {
    if (!value) value = null;
    this.$addedFile.attr('accept', value + '');
  },
  get: function () {
    return this.$addedFile.attr('accept') || null;
  }
};
FileListInput.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
FileListInput.property.showCheck = {
  set: function (value) {
    if (value) {
      this.addClass('as-show-check');
    } else {
      this.removeClass('as-show-check');
    }
  },
  get: function () {
    return this.hasClass('as-show-check');
  }
};

_ACore.default.install(FileListInput);
/***
 * @memberOf  FileListInput#
 * @type {{}}
 */


FileListInput.eventHandler = {};

FileListInput.eventHandler.clickAdd = function (event) {
  var files = Array.prototype.slice.call(this.$addedFile.files);
  this.$addedFile.files = null;
  if (files.length === 0) return;

  for (var i = 0; i < files.length; ++i) {
    this.add(files[i]);
  }

  this.emit('change', {
    files: files,
    type: 'change',
    target: this,
    originalEvent: event,
    action: 'add'
  }, this);
};
/***
 * @this FileListInput
 * @param itemElt
 * @param event
 */


FileListInput.eventHandler.mouseDownItem = function (itemElt, event) {
  this.activeFileItemElt(itemElt);
};

FileListInput.eventHandler.input_fileDrop = function (event) {
  if (this.readOnly || this.disabled) return;
  var self = this;
  var files = Array.prototype.slice.call(event.files);
  if (files.length === 0) return;
  if (!this.multiple) files = files.slice(0, 1);
  var accept = this.accept;
  files = files.filter(function (file) {
    return (0, _utils.fileAccept)(accept, file.type) || (0, _utils.fileAccept)(accept, file.name);
  });

  if (files.length > 0) {
    files.forEach(function (file) {
      self.add(file);
    });
    this.emit('change', {
      type: 'change',
      files: files,
      target: this,
      action: 'drop'
    }, this);
  }
};
/***
 * @this FileListInput
 * @param itemElt
 * @param event
 */


FileListInput.eventHandler.itemContext = function (event) {
  if (this.disabled) return;
  var self = this;

  var itemElt = this._findFileItemElt(event.target);

  var menuItems = [];

  if (itemElt) {
    menuItems.push({
      text: _LanguageSystem.default.getText('txt_download') || "Download",
      icon: 'span.mdi.mdi-download',
      cmd: 'download'
    });
  }

  if (!this.readOnly) {
    if (itemElt) menuItems.push({
      text: _LanguageSystem.default.getText('txt_delete') || "Delete",
      icon: 'span.mdi.mdi-delete',
      cmd: 'delete'
    });
    menuItems.push({
      text: _LanguageSystem.default.getText('txt_delete_all') || "Delete All",
      icon: 'span.mdi.mdi-delete-empty',
      cmd: 'delete_all'
    });
  }

  if (menuItems.length > 0) {
    event.showContextMenu({
      items: menuItems
    }, function (event) {
      var files;

      switch (event.menuItem.cmd) {
        case 'download':
          self.downloadFileItemElt(itemElt);
          break;

        case 'delete':
          self.deleteFileItemElt(itemElt);
          self.emit('change', {
            type: 'change',
            item: itemElt.fileData,
            target: this,
            action: 'delete'
          }, this);
          break;

        case 'delete_all':
          files = self.files;
          self.files = [];
          self.emit('change', {
            type: 'change',
            items: files,
            target: this,
            action: 'delete_all'
          }, this);
          break;
      }
    });
  }
};

var _default = FileListInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DateInYearPicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DateInYearPicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/dateinyearinput.css");

var _ACore = _interopRequireWildcard(require("../ACore"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _datetime = require("absol/src/Time/datetime");




/***
 * @extends AElement
 * @constructor
 */
function DateInYearPicker() {
  this._month = null;
  this._date = null;
  this.$domSignal = (0, _ACore._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);

  this._setupMonth();

  this._setupDate();
}

DateInYearPicker.tag = 'DateInYearPicker'.toLowerCase();

DateInYearPicker.render = function () {
  return (0, _ACore._)({
    extendEvent: ['change'],
    class: 'as-date-in-year-picker',
    child: [{
      class: 'as-date-in-year-picker-table',
      child: [{
        class: 'as-date-in-year-picker-row',
        child: [{
          class: 'as-date-in-year-picker-cell',
          child: {
            tag: 'span',
            child: {
              text: 'Month'
            }
          }
        }, {
          class: 'as-date-in-year-picker-cell',
          child: {
            tag: 'span',
            child: {
              text: 'Date'
            }
          }
        }]
      }, {
        class: 'as-date-in-year-picker-row',
        child: [{
          class: 'as-date-in-year-picker-cell',
          child: {
            class: 'as-date-in-year-picker-month-col',
            child: [{
              class: 'as-date-in-year-picker-month-viewport',
              child: [{
                class: 'as-date-in-year-picker-month-scroller',
                child: Array(36).fill(null).map(function (u, i) {
                  return {
                    tag: 'button',
                    class: 'as-date-in-year-picker-month',
                    child: {
                      tag: 'span',
                      child: {
                        text: 1 + i % 12 + ''
                      }
                    },
                    props: {
                      monthL: i % 12
                    }
                  };
                })
              }]
            }, {
              tag: 'button',
              class: ['as-date-in-year-picker-month-btn', 'as-up'],
              child: 'span.mdi.mdi-chevron-up'
            }, {
              tag: 'button',
              class: ['as-date-in-year-picker-month-btn', 'as-down'],
              child: 'span.mdi.mdi-chevron-down'
            }]
          }
        }, {
          class: 'as-date-in-year-picker-cell',
          child: {
            class: 'as-date-in-year-picker-days',
            child: Array(5).fill(null).map(function (u, i) {
              return {
                class: 'as-date-in-year-picker-week',
                child: Array(7).fill(null).map(function (u1, j) {
                  return {
                    class: 'as-date-in-year-picker-day',
                    child: {
                      tag: 'span',
                      child: {
                        text: i * 7 + j + 1 + ''
                      }
                    }
                  };
                })
              };
            })
          }
        }]
      }]
    }]
  });
};

DateInYearPicker.prototype._setupMonth = function () {
  this._monthScrollDy = 0;
  this.$monthScroller = (0, _ACore.$)('.as-date-in-year-picker-month-scroller', this).on('scroll', this.eventHandler.monthScroll).once('wheel', this.eventHandler.monthScroll);
  this.$monthUpBtn = (0, _ACore.$)('.as-date-in-year-picker-month-btn.as-up', this).on('pointerdown', this.eventHandler.monthPressDown);
  this.$monthDownBtn = (0, _ACore.$)('.as-date-in-year-picker-month-btn.as-down', this).on('pointerdown', this.eventHandler.monthPressUp);
  this.$months = (0, _ACore.$$)('.as-date-in-year-picker-month', this);

  for (var i = 0; i < 36; ++i) this.$months[i].on('click', this.eventHandler.clickMonth.bind(this, i % 12));
};

DateInYearPicker.prototype._setupDate = function () {
  this.$days = (0, _ACore.$$)('.as-date-in-year-picker-day', this);
  var i;

  for (i = 31; i < 35; ++i) {
    this.$days[i].addStyle('visibility', 'hidden');
  }

  for (i = 0; i < 31; ++i) {
    this.$days[i].on('click', this.eventHandler.clickDate.bind(this, i + 1));
  }
};

DateInYearPicker.prototype.scrollIntoSelected = function () {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('scrollIntoSelected');
    return;
  }

  var d = Infinity;
  var dy;
  var y;
  var ly, hy;
  var lineHeight = this.getFontSize() * 2;

  if (this._month !== null) {
    for (var k = 0; k < 3; ++k) {
      y = this._month * lineHeight + lineHeight * 12 * k;
      ly = this.$monthScroller.scrollTop;
      hy = ly + lineHeight * 4 - lineHeight;

      if (ly <= y && hy >= y) {
        dy = 0;
        break;
      }

      if (y < ly && ly - y < d) {
        d = ly - y;
        dy = y - ly;
      }

      if (y > hy && y - hy < d) {
        d = y - hy;
        dy = y - hy;
      }
    }

    this.$monthScroller.scrollTop += dy;
  }
};
/***
 * @memberOf DateInYearPicker#
 * @type {{}}
 */


DateInYearPicker.eventHandler = {};
/***
 * @this DateInYearPicker
 */

DateInYearPicker.eventHandler.monthPressDown = function () {
  document.addEventListener('pointerup', this.eventHandler.monthRelease);
  this._monthScrollDy = -8;
  this.eventHandler.monthTick();
};
/**
 * @this DateInYearPicker
 */


DateInYearPicker.eventHandler.monthPressUp = function () {
  document.addEventListener('pointerup', this.eventHandler.monthRelease);
  this._monthScrollDy = 8;
  this.eventHandler.monthTick();
};
/**
 * @this DateInYearPicker
 */


DateInYearPicker.eventHandler.monthTick = function () {
  if (!this._monthScrollDy) return;
  var d = this._monthScrollDy;
  var fontSize = this.getFontSize();
  if (this.$monthScroller.scrollTop + d < 0) d += fontSize * 2 * 12;
  this.$monthScroller.scrollTop += d;
  setTimeout(this.eventHandler.monthTick, 30);
};

DateInYearPicker.eventHandler.monthRelease = function () {
  document.removeEventListener('pointerup', this.eventHandler.monthRelease);
  this._monthScrollDy = 0;
};
/**
 * @this DateInYearPicker
 */


DateInYearPicker.eventHandler.monthScroll = function () {
  var scrollTop = this.$monthScroller.scrollTop;
  var fontSize = this.getFontSize();

  if (scrollTop < fontSize * 2 * 12) {
    this.$monthScroller.scrollTop += fontSize * 2 * 12;
  } else if (scrollTop > fontSize * 2 * 12 * 2) {
    this.$monthScroller.scrollTop -= fontSize * 2 * 12;
  }
};
/**
 * @this DateInYearPicker
 */


DateInYearPicker.eventHandler.clickMonth = function (month, event) {
  var pDate = this.date;
  if (this.month === month) return;
  this.month = month;
  this.emit('change', {
    type: 'change',
    originalEvent: event,
    target: this
  }, this);
};
/**
 * @this DateInYearPicker
 */


DateInYearPicker.eventHandler.clickDate = function (date, event) {
  if (this.date === date) return;
  this.date = date;
  this.emit('change', {
    type: 'change',
    originalEvent: event,
    target: this
  }, this);
};

DateInYearPicker.property = {};
DateInYearPicker.property.date = {
  set: function (value) {
    if (typeof value !== 'number') value = null;
    var cM, dim;

    if (this._month === null) {
      dim = 31;
    } else {
      cM = new Date(2000, this._month, 1);
      dim = (0, _datetime.compareDate)((0, _datetime.nextMonth)(cM), cM);
    }

    if (typeof value === "number") value = Math.max(1, Math.min(dim, Math.floor(value)));
    if (isNaN(value)) value = null;
    if (this._date === value) return;

    if (this._date !== null) {
      this.$days[this._date - 1].removeClass('as-selected');
    }

    this._date = value;

    if (this._date !== null) {
      this.$days[this._date - 1].addClass('as-selected');
    }
  },
  get: function () {
    return this._date;
  }
};
DateInYearPicker.property.month = {
  /***
   * @this DateInYearPicker
   * @param value
   */
  set: function (value) {
    if (typeof value == 'number') {
      value = Math.max(0, Math.min(11, Math.floor(value)));
    } else value = null;

    if (isNaN(value)) value = null;
    if (this._month === value) return;

    if (this._month !== null) {
      this.$months[this._month].removeClass('as-selected');

      this.$months[this._month + 12].removeClass('as-selected');
      this.$months[this._month + 24].removeClass('as-selected');
    }

    this._month = value;
    var cM, dim;

    if (this._month !== null) {
      this.$months[this._month].addClass('as-selected');

      this.$months[this._month + 12].addClass('as-selected');
      this.$months[this._month + 24].addClass('as-selected');
      this.scrollIntoSelected();
      cM = new Date(2000, this._month, 1);
      dim = (0, _datetime.compareDate)((0, _datetime.nextMonth)(cM), cM);
    } else {
      dim = 31;
    }

    for (var i = 29; i < 31; ++i) {
      if (i < dim) {
        this.$days[i].removeStyle('visibility');
      } else {
        this.$days[i].addStyle('visibility', 'hidden');
      }
    }

    this.date = Math.min(this.date, dim);
  },
  get: function () {
    return this._month;
  }
};
DateInYearPicker.property.value = {
  set: function (value) {
    value = value || {
      month: null,
      date: null
    };
    this.month = value.month;
    this.date = value.date;
  },
  get: function () {
    return {
      month: this.month,
      date: this.date
    };
  }
};

_ACore.default.install(DateInYearPicker);

var _default = DateInYearPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DateInYearInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DateInYearInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _DateInYearPicker = _interopRequireDefault(require("./DateInYearPicker"));

var _Follower = _interopRequireDefault(require("./Follower"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _utils = require("./utils");

var _datetime = require("absol/src/Time/datetime");




/***
 * @extends AElement
 * @constructor
 */
function DateInYearInput() {
  this._format = 'dd/MM';
  this._value = null;
  this.$clearBtn = (0, _ACore.$)('.as-time-input-clear-btn', this).on('click', this.clear.bind(this, true));
  this.$input = (0, _ACore.$)('input', this);
  this.on('click', this.eventHandler.click);
}

DateInYearInput.tag = 'DateInYearInput'.toLowerCase();

DateInYearInput.render = function () {
  return (0, _ACore._)({
    extendEvent: ['change'],
    class: ['as-date-time-input', 'as-date-in-year-input', 'as-empty'],
    child: [{
      tag: 'input',
      class: 'as-date-time-input-text',
      attr: {
        ondrop: "return false;",
        readOnly: true
      },
      props: {
        value: 'dd/MM'
      }
    }, {
      tag: 'button',
      class: 'as-time-input-clear-btn',
      child: 'span.mdi.mdi-close-circle'
    }, {
      tag: 'button',
      class: 'as-date-time-input-icon-btn',
      child: 'span.mdi.mdi-calendar-today'
    }]
  });
};

DateInYearInput.prototype.share = {
  $follower: null,
  $picker: null,
  $input: null
};

DateInYearInput.prototype._preparePicker = function () {
  if (this.share.$picker) return;
  this.share.$picker = (0, _ACore._)({
    tag: _DateInYearPicker.default.tag,
    class: 'as-dropdown-box-common-style'
  });
  this.share.$follower = (0, _ACore._)({
    tag: _Follower.default.tag,
    class: 'as-date-in-year-follower',
    child: this.share.$picker
  });
};

DateInYearInput.prototype.clear = function (userAction, event) {
  var pValue = this.value;
  this.value = null;

  if (pValue) {
    this.emit('change', {
      type: 'change',
      action: 'clear',
      target: this,
      originalEvent: event
    }, this);
  }
};

DateInYearInput.prototype._attachPicker = function () {
  this._preparePicker();

  if (this.share.$input === this) return;
  if (this.share.$input) this.share.$input._releasePicker();
  this.share.$input = this;
  this.share.$follower.addTo(document.body);
  this.share.$follower.followTarget = this;
  this.share.$picker.value = this._value;
  this.share.$picker.on('change', this.eventHandler.pickerChange);
  setTimeout(function () {
    document.addEventListener('click', this.eventHandler.clickOut);
  }.bind(this), 0);
};

DateInYearInput.prototype._releasePicker = function () {
  if (this.share.$input !== this) return;
  var cValue = this._value;
  var value = this.share.$picker.value;

  var nValue = this._normalizeValue(value);

  this.share.$input = null;
  this.share.$picker.followTarget = null;
  this.share.$follower.remove();
  this.share.$picker.off('change', this.eventHandler.pickerChange);
  document.removeEventListener('click', this.eventHandler.clickOut);
  var changed = !cValue !== !nValue;

  if (nValue && !changed) {
    changed = cValue.date === nValue.date && cValue.month === nValue.month;
  }

  if (changed) {
    this._value = value;
    this.emit('change', {
      type: 'change',
      value: nValue,
      target: this
    }, this);
  }
};

DateInYearInput.prototype._normalizeValue = function (value) {
  if (!value) return null;
  var m = Math.min(11, Math.max(0, Math.floor(value.month)));
  if (isNaN(m)) return null;
  var dim = (0, _datetime.compareDate)((0, _datetime.nextMonth)(new Date(2000, m, 1)), new Date(2000, m, 1));
  var d = Math.min(dim, Math.max(1, Math.floor(value.date)));
  if (isNaN(d)) return null;
  return {
    date: d,
    month: m
  };
};

DateInYearInput.prototype._updateValueText = function () {
  var value = this._value;

  if (value) {
    this.$input.value = this._format.replace(new RegExp(_datetime.DATE_TIME_TOKEN_RGX.source, 'g'), function (full) {
      switch (full) {
        case 'dd':
        case 'd':
          if ((0, _utils.isRealNumber)(value.date)) {
            return (0, _utils.zeroPadding)(value.date, full.length);
          }

          return full;

        case 'M':
        case 'MM':
          if ((0, _utils.isRealNumber)(value.month)) {
            return (0, _utils.zeroPadding)(value.month + 1, full.length);
          }

          return full;

        default:
          return full;
      }
    });
  } else {
    this.$input.value = this._format;
  }

  if (this.$input.value === this._format) {
    this.addClass('as-empty');
  } else {
    this.removeClass('as-empty');
  }
};

DateInYearInput.property = {};
DateInYearInput.property.value = {
  set: function (value) {
    value = this._normalizeValue(value);
    this._value = value;

    this._updateValueText();
  },
  get: function () {
    return this._normalizeValue(this._value);
  }
};
DateInYearInput.property.notNull = {
  set: function (value) {
    if (value) {
      this.addClass('as-must-not-null');
    } else {
      this.removeClass('as-must-not-null');
    }
  },
  get: function () {
    return this.hasClass('as-must-not-null');
  }
};
DateInYearInput.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
      this.$input.disabled = true;
    } else {
      this.removeClass('as-disabled');
      this.$input.disabled = false;
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
DateInYearInput.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
      this.$input.readOnly = true;
    } else {
      this.removeClass('as-read-only');
      this.$input.readOnly = false;
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
/***
 * @memberOf DateInYearInput#
 * @type {{}}
 */

DateInYearInput.eventHandler = {};
/***
 * @this DateInYearInput
 * @param event
 */

DateInYearInput.eventHandler.click = function (event) {
  if (this.readOnly || (0, _EventEmitter.hitElement)(this.$clearBtn, event)) return;

  this._attachPicker();
};
/***
 * @this DateInYearInput
 * @param event
 */


DateInYearInput.eventHandler.clickOut = function (event) {
  if ((0, _EventEmitter.hitElement)(this.share.$follower, event)) return;

  this._releasePicker();
};

DateInYearInput.eventHandler.pickerChange = function () {
  this._value = this.share.$picker.value;

  this._updateValueText();
};

_ACore.default.install(DateInYearInput);

var _default = DateInYearInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/DualSelectBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DualSelectBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _Follower = _interopRequireDefault(require("./Follower"));

require("../css/dualselectmenu.css");

var _search = _interopRequireWildcard(require("./list/search"));

var _utils = require("./utils");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _SelectListBox = _interopRequireDefault(require("./SelectListBox"));




/***
 * @extends Follower
 * @constructor
 */
function DualSelectBox() {
  this.$domSignal = (0, _ACore._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('scrollIntoSelected', this.scrollIntoSelected.bind(this));
  this._items = [];
  this._value = [null, null];
  this.holderByValue = {};
  this.$lists = (0, _ACore.$$)('.as-dual-select-box-list', this);
  this.$searcTextInput = (0, _ACore.$)('searchtextinput', this).on('stoptyping', this.eventHandler.searchTextInputModify);
  this.$closeBtn = (0, _ACore.$)('.as-select-list-box-close-btn', this).on('click', this.eventHandler.clickCloseBtn);
  this.cView = new DualSelectView(this, this._items);
  this.searchedView = {
    '*': this.cView
  };
  this.estimateSize = {
    width: 0,
    height: 0
  };
  this._emittedValue = [null, null];
  /***
   * @name strictValue
   * @type {boolean}
   * @memberOf DualSelectBox#
   */

  /***
   * @name enableSearch
   * @type {boolean}
   * @memberOf DualSelectBox#
   */

  /***
   * @name value
   * @type {Array}
   * @memberOf DualSelectBox#
   */

  /***
   * @name items
   * @type {Array}
   * @memberOf DualSelectBox#
   */
}

DualSelectBox.tag = 'DualSelectBox'.toLowerCase();

DualSelectBox.render = function () {
  return (0, _ACore._)({
    tag: _Follower.default.tag,
    class: 'as-dual-select-box',
    extendEvent: ['change', 'close'],
    child: [{
      class: 'as-dual-select-box-search-ctn',
      child: {
        tag: 'searchtextinput'
      }
    }, {
      class: 'as-dual-select-box-list-ctn',
      child: [{
        class: ['as-dual-select-box-list', 'absol-selectlist', 'as-bscroller']
      }, {
        class: 'as-dual-select-box-arrow-ctn',
        child: 'span.mdi.mdi-menu-right'
      }, {
        class: ['as-dual-select-box-list', 'absol-selectlist', 'as-bscroller']
      }]
    }, {
      class: 'as-dropdown-box-footer',
      child: [{
        class: 'as-dropdown-box-footer-right',
        child: [{
          tag: 'a',
          class: 'as-select-list-box-close-btn',
          child: {
            text: 'Close'
          }
        }]
      }]
    }]
  });
};

DualSelectBox.prototype._implicit = function (value) {
  if (value instanceof Array) {
    if (value.length > 2) value = value.slice(0, 2);else {
      value.push.apply(value, Array(2 - value.length).fill(null));
    }
  } else {
    value = [null, null];
  }

  return value;
};

DualSelectBox.prototype._explicit = function (value) {
  value = value.slice();
  var strictValue = this.strictValue;

  if (!this.holderByValue[value[0]]) {
    if (this._items.length > 0 && strictValue) {
      value[0] = this._items[0].value;
    } else {
      return null;
    }
  }

  if (!this.holderByValue[value[0]].child[value[1]]) {
    if (strictValue && this.holderByValue[value[0]].item.items && this.holderByValue[value[0]].item.items.length > 0) {
      value[1] = this.holderByValue[value[0]].item.items[0].value;
    } else {
      return null;
    }
  }

  if (value[0] === null || value[1] === null) {
    return null;
  }

  return value;
};

DualSelectBox.prototype._notifyIfChange = function (event) {
  var value = this._explicit(this._value);

  if (value === this._emittedValue) return;

  if (!value !== !this._emittedValue || value[0] !== this._emittedValue[0] || value[1] !== this._emittedValue[1]) {
    this.emit('change', {
      type: 'change',
      target: this,
      originalEvent: event
    }, this);
  }
};

DualSelectBox.prototype._makeLeftItem = function (item) {
  var itemElt = (0, _ACore._)({
    class: 'absol-selectlist-item',
    child: {
      tag: 'span',
      class: 'absol-selectlist-item-text',
      child: {
        text: item.text
      }
    }
  });
  itemElt.itemData = item;
  itemElt.on('click', this.eventHandler.clickLeftItem.bind(this, itemElt));
  return itemElt;
};

DualSelectBox.prototype.makeRightItem = function (item) {
  var itemElt = (0, _ACore._)({
    class: 'absol-selectlist-item',
    child: {
      tag: 'span',
      class: 'absol-selectlist-item-text',
      child: {
        text: item.text
      }
    }
  });
  itemElt.itemData = item;
  itemElt.on('click', this.eventHandler.clickRightItem.bind(this, itemElt));
  return itemElt;
};

DualSelectBox.prototype._calcEstimateSize = function (items) {
  var fontSize = (0, _ACore.$)(document.body).getFontSize();
  var longestItem = null;
  var longestE14 = 0;
  var e14, i, j;
  var item, subItem;

  for (i = 0; i < items.length; ++i) {
    item = items[i];
    e14 = (0, _utils.estimateWidth14)(item.text);

    if (e14 > longestE14) {
      longestItem = item;
      longestE14 = e14;
    }
  }

  var leftTextWidth = longestItem ? (0, _utils.measureText)(longestItem.text, '14px arial').width : 0;
  var maxN = items.length;

  for (i = 0; i < items.length; ++i) {
    item = items[i];
    if (!item.items || item.items.length === 0) continue;
    maxN = Math.max(maxN, item.items.length);

    for (j = 0; j < item.items.length; ++j) {
      subItem = item.items[j];
      e14 = (0, _utils.estimateWidth14)(subItem.text);

      if (e14 > longestE14) {
        longestItem = subItem;
        longestE14 = e14;
      }
    }
  }

  var rightTextWidth = longestItem ? (0, _utils.measureText)(longestItem.text, '14px arial').width : 0;
  return {
    width: (7 + leftTextWidth + 7 + 5 + 7 + 1 + 17 + 1 + 7 + rightTextWidth + 7 + 5 + 7 + 20) * fontSize / 14,
    height: maxN * 20 * fontSize / 14,
    textWidth: (leftTextWidth + rightTextWidth + 12) * fontSize / 14
  };
};

DualSelectBox.prototype.scrollIntoSelected = function () {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('scrollIntoSelected');
    return;
  }

  if (this.cView && this.cView.$leftSelectedItem && this.cView.$leftSelectedItem.isDescendantOf(this.$lists[0])) {
    this.cView.$leftSelectedItem.scrollIntoView();
  }

  if (this.cView && this.cView.$rightSelectedItem && this.cView.$rightSelectedItem.isDescendantOf(this.$lists[1])) {
    this.cView.$rightSelectedItem.scrollIntoView();
  }
};

DualSelectBox.prototype.focus = _SelectListBox.default.prototype.focus;
DualSelectBox.property = {};
DualSelectBox.property.items = {
  /***
   * @this DualSelectBox
   * @param items
   */
  set: function (items) {
    var self = this;
    items = items || [];
    (0, _search.prepareSearchForList)(items);
    this._items = items;
    this.holderByValue = items.reduce(function (ac, cr) {
      ac[cr.value] = {
        item: cr,
        child: (cr.items || []).reduce(function (ac1, cr1) {
          ac1[cr1.value] = {
            item: cr1
          };
          return ac1;
        }, {})
      };
      return ac;
    }, {});
    this.estimateSize = this._calcEstimateSize(items);
    this.addStyle('--dual-list-estimate-width', this.estimateSize.width + 'px');
    this.searchedView = {};
    this.cView = new DualSelectView(this, items);
    this.searchedView['*'] = this.cView;
    this.cView.toView();
  },
  get: function () {
    return this._items;
  }
};
DualSelectBox.property.enableSearch = {
  set: function (value) {
    if (value) {
      this.addClass('as-enable-search');
    } else {
      this.removeClass('as-enable-search');
    }
  },
  get: function () {
    return this.hasClass('as-enable-search');
  }
};
DualSelectBox.property.strictValue = {
  set: function (value) {
    if (value) {
      this.addClass('as-strict-value');
    } else {
      this.removeClass('as-strict-value');
    }

    if (this.cView) this.cView.updateViewByValue();
  },
  get: function () {
    return this.hasClass('as-strict-value');
  }
};
DualSelectBox.property.value = {
  /***
   * @this DualSelectBox
   * @param value
   */
  set: function (value) {
    this._value = this._implicit(value);

    if (this.cView) {
      this.cView.updateViewByValue();
      this.cView.toRightList();
    }

    this.scrollIntoSelected();
  },
  get: function () {
    return this._explicit(this._value);
  }
};
/***
 * @memberOf DualSelectBox#
 * @type {{}}
 */

DualSelectBox.eventHandler = {};
/***
 * @this DualSelectBox
 * @param itemElt
 * @param event
 */

DualSelectBox.eventHandler.clickLeftItem = function (itemElt, event) {
  var item = itemElt.itemData;
  this._value[0] = item.value;
  this.cView.updateLeftSelectedItem();
  this.cView.updateRightList();
  this.cView.toRightList();

  if (this.cView.$leftItemByValue[item.value] && this.cView.$leftItemByValue[item.value].itemData && this.cView.$leftItemByValue[item.value].itemData.items && this.cView.$leftItemByValue[item.value].itemData.items.length > 0) {
    this._value[1] = this.cView.$leftItemByValue[item.value].itemData.items[0].value;
    this.cView.updateRightSelectedItem();
  }

  if (this.cView.$rightSelectedItem) {
    this.cView.$rightSelectedItem.scrollIntoView();
  }

  this._notifyIfChange(event);
};
/***
 * @this DualSelectBox
 * @param itemElt
 * @param event
 */


DualSelectBox.eventHandler.clickRightItem = function (itemElt, event) {
  var item = itemElt.itemData;
  this._value[1] = item.value;
  this.cView.updateRightSelectedItem();

  this._notifyIfChange(event);
};

DualSelectBox.prototype.searchItemByText = function (text) {
  var items = this._items;
  var queryItem = (0, _search.default)({
    text: text
  });
  var maxScore = 0;
  var holders = items.map(function (item) {
    var h = {
      item: item,
      itemScore: (0, _search.calcItemMatchScore)(queryItem, item)
    };
    maxScore = Math.max(maxScore, h.itemScore);
    var childMaxScore = 0;

    if (item.items && item.items.length > 0) {
      h.child = item.items.map(function (cItem) {
        var cItemScore = (0, _search.calcItemMatchScore)(queryItem, cItem);
        maxScore = Math.max(maxScore, cItemScore);
        childMaxScore = Math.max(childMaxScore, cItemScore);
        return {
          item: cItem,
          itemScore: cItemScore
        };
      });
      h.childScore = childMaxScore;
    }

    return h;
  });
  holders.sort(function (a, b) {
    return -Math.max(a.itemScore, a.childScore) + Math.max(b.itemScore, b.childScore);
  });
  var midScore = maxScore / 2;
  holders = holders.filter(function (holder) {
    return Math.max(holder.itemScore, holder.childScore) >= midScore;
  });
  return holders.map(function (holder) {
    var oldItem = holder.item;
    var item = {
      text: oldItem.text,
      value: oldItem.value
    };
    var childHolders;

    if (holder.child) {
      childHolders = holder.child.slice();
      childHolders.sort(function (a, b) {
        return -a.itemScore + b.itemScore;
      });
      item.items = childHolders.map(function (cHolder) {
        return cHolder.item;
      });
      item.isSearchItem = true;
    }

    return item;
  });
};

DualSelectBox.prototype.focus = function () {
  if (this.enableSearch) {
    this.$searcTextInput.focus();
  }
};

DualSelectBox.prototype.resetSearchState = function () {
  if (this.$searcTextInput.value.length === 0) return;
  this.$searcTextInput.value = '';
  this.eventHandler.searchTextInputModify();
};
/***
 * @this DualSelectBox
 */


DualSelectBox.eventHandler.searchTextInputModify = function () {
  var query = this.$searcTextInput.value.trim().replace(/\s+/, ' ');
  if (query.length === 0) query = '*';
  var view = this.searchedView[query];

  if (!view) {
    view = new DualSelectView(this, this.searchItemByText(query));
    this.searchedView[query] = view;
  }

  this.cView = view;
  this.cView.updateLeftSelectedItem();
  this.cView.updateRightSelectedItem();
  view.toView();
  this.$lists[0].scrollTop = 0;
  this.$lists[1].scrollTop = 0;
  if (query === '*') this.scrollIntoSelected();
};

DualSelectBox.eventHandler.clickCloseBtn = function (event) {
  this.emit('close', {
    type: 'close',
    target: this,
    originalEvent: event
  }, this);
};

_ACore.default.install(DualSelectBox);

var _default = DualSelectBox;
/***
 *
 * @param {DualSelectBox} box
 * @param items
 * @constructor
 */

exports.default = _default;

function DualSelectView(box, items) {
  var self = this;
  this.box = box;
  this.items = items;
  this.$leftItems = items.map(function (item) {
    return self.box._makeLeftItem(item);
  });
  this.$leftItemByValue = this.$leftItems.reduce(function (ac, cr) {
    ac[cr.itemData.value] = cr;
    return ac;
  }, {});
  this.$rightItems = [];
  this.$rightItemByValue = {};
  this.$leftSelectedItem = null;
  this.$rightSelectedItem = null;
  this.updateViewByValue();
}

DualSelectView.prototype.toView = function () {
  this.box.$lists[0].clearChild();
  this.box.$lists[0].addChild(this.$leftItems);
  this.updateLeftSelectedItem();
  this.toRightList();
};

DualSelectView.prototype.toRightList = function () {
  this.box.$lists[1].clearChild();
  this.box.$lists[1].addChild(this.$rightItems);
  this.updateLeftSelectedItem();
};

DualSelectView.prototype.updateViewByValue = function () {
  this.updateLeftSelectedItem();
  this.updateRightList();
};

DualSelectView.prototype.updateRightList = function () {
  var self = this;
  var leftValue = this.box._value[0];
  var items = this.$leftItemByValue[leftValue] && this.$leftItemByValue[leftValue].itemData.items;

  if (items && items.length > 0) {
    this.$rightItems = items.map(function (item) {
      return self.box.makeRightItem(item);
    });
  } else {
    this.$rightItems = [];
  }

  this.$rightItemByValue = this.$rightItems.reduce(function (ac, cr) {
    ac[cr.itemData.value] = cr;
    return ac;
  }, {});
  this.updateRightSelectedItem();
};

DualSelectView.prototype.updateLeftSelectedItem = function () {
  if (this.$leftSelectedItem) {
    this.$leftSelectedItem.removeClass('as-selected');
  }

  this.$leftSelectedItem = this.$leftItemByValue[this.box._value[0]] || null;

  if (this.$leftSelectedItem) {
    this.$leftSelectedItem.addClass('as-selected');
  }
};

DualSelectView.prototype.updateRightSelectedItem = function () {
  if (this.$rightSelectedItem) {
    this.$rightSelectedItem.removeClass('as-selected');
  }

  this.$rightSelectedItem = this.$rightItemByValue[this.box._value[1]] || null;

  if (this.$rightSelectedItem) {
    this.$rightSelectedItem.addClass('as-selected');
  }
};
};

moduleFactories["node_modules/absol-acomp/js/DualSelectMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/DualSelectMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _DualSelectBox = _interopRequireDefault(require("./DualSelectBox"));

var _Dom = require("absol/src/HTML5/Dom");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));




/***
 * @extends AElement
 * @constructor
 */
function DualSelectMenu() {
  this._format = '$0, $1';
  /***
   * @type {DualSelectBox}
   */

  this.$box = (0, _ACore._)({
    tag: _DualSelectBox.default.tag,
    props: {
      anchor: [1, 6, 2, 5]
    },
    on: {
      preupdateposition: this.eventHandler.preUpdatePosition,
      change: this.eventHandler.boxChange,
      close: this.eventHandler.boxClose
    }
  });
  this.$item = (0, _ACore.$)('.absol-selectlist-item', this);
  this.on('click', this.eventHandler.click);

  _OOP.default.drillProperty(this, this.$box, 'enableSearch');
  /***
   * @name strictValue
   * @type {boolean}
   * @memberOf DualSelectMenu#
   */

  /***
   * @name readOnly
   * @type {boolean}
   * @memberOf DualSelectMenu#
   */

}

DualSelectMenu.tag = 'DualSelectMenu'.toLowerCase();

DualSelectMenu.render = function () {
  return (0, _ACore._)({
    class: ['absol-selectmenu', 'as-dual-select-menu'],
    extendEvent: ['change'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: 'absol-selectmenu-holder-item',
      child: '.absol-selectlist-item'
    }, {
      tag: 'button',
      class: 'absol-selectmenu-btn',
      child: ['dropdown-ico']
    }, 'attachhook']
  });
};

DualSelectMenu.prototype._updateViewValue = function () {
  var format = this._format;
  var value = this.$box.value || [null, null];
  var strictValue = this.strictValue;
  var hbv = this.$box.holderByValue;
  var firstToken = '__';
  var secToken = '__';
  var firstHolder = hbv[value[0]];
  var sectHolder;

  if (firstHolder) {
    firstToken = firstHolder.item.text;
    sectHolder = firstHolder.child[value[1]];
    if (sectHolder) secToken = sectHolder.item.text;
  }

  var text = format.replace('$0', firstToken).replace('$1', secToken);
  this.$item.clearChild().addChild((0, _ACore._)({
    tag: 'span',
    class: 'as-selectlist-item-text',
    child: {
      text: text
    }
  }));
};

DualSelectMenu.property = {};
DualSelectMenu.property.isFocus = {
  /***
   * @this DualSelectMenu
   * @param value
   */
  set: function (value) {
    var self = this;
    value = !!value;
    if (this.hasClass('as-focus') === value) return;

    if (value) {
      this._prevValue = (this.$box.value || [null, null]).join('//');
      this.addClass('as-focus');
      this.off('click', this.eventHandler.click);
      this.$box.followTarget = this;
      this.$box.addTo(document.body);
      this.$box.updatePosition();
      this.$box.scrollIntoSelected();
      setTimeout(function () {
        self.$box.focus();
        document.addEventListener('click', self.eventHandler.clickOut);
      }, 10);
    } else {
      this.removeClass('as-focus');
      this.$box.remove();
      this.$box.resetSearchState();
      document.removeEventListener('click', self.eventHandler.clickOut);
      setTimeout(function () {
        self.on('click', self.eventHandler.click);
      }, 10);

      if ((this.$box.value || [null, null]).join('//') !== this._prevValue) {
        this._updateViewValue();

        this.emit('change', {
          type: 'change',
          target: this
        }, this);
      }
    }
  },
  get: function () {
    return this.hasClass('as-focus');
  }
};
/****
 * @memberOf DualSelectMenu#
 * @type {{}}
 */

DualSelectMenu.eventHandler = {};
DualSelectMenu.property.items = {
  /***
   * @this DualSelectMenu
   * @param items
   */
  set: function (items) {
    this.$box.items = items;
    this.addStyle('--dual-list-estimate-text-width', this.$box.estimateSize.textWidth + 'px');

    this._updateViewValue();
  },
  get: function () {
    return this.$box.items;
  }
};
DualSelectMenu.property.value = {
  set: function (value) {
    this.$box.value = value;

    this._updateViewValue();
  },
  get: function () {
    return this.$box.value;
  }
};
DualSelectMenu.property.strictValue = {
  set: function (value) {
    this.$box.strictValue = value;

    this._updateViewValue();
  },
  get: function () {
    return this.$box.strictValue;
  }
};
DualSelectMenu.property.format = {
  set: function (value) {
    this._format = value || '$0, $1';

    this._updateViewValue();
  },
  get: function () {
    return this._format;
  }
};
DualSelectMenu.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
DualSelectMenu.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
/**
 * @this DualSelectMenu
 */

DualSelectMenu.eventHandler.click = function () {
  if (this.readOnly) return;
  this.isFocus = true;
};
/**
 * @this DualSelectMenu
 */


DualSelectMenu.eventHandler.clickOut = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$box, event)) return;
  this.isFocus = false;
};
/***
 * @this DualSelectMenu
 */


DualSelectMenu.eventHandler.preUpdatePosition = function () {
  var bound = this.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  var availableTop = bound.top - 5;
  var availableBot = screenSize.height - 5 - bound.bottom;
  this.$box.addStyle('--max-height', Math.max(availableBot, availableTop) + 'px');
  var outBound = (0, _Dom.traceOutBoundingClientRect)(this);

  if (bound.bottom < outBound.top || bound.top > outBound.bottom || bound.right < outBound.left || bound.left > outBound.right) {
    this.isFocus = false;
  }
};

DualSelectMenu.eventHandler.boxChange = function () {
  this._updateViewValue();
};

DualSelectMenu.eventHandler.boxClose = function () {
  this.isFocus = false;
};

_ACore.default.install(DualSelectMenu);

var _default = DualSelectMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TOCItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TOCItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/toclist.css");

var _CheckBoxInput = _interopRequireDefault(require("./CheckBoxInput"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _utils = require("./utils");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function TOCItem() {
  this.$iconP = null;
  this.$iconCtn = (0, _ACore.$)('.as-toc-item-ext-icon-ctn', this);
  this._status = 'none';
  this.$name = (0, _ACore.$)('.as-toc-item-name', this);
  this.$nameInput = (0, _ACore.$)('.as-toc-item-name-input', this).on('keydown', this.eventHandler.keyDownNameInput).on('paste', this.eventHandler.keyDownNameInput);
  this.$toggleCtn = (0, _ACore.$)('.as-toc-item-toggle-ico-ctn', this).on('click', this.eventHandler.clickToggleCtn);
  this._level = 0;
  this.$checkbox = (0, _ACore.$)(_CheckBoxInput.default.tag, this).on('change', this.eventHandler.checkedChange);
  this.$checkbox.disabled = true;
  this.$checkbox.addStyle('display', 'none');
  this.$checkIco = (0, _ACore.$)('.as-toc-item-check-ctn .mdi-check', this).addStyle('display', 'none').addStyle('font-size', '18px');
  this.$quickMenuBtn = (0, _ACore.$)('.as-toc-item-quick-menu-ctn button', this).on('click', this.eventHandler.clickQuickMenuBtn);
  this.on('click', this.eventHandler.click);
  /***
   * @name hasQuickMenu
   * @type {boolean}
   * @memberOf TOCItem#
   */

  /***
  * @name name
  * @type {string}
  * @memberOf TOCItem#
  */

  /***
   * @name status
   * @type {"none"|"open"|"close"}
   * @memberOf TOCItem#
   */

  /***
   * @name level
   * @type {number}
   * @memberOf TOCItem#
   */

  /***
   * @name checked
   * @type {boolean}
   * @memberOf TOCItem#
   */

  /***
   * @name nodeData
   * @type {{}}
   * @memberOf TOCItem#
   */
}

TOCItem.tag = 'TOCItem'.toLowerCase();

TOCItem.render = function () {
  return (0, _ACore._)({
    class: ['as-toc-item', 'as-has-quick-menu'],
    extendEvent: ['presstoggle', 'checkedchange', 'pressquickmenu', 'press', 'renamefinish'],
    child: [{
      class: 'as-toc-item-toggle-ico-ctn',
      child: 'toggler-ico'
    }, '.as-toc-item-ext-icon-ctn', {
      class: 'as-toc-item-name-ctn',
      child: [{
        tag: 'span',
        class: 'as-toc-item-name',
        child: {
          text: 'đây là cái tên'
        }
      }, {
        tag: 'input',
        class: 'as-toc-item-name-input',
        attr: {
          type: 'text'
        }
      }]
    }, {
      class: 'as-toc-item-check-ctn',
      child: [{
        tag: _CheckBoxInput.default.tag
      }, 'span.mdi.mdi-check']
    }, {
      class: 'as-toc-item-quick-menu-ctn',
      child: {
        tag: 'button',
        child: 'span.mdi.mdi-dots-vertical'
      }
    }]
  });
};

TOCItem.property = {};
TOCItem.property.icon = {
  set: function (value) {
    if (this.$iconP) {
      this.$iconP.remove();
      this.$iconP = undefined;
    }

    if (value) {
      var newE;

      if (!_Dom.default.isDomNode(value)) {
        newE = (0, _ACore._)(value);
      }

      this.$iconP = newE;
      this.$iconCtn.addChild(newE);
      this._icon = value;
    } else {
      this._icon = undefined;
    }
  },
  get: function () {
    return this._icon;
  }
};
TOCItem.property.status = {
  set: function (value) {
    if (['none', 'open', 'close'].indexOf(value) < 0) value = 'none';
    this.removeClass('as-status-' + this._status);
    this._status = value;
    this.addClass('as-status-' + value);
  },
  get: function () {
    return this._status;
  }
};
TOCItem.property.name = {
  set: function (value) {
    this.$name.firstChild.data = value || '';
  },
  get: function () {
    return this.$name.firstChild.data;
  }
};
TOCItem.property.level = {
  set: function (value) {
    this._level = value;
    this.addStyle('--level', value + '');
  },
  get: function () {
    return this._level;
  }
};
TOCItem.property.checked = {
  set: function (value) {
    this.$checkbox.checked = value;

    if (value) {
      this.$checkIco.removeStyle('display');
    } else {
      this.$checkIco.addStyle('display', 'none');
    }
  },
  get: function () {
    return this.$checkbox.checked;
  }
};
TOCItem.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
TOCItem.property.hasQuickMenu = {
  set: function (value) {
    if (value) {
      this.addClass('as-has-quick-menu');
    } else {
      this.removeClass('as-has-quick-menu');
    }
  },
  get: function () {
    return this.hasClass('as-has-quick-menu');
  }
};

TOCItem.prototype.rename = function () {
  this.addClass('as-renaming');
  var name = this.name;
  var textWidth = (0, _utils.measureText)(name, '14px Arial, Helvetica, sans-serif').width;
  this.$nameInput.addStyle('width', textWidth + 2 + 'px');
  this.$nameInput.value = name;
  this.$nameInput.focus();
  this.$nameInput.select();
  this.$nameInput.once('blur', function (event) {
    var event1;

    if (this.$nameInput.value !== name) {
      event1 = (0, _EventEmitter.copyEvent)(event, {
        originalEvent: event,
        type: 'renamefinish',
        newName: this.$nameInput.value,
        __promise__: Promise.resolve(true),
        waitFor: function (promise) {
          if (promise && promise.then) {
            this.__promise__ = promise;
          } else {
            this.__promise__ = Promise.resolve(promise);
          }
        }
      });
      this.emit('renamefinish', event1, this);

      event1.__promise__.then(function (result) {
        if (result === true) {
          this.name = event1.newName;
        } else if (typeof result === 'string') {
          this.name = result;
        }
      }.bind(this));
    }

    this.removeClass('as-renaming');
  }.bind(this));
};
/***
 * @memberOf TOCItem#
 * @type {{}}
 */


TOCItem.eventHandler = {};

TOCItem.eventHandler.keyDownNameInput = function (event) {
  var extendText = '';

  if (event.type === 'paste') {
    extendText = (event.clipboardData || window.clipboardData).getData('text') || '';
  } else if (event.key.length === 1 && !(event.ctrl && event.key === 'C')) {
    extendText = event.key;
  } else if (event.key === 'Enter') {
    this.$nameInput.blur();
  }

  if (extendText.length > 0) {
    this.$nameInput.addStyle('width', (0, _utils.measureText)(this.$nameInput.value + extendText, '14px Arial, Helvetica, sans-serif').width + 2 + 'px');
  }

  setTimeout(function () {
    var name = this.$nameInput.value;
    this.$nameInput.addStyle('width', (0, _utils.measureText)(name, '14px Arial, Helvetica, sans-serif').width + 2 + 'px');
  }.bind(this), 0);
};

TOCItem.eventHandler.clickToggleCtn = function (event) {
  if (this.status === 'close' || this.status === 'open') this.emit('presstoggle', {
    originalEvent: event,
    type: 'presstoggle'
  }, this);
};

TOCItem.eventHandler.checkedChange = function (event) {
  this.emit('checkedchange', {
    type: 'checkedchange',
    target: this,
    originalEvent: event
  }, this);
};

TOCItem.eventHandler.clickQuickMenuBtn = function (event) {
  this.emit('pressquickmenu', {
    type: 'pressquickmenu',
    originalEvent: event
  }, this);
};

TOCItem.eventHandler.click = function (event) {
  if (!(0, _EventEmitter.hitElement)(this.$checkbox, event) && !(0, _EventEmitter.hitElement)(this.$quickMenuBtn, event)) {
    if (!(0, _EventEmitter.hitElement)(this.$toggleCtn, event) || !(this.status === "close" || this.status === 'open')) {
      this.emit('press', {
        type: 'press',
        originalEvent: event
      }, this);
    }
  }
};

_ACore.default.install(TOCItem);

var _default = TOCItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TOCList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TOCList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _TOCItem = _interopRequireDefault(require("./TOCItem"));

var _QuickMenu = _interopRequireDefault(require("./QuickMenu"));

var _BlurTrigger = _interopRequireDefault(require("./tool/BlurTrigger"));

var _search = _interopRequireWildcard(require("./list/search"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _utils = require("./utils");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function TOCList() {
  this.$searchInput = null;
  this.$body = (0, _ACore.$)('.as-toc-list-body', this);
  this.$searching = (0, _ACore.$)('.as-toc-list-searching', this);
  this.rootController = new TOCVirtualRootController(this, [], this.$body);
  this.searchCache = {};
  this.savedState = {
    active: [],
    status: {}
  };
  /***
   * @name nodes
   * @type {{}[]}
   * @memberOf TOCList#
   */
}

TOCList.tag = 'TOCList'.toLowerCase();

TOCList.render = function () {
  return (0, _ACore._)({
    extendEvent: ['pressnode', 'checkednodechange', 'pressnodequickmmenu', 'statechange'],
    class: 'as-toc-list',
    child: ['.as-toc-list-body', '.as-toc-list-searching']
  });
};

TOCList.prototype.applySavedState = function () {
  var savedStatus = this.savedState.status;

  function visitArr(arr) {
    arr.forEach(function (ct) {
      var status = savedStatus[ct.ident];

      if (status) {
        ct.status = status;
      }

      savedStatus[ct.ident] = ct.status;
      visitArr(ct.children);
    });
  }

  visitArr(this.rootController.children);

  if (this.savedState.active) {
    this.savedState.active.forEach(function (ident) {
      var activeCt = this.findControllerByIdent(ident);
      if (activeCt) activeCt.active();
    }.bind(this));
  }
};

TOCList.prototype.resetSavedState = function () {
  this.savedState = {
    active: null,
    status: {}
  };
};

TOCList.prototype.saveState = function () {
  var oldState = this.savedState;
  var savedState = {
    active: [],
    status: {}
  };
  var changed = false;

  function visitArr(arr) {
    arr.forEach(function (ct) {
      savedState.status[ct.ident] = ct.status;
      changed = changed || savedState.status[ct.ident] !== oldState.status[ct.ident];

      if (ct.nodeElt.hasClass('as-active')) {
        savedState.active.push(ct.ident);
      }

      visitArr(ct.children);
    });
  }

  var oldActive = (oldState.active || []).slice();
  oldActive.sort();
  var newActive = (savedState.active || []).slice();
  newActive.sort();
  changed = changed || oldActive.join('/') !== newActive.join('/');
  visitArr(this.rootController.children);
  this.savedState = savedState;
  if (changed) this.notifySavedStateChange();
};

TOCList.prototype.notifySavedStateChange = function () {
  this.emit('statechange', {
    target: this,
    type: 'statechange'
  }, this);
};

TOCList.prototype.loadSavedState = function (savedState) {
  savedState = savedState || {};
  if (typeof savedState.active === 'string') savedState.active = [savedState.active];
  this.savedState = {
    active: savedState.active || [],
    status: savedState.status || {}
  };
  this.applySavedState();
};
/***
 * @param {number=} n
 */


TOCList.prototype.openAllNodeRecursive = function (n) {
  this.rootController.openRecursive(n);
  this.saveState();
};

TOCList.prototype.closeAllNodeRecursive = function () {
  this.rootController.closeRecursive();
  this.saveState();
};

TOCList.prototype.deactivateAllNode = function () {
  this.rootController.deactivateRecursive();
};
/***
 *
 * @param ident
 * @returns {TOCNodeController|null}
 */


TOCList.prototype.activeNode = function (ident) {
  var nodeCt = this.findControllerByIdent(ident);
  var parent;

  if (nodeCt) {
    nodeCt.active();
    parent = nodeCt.parent;

    while (parent) {
      if (parent.open && parent.status === 'close') parent.open();
      parent = parent.parent;
    }

    setTimeout(() => {
      (0, _utils.vScrollIntoView)(nodeCt.nodeElt);
    }, 100);
  }

  return nodeCt;
};

TOCList.prototype.getActivatedNodes = function () {
  var res = [];
  this.rootController.traverse(function (node) {
    if (node.activated) {
      res.push(node);
    }
  });
  return res;
};
/***
 *
 * @param {string} ident
 * @param {TOCNodeController|TOCVirtualRootController=} rootController
 * @returns {TOCNodeController}
 */


TOCList.prototype.findControllerByIdent = function (ident, rootController) {
  var res = null;
  rootController = rootController || this.rootController;

  function visitArr(arr) {
    arr.some(function (ct) {
      if (ct.ident + '' === ident + '') {
        res = ct;
        return true;
      }

      visitArr(ct.children);
    });
  }

  visitArr(rootController.children);
  return res;
};

TOCList.prototype.makeNodeController = function (nodeData) {
  return new TOCNodeController(this, nodeData, null);
};
/**
 *
 * @param query
 * @private
 * @returns {TOCVirtualRootController}
 */


TOCList.prototype._calcSearch = function (query) {
  var searchRootController = this.searchCache[query];
  if (searchRootController) return searchRootController;
  var itemTree = this.searchCache.__itemTree__;

  if (!itemTree) {
    itemTree = this.nodes.map(function visit(node) {
      var item = (0, _search.default)({
        text: node.name,
        value: Object.assign({}, node)
      });

      if (node.children && node.children.length > 0) {
        item.items = node.children.map(visit);
      }

      return item;
    });
    this.searchCache.__itemTree__ = itemTree;
  }

  var resultItemTree = (0, _search.searchTreeListByText)(query, itemTree);
  var resultNodes = resultItemTree.map(function visit2(item) {
    var node = Object.assign({}, item.value);
    delete node.children;

    if (item.items && item.items.length > 0) {
      node.children = item.items.map(visit2);
    }

    return node;
  });
  this.searchCache[query] = new TOCVirtualRootController(this, resultNodes);
  return this.searchCache[query];
};

TOCList.prototype.search = function (query) {
  query = query || '';
  query = query.trim().replace('\s(\s+)', ' ');

  var searchRoot = this._calcSearch(query);

  var activeNodeCt;

  if (query.length === 0) {
    this.removeClass('as-searching');
    this.$searching.clearChild();
  } else {
    this.addClass('as-searching');
    this.$searching.clearChild();
    searchRoot.openRecursive();
    activeNodeCt = this.findControllerByIdent(this.savedState.active, searchRoot);
    if (activeNodeCt) activeNodeCt.active();
    searchRoot.view = this.$searching;
  }
};

TOCList.property = {};
TOCList.property.nodes = {
  /***
   * @this TOCList
   * @param nodes
   */
  set: function (nodes) {
    this.searchCache = {};
    nodes = nodes || [];
    this.rootController = new TOCVirtualRootController(this, nodes);
    this.rootController.view = this.$body;
    this.applySavedState();
  },
  get: function () {
    return this.rootController.nodes;
  }
};
TOCList.property.searchInput = {
  /***
   * @this TOCList
   */
  set: function (elt) {
    if (this.$searchInput) {
      this.$searchInput.off('stoptyping', this.eventHandler.searchTextInputModify);
    }

    this.$searchInput = elt;

    if (this.$searchInput) {
      this.$searchInput.on('stoptyping', this.eventHandler.searchTextInputModify);
    }
  },

  /***
   * @this TOCList
   */
  get: function () {
    return this.$searchInput;
  }
};
/***
 * @memberOf TOCList#
 * @type {{}}
 */

TOCList.eventHandler = {};

TOCList.eventHandler.pressNode = function (nodeController, event) {
  var newEvent = (0, _EventEmitter.copyEvent)(event.originalEvent || event, {
    type: 'pressnode',
    target: this,
    originalEvent: event.originalEvent || event,
    controller: nodeController,
    nodeData: nodeController.nodeElt.nodeData,
    nodeElt: nodeController.nodeElt
  });
  this.emit('pressnode', newEvent, this);
};

TOCList.eventHandler.checkedNodeChange = function (nodeController, event) {
  var newEvent = {
    type: 'checkednodechange',
    target: this,
    originalEvent: event.originalEvent || event,
    controller: nodeController,
    nodeData: nodeController.nodeElt.nodeData,
    nodeElt: nodeController.nodeElt
  };
  this.emit('checkednodechange', newEvent, this);
};

TOCList.eventHandler.pressNodeQuickMenu = function (nodeController, event) {
  var newEvent = {
    type: 'pressnodequickmmenu',
    target: this,
    originalEvent: event.originalEvent || event,
    controller: nodeController,
    nodeData: nodeController.nodeElt.nodeData,
    nodeElt: nodeController.nodeElt
  };

  newEvent.showMenu = function (menuProps, onSelect) {
    var token = _QuickMenu.default.show(nodeController.nodeElt.$quickMenuBtn, menuProps, [3, 4], onSelect, false);

    var blurTrigger = new _BlurTrigger.default([], 'click', function () {
      _QuickMenu.default.close(token);
    }, 10, 30);
  };

  this.emit('pressnodequickmmenu', newEvent, this);
};
/***
 * @this TOCList
 */


TOCList.eventHandler.searchTextInputModify = function () {
  this.search(this.$searchInput.value);
};

_ACore.default.install(TOCList);
/***
 *
 * @param {TOCList} listElt
 * @param {{}[]} nodes
 * @constructor
 */


function TOCVirtualRootController(listElt, nodes) {
  Object.defineProperties(this, {
    root: {
      value: this
    }
  });
  this.listElt = listElt;
  this.level = -1;
  this.nodes = nodes;
  /***
   *
   * @type {TOCNodeController[]}
   */

  this.children = nodes.map(function (nodeData) {
    return new TOCNodeController(listElt, nodeData, this);
  }.bind(this));
  this._view = null;
  /****
   * @type {AElement}
   * @name view
   * @memberOf TOCVirtualRootController#
   */
}

TOCVirtualRootController.prototype.deactivateRecursive = function () {
  this.children.forEach(function (ct) {});
};

TOCVirtualRootController.prototype.openRecursive = function (n) {
  this.children.forEach(function (ct) {
    ct.openRecursive(n);
  });
};

TOCVirtualRootController.prototype.closeRecursive = function () {
  this.children.forEach(function (ct) {
    ct.closeRecursive();
  });
};

TOCVirtualRootController.prototype.getViewElements = function () {
  var ac = [];
  this.children.forEach(function (ct) {
    ct.getViewElements(ac);
  });
  return ac;
};

TOCVirtualRootController.prototype.indexOfChild = function (child) {
  for (var i = 0; i < this.children.length; ++i) {
    if (child === this.children[i] || this.children[i].ident === child) return i;
  }

  return -1;
};
/***
 *
 * @param {TOCNodeController} controller
 * @param {TOCNodeController} at
 * @returns {TOCVirtualRootController}
 */


TOCVirtualRootController.prototype.addChildBefore = function (controller, at) {
  var atIdx;

  if (at) {
    atIdx = this.indexOfChild(at);

    if (atIdx >= 0) {
      if (controller.parent) controller.remove();
      this.children.splice(atIdx, 0, controller);
      controller.__parent__ = this;

      if (at.nodeElt.parentElement) {
        (0, _utils.addElementsBefore)(at.nodeElt.parentElement, controller.getViewElements(), at.nodeElt);
      }

      this.updateStatus();
    } else {
      throw new Error("The node before which the new node is to be inserted is not a child of this node.");
    }
  } else {
    if (controller.parent) controller.remove();
    this.children.push(controller);
    if (this.view) this.addChild(controller.getViewElements());
    this.updateStatus();
  }

  controller.setLevelRecursive(this.level + 1);
  return this;
};

TOCVirtualRootController.prototype.addChild = function (controller) {
  this.addChildBefore(controller, null);
  return this;
};
/***
 *
 * @param {TOCNodeController} controller
 * @param at
 */


TOCVirtualRootController.prototype.addChildAfter = function (controller, at) {
  var atIdx;
  var lastElement;

  if (at) {
    atIdx = this.indexOfChild(at);

    if (atIdx === this.children.length) {
      if (controller.parent) controller.remove();
      controller.__parent__ = this;
      this.children.push(controller);
      if (this.view) this.view.addChild(controller.getViewElements());
    } else if (atIdx >= 0) {
      if (controller.parent) controller.remove();
      controller.__parent__ = this;
      this.children.splice(atIdx, 0, controller);

      if (at.nodeElt.parentElement) {
        lastElement = at.getViewElements().pop();
        (0, _utils.addElementAfter)(at.nodeElt.parentElement, controller.getViewElements(), lastElement);
      }
    } else {
      throw new Error("The node before which the new node is to be inserted is not a child of this node.");
    }
  } else {
    if (controller.parent) controller.remove();
    controller.__parent__ = this;
    this.children.unshift(controller);
    (0, _utils.addElementAfter)(this.view, controller.getViewElements(), this.view.firstChild);
  }

  return this;
};

TOCVirtualRootController.prototype.updateStatus = _noop.default;
/***
 * @param {TOCNodeController} child
 * @returns {TOCVirtualRootController|TOCNodeController}
 */

TOCVirtualRootController.prototype.removeChild = function (child) {
  var idx = this.children.indexOf(child);

  if (idx >= 0) {
    this.children.splice(idx, 1);
    child.getViewElements().forEach(function (elt) {
      elt.remove();
    });
    this.updateStatus();
  }

  return this;
};
/***
 *
 * @param {function(nodeCt:TOCNodeController):(void|boolean)} callback return true to stop
 */


TOCVirtualRootController.prototype.traverse = function (callback) {
  this.children.some(function visit(ct) {
    return callback(ct) || ct.children.some(visit);
  });
};

Object.defineProperties(TOCVirtualRootController.prototype, {
  firstChild: {
    get: function () {
      return this.children[0] || null;
    }
  },
  lastChild: {
    get: function () {
      return this.children[this.children.length - 1] || null;
    }
  },
  view: {
    /***
     * @this TOCVirtualRootController
     * @param view
     */
    set: function (view) {
      view = view || null;
      if (view === this._view) return;

      if (this._view) {
        this._view.clearChild();

        this._view.rootController = null;
        this._view = null;
      }

      if (view) {
        if (view.rootController) {
          view.rootController.view = null;
        }

        view.rootController = this;
        this._view = view;

        this._view.addChild(this.getViewElements());
      }
    },
    get: function () {
      return this._view;
    }
  }
});
/***
 *
 * @param {TOCList} listElt
 * @param {{}} nodeData
 * @param {TOCNodeController|TOCVirtualRootController} parent
 * @constructor
 */

function TOCNodeController(listElt, nodeData, parent) {
  Object.defineProperties(this, {
    listElt: {
      value: listElt
    },
    __parent__: {
      value: parent,
      enumerable: false,
      writable: true
    }
  });
  this.level = parent ? parent.level + 1 : 0;
  /***
   * @type {TOCItem}
   */

  this.nodeElt = (0, _ACore._)({
    tag: _TOCItem.default.tag,
    props: {
      nodeData: nodeData,
      checked: !!nodeData.checked,
      name: nodeData.name,
      icon: nodeData.icon,
      level: this.level,
      controller: this,
      status: 'none'
    },
    on: {
      presstoggle: this.toggle.bind(this),
      press: this.ev_press.bind(this),
      checkedchange: this.ev_checkedChange.bind(this),
      pressquickmenu: this.ev_pressQuickMenu.bind(this)
    }
  });
  if (nodeData.hasQuickMenu === false) this.nodeElt.hasQuickMenu = false;
  this.nodeElt.on('presstoggle', this.listElt.saveState.bind(this.listElt));
  /***
   * @name children
   * @type {TOCNodeController[]}
   * @memberOf TOCNodeController#
   */

  if (nodeData.children && nodeData.children.length > 0) {
    this.nodeElt.status = 'close';
    this.children = nodeData.children.map(function (c) {
      return new TOCNodeController(listElt, c, this);
    }.bind(this));
  } else {
    this.children = [];
  }
}

TOCNodeController.prototype.indexOfChild = TOCVirtualRootController.prototype.indexOfChild;
TOCNodeController.prototype.traverse = TOCVirtualRootController.prototype.traverse;

TOCNodeController.prototype.updateStatus = function () {
  if (this.children.length === 0 && this.nodeElt.status !== 'none') {
    this.nodeElt.status = 'none';
  } else if (this.children.length > 0 && this.nodeElt.status === 'none') {
    this.nodeElt.status = 'close';
  }
};

TOCNodeController.prototype.deactivateRecursive = function () {
  this.nodeElt.removeClass('as-active');
  this.children.forEach(function (ct) {
    ct.deactivateRecursive();
  });
};

TOCNodeController.prototype.removeChild = TOCVirtualRootController.prototype.removeChild;

TOCNodeController.prototype.remove = function () {
  this.parent.removeChild(this);
};
/***
 *
 * @param {TOCNodeController} controller
 * @param {TOCNodeController} at
 * @returns {TOCNodeController}
 */


TOCNodeController.prototype.addChildBefore = function (controller, at) {
  var atIdx;

  if (at) {
    atIdx = this.indexOfChild(at);

    if (atIdx >= 0) {
      if (controller.parent) controller.remove();
      this.children.splice(atIdx, 0, controller);
      controller.__parent__ = this;

      if (this.status === 'open') {
        (0, _utils.addElementsBefore)(this.nodeElt.parentElement, controller.getViewElements(), at.nodeElt);
      }

      controller.setLevelRecursive(this.level + 1);
      this.updateStatus();
    } else {
      throw new Error("The node before which the new node is to be inserted is not a child of this node.");
    }
  } else {
    if (controller.parent) controller.remove();
    this.children.push(controller);
    this.updateStatus();

    if (this.status === "open") {
      (0, _utils.addElementsBefore)(this.nodeElt.parentElement, controller.getViewElements(), at.nodeElt);
    }
  }

  return this;
};

TOCNodeController.prototype.addChild = TOCVirtualRootController.prototype.addChild;

TOCNodeController.prototype.addChildAfter = function (controller, at) {
  throw new Error("Not implement!");
};

TOCNodeController.prototype.toggle = function () {
  if (this.status === 'close') this.open();else if (this.status === 'open') this.close();
};

TOCNodeController.prototype.open = function () {
  if (this.status !== 'close') return;
  this.nodeElt.status = 'open';
  var pE = this.nodeElt.parentElement;
  if (!pE) return;
  var veArr = this.getViewElements();
  veArr.shift();
  var at = pE.findChildAfter(this.nodeElt);

  if (at) {
    while (veArr.length > 0) {
      pE.addChildBefore(veArr.shift(), at);
    }
  } else {
    pE.addChild(veArr);
  }
};

TOCNodeController.prototype.close = function () {
  if (this.status !== 'open') return;
  var veArr = this.getViewElements();
  veArr.shift();

  while (veArr.length > 0) {
    veArr.pop().remove();
  }

  this.nodeElt.status = 'close';
};

TOCNodeController.prototype.getViewElements = function (ac) {
  if (ac === undefined) ac = [];
  ac.push(this.nodeElt);

  if (this.status === 'open' && this.children.length > 0) {
    this.children.forEach(function (ct) {
      ct.getViewElements(ac);
    });
  }

  return ac;
};

TOCNodeController.prototype.setLevelRecursive = function (value) {
  this.level = value;
  this.nodeElt.level = value;
  this.children.forEach(function (ct) {
    ct.setLevelRecursive(value + 1);
  });
};
/**
 *
 * @param {number=} level
 */


TOCNodeController.prototype.openRecursive = function (level) {
  if (typeof level === "number" && this.level >= level) return;

  if (this.status === 'close') {
    this.open();
  }

  this.children.forEach(function (ct) {
    ct.openRecursive(level);
  });
};

TOCNodeController.prototype.ev_press = function (event) {
  this.listElt.eventHandler.pressNode(this, event);
};

TOCNodeController.prototype.ev_checkedChange = function (event) {
  this.nodeElt.nodeData.checked = this.nodeElt.checked;
  this.listElt.eventHandler.checkedNodeChange(this, event);
};

TOCNodeController.prototype.ev_pressQuickMenu = function (event) {
  this.listElt.eventHandler.pressNodeQuickMenu(this, event);
};

TOCNodeController.prototype.ev_renameFinish = function (event) {};

TOCNodeController.prototype.closeRecursive = function () {
  if (this.status === 'open') {
    this.close();
  }

  this.children.forEach(function (ct) {
    ct.closeRecursive();
  });
};

TOCNodeController.prototype.rename = function () {};
/***
 *
 * @param {boolean=true} isActive default: true
 * @param {boolean=false} append default: false
 */


TOCNodeController.prototype.active = function (isActive, append) {
  var self = this;
  if (arguments.length === 0) isActive = true;
  append = !!append;
  var idx = this.listElt.savedState.active ? this.listElt.savedState.active.indexOf(this.ident) : -1;

  if (isActive) {
    this.root.traverse(function (ct) {
      if (ct === self) {
        ct.nodeElt.addClass('as-active');
      } else if (!append) ct.nodeElt.removeClass('as-active');
    });

    if (idx < 0) {
      this.listElt.savedState.active = this.listElt.savedState.active || [];

      if (append) {
        this.listElt.savedState.active.push(this.ident);
      } else {
        this.listElt.savedState.active = [this.ident];
      }

      this.listElt.notifySavedStateChange();
    }
  } else {
    if (idx >= 0) {
      if (append) {
        this.listElt.savedState.active.splice(idx, 1);
        this.nodeElt.removeClass('as-active');
      } else {
        this.listElt.savedState.active = [];
        this.root.traverse(function (ct) {
          ct.nodeElt.removeClass('as-active');
        });
      }
    }
  }
};

Object.defineProperties(TOCNodeController.prototype, {
  /***
   * @memberOf TOCNodeController#
   * @name status
   * @type {"open"|"close"|"none"}
   */
  status: {
    get: function () {
      return this.nodeElt.status;
    },
    set: function (value) {
      if (value === 'open' && this.nodeElt.status === 'close') this.open();else if (value === 'close' && this.nodeElt.status === 'open') this.close();
    }
  },
  root: {
    get: function () {
      return this.parent ? this.parent.root : this;
    }
  },
  checked: {
    get: function () {
      return !!this.nodeElt.nodeData.checked;
    },
    set: function (value) {
      this.nodeElt.checked = !!value;
      this.nodeElt.nodeData.checked = !!value;
    }
  },
  name: {
    set: function (value) {
      value = value || '';
      this.nodeElt.name = value;
      this.nodeElt.nodeData.name = value;
    },
    get: function () {
      return this.nodeElt.nodeData.name;
    }
  },
  ident: {
    get: function () {
      return this.nodeElt.nodeData.ident;
    },
    set: function (value) {
      this.nodeElt.nodeData.ident = value;
    }
  },
  nodeData: {
    get: function () {
      return this.nodeElt.nodeData;
    },
    set: function (value) {
      this.nodeElt.nodeData = value;
    }
  },
  parent: {
    get: function () {
      return this.__parent__;
    }
  },
  firstChild: {
    get: function () {
      return this.children[0] || null;
    }
  },
  lastChild: {
    get: function () {
      return this.children[this.children.length - 1] || null;
    }
  },
  activated: {
    get: function () {
      return this.nodeElt.hasClass('as-active');
    }
  }
});
var _default = TOCList;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/ckcontentstyle.css.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/ckcontentstyle.css.tpl ***/
module.exports = "\r\n.as-ck-alert {\r\n    padding: .75rem 1.25rem;\r\n    margin-bottom: 1rem;\r\n    border: 1px solid transparent;\r\n    border-radius: .188rem;\r\n}\r\n\r\n.as-ck-alert.as-variant-notice {\r\n    color: #7b5700;\r\n    background-color: #fbedcc;\r\n    border-color: #fae6b8;\r\n}\r\n\r\n.as-ck-alert.as-variant-warning {\r\n    color: #852d19;\r\n    background-color: #ffddd6;\r\n    border-color: #ffd0c5;\r\n}\r\n\r\n.as-ck-alert.as-variant-info {\r\n    color: #352c64;\r\n    background-color: #e0ddf2;\r\n    border-color: #d4cfed;\r\n}\r\n\r\n.as-ck-alert.as-variant-success {\r\n    color: #2a601f;\r\n    background-color: #dcf1d8;\r\n    border-color: #ceebc8;\r\n}\r\n\r\n\r\n.cke_contents_ltr ul {\r\n    list-style: none;\r\n}\r\n\r\n.cke_contents_ltr ul li {\r\n    position: relative;\r\n}\r\n\r\n.cke_contents_ltr ul li::before {\r\n    color: #007bff;\r\n    content: '●';\r\n    position: absolute;\r\n    left: -1.2em;\r\n    top: -0.1em;\r\n    display: inline-block;\r\n}\r\n\r\n.cke_contents_ltr thead {\r\n    background-color: #d6d6d6;\r\n\r\n}\r\n\r\n.cke_contents_ltr table {\r\n    border-collapse: collapse;\r\n}\r\n\r\n.cke_contents_ltr table[align=\"center\"] {\r\n    margin-left: auto;\r\n    margin-right: auto;\r\n}\r\n\r\n.cke_contents_ltr table[align=\"right\"] {\r\n    margin-left: auto;\r\n}\r\n\r\n\r\n.cke_contents_ltr thead td {\r\n    padding: 10px;\r\n    border: 1px solid #efefef;\r\n    font-weight: bold;\r\n}\r\n\r\n.cke_contents_ltr thead td:last-child {\r\n    border-right-color: #dddddd;\r\n}\r\n\r\n\r\n.cke_contents_ltr thead td:first-child {\r\n    border-left-color: #dddddd;\r\n}\r\n\r\n\r\n.cke_contents_ltr tbody td {\r\n\r\n}\r\n\r\n.cke_contents_ltr tbody tr:nth-child(odd) {\r\n    background-color: rgb(245, 245, 245);\r\n}\r\n\r\n.cke_contents_ltr tbody tr:nth-child(even) {\r\n    background-color: white;\r\n}\r\n\r\n.cke_contents_ltr tbody td {\r\n    padding: 5px;\r\n    border: 1px solid #ddd;\r\n}\r\n\r\n\r\n.cke_button_icon.cke_button__insert_expression_icon {\r\n    background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiICB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgIDxwYXRoIGZpbGw9IiMwMDAwMDAiIGQ9Ik01LDNIN1Y1SDVWMTBBMiwyIDAgMCwxIDMsMTJBMiwyIDAgMCwxIDUsMTRWMTlIN1YyMUg1QzMuOTMsMjAuNzMgMywyMC4xIDMsMTlWMTVBMiwyIDAgMCwwIDEsMTNIMFYxMUgxQTIsMiAwIDAsMCAzLDlWNUEyLDIgMCAwLDEgNSwzTTE5LDNBMiwyIDAgMCwxIDIxLDVWOUEyLDIgMCAwLDAgMjMsMTFIMjRWMTNIMjNBMiwyIDAgMCwwIDIxLDE1VjE5QTIsMiAwIDAsMSAxOSwyMUgxN1YxOUgxOVYxNEEyLDIgMCAwLDEgMjEsMTJBMiwyIDAgMCwxIDE5LDEwVjVIMTdWM0gxOU0xMiwxNUExLDEgMCAwLDEgMTMsMTZBMSwxIDAgMCwxIDEyLDE3QTEsMSAwIDAsMSAxMSwxNkExLDEgMCAwLDEgMTIsMTVNOCwxNUExLDEgMCAwLDEgOSwxNkExLDEgMCAwLDEgOCwxN0ExLDEgMCAwLDEgNywxNkExLDEgMCAwLDEgOCwxNU0xNiwxNUExLDEgMCAwLDEgMTcsMTZBMSwxIDAgMCwxIDE2LDE3QTEsMSAwIDAsMSAxNSwxNkExLDEgMCAwLDEgMTYsMTVaIiAvPgo8L3N2Zz4=');\r\n    background-position: 0 0px;\r\n    background-size: 16px;\r\n}\r\n\r\n.cke_button_icon.cke_button__insert_variable_icon {\r\n    background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiICB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgIDxwYXRoIGZpbGw9IiMwMDAwMDAiIGQ9Ik0yMC40MSwzQzIxLjgsNS43MSAyMi4zNSw4Ljg0IDIyLDEyQzIxLjgsMTUuMTYgMjAuNywxOC4yOSAxOC44MywyMUwxNy4zLDIwQzE4LjkxLDE3LjU3IDE5Ljg1LDE0LjggMjAsMTJDMjAuMzQsOS4yIDE5Ljg5LDYuNDMgMTguNyw0TDIwLjQxLDNNNS4xNywzTDYuNyw0QzUuMDksNi40MyA0LjE1LDkuMiA0LDEyQzMuNjYsMTQuOCA0LjEyLDE3LjU3IDUuMywyMEwzLjYxLDIxQzIuMjEsMTguMjkgMS42NSwxNS4xNyAyLDEyQzIuMiw4Ljg0IDMuMyw1LjcxIDUuMTcsM00xMi4wOCwxMC42OEwxNC40LDcuNDVIMTYuOTNMMTMuMTUsMTIuNDVMMTUuMzUsMTcuMzdIMTMuMDlMMTEuNzEsMTRMOS4yOCwxNy4zM0g2Ljc2TDEwLjY2LDEyLjIxTDguNTMsNy40NUgxMC44TDEyLjA4LDEwLjY4WiIgLz4KPC9zdmc+');\r\n    background-position: 0 0px;\r\n    background-size: 16px;\r\n}\r\n\r\n.cke_button_icon.cke_button__insert_dynamic_link_icon {\r\n    background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiICB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgIDxwYXRoIGZpbGw9IiMwMDAwMDAiIGQ9Ik0zIDFDMS44OSAxIDEgMS44OSAxIDNWMTRDMSAxNS4xMSAxLjg5IDE2IDMgMTZIMTRDMTUuMTEgMTYgMTYgMTUuMTEgMTYgMTRWMTFIMTRWMTRIM1YzSDE0VjVIMTZWM0MxNiAxLjg5IDE1LjExIDEgMTQgMU05IDdDNy44OSA3IDcgNy44OSA3IDlWMTJIOVY5SDIwVjIwSDlWMThIN1YyMEM3IDIxLjExIDcuODkgMjIgOSAyMkgyMEMyMS4xMSAyMiAyMiAyMS4xMSAyMiAyMFY5QzIyIDcuODkgMjEuMTEgNyAyMCA3SDkiIC8+Cjwvc3ZnPg==');\r\n    background-position: 0 0px;\r\n    background-size: 16px;\r\n}\r\n\r\n\r\n.as-ck-widget-expression {\r\n    color: #1da1ff;\r\n}\r\n\r\n.as-ck-widget-variable {\r\n    color: #144f25;\r\n}\r\n\r\n\r\n.cke_button__image_mgn_dialog_icon {\r\n    background: url($basePath/plugins/icons.png) no-repeat 0 -960px !important;\r\n}\r\n\r\n\r\n.bsc-white .cke_contents_ltr h1,\r\n.bsc-white .cke_contents_ltr h2,\r\n.bsc-white .cke_contents_ltr h3,\r\n.bsc-white .cke_contents_ltr h4,\r\n.bsc-white .cke_contents_ltr h5,\r\n.bsc-white .cke_contents_ltr h6 {\r\n    font-weight: normal;\r\n    line-height: 1.2;\r\n}\r\n\r\n.bsc-white .cke_contents_ltr p {\r\n    line-height: 1.6;\r\n}";

};

moduleFactories["node_modules/absol-acomp/js/ckeditor/ExpressionExtension.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/ExpressionExtension.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _TemplateString = _interopRequireDefault(require("absol/src/JSMaker/TemplateString"));


var name = 'expression';
var command = 'insert_expression';

function init(editor) {
  editor.widgets.add(name, {
    button: 'Create Expression',
    template: '<span class="as-ck-widget-expression">&#0123;&#0123; expression &#0125;&#0125;</span>',
    allowedContent: 'span(!as-ck-widget-expression)',
    requiredContent: 'span(as-ck-widget-expression)',
    upcast: function (element) {
      return element.name === 'span' && element.hasClass('as-ck-widget-expression');
    }
  });
  editor.ui.addButton(command, {
    label: 'Insert expression',
    command: command
  });
  editor.addCommand(command, {
    exec: function (editor) {
      if (editor.placeHolderElt) {
        editor.placeHolderElt.emit('command', {
          command: command,
          target: editor,
          type: 'command'
        });
      }
    }
  });
}

var parserDiv = (0, _ACore._)('div');

function explicit(data, placeHolderElt) {
  parserDiv.innerHTML = data;
  (0, _ACore.$$)('.as-ck-widget-expression', parserDiv).forEach(function (elt) {
    var text = elt.innerHTML;
    text.replace(/&#0123;/g, '{').replace(/&#0125;/g, '}');
    elt.parentElement.replaceChild((0, _ACore._)({
      text: text
    }), elt);
  });
  return parserDiv.innerHTML;
}

function implicit(data, placeHolderElt) {
  var template = _TemplateString.default.parse(data);

  return template.parts.slice().map(function (part) {
    if (part.type === 1) {
      return '<span class="as-ck-widget-expression">&#0123;&#0123; ' + part.data.trim() + ' &#0125;&#0125;</span>';
    } else return part.data;
  }).join('');
}

var _default = {
  name: name,
  command: command,
  implicit: implicit,
  explicit: explicit,
  plugin: {
    requires: 'widget',
    init: init
  },
  extendMethods: {
    /***
     * @this CKPlaceholder
     * @memberOf CKPlaceholder#
     * @param expression
     *
     */
    insertExpression: function (expression) {
      this.editor.insertHtml('<span class="as-ck-widget-expression">&#0123;&#0123; ' + expression.trim() + ' &#0125;&#0125;</span>');
    },
    getSelectedExpression: function () {
      var sel = this.editor.getSelection();
      if (!sel) return null;
      var elt = sel.getSelectedElement();
      if (!elt) return null;
      if (!elt.hasClass('cke_widget_wrapper_as-ck-widget-expression')) return null;
      var exp = elt.getText();
      exp = exp.replace(/&#0123;|&#0125;|\{|\}/g, '').trim();
      return exp;
    }
  }
};
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/SimpleTextExtension.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/SimpleTextExtension.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var name = 'simple_text';
var parserDiv = (0, _ACore._)('div');

function explicit(data, placeHolderElt) {
  parserDiv.innerHTML = data.replace(/&nbsp;/g, ' ');
  return parserDiv.innerText;
}

function implicit(data, placeHolderElt) {
  return data //.replace(/</g, '&lt;').replace(/</g, '&gt;').replace(/"/g, '&quot;').replace(/&/g, '&amp;')
  .replace(/[\r\n]/g, '');
}

var _default = {
  name: name,
  implicit: implicit,
  explicit: explicit
};
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/VariableExtension.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/VariableExtension.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _TemplateString = _interopRequireDefault(require("absol/src/JSMaker/TemplateString"));


var name = 'variable';
var command = 'insert_variable';

function init(editor) {
  editor.widgets.add(name, {
    button: 'Create Variable',
    template: '<span class="as-ck-widget-variable" title="variable">variable</span>',
    allowedContent: 'span(!as-ck-widget-variable)',
    requiredContent: 'span(as-ck-widget-variable)',
    upcast: function (element) {
      return element.name === 'span' && element.hasClass('as-ck-widget-variable');
    }
  });
  editor.ui.addButton(command, {
    label: 'Insert Variable',
    command: command
  });
  editor.addCommand(command, {
    exec: function (editor) {
      if (editor.placeHolderElt) {
        editor.placeHolderElt.emit('command', {
          command: command,
          target: editor,
          type: 'command'
        });
      }
    }
  });
}

var parserDiv = (0, _ACore._)('div');

function explicit(data, placeHolderElt) {
  parserDiv.innerHTML = data;
  (0, _ACore.$$)('.as-ck-widget-variable', parserDiv).forEach(function (elt) {
    var text = elt.innerHTML;
    elt.parentElement.replaceChild((0, _ACore._)({
      text: text
    }), elt);
  });
  return parserDiv.innerHTML;
}

var tokenRgx = /("([^\\"]|(\\.))*")|([a-zA-Z_$A-Z]([a-zA-Z_$A-Z0-9]*))/g;

function implicit(data, placeHolderElt) {
  data = (data || '') + '';
  data = data.replace(tokenRgx, function (full, isString, u1, u2, isIdent) {
    if (isIdent && placeHolderElt.variables && placeHolderElt.variables[isIdent]) {
      return placeHolderElt.makeVariableHtml(isIdent);
    } else return full;
  });
  return data;
}

var _default = {
  name: name,
  command: command,
  implicit: implicit,
  explicit: explicit,
  plugin: {
    requires: 'widget',
    init: init
  },
  extendMethods: {
    makeVariableHtml: function (variable, text) {
      variable = variable.trim();

      if (this.variables && this.variables[variable]) {
        text = this.variables[variable].text;
      }

      text = text || variable;
      return '<span class="as-ck-widget-variable"  title="' + text + '">' + variable.trim() + '</span>';
    },

    /***
     * @this CKPlaceholder
     * @memberOf CKPlaceholder#
     * @param variable
     *
     */
    insertVariable: function (variable, text) {
      this.editor.insertHtml(this.makeVariableHtml(variable, text));
    },
    getSelectedVariable: function () {
      var sel = this.editor.getSelection();
      if (!sel) return null;
      var elt = sel.getSelectedElement();
      if (!elt) return null;
      if (!elt.hasClass('cke_widget_wrapper_as-ck-widget-variable')) return null;
      var exp = elt.getText();
      exp = exp.trim();
      return exp;
    }
  }
};
/***
 * @name variables
 * @type {{}}
 * @memberOf CKPlaceholder#
 */

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/DynamicLinkExtension.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/DynamicLinkExtension.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var name = 'dynamic_link';
var command = 'insert_dynamic_link';

function init(editor) {
  editor.widgets.add(name, {
    button: 'Create Dynamic Link',
    template: '<a class="as-ck-widget-dynamic-link" data-link-id="1234" href="https://absol.cf">absol.cf</a>',
    allowedContent: 'a(!as-ck-widget-dynamic-link)',
    requiredContent: 'a(as-ck-widget-dynamic-link)',
    upcast: function (element) {
      return element.name === 'a' && element.hasClass('as-ck-widget-dynamic-link');
    }
  });
  editor.ui.addButton(command, {
    label: 'Insert Dynamic Link',
    command: command
  });
  editor.addCommand(command, {
    exec: function (editor) {
      if (editor.placeHolderElt) {
        editor.placeHolderElt.emit('command', {
          command: command,
          target: editor,
          type: 'command'
        });
      }
    }
  });
}

var parserDiv = (0, _ACore._)('div');

function explicit(data, placeHolderElt) {
  parserDiv.innerHTML = data;
  (0, _ACore.$$)('.as-ck-widget-dynamic-link', parserDiv).forEach(function (elt) {});
  return parserDiv.innerHTML;
}

function implicit(data, placeHolderElt) {
  parserDiv.innerHTML = data;
  (0, _ACore.$$)('.as-ck-widget-dynamic-link', parserDiv).forEach(function (elt) {
    var id = elt.getAttribute('data-link-id');
    var info = placeHolderElt.dynamicLinks && placeHolderElt.dynamicLinks[id];

    if (info) {
      elt.setAttribute('href', info.href);
      elt.innerHTML = info.text || info.href;
    }
  });
  return parserDiv.innerHTML;
}

var _default = {
  name: name,
  command: command,
  implicit: implicit,
  explicit: explicit,
  plugin: {
    requires: 'widget',
    init: init
  },
  extendMethods: {
    /***
     * @this CKPlaceholder
     * @memberOf CKPlaceholder#
     * @param {string} id
     * @param {string=} href
     * @param {string=} text
     *
     */
    insertDynamicLink: function (id, href, text) {
      var info = this.dynamicLinks && this.dynamicLinks[id] || {
        href: '.',
        text: 'undefined'
      };

      if (!href) {
        href = info.href;
      }

      if (!text) {
        text = info.text;
      }

      this.editor.insertHtml('<a class="as-ck-widget-dynamic-link" data-link-id="' + id + '" href="' + href + '">' + text + '</a>');
    },
    getSelectedDynamicLink: function () {
      var sel = this.editor.getSelection();
      if (!sel) return null;
      var elt = sel.getSelectedElement();
      if (!elt) return null;
      if (!elt.hasClass('cke_widget_wrapper_as-ck-widget-dynamic-link')) return null;
      return elt.$.firstChild && elt.$.firstChild.getAttribute('data-link-id') || null;
    }
  }
};
/***
 * @name dynamicLinks
 * @type {{}}
 * @memberOf CKPlaceholder#
 */

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/ImageFileExtension.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/ImageFileExtension.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var name = 'image_mgn';
var command = 'image_mgn_dialog';

function init(editor) {
  editor.ui.addButton(command, {
    label: 'Insert Image',
    command: command
  });
  editor.addCommand(command, {
    exec: function (editor) {
      if (window.contentModule && window.contentModule.chooseFile) {
        window.contentModule.chooseFile({
          type: "image_file"
        }).then(function (result) {
          if (result instanceof Array) result = result[0];

          if (result) {
            editor.insertHtml('<img alt="' + (result.title || result.name) + '" src="' + result.url + '" />');
          }
        }.bind(this));
      }
    }
  });
}

function explicit(data, placeHolderElt) {
  return data;
}

var tokenRgx = /("([^\\"]|(\\.))*")|([a-zA-Z_$A-Z]([a-zA-Z_$A-Z0-9]*))/g;

function implicit(data, placeHolderElt) {
  return data;
}

var _default = {
  name: name,
  command: command,
  // implicit: implicit,
  // explicit: explicit,
  plugin: {
    init: init
  }
};
/***
 * @name variables
 * @type {{}}
 * @memberOf CKPlaceholder#
 */

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/videourldialog/videoUtils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/videourldialog/videoUtils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseVideoUrl = parseVideoUrl;
exports.default = getEmbedVideoInfo;
exports.getVideoFileHeader = getVideoFileHeader;
exports.getVideoPreview = getVideoPreview;

var _ACore = require("../../ACore");

var _FileSaver = require("absol/src/Network/FileSaver");

var videoUrlRules = [['youtube', /^https:\/\/www.youtube.com\//, /[^a-zAZ]v=([^&]+)/, o => 'https://www.youtube.com/embed/' + o.videoId], ['youtube', /^https:\/\/www.youtube.com\/embed\//, /^https:\/\/www.youtube.com\/embed\/([^&\/]+)/, o => o.url, o => 'https://www.youtube.com/watch?v=' + o.videoId], ['vimeo', /^https:\/\/vimeo.com\//, /vimeo.com\/([0-9A-Za-z_]+)/, o => 'https://player.vimeo.com/video/' + o.videoId], ['dailymotion', /^https:\/\/www.dailymotion.com\/video\//, /dailymotion\.com\/video\/([0-9A-Za-z_]+)/, o => 'https://www.dailymotion.com/embed/video/' + o.videoId], ['facebook', /^https:\/\/www.facebook.com\/watch/, /[^a-zAZ]v=([^&]+)/, o => 'https://www.facebook.com/plugins/video.php?height=315&width=560&show_text=false&t=0&href=' + encodeURIComponent(o.url), o => o.embedUrl],
/* INVAID VIDEO ID   */
['youtube', /^https:\/\/www.youtube.com(\/|$)/, 'INVALID_URL'], ['vimeo', /^https:\/\/vimeo.com(\/|$)/, /vimeo.com\/([0-9A-Za-z_]+)/, 'INVALID_URL'], ['dailymotion', /^https:\/\/www.dailymotion.com(\/|$)/, null], ['facebook', /^https:\/\/www.facebook.com/, 'INVALID_URL'],
/********************/
['*', /./, /\/([^\/]+)$/, o => o.url]];

function parseVideoUrl(url) {
  var res = {
    url: url
  };
  videoUrlRules.some(rule => {
    var matched = url.match(rule[1]);
    if (!matched) return false;
    res.hostType = rule[0];

    if (rule[2] instanceof RegExp) {
      matched = url.match(rule[2]);
      if (!matched) return false;
      res.videoId = matched[1];
    } else if (rule[2] === 'INVALID_URL') {
      res.videoId = "INVALID_URL";
    }

    if (res.videoId !== 'INVALID_URL') {
      res.embedUrl = rule[3](res);
    }

    if (typeof rule[4] === "function") {
      res.originalUrl = rule[4](res);
    } else {
      res.originalUrl = res.url;
    }

    return true;
  });
  return res;
}

var embedVideoSizeCache = {};
var metaRules = [['width', 'og:video:width', /content\s*=\s*"([0-9]+)/, 'number'], ['height', 'og:video:height', /content\s*=\s*"([0-9]+)/, 'number'], ['title', 'og:title', /content\s*=\s*"([^"]+)/, s => s.replace(/\s*-\s*Video Dailymotion$/, '')], ['image', 'og:image', /content\s*=\s*"([^"]+)/], ['width', /^video\s/, /width\s*=\s*"([0-9]+)/, 'number', true], ['height', /^video\s/, /height\s*=\s*"([0-9]+)/, 'number', true], ['image', /^img/, /src\s*=\s*"([^"]+)/, x => x.replace(/&amp;/g, '&')], ['title', "a href=\"https://www.facebook.com/watch", />([^<]+)/]];

function getEmbedVideoInfo(url, fullPage) {
  // fullPage = false;
  var xUrl = fullPage ? 'https://absol.cf/getpage.php?url=' : 'https://absol.cf/getpagemeta.php?url=';
  embedVideoSizeCache[url] = embedVideoSizeCache[url] || fetch(xUrl + encodeURIComponent(url)).then(res => res.text()).then(metaText => {
    if (metaText === 'DOWNLOAD_ERROR') return {
      error: metaText
    };
    var lines = metaText.replace(/\n|(>\s*<)/g, '__spliter__').split('__spliter__');
    var res = {};
    lines.forEach(line => {
      metaRules.some(rule => {
        var key = rule[0];
        if (key in res) return false;
        var matched;

        if (rule[1] instanceof RegExp) {
          matched = line.match(rule[1]);
          if (!matched) return false;
        } else if (typeof rule[1] === "string") {
          if (line.indexOf(rule[1]) < 0) return false;
        }

        matched = line.match(rule[2]);
        if (!matched) return false;
        var value = matched[1];

        if (rule[3] === 'number') {
          value = parseFloat(value);
          if (isNaN(value)) return false;
        } else if (typeof rule[3] === "function") {
          value = rule[3](value);
        }

        res[key] = value;
        if (rule[4]) return false;
        return true;
      });
    });
    return res;
  });
  return embedVideoSizeCache[url];
}

var videoFileHeaderInfoCache = {};

function getVideoFileHeader(url) {
  videoFileHeaderInfoCache[url] = videoFileHeaderInfoCache[url] || new Promise(resolve => {
    var xhr = new XMLHttpRequest();
    xhr.open('HEAD', url, true);

    xhr.onreadystatechange = function () {
      if (this.readyState === 4) {
        if (this.status === 200) {
          var res = {
            type: xhr.getResponseHeader('Content-Type')
          };
          var title;
          var header = xhr.getAllResponseHeaders();

          if (header && (header.indexOf('inline') !== -1 || header.indexOf('attachment') !== -1)) {
            var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
            var matches = filenameRegex.exec(header);

            if (matches != null && matches[1]) {
              title = matches[1].replace(/['"]/g, '');
            }
          } else {
            title = url.split('/').filter(x => !!x).pop() || '';
            title = title.split('?').shift();
            title = decodeURIComponent(title);
          }

          if (title) res.title = title;
          resolve(res);
        } else {
          resolve({
            error: "STATUS_" + this.status
          });
        }
      }
    };

    xhr.send();
  });
  return videoFileHeaderInfoCache[url];
}

function getVideoPreview(url) {
  return new Promise((resolve, reject) => {
    var renderDiv = (0, _ACore._)({
      style: {
        position: 'fixed',
        left: 0,
        top: 0,
        overflow: 'hidden',
        'z-index': -1000,
        pointerEvents: 'none',
        visibility: 'hidden'
      }
    }).addTo(document.body);
    var videoElt = (0, _ACore._)({
      tag: 'video',
      attr: {
        crossorigin: "anonymous",
        crossOrigin: "anonymous",
        preload: 'metadata',
        src: url
      },
      on: {
        loadeddata: function () {
          clearTimeout(timeout);
          var scale = Math.min(200, videoElt.videoWidth, videoElt.videoHeight) / videoElt.videoWidth;
          var cWidth = Math.ceil(videoElt.videoWidth * scale);
          var cHeight = Math.ceil(videoElt.videoHeight * scale);
          var canvas = (0, _ACore._)({
            tag: 'canvas',
            attr: {
              width: cWidth + 'px',
              height: cHeight + 'px'
            }
          }).addTo(renderDiv);
          var ctx = canvas.getContext('2d');
          ctx.drawImage(videoElt, 0, 0, cWidth, cHeight);
          var image = canvas.toDataURL('image/jpeg', 0.1);
          renderDiv.remove();
          resolve({
            width: videoElt.videoWidth,
            height: videoElt.videoHeight,
            image: image
          });
        },
        error: function () {
          clearTimeout(timeout);
          renderDiv.remove();
          reject();
        }
      }
    });
    renderDiv.addChild(videoElt);
    videoElt.currentTime = 0.1;
    var timeout = setTimeout(() => {
      renderDiv.remove();
      reject();
    }, 5000);
  });
}
};

moduleFactories["node_modules/absol-acomp/js/videourldialog/VideoUrlDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/videourldialog/VideoUrlDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.openVideUrlDialog = openVideUrlDialog;
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Modal = _interopRequireDefault(require("../Modal"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _ACore = require("../../ACore");

var _MessageDialog = _interopRequireDefault(require("../MessageDialog"));

require("../../css/videourldialog.css");

var _videoUtils = _interopRequireWildcard(require("./videoUtils"));

var _utils = require("../utils");




/***
 * @extends Fragment
 * @constructor
 */
function VideoUrlDialog() {
  _Fragment.default.call(this);

  this.task = null;
  this.pendingResult = null;
  Object.keys(VideoUrlDialog.prototype).filter(key => key.startsWith('ev_')).forEach(key => {
    this[key] = this[key].bind(this);
  });
}

_OOP.default.mixClass(VideoUrlDialog, _Fragment.default);

VideoUrlDialog.prototype.cache = {};

VideoUrlDialog.prototype.createView = function () {
  this.$view = (0, _ACore._)({
    tag: _Modal.default.tag,
    class: 'as-video-url-dialog-modal',
    child: {
      tag: _MessageDialog.default.tag,
      class: 'as-video-url-dialog',
      props: {
        dialogTitle: 'Video',
        dialogActions: [{
          text: 'OK',
          name: 'ok'
        }, {
          text: 'Cancel',
          name: 'cancel'
        }]
      },
      child: [{
        class: 'as-video-url-dialog-row',
        child: [{
          tag: 'label',
          child: {
            text: 'URL*'
          }
        }, {
          tag: 'input',
          attr: {
            type: 'text'
          },
          class: ['as-video-url-dialog-url', 'as-text-input']
        }]
      }, {
        class: 'as-video-url-dialog-row',
        child: [{
          tag: 'label',
          child: {
            text: 'Video Info'
          }
        }, {
          tag: 'span',
          class: ['as-video-url-dialog-video-info']
        }]
      }, {
        class: 'as-video-url-dialog-row',
        child: [{
          tag: 'label',
          child: {
            text: 'Display Size'
          }
        }, {
          tag: 'input',
          class: ['as-text-input', 'as-video-url-dialog-width'],
          attr: {
            type: 'number',
            min: '4'
          }
        }, {
          tag: 'span',
          child: {
            text: ' x '
          }
        }, {
          tag: 'input',
          class: ['as-text-input', 'as-video-url-dialog-height'],
          attr: {
            type: 'number',
            min: '3'
          }
        }, {
          tag: 'checkbox',
          style: {
            marginLeft: '1em'
          },
          props: {
            text: 'keep ratio'
          }
        }]
      }, {
        class: 'as-video-url-dialog-row',
        child: [{
          tag: 'label',
          child: {
            text: 'Preview'
          }
        }, {
          tag: 'img',
          class: 'as-video-url-dialog-video-image'
        }]
      }]
    }
  });
  var keyTimeout = -1;
  this.$urlInput = (0, _ACore.$)('.as-video-url-dialog-url', this.$view).on('paste', event => {
    setTimeout(this.ev_urlChange.bind(this, event), 100);
  }).on('change', this.ev_urlChange).on('keyup', event => {
    if (keyTimeout > 0) {
      clearTimeout(keyTimeout);
    }

    keyTimeout = setTimeout(() => {
      keyTimeout = -1;
      this.ev_urlChange(event);
    }, 300);
  });
  this.$dialog = (0, _ACore.$)('.as-video-url-dialog', this.$view).on('action', this.ev_action);
  this.$info = (0, _ACore.$)('.as-video-url-dialog-video-info', this.$view);
  this.$image = (0, _ACore.$)('.as-video-url-dialog-video-image', this.$view);
  this.$width = (0, _ACore.$)('.as-video-url-dialog-width', this.$view).on('change', this.ev_widthChange);
  this.$height = (0, _ACore.$)('.as-video-url-dialog-height', this.$view).on('change', this.ev_heightChange);
  this.$ratio = (0, _ACore.$)('checkbox', this.$view).on('change', this.ev_widthChange);
  this.$actionBtns = (0, _ACore.$$)('.as-message-dialog-footer button', this.$view);
  this.$okBtn = this.$actionBtns[0];
};

VideoUrlDialog.prototype.onStart = function () {
  if (this.$view) {
    this.$urlInput.value = '';
    this.$width.value = '';
    this.$height.value = '';
    this.$info.innerHTML = '';
    this.$image.attr('src', undefined);
    this.$okBtn.disabled = true;
  }

  this._prevUrl = null;
};

VideoUrlDialog.prototype.onResume = function () {
  document.body.appendChild(this.getView());
  /*var testcase = [
      'https://www.facebook.com/watch?v=794088524953444',
      'https://www.youtube.com/watch?v=_YzngEllRgM&list=RDGMEMQ1dJ7wXfLlqCjwV0xfSNbAVMX8mhF6HgzVA&index=14',
      'https://vimeo.com/735513454',
      'https://www.dailymotion.com/video/x8d2trt',
      'https://www.youtube.com/embed/AoN__ZtGenc',
      'https://www.youtube.com',
      'https://absol.cf/share/10h.mp4(1).mp4',
      'https://absol.cf/share',
      'https://www.facebook.com/watch?v=386823333524397'
  ]
  this.$urlInput.value = testcase[0];
  this.ev_urlChange();*/
};

VideoUrlDialog.prototype.onPause = function () {
  this.getView().remove();
};

VideoUrlDialog.prototype.resolveCurrentTask = function (result) {
  if (this.task) {
    this.task.resolve(result || this.pendingResult);
    this.task = null;
  }
};

VideoUrlDialog.prototype.cancelCurrentTask = function () {
  if (this.task) {
    this.task.cancel();
    this.task = null;
  }
};

VideoUrlDialog.prototype.assignTask = function (task) {
  this.cancelCurrentTask();
  this._prevUrl = null;
  this.task = task;
  if (task.initInfo) this.onInfo(task.initInfo);
};

VideoUrlDialog.prototype.onInfo = function (info) {
  this.getView();
  this._prevUrl = info.url;

  if (info.error) {
    this.pendingResult = null;
    this.$image.attr('src', undefined);
    this.$info.innerHTML = '<span style="color:#ff2c2c">Can not load video!</span>';
    return;
  }

  this.pendingResult = info;
  if (info.image) this.$image.attr('src', info.image);else {
    this.$image.attr('src', undefined);
  }
  var infoText = [];

  if ((0, _utils.isRealNumber)(info.width) && (0, _utils.isRealNumber)(info.height)) {
    infoText.push([info.width, ' x ', info.height].join(''));
  }

  if ('displayWidth' in info) {
    this.$width.value = info.displayWidth;
    this.$height.value = info.displayHeight;
    this.$urlInput.value = info.url;
  } else if ((0, _utils.isRealNumber)(info.width) && (0, _utils.isRealNumber)(info.height)) {
    infoText.push([info.width, ' x ', info.height].join(''));
    this.$width.value = info.width;
    this.$height.value = info.height;
    this.$ratio.checked = true;
  } else {
    this.$width.value = 560;
    this.$height.value = 315;
  }

  if ('keepRatio' in info) {
    this.$ratio.checked = true;
  }

  if (info.type.startsWith('video/')) {
    infoText.push(info.type.substring(6).toUpperCase());
  }

  if (info.title) {
    infoText.push('<strong>' + info.title + '</strong>');
  }

  this.$info.innerHTML = infoText.join(', ');
  this.$okBtn.disabled = false;
};
/***
 * @param event
 */


VideoUrlDialog.prototype.ev_urlChange = function (event) {
  var newUrl = this.$urlInput.value;
  if (this._prevUrl === newUrl) return;
  this.$okBtn.disabled = true;
  this._prevUrl = newUrl;
  var info = (0, _videoUtils.parseVideoUrl)(newUrl);
  var sync;

  if (info.videoId === 'INVALID_URL') {
    info.error = 'INVALID_URL';
    sync = Promise.resolve();
  } else if (info.hostType !== '*') {
    info.type = 'text/html';
    sync = (0, _videoUtils.default)(info.originalUrl, info.hostType === 'facebook').then(result => {
      if (newUrl !== this._prevUrl) return;
      Object.assign(info, result);

      if (!(0, _utils.isNaturalNumber)(result.width)) {
        info.error = "INVALID_VIDEO";
      }
    });
  } else {
    sync = (0, _videoUtils.getVideoFileHeader)(info.url).then(result => {
      if (newUrl !== this._prevUrl) return;
      Object.assign(info, result);

      if (result.error) {
        this.$info.innerHTML = '<span style="color:#ff2c2c">Can not load video!</span>';
      }
    }).then(() => {
      if (newUrl !== this._prevUrl) return;
      if (info.error) return;
      if (info.type.startsWith('video/')) return (0, _videoUtils.getVideoPreview)(info.url).then(result1 => {
        if (newUrl !== this._prevUrl) return;
        Object.assign(info, result1);
      }, error1 => {
        info.error = "CAN_NOT_LOAD";
      });
    });
  }

  sync.then(() => {
    if (newUrl !== this._prevUrl) return;
    this.onInfo(info);
  });
};
/***
 * @param event
 */


VideoUrlDialog.prototype.ev_action = function (event) {
  setTimeout(() => {
    var action = event.action;

    if (action.name === 'cancel') {
      this.cancelCurrentTask();
    }

    var width = parseInt(this.$width.value);
    var height = parseInt(this.$height.value);
    var result = Object.assign({}, this.pendingResult);

    if (!isNaN(width) && !isNaN(height)) {
      result.displayWidth = width;
      result.displayHeight = height;
    } else {
      result.displayWidth = 560;
      result.displayHeight = 315;
    }

    result.keepRatio = this.$ratio.checked;

    if (action.name === 'ok') {
      this.resolveCurrentTask(result);
    }

    this.stop();
  }, 100);
};

VideoUrlDialog.prototype.ev_widthChange = function () {
  if (!this.$ratio.checked || !this.pendingResult || !(0, _utils.isRealNumber)(this.pendingResult.width) || !(0, _utils.isRealNumber)(this.pendingResult.height)) return;
  var ratio = this.pendingResult.width / this.pendingResult.height;
  var width = parseFloat(this.$width.value);
  this.$height.value = Math.round(width / ratio);
};

VideoUrlDialog.prototype.ev_heightChange = function () {
  if (!this.$ratio.checked || !this.pendingResult || !(0, _utils.isRealNumber)(this.pendingResult.width) || !(0, _utils.isRealNumber)(this.pendingResult.height)) return;
  var ratio = this.pendingResult.width / this.pendingResult.height;
  var height = parseFloat(this.$height.value);
  this.$width.value = Math.round(height * ratio);
};
/***
 * @type {VideoUrlDialog}
 */


var shareInstance;

function openVideUrlDialog(initInfo) {
  shareInstance = shareInstance || new VideoUrlDialog();
  return new Promise(rs => {
    var task = {
      resolved: false,
      canceled: false,
      resolve: function (info) {
        if (this.resolved) return;
        this.resolved = true;
        rs(info);
      },
      cancel: function () {
        if (this.resolved || this.canceled) return;
        if (shareInstance.task !== this) return;
        this.canceled = true;
        rs(null);
      },
      initInfo: initInfo
    };
    shareInstance.start();
    shareInstance.assignTask(task);
  });
}

var _default = VideoUrlDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/VideoExtension.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/VideoExtension.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VideoUrlDialog = require("../videourldialog/VideoUrlDialog");

var _ACore = require("../../ACore");

var _base = require("absol/src/Converter/base64");

var name = 'video';
var command = 'insert_video';

function getInfoFromCKImage(elt) {
  var initInfo = null;

  if (elt.getAttribute('data-node-type') === 'video') {
    initInfo = JSON.parse((0, _base.base64DecodeUnicode)(elt.getAttribute('data-info')));
    initInfo.embedUrl = elt.getAttribute('data-embed-url');
    initInfo.image = elt.getAttribute('src');
    initInfo.image = elt.getAttribute('src');
  }

  return initInfo;
}

function init(editor) {
  editor.ui.addButton(command, {
    label: 'Insert Video',
    command: command
  });
  editor.on('doubleclick', event => {
    var info;

    if (event.data && event.data.element) {
      info = getInfoFromCKImage(event.data.element);

      if (info) {
        event.cancel();
        editor.execCommand(command);
      }
    }
  });
  editor.addCommand(command, {
    exec: function (editor) {
      var initInfo;
      var sel = editor.getSelection();
      var elt;

      if (sel) {
        elt = sel.getSelectedElement();
      }

      if (elt) {
        initInfo = getInfoFromCKImage(elt);
      }

      (0, _VideoUrlDialog.openVideUrlDialog)(initInfo).then(result => {
        var savedInfo = Object.assign({}, result);
        delete savedInfo.image;
        delete savedInfo.embedUrl;

        if (result) {
          var html = `<img src="${result.image}" data-type="${result.type}" \
                        onload="window.ckeditorVideoInit && window.ckeditorVideoInit(this)"\
                         data-embed-url="${result.embedUrl}"\
                         width="${result.displayWidth}px"  height="${result.displayHeight}px"\
                          data-node-type="video" \
                          data-info="${(0, _base.base64EncodeUnicode)(JSON.stringify(savedInfo))}"
                          
                         >`;
          editor.insertHtml(html);
        }
      });
    }
  });
}

window.ckeditorVideoInit = function (elt) {
  (0, _ACore.$)(elt);
  if (!elt.isDescendantOf(document.body)) return;
  var newElt;
  var type = elt.attr('data-type');

  if (type.startsWith('video/')) {
    newElt = (0, _ACore._)({
      tag: 'video',
      attr: {
        crossorigin: "anonymous",
        crossOrigin: "anonymous",
        preload: 'auto',
        src: elt.attr('data-embed-url'),
        width: elt.attr('width'),
        height: elt.attr('height'),
        controls: true
      }
    });
  } else {
    newElt = (0, _ACore._)({
      tag: 'iframe',
      attr: {
        src: elt.attr('data-embed-url'),
        width: elt.attr('width'),
        height: elt.attr('height')
      }
    });
  }

  elt.selfReplace(newElt);
};

var _default = {
  name: name,
  command: command,
  plugin: {
    init: init
  },
  extendMethods: {}
};
/***
 * @name variables
 * @type {{}}
 * @memberOf CKPlaceholder#
 */

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/plugins.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/plugins.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ckInit = ckInit;
exports.ckMakeDefaultConfig = ckMakeDefaultConfig;
exports.ckAddDefaultStyleSet = ckAddDefaultStyleSet;
exports.CKStylesSetDefault = exports.CKExtensionDict = exports.CKExtensions = void 0;

var _ckcontentstyleCss = _interopRequireDefault(require("./ckcontentstyle.css.tpl"));

var _file = require("absol/src/Converter/file");

var _ACore = require("../../ACore");

var _Array = require("absol/src/DataStructure/Array");

var _ExpressionExtension = _interopRequireDefault(require("./ExpressionExtension"));

var _SimpleTextExtension = _interopRequireDefault(require("./SimpleTextExtension"));

var _VariableExtension = _interopRequireDefault(require("./VariableExtension"));

var _DynamicLinkExtension = _interopRequireDefault(require("./DynamicLinkExtension"));

var _ImageFileExtension = _interopRequireDefault(require("./ImageFileExtension"));

var _VideoExtension = _interopRequireDefault(require("./VideoExtension"));


var ckContentStyleUrl;
var ckPluginInitialized = false;
var CKExtensions = [_ExpressionExtension.default, _SimpleTextExtension.default, _VariableExtension.default, _DynamicLinkExtension.default, _ImageFileExtension.default, _VideoExtension.default];
exports.CKExtensions = CKExtensions;
var CKExtensionDict = CKExtensions.reduce(function (ac, cr) {
  ac[cr.name] = cr;
  return ac;
}, {});
exports.CKExtensionDict = CKExtensionDict;
var CKStylesSetDefault = [{
  name: 'Notice',
  element: 'p',
  attributes: {
    class: 'as-ck-alert as-variant-notice'
  }
}, {
  name: 'Warning',
  element: 'p',
  attributes: {
    class: 'as-ck-alert as-variant-warning'
  }
}, {
  name: 'Tip',
  element: 'p',
  attributes: {
    class: 'as-ck-alert as-variant-info'
  }
}, {
  name: 'Success',
  element: 'p',
  attributes: {
    class: 'as-ck-alert as-variant-success'
  }
}];
exports.CKStylesSetDefault = CKStylesSetDefault;

function ckInit() {
  if (!window.CKEDITOR) return;
  if (ckPluginInitialized) return;

  var styleCode = _ckcontentstyleCss.default.replace(/\$basePath/g, CKEDITOR.basePath);

  ckContentStyleUrl = URL.createObjectURL((0, _file.stringToBlob)(styleCode, 'css'));
  ckPluginInitialized = true;
  document.head.appendChild((0, _ACore._)('<link rel="stylesheet" href="' + ckContentStyleUrl + '">'));
  CKEDITOR.stylesSet.add('as_styles_set_default', CKStylesSetDefault);
  CKExtensions.forEach(function (e) {
    if (e.plugin) {
      CKEDITOR.plugins.add(e.name, e.plugin);
    }
  });
}

function ckMakeDefaultConfig(config, extensions, holderElt) {
  ckInit();
  var userImageFileDialog = !!(window.contentModule && window.contentModule.chooseFile);
  /*
  * if (!this.attributes.directUpload && window.contentModule && window.contentModule.chooseFile) {
      window.contentModule.chooseFile({ type: "image_file" }).then(function (result) {
          if (result) {
              this.attributes.value = result;
          }
      }.bind(this));
  }
  * */

  config = config || {}; //disable special chars encode

  config.entities = false;
  config.stylesSet = ['as_styles_set_default'].concat((0, _Array.arrayUnique)((config.stylesSet || '').trim().split(/\s*,\s*/))).filter(function (c) {
    return !!c;
  }).join(',');
  if (extensions) extensions.push('video');

  if (extensions && extensions.indexOf(_VariableExtension.default.name) >= 0) {
    config.title = false;
  }

  if (config.toolbar === 'SIMPLE') {
    config.toolbar = [{
      name: 'basicstyles',
      items: ['Bold', 'Italic', 'Underline', 'TextColor', 'BGColor', 'NumberedList', 'BulletedList', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', userImageFileDialog ? 'image_mgn_dialog' : 'Image']
    }, // { name: 'styles', items: ['Styles', 'Format', 'Font', 'FontSize'] },
    {
      name: "extensions",
      items: extensions.map(function (eName) {
        if (CKExtensionDict[eName] && CKExtensionDict[eName].command) {
          return CKExtensionDict[eName].command;
        }
      }).filter(function (u) {
        return !!u;
      })
    }, {
      name: 'tools',
      items: ['Maximize']
    }];
  } else if (!config.toolbar || config.toolbar === "ADVANCED") {
    config.toolbar = [{
      name: 'basicstyles',
      items: ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript']
    }, {
      name: 'colors',
      items: ['TextColor', 'BGColor']
    }, {
      name: "format",
      items: ['CopyFormatting', 'RemoveFormat']
    }, {
      name: 'paragraph',
      items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock']
    }, {
      name: 'styles',
      items: ['Styles', 'Format', 'Font', 'FontSize']
    }, {
      name: 'links',
      items: ['Link', 'Unlink', 'Anchor']
    }, {
      name: 'insert',
      items: [userImageFileDialog ? 'image_mgn_dialog' : 'Image', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']
    }, {
      name: 'tools',
      items: ['Maximize', 'ShowBlocks']
    }, {
      name: 'editing',
      items: ['Find', 'Replace']
    }, {
      name: "extensions",
      items: extensions.map(function (eName) {
        if (CKExtensionDict[eName] && CKExtensionDict[eName].command) {
          return CKExtensionDict[eName].command;
        }
      }).filter(function (u) {
        return !!u;
      })
    }, {
      name: 'document',
      items: ['Source']
    }];
  }

  config.toolbar = config.toolbar.filter(function (i) {
    return i.items && i.items.length > 0;
  });
  config.toolbar = [config.toolbar.reduce(function (ac, cr) {
    // if (ac.items.length > 0)
    //     ac.items.push('-');
    var items = cr.items.filter(function (it) {
      return it !== '-';
    });
    ac.items.push.apply(ac.items, items);
    return ac;
  }, {
    name: 'nogroup',
    items: []
  })];

  if (!config.height) {
    config.height = '500px';
  }

  var contentsCss = [ckContentStyleUrl];

  if (typeof config.contentsCss === "string") {
    contentsCss.push(config.contentsCss);
  } else if (config.contentsCss instanceof Array) {
    contentsCss.push.apply(contentsCss, config.contentsCss);
  }

  var has = contentsCss.some(function (url) {
    return url.indexOf('family=Material+Icons') >= 0;
  });

  if (!has) {
    contentsCss.push('https://fonts.googleapis.com/icon?family=Material+Icons');
  }

  has = contentsCss.some(function (url) {
    return url.indexOf(CKEDITOR.basePath + 'contents.css') >= 0;
  });

  if (!has) {
    contentsCss.push(CKEDITOR.basePath + 'contents.css?time=' + Math.random());
  }

  config.contentsCss = contentsCss;
  var extraPlugins = ['image_mgn'];

  if (holderElt.stickyToolbar) {
    extraPlugins.push('autogrow');
    config.autoGrow_minHeight = 400;
  }

  if (typeof config.extraPlugins === 'string') {
    extraPlugins.push.apply(extraPlugins, config.extraPlugins.trim().split(/\s*,\s*/));
  } else if (extraPlugins instanceof Array) {
    extraPlugins.push.apply(extraPlugins, config.extraPlugins);
  }

  extraPlugins = extraPlugins.filter(function (c) {
    return typeof c === 'string' && !!c;
  });
  CKExtensions.forEach(function (e) {
    if (extensions.indexOf(e.name) >= 0 && e.plugin) extraPlugins.push(e.name);
  });
  extraPlugins = (0, _Array.arrayUnique)(extraPlugins);
  config.extraPlugins = extraPlugins.join(',');
  config.allowedContent = true; //false: you must add button ui => bug

  Object.assign(config, {//style
    // htmlEncodeOutput: false,
    // entities: false,
    // basicEntities: false,
    // // config.cloudServices_uploadUrl: 'DDFFE2739B83A73DDF16AB641ECA2',
    // // config.cloudServices_tokenUrl: 'https://lab.daithangminh.vn/hr_system_settings/php/uploadMedia.php',
    // extraPlugins: 'LinkDB, Note',
    // filebrowserBrowseUrl: 'js/ckfinder/ckfinder.html',
    // filebrowserImageBrowseUrl: 'js/ckfinder/ckfinder.html?type=Images',
    // filebrowserFlashBrowseUrl: 'js/ckfinder/ckfinder.html?type=Flash',
    // filebrowserUploadUrl: 'js/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Files',
    // filebrowserImageUploadUrl: 'js/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Images',
    // filebrowserFlashUploadUrl: 'js/ckfinder/core/connector/php/connector.php?command=QuickUpload&type=Flash'
  });
  return config;
}

function ckAddDefaultStyleSet(ckEditor) {}
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/CKStickyToolbarController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/CKStickyToolbarController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _Dom = require("absol/src/HTML5/Dom");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


function CKStickyToolbarController(holderElt) {
  this.editor = holderElt.editor;
  this.$elt = this.editor.container.$;
  this.activated = false;
  this['onScroll'] = this.onScroll.bind(this);
  this.trackedScroller = [];
}

CKStickyToolbarController.prototype.start = function () {
  if (this.activated) return;
  var c = this.$elt.parentElement;

  while (c) {
    c.addEventListener('scroll', this.onScroll);
    c = c.parentElement;
  }
};

CKStickyToolbarController.prototype.stop = function () {
  if (!this.activated) return;

  while (this.trackedScroller.length > 0) {
    this.trackedScroller.pop().removeEventListener('scroll', this.onScroll);
  }
};

CKStickyToolbarController.prototype.onScroll = function (event) {
  if (!_AElement.default.prototype.isDescendantOf.call(this.$elt, document.body)) {
    this.stop();
    return;
  }

  this.$toolbar = this.$toolbar || (0, _ACore.$)('.cke_top', this.$elt);
  if (!this.$toolbar) return;
  var oBound = (0, _Dom.traceOutBoundingClientRect)(this.$elt.parentElement);
  var bound = this.$elt.getBoundingClientRect();
  var tBound = this.$toolbar.getBoundingClientRect();

  if (bound.top < oBound.top && oBound.top + tBound.height + 30 < bound.bottom) {
    this.$toolbar.addStyle('transform', 'translate(0, ' + (oBound.top - bound.top) + 'px)');
  } else {
    this.$toolbar.removeStyle('transform');
  }
};

var _default = CKStickyToolbarController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/CKPlaceholder.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/CKPlaceholder.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

require("../../css/ckplaceholder.css");

var _plugins = require("./plugins");

var _CKStickyToolbarController = _interopRequireDefault(require("./CKStickyToolbarController"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));




_Dom.default.documentReady.then(function () {
  setTimeout(_plugins.ckInit, 100);
});
/***
 * @extends AElement
 * @constructor
 */


function CKPlaceholder() {
  (0, _plugins.ckInit)();
  this.$attachhook = (0, _ACore._)('attachhook').addTo(this);
  this.$attachhook.once('attached', this.eventHandler.attached);
  this._pendingData = '';
  this.isReady = false;
  this.editor = null;
  this._extensions = [];
  this._config = this._makeInitConfig();
  this.afterReady = new Promise(rs => {
    this.on('editorready', rs);
  });
  this.stickyToolbarCtrl = null;
  /***
   * @type {{}}
   * @name config
   * @memberOf CKPlaceholder#
   */

  /***
   * @type {string[]}
   * @name extensions
   * @memberOf CKPlaceholder#
   */

  /***
   *
   * @type {boolean}
   */

  this.stickyToolbar = true;
}

CKPlaceholder.tag = 'CKPlaceholder'.toLowerCase();

CKPlaceholder.render = function () {
  return (0, _ACore._)({
    extendEvent: ['editorcreated', 'editorready', 'change', 'command', 'focus'],
    class: 'as-ck-placeholder'
  });
};

CKPlaceholder.prototype.mode = 'replace';
/**
 *
 * @param {string}data
 * @private
 * @returns {string}
 */

CKPlaceholder.prototype._implicit = function (data) {
  if (typeof data !== "string") data = '';
  var self = this;
  return this._extensions.reverse().reduce(function (ac, cr) {
    var extension = _plugins.CKExtensionDict[cr];

    if (extension.implicit) {
      ac = extension.implicit(ac, self);
    }

    return ac;
  }, data);
};
/**
 *
 * @param {string}data
 * @private
 * @returns {string}
 */


CKPlaceholder.prototype._explicit = function (data) {
  var self = this;
  return this._extensions.reduce(function (ac, cr) {
    var extension = _plugins.CKExtensionDict[cr];

    if (extension && extension.explicit) {
      ac = extension.explicit(ac, self);
    }

    return ac;
  }, data);
};
/***
 * @returns {{}}
 * @protected
 */


CKPlaceholder.prototype._makeInitConfig = function () {
  return {};
};

CKPlaceholder.prototype.selectNext = function () {
  var editor = this.editor;
  if (!editor) return;
  var ranges = editor.getSelection().getRanges(); // var startIndex = editor.element.getHtml().indexOf(findString);
  // if (startIndex != -1)  {
  //     ranges[0].setStart(element.getFirst(), startIndex);
  //     ranges[0].setEnd(element.getFirst(), startIndex + findString.length);
  //     sel.selectRanges([ranges[0]]);
  // }
};
/***
 * @memberOf CKPlaceholder#
 * @type {{}}
 */


CKPlaceholder.eventHandler = {};
/***
 * @this CKPlaceholder
 */

CKPlaceholder.eventHandler.attached = function () {
  this.$attachhook.remove();
  this.editor = this.mode === 'replace' ? CKEDITOR.replace(this, (0, _plugins.ckMakeDefaultConfig)(this.config, this.extensions, this)) : CKEDITOR.inline(this, (0, _plugins.ckMakeDefaultConfig)(this.config, this.extensions, this));
  this.editor.placeHolderElt = this;
  this.editor.on('instanceReady', this.eventHandler.instanceReady);
  this.editor.on('change', this.eventHandler.change);

  if (this.mode === 'replace') {
    this.editor.on('focus', function (event) {
      this.emit('focus', {
        target: this,
        type: 'focus',
        originalEvent: event
      });
    }.bind(this));
  }

  this._extensions.forEach(function (name) {
    var e = _plugins.CKExtensionDict[name];

    if (e && e.extendMethods) {
      Object.assign(this, e.extendMethods);
    }
  }.bind(this));

  this.emit('editorcreated', {
    type: 'editorcreated',
    target: this,
    editor: this.editor
  }, this);
};

CKPlaceholder.eventHandler.instanceReady = function () {
  this.isReady = true;

  if (this._pendingData && this._pendingData.length > 0) {
    this.editor.setData(this._implicit(this._pendingData));
    this._pendingData = null;
  }

  this.emit('editorready', {
    type: 'editorready',
    target: this,
    editor: this.editor
  }, this);
};

CKPlaceholder.eventHandler.change = function () {
  this.emit('change', {
    type: 'change',
    target: this,
    editor: this.editor
  }, this);
};

CKPlaceholder.property = {};
CKPlaceholder.property.data = {
  /***
   * @this CKPlaceholder
   * @param data
   */
  set: function (data) {
    if (typeof data !== "string") data = '';

    if (this.isReady) {
      this.editor.setData(this._implicit(data));
    } else {
      this._pendingData = data;
    }
  },

  /***
   * @this CKPlaceholder
   * @returns {string}
   */
  get: function () {
    if (this.isReady) return this._explicit(this.editor.getData());
    return this._pendingData;
  }
};
CKPlaceholder.property.rawData = {
  get: function () {
    if (this.editor) this.editor.getData();else return this._implicit(this._pendingData);
  }
};
CKPlaceholder.property.config = {
  set: function (value) {
    if (this.editor) {
      throw new Error("Can not set config after the CKEditor created");
    }

    this._config = Object.assign(this._makeInitConfig(), value);
  },
  get: function () {
    return this._config;
  }
};
CKPlaceholder.property.extensions = {
  set: function (value) {
    if (this.editor) {
      throw new Error("Can not set extensions after the CKEditor created");
    }

    value = value || [];
    if (typeof value === "string") value = [value];
    if (!(value instanceof Array)) value = [];
    this._extensions = value.filter(function (c) {
      return typeof c === "string" && c.length > 0 && _plugins.CKExtensionDict[c];
    });
    this._extensions = value;
  },
  get: function () {
    return this._extensions;
  }
};
CKPlaceholder.property.stickyToolbar = {
  set: function (value) {
    if (value) {
      this.addClass('as-has-sticky-toolbar');
    } else {
      return this.removeClass('as-has-sticky-toolbar');
    }

    this.afterReady.then(() => {
      if (this.mode !== 'replace') return;

      if (this.stickyToolbar) {
        if (!this.stickyToolbarCtrl) {
          this.stickyToolbarCtrl = new _CKStickyToolbarController.default(this);
        }

        this.stickyToolbarCtrl.start();
      } else {
        this.editor.container.$.classList.remove('as-has-sticky-toolbar');
        if (this.stickyToolbarCtrl) this.stickyToolbarCtrl.stop();
      }
    });
  },
  get: function () {
    return this.hasClass('as-has-sticky-toolbar');
  }
};

_ACore.default.install(CKPlaceholder);

var _default = CKPlaceholder;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ckeditor/CKInlineShortText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ckeditor/CKInlineShortText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _CKPlaceholder = _interopRequireDefault(require("./CKPlaceholder"));

var _Array = require("absol/src/DataStructure/Array");

var _plugins = require("./plugins");

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _file = require("absol/src/Converter/file");

var _stringGenerate = require("absol/src/String/stringGenerate");




/***
 * @extends CKPlaceholder
 * @constructor
 */
function CKInlineShortText() {
  _CKPlaceholder.default.call(this);

  this.once('editorcreated', this.eventHandler.afterEditorCreated).on('paste', this.eventHandler.paste, true).once('editorready', this.eventHandler.afterEditorReady);
}

_OOP.default.mixClass(CKInlineShortText, _CKPlaceholder.default);

CKInlineShortText.tag = 'CKInlineShortText'.toLowerCase();
CKInlineShortText.property = Object.assign({}, _CKPlaceholder.default.property);
CKInlineShortText.eventHandler = Object.assign({}, _CKPlaceholder.default.eventHandler);

CKInlineShortText.render = function () {
  return (0, _ACore._)({
    class: 'as-ck-inline-short-text',
    extendEvent: ['editorcreated', 'editorready', 'change', 'command'],
    id: (0, _stringGenerate.randomIdent)(8),
    attr: {
      contenteditable: 'true'
    }
  });
};

CKInlineShortText.prototype.mode = 'inline';

CKInlineShortText.prototype._makeInitConfig = function () {
  var config = {
    toolbar: [{
      name: 'extension',
      items: (0, _Array.arrayRemoveNone)(this._extensions.map(function (eName) {
        if (_plugins.CKExtensionDict[eName] && _plugins.CKExtensionDict[eName].command) {
          return _plugins.CKExtensionDict[eName].command;
        }
      }))
    }],
    keystrokes: [[13
    /* Enter */
    , 'blur'], [CKEDITOR.SHIFT + 13
    /* Shift + Enter */
    , 'blur']]
  };
  return config;
};

CKInlineShortText.property.extensions = Object.assign({}, _CKPlaceholder.default.property.extensions, {
  set: function (value) {
    value = value || [];
    value.push('simple_text');
    value = (0, _Array.arrayUnique)(value);

    _CKPlaceholder.default.property.extensions.set.call(this, value);

    this._config = this._makeInitConfig();
  }
});

CKInlineShortText.prototype._hookScroll = function () {
  this.$scrollers = [];
  var c = this.parentElement;

  while (c) {
    this.$scrollers.push(c);
    c = c.parentElement;
  }

  this.$scrollers.push(document);
  this.$scrollers.forEach(function (elt) {
    elt.addEventListener('scroll', this.eventHandler.scroll);
  }.bind(this));
};

CKInlineShortText.prototype._unhookScroll = function () {
  this.$scrollers.forEach(function (elt) {
    elt.removeEventListener('scroll', this.eventHandler.scroll);
  }.bind(this));
};

CKInlineShortText.eventHandler.afterEditorCreated = function () {
  this.editor.on('paste', function (evt) {
    evt.cancel();
  });
};

CKInlineShortText.eventHandler.afterEditorReady = function () {
  this.$toolbarElt = this.$toolbarElt || (0, _ACore.$)('#cke_' + this.attr('id'));
  this['removeToolbar'] = this.removeToolbar;

  this._hookScroll();

  setTimeout(this.eventHandler.tick, 5000);
};

CKInlineShortText.eventHandler.paste = function (event) {
  var self = this;
  var clipboardData = event.clipboardData || window.clipboardData;
  /**Safari bug */

  event.preventDefault();

  if (clipboardData) {
    if (clipboardData.items) {
      var items = Array.prototype.slice.call(clipboardData.items);
      var plainTextItems = items.filter(function (item) {
        return item.type.indexOf('text/plain') >= 0;
      });

      if (plainTextItems.length > 0) {
        var plainTextItem = plainTextItems[0]; //only one item

        plainTextItem.getAsString(function (text) {
          self.editor.insertHtml(self._implicit(text));
        });
      }
    } else {
      var text = event.clipboardData.getData('text/plain');

      if (text) {
        self.editor.insertHtml(self._implicit(text));
      }
    }
  }
};

CKInlineShortText.eventHandler.tick = function () {
  if (!this.isDescendantOf(document.body)) {
    this._unhookScroll();

    return;
  }

  setTimeout(this.eventHandler.tick, 5000);
};
/***
 * @this CKInlineShortText
 */


CKInlineShortText.eventHandler.scroll = function () {
  // If we don't have any active instance of CKEDITOR - return
  if (!CKEDITOR.currentInstance) {
    return;
  }

  if (CKEDITOR.currentInstance.element.$ !== this) return; // Save the elements we need to work with

  if (!this.isDescendantOf(document.body)) {
    this._unhookScroll();

    return;
  }

  this.$toolbarElt = this.$toolbarElt || (0, _ACore.$)('#cke_' + this.attr('id'));
  var toolbarElt = this.$toolbarElt;
  if (!toolbarElt) return;
  var bound = this.getBoundingClientRect();
  var toolBound = toolbarElt.getBoundingClientRect();
  var outbound = (0, _Dom.traceOutBoundingClientRect)(this);
  var left = Math.max(0, bound.left);
  var top = bound.top - toolBound.height;

  if (outbound.top > bound.bottom || outbound.bottom < bound.top) {
    top = -1000;
  } else if (bound.top < toolBound.height) {
    top = bound.bottom;
  }

  toolbarElt.addStyle({
    top: top + 'px',
    left: left + 'px'
  });
};

CKInlineShortText.property.removeToolbar = {
  set: function (value) {
    this._removeToolbar = !!value;

    if (this.$toolbarElt) {
      if (this._removeToolbar) {
        this.$toolbarElt.addClass('as-hidden');
      } else {
        this.$toolbarElt.removeClass('as-hidden');
      }
    }
  },
  get: function () {
    return this._removeToolbar;
  }
};

_ACore.default.install(CKInlineShortText);

var _default = CKInlineShortText;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/VerticalTimeline.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/VerticalTimeline.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/verticaltimeline.css");

var _utils = require("./utils");



/***
 * @extends AElement
 * @constructor
 */
function VerticalTimeline() {
  this._current = 0;
  this._items = [];
  this.$items = [];
  this.current = 0;
}

VerticalTimeline.tag = 'VerticalTimeline'.toLowerCase();

VerticalTimeline.render = function () {
  return (0, _ACore._)({
    class: 'as-vertical-timeline',
    child: []
  });
};

VerticalTimeline.prototype._makeItem = function (item, i) {
  var iconElt = (0, _ACore._)('span.mdi.mdi-circle');
  return (0, _ACore._)({
    class: 'as-vertical-timeline-item',
    props: {
      $icon: iconElt
    },
    child: [{
      class: 'as-vertical-timeline-icon-ctn',
      child: iconElt
    }, {
      class: 'as-vertical-timeline-tile',
      child: {
        tag: 'span',
        child: {
          text: item.text
        }
      }
    }]
  });
};

VerticalTimeline.property = {};
VerticalTimeline.property.items = {
  /***
   * @this VerticalTimeline
   * @param items
   */
  set: function (items) {
    items = items || [];
    this._items = items;
    this.clearChild();
    this.$items = items.map(function (item, i) {
      return this._makeItem(item, i);
    }.bind(this));
    this.addChild(this.$items);
    this.current = this._current; //update
  },
  get: function () {}
};
VerticalTimeline.property.current = {
  set: function (value) {
    value = (0, _utils.isRealNumber)(value) ? value >> 0 : -1;
    this._current = value;
    var itemElt;

    for (var i = 0; i < this.$items.length; ++i) {
      itemElt = this.$items[i]; //.$icon.removeClass('');

      if (i < value) {
        itemElt.$icon.removeClass('mdi-numeric-' + (i + 1) + '-circle').removeClass('mdi-circle').addClass('mdi-check-circle');
        itemElt.removeClass('as-inactive').removeClass('as-active');
      } else if (i === value) {
        itemElt.$icon.addClass('mdi-numeric-' + (i + 1) + '-circle').removeClass('mdi-circle').removeClass('mdi-check-circle');
        itemElt.removeClass('as-inactive').addClass('as-active');
      } else {
        itemElt.addClass('as-inactive').removeClass('as-active');
        itemElt.$icon.removeClass('mdi-numeric-' + (i + 1) + '-circle').addClass('mdi-circle').removeClass('mdi-check-circle');
      }
    }
  },
  get: function () {
    return Math.max(-1, Math.min(this._current, this._items.length));
  }
};

_ACore.default.install(VerticalTimeline);

var _default = VerticalTimeline;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MarkerClusterer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MarkerClusterer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/**
 * @name MarkerClustererPlus for Google Maps V3
 * @version 2.1.1 [November 4, 2013]
 * @author Gary Little
 * @fileoverview
 * The library creates and manages per-zoom-level clusters for large amounts of markers.
 * <p>
 * This is an enhanced V3 implementation of the
 * <a href="http://gmaps-utility-library-dev.googlecode.com/svn/tags/markerclusterer/"
 * >V2 MarkerClusterer</a> by Xiaoxi Wu. It is based on the
 * <a href="http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclusterer/"
 * >V3 MarkerClusterer</a> port by Luke Mahe. MarkerClustererPlus was created by Gary Little.
 * <p>
 * v2.0 release: MarkerClustererPlus v2.0 is backward compatible with MarkerClusterer v1.0. It
 *  adds support for the <code>ignoreHidden</code>, <code>title</code>, <code>batchSizeIE</code>,
 *  and <code>calculator</code> properties as well as support for four more events. It also allows
 *  greater control over the styling of the text that appears on the cluster marker. The
 *  documentation has been significantly improved and the overall code has been simplified and
 *  polished. Very large numbers of markers can now be managed without causing Javascript timeout
 *  errors on Internet Explorer. Note that the name of the <code>clusterclick</code> event has been
 *  deprecated. The new name is <code>click</code>, so please change your application code now.
 */

/**
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @name ClusterIconStyle
 * @class This class represents the object for values in the <code>styles</code> array passed
 *  to the {@link MarkerClusterer} constructor. The element in this array that is used to
 *  style the cluster icon is determined by calling the <code>calculator</code> function.
 *
 * @property {string} url The URL of the cluster icon image file. Required.
 * @property {number} height The display height (in pixels) of the cluster icon. Required.
 * @property {number} width The display width (in pixels) of the cluster icon. Required.
 * @property {Array} [anchorText] The position (in pixels) from the center of the cluster icon to
 *  where the text label is to be centered and drawn. The format is <code>[yoffset, xoffset]</code>
 *  where <code>yoffset</code> increases as you go down from center and <code>xoffset</code>
 *  increases to the right of center. The default is <code>[0, 0]</code>.
 * @property {Array} [anchorIcon] The anchor position (in pixels) of the cluster icon. This is the
 *  spot on the cluster icon that is to be aligned with the cluster position. The format is
 *  <code>[yoffset, xoffset]</code> where <code>yoffset</code> increases as you go down and
 *  <code>xoffset</code> increases to the right of the top-left corner of the icon. The default
 *  anchor position is the center of the cluster icon.
 * @property {string} [textColor="black"] The color of the label text shown on the
 *  cluster icon.
 * @property {number} [textSize=11] The size (in pixels) of the label text shown on the
 *  cluster icon.
 * @property {string} [textDecoration="none"] The value of the CSS <code>text-decoration</code>
 *  property for the label text shown on the cluster icon.
 * @property {string} [fontWeight="bold"] The value of the CSS <code>font-weight</code>
 *  property for the label text shown on the cluster icon.
 * @property {string} [fontStyle="normal"] The value of the CSS <code>font-style</code>
 *  property for the label text shown on the cluster icon.
 * @property {string} [fontFamily="Arial,sans-serif"] The value of the CSS <code>font-family</code>
 *  property for the label text shown on the cluster icon.
 * @property {string} [backgroundPosition="0 0"] The position of the cluster icon image
 *  within the image defined by <code>url</code>. The format is <code>"xpos ypos"</code>
 *  (the same format as for the CSS <code>background-position</code> property). You must set
 *  this property appropriately when the image defined by <code>url</code> represents a sprite
 *  containing multiple images. Note that the position <i>must</i> be specified in px units.
 */

/**
 * @name ClusterIconInfo
 * @class This class is an object containing general information about a cluster icon. This is
 *  the object that a <code>calculator</code> function returns.
 *
 * @property {string} text The text of the label to be shown on the cluster icon.
 * @property {number} index The index plus 1 of the element in the <code>styles</code>
 *  array to be used to style the cluster icon.
 * @property {string} title The tooltip to display when the mouse moves over the cluster icon.
 *  If this value is <code>undefined</code> or <code>""</code>, <code>title</code> is set to the
 *  value of the <code>title</code> property passed to the MarkerClusterer.
 */

/**
 * A cluster icon.
 *
 * @constructor
 * @extends google.maps.OverlayView
 * @param {Cluster} cluster The cluster with which the icon is to be associated.
 * @param {Array} [styles] An array of {@link ClusterIconStyle} defining the cluster icons
 *  to use for various cluster sizes.
 * @private
 */
function ClusterIcon(cluster, styles) {
  cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);
  this.cluster_ = cluster;
  this.className_ = cluster.getMarkerClusterer().getClusterClass();
  this.styles_ = styles;
  this.center_ = null;
  this.div_ = null;
  this.sums_ = null;
  this.visible_ = false;
  this.setMap(cluster.getMap()); // Note: this causes onAdd to be called
}
/**
 * Adds the icon to the DOM.
 */


ClusterIcon.prototype.onAdd = function () {
  var cClusterIcon = this;
  var cMouseDownInCluster;
  var cDraggingMapByCluster;
  this.div_ = document.createElement("div");
  this.div_.className = this.className_;

  if (this.visible_) {
    this.show();
  }

  this.getPanes().overlayMouseTarget.appendChild(this.div_); // Fix for Issue 157

  this.boundsChangedListener_ = google.maps.event.addListener(this.getMap(), "bounds_changed", function () {
    cDraggingMapByCluster = cMouseDownInCluster;
  });
  this.div_.addEventListener("mousedown", function () {
    cMouseDownInCluster = true;
    cDraggingMapByCluster = false;
  });
  this.div_.addEventListener("click", function (e) {
    cMouseDownInCluster = false;

    if (!cDraggingMapByCluster) {
      var theBounds;
      var mz;
      var mc = cClusterIcon.cluster_.getMarkerClusterer();
      /**
       * This event is fired when a cluster marker is clicked.
       * @name MarkerClusterer#click
       * @param {Cluster} c The cluster that was clicked.
       * @event
       */

      google.maps.event.trigger(mc, "click", cClusterIcon.cluster_);
      google.maps.event.trigger(mc, "clusterclick", cClusterIcon.cluster_); // deprecated name
      // The default click handler follows. Disable it by setting
      // the zoomOnClick property to false.

      if (mc.getZoomOnClick()) {
        // Zoom into the cluster.
        mz = mc.getMaxZoom();
        theBounds = cClusterIcon.cluster_.getBounds();
        mc.getMap().fitBounds(theBounds); // There is a fix for Issue 170 here:

        setTimeout(function () {
          mc.getMap().fitBounds(theBounds); // Don't zoom beyond the max zoom level

          if (mz !== null && mc.getMap().getZoom() > mz) {
            mc.getMap().setZoom(mz + 1);
          }
        }, 100);
      } // Prevent event propagation to the map:


      e.cancelBubble = true;

      if (e.stopPropagation) {
        e.stopPropagation();
      }
    }
  });
  this.div_.addEventListener("mouseover", function () {
    var mc = cClusterIcon.cluster_.getMarkerClusterer();
    /**
     * This event is fired when the mouse moves over a cluster marker.
     * @name MarkerClusterer#mouseover
     * @param {Cluster} c The cluster that the mouse moved over.
     * @event
     */

    google.maps.event.trigger(mc, "mouseover", cClusterIcon.cluster_);
    google.maps.event.trigger(cClusterIcon.cluster_, "mouseover");
  });
  this.div_.addEventListener("mouseout", function () {
    var mc = cClusterIcon.cluster_.getMarkerClusterer();
    /**
     * This event is fired when the mouse moves out of a cluster marker.
     * @name MarkerClusterer#mouseout
     * @param {Cluster} c The cluster that the mouse moved out of.
     * @event
     */

    google.maps.event.trigger(mc, "mouseout", cClusterIcon.cluster_);
    google.maps.event.trigger(cClusterIcon.cluster_, "mouseout");
  });
  var mc = this.cluster_.getMarkerClusterer();

  if (mc.markers_.caculateSum !== undefined) {
    var infowindow = new google.maps.InfoWindow({
      maxWidth: 350
    });
    google.maps.event.addListener(this.cluster_, 'mouseover', function (event) {
      var tooltip = mc.markers_.caculateSum(this.cluster_.markers_);
      var content, style;

      if (typeof tooltip == "object") {
        if (tooltip.style) style = tooltip.style;
        if (tooltip.element) content = tooltip.element;
      } else content = tooltip;

      if (style !== undefined) infowindow.setOptions(style);
      infowindow.setContent(content);
      var info = new google.maps.MVCObject();
      info.set('position', this.center_);
      info.set('anchorPoint', new google.maps.Point(0, -12));
      infowindow.open(mc.map, info);
    }.bind(this));
    google.maps.event.addListener(this.cluster_, 'mouseout', function (event) {
      infowindow.close();
    }.bind(this));
    google.maps.event.addListener(mc.map, "zoom_changed", function () {
      infowindow.close();
    });
  }
};
/**
 * Removes the icon from the DOM.
 */


ClusterIcon.prototype.onRemove = function () {
  if (this.div_ && this.div_.parentNode) {
    this.hide();
    google.maps.event.removeListener(this.boundsChangedListener_);
    google.maps.event.clearInstanceListeners(this.div_);
    this.div_.parentNode.removeChild(this.div_);
    this.div_ = null;
  }
};
/**
 * Draws the icon.
 */


ClusterIcon.prototype.draw = function () {
  if (this.visible_) {
    var pos = this.getPosFromLatLng_(this.center_);
    this.div_.style.top = pos.y + "px";
    this.div_.style.left = pos.x + "px";
  }
};
/**
 * Hides the icon.
 */


ClusterIcon.prototype.hide = function () {
  if (this.div_) {
    this.div_.style.display = "none";
  }

  this.visible_ = false;
};
/**
 * Positions and shows the icon.
 */


ClusterIcon.prototype.show = function () {
  if (this.div_) {
    var img = ""; // NOTE: values must be specified in px units

    var bp = this.backgroundPosition_.split(" ");
    var spriteH = parseInt(bp[0].trim(), 10);
    var spriteV = parseInt(bp[1].trim(), 10);
    var pos = this.getPosFromLatLng_(this.center_);
    this.div_.style.cssText = this.createCss(pos);
    img = "<img src='" + this.url_ + "' style='position: absolute; top: " + spriteV + "px; left: " + spriteH + "px; ";

    if (!this.cluster_.getMarkerClusterer().enableRetinaIcons_) {
      img += "clip: rect(" + -1 * spriteV + "px, " + (-1 * spriteH + this.width_) + "px, " + (-1 * spriteV + this.height_) + "px, " + -1 * spriteH + "px);";
    } else {
      img += "width: " + this.width_ + "px;" + "height: " + this.height_ + "px;";
    }

    img += "'>";
    this.div_.innerHTML = img + "<div style='" + "position: absolute;" + "top: " + this.anchorText_[0] + "px;" + "left: " + this.anchorText_[1] + "px;" + "color: " + this.textColor_ + ";" + "font-size: " + this.textSize_ + "px;" + "font-family: " + this.fontFamily_ + ";" + "font-weight: " + this.fontWeight_ + ";" + "font-style: " + this.fontStyle_ + ";" + "text-decoration: " + this.textDecoration_ + ";" + "text-align: center;" + "width: " + this.width_ + "px;" + "line-height:" + this.height_ + "px;" + "'>" + (this.cluster_.hideLabel_ ? ' ' : this.sums_.text) + "</div>";

    if (typeof this.sums_.title === "undefined" || this.sums_.title === "") {
      this.div_.title = this.cluster_.getMarkerClusterer().getTitle();
    } else {
      this.div_.title = this.sums_.title;
    }

    this.div_.style.display = "";
  }

  this.visible_ = true;
};
/**
 * Sets the icon styles to the appropriate element in the styles array.
 *
 * @param {ClusterIconInfo} sums The icon label text and styles index.
 */


ClusterIcon.prototype.useStyle = function (sums) {
  this.sums_ = sums;
  var index = Math.max(0, sums.index - 1);
  index = Math.min(this.styles_.length - 1, index);
  var style = this.styles_[index];
  this.url_ = style.url;
  this.height_ = style.height;
  this.width_ = style.width;
  this.anchorText_ = style.anchorText || [0, 0];
  this.anchorIcon_ = style.anchorIcon || [parseInt(this.height_ / 2, 10), parseInt(this.width_ / 2, 10)];
  this.textColor_ = style.textColor || "black";
  this.textSize_ = style.textSize || 11;
  this.textDecoration_ = style.textDecoration || "none";
  this.fontWeight_ = style.fontWeight || "bold";
  this.fontStyle_ = style.fontStyle || "normal";
  this.fontFamily_ = style.fontFamily || "Arial,sans-serif";
  this.backgroundPosition_ = style.backgroundPosition || "0 0";
};
/**
 * Sets the position at which to center the icon.
 *
 * @param {google.maps.LatLng} center The latlng to set as the center.
 */


ClusterIcon.prototype.setCenter = function (center) {
  this.center_ = center;
};
/**
 * Creates the cssText style parameter based on the position of the icon.
 *
 * @param {google.maps.Point} pos The position of the icon.
 * @return {string} The CSS style text.
 */


ClusterIcon.prototype.createCss = function (pos) {
  var style = [];
  style.push("cursor: pointer;");
  style.push("position: absolute; top: " + pos.y + "px; left: " + pos.x + "px;");
  style.push("width: " + this.width_ + "px; height: " + this.height_ + "px;");
  return style.join("");
};
/**
 * Returns the position at which to place the DIV depending on the latlng.
 *
 * @param {google.maps.LatLng} latlng The position in latlng.
 * @return {google.maps.Point} The position in pixels.
 */


ClusterIcon.prototype.getPosFromLatLng_ = function (latlng) {
  var pos = this.getProjection().fromLatLngToDivPixel(latlng);
  pos.x -= this.anchorIcon_[1];
  pos.y -= this.anchorIcon_[0];
  pos.x = parseInt(pos.x, 10);
  pos.y = parseInt(pos.y, 10);
  return pos;
};
/**
 * Creates a single cluster that manages a group of proximate markers.
 *  Used internally, do not call this constructor directly.
 * @constructor
 * @param {MarkerClusterer} mc The <code>MarkerClusterer</code> object with which this
 *  cluster is associated.
 */


function Cluster(mc) {
  this.markerClusterer_ = mc;
  this.map_ = mc.getMap();
  this.gridSize_ = mc.getGridSize();
  this.minClusterSize_ = mc.getMinimumClusterSize();
  this.averageCenter_ = mc.getAverageCenter();
  this.hideLabel_ = mc.getHideLabel();
  this.markers_ = [];
  this.center_ = null;
  this.bounds_ = null;
  this.clusterIcon_ = new ClusterIcon(this, mc.getStyles());
}
/**
 * Returns the number of markers managed by the cluster. You can call this from
 * a <code>click</code>, <code>mouseover</code>, or <code>mouseout</code> event handler
 * for the <code>MarkerClusterer</code> object.
 *
 * @return {number} The number of markers in the cluster.
 */


Cluster.prototype.getSize = function () {
  return this.markers_.length;
};
/**
 * Returns the array of markers managed by the cluster. You can call this from
 * a <code>click</code>, <code>mouseover</code>, or <code>mouseout</code> event handler
 * for the <code>MarkerClusterer</code> object.
 *
 * @return {Array} The array of markers in the cluster.
 */


Cluster.prototype.getMarkers = function () {
  return this.markers_;
};
/**
 * Returns the center of the cluster. You can call this from
 * a <code>click</code>, <code>mouseover</code>, or <code>mouseout</code> event handler
 * for the <code>MarkerClusterer</code> object.
 *
 * @return {google.maps.LatLng} The center of the cluster.
 */


Cluster.prototype.getCenter = function () {
  return this.center_;
};
/**
 * Returns the map with which the cluster is associated.
 *
 * @return {google.maps.Map} The map.
 * @ignore
 */


Cluster.prototype.getMap = function () {
  return this.map_;
};
/**
 * Returns the <code>MarkerClusterer</code> object with which the cluster is associated.
 *
 * @return {MarkerClusterer} The associated marker clusterer.
 * @ignore
 */


Cluster.prototype.getMarkerClusterer = function () {
  return this.markerClusterer_;
};
/**
 * Returns the bounds of the cluster.
 *
 * @return {google.maps.LatLngBounds} the cluster bounds.
 * @ignore
 */


Cluster.prototype.getBounds = function () {
  var i;
  var bounds = new google.maps.LatLngBounds(this.center_, this.center_);
  var markers = this.getMarkers();

  for (i = 0; i < markers.length; i++) {
    bounds.extend(markers[i].getPosition());
  }

  return bounds;
};
/**
 * Removes the cluster from the map.
 *
 * @ignore
 */


Cluster.prototype.remove = function () {
  this.clusterIcon_.setMap(null);
  this.markers_ = [];
  delete this.markers_;
};
/**
 * Adds a marker to the cluster.
 *
 * @param {google.maps.Marker} marker The marker to be added.
 * @return {boolean} True if the marker was added.
 * @ignore
 */


Cluster.prototype.addMarker = function (marker) {
  var i;
  var mCount;
  var mz;

  if (this.isMarkerAlreadyAdded_(marker)) {
    return false;
  }

  if (!this.center_) {
    this.center_ = marker.getPosition();
    this.calculateBounds_();
  } else {
    if (this.averageCenter_) {
      var l = this.markers_.length + 1;
      var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;
      var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;
      this.center_ = new google.maps.LatLng(lat, lng);
      this.calculateBounds_();
    }
  }

  marker.isAdded = true;
  this.markers_.push(marker);
  mCount = this.markers_.length;
  mz = this.markerClusterer_.getMaxZoom();

  if (mz !== null && this.map_.getZoom() > mz) {
    // Zoomed in past max zoom, so show the marker.
    if (marker.getMap() !== this.map_) {
      marker.setMap(this.map_);
    }
  } else if (mCount < this.minClusterSize_) {
    // Min cluster size not reached so show the marker.
    if (marker.getMap() !== this.map_) {
      marker.setMap(this.map_);
    }
  } else if (mCount === this.minClusterSize_) {
    // Hide the markers that were showing.
    for (i = 0; i < mCount; i++) {
      this.markers_[i].setMap(null);
    }
  } else {
    marker.setMap(null);
  }

  return true;
};
/**
 * Determines if a marker lies within the cluster's bounds.
 *
 * @param {google.maps.Marker} marker The marker to check.
 * @return {boolean} True if the marker lies in the bounds.
 * @ignore
 */


Cluster.prototype.isMarkerInClusterBounds = function (marker) {
  return this.bounds_.contains(marker.getPosition());
};
/**
 * Calculates the extended bounds of the cluster with the grid.
 */


Cluster.prototype.calculateBounds_ = function () {
  var bounds = new google.maps.LatLngBounds(this.center_, this.center_);
  this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);
};
/**
 * Updates the cluster icon.
 */


Cluster.prototype.updateIcon_ = function () {
  var mCount = this.markers_.length;
  var mz = this.markerClusterer_.getMaxZoom();

  if (mz !== null && this.map_.getZoom() > mz) {
    this.clusterIcon_.hide();
    return;
  }

  if (mCount < this.minClusterSize_) {
    // Min cluster size not yet reached.
    this.clusterIcon_.hide();
    return;
  }

  var numStyles = this.markerClusterer_.getStyles().length;
  var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);
  this.clusterIcon_.setCenter(this.center_);
  this.clusterIcon_.useStyle(sums);
  this.clusterIcon_.show();
};
/**
 * Determines if a marker has already been added to the cluster.
 *
 * @param {google.maps.Marker} marker The marker to check.
 * @return {boolean} True if the marker has already been added.
 */


Cluster.prototype.isMarkerAlreadyAdded_ = function (marker) {
  for (var i = 0, n = this.markers_.length; i < n; i++) {
    if (marker === this.markers_[i]) {
      return true;
    }
  }

  return false;
};
/**
 * @name MarkerClustererOptions
 * @class This class represents the optional parameter passed to
 *  the {@link MarkerClusterer} constructor.
 * @property {number} [gridSize=60] The grid size of a cluster in pixels. The grid is a square.
 * @property {number} [maxZoom=null] The maximum zoom level at which clustering is enabled or
 *  <code>null</code> if clustering is to be enabled at all zoom levels.
 * @property {boolean} [zoomOnClick=true] Whether to zoom the map when a cluster marker is
 *  clicked. You may want to set this to <code>false</code> if you have installed a handler
 *  for the <code>click</code> event and it deals with zooming on its own.
 * @property {boolean} [averageCenter=false] Whether the position of a cluster marker should be
 *  the average position of all markers in the cluster. If set to <code>false</code>, the
 *  cluster marker is positioned at the location of the first marker added to the cluster.
 * @property {number} [minimumClusterSize=2] The minimum number of markers needed in a cluster
 *  before the markers are hidden and a cluster marker appears.
 * @property {boolean} [ignoreHidden=false] Whether to ignore hidden markers in clusters. You
 *  may want to set this to <code>true</code> to ensure that hidden markers are not included
 *  in the marker count that appears on a cluster marker (this count is the value of the
 *  <code>text</code> property of the result returned by the default <code>calculator</code>).
 *  If set to <code>true</code> and you change the visibility of a marker being clustered, be
 *  sure to also call <code>MarkerClusterer.repaint()</code>.
 * @property {string} [title=""] The tooltip to display when the mouse moves over a cluster
 *  marker. (Alternatively, you can use a custom <code>calculator</code> function to specify a
 *  different tooltip for each cluster marker.)
 * @property {function} [calculator=MarkerClusterer.CALCULATOR] The function used to determine
 *  the text to be displayed on a cluster marker and the index indicating which style to use
 *  for the cluster marker. The input parameters for the function are (1) the array of markers
 *  represented by a cluster marker and (2) the number of cluster icon styles. It returns a
 *  {@link ClusterIconInfo} object. The default <code>calculator</code> returns a
 *  <code>text</code> property which is the number of markers in the cluster and an
 *  <code>index</code> property which is one higher than the lowest integer such that
 *  <code>10^i</code> exceeds the number of markers in the cluster, or the size of the styles
 *  array, whichever is less. The <code>styles</code> array element used has an index of
 *  <code>index</code> minus 1. For example, the default <code>calculator</code> returns a
 *  <code>text</code> value of <code>"125"</code> and an <code>index</code> of <code>3</code>
 *  for a cluster icon representing 125 markers so the element used in the <code>styles</code>
 *  array is <code>2</code>. A <code>calculator</code> may also return a <code>title</code>
 *  property that contains the text of the tooltip to be used for the cluster marker. If
 *   <code>title</code> is not defined, the tooltip is set to the value of the <code>title</code>
 *   property for the MarkerClusterer.
 * @property {string} [clusterClass="cluster"] The name of the CSS class defining general styles
 *  for the cluster markers. Use this class to define CSS styles that are not set up by the code
 *  that processes the <code>styles</code> array.
 * @property {Array} [styles] An array of {@link ClusterIconStyle} elements defining the styles
 *  of the cluster markers to be used. The element to be used to style a given cluster marker
 *  is determined by the function defined by the <code>calculator</code> property.
 *  The default is an array of {@link ClusterIconStyle} elements whose properties are derived
 *  from the values for <code>imagePath</code>, <code>imageExtension</code>, and
 *  <code>imageSizes</code>.
 * @property {boolean} [enableRetinaIcons=false] Whether to allow the use of cluster icons that
 * have sizes that are some multiple (typically double) of their actual display size. Icons such
 * as these look better when viewed on high-resolution monitors such as Apple's Retina displays.
 * Note: if this property is <code>true</code>, sprites cannot be used as cluster icons.
 * @property {number} [batchSize=MarkerClusterer.BATCH_SIZE] Set this property to the
 *  number of markers to be processed in a single batch when using a browser other than
 *  Internet Explorer (for Internet Explorer, use the batchSizeIE property instead).
 * @property {number} [batchSizeIE=MarkerClusterer.BATCH_SIZE_IE] When Internet Explorer is
 *  being used, markers are processed in several batches with a small delay inserted between
 *  each batch in an attempt to avoid Javascript timeout errors. Set this property to the
 *  number of markers to be processed in a single batch; select as high a number as you can
 *  without causing a timeout error in the browser. This number might need to be as low as 100
 *  if 15,000 markers are being managed, for example.
 * @property {string} [imagePath=MarkerClusterer.IMAGE_PATH]
 *  The full URL of the root name of the group of image files to use for cluster icons.
 *  The complete file name is of the form <code>imagePath</code>n.<code>imageExtension</code>
 *  where n is the image file number (1, 2, etc.).
 * @property {string} [imageExtension=MarkerClusterer.IMAGE_EXTENSION]
 *  The extension name for the cluster icon image files (e.g., <code>"png"</code> or
 *  <code>"jpg"</code>).
 * @property {Array} [imageSizes=MarkerClusterer.IMAGE_SIZES]
 *  An array of numbers containing the widths of the group of
 *  <code>imagePath</code>n.<code>imageExtension</code> image files.
 *  (The images are assumed to be square.)
 */

/**
 * Creates a MarkerClusterer object with the options specified in {@link MarkerClustererOptions}.
 * @constructor
 * @extends google.maps.OverlayView
 * @param {google.maps.Map} map The Google map to attach to.
 * @param {Array.<google.maps.Marker>} [opt_markers] The markers to be added to the cluster.
 * @param {MarkerClustererOptions} [opt_options] The optional parameters.
 */


function MarkerClusterer(map, opt_markers, opt_options) {
  // MarkerClusterer implements google.maps.OverlayView interface. We use the
  // extend function to extend MarkerClusterer with google.maps.OverlayView
  // because it might not always be available when the code is defined so we
  // look for it at the last possible moment. If it doesn't exist now then
  // there is no point going ahead :)
  this.extend(MarkerClusterer, google.maps.OverlayView);
  opt_markers = opt_markers || [];
  opt_options = opt_options || {};
  this.markers_ = [];
  this.clusters_ = [];
  this.listeners_ = [];
  this.activeMap_ = null;
  this.ready_ = false;
  this.gridSize_ = opt_options.gridSize || 60;
  this.minClusterSize_ = opt_options.minimumClusterSize || 2;
  this.maxZoom_ = opt_options.maxZoom || null;
  this.styles_ = opt_options.styles || [];
  this.title_ = opt_options.title || "";
  this.zoomOnClick_ = true;

  if (opt_options.zoomOnClick !== undefined) {
    this.zoomOnClick_ = opt_options.zoomOnClick;
  }

  this.averageCenter_ = false;

  if (opt_options.averageCenter !== undefined) {
    this.averageCenter_ = opt_options.averageCenter;
  }

  this.ignoreHidden_ = false;

  if (opt_options.ignoreHidden !== undefined) {
    this.ignoreHidden_ = opt_options.ignoreHidden;
  }

  this.enableRetinaIcons_ = false;

  if (opt_options.enableRetinaIcons !== undefined) {
    this.enableRetinaIcons_ = opt_options.enableRetinaIcons;
  }

  this.hideLabel_ = false;

  if (opt_options.hideLabel !== undefined) {
    this.hideLabel_ = opt_options.hideLabel;
  }

  this.imagePath_ = opt_options.imagePath || MarkerClusterer.IMAGE_PATH;
  this.imageExtension_ = opt_options.imageExtension || MarkerClusterer.IMAGE_EXTENSION;
  this.imageSizes_ = opt_options.imageSizes || MarkerClusterer.IMAGE_SIZES;
  this.calculator_ = opt_options.calculator || MarkerClusterer.CALCULATOR;
  this.batchSize_ = opt_options.batchSize || MarkerClusterer.BATCH_SIZE;
  this.batchSizeIE_ = opt_options.batchSizeIE || MarkerClusterer.BATCH_SIZE_IE;
  this.clusterClass_ = opt_options.clusterClass || "cluster";

  if (navigator.userAgent.toLowerCase().indexOf("msie") !== -1) {
    // Try to avoid IE timeout when processing a huge number of markers:
    this.batchSize_ = this.batchSizeIE_;
  }

  this.setupStyles_();
  this.addMarkers(opt_markers, true);
  this.setMap(map); // Note: this causes onAdd to be called
}
/**
 * Implementation of the onAdd interface method.
 * @ignore
 */


MarkerClusterer.prototype.onAdd = function () {
  var cMarkerClusterer = this;
  this.activeMap_ = this.getMap();
  this.ready_ = true;
  this.repaint(); // Add the map event listeners

  this.listeners_ = [google.maps.event.addListener(this.getMap(), "zoom_changed", function () {
    cMarkerClusterer.resetViewport_(false); // Workaround for this Google bug: when map is at level 0 and "-" of
    // zoom slider is clicked, a "zoom_changed" event is fired even though
    // the map doesn't zoom out any further. In this situation, no "idle"
    // event is triggered so the cluster markers that have been removed
    // do not get redrawn. Same goes for a zoom in at maxZoom.

    if (this.getZoom() === (this.get("minZoom") || 0) || this.getZoom() === this.get("maxZoom")) {
      google.maps.event.trigger(this, "idle");
    }
  }), google.maps.event.addListener(this.getMap(), "idle", function () {
    cMarkerClusterer.redraw_();
  })];
};
/**
 * Implementation of the onRemove interface method.
 * Removes map event listeners and all cluster icons from the DOM.
 * All managed markers are also put back on the map.
 * @ignore
 */


MarkerClusterer.prototype.onRemove = function () {
  var i; // Put all the managed markers back on the map:

  for (i = 0; i < this.markers_.length; i++) {
    if (this.markers_[i].getMap() !== this.activeMap_) {
      this.markers_[i].setMap(this.activeMap_);
    }
  } // Remove all clusters:


  for (i = 0; i < this.clusters_.length; i++) {
    this.clusters_[i].remove();
  }

  this.clusters_ = []; // Remove map event listeners:

  for (i = 0; i < this.listeners_.length; i++) {
    google.maps.event.removeListener(this.listeners_[i]);
  }

  this.listeners_ = [];
  this.activeMap_ = null;
  this.ready_ = false;
};
/**
 * Implementation of the draw interface method.
 * @ignore
 */


MarkerClusterer.prototype.draw = function () {};
/**
 * Sets up the styles object.
 */


MarkerClusterer.prototype.setupStyles_ = function () {
  var i, size;

  if (this.styles_.length > 0) {
    return;
  }

  for (i = 0; i < this.imageSizes_.length; i++) {
    size = this.imageSizes_[i];
    this.styles_.push({
      url: this.imagePath_ + (i + 1) + "." + this.imageExtension_,
      height: size,
      width: size
    });
  }
};
/**
 *  Fits the map to the bounds of the markers managed by the clusterer.
 */


MarkerClusterer.prototype.fitMapToMarkers = function () {
  var i;
  var markers = this.getMarkers();
  var bounds = new google.maps.LatLngBounds();

  for (i = 0; i < markers.length; i++) {
    bounds.extend(markers[i].getPosition());
  }

  this.getMap().fitBounds(bounds);
};
/**
 * Returns the value of the <code>gridSize</code> property.
 *
 * @return {number} The grid size.
 */


MarkerClusterer.prototype.getGridSize = function () {
  return this.gridSize_;
};
/**
 * Sets the value of the <code>gridSize</code> property.
 *
 * @param {number} gridSize The grid size.
 */


MarkerClusterer.prototype.setGridSize = function (gridSize) {
  this.gridSize_ = gridSize;
};
/**
 * Returns the value of the <code>minimumClusterSize</code> property.
 *
 * @return {number} The minimum cluster size.
 */


MarkerClusterer.prototype.getMinimumClusterSize = function () {
  return this.minClusterSize_;
};
/**
 * Sets the value of the <code>minimumClusterSize</code> property.
 *
 * @param {number} minimumClusterSize The minimum cluster size.
 */


MarkerClusterer.prototype.setMinimumClusterSize = function (minimumClusterSize) {
  this.minClusterSize_ = minimumClusterSize;
};
/**
 *  Returns the value of the <code>maxZoom</code> property.
 *
 *  @return {number} The maximum zoom level.
 */


MarkerClusterer.prototype.getMaxZoom = function () {
  return this.maxZoom_;
};
/**
 *  Sets the value of the <code>maxZoom</code> property.
 *
 *  @param {number} maxZoom The maximum zoom level.
 */


MarkerClusterer.prototype.setMaxZoom = function (maxZoom) {
  this.maxZoom_ = maxZoom;
};
/**
 *  Returns the value of the <code>styles</code> property.
 *
 *  @return {Array} The array of styles defining the cluster markers to be used.
 */


MarkerClusterer.prototype.getStyles = function () {
  return this.styles_;
};
/**
 *  Sets the value of the <code>styles</code> property.
 *
 *  @param {Array.<ClusterIconStyle>} styles The array of styles to use.
 */


MarkerClusterer.prototype.setStyles = function (styles) {
  this.styles_ = styles;
};
/**
 * Returns the value of the <code>title</code> property.
 *
 * @return {string} The content of the title text.
 */


MarkerClusterer.prototype.getTitle = function () {
  return this.title_;
};
/**
 *  Sets the value of the <code>title</code> property.
 *
 *  @param {string} title The value of the title property.
 */


MarkerClusterer.prototype.setTitle = function (title) {
  this.title_ = title;
};
/**
 * Returns the value of the <code>zoomOnClick</code> property.
 *
 * @return {boolean} True if zoomOnClick property is set.
 */


MarkerClusterer.prototype.getZoomOnClick = function () {
  return this.zoomOnClick_;
};
/**
 *  Sets the value of the <code>zoomOnClick</code> property.
 *
 *  @param {boolean} zoomOnClick The value of the zoomOnClick property.
 */


MarkerClusterer.prototype.setZoomOnClick = function (zoomOnClick) {
  this.zoomOnClick_ = zoomOnClick;
};
/**
 * Returns the value of the <code>averageCenter</code> property.
 *
 * @return {boolean} True if averageCenter property is set.
 */


MarkerClusterer.prototype.getAverageCenter = function () {
  return this.averageCenter_;
};
/**
 *  Sets the value of the <code>averageCenter</code> property.
 *
 *  @param {boolean} averageCenter The value of the averageCenter property.
 */


MarkerClusterer.prototype.setAverageCenter = function (averageCenter) {
  this.averageCenter_ = averageCenter;
};
/**
 * Returns the value of the <code>ignoreHidden</code> property.
 *
 * @return {boolean} True if ignoreHidden property is set.
 */


MarkerClusterer.prototype.getIgnoreHidden = function () {
  return this.ignoreHidden_;
};
/**
 *  Sets the value of the <code>ignoreHidden</code> property.
 *
 *  @param {boolean} ignoreHidden The value of the ignoreHidden property.
 */


MarkerClusterer.prototype.setIgnoreHidden = function (ignoreHidden) {
  this.ignoreHidden_ = ignoreHidden;
};
/**
 * Returns the value of the <code>enableRetinaIcons</code> property.
 *
 * @return {boolean} True if enableRetinaIcons property is set.
 */


MarkerClusterer.prototype.getEnableRetinaIcons = function () {
  return this.enableRetinaIcons_;
};
/**
 *  Sets the value of the <code>enableRetinaIcons</code> property.
 *
 *  @param {boolean} enableRetinaIcons The value of the enableRetinaIcons property.
 */


MarkerClusterer.prototype.setEnableRetinaIcons = function (enableRetinaIcons) {
  this.enableRetinaIcons_ = enableRetinaIcons;
};
/**
 * Returns the value of the <code>imageExtension</code> property.
 *
 * @return {string} The value of the imageExtension property.
 */


MarkerClusterer.prototype.getImageExtension = function () {
  return this.imageExtension_;
};
/**
 *  Sets the value of the <code>imageExtension</code> property.
 *
 *  @param {string} imageExtension The value of the imageExtension property.
 */


MarkerClusterer.prototype.setImageExtension = function (imageExtension) {
  this.imageExtension_ = imageExtension;
};
/**
 * Returns the value of the <code>imagePath</code> property.
 *
 * @return {string} The value of the imagePath property.
 */


MarkerClusterer.prototype.getImagePath = function () {
  return this.imagePath_;
};
/**
 *  Sets the value of the <code>imagePath</code> property.
 *
 *  @param {string} imagePath The value of the imagePath property.
 */


MarkerClusterer.prototype.setImagePath = function (imagePath) {
  this.imagePath_ = imagePath;
};
/**
 * Returns the value of the <code>imageSizes</code> property.
 *
 * @return {Array} The value of the imageSizes property.
 */


MarkerClusterer.prototype.getImageSizes = function () {
  return this.imageSizes_;
};
/**
 *  Sets the value of the <code>imageSizes</code> property.
 *
 *  @param {Array} imageSizes The value of the imageSizes property.
 */


MarkerClusterer.prototype.setImageSizes = function (imageSizes) {
  this.imageSizes_ = imageSizes;
};
/**
 * Returns the value of the <code>calculator</code> property.
 *
 * @return {function} the value of the calculator property.
 */


MarkerClusterer.prototype.getCalculator = function () {
  return this.calculator_;
};
/**
 * Sets the value of the <code>calculator</code> property.
 *
 * @param {function(Array.<google.maps.Marker>, number)} calculator The value
 *  of the calculator property.
 */


MarkerClusterer.prototype.setCalculator = function (calculator) {
  this.calculator_ = calculator;
};
/**
 * Sets the value of the <code>hideLabel</code> property.
 *
 *  @param {boolean} printable The value of the hideLabel property.
 */


MarkerClusterer.prototype.setHideLabel = function (hideLabel) {
  this.hideLabel_ = hideLabel;
};
/**
 * Returns the value of the <code>hideLabel</code> property.
 *
 * @return {boolean} the value of the hideLabel property.
 */


MarkerClusterer.prototype.getHideLabel = function () {
  return this.hideLabel_;
};
/**
 * Returns the value of the <code>batchSizeIE</code> property.
 *
 * @return {number} the value of the batchSizeIE property.
 */


MarkerClusterer.prototype.getBatchSizeIE = function () {
  return this.batchSizeIE_;
};
/**
 * Sets the value of the <code>batchSizeIE</code> property.
 *
 *  @param {number} batchSizeIE The value of the batchSizeIE property.
 */


MarkerClusterer.prototype.setBatchSizeIE = function (batchSizeIE) {
  this.batchSizeIE_ = batchSizeIE;
};
/**
 * Returns the value of the <code>clusterClass</code> property.
 *
 * @return {string} the value of the clusterClass property.
 */


MarkerClusterer.prototype.getClusterClass = function () {
  return this.clusterClass_;
};
/**
 * Sets the value of the <code>clusterClass</code> property.
 *
 *  @param {string} clusterClass The value of the clusterClass property.
 */


MarkerClusterer.prototype.setClusterClass = function (clusterClass) {
  this.clusterClass_ = clusterClass;
};
/**
 *  Returns the array of markers managed by the clusterer.
 *
 *  @return {Array} The array of markers managed by the clusterer.
 */


MarkerClusterer.prototype.getMarkers = function () {
  return this.markers_;
};
/**
 *  Returns the number of markers managed by the clusterer.
 *
 *  @return {number} The number of markers.
 */


MarkerClusterer.prototype.getTotalMarkers = function () {
  return this.markers_.length;
};
/**
 * Returns the current array of clusters formed by the clusterer.
 *
 * @return {Array} The array of clusters formed by the clusterer.
 */


MarkerClusterer.prototype.getClusters = function () {
  return this.clusters_;
};
/**
 * Returns the number of clusters formed by the clusterer.
 *
 * @return {number} The number of clusters formed by the clusterer.
 */


MarkerClusterer.prototype.getTotalClusters = function () {
  return this.clusters_.length;
};
/**
 * Adds a marker to the clusterer. The clusters are redrawn unless
 *  <code>opt_nodraw</code> is set to <code>true</code>.
 *
 * @param {google.maps.Marker} marker The marker to add.
 * @param {boolean} [opt_nodraw] Set to <code>true</code> to prevent redrawing.
 */


MarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) {
  this.pushMarkerTo_(marker);

  if (!opt_nodraw) {
    this.redraw_();
  }
};
/**
 * Adds an array of markers to the clusterer. The clusters are redrawn unless
 *  <code>opt_nodraw</code> is set to <code>true</code>.
 *
 * @param {Array.<google.maps.Marker>} markers The markers to add.
 * @param {boolean} [opt_nodraw] Set to <code>true</code> to prevent redrawing.
 */


MarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) {
  var key;

  for (key in markers) {
    if (markers.hasOwnProperty(key)) {
      this.pushMarkerTo_(markers[key]);
    }
  }

  if (!opt_nodraw) {
    this.redraw_();
  }
};
/**
 * Pushes a marker to the clusterer.
 *
 * @param {google.maps.Marker} marker The marker to add.
 */


MarkerClusterer.prototype.pushMarkerTo_ = function (marker) {
  // If the marker is draggable add a listener so we can update the clusters on the dragend:
  // if (marker.getDraggable()) {
  //     var cMarkerClusterer = this;
  //     google.maps.event.addListener(marker, "dragend", function() {
  //         if (cMarkerClusterer.ready_) {
  //             this.isAdded = false;
  //             cMarkerClusterer.repaint();
  //         }
  //     });
  // }
  marker.isAdded = false;
  this.markers_.push(marker);
};
/**
 * Removes a marker from the cluster and map.  The clusters are redrawn unless
 *  <code>opt_nodraw</code> is set to <code>true</code>. Returns <code>true</code> if the
 *  marker was removed from the clusterer.
 *
 * @param {google.maps.Marker} marker The marker to remove.
 * @param {boolean} [opt_nodraw] Set to <code>true</code> to prevent redrawing.
 * @param {boolean} [opt_noMapRemove] Set to <code>true</code> to prevent removal from map but still removing from cluster management
 * @return {boolean} True if the marker was removed from the clusterer.
 */


MarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw, opt_noMapRemove) {
  var removeFromMap = true && !opt_noMapRemove;
  var removed = this.removeMarker_(marker, removeFromMap);

  if (!opt_nodraw && removed) {
    this.repaint();
  }

  return removed;
};
/**
 * Removes an array of markers from the cluster and map. The clusters are redrawn unless
 *  <code>opt_nodraw</code> is set to <code>true</code>. Returns <code>true</code> if markers
 *  were removed from the clusterer.
 *
 * @param {Array.<google.maps.Marker>} markers The markers to remove.
 * @param {boolean} [opt_nodraw] Set to <code>true</code> to prevent redrawing.
 * @param {boolean} [opt_noMapRemove] Set to <code>true</code> to prevent removal from map but still removing from cluster management
 * @return {boolean} True if markers were removed from the clusterer.
 */


MarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw, opt_noMapRemove) {
  var i, r;
  var removed = false;
  var removeFromMap = true && !opt_noMapRemove;

  for (i = 0; i < markers.length; i++) {
    r = this.removeMarker_(markers[i], removeFromMap);
    removed = removed || r;
  }

  if (!opt_nodraw && removed) {
    this.repaint();
  }

  return removed;
};
/**
 * Removes a marker and returns true if removed, false if not.
 *
 * @param {google.maps.Marker} marker The marker to remove
 * @param {boolean} removeFromMap set to <code>true</code> to explicitly remove from map as well as cluster manangement
 * @return {boolean} Whether the marker was removed or not
 */


MarkerClusterer.prototype.removeMarker_ = function (marker, removeFromMap) {
  var i;
  var index = -1;

  if (this.markers_.indexOf) {
    index = this.markers_.indexOf(marker);
  } else {
    for (i = 0; i < this.markers_.length; i++) {
      if (marker === this.markers_[i]) {
        index = i;
        break;
      }
    }
  }

  if (index === -1) {
    // Marker is not in our list of markers, so do nothing:
    return false;
  }

  if (removeFromMap) {
    marker.setMap(null);
  }

  this.markers_.splice(index, 1); // Remove the marker from the list of managed markers

  return true;
};
/**
 * Removes all clusters and markers from the map and also removes all markers
 *  managed by the clusterer.
 */


MarkerClusterer.prototype.clearMarkers = function () {
  this.resetViewport_(true);
  this.markers_ = [];
};
/**
 * Recalculates and redraws all the marker clusters from scratch.
 *  Call this after changing any properties.
 */


MarkerClusterer.prototype.repaint = function () {
  var oldClusters = this.clusters_.slice();
  this.clusters_ = [];
  this.resetViewport_(false);
  this.redraw_(); // Remove the old clusters.
  // Do it in a timeout to prevent blinking effect.

  setTimeout(function () {
    var i;

    for (i = 0; i < oldClusters.length; i++) {
      oldClusters[i].remove();
    }
  }, 0);
};
/**
 * Returns the current bounds extended by the grid size.
 *
 * @param {google.maps.LatLngBounds} bounds The bounds to extend.
 * @return {google.maps.LatLngBounds} The extended bounds.
 * @ignore
 */


MarkerClusterer.prototype.getExtendedBounds = function (bounds) {
  var projection = this.getProjection(); // Turn the bounds into latlng.

  var tr = new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng());
  var bl = new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng()); // Convert the points to pixels and the extend out by the grid size.

  var trPix = projection.fromLatLngToDivPixel(tr);
  trPix.x += this.gridSize_;
  trPix.y -= this.gridSize_;
  var blPix = projection.fromLatLngToDivPixel(bl);
  blPix.x -= this.gridSize_;
  blPix.y += this.gridSize_; // Convert the pixel points back to LatLng

  var ne = projection.fromDivPixelToLatLng(trPix);
  var sw = projection.fromDivPixelToLatLng(blPix); // Extend the bounds to contain the new bounds.

  bounds.extend(ne);
  bounds.extend(sw);
  return bounds;
};
/**
 * Redraws all the clusters.
 */


MarkerClusterer.prototype.redraw_ = function () {
  this.createClusters_(0);
};
/**
 * Removes all clusters from the map. The markers are also removed from the map
 *  if <code>opt_hide</code> is set to <code>true</code>.
 *
 * @param {boolean} [opt_hide] Set to <code>true</code> to also remove the markers
 *  from the map.
 */


MarkerClusterer.prototype.resetViewport_ = function (opt_hide) {
  var i, marker; // Remove all the clusters

  for (i = 0; i < this.clusters_.length; i++) {
    this.clusters_[i].remove();
  }

  this.clusters_ = []; // Reset the markers to not be added and to be removed from the map.

  for (i = 0; i < this.markers_.length; i++) {
    marker = this.markers_[i];
    marker.isAdded = false;

    if (opt_hide) {
      marker.setMap(null);
    }
  }
};
/**
 * Calculates the distance between two latlng locations in km.
 *
 * @param {google.maps.LatLng} p1 The first lat lng point.
 * @param {google.maps.LatLng} p2 The second lat lng point.
 * @return {number} The distance between the two points in km.
 * @see http://www.movable-type.co.uk/scripts/latlong.html
 */


MarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) {
  var R = 6371; // Radius of the Earth in km

  var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;
  var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;
  var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c;
  return d;
};
/**
 * Determines if a marker is contained in a bounds.
 *
 * @param {google.maps.Marker} marker The marker to check.
 * @param {google.maps.LatLngBounds} bounds The bounds to check against.
 * @return {boolean} True if the marker is in the bounds.
 */


MarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) {
  var northEast = bounds.getNorthEast();
  var southWest = bounds.getSouthWest();
  var position = marker.getPosition();
  var minX, maxX, minY, maxY;
  minX = southWest.lat();
  maxX = northEast.lat();
  minY = southWest.lng();
  maxY = northEast.lng();

  while (0 > maxY) maxY += 180;

  maxY += 180; // bounds[this.a].g = maxY;? what for

  if (minX < position.lat() && position.lat() < maxX && minY < position.lng() && position.lng() < maxY) {
    return true;
  }

  return false;
};
/**
 * Adds a marker to a cluster, or creates a new cluster.
 *
 * @param {google.maps.Marker} marker The marker to add.
 */


MarkerClusterer.prototype.addToClosestCluster_ = function (marker) {
  var i, d, cluster, center;
  var distance = 40000; // Some large number

  var clusterToAddTo = null;

  for (i = 0; i < this.clusters_.length; i++) {
    cluster = this.clusters_[i];
    center = cluster.getCenter();

    if (center) {
      d = this.distanceBetweenPoints_(center, marker.getPosition());

      if (d < distance) {
        distance = d;
        clusterToAddTo = cluster;
      }
    }
  }

  if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {
    clusterToAddTo.addMarker(marker);
  } else {
    cluster = new Cluster(this);
    cluster.addMarker(marker);
    this.clusters_.push(cluster);
  }
};
/**
 * Creates the clusters. This is done in batches to avoid timeout errors
 *  in some browsers when there is a huge number of markers.
 *
 * @param {number} iFirst The index of the first marker in the batch of
 *  markers to be added to clusters.
 */


MarkerClusterer.prototype.createClusters_ = function (iFirst) {
  var i, marker;
  var mapBounds;
  var cMarkerClusterer = this;

  if (!this.ready_) {
    return;
  } // Cancel previous batch processing if we're working on the first batch:


  if (iFirst === 0) {
    /**
     * This event is fired when the <code>MarkerClusterer</code> begins
     *  clustering markers.
     * @name MarkerClusterer#clusteringbegin
     * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.
     * @event
     */
    google.maps.event.trigger(this, "clusteringbegin", this);

    if (typeof this.timerRefStatic !== "undefined") {
      clearTimeout(this.timerRefStatic);
      delete this.timerRefStatic;
    }
  } // Get our current map view bounds.
  // Create a new bounds object so we don't affect the map.
  //
  // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:


  if (this.getMap().getZoom() > 3) {
    mapBounds = new google.maps.LatLngBounds(this.getMap().getBounds().getSouthWest(), this.getMap().getBounds().getNorthEast());
  } else {
    mapBounds = new google.maps.LatLngBounds(new google.maps.LatLng(85.02070771743472, -178.48388434375), new google.maps.LatLng(-85.08136444384544, 178.00048865625));
  }

  var bounds = this.getExtendedBounds(mapBounds); // console.log(bounds);

  var iLast = Math.min(iFirst + this.batchSize_, this.markers_.length);

  for (i = iFirst; i < iLast; i++) {
    this.markers_[i];

    if (this.markers_.isFilter === true) {
      if (this.markers_[i].isFilter === undefined) {
        if (this.markers_[i].setMap !== undefined) this.markers_[i].setMap(null);
        continue;
      }
    }

    if (!this.markers_[i].isAdded && this.isMarkerInBounds_(this.markers_[i], bounds)) {
      if (!this.ignoreHidden_ || this.ignoreHidden_ && this.markers_[i].getVisible()) {
        if (this.markers_[i].getMap === undefined) this.markers_[i] = this.addOrtherMarker(this.markers_[i]);
        this.addToClosestCluster_(this.markers_[i]);
      }
    }
  }

  if (iLast < this.markers_.length) {
    this.timerRefStatic = setTimeout(function () {
      cMarkerClusterer.createClusters_(iLast);
    }, 0);
  } else {
    delete this.timerRefStatic;
    /**
     * This event is fired when the <code>MarkerClusterer</code> stops
     *  clustering markers.
     * @name MarkerClusterer#clusteringend
     * @param {MarkerClusterer} mc The MarkerClusterer whose markers are being clustered.
     * @event
     */

    google.maps.event.trigger(this, "clusteringend", this);

    for (i = 0; i < this.clusters_.length; i++) {
      this.clusters_[i].updateIcon_();
    }
  }
};

MarkerClusterer.prototype.addOrtherMarker = function (data) {
  var self = this;
  var position = [data.lat, data.lng];
  var color, tooltip;
  if (typeof testVariable !== "undefined") color = systemconfig.markerColor;
  if (data.color) color = data.color;
  if (data.tooltip) tooltip = data.tooltip;
  var image = {
    path: "M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z",
    // This marker is 20 pixels wide by 32 pixels high.
    scaledSize: new google.maps.Size(24, 24),
    // The origin for this image is (0, 0).
    origin: new google.maps.Point(0, 0),
    // The anchor for this image is the base of the flagpole at (0, 32).
    anchor: new google.maps.Point(12, 12),
    fillColor: color,
    fillOpacity: 1,
    strokeColor: "white",
    strokeWeight: 4
  };
  var marker = new google.maps.Marker({
    position: new google.maps.LatLng(position[0], position[1]),
    draggable: false,
    icon: image,
    zIndex: 2
  });

  if (tooltip) {
    var style = {
      maxWidth: 350
    };
    var content = "";

    if (typeof tooltip == "object") {
      if (tooltip.style) style = tooltip.style;
      if (tooltip.element) content = tooltip.element;
    } else content = tooltip;

    var infowindow = new google.maps.InfoWindow(style);
    google.maps.event.addListener(marker, 'mouseover', function () {
      infowindow.setContent(content);
      infowindow.open(self.map_, marker);
    });
    google.maps.event.addListener(marker, 'mouseout', function (event) {
      infowindow.close();
    });
  }

  marker.dataMarker = data;
  marker.isFilter = data.isFilter;
  return marker;
};
/**
 * Extends an object's prototype by another's.
 *
 * @param {Object} obj1 The object to be extended.
 * @param {Object} obj2 The object to extend with.
 * @return {Object} The new extended object.
 * @ignore
 */


MarkerClusterer.prototype.extend = function (obj1, obj2) {
  return function (object) {
    var property;

    for (property in object.prototype) {
      this.prototype[property] = object.prototype[property];
    }

    return this;
  }.apply(obj1, [obj2]);
};
/**
 * The default function for determining the label text and style
 * for a cluster icon.
 *
 * @param {Array.<google.maps.Marker>} markers The array of markers represented by the cluster.
 * @param {number} numStyles The number of marker styles available.
 * @return {ClusterIconInfo} The information resource for the cluster.
 * @constant
 * @ignore
 */


MarkerClusterer.CALCULATOR = function (markers, numStyles) {
  var index = 0;
  var title = "";
  var count = markers.length.toString();
  var dv = count;

  while (dv !== 0) {
    dv = parseInt(dv / 10, 10);
    index++;
  }

  index = Math.min(index, numStyles);
  return {
    text: count,
    index: index,
    title: title
  };
};
/**
 * The number of markers to process in one batch.
 *
 * @type {number}
 * @constant
 */


MarkerClusterer.BATCH_SIZE = 2000;
/**
 * The number of markers to process in one batch (IE only).
 *
 * @type {number}
 * @constant
 */

MarkerClusterer.BATCH_SIZE_IE = 500;
/**
 * The default root name for the marker cluster images.
 *
 * @type {string}
 * @constant
 */

MarkerClusterer.IMAGE_PATH = "//cdn.rawgit.com/mahnunchik/markerclustererplus/master/images/m";
/**
 * The default extension name for the marker cluster images.
 *
 * @type {string}
 * @constant
 */

MarkerClusterer.IMAGE_EXTENSION = "png";
/**
 * The default array of sizes for the marker cluster images.
 *
 * @type {Array.<number>}
 * @constant
 */

MarkerClusterer.IMAGE_SIZES = [53, 56, 66, 78, 90];

if (typeof String.prototype.trim !== 'function') {
  /**
   * IE hack since trim() doesn't exist in all browsers
   * @return {string} The string with removed whitespace
   */
  String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, '');
  };
}

window.MarkerClusterer = MarkerClusterer;
var _default = MarkerClusterer;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/LocationView.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/LocationView.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _utils = require("./utils");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _MarkerClusterer = _interopRequireDefault(require("./MarkerClusterer"));




var MARKER_RADIUS = 10;
var MARKER_BORDER_COLOR = '#4945C8';

function generateColor(id) {
  id = id + '';
  var rgb = [0, 0, 0];
  var res;

  var white = _Color.default.parse('white');

  var c = 100;

  while (c--) {
    for (var i = 0; i < id.length; ++i) {
      rgb[i % 3] = (rgb[i % 3] * 31 + id.charCodeAt(i) * 173) % 255;
    }

    res = new _Color.default([rgb[0] / 255, rgb[1] / 255, rgb[2] / 255, 1]);

    if (res.getContrastWith(white) > 2 && rgb[0] + rgb[1] + rgb[2] > 50) {
      break;
    }
  }

  return res;
} // https://lab.daithangminh.vn/home_co/carddone/markerclusterer.js


var loadMarkerClustererSync = null;
var lastOpenInfo = null;
/***
 *
 * @param {LocationView} viewerElt
 * @param {Object} data
 * @constructor
 */

function LVPolyline(viewerElt, data) {
  this.viewerElt = viewerElt;
  this.map = viewerElt.map;
  this._polylines = [];
  this.id = data.id || (0, _stringGenerate.randomIdent)(12);
  this.polylineData = {
    geodesic: true,
    strokeColor: data.color || generateColor(this.id).toString('hex6'),
    strokeOpacity: 1.0,
    strokeWeight: 2
  };
  this.polylineData.path = data.path.map(function (crd) {
    return (0, _utils.implicitLatLng)(crd);
  });
  this.polylineHL = new google.maps.Polyline(Object.assign({}, this.polylineData, {
    strokeColor: 'white',
    strokeWeight: 5
  }));
  this.polyline = new google.maps.Polyline(this.polylineData);
  this.markers = this.polylineData.path.map(function (crd, i) {
    var mkr = new google.maps.Marker({
      position: crd,
      // sName: data.name || data.id || this.id,
      map: this.map,
      icon: {
        path: google.maps.SymbolPath.CIRCLE,
        scale: MARKER_RADIUS,
        fillColor: this.polylineData.strokeColor,
        fillOpacity: 1,
        strokeWeight: 2,
        strokeColor: MARKER_BORDER_COLOR
      }
    });
    mkr.setMap(this.map);
    var infoWindow;

    if (data.path[i] && data.path[i].info) {
      infoWindow = new google.maps.InfoWindow(data.path[i].info);
      mkr.addListener('mouseover', function () {
        if (lastOpenInfo === infoWindow) return;

        try {
          if (lastOpenInfo) lastOpenInfo.close();
        } catch (e) {}

        lastOpenInfo = infoWindow;
        infoWindow.open({
          anchor: mkr,
          map: this.map,
          shouldFocus: true
        });
      }.bind(this));
    }

    return mkr;
  }.bind(this));
  this.showRoute = viewerElt.showPolylineRoute;
}

LVPolyline.prototype.remove = function () {
  this.polyline.setMap(null);
  this.polylineHL.setMap(null);
  this.markers.forEach(function (mk) {
    mk.setMap(null);
  });
};

Object.defineProperty(LVPolyline.prototype, 'showRoute', {
  set: function (value) {
    this._showRoute = !!value;

    if (value) {
      this.polylineHL.setMap(this.map);
      this.polyline.setMap(this.map);
    } else {
      this.polylineHL.setMap(null);
      this.polyline.setMap(null);
    }
  },
  get: function () {
    return this._showRoute;
  }
});
Object.defineProperty(LVPolyline.prototype, 'color', {
  get: function () {
    return this.polylineData.strokeColor;
  }
});
Object.defineProperty(LVPolyline.prototype, 'sumDistance', {
  get: function () {
    var res = 0;
    var path = this.polylineData.path;

    for (var i = 1; i < path.length; ++i) {
      res += (0, _utils.latLngDistance)(path[i - 1], path[i]);
    }

    return res;
  }
});

function LVPoints(viewerElt, data) {
  this.data = data;
  this.refData = [data];
  this.id = data.id || (0, _stringGenerate.randomIdent)(12);
  this.latLng = (0, _utils.implicitLatLng)(data);

  if (!this.latLng) {
    console.error('Invalid data', data);
    return;
  }

  this.map = viewerElt.map;
  this.marker = new google.maps.Marker({
    position: this.latLng,
    // sName: data.name || data.id || this.id,
    // map: this.map,
    icon: {
      path: google.maps.SymbolPath.CIRCLE,
      scale: MARKER_RADIUS,
      fillColor: data.color || generateColor(this.id).toString(),
      fillOpacity: 1,
      strokeWeight: 2,
      strokeColor: MARKER_BORDER_COLOR
    }
  }); // this.marker.setMap(this.map);

  if (!data.info) return;
  var infoWindow = new google.maps.InfoWindow(data.info);
  this.marker.addListener('mouseover', function () {
    if (lastOpenInfo === infoWindow) return;

    try {
      if (lastOpenInfo) lastOpenInfo.close();
    } catch (e) {}

    lastOpenInfo = infoWindow;
    infoWindow.open({
      anchor: this.marker,
      map: this.map,
      shouldFocus: true
    });
  }.bind(this));
}

LVPoints.prototype.remove = function () {
  if (this.marker) this.marker.setMap(null);
};
/***
 * @extends AElement
 * @constructor
 */


function LocationView() {
  this.map = new google.maps.Map(this, {
    zoom: 8,
    center: new google.maps.LatLng(21.018755, 105.839729)
  });
  this.marker = null;
  this._value = null;
  this.$domSignal = (0, _ACore._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  /***
   * @type {LatLng}
   * @name value
   * @memberOf LocationView#
   */

  /****
   *
   * @type {LVPolyline[]}
   */

  this.$polylines = [];
  this._showPolylineRoute = true;
  /****
   *
   * @type {LVPoints[]}
   */

  this.$points = [];
}

LocationView.tag = 'LocationView'.toLowerCase();

LocationView.render = function () {
  return (0, _ACore._)({
    class: 'as-location-view'
  });
};

LocationView.prototype.getPolylineById = function (id) {
  return this.$polylines.find(function (pll) {
    return pll.id === id;
  }) || null;
};

LocationView.prototype.getPolylines = function () {
  return this.$polylines.slice();
};

LocationView.property = {};
LocationView.property.zoom = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) {
      value = 1;
    }

    this.map.setZoom(value);
  },
  get: function () {
    return this.map.getZoom();
  }
};
LocationView.property.value = {
  set: function (value) {
    value = value || null;
    var latlng = (0, _utils.implicitLatLng)(value);
    latlng = latlng || new google.maps.LatLng(21.018755, 105.839729);
    this.map.setCenter(latlng || new google.maps.LatLng(21.018755, 105.839729));
    this._value = value;

    if (this.marker) {
      this.marker.setMap(null);
      this.marker = null;
    }

    if (latlng && value) {
      this.marker = new google.maps.Marker({
        map: this.map,
        position: latlng
      });
    }
  },
  get: function () {
    return this._value;
  }
};
LocationView.property.polylines = {
  set: function (polylines) {
    this._polylines = polylines || [];
    this.$polylines.forEach(function (pll) {
      pll.remove();
    });
    this.$polylines = polylines.map(function (pll) {
      return new LVPolyline(this, pll);
    }.bind(this));
    var zoom;
    var center;
    var points = this.$polylines.reduce(function (ac, $polyline) {
      return ac.concat($polyline.polylineData.path);
    }, []);
    var bounds = points.reduce(function (ac, cr) {
      ac.extend(cr);
      return ac;
    }, new google.maps.LatLngBounds());
    this.domSignal.once('update_view', function () {
      if (points.length > 1) {
        zoom = (0, _utils.getMapZoomLevel)(this.getBoundingClientRect(), bounds);
        center = bounds.getCenter();
      } else {
        zoom = 17;
        center = points[0] || new google.maps.LatLng(21.018755, 105.839729);
      }

      zoom = Math.min(zoom, 17);
      this.map.setZoom(zoom);
      this.map.setCenter(center);
    }.bind(this), 100);
    this.domSignal.emit('update_view');
  },
  get: function () {
    return this._polylines;
  }
};
LocationView.property.showPolylineRoute = {
  set: function (value) {
    this._showPolylineRoute = !!value;
    this.$polylines.forEach(function (pll) {
      pll.showRoute = value;
    });
  },
  get: function () {
    return this._showPolylineRoute;
  }
};
LocationView.property.points = {
  set: function (points) {
    this.$points.forEach(function (point) {
      point.remove();
    });
    this._points = points || [];

    var rp = this._points.reduce(function (ac, pointData) {
      var id = pointData.id;
      var point;

      if (id && ac.dict[id]) {
        ac.dict[id].refData.push(pointData);
      } else {
        point = new LVPoints(this, pointData);
        ac.dict[point.id] = point;
        ac.arr.push(point);
      }

      return ac;
    }.bind(this), {
      arr: [],
      dict: {}
    });

    this.$points = rp.arr;
    var zoom;
    var center;
    var latLngs = this.$points.map(function (p) {
      return p.latLng;
    }, []).filter(function (x) {
      return !!x;
    });
    var bounds = latLngs.reduce(function (ac, cr) {
      ac.extend(cr);
      return ac;
    }, new google.maps.LatLngBounds());
    var markers = this.$points.map(function (p) {
      return p.marker;
    }, []).filter(function (x) {
      return !!x;
    });
    this.pointsCluster = new _MarkerClusterer.default(this.map, markers, {
      imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'
    });
    this.domSignal.once('update_view', function () {
      if (points.length > 1) {
        zoom = (0, _utils.getMapZoomLevel)(this.getBoundingClientRect(), bounds);
        center = bounds.getCenter();
      } else {
        zoom = 17;
        center = points[0] || new google.maps.LatLng(21.018755, 105.839729);
      }

      zoom = Math.min(zoom, 17);
      this.map.setZoom(zoom);
      this.map.setCenter(center);
    }.bind(this), 100);
    this.domSignal.emit('update_view');
  },
  get: function () {
    return this._points;
  }
};

_ACore.default.install(LocationView);

var _default = LocationView;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/adapter/PlaceSearchAutoCompleteAdapter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/adapter/PlaceSearchAutoCompleteAdapter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {PlaceSearchAutoCompleteInput} inputElt
 * @constructor
 */
function PlaceSearchAutoCompleteAdapter(inputElt) {
  this.inputElt = inputElt;
  this.service = new google.maps.places.AutocompleteService(this.inputElt.$service);
}

PlaceSearchAutoCompleteAdapter.prototype.queryItems = function (query, mInput) {
  var request = {
    input: query
  };
  return new Promise(function (resolve) {
    this.service.getPlacePredictions(request, function (results, status) {
      if (status === google.maps.places.PlacesServiceStatus.OK) {
        resolve(results);
      } else resolve([]);
    });
  }.bind(this));
};

PlaceSearchAutoCompleteAdapter.prototype.getItemText = function (item, mInput) {
  return item.description;
};

PlaceSearchAutoCompleteAdapter.prototype.getItemView = function (item, index, _, $, query, reuseItem, refParent, mInput) {
  return _({
    class: 'as-place-search-auto-complete-item',
    child: [{
      class: 'as-place-search-auto-complete-item-desc',
      child: {
        text: item.description
      }
    }]
  });
};

var _default = PlaceSearchAutoCompleteAdapter;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/PlaceSearchAutoCompleteInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/PlaceSearchAutoCompleteInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _AutoCompleteInput = _interopRequireDefault(require("./AutoCompleteInput"));

var _PlaceSearchAutoCompleteAdapter = _interopRequireDefault(require("./adapter/PlaceSearchAutoCompleteAdapter"));

require("../css/placesearchautocomplete.css");




/***
 * @extends AutoCompleteInput
 * @constructor
 */
function PlaceSearchAutoCompleteInput() {
  this.$service = (0, _ACore._)('.as-place-search-auto-complete-input-service');
  this.insertBefore(this.$service, null);
  this.adapter = new _PlaceSearchAutoCompleteAdapter.default(this);
}

PlaceSearchAutoCompleteInput.tag = 'PlaceSearchAutoCompleteInput'.toLowerCase();

PlaceSearchAutoCompleteInput.render = function () {
  return (0, _ACore._)({
    tag: _AutoCompleteInput.default.tag
  }, true);
};

_ACore.default.install(PlaceSearchAutoCompleteInput);

var _default = PlaceSearchAutoCompleteInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/LocationPicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/LocationPicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _utils = require("./utils");

require("../css/locationinput.css");

var _AutoCompleteInput = _interopRequireDefault(require("./AutoCompleteInput"));

var _FlexiconButton = _interopRequireDefault(require("./FlexiconButton"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _Snackbar = _interopRequireDefault(require("./Snackbar"));




///https://developers.google.com/maps/documentation/javascript/examples/geocoding-place-id

/***
 * @extends AElement
 * @constructor
 */
function LocationPicker() {
  if (_BrowserDetector.default.isMobile) {
    this.addClass('as-mobile');
  }

  this.map = new google.maps.Map(this, {
    zoom: 8,
    center: new google.maps.LatLng(21.018755, 105.839729),
    streetViewControl: false,
    fullscreenControl: false,
    mapTypeControl: true,
    mapTypeControlOptions: {
      style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
      position: google.maps.ControlPosition.TOP_RIGHT
    }
  });
  this.map.setOptions({
    draggableCursor: 'default'
  });
  this.map.addListener('click', this.eventHandler.clickMap);
  this.geocoder = new google.maps.Geocoder();
  this.infoWindow = new google.maps.InfoWindow();
  window.map = this.map;
  this.$myLocationBtn = (0, _ACore._)({
    tag: 'button',
    class: 'as-location-picker-control-btn',
    child: 'span.mdi.mdi-crosshairs-gps',
    on: {
      click: this.selectMyLocation.bind(this)
    }
  });
  this.$rightBottomCtn = (0, _ACore._)({
    class: 'as-location-picker-control-ctn',
    child: [this.$myLocationBtn],
    style: {
      overflow: 'hidden'
    }
  });
  this.$searchInput = (0, _ACore._)({
    tag: _AutoCompleteInput.default.tag,
    class: 'as-location-picker-search-input',
    props: {
      adapter: this
    },
    child: {
      class: 'as-location-picker-search-input-search-icon-ctn',
      child: 'span.mdi.mdi-magnify',
      on: {
        click: this.eventHandler.search
      }
    },
    on: {
      change: this.eventHandler.searchChange
    }
  });
  this.$searchInput.$input.on('keydown', this.eventHandler.searchKeypress);
  this.$topLeftCtn = (0, _ACore._)({
    class: ['as-location-picker-control-ctn', 'as-top'],
    child: [this.$searchInput]
  });
  this.$okBtn = (0, _ACore._)({
    tag: _FlexiconButton.default.tag,
    class: 'primary',
    props: {
      text: 'OK',
      disabled: true
    },
    on: {
      click: this.eventHandler.clickAction.bind(this, 'OK')
    }
  });
  this.$cancelBtn = (0, _ACore._)({
    tag: _FlexiconButton.default.tag,
    class: ['as-location-picker-cancel-btn', 'secondary'],
    props: {
      text: 'CANCEL'
    },
    on: {
      click: this.eventHandler.clickAction.bind(this, 'CANCEL')
    }
  });
  this.$bottomLeftCtn = (0, _ACore._)({
    class: ['as-location-picker-control-ctn', 'as-transparent', 'as-bottom'],
    style: {
      paddingBottom: '5px'
    },
    child: [this.$okBtn, this.$cancelBtn]
  });
  this.map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(this.$rightBottomCtn);
  this.map.controls[google.maps.ControlPosition.TOP_LEFT].push(this.$topLeftCtn);
  this.map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(this.$bottomLeftCtn);
  this.autoCompleteService = new google.maps.places.AutocompleteService(this.map, {
    fields: ["place_id", "geometry", "name", "formatted_address"]
  });
  this.placeService = new google.maps.places.PlacesService(this.map);
  this.selectedMarker = null;
  this.searchingMarkers = [];
  this.myLocationMarker = null;
  /***
   * @type {LatLng}
   * @name value
   * @memberOf LocationPicker#
   */

  /***
   * @type {boolean}
   * @name readOnly
   * @memberOf LocationPicker#
   */
}

LocationPicker.tag = 'LocationPicker'.toLowerCase();

LocationPicker.render = function () {
  return (0, _ACore._)({
    class: 'as-location-picker',
    extendEvent: ['action']
  });
};

LocationPicker.prototype.queryItems = function (query) {
  var request = {
    input: query,
    bounds: this.map.getBounds()
  };
  return new Promise(function (resolve) {
    this.autoCompleteService.getPlacePredictions(request, function (results, status) {
      if (status === google.maps.places.PlacesServiceStatus.OK) {
        resolve(results);
      } else resolve([]);
    });
  }.bind(this));
};

LocationPicker.prototype.getItemText = function (item, mInput) {
  return item.description;
};

LocationPicker.prototype.getItemView = function (item, index, _, $, query, reuseItem, refParent, mInput) {
  return _({
    class: 'as-place-search-auto-complete-item',
    child: [{
      class: 'as-place-search-auto-complete-item-desc',
      child: {
        text: item.description
      }
    }]
  });
};

LocationPicker.prototype.getBoundsZoomLevel = function (bounds) {
  var mapDim = this.getBoundingClientRect();
  return (0, _utils.getMapZoomLevel)(mapDim, bounds);
};

LocationPicker.prototype.clearSearchingMarkers = function () {
  while (this.searchingMarkers.length > 0) {
    this.searchingMarkers.pop().setMap(null);
  }
};
/**
 *
 * @param place
 * @param {boolean=} panTo
 */


LocationPicker.prototype.selectPlace = function (place, panTo) {
  if (arguments.length === 1) panTo = true;
  this.selectedPlace = place || null;

  if (this.selectedMarker) {
    this.selectedMarker.setMap(null);
  }

  this.$okBtn.disabled = !this.selectedPlace;
  if (!place) return;
  var latLng = place.geometry && place.geometry.location;
  if (!latLng) return;
  var zoom = panTo && (place.geometry.bounds || place.geometry.viewport) ? this.getBoundsZoomLevel(place.geometry.bounds || place.geometry.viewport) : 18;

  if (panTo) {
    this.map.setZoom(zoom);
    setTimeout(() => {
      this.map.panTo(latLng);
    }, 100);
  }

  this.selectedMarker = new google.maps.Marker({
    map: this.map,
    position: latLng
  });
  this.infoWindow.setContent((place.name ? place.name + ' - ' : '') + place.formatted_address);
  this.infoWindow.open(this.map, this.selectedMarker);
};

LocationPicker.prototype.showSearchPlaces = function (places) {
  this.clearSearchingMarkers();
  if (!places || places.length === 0) return;

  if (places.length === 1) {
    this.selectPlace(places[0]);
    return;
  }

  var bounds = places.reduce(function (ac, place) {
    if (place.geometry && place.geometry.location) ac.extend(place.geometry.location);
    return ac;
  }, new google.maps.LatLngBounds());
  var zoom = places.length === 1 ? places[0].geometry.bounds || places[0].geometry.viewport ? this.getBoundsZoomLevel(places[0].geometry.bounds || places[0].geometry.viewport) : 18 : this.getBoundsZoomLevel(bounds);
  var center = places.length === 1 ? places[0].geometry.location : bounds.getCenter();
  this.map.setCenter(center);
  this.map.setZoom(zoom);
  places.reduce(function (ac, place, i) {
    var marker;

    if (place.geometry && place.geometry.location) {
      marker = new google.maps.Marker({
        map: this.map,
        position: place.geometry.location,
        icon: 'https://raw.githubusercontent.com/Concept211/Google-Maps-Markers/master/images/marker_black.png'
      });
      ac.push(marker);
      marker.addListener('click', this.eventHandler.clickMarker.bind(null, marker, place));
    }

    return ac;
  }.bind(this), this.searchingMarkers);
};
/***
 *
 * @param {string} placeId
 * @param {boolean=} panTo
 */


LocationPicker.prototype.selectPlaceId = function (placeId, panTo) {
  if (arguments.length === 1) panTo = true;
  return new Promise(function (resolve) {
    this.placeService.getDetails({
      placeId: placeId,
      fields: ["name", "formatted_address", "place_id", "geometry"]
    }, function (place, status) {
      if (status === google.maps.places.PlacesServiceStatus.OK && place && place.geometry && place.geometry.location) {
        this.selectPlace(place, panTo);
        resolve(true);
      } else {
        resolve(false);
      }
    }.bind(this));
  }.bind(this));
};
/***
 *
 * @param latLng
 * @param {boolean=} panTo
 */


LocationPicker.prototype.selectLocation = function (latLng, panTo) {
  if (arguments.length === 1) panTo = true;
  if (arguments.length === 1) panTo = true;

  if (this.selectedMarker) {
    this.selectedMarker.setMap(null);
  }

  this.$okBtn.disabled = !latLng;
  this.selectedPlace = null;
  if (!latLng) return;
  this.selectedPlace = {
    geometry: {
      location: latLng
    }
  };
  var zoom = 18;

  if (panTo) {
    this.map.setZoom(zoom);
    setTimeout(() => {
      this.map.panTo(latLng);
    }, 100);
  }

  this.selectedMarker = new google.maps.Marker({
    map: this.map,
    position: latLng
  }); // this.infoWindow.open(this.map, this.selectedMarker);

  /*
  return this.geocoder
      .geocode({ location: latLng })
      .then(function (response) {
          if (response.results[0]) {
              return this.selectPlaceId(response.results[0].place_id, panTo);
          }
          else {
              return false;
          }
      }.bind(this))
      .catch(function (e) {
          safeThrow(e);
          return false;
      });
     */
};

LocationPicker.prototype.watchMyLocation = function (location, position) {
  if (this.myLocationMarker) return;
  this.accuracyCircle = new google.maps.Circle({
    strokeColor: "#1988c3",
    strokeOpacity: 0.4,
    strokeWeight: 2,
    fillColor: "#1988c3",
    fillOpacity: 0.2,
    radius: 100,
    map: this.map
  });
  this.myLocationMarker = new google.maps.Marker({
    position: location,
    sName: "My Location",
    map: this.map,
    icon: {
      path: google.maps.SymbolPath.CIRCLE,
      scale: 10,
      fillColor: "rgb(22, 118, 230)",
      fillOpacity: 1,
      strokeWeight: 3,
      strokeColor: 'white'
    }
  });

  if (position && position.coords) {
    this.accuracyCircle.setRadius(position.coords.accuracy);

    _Snackbar.default.show('Accuracy: ' + position.coords.accuracy.toFixed(1) + '(m)');
  }

  var id;

  if (navigator.geolocation.watchPosition && navigator.geolocation.watchPosition) {
    id = navigator.geolocation.watchPosition(function (props) {
      if (!this.isDescendantOf(document.body)) {
        navigator.geolocation.clearWatch(id);
      }

      this.myLocationMarker.setPosition(new google.maps.LatLng(props.coords.latitude, props.coords.longitude));
      this.accuracyCircle.setCenter(new google.maps.LatLng(props.coords.latitude, props.coords.longitude));
      this.accuracyCircle.setRadius(props.coords.accuracy);

      _Snackbar.default.show('Sai số tọa độ: ' + props.coords.accuracy.toFixed(1) + ' mét');
    }.bind(this), function () {}, {
      enableHighAccuracy: false,
      timeout: 5000,
      maximumAge: 0
    });
  }
};

LocationPicker.prototype.selectMyLocation = function () {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {
      var location = null;
      if (position && position.coords) location = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

      if (location) {
        this.watchMyLocation(location, position);
        if (!this.readOnly) this.selectLocation(location);else {
          this.map.setCenter(location);
        }
      }
    }.bind(this), function () {});
  }
};

LocationPicker.property = {};
LocationPicker.property.zoom = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) {
      value = 1;
    }

    this.map.setZoom(value);
  },
  get: function () {
    return this.map.getZoom();
  }
};
LocationPicker.property.center = {
  set: function (value) {
    value = value || null;
    var latlng = null;

    if (value instanceof google.maps.LatLng) {
      latlng = value;
    } else if (value && (0, _utils.isRealNumber)(value.latitude) && (0, _utils.isRealNumber)(value.longitude)) {
      latlng = new google.maps.LatLng(value.latitude, value.longitude);
    } else if (value instanceof Array && (0, _utils.isRealNumber)(value[0]) && (0, _utils.isRealNumber)(value[1])) {
      latlng = new google.maps.LatLng(value[0], value[1]);
    }

    latlng = latlng || new google.maps.LatLng(21.018755, 105.839729);
    this.map.setCenter(latlng || new google.maps.LatLng(21.018755, 105.839729));
  },
  get: function () {
    return this.map.getCenter();
  }
};
LocationPicker.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
/***
 *
 * @type {{}}
 * @memberOf LocationPicker#
 */

LocationPicker.eventHandler = {};
/***
 * @this LocationPicker
 */

LocationPicker.eventHandler.searchKeypress = function (event) {
  if (event.key === 'Enter') setTimeout(function () {
    if (!this.$searchInput.selectedItem) {
      this.eventHandler.search();
    }
  }.bind(this), 100);
};

LocationPicker.eventHandler.searchChange = function () {
  var item = this.$searchInput.selectedItem;
  if (!item) return;
  this.placeService.getDetails({
    placeId: item.place_id,
    fields: ["name", "formatted_address", "place_id", "geometry"]
  }, function (place, status) {
    if (status === google.maps.places.PlacesServiceStatus.OK && place && place.geometry && place.geometry.location) {
      this.selectPlace(place);
    }
  }.bind(this));
};
/***
 * @this LocationPicker
 */


LocationPicker.eventHandler.search = function () {
  var request = {
    bounds: this.map.getBounds(),
    query: this.$searchInput.value
  };
  this.placeService.textSearch(request, function callback(results, status) {
    if (status === google.maps.places.PlacesServiceStatus.OK) {
      this.showSearchPlaces(results);
    }
  }.bind(this));
};

LocationPicker.eventHandler.clickMarker = function (marker, place) {
  if (this.readOnly) return;
  this.selectPlace(place, false);
};

LocationPicker.eventHandler.clickMap = function (event) {
  if (this.readOnly) return;

  if (event.placeId) {
    this.selectPlaceId(event.placeId);
  } else if (event.latLng) {
    this.selectLocation(event.latLng, false);
  }
};

LocationPicker.eventHandler.clickAction = function (action, event) {
  this.emit('action', {
    type: 'action',
    action: action,
    originalEvent: event,
    target: this
  }, this);
};

_ACore.default.install(LocationPicker);

var _default = LocationPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/LocationInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/LocationInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

var _LocationPicker = _interopRequireDefault(require("./LocationPicker"));

require("../css/locationinput.css");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _utils = require("./utils");

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));




function LocationInput() {
  this.$text = (0, _ACore.$)('input', this).on('change', this.eventHandler.textChange);
  this.$iconCtn = (0, _ACore.$)('.as-location-input-icon-ctn', this).on('click', this.eventHandler.clickIcon);
  /***
   * @type {{latitude: number, longitude: number}}
   * @name latLng
   * @memberOf LocationInput#
   */

  /***
   * @type {string}
   * @name value
   * @memberOf LocationInput#
   */

  /***
   * @type {boolean}
   * @name readOnly
   * @memberOf LocationInput#
   */
}

LocationInput.tag = 'LocationInput'.toLowerCase();

LocationInput.render = function () {
  return (0, _ACore._)({
    class: 'as-location-input',
    extendEvent: ['change'],
    child: [{
      tag: 'input',
      attr: {
        type: 'text'
      },
      class: 'as-location-input-text'
    }, {
      class: 'as-location-input-icon-ctn',
      child: 'span.mdi.mdi-google-maps'
    }]
  });
};

LocationInput.prototype.share = {
  $modal: null,
  $picker: null,
  $holder: null
};

LocationInput.prototype._preparePicker = function () {
  if (this.share.$picker) return;
  this.share.$picker = (0, _ACore._)({
    tag: _LocationPicker.default.tag
  });
  this.share.$modal = (0, _ACore._)({
    tag: 'modal',
    class: 'as-location-input-modal',
    child: {
      class: 'as-location-input-modal-window',
      child: this.share.$picker
    }
  });

  if (_BrowserDetector.default.isMobile) {
    this.share.$modal.addClass('as-mobile');
  }
};
/***
 * @this LocationInput
 * @private
 */


LocationInput.prototype._attachPicker = function () {
  if (this.share.$holder) {
    this.share.$holder._releasePicker();
  }

  this._preparePicker();

  this.share.$holder = this;
  this.$iconCtn.off('click', this.eventHandler.clickIcon);
  document.body.appendChild(this.share.$modal);
  this.share.$picker.on('action', this.eventHandler.pickerAction);
  this.share.$picker.$searchInput.value = '';
  this.share.$picker.readOnly = this.readOnly;
  setTimeout(function () {
    document.addEventListener('click', this.eventHandler.clickOut);
  }.bind(this), 100);
  var value = this.latLng;

  if (value) {
    value = new google.maps.LatLng(value.latitude, value.longitude);
  }

  if (value) this.share.$picker.selectLocation(value, true);else this.share.$picker.selectPlace(null);
};

LocationInput.prototype._releasePicker = function () {
  if (this.share.$holder !== this) return;
  this.share.$picker.off('action', this.eventHandler.pickerAction);
  this.$iconCtn.on('click', this.eventHandler.clickIcon);
  document.removeEventListener('click', this.eventHandler.clickOut);
  this.share.$modal.remove();
  this.share.$holder = null;
};
/**
 *
 * @type {{}}
 * @memberOf LocationInput#
 */


LocationInput.eventHandler = {};

LocationInput.eventHandler.pickerAction = function (event) {
  if (!this.readOnly && event.action === 'OK' && this.share.$picker.selectedPlace && this.share.$picker.selectedPlace.geometry && this.share.$picker.selectedPlace.geometry.location) {
    this.$text.value = [this.share.$picker.selectedPlace.geometry.location.lat(), this.share.$picker.selectedPlace.geometry.location.lng()].join(', ');
    this.emit('change', {
      type: 'change',
      originalEvent: event.originalEvent || event,
      target: this
    }, this);
  }

  this._releasePicker();
};
/***
 * @this LocationInput
 */


LocationInput.eventHandler.clickIcon = function () {
  this._attachPicker();
};
/***
 * @this LocationInput
 * @param event
 */


LocationInput.eventHandler.clickOut = function (event) {
  if (event.target === this.share.$modal) this._releasePicker();
};

LocationInput.eventHandler.textChange = function (event) {
  this.emit('change', {
    type: 'change',
    originalEvent: event.originalEvent || event,
    target: this
  }, this);
};

LocationInput.property = {};
LocationInput.property.value = {
  set: function (value) {
    value = value || null;
    var lat, lng;

    if (typeof value === "string") {
      this.$text.value = value;
      return;
    }

    if (value instanceof Array) {
      lat = value[0];
      lng = value[1];
    } else if (value && typeof value === 'object') {
      if ('latitude' in value && 'longitude' in value) {
        lat = value.latitude;
        lng = value.longitude;
      } else if (value instanceof google.maps.LatLng) {
        lat = value.lat();
        lng = value.lng();
      }
    }

    if ((0, _utils.isRealNumber)(lat) && (0, _utils.isRealNumber)(lng)) {
      this.$text.value = [lat, lng].join(', ');
    } else {
      this.$text.value = '';
    }
  },
  get: function () {
    var nums = this.$text.value.split(/\s*,\s*/);
    var lat = parseFloat(nums[0]);
    var lng = parseFloat(nums[1]);

    if ((0, _utils.isRealNumber)(lat) && (0, _utils.isRealNumber)(lng)) {
      lat = Math.max(-90, Math.min(90, lat));
      if (lng < 180 && lng > 180) lng = (lng + 180 + 360 * Math.ceil(Math.abs(lng) / 360 + 2)) % 360 - 180;
      return [lat, lng].join(', ');
    } else {
      return '';
    }
  }
};
LocationInput.property.latLng = {
  get: function () {
    var nums = this.$text.value.split(/\s*,\s*/);
    var lat = parseFloat(nums[0]);
    var lng = parseFloat(nums[1]);

    if ((0, _utils.isRealNumber)(lat) && (0, _utils.isRealNumber)(lng)) {
      lat = Math.max(-90, Math.min(90, lat));
      if (lng < 180 && lng > 180) lng = (lng + 180 + 360 * Math.ceil(Math.abs(lng) / 360 + 2)) % 360 - 180;
      return {
        latitude: lat,
        longitude: lng
      };
    } else {
      return null;
    }
  }
};
LocationInput.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }

    this.$text.readOnly = !!value;
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
LocationInput.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }

    this.$text.disabled = !!value;
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};

_ACore.default.install(LocationInput);

var _default = LocationInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MKNavigatorItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MKNavigatorItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/mknavigator.css");

var _BoardTable = _interopRequireDefault(require("./BoardTable"));

var _Switch = _interopRequireDefault(require("./Switch"));

var _Board = _interopRequireDefault(require("./Board"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function MKNavigatorItem() {
  this._data = [];
  this.$text = (0, _ACore.$)('.mk-nav-item-text', this);
  this.$switchCtn = (0, _ACore.$)('.mk-nav-item-switch-ctn', this);
  this.$switch = (0, _ACore.$)('switch', this).on('change', this.eventHandler.switchChange);
  this.$dragzone = (0, _ACore.$)('.mk-nav-item-drag-zone', this);
  this.on('click', this.eventHandler.click);
}

MKNavigatorItem.tag = 'MKNavigatorItem'.toLowerCase();

MKNavigatorItem.render = function () {
  return (0, _ACore._)({
    tag: _Board.default.tag,
    class: 'mk-nav-item',
    extendEvent: ['checkedchange', 'press'],
    child: [{
      class: ['mk-nav-item-drag-zone', _BoardTable.default.DRAG_ZONE_CLASS_NAME],
      child: '<i class="material-icons">drag_indicator</i>'
    }, {
      class: 'mk-nav-item-text-ctn',
      child: {
        tag: 'span',
        class: 'mk-nav-item-text',
        child: {
          text: ''
        }
      }
    }, {
      class: 'mk-nav-item-switch-ctn',
      child: {
        tag: _Switch.default.tag
      }
    }]
  });
};

MKNavigatorItem.prototype.updateText = function () {
  this.$text.firstChild.data = this._data.text;
};

MKNavigatorItem.prototype.updateChecked = function () {
  if (typeof this._data.checked === "boolean") {
    this.$switchCtn.removeStyle('display');
    this.$switch.checked = this._data.checked;
  } else {
    this.$switchCtn.addStyle('display', 'none');
  }
};

MKNavigatorItem.prototype.updateDraggable = function () {
  if (this._data.draggable) {
    this.$dragzone.removeStyle('display');
  } else {
    this.$dragzone.addStyle('display', 'none');
  }
};

MKNavigatorItem.property = {};
MKNavigatorItem.property.data = {
  /**
   * @this MKNavigatorItem
   * @param data
   */
  set: function (data) {
    data = data || {};
    this._data = data;
    this.updateText();
    this.updateChecked();
    this.updateDraggable();
  },
  get: function () {
    return this._data;
  }
};
/***
 * @memberOf MKNavigatorItem#
 * @type {{}}
 */

MKNavigatorItem.eventHandler = {};

MKNavigatorItem.eventHandler.switchChange = function (event) {
  this._data.checked = this.$switch.checked;
  this.emit('checkedchange', {
    type: 'checkedchange'
  }, this);
};

MKNavigatorItem.eventHandler.click = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$switch, event) || (0, _EventEmitter.hitElement)(this.$dragzone, event)) return;
  this.emit('press', {
    type: 'press',
    target: this,
    originalEvent: event
  }, this);
};

_ACore.default.install(MKNavigatorItem);

var _default = MKNavigatorItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/MKNavigator.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/MKNavigator.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../ACore"));

require("../css/mknavigator.css");

var _BoardTable = _interopRequireDefault(require("./BoardTable"));

var _MKNavigatorItem = _interopRequireDefault(require("./MKNavigatorItem"));




/***
 * @typedef MKNavigatorItemData
 * @property {string} text
 * @property {string|number} value
 * @property {boolean|number=} checked
 */

/***
 * @extends AElement
 * @constructor
 */
function MKNavigator() {
  this._items = [];
  this._value = 0;
  this._hiddenValues = [];
  this.$itemByValue = {};
  this.$header = (0, _ACore.$)('.mk-nav-header', this);
  this.$body = (0, _ACore.$)('.mk-nav-body', this).on('orderchange', this.eventHandler.bodyOrderChange).on('dragitemstart', this.eventHandler.dragItemStart);
  this.$footer = (0, _ACore.$)('.mk-nav-footer', this);
  /***
   * @type {MKNavigatorItemData[]}
   * @name item
   * @memberOf MKNavigator#
   */

  /***
   * @type {number[]}
   * @name order
   * @memberOf MKNavigator#
   */
}

MKNavigator.tag = 'MKNavigator'.toLowerCase();

MKNavigator.render = function () {
  return (0, _ACore._)({
    class: 'mk-nav',
    extendEvent: ['orderchange', 'checkedchange', 'press'],
    child: [{
      class: 'mk-nav-header'
    }, {
      tag: _BoardTable.default.tag,
      class: 'mk-nav-body'
    }, {
      class: 'mk-nav-footer'
    }]
  });
};

MKNavigator.prototype.updateValue = function () {
  var value = this._value;

  for (var iValue in this.$itemByValue) {
    if (iValue + '' !== value + '') {
      this.$itemByValue[iValue].removeClass('mk-current');
    }
  }

  var order = this.order;

  if (this.$itemByValue[value]) {
    this.$itemByValue[value].addClass('mk-current');
  } else if (order.length > 0) {
    this.$itemByValue[order[0]].addClass('mk-current');
  }

  var idx = order.filter(value => !this.$itemByValue[value].hasClass('as-hidden')).indexOf(value);

  if (idx >= 0) {
    this.addStyle('--mk-nav-line-top', `calc(${2 * idx}em + ${12 * idx}px)`);
  } else {
    this.removeStyle('--mk-nav-line-top');
  }
};

MKNavigator.prototype.setTextOfItem = function (value, text) {
  var itemElt = this.$itemByValue[value];
  if (!itemElt) return;
  itemElt.data.text = text;
  itemElt.updateText();
};

MKNavigator.prototype.mkItem = function (data) {
  var self = this;
  return (0, _ACore._)({
    tag: _MKNavigatorItem.default.tag,
    attr: {
      "data-value": data && data.value
    },
    props: {
      data: data
    },
    on: {
      checkedchange: function (event) {
        self.emit('checkedchange', {
          type: 'checkedchange',
          target: this,
          originalEvent: event.originalEvent,
          itemData: data,
          checked: data.checked
        }, self);
      },
      press: function (event) {
        self.value = data.value;
        self.emit('press', {
          type: 'press',
          itemElt: this,
          itemData: data,
          value: data.value,
          target: this,
          originalEvent: event.originalEvent
        }, self);
      }
    }
  });
};

MKNavigator.prototype._updateHiddenValues = function () {
  var hiddenDict = this._hiddenValues.reduce((ac, x) => {
    ac[x] = true;
    return ac;
  }, {});

  Object.keys(this.$itemByValue).forEach(value => {
    if (hiddenDict[value]) {
      this.$itemByValue[value].addClass('as-hidden');
    } else {
      this.$itemByValue[value].removeClass('as-hidden');
    }
  });
};

MKNavigator.property = {};
MKNavigator.property.items = {
  /***
   * @this MKNavigator
   * @param items
   */
  set: function (items) {
    items = items || [];
    this._items = items;
    this.$itemByValue = {};
    var i = 0;
    var item;
    var itemElt;
    this.$header.clearChild();
    this.$body.clearChild();
    this.$footer.clearChild();
    var draggable = false;

    while (i < items.length) {
      if (items[i].draggable) break;
      item = items[i];
      itemElt = this.mkItem(item);
      this.$itemByValue[item.value] = itemElt;
      this.$header.addChild(itemElt);
      ++i;
    }

    while (i < items.length) {
      if (!items[i].draggable) break;
      draggable = true;
      item = items[i];
      itemElt = this.mkItem(item);
      this.$itemByValue[item.value] = itemElt;
      this.$body.addChild(itemElt);
      ++i;
    }

    while (i < items.length) {
      item = items[i];
      itemElt = this.mkItem(item);
      this.$itemByValue[item.value] = itemElt;
      this.$footer.addChild(itemElt);
      ++i;
    }

    if (draggable) {
      this.addClass('mk-has-draggable');
    } else {
      this.removeClass('mk-has-draggable');
    }

    this._updateHiddenValues();
  },
  get: function () {
    return this._items;
  }
};
MKNavigator.property.order = {
  get: function () {
    return (0, _ACore.$$)(_MKNavigatorItem.default.tag, this).map(function (e) {
      return e.data.value;
    });
  }
};
MKNavigator.property.value = {
  set: function (value) {
    this._value = value;
    this.updateValue();
  },
  get: function () {
    if (this.$itemByValue[this._value]) return this._value;
    if (this._items.length > 0) return this._items[0];
    return this._value;
  }
};
MKNavigator.property.hiddenValues = {
  set: function (values) {
    values = values || [];
    if (!(values instanceof Array)) values = [];
    this._hiddenValues = values;

    this._updateHiddenValues();

    this.updateValue();
  },
  get: function () {
    return this._hiddenValues;
  }
};
/***
 * @memberOf MKNavigator#
 * @type {{}}
 */

MKNavigator.eventHandler = {};

MKNavigator.eventHandler.bodyOrderChange = function (event) {
  this.updateValue();

  this._items.splice(0, this._items.length);

  (0, _ACore.$$)(_MKNavigatorItem.default.tag, this).reduce(function (ac, cr) {
    ac.push(cr.data);
    return ac;
  }, this._items);
  this.emit('orderchange', {
    type: 'orderchange',
    target: this
  }, this);
};
/***
 * @memberOf MKNavigator#
 * @type {{}}
 */


MKNavigator.eventHandler.dragItemStart = function (event) {
  var bound = this.getBoundingClientRect();
  this.addStyle('--mk-navigator-bound-left', bound.left + 'px');
};

_ACore.default.install(MKNavigator);

var _default = MKNavigator;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/ProcessLBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/ProcessLBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../ACore");

require("../css/processlbar.css");

var _utils = require("./utils");

/***
 * @extends AElement
 * @constructor
 */
function ProcessLBar() {
  this.$stepCtn = (0, _ACore.$)('.as-process-l-bar-step-ctn', this);
  this.$stepName = (0, _ACore.$)('.as-process-l-bar-step-name', this);
  this.$items = [];
  this._items = [];
  this._lHeight = 3;
  this._value = null;
}

ProcessLBar.tag = 'ProcessLBar'.toLowerCase();

ProcessLBar.render = function () {
  return (0, _ACore._)({
    class: 'as-process-l-bar',
    extendEvent: 'change',
    child: [{
      class: 'as-process-l-bar-step-ctn'
    }, {
      class: 'as-process-l-bar-step-name'
    }]
  });
};

ProcessLBar.prototype._updateCol = function () {
  var colN = Math.max(this.$items.length - this._lHeight + 1, 0);

  while (this.$stepCtn.childNodes.length > colN) {
    this.$stepCtn.lastChild.remove();
  }

  while (this.$stepCtn.childNodes.length < colN) {
    this.$stepCtn.addChild((0, _ACore._)('.as-process-l-bar-col'));
  }

  var i;

  for (i = 0; i < colN; ++i) {
    this.$stepCtn.childNodes[i].clearChild().addChild(this.$items[i]);
  }

  for (i = colN; i < this.$items.length; ++i) {
    this.$stepCtn.lastChild.addChild(this.$items[i]);
  }

  this.nameWidth = this._items.reduce(function (ac, cr) {
    return Math.max(ac, (0, _utils.measureText)(cr.name, 'bold 14px Arial, Helvetica, sans-serif').width);
  }, 0);

  if (colN <= 1) {
    this.addClass('as-col-layout');
  } else {
    this.removeClass('as-col-layout');
  }

  if (colN <= 2) {
    this.addStyle('--as-process-l-bar-item-min-width', this.nameWidth + 'px');
  } else {
    this.addStyle('--as-process-l-bar-item-min-width', (this.nameWidth + 10) / (colN - 1) - 10 + 'px');
  }
};

ProcessLBar.prototype._updateValue = function () {
  var value = this._value;
  this.$items.forEach(function (elt) {
    if (elt.itemData.value === value) {
      elt.addClass('as-active');
      this.$stepName.clearChild().addChild((0, _ACore._)({
        tag: 'span',
        child: {
          text: elt.itemData.name
        }
      }));
    } else {
      elt.removeClass('as-active');
    }
  }.bind(this));
};

ProcessLBar.prototype.notifyChange = function (originalEvent) {
  this.emit('change', {
    type: 'change',
    target: this,
    originalEvent: originalEvent || null
  }, this);
};

ProcessLBar.prototype._makeItem = function (item) {
  var self = this;
  var stepElt = (0, _ACore._)({
    class: 'as-process-l-bar-step',
    attr: {
      title: item.name
    },
    props: {
      itemData: item
    },
    on: {
      click: function (event) {
        if (self.disabled) return;
        var value = this._value;
        if (item.value === value) return;
        self.value = item.value;
        self.notifyChange(event);
      }
    }
  });

  if (item.color) {
    stepElt.addStyle('--as-process-l-bar-active-color', item.color);
  }

  return stepElt;
};

ProcessLBar.property = {};
ProcessLBar.property.items = {
  set: function (items) {
    items = items || [];
    this._items = items;
    this.$itemByValue = {};
    this.$items = this._items.map(function (item) {
      return this._makeItem(item);
    }.bind(this));

    this._updateCol();

    this._updateValue();
  },
  get: function () {
    return this._items;
  }
};
ProcessLBar.property.value = {
  set: function (value) {
    this._value = value;

    this._updateValue();
  },
  get: function () {
    return this._value;
  }
};
ProcessLBar.property.lHeight = {
  set: function (value) {
    this._lHeight = value;

    if (value === 1) {
      this.addClass('as-single-line');
    } else {
      this.removeClass('as-single-line');
    }

    this._updateCol();
  },
  get: function () {
    return this._lHeight;
  }
};
ProcessLBar.property.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
var _default = ProcessLBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/KVCommentItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/KVCommentItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/kvcommentitem.css");

var _ACore = _interopRequireWildcard(require("../ACore"));

var _datetime = require("absol/src/Time/datetime");

var _ContextMenu = _interopRequireDefault(require("./ContextMenu"));

var _utils = require("./utils");




/***
 * @extends AElement
 * @constructor
 */
function KVCommentItem() {
  this._time = new Date();
  this._text = '';
  this.$text = (0, _ACore.$)('.kv-comment-item-text', this);
  this.$time = (0, _ACore.$)('.kv-comment-item-time', this);
  this.$avatar = (0, _ACore.$)('.kv-comment-avatar', this);
  this.quickmenu = null;
  this.on('contextmenu', this.eventHandler.kv_contextmenu);

  _ContextMenu.default.auto();
}

KVCommentItem.tag = 'KVCommentItem'.toLowerCase();

KVCommentItem.render = function () {
  return (0, _ACore._)({
    extendEvent: 'contextmenu',
    class: "kv-comment-item",
    child: [{
      class: "kv-comment-avatar-ctn",
      child: {
        class: 'kv-comment-avatar',
        style: {
          backgroundImage: 'url(https://raw.githubusercontent.com/duthienkt/absol/master/logo.svg?sanitize=true)'
        }
      }
    }, {
      class: "kv-comment-item-content",
      child: [{
        class: 'kv-comment-item-text',
        child: {
          text: ''
        }
      }, {
        class: 'kv-comment-item-time',
        child: {
          text: (0, _datetime.formatDateTime)(new Date(), 'dd/MM/yyyy HH:mm')
        }
      }]
    }, {
      class: "kv-comment-item-flag-ctn",
      child: ['.kv-comment-item-flag-unread']
    }]
  });
};

KVCommentItem.property = {};
KVCommentItem.property.text = {
  set: function (value) {
    value = value || '';
    if (typeof value === 'string') this.$text.innerHTML = value;else if (absol.Dom.isDomNode(value)) {
      this.$text.clearChild().addChild(value);
    } else {
      this.$text.clearChild().addChild((0, _ACore._)(value));
    }
    this._text = value;
  },
  get: function () {
    return this._text;
  }
};
KVCommentItem.property.unread = {
  set: function (value) {
    if (value) {
      this.addClass('as-unread');
    } else {
      this.removeClass('as-unread');
    }
  },
  get: function () {
    return this.hasClass('as-unread');
  }
};
KVCommentItem.property.time = {
  set: function (value) {
    this._time = value;
    var text = '';
    if (typeof value === 'string') text = value;else if (value instanceof Date) {
      text = (0, _datetime.formatDateTime)(value, 'dd/MM/yyyy HH:mm');
    }
    this.$time.firstChild.data = text;
  },
  get: function () {
    return this._time;
  }
};
KVCommentItem.property.avatar = {
  set: function (value) {
    value = value || 'https://raw.githubusercontent.com/duthienkt/absol/master/logo.svg?sanitize=true';
    this._avatar = value;
    this.$avatar.addStyle('backgroundImage', 'url(' + value + ')');
  },
  get: function () {
    return this._avatar;
  }
};
/***
 * @memberOf KVCommentItem#
 * @type {{}}
 */

KVCommentItem.eventHandler = {};
/***
 * @this KVCommentItem
 * @param event
 */

KVCommentItem.eventHandler.kv_contextmenu = function (event) {
  if (this.quickmenu) {
    event.showContextMenu(this.quickmenu.props, function (event) {
      var menuItem = (0, _utils.cleanMenuItemProperty)(event.menuItem);

      if (this.quickmenu.onSelect) {
        this.quickmenu.onSelect.call(this, menuItem);
      }
    }.bind(this));
  }
};

_ACore.default.install(KVCommentItem);

var _default = KVCommentItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTHeadCell.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTHeadCell.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

/***
 *
 * @param {DTHeadRow} row
 * @param data
 * @constructor
 */
function DTHeadCell(row, data) {
  this.row = row;
  this.elt = (0, _ACore._)({
    tag: 'th',
    class: 'as-dt-header-cell'
  }).on('click', this.nextSortState.bind(this));

  if (data.sortKey) {
    this.elt.attr('data-sort-key', data.sortKey);
    this.elt.attr('data-sort-order', 'none');
  }

  this.$sortBtn = (0, _ACore._)({
    tag: 'span',
    class: 'as-dt-sort-btn',
    child: [{
      tag: 'span',
      class: ['mdi', 'mdi-menu-up'] // child: { text: '🡑' }

    }, {
      tag: 'span',
      class: ['mdi', 'mdi-menu-down']
    }]
  });
  this.data = data;

  if (data.attr) {
    this.elt.attr(data.attr);
  }

  if (data.style) {
    this.elt.addStyle(data.style);
  }

  this._idx = null;
  this.render();
}

DTHeadCell.prototype.render = function () {
  this.row.head.table.adapter.renderHeadCell(this.elt, this.data, this);
  this.elt.addChild(this.$sortBtn);
};

Object.defineProperty(DTHeadCell.prototype, 'idx', {
  set: function (value) {
    this._idx = value;
    this.elt.attr('data-col-idx', value + '');
  },
  get: function () {
    return this._idx;
  }
});

DTHeadCell.prototype.nextSortState = function () {
  if (!this.elt.attr('data-sort-key')) return;
  var c = this.elt.attr('data-sort-order');
  var n = {
    none: 'ascending',
    ascending: 'descending',
    descending: 'none'
  }[c] || 'none';
  (0, _ACore.$$)('th', this.row.elt).forEach(elt => {
    if (elt === this.elt) return;

    if (elt.attr('data-sort-key')) {
      elt.attr('data-sort-order', 'none');
    }
  });
  this.elt.attr('data-sort-order', n);
  this.row.head.table.elt.requestQuery();
};

var _default = DTHeadCell;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTHeadRow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTHeadRow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _DTHeadCell = _interopRequireDefault(require("./DTHeadCell"));


/***
 *
 * @param {DTHead} head
 * @param data
 * @constructor
 */
function DTHeadRow(head, data) {
  this.head = head;
  this.data = data;
  this.elt = (0, _ACore._)({
    tag: 'tr',
    class: 'as-dt-head-row'
  });

  if (data.attr) {
    this.elt.attr(data.attr);
  }

  this.renderCells();
}

DTHeadRow.prototype.renderCells = function (event) {
  this.cells = this.data.cells.map(function (cellData, i) {
    var cell = new _DTHeadCell.default(this, cellData);
    cell.idx = i;
    return cell;
  }.bind(this));
  this.elt.addChild(this.cells.map(function (cell) {
    return cell.elt;
  }));
};

var _default = DTHeadRow;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTHead.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTHead.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _DTHeadRow = _interopRequireDefault(require("./DTHeadRow"));


/***
 *
 * @param {DTTable} table
 * @param {} data
 * @constructor
 */
function DTHead(table, data) {
  this.table = table;
  this.elt = this.table.elt.$thead;
  this.data = data;
  this.renderRows();
}

DTHead.prototype.renderRows = function () {
  this.rows = this.data.rows.map(function (rowData) {
    return new _DTHeadRow.default(this, rowData);
  }.bind(this));
  var rowEltArr = this.rows.map(function (row) {
    return row.elt;
  });
  this.elt.addChild(rowEltArr);
};

var _default = DTHead;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTBodyCell.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTBodyCell.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _utils = require("../utils");

var _datetime = require("absol/src/Time/datetime");

/***
 *
 * @param {DTBodyRow} row
 * @param data
 * @constructor
 */
function DTBodyCell(row, data) {
  this.row = row;
  this._elt = null;
  this._idx = null;
  this.data = data;
}

Object.defineProperty(DTBodyCell.prototype, 'elt', {
  get: function () {
    var self = this;

    if (!this._elt) {
      this._elt = (0, _ACore._)({
        tag: 'td',
        class: 'as-dt-body-cell',
        on: {
          click: function (event) {
            if (self.data.on && self.data.on.click) {
              self.data.on.click.call(self.data, event, self);
            }
          }
        }
      });
      this._elt.holder = this;
      if (this.data.attr) this._elt.attr(this.data.attr);
      if (this.data.class) this._elt.addClass(this.data.class);
      if (this.data.style) this._elt.addStyle(this.data.style);
      if (this.data.on) this._elt.on(this.data.on);
      if (this._idx !== null) this._elt.attr('data-col-idx', this._idx + '');
      this.row.body.table.adapter.renderBodyCell(this.elt, this.data, this);
    }

    return this._elt;
  }
});
Object.defineProperty(DTBodyCell.prototype, 'innerText', {
  get: function () {
    var text = this.data.innerText;
    if (text === undefined || text === null) text = '';else if (!text) {
      text = text + '';
    } else if (text.substring) {} else if (typeof text === "number") {
      text = text + '';
    } else if (typeof text === "object") {
      if (text instanceof Date) {
        return (0, _datetime.formatDateTime)(text, 'dd/MM/yyyy hh:mm a');
      } else {
        return (0, _utils.jsStringOf)(text);
      }
    } else if (typeof text === "function") {
      text = text.call(this.data, this);
    }
    return text;
    if (this.data.innerText) return this.data.innerText;
    if (this.data.getInnerText) return this.data.getInnerText(); // if ('innerText' in this.data)

    return this.data.innerText || '';
    var res = [];

    function visit(node) {
      if (node.nodeType === 3 && node.data) {
        res.push(node.data);
      } else if (node.childNodes && node.childNodes.length > 0) {
        Array.prototype.forEach.call(node.childNodes, visit);
      }
    }

    visit(this.elt);
    return res.join(' ');
  }
});
Object.defineProperty(DTBodyCell.prototype, 'idx', {
  set: function (value) {
    this._idx = value;
    if (this._elt) this._elt.attr('data-col-idx', value + '');
  },
  get: function () {
    return this._idx;
  }
});
var _default = DTBodyCell;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTBodyRow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTBodyRow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _DTBodyCell = _interopRequireDefault(require("./DTBodyCell"));

var _stringGenerate = require("absol/src/String/stringGenerate");


/***
 *
 * @param {DTBody} body
 * @param data
 * @constructor
 */
function DTBodyRow(body, data) {
  this.body = body;
  this.data = data;
  this._elt = null;

  if ('id' in data) {
    this.id = data.id;
  } else {
    this.id = (0, _stringGenerate.randomIdent)(8);
  }

  this._idx = null;
  /***
   * @type {DTBodyCell[]}
   */

  this.cells = this.data.cells.map(function (cellData, i) {
    var cell = new _DTBodyCell.default(this, cellData);
    cell.idx = i;
    return cell;
  }.bind(this));
}

DTBodyRow.prototype.remove = function () {
  this.body.removeRow(this);
};

DTBodyRow.prototype.viewInto = function () {
  return this.body.viewIntoRow(this);
};

DTBodyRow.prototype.updateData = function (data) {
  var rowIdx = this.body.rowIndexOf(this.data);
  this.body.data.rows[rowIdx] = data;
  this.data = data;

  if ('id' in data) {
    this.id = data.id;
  } else {
    this.id = (0, _stringGenerate.randomIdent)(8);
  }

  this.cells = this.data.cells.map(function (cellData, i) {
    var cell = new _DTBodyCell.default(this, cellData);
    cell.idx = i;
    return cell;
  }.bind(this));

  if (this._elt) {
    this._elt.attr('data-id', this.id + '');

    this._elt.clearChild().addChild(this.cells.map(function (cell) {
      return cell.elt;
    }));

    this.$idx = (0, _ACore.$)('.as-dt-row-index', this._elt);
    this.draggable = !!(0, _ACore.$)('.as-drag-zone', this._elt);
    if (this.$idx) this.$idx.attr('data-idx', this._idx + 1 + '');
  }

  this.body.onRowSplice(rowIdx);
};

Object.defineProperty(DTBodyRow.prototype, 'elt', {
  get: function () {
    if (!this._elt) {
      this._elt = (0, _ACore._)({
        tag: 'tr',
        class: 'as-dt-body-row'
      });
      this._elt.dtBodyRow = this;

      this._elt.attr('data-id', this.id + '');

      this._elt.addChild(this.cells.map(function (cell) {
        return cell.elt;
      }));

      if (this.data.attr) {
        this._elt.attr(this.data.attr);
      }

      if (this.data.style) {
        this._elt.addStyle(this.data.style);
      }

      if (this.data.on) {
        this._elt.on(this.data.on);
      }

      this.$idx = (0, _ACore.$)('.as-dt-row-index', this._elt);
      this.draggable = !!(0, _ACore.$)('.as-drag-zone', this._elt);
      if (this.$idx) this.$idx.attr('data-idx', this._idx + 1 + '');
    }

    return this._elt;
  }
});
Object.defineProperty(DTBodyRow.prototype, 'innerText', {
  get: function () {
    if (this.data.innerText) return this.data.innerText;
    if (this.data.getInnerText) return this.data.getInnerText();
    if ('innerText' in this.data) return this.data.innerText || '';
    return this.cells.map(function (cell) {
      return cell.innerText.trim();
    }).filter(text => !!text).join(' / ');
  }
});
Object.defineProperty(DTBodyRow.prototype, 'idx', {
  set: function (value) {
    if (this.$idx) this.$idx.attr('data-idx', value + 1 + '');
    this._idx = value;
  },
  get: function () {
    return this._idx;
  }
});
var _default = DTBodyRow;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTRowDragController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTRowDragController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _Hanger = _interopRequireDefault(require("../Hanger"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));


/***
 *
 * @param {DTBody} body
 * @constructor
 */
function DTRowDragController(body) {
  this.body = body;

  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }

  (0, _ACore._)({
    tag: _Hanger.default.tag,
    elt: this.body.elt,
    on: {
      predrag: this.ev_preDrag,
      dragstart: this.ev_dragStart,
      drag: this.ev_drag,
      dragend: this.ev_dragEnd
    }
  });
}

DTRowDragController.prototype.ev_preDrag = function (event) {
  var dragZone = this._finDragZone(event.target);

  if (!dragZone) {
    event.cancel();
    return;
  }

  var row = this._findRow(event.target);

  if (!row) {
    event.cancel();
    return;
  }

  var range = this._findDraggableRange(row);

  if (range.length < 2) {
    event.cancel();
    return;
  }

  var rangeBounds = range.map(function (row) {
    return row.elt.getBoundingClientRect();
  });
  var rowBound = row.elt.getBoundingClientRect();
  var bodyBound = this.body.elt.getBoundingClientRect();
  event.preventDefault();
  var rowIdx = range.indexOf(row);
  var rangeDataOffset = this.body.data.rows.indexOf(range[0].data);
  this.dragData = {
    row: row,
    rowIdx: rowIdx,
    //index in range
    dragZone: dragZone,
    rowBound: rowBound,
    bodyBound: bodyBound,
    bodyPos: new _Vec.default(bodyBound.left, bodyBound.top),
    range: range,
    rangeDataOffset: rangeDataOffset,
    //first index in rows data
    rangeBounds: rangeBounds,
    started: false
  };
};

DTRowDragController.prototype.ev_dragStart = function (event) {
  var dragData = this.dragData;
  dragData.started = true;
  dragData.offset = event.currentPoint.sub(new _Vec.default(dragData.rowBound.left, dragData.rowBound.top));
  dragData.row.elt.addClass('as-dragging');
  dragData.range.forEach(function (row) {
    if (row !== dragData.row) {
      row.elt.addClass('as-drag-neighbor');
    }
  });
};

DTRowDragController.prototype.ev_drag = function (event) {
  var dragData = this.dragData;
  var currentBodyBound = this.body.elt.getBoundingClientRect();
  var dView = new _Vec.default(currentBodyBound.left, currentBodyBound.top).sub(dragData.bodyPos);
  var d = event.currentPoint.sub(event.startingPoint).add(dView);
  dragData.row.elt.addStyle('transform', 'translate(0, ' + d.y + 'px)');
  var y0 = event.currentPoint.sub(dragData.offset).y;

  var beforeIdx = this._findIBeforeIdx(y0);

  dragData.beforeIdx = beforeIdx;
  var rowIdx = dragData.rowIdx;
  var range = dragData.range;
  var rowHeight = dragData.rowBound.height;
  var i;

  for (i = 0; i < beforeIdx && i < rowIdx; ++i) {
    range[i].elt.addStyle('transform', 'translate(0,' + 0 + 'px)');
  }

  for (i = beforeIdx; i < rowIdx; ++i) {
    range[i].elt.addStyle('transform', 'translate(0,' + rowHeight + 'px)');
  }

  for (i = rowIdx + 1; i < beforeIdx; ++i) {
    range[i].elt.addStyle('transform', 'translate(0,' + -rowHeight + 'px)');
  }

  for (i = Math.max(rowIdx + 1, beforeIdx); i < range.length; ++i) {
    range[i].elt.addStyle('transform', 'translate(0,' + 0 + 'px)');
  }
};

DTRowDragController.prototype.ev_dragEnd = function (event) {
  var dragData = this.dragData;
  var fromIdx;
  var toIdx;

  if (dragData.beforeIdx === dragData.rowIdx || dragData.beforeIdx === dragData.rowIdx + 1) {
    dragData.row.elt.addClass('as-homing');
    dragData.range.forEach(function (row) {
      if (row !== dragData.row) row.elt.addStyle('transform', 'translate(0,' + 0 + 'px)');
    });
    setTimeout(function () {
      dragData.row.elt.addStyle('transform', 'translate(0, ' + 0 + 'px)');
      setTimeout(function () {
        dragData.range.forEach(function (row) {
          if (row !== dragData.row) row.elt.removeClass('as-drag-neighbor');
        });
        dragData.row.elt.removeStyle('transform').removeClass('as-homing').removeClass('as-dragging');
      }, 100);
    }, 1);
  } else {
    dragData.range.forEach(function (row) {
      if (row !== dragData.row) row.elt.removeClass('as-drag-neighbor').removeStyle('transform');
    });
    fromIdx = dragData.rangeDataOffset + dragData.rowIdx;

    if (dragData.beforeIdx < dragData.range.length) {
      this.body.elt.addChildBefore(dragData.row.elt, dragData.range[dragData.beforeIdx].elt);

      if (dragData.beforeIdx <= dragData.rowIdx) {
        toIdx = dragData.rangeDataOffset + dragData.beforeIdx;
      } else {
        toIdx = dragData.rangeDataOffset + dragData.beforeIdx - 1;
      }
    } else {
      //end of range
      this.body.elt.addChildAfter(dragData.row.elt, dragData.range[dragData.range.length - 1].elt);
      toIdx = dragData.rangeDataOffset + dragData.range.length - 1;
    }

    dragData.row.elt.removeClass('as-dragging').removeStyle('transform');
    this.body.rows.splice(fromIdx, 1);
    this.body.rows.splice(toIdx, 0, dragData.row);
    this.body.data.rows.splice(fromIdx, 1);
    this.body.data.rows.splice(toIdx, 0, dragData.row.data);
    this.body.reindexRows(Math.min(fromIdx, toIdx), Math.max(fromIdx, toIdx) + 1);
    var eventData = {
      type: 'otherchange',
      target: dragData.row,
      from: fromIdx,
      to: toIdx,
      originalEvent: event,
      row: dragData.row,
      data: dragData.row.data
    };

    if (dragData.row.data.on && dragData.row.data.on.orderchange) {
      dragData.row.data.on.orderchange.call(dragData.row, eventData, dragData.row);
    }

    this.body.table.elt.emit('orderchange', eventData, this.body.table.elt);
  }
};

DTRowDragController.prototype._finDragZone = function (elt) {
  var cur = elt;

  while (cur) {
    if (cur.classList.contains('as-drag-zone')) return cur;
    if (cur === this.body.elt) break;
    cur = cur.parentElement;
  }

  return null;
};

DTRowDragController.prototype._findRow = function (elt) {
  var cur = elt;

  while (cur) {
    if (cur.dtBodyRow) return cur.dtBodyRow;
    if (cur === this.body.elt) break;
    cur = cur.parentElement;
  }

  return null;
};

DTRowDragController.prototype._findDraggableRange = function (row) {
  var children = Array.prototype.slice.call(this.body.elt.childNodes);
  var idx = children.indexOf(row.elt);
  if (idx < 0) return [];
  var res = [];
  var i;

  for (i = idx - 1; i >= 0; --i) {
    if (!children[i].dtBodyRow.draggable) break;
    res.unshift(children[i].dtBodyRow);
  }

  for (i = idx; i < children.length; ++i) {
    if (!children[i].dtBodyRow.draggable) break;
    res.push(children[i].dtBodyRow);
  }

  return res;
};

DTRowDragController.prototype._findIBeforeIdx = function (y0) {
  var currentBodyBound = this.body.elt.getBoundingClientRect();
  var range = this.dragData.range;
  var rangeBounds = this.dragData.rangeBounds;
  var row = this.dragData.row;
  var y = currentBodyBound.top - this.dragData.bodyPos.y + this.dragData.rangeBounds[0].top;
  var dy = 0;
  var resIdx = range.length;

  for (var i = 0; i < range.length; ++i) {
    if (range[i] === row) continue;
    dy = rangeBounds[i].height;

    if (y0 <= y + dy / 2) {
      resIdx = i;
      break;
    }

    y += dy;
  }

  return resIdx;
};

var _default = DTRowDragController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTSearchFactor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTSearchFactor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function DTSearchFactor(global) {
  /***
   * @typedef SelectionItem2
   * @property {String} text
   * @property {String} desc
   * @property {String} __text__
   * @property {String} __nvnText__
   * @property {Array<String>} __words__
   * @property {Array<String>} __nvnWords__
   * @property {object} __wordDict__
   * @property {object} __nvnWordDict__
   * @module SelectionItem2
   */
  function nonAccentVietnamese(s) {
    return s.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a").replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, "A").replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, "e").replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, "E").replace(/ì|í|ị|ỉ|ĩ/g, "i").replace(/Ì|Í|Ị|Ỉ|Ĩ/g, "I").replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, "o").replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, "O").replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, "u").replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, "U").replace(/ỳ|ý|ỵ|ỷ|ỹ/g, "y").replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, "Y").replace(/đ/g, "d").replace(/Đ/g, "D").replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, "").replace(/\u02C6|\u0306|\u031B/g, "");
  }

  function harmonicMean(a, b) {
    return 2 / (1 / a + 1 / b);
  }

  function wordLike(a, b) {
    var m = a.length;
    var n = b.length;

    function map(i, j) {
      return i * (n + 1) + j;
    }

    var Q = Array((m + 1) * (n + 1)).fill(0);

    for (var i = 0; i < m; ++i) for (var j = 0; j < n; ++j) if (a.charAt(i) == b.charAt(j)) {
      if (Q[map(i + 1, j + 1)]) {
        if (Q[map(i + 1, j + 1)] < Q[map(i, j)] + 1) Q[map(i + 1, j + 1)] = Q[map(i, j)] + 1;
      } else Q[map(i + 1, j + 1)] = Q[map(i, j)] + 1;
    } else Q[map(i + 1, j + 1)] = Math.max(Q[map(i + 1, j)], Q[map(i, j + 1)]);

    return Q[map(m, n)] / harmonicMean(m, n);
  }

  function wordsMatch(sq1, sq2, matchWordPow) {
    matchWordPow = matchWordPow === undefined ? 1 : matchWordPow;
    var m = sq1.length;
    var n = sq2.length;

    function map(i, j) {
      return i * (n + 1) + j;
    }

    var Q = Array((m + 1) * (n + 1)).fill(0);
    var e = 0.0;

    for (var i = 0; i < m; ++i) for (var j = 0; j < n; ++j) {
      e = Math.pow(wordLike(sq1[i], sq2[j]), matchWordPow);

      if (Q[map(i + 1, j + 1)]) {
        if (Q[map(i + 1, j + 1)] < Q[map(i, j)] + e) Q[map(i + 1, j + 1)] = Q[map(i, j)] + e;
      } else Q[map(i + 1, j + 1)] = Q[map(i, j)] + e;

      e = Math.max(Q[map(i + 1, j)], Q[map(i, j + 1)]);
      if (e > Q[map(i + 1, j + 1)]) Q[map(i + 1, j + 1)] = e;
    }

    return Q[map(m, n)];
  }

  var EXTRA_MATCH_SCORE = 9;
  var NVN_EXTRA_MATCH_SCORE = 8;
  var EQUAL_MATCH_SCORE = 10;
  var WORD_MATCH_SCORE = 3;
  var HAS_WORD_SCORE = 30;
  var HAS_NVN_WORD_SCORE = 29;
  /***
   *
   * @param {SelectionItem2} item
   * @returns {*}
   */

  function prepareSearchForItem(item) {
    if (!item.text || !item.text.charAt) item.text = item.text + '';
    var spliter = /[\s/]+/;

    var __text__ = item.text.replace(/([\s\b\-()\[\]"']|&#8239;|&nbsp;|&#xA0;|\s")+/g, ' ').trim().toLowerCase();

    var __nvnText__ = nonAccentVietnamese(__text__);

    item.__words__ = __text__.split(spliter);
    item.__text__ = item.__words__.join(' ');

    item.__words__.sort();

    item.__wordDict__ = item.__words__.reduce((ac, cr, i) => {
      ac[cr] = i + 1;
      return ac;
    }, {});
    item.__nvnWords__ = __nvnText__.split(spliter);
    item.__nvnText__ = item.__nvnWords__.join(' ');

    item.__nvnWords__.sort();

    item.__nvnWordDict__ = item.__nvnWords__.reduce((ac, cr, i) => {
      ac[cr] = i + 1;
      return ac;
    }, {});
    return item;
  }

  function calcItemMatchScore(queryItem, item) {
    var score = 0;
    if (!item.__text__) return 0;
    var hwScore = 0;
    var i;

    for (i = 0; i < queryItem.__words__.length; ++i) {
      if (item.__wordDict__[queryItem.__words__[i]]) {
        hwScore += HAS_WORD_SCORE;
      } else if (item.__nvnWordDict__[queryItem.__nvnWords__[i]]) {
        hwScore += HAS_NVN_WORD_SCORE;
      }
    }

    score = hwScore;

    if (item.__text__ === queryItem.__text__) {
      score += EQUAL_MATCH_SCORE;
    }

    var extraIndex = item.__text__.indexOf(queryItem.__text__);

    if (extraIndex >= 0) {
      score += EXTRA_MATCH_SCORE;
    }

    extraIndex = item.__nvnText__.indexOf(queryItem.__nvnText__);

    if (extraIndex >= 0) {
      score += EXTRA_MATCH_SCORE;
    }

    var n = Math.max(queryItem.__words__.length + 1, 1);
    score = Math.max(score, wordsMatch(queryItem.__words__, item.__words__), wordsMatch(queryItem.__nvnWords__, item.__nvnWords__)) / n * 2 * WORD_MATCH_SCORE;
    return score;
  }

  function scoreCmp(a, b) {
    if (b.score === a.score) {
      if (b.item.__nvnText__ > a.item.__nvnText__) return -1;
      return 1;
    }

    return b.score - a.score;
  }

  function keyStringOf(o) {
    var type = typeof o;
    var keys;

    if (o && type === "object") {
      if (o.getTime) {
        return 'd(' + o.getTime() + ')';
      } else if (o.length && o.map) {
        return 'a(' + o.map(val => keyStringOf(val)).join(',') + ')';
      } else {
        keys = Object.keys(o);
        keys.sort();
        return 'o(' + keys.map(key => key + ':' + keyStringOf(o[key])).join(',') + ')';
      }
    } else {
      return type[0] + '(' + o + ')';
    }
  }

  function matchFilter(item, filter) {
    if (!filter) return true;
    var keys = item.keys;
    if (!keys) return false;

    for (var i in filter) {
      if (!keyCmp(keys[i], filter[i])) return false;
    }

    return true;
  }

  function toComparable(x) {
    if (!x) return x;
    var type = typeof x;
    if (type === 'string') return x;
    if (type === "number") return x;
    if (type === "boolean") return x;
    if (type.getTime) return type.getTime();
    return x;
  }

  function keyCmp(itemKey, filterKey) {
    if (itemKey === filterKey) return true;
    if (!itemKey !== !filterKey) return false;
    if (!itemKey || !filterKey) return false;
    var filterKeyString = keyStringOf(filterKey);

    function withFilter(x) {
      var xString = keyStringOf(x);
      var res = xString === filterKeyString;

      if (!res && typeof filterKey === "object") {
        if (filterKey.some) {
          res = filterKey.some(function (y) {
            return keyStringOf(y) === x;
          });
        } else if ('min' in filterKey || 'max' in filterKey) {
          res = true;

          if ('min' in filterKey) {
            res = res && toComparable(x) >= toComparable(filterKey.min);
          }

          if ('max' in filterKey) {
            res = res && toComparable(x) <= toComparable(filterKey.max);
          }
        }
      }

      return res;
    }

    if (itemKey.some) {
      return itemKey.some(withFilter);
    } else return withFilter(itemKey);
  }

  var benchmark = global.calcBenchmark();
  /******************************************************************************************************************/

  var slaves = {};

  function SearchingSlave(id) {
    this.id = id;
    this.items = [];
    this.itemVersion = -1;
    this.tranferFinished = true;
    this.pendingTask = null;
    this.taskSession = Math.random() + '';
    this.scoredHolders = [];
    this.searchingSession = Math.random() + '';
  }

  SearchingSlave.prototype.onReceiveItems = function (n, start, end, items, version) {
    if (this.scoredHolders.length > start) {
      this.scoredHolders.splice(start);
    }

    var cItems = this.items;

    if (cItems.length < n) {
      // sessionItems
      cItems.push(null);
    }

    if (cItems.length > n) {
      cItems.splice(n);
    }

    this.itemVersion = version;

    for (var i = start; i < end; ++i) {
      cItems[i] = items[i - start];
    }

    if (end === n) {
      this.tranferFinished = true;
      this.doTask();
    } else {
      this.tranferFinished = false;
    }
  };

  SearchingSlave.prototype.doTask = function () {
    if (!this.pendingTask) return;
    if (this.searchingSession === this.taskSession) return;
    var self = this;
    this.searchingSession = this.taskSession;
    var session = this.searchingSession;
    var items = this.items;
    var its = this.scoredHolders;
    var taskData = this.pendingTask;
    var itemVersion = this.itemVersion;
    var queryText = taskData.query.text;
    var filter = taskData.query.filter;
    var sort = taskData.query.sort;
    var queryTextItem = null;
    if (queryText) queryTextItem = prepareSearchForItem({
      text: queryText
    });

    var sortCmp = (a, b) => {
      var aKeys = a.item.keys;
      var bKeys = b.item.keys;
      var key;
      var av, bv;
      var d = 0;

      if (aKeys && !bKeys) {
        d = 1;
      } else if (!aKeys && bKeys) {
        d = -1;
      } else if (aKeys && bKeys) {
        for (var i = 0; i < sort.length; ++i) {
          key = sort[i].key;
          d = aKeys[key] - bKeys[key];

          if (isNaN(d)) {
            if (aKeys[key] < bKeys[key]) {
              d = -1;
            } else if (aKeys[key] === bKeys[key]) {
              d = 0;
            } else {
              d = 1;
            }
          }

          if (sort[i].order === 'descending') d = -d;
          if (d !== 0) break;
        }
      }

      if (d === 0) {
        d = a.i - b.i;
      }

      return d;
    };

    function likeSort(items) {
      var minValue = Infinity;
      var maxValue = -Infinity;
      var i;
      var n = items.length;
      var item;

      for (i = 0; i < n; ++i) {
        item = items[i];
        if (item.score < minValue) minValue = item.score;
        if (item.score > maxValue) maxValue = item.score;
      }

      var segments = [[], [], [], [], [], [], [], []];
      var threshold = maxValue - (maxValue - minValue) / 4;
      if (maxValue < 3) threshold = maxValue - (maxValue - minValue) / 8;
      var d = (maxValue - threshold) / (segments.length - 1);
      var v;
      var k;

      for (i = 0; i < n; ++i) {
        item = items[i];
        v = item.score;
        if (v < threshold || v < 0.8) continue;
        if (v >= maxValue) segments[segments.length - 1].push(item);else {
          k = (v - threshold) / d >> 0;
          segments[k].push(item);
        }
      }

      var res = [];
      var segment;

      while (segments.length > 0) {
        segment = segments.pop();

        if (segment.length > 0) {
          if (sort) {
            segment.sort(sortCmp);
          } else {
            if (segment.length + res.length < 1000) segment.sort(scoreCmp);
          }

          res = res.concat(segment);
        }
      }

      return res;
    }

    function sortScore() {
      var result = its;

      if (filter) {
        result = result.filter(function (x) {
          return !!x;
        });
      } // var now = new Date().getTime();


      if (queryTextItem) {
        result = likeSort(result);
      } else if (sort) {
        result.sort(sortCmp);
      } // console.log("SortTime:", new Date().getTime() - now)


      result = result.map(function (it) {
        return it.i;
      });
      self.searchingSession = 'done';
      global.emit('searchEnd', self.id, Object({
        hash: taskData.hash,
        idx: taskData.idx,
        result: result,
        itemVersion: self.itemVersion
      }));
    }

    function tick() {
      if (self.taskSession !== session) return;

      if (self.itemVersion !== itemVersion) {
        return;
      }

      if (its.length >= items.length) {
        sortScore();
        return;
      }

      var k = benchmark * 5;
      if (!queryTextItem) k *= 30;
      var i = its.length;
      var n = items.length;

      while (k-- && i < n) {
        if (!filter || matchFilter(items[i], filter)) {
          if (!items[i].prepare && queryTextItem) {
            items[i].prepare = true;
            prepareSearchForItem(items[i]);
          }

          its.push({
            i: i,
            item: items[i],
            score: queryTextItem ? calcItemMatchScore(queryTextItem, items[i]) : 0
          });
        } else {
          its.push(null);
        }

        ++i;
      }

      setTimeout(tick, 5);
    }

    tick();
  };

  SearchingSlave.prototype.receiveTask = function (taskData) {
    this.pendingTask = taskData && taskData.query && taskData;
    this.taskSession = taskData && taskData.idx;
    this.scoredHolders = [];
    if (this.tranferFinished && this.pendingTask) this.doTask();
  };

  SearchingSlave.prototype.destroy = function () {
    this.items = null;
    delete slaves[this.id];
  };

  global.destroySlave = function (id) {
    slaves[id] && slaves[id].destroy();
  };
  /******************************************************************************************************************/


  var data = {};

  global.transferTask = function (id, taskData) {
    slaves[id] = slaves[id] || new SearchingSlave(id);
    slaves[id] && slaves[id].receiveTask(taskData);
  };

  global.transferSearchItems = function (id, n, start, end, items, version) {
    slaves[id] = slaves[id] || new SearchingSlave(id);
    slaves[id].onReceiveItems(n, start, end, items, version);
  };

  global.search = function (session, query) {
    var holder = data[session];
    if (!holder) return false;
    var searchingSession = Math.random() + '';
    holder.searchingSession = searchingSession;
    var now = new Date().getTime();
    var items = data[session] && data[session].items;
    var its = Array(items.length);
    var queryItem = prepareSearchForItem({
      text: query
    });
    var resolve;
    var sync = new Promise(function (rs) {
      resolve = rs;
    });

    function calcValue() {
      var i = 0;
      var n = items.length;

      function tick() {
        if (searchingSession !== holder.searchingSession) {
          resolve(false);
          return;
        }

        var c = benchmark * 5;

        while (c-- && i < n) {
          its[i] = {
            i: i,
            item: items[i],
            score: calcItemMatchScore(queryItem, items[i])
          };
          ++i;
        }

        if (i < n) {
          setTimeout(tick, 3);
        } else {
          setTimeout(sortScore, 3);
        }
      }

      tick();
    }

    function sortScore() {
      if (searchingSession !== holder.searchingSession) {
        resolve(false);
        return;
      }

      now = new Date().getTime();
      var result = likeSort(its).map(function (it) {
        return it.i;
      });
      resolve(result);
    }

    setTimeout(calcValue, 3);
    return sync;
  };
}

var _default = DTSearchFactor;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTBody.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTBody.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _DTBodyRow = _interopRequireDefault(require("./DTBodyRow"));

var _DTRowDragController = _interopRequireDefault(require("./DTRowDragController"));

var _utils = require("../utils");

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _Thread = _interopRequireDefault(require("absol/src/Network/Thread"));

var _DTSearchFactor = _interopRequireDefault(require("./DTSearchFactor"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


/***
 *
 * @param {DTBody} body
 * @constructor
 */
function SearchingMaster(body) {
  this.body = body;
  this.mode = body.modes.searching;
  this.waitingCtrl = body.table.elt.waitingCtl;
  this.initWorker();
  this.id = (0, _stringGenerate.randomIdent)(10);
  this.transferSession = Math.random() + '';
  this.transferred = 0;
  this.isTranferring = false;
  this.share.instances[this.id] = this;
  this.itemVersion = 0;
  this.outputCache = {};
  this.lastTaskIdx = 0;
}

SearchingMaster.prototype.destroy = function () {
  this.share.thread.invoke('destroySlave', this.id);
  this.share.instances[this.id] = null;
  this.transferSession = "DIE";
  delete this.share.instances[this.id];
};

SearchingMaster.prototype.transferFrom = function (offset) {
  if (this.transferSession === "DIE") {
    return;
  }

  this.outputCache = {};

  if (offset < this.transferred) {
    this.transferred = offset;
    this.itemVersion++;
  }

  if (this.isTranferring) return;
  var waitingCtrl = this.waitingCtrl;
  var wTkn = waitingCtrl.begin();
  var self = this;
  var transferSession = Math.random() + '';
  self.transferSession = transferSession;
  self.isTranferring = true;
  setTimeout(function tick() {
    if (self.transferSession !== transferSession) {
      waitingCtrl.end(wTkn);
      return;
    }

    var i = self.transferred;
    var rows = self.body.rows;
    var n = self.body.rows.length;

    if (i >= n) {
      if (n === 0) {
        self.share.thread.invoke('transferSearchItems', self.id, n, 0, 0, [], self.itemVersion);
      }

      self.isTranferring = false;
      self.onFinishTransfer();
      waitingCtrl.end(wTkn);
      return;
    }

    self.share.benchmark = self.share.benchmark || _BrowserDetector.default.calcBenchmark();
    var k = self.share.benchmark >> 2;
    var items = [];
    var item;
    var start = i;

    while (i < n && k--) {
      item = {
        text: rows[i].innerText,
        value: i,
        keys: rows[i].data.keys
      };
      items.push(item);
      ++i;
    }

    var sync = self.share.thread.invoke('transferSearchItems', self.id, n, start, i, items, self.itemVersion);
    self.transferred = i;
    Promise.all([sync, new Promise(function (rs) {
      setTimeout(rs, 5);
    })]).then(tick);
  }, 5);
};

SearchingMaster.prototype.onFinishTransfer = function () {// console.log('finish');
};

SearchingMaster.prototype.sendTask = function (query) {
  if (this.transferSession === "DIE") {
    return;
  }

  this.lastTaskIdx++;
  var taskData = {
    idx: this.lastTaskIdx,
    query: query,
    hash: (0, _utils.calcDTQueryHash)(query)
  };

  if (this.outputCache[taskData.hash]) {
    setTimeout(this.onResult.bind(this, this.outputCache[taskData.hash], true), 5);
  } else {
    this.share.thread.invoke('transferTask', this.id, taskData);
  }

  return taskData;
};

SearchingMaster.prototype.onResult = function (response, dontCache) {
  if (this.itemVersion !== response.itemVersion) return;

  if (!dontCache) {
    this.outputCache[response.hash] = response;
  }

  this.body.modes.searching.onResult(response);
};

SearchingMaster.prototype.share = {
  thread: null,
  benchmark: 0,
  instances: {}
};

SearchingMaster.prototype.initWorker = function () {
  if (!this.share.thread) {
    this.share.thread = new _Thread.default({
      methods: {
        init: _DTSearchFactor.default,
        calcBenchmark: _BrowserDetector.default.calcBenchmark
      },
      extendCode: 'init(this);'
    });
    this.share.thread.on('alert', function (mess) {
      alert(mess);
    });
    this.share.thread.on('searchEnd', function (id, response) {
      this.share.instances[id] && this.share.instances[id].onResult(response);
    }.bind(this));
    setTimeout(function () {
      this.share.benchmark = this.share.benchmark || _BrowserDetector.default.calcBenchmark();
    }.bind(this));
  }
};
/***
 *
 * @param {DTBody} body
 * @constructor
 */


function SearchingMode(body) {
  this.status = 'STANDBY';
  this.body = body;
  this.offset = 0;
  this.waitingToken = 'none';
  this.waitingCtrl = body.table.elt.waitingCtl;
  this.taskHash = 0;
  this.renderingHash = -1;
  this.resultItems = [];
}

SearchingMode.prototype.start = function () {
  this.status = "RUNNING";
  this.searchingCache = {};
  this.body.table.elt.addClass('as-searching');
  this.renderingHash = -1;
};

SearchingMode.prototype.end = function () {
  this.body.table.elt.removeClass('as-searching');
  this.searchingItems = null;
  this.status = "STOP";
  this.waitingCtrl.end(this.waitingToken);
  this.body.master.sendTask(null);
};

SearchingMode.prototype.selectPage = function (pageIdx) {
  if (this.renderingHash === -1) {
    this.body.modes.normal.selectPage(pageIdx);
    return;
  }

  var newOffset = pageIdx * this.body.table.adapter.rowsPerPage;
  if (this.offset === newOffset) return;
  this.offset = newOffset;
  this.render();
};

SearchingMode.prototype.render = function () {
  var start = this.offset;
  var end = Math.min(start + this.body.table.adapter.rowsPerPage, this.resultItems.length);
  var elt = this.body.elt;
  var cChildren = Array.prototype.slice.call(elt.childNodes);
  var nChildren = [];
  var rows = this.body.rows;

  for (var i = start; i < end; ++i) {
    nChildren.push(rows[this.resultItems[i]].elt);
  }

  var cC, nC;

  while (cChildren.length > 0 && nChildren.length > 0) {
    cC = cChildren[0];
    nC = nChildren[0];

    if (cC === nC) {
      cChildren.shift();
      nChildren.shift();
    } else {
      break;
    }
  }

  cChildren.forEach(function (elt) {
    elt.remove();
  });
  elt.addChild(nChildren);
};

SearchingMode.prototype.onRowSplice = function (idx) {
  this.render();
};

SearchingMode.prototype.onRowRemoved = function (idx, n) {
  n = n || 1;
  this.resultItems = this.resultItems.reduce(function (ac, cr) {
    if (cr >= idx + n) {
      ac.push(cr - n);
    } else if (cr < idx) {
      ac.push(cr);
    }

    return ac;
  }, []);

  this._updatePageSelector();
};

SearchingMode.prototype.onRowAdded = function (idx, n) {
  n = n || 1;
  this.resultItems = this.resultItems.reduce(function (ac, cr) {
    if (cr >= idx) {
      ac.push(cr + n);
    } else {
      ac.push(cr);
    }

    return ac;
  }, []);
};

SearchingMode.prototype.viewIntoRow = function (row) {};

SearchingMode.prototype.query = function (query) {
  this.waitingCtrl.end(this.waitingToken);
  this.waitingToken = this.waitingCtrl.begin();
  var taskHolder = this.body.master.sendTask(query);
  this.taskHash = taskHolder.hash;
};

SearchingMode.prototype._updatePageSelector = function () {
  var pageCount = Math.max(1, Math.ceil(this.resultItems.length / this.body.table.adapter.rowsPerPage));

  if (this.offset >= pageCount * this.body.table.adapter.rowsPerPage) {
    this.offset = (pageCount - 1) * this.body.table.adapter.rowsPerPage;
  }

  this.body.table.elt.$pageSelector.pageCount = pageCount;
  this.body.table.elt.$pageSelector.pageRange = Math.min(pageCount, 5);
  this.body.table.elt.$pageSelector.selectedIndex = Math.floor(this.offset / this.body.table.adapter.rowsPerPage) + 1;
  var newPageOffset = this.body.table.elt.$pageSelector.selectedIndex;

  if (newPageOffset > 0) {
    newPageOffset--;
  }

  newPageOffset = Math.max(1, Math.min(pageCount - this.body.table.elt.$pageSelector.pageRange + 1, newPageOffset));
  this.body.table.elt.$pageSelector.pageOffset = newPageOffset;
};

SearchingMode.prototype.onResult = function (response) {
  if (this.status !== 'RUNNING' || response.hash !== this.taskHash) return;
  this.waitingCtrl.end(this.waitingToken);

  if (this.renderingHash !== response.hash) {
    this.renderingHash = response.hash;
    this.offset = 0;
  }

  this.resultItems = response.result;

  this._updatePageSelector();

  this.render();
};

SearchingMode.prototype.share = {
  thread: null
};
/***
 *
 * @param {DTBody} body
 * @constructor
 */

function NormalMode(body) {
  this.body = body;
  this.offset = 0;
}

NormalMode.prototype.start = function () {
  if ((0, _utils.isNaturalNumber)(this.body.table.adapter.rowsPerPage)) {
    this.body.table.elt.removeClass('as-no-paging');
  } else {
    this.body.table.elt.addClass('as-no-paging');
  }

  var pageCount = Math.max(1, Math.ceil(this.body.rows.length / this.body.table.adapter.rowsPerPage));
  this.body.table.elt.$pageSelector.pageCount = pageCount;
  this.body.table.elt.$pageSelector.pageRange = Math.min(pageCount, 5);
  this.body.table.elt.$pageSelector.pageOffset = this.offset + 1;
  this.body.table.elt.$pageSelector.selectedIndex = Math.floor(this.offset / this.body.table.adapter.rowsPerPage) + 1;
  this.render();
};

NormalMode.prototype.end = function () {};

NormalMode.prototype.selectPage = function (pageIdx) {
  var newOffset = pageIdx * this.body.table.adapter.rowsPerPage;
  if (this.offset === newOffset) return;
  this.offset = newOffset;
  this.render();
};

NormalMode.prototype.render = function () {
  var start = this.offset;
  var rowsPerPage = this.body.table.adapter.rowsPerPage;
  var data = this.body.data;
  var elt = this.body.elt;
  var end = Math.min(start + rowsPerPage, data.rows.length);
  var rows = this.body.rows;
  elt.clearChild();

  for (var i = start; i < end; ++i) {
    elt.addChild(rows[i].elt);
  }
};

NormalMode.prototype.onRowSplice = function (idx) {
  var rowsPerPage = this.body.table.adapter.rowsPerPage;
  if (!(0, _utils.isNaturalNumber)(rowsPerPage)) rowsPerPage = Infinity;
  if (this.offset <= idx && this.offset + rowsPerPage > idx) this.render();
  var pageCount;

  if (rowsPerPage !== Infinity) {
    pageCount = Math.max(1, Math.ceil(this.body.rows.length / this.body.table.adapter.rowsPerPage));
    if (Math.min(pageCount, 5) !== this.body.table.elt.$pageSelector.pageRange) this.body.table.elt.$pageSelector.pageRange = Math.min(pageCount, 5);

    if (this.body.table.elt.$pageSelector.pageCount !== pageCount) {
      this.body.table.elt.$pageSelector.pageCount = pageCount;

      if (this.body.table.elt.$pageSelector.selectedIndex + 1 >= pageCount) {
        this.body.table.elt.$pageSelector.selectPage(Math.min(this.body.table.elt.$pageSelector.selectedIndex, pageCount), false); //to show last page
      }
    }
  }
};

NormalMode.prototype.viewIntoRow = function (row) {
  if (!(0, _utils.isNaturalNumber)(this.body.table.adapter.rowsPerPage)) return;
  var idx = this.body.rowIndexOf(row);
  if (idx <= 0) return;
  var pageIdx = Math.floor(idx / this.body.table.adapter.rowsPerPage);

  if (this.body.table.elt.$pageSelector.selectedIndex !== pageIdx + 1) {
    this.body.table.elt.$pageSelector.selectedIndex = pageIdx + 1;
  }
};
/***
 *
 * @param {DTTable} table
 * @param data
 * @constructor
 */


function DTBody(table, data) {
  this.table = table;
  /***
   *
   * @type {AElement}
   */

  this.elt = this.table.elt.$tbody;
  this.data = data;
  this.rows = this.data.rows.map(function (rowData, i) {
    var row = new _DTBodyRow.default(this, rowData);
    row.idx = i;
    return row;
  }.bind(this));
  this.rowDragCtrl = new _DTRowDragController.default(this);
  this.modes = {
    normal: new NormalMode(this),
    searching: new SearchingMode(this)
  };
  this.curentMode = this.modes.normal;
  this.curentMode.start();
  this.curentMode.render();
  this.master = new SearchingMaster(this);
  this.master.transferFrom(0);
  /***
   * @name offset
   * @type {number}
   * @memberOf DTBody#
   */
}

DTBody.prototype.revokeResource = function () {
  this.master.destroy();
};

DTBody.prototype.requireRows = function (start, end) {
  if (typeof start !== "number") start = 0;
  if (typeof end !== "number") end = Infinity;
  end = Math.min(end, this.data.rows.length);
  return this.rows.slice(start, end);
};

DTBody.prototype.reindexRows = function (start, end) {
  if (typeof start !== "number") start = 0;
  if (typeof end !== "number") end = Infinity;
  end = Math.min(end, this.data.rows.length);

  for (var i = start; i < end; ++i) {
    if (this.rows[i]) this.rows[i].idx = i;
  }
};

DTBody.prototype.onRowSplice = function (idx) {
  this.curentMode.onRowSplice(idx);
  this.master.transferFrom(idx);

  _ResizeSystem.default.requestUpdateSignal();
};

DTBody.prototype.rowIndexOf = function (o) {
  var n = this.rows.length;

  for (var i = 0; i < n; ++i) {
    if (o === this.rows[i]) return i;
    if (o === this.data.rows[i]) return i;
    if (o === this.data.rows[i].id) return i;
  }

  return -1;
};

DTBody.prototype.addRowBefore = function (rowData, bf) {
  var idx;

  if (bf === null || bf === undefined) {
    return this.addRow(rowData);
  } else {
    idx = this.rowIndexOf(bf);
    if (idx < 0) throw new Error("$bf not is a row in table");
    return this.addRow(rowData, idx);
  }
};

DTBody.prototype.addRowAfter = function (rowData, at) {
  var idx;

  if (at === null || at === undefined) {
    return this.addRow(rowData, 0);
  } else {
    idx = this.rowIndexOf(at);
    if (idx < 0) throw new Error("$bf not is a row in table");
    return this.addRow(rowData, idx + 1);
  }
};

DTBody.prototype.addRow = function (rowData, idx) {
  if (!(0, _utils.isNaturalNumber)(idx) || idx >= this.rows.length) {
    idx = this.rows.length;
  }

  var row;

  if (idx >= this.rows.length) {
    idx = this.rows.length;
    this.data.rows.push(rowData);
    row = new _DTBodyRow.default(this, rowData);
    row.idx = idx;
    this.rows.push(row);
    if (this.curentMode.onRowAdded) this.curentMode.onRowAdded(idx, 1);
    this.onRowSplice(this.rows.length - 1);
  } else {
    row = new _DTBodyRow.default(this, rowData);
    row.idx = idx;
    this.rows.splice(idx, 0, row);
    this.data.rows.splice(idx, 0, rowData);
    this.reindexRows(idx + 1);
    this.onRowSplice(idx);
  }

  return row;
};

DTBody.prototype.addRows = function (rowsData, idx) {
  if (!(0, _utils.isNaturalNumber)(idx) || idx >= this.rows.length) {
    idx = this.rows.length;
  }

  var res = [];
  var row, i, rowData;

  if (idx >= this.rows.length) {
    idx = this.rows.length;

    for (i = 0; i < rowsData.length; ++i) {
      rowData = rowsData[i];
      row = new _DTBodyRow.default(this, rowData);
      row.idx = i + idx;
      this.data.rows.push(rowData);
      res.push(row);
      this.rows.push(row);
    }
  } else {
    for (i = 0; i < rowsData.length; ++i) {
      rowData = rowsData[i];
      row = new _DTBodyRow.default(this, rowData);
      row.idx = i + idx;
      res.push(row);
      this.data.rows.splice(idx + i, 0, rowData);
      this.rows.splice(idx + i, 0, row);
    }

    this.reindexRows(idx + rowsData.length);
  }

  if (this.curentMode.onRowAdded) this.curentMode.onRowAdded(idx, rowsData.length);
  this.onRowSplice(idx);
  return res;
};

DTBody.prototype.removeRow = function (row) {
  var idx = this.rowIndexOf(row);
  if (idx < 0) return;
  this.rows.splice(idx, 1);
  this.data.rows.splice(idx, 1);
  this.reindexRows(idx);
  if (this.curentMode.onRowRemoved) this.curentMode.onRowRemoved(idx);
  this.onRowSplice(idx);
};

DTBody.prototype.clearRows = function () {
  var n = this.rows.length;
  this.rows.splice(0);
  this.data.rows.splice(0);
  if (this.curentMode.onRowRemoved) this.curentMode.onRowRemoved(0, n);
  this.onRowSplice(0);
};

DTBody.prototype.rowAt = function (idx) {
  if (this.rows[idx]) return this.rows[idx];
  var rowData = this.data.rows[idx];

  if (rowData) {
    this.rows[idx] = new _DTBodyRow.default(this, rowData);
    this.rows[idx].idx = idx;
  } else return null;
};

DTBody.prototype.rowOf = function (o) {
  var idx = this.rowIndexOf(o);
  return this.rowAt(idx);
};

DTBody.prototype.viewIntoRow = function (row) {
  return this.curentMode.viewIntoRow(row);
};

DTBody.prototype.selectPage = function (pageIdx, userAction) {
  this.curentMode.selectPage(pageIdx);
};

DTBody.prototype.startSearchingIfNeed = function () {
  if (this.curentMode !== this.modes.searching) {
    this.curentMode.end();
    this.curentMode = this.modes.searching;
    this.curentMode.start();
  }
};

DTBody.prototype.stopSearchIfNeed = function () {
  if (this.curentMode === this.modes.searching) {
    this.curentMode.end();
    this.curentMode = this.modes.normal;
    this.curentMode.start();
  }
};

DTBody.prototype.query = function (query) {
  var now = new Date().getTime();

  if (query) {
    this.startSearchingIfNeed();
  } else if (!query) {
    this.stopSearchIfNeed();
    this.curentMode.render();
  }

  if (this.curentMode.query && query) {
    this.curentMode.query(query);
  }
};

Object.defineProperties(DTBody.prototype, {
  rowsPerPage: {
    get: function () {
      return this.table.adapter.rowsPerPage;
    }
  },
  offset: {
    set: function (value) {
      this._offset = value;
      this.renderCurrentOffset();
    },
    get: function () {
      return this._offset;
    }
  },
  searching: {
    get: function () {
      return this.elt.hasClass('as-searching');
    }
  }
});
var _default = DTBody;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _DTHead = _interopRequireDefault(require("./DTHead"));

var _DTBody = _interopRequireDefault(require("./DTBody"));


/***
 *
 * @param {DynamicTable} elt
 * @param {} data
 * @constructor
 */
function DTTable(elt, data) {
  this.elt = elt;
  /***
   *
   * @type {DTDataTable|null|*|string}
   */

  this.adapter = this.elt._adapter;
  this.data = data;
  this.clearView();
  this.header = new _DTHead.default(this, this.data.head);
  this.body = new _DTBody.default(this, this.data.body);
}

DTTable.prototype.clearView = function () {
  this.elt.$tbody.clearChild();
  this.elt.$thead.clearChild();
};

DTTable.prototype.revokeResource = function () {
  this.body.revokeResource();
};

Object.defineProperty(DTTable.prototype, 'offset', {
  set: function (value) {
    this.body.offset = value;
  },
  get: function () {
    return this.body.offset;
  }
});
var _default = DTTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTDataAdapter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTDataAdapter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _DTTable = _interopRequireDefault(require("./DTTable"));

var _ACore = require("../../ACore");


/***
 * @typedef DTDataRow
 * @property
 */

/***
 * @typedef DTDataBody
 * @property {DTDataRow[]} row
 */

/***
 * @typedef DTDataHead
 * @property {DTDataHRow[]} row
 */

/***
 * @typedef DTDataTable
 * @property head
 * @property body
 */

/***
 *
 * @param {DynamicTable} tableElt
 * @param {DTDataAdapter} opt
 * @constructor
 */
function DTDataAdapter(tableElt, opt) {
  this.tableElt = tableElt;
  /***
   *
   * @type {null|DTDataTable}
   */

  this.data = null;
  this.rowsPerPage = 20;
  Object.assign(this, opt);
}

DTDataAdapter.prototype.render = function () {
  if (this.tableElt.table) this.tableElt.table.revokeResource();
  this.tableElt.table = new _DTTable.default(this.tableElt, this.data);
};

DTDataAdapter.prototype.renderHeadCell = function (elt, data, controller) {
  if (data.child) {
    if (data.child.map) {
      elt.addChild(data.child.map(function (it) {
        return (0, _ACore._)(it);
      }));
    } else {
      elt.addChild((0, _ACore._)(data.child));
    }
  }

  if (data.render) {
    data.render.call(null, elt, data, controller);
  }

  if (data.style) {
    elt.addStyle(data.style);
  }
};

DTDataAdapter.prototype.renderBodyCell = function (elt, data, controller) {
  if (data.child) {
    if (data.child.map) {
      elt.addChild(data.child.map(function (it) {
        return (0, _ACore._)(it);
      }));
    } else {
      elt.addChild((0, _ACore._)(data.child));
    }
  }

  if (data.render) {
    data.render.call(null, elt, data, controller);
  }

  if (data.style) {
    elt.addStyle(data.style);
  }
};

var _default = DTDataAdapter;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DTWaitingViewController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DTWaitingViewController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {DynamicTable} tableElt
 * @constructor
 */
function DTWaitingViewController(tableElt) {
  this.tableElt = tableElt;
  this.tokens = {};
  this.traceToken = {};
  this.timeoutIdx = -1;
}

DTWaitingViewController.prototype.begin = function () {
  var token = Math.random() + '';
  if (this.tableElt.$searchInput) this.tableElt.$searchInput.waiting = true;
  this.tokens[token] = true;
  this.traceToken[token] = new Error(token);

  if (this.timeoutIdx > 0) {
    clearTimeout(this.timeoutIdx);
    this.timeoutIdx = -1;
  }

  return token;
};

DTWaitingViewController.prototype.end = function (token) {
  delete this.tokens[token];
  delete this.traceToken[token];

  if (this.timeoutIdx > 0) {
    clearTimeout(this.timeoutIdx);
  }

  this.timeoutIdx = setTimeout(function () {
    this.timeoutIdx = -1;

    for (var i in this.tokens) return;

    if (this.tableElt.$searchInput) this.tableElt.$searchInput.waiting = false;
  }.bind(this), 100);
};

var _default = DTWaitingViewController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dynamictable/DynamicTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dynamictable/DynamicTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _DTDataAdapter = _interopRequireDefault(require("./DTDataAdapter"));

require("../../css/dynamictable.css");

var _PageSelector = _interopRequireDefault(require("../PageSelector"));

var _DTWaitingViewController = _interopRequireDefault(require("./DTWaitingViewController"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _utils = require("../utils");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




var loadStyleSheet = function () {
  var dynamicStyleSheet = {};
  var key = Array(20).fill(0).map((u, i) => ['.as-dynamic-table-wrapper.as-hide-col-' + i + ' td[data-col-idx="' + i + '"]', '.as-dynamic-table-wrapper.as-hide-col-' + i + ' th[data-col-idx="' + i + '"]'].join(', ')).join(',\n');
  dynamicStyleSheet[key] = {
    display: 'none'
  };
  (0, _utils.buildCss)(dynamicStyleSheet);
  loadStyleSheet = _noop.default;
};
/***
 * @extends AElement
 * @constructor
 */


function DynamicTable() {
  loadStyleSheet();
  this._hiddenColumns = [];
  /***
   *
   * @type {SearchTextInput|null}
   */

  this.$searchInput = null;
  /***
   *
   * @type {AElement}
   */

  this.$table = (0, _ACore.$)('.as-dynamic-table', this);
  /***
   *
   * @type {AElement}
   */

  this.$thead = (0, _ACore.$)('.as-dynamic-table>thead', this.$table);
  /***
   *
   * @type {AElement}
   */

  this.$tbody = (0, _ACore.$)('.as-dynamic-table>tbody', this.$table);
  /***
   *
   * @type {PageSelector}
   */

  this.$pageSelector = (0, _ACore.$)('pageselector', this).on('change', this.eventHandler.pageSelectorChange);
  this.$filterInputs = []; //controller

  this.table = null;
  /***
   *
   * @type {DTDataTable||null}
   */

  this.adapter = null;
  this.waitingCtl = new _DTWaitingViewController.default(this);

  var checkAlive = () => {
    if (this.isDescendantOf(document.body)) {
      setTimeout(checkAlive, 5000);
    } else {
      this.revokeResource();
    }
  };

  setTimeout(checkAlive, 30000);
}

DynamicTable.tag = 'DynamicTable'.toLowerCase();

DynamicTable.render = function () {
  return (0, _ACore._)({
    extendEvent: ['orderchange'],
    class: 'as-dynamic-table-wrapper',
    child: [{
      tag: 'table',
      class: 'as-dynamic-table',
      child: [{
        tag: 'thead',
        class: 'as-dt-header'
      }, {
        tag: 'tbody',
        class: 'as-dt-body'
      }]
    }, {
      tag: _PageSelector.default.tag,
      props: {
        pageRange: 5,
        pageOffset: 1,
        selectedIndex: 1,
        pageCount: 15
      }
    }]
  });
};

DynamicTable.prototype.revokeResource = function () {
  this.table && this.table.revokeResource();
  this.attachSearchInput(null);
  this.filterInputs = [];
};

DynamicTable.prototype.addRowBefore = function (rowData, bf) {
  return this.table.body.addRowBefore(rowData, bf);
};

DynamicTable.prototype.addRowAfter = function (rowData, at) {
  return this.table.body.addRowAfter(rowData, at);
};

DynamicTable.prototype.replaceRow = function (rowData, rp) {
  var row = this.rowOf(rp);

  if (row) {
    row.updateData(rowData);
  }

  _ResizeSystem.default.requestUpdateSignal();
};

DynamicTable.prototype.addRow = function (rowData, idx) {
  return this.table.body.addRow(rowData, idx);
};

DynamicTable.prototype.addRows = function (rowsData, idx) {
  return this.table.body.addRows(rowsData, idx);
};

DynamicTable.prototype.removeRow = function (row) {
  return this.table.body.removeRow(row);
};

DynamicTable.prototype.rowAt = function (idx) {
  return this.table.body.rowAt(idx);
};

DynamicTable.prototype.rowOf = function (o) {
  return this.table.body.rowOf(o);
};

DynamicTable.prototype.getRows = function () {
  return this.table.body.rows;
};

DynamicTable.prototype.requireRows = function (start, end) {
  return this.table.body.requireRows(start, end);
};

DynamicTable.prototype.clearRows = function () {
  return this.table.body.clearRows();
};

DynamicTable.prototype.viewIntoRow = function (row) {
  this.table.body.viewIntoRow(row);
};

DynamicTable.prototype.attachSearchInput = function (inputElt) {
  if (this.$searchInput) {
    this.$searchInput.off('stoptyping', this.eventHandler.searchModify);
    this.$searchInput.off('keyup', this.eventHandler.searchKeyUp);
  }

  this.$searchInput = inputElt;

  if (this.$searchInput) {
    if (this.$searchInput.$table) {
      this.$searchInput.off('stoptyping', this.$searchInput.$table.eventHandler.searchModify);
      this.$searchInput.off('keyup', this.$searchInput.$table.eventHandler.searchKeyUp);
    }

    this.$searchInput.$table = this;
    this.$searchInput.on('stoptyping', this.eventHandler.searchModify);
    this.$searchInput.on('keyup', this.eventHandler.searchKeyUp);
  }
};

DynamicTable.prototype.filter = function (filter) {
  var query = {};
  var queryText = this.$searchInput && this.$searchInput.value || '';
  queryText = queryText.trim().replace(/\s\s+/g, ' ');
  var i;

  if (filter) {
    for (i in filter) {
      query.filter = filter;
      break;
    }
  }

  if (queryText && queryText.length > 0) query.text = queryText;

  for (i in query) {
    this.query(query);
    return;
  }

  this.query(null);
};

DynamicTable.prototype.makeQuery = function () {
  var query = {};
  var textQuery = this.$searchInput && this.$searchInput.value.trim().replace(/\s\s+/, ' ');
  if (textQuery && textQuery.length > 0) query.text = textQuery;
  var i;
  var filter = this.$filterInputs.reduce(function (ac, elt) {
    if (elt.exportFilter) {
      elt.exportFilter(ac);
    } else if (elt.name) {
      ac[elt.name] = elt.value;
    }

    return ac;
  }, {});
  var sort = (0, _ACore.$$)('th', this.table.header.elt).reduce((ac, cr) => {
    var key = cr.attr('data-sort-key');
    var order = cr.attr('data-sort-order');

    if (key && order && order !== 'none') {
      ac.push({
        key: key,
        order: order
      });
    }

    return ac;
  }, []);

  for (i in filter) {
    query.filter = filter;
    break;
  }

  if (sort.length > 0) {
    query.sort = sort;
  }

  for (i in query) {
    return query;
  }

  return null;
};

DynamicTable.prototype.requestQuery = function () {
  var query = this.makeQuery();
  this.query(query);
};

DynamicTable.prototype.query = function (query) {
  this.table.body.query(query);
};

DynamicTable.prototype.addFilter = function (inputElt) {
  if (inputElt.$dynamicTable) {
    inputElt.$dynamicTable.removeFilter(inputElt);
  }

  inputElt.$dynamicTable = this;
  inputElt.on('change', this.eventHandler.searchModify);
  this.$filterInputs.push(inputElt);
};

DynamicTable.prototype.removeFilter = function (inputElt) {
  if (inputElt.$dynamicTable !== this) return;
  inputElt.$dynamicTable = null;
  inputElt.off('change', this.eventHandler.searchModify);
  var idx = this.$filterInputs.indexOf(inputElt);
  if (idx >= 0) this.$filterInputs.splice(idx, 1);
};

DynamicTable.prototype.notifyRowChange = function (row) {
  var idx = this.table.body.rowIndexOf(row);
  if (idx >= 0) this.table.body.onRowSplice(idx);
};

DynamicTable.prototype.notifyRowsChange = _noop.default;
DynamicTable.property = {};
DynamicTable.property.adapter = {
  set: function (data) {
    this._adapterData = data;

    if (data) {
      this._adapter = new _DTDataAdapter.default(this, data);

      this._adapter.render();
    } else {//todo
    }

    var c = this.parentElement;

    while (c) {
      if (c.hasClass && c.hasClass('absol-table-vscroller') && c.update) {
        c.update();
        break;
      }

      c = c.parentElement;
    }
  },
  get: function () {
    return this._adapterData;
  }
};
DynamicTable.property.filterInputs = {
  set: function (inputs) {
    inputs = inputs || [];
    this.$filterInputs.slice().forEach(input => {
      this.removeFilter(input);
    });
    inputs.forEach(input => this.addFilter(input));
  },
  get: function () {
    return this.$filterInputs;
  }
};
DynamicTable.property.hiddenColumns = {
  set: function (value) {
    value = value || [];

    this._hiddenColumns.forEach(function (idxV) {
      this.removeClass('as-hide-col-' + idxV);
    }.bind(this));

    this._hiddenColumns = value;

    this._hiddenColumns.forEach(function (idxV) {
      this.addClass('as-hide-col-' + idxV);
    }.bind(this));

    var c = this.parentElement;

    while (c) {
      if (c.hasClass && c.hasClass('absol-table-vscroller') && c.update) {
        c.update();
        break;
      }

      c = c.parentElement;
    }
  },
  get: function () {
    return this._hiddenColumns;
  }
};
/***
 * @memberOf {DynamicTable#}
 * @type {{}}
 */

DynamicTable.eventHandler = {};

DynamicTable.eventHandler.pageSelectorChange = function (event) {
  this.table.body.selectPage(this.$pageSelector.selectedIndex - 1, event);
};
/***
 * @this DynamicTable#
 * @param event
 */


DynamicTable.eventHandler.searchModify = function (event) {
  this.requestQuery();
};
/***
 * @this DynamicTable#
 * @param event
 */


DynamicTable.eventHandler.searchKeyUp = function (event) {
  setTimeout(function () {
    var query = this.$searchInput.value;
    query = query.trim().replace(/\s+/, ' ');
    if (query.length) this.table.body.startSearchingIfNeed();
  }.bind(this), 30);
};

_ACore.default.install(DynamicTable);

var _default = DynamicTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/dialog/OMTSelectOptionsDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/dialog/OMTSelectOptionsDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _ACore = require("../../../ACore");

var _MessageDialog = _interopRequireDefault(require("../../MessageDialog"));

var _Modal = _interopRequireDefault(require("../../Modal"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _RadioButton = _interopRequireDefault(require("../../RadioButton"));

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));


/***
 * @extends Fragment
 * @param {OMTBaseType} node
 * @constructor
 */
function OMTSelectOptionsDialog(node) {
  _Fragment.default.call(this);

  this.node = node;
  this.calc();
  this.getView();
  this.start();
}

_OOP.default.mixClass(OMTSelectOptionsDialog, _Fragment.default);

OMTSelectOptionsDialog.prototype.calc = function () {
  this.options = this.node.getSelectOptions();
  this.curHash = this.node.getHash();
  this.selectedHash = this.curHash;
  this.selectedOption = null;
  this.ident = (0, _stringGenerate.randomIdent)(5);
};

OMTSelectOptionsDialog.prototype.onStart = function () {
  this.$modal.addTo(document.body);
};

OMTSelectOptionsDialog.prototype.onStop = function () {
  this.$modal.remove();
};

OMTSelectOptionsDialog.prototype.assignResult = function () {
  if (this.curHash !== this.selectedHash) {
    this.node.assign(this.selectedOption);
    this.node.updateRaw();
    this.node.notifyChange();
  }
};

OMTSelectOptionsDialog.prototype._makeOptionRow = function (opt, i, dict) {
  var descriptor = Object.assign({}, this.node.descriptor);

  if (i < 0) {
    descriptor.desc = '(current-mixed)';
  }

  var clazz = this.node.constructor;
  var node = new clazz(this.node.tool, this.node.parent, descriptor);
  node.assign(opt);
  var nodeHash = node.getHash();
  if (dict[nodeHash]) return null;
  dict[nodeHash] = node;
  var self = this;
  var radio = (0, _ACore._)({
    tag: _RadioButton.default.tag,
    style: {
      marginRight: '10px'
    },
    props: {
      name: this.ident,
      checked: nodeHash === this.curHash
    },
    on: {
      change: function () {
        if (radio.checked) {
          self.selectedHash = nodeHash;
          self.selectedOption = opt;
        }
      }
    }
  });
  return (0, _ACore._)({
    class: 'as-omt-option-row',
    child: [radio, node.elt]
  });
};

OMTSelectOptionsDialog.prototype.createView = function () {
  var self = this;
  this.$view = (0, _ACore._)({
    tag: _MessageDialog.default.tag,
    class: 'as-omt-dialog',
    props: {
      dialogTitle: {
        mlKey: 'txt_option'
      },
      dialogActions: [{
        text: {
          mlKey: 'txt_ok'
        },
        name: 'ok'
      }, {
        text: {
          mlKey: 'txt_cancel'
        },
        name: 'cancel'
      }]
    },
    on: {
      action: function (event) {
        self.stop();
        var action = event.action;
        if (action.name === 'cancel') return;

        if (action.name === 'ok') {
          self.assignResult();
        }
      }
    }
  });
  var dict = {};
  var rows = this.options.map((opt, i) => this._makeOptionRow(opt, i, dict)).filter(x => !!x);

  if (!dict[this.curHash]) {
    rows.unshift(this._makeOptionRow(this.node.export(), -1, dict));
  }

  this.$view.addChild(rows);
  this.$modal = (0, _ACore._)({
    tag: _Modal.default.tag,
    style: {
      zIndex: 1000000
    },
    child: this.$view
  });
};

var _default = OMTSelectOptionsDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTBaseType.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTBaseType.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../../ACore");

var _generator = require("absol/src/JSMaker/generator");

var _FlexiconButton = _interopRequireDefault(require("../../FlexiconButton"));

var _Modal = _interopRequireDefault(require("../../Modal"));

var _MessageDialog = _interopRequireDefault(require("../../MessageDialog"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _RadioInput = _interopRequireDefault(require("../../RadioInput"));

var _stringUtils = require("absol/src/String/stringUtils");

var _RadioButton = _interopRequireDefault(require("../../RadioButton"));

var _OMTSelectOptionsDialog = _interopRequireDefault(require("../dialog/OMTSelectOptionsDialog"));


/**
 *
 * @constructor
 */
function OMTBaseType(tool, parent, descriptor) {
  this.tool = tool;
  this.parent = parent;
  this.level = parent ? parent.level + 1 : 0;
  this.descriptor = descriptor;
  this.render();
  this.elt.omtNode = this;
}

OMTBaseType.prototype.type = 'base';
OMTBaseType.prototype.commands = [{
  name: 'select_other',
  icon: 'span.mdi.mdi-menu-down',
  title: 'Select'
}];

OMTBaseType.prototype.render = function () {
  var self = this;
  var displayName = 'ROOT';
  if (this.descriptor.displayName !== undefined) displayName = this.descriptor.displayName + '';else if (this.descriptor.name !== undefined) displayName = this.descriptor.name + '';
  if (this.descriptor.desc) displayName += this.descriptor.desc;
  this.elt = (0, _ACore._)({
    class: ['as-omt-field', 'as-type-' + this.type],
    style: {
      '--level': this.level
    },
    child: [{
      class: 'as-omt-field-header',
      child: [{
        class: 'as-omt-field-name',
        child: {
          text: displayName
        }
      }]
    }, {
      class: 'as-omt-field-body'
    }, {
      class: 'as-omt-field-raw-ctn'
    }, {
      class: 'as-omt-field-command-ctn',
      child: this.commands.map(command => ({
        tag: _FlexiconButton.default.tag,
        attr: {
          'data-command': command.name
        },
        props: {
          icon: command.icon,
          title: command.title
        },
        on: {
          click: this.execCmd.bind(this, command.name, command)
        }
      }))
    }],
    on: {
      dblclick: function (event) {
        var target = event.target;

        while (target) {
          if (target === this) break;
          if (target.tagName === 'BUTTON') return;
          target = target.parentElement;
        }

        this.execCmd('select_other');
      }.bind(this)
    }
  });
  this.$commandCtn = (0, _ACore.$)('.as-omt-field-command-ctn', this.elt);
  this.$rawCtn = (0, _ACore.$)('.as-omt-field-raw-ctn', this.elt);
  this.$viewModeBtn = (0, _ACore._)({
    tag: _FlexiconButton.default.tag,
    attr: {
      'data-command': 'view_mode'
    },
    props: {
      icon: 'span.mdi.mdi.mdi-code-braces',
      //code-braces
      title: 'View Raw'
    },
    on: {
      click: function () {
        if (self.elt.hasClass('as-mode-raw')) {
          self.elt.removeClass('as-mode-raw');
          this.icon = 'span.mdi.mdi-code-braces';
          this.title = 'View Raw';
        } else {
          self.elt.addClass('as-mode-raw');
          this.icon = 'span.mdi.mdi-view-dashboard-edit-outline';
          this.title = 'View Guide';
          self.updateRaw();
        }
      }
    }
  });
  this.$commandCtn.addChild(this.$viewModeBtn);
  this.$body = (0, _ACore.$)('.as-omt-field-body', this.elt);
};

OMTBaseType.prototype.updateRaw = function () {
  var rawElt = (0, _ACore._)(this.getRaw());
  this.$rawCtn.clearChild().addChild(rawElt);
};

OMTBaseType.prototype.notifyChange = function () {
  this.descriptor.onchange && this.descriptor.onchange.call(this, {
    type: 'change',
    target: this,
    descriptor: this.descriptor
  }, this);
  this.tool.notifyChange();
};

OMTBaseType.prototype.getRaw = function () {
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'code',
      child: {
        text: (0, _generator.generateJSVariable)(this.export())
      }
    }]
  };
};

OMTBaseType.prototype.assign = function (o) {
  this.value = o;
  this.$body.clearChild().addChild((0, _ACore._)({
    tag: 'code',
    child: {
      text: (0, _generator.generateJSVariable)(o)
    }
  }));
};

OMTBaseType.prototype.getHash = function () {
  return (0, _stringUtils.stringHashCode)((0, _generator.generateJSVariable)(this.export()));
};

OMTBaseType.prototype.export = function () {
  return this.value;
};

OMTBaseType.prototype.execCmd = function (commandName, command) {
  if (commandName === 'select_other') {
    this.userSelect();
  }
};

OMTBaseType.prototype.getSelectOptions = function () {
  if (!this.parent) return this.tool.objects;
  var parentOptions = this.parent.getSelectOptions().filter(x => !!x);
  var name = this.descriptor.name;
  return parentOptions.map(ot => ot[name]).filter(ot => ot !== undefined);
};

OMTBaseType.prototype.userSelect = function () {
  new _OMTSelectOptionsDialog.default(this);
};

OMTBaseType.classes = {};
/***
 *
 * @param tool
 * @param parent
 * @param descriptor
 * @returns {OMTBaseType}
 */

OMTBaseType.make = function (tool, parent, descriptor) {
  var clazz = OMTBaseType.classes[descriptor.type] || OMTBaseType;
  return new clazz(tool, parent, descriptor);
};

var _default = OMTBaseType;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTStruct.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTStruct.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _stringUtils = require("absol/src/String/stringUtils");

var _generator = require("absol/src/JSMaker/generator");


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTStruct() {
  _OMTBaseType.default.apply(this, arguments);

  this.children = (this.descriptor.fields || []).map(field => _OMTBaseType.default.make(this.tool, this, field));
  this.$body.addChild(this.children.map(child => child.elt));
  this.data = null;
}

_OOP.default.mixClass(OMTStruct, _OMTBaseType.default);

OMTStruct.prototype.type = 'struct';

OMTStruct.prototype.assign = function (o) {
  if (o !== null && typeof o === "object") {
    this.elt.removeClass('as-null');
    this.children.forEach(child => {
      var name = child.descriptor.name;
      child.assign(o[name]);
    });
  } else {
    this.elt.addClass('as-null');
  }
};

OMTStruct.prototype.export = function () {
  return this.children.reduce((ac, cr) => {
    ac[cr.descriptor.name] = cr.export();
    return ac;
  }, {});
};

OMTStruct.prototype.getHash = function () {
  var hash = this.children.map(c => c.getHash()).join('_');
  return (0, _stringUtils.stringHashCode)(hash);
};

OMTStruct.prototype.getRaw = function () {
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      style: {
        paddingLeft: '25px'
      },
      child: this.children.map(child => child.getRaw())
    }]
  };
};

_OMTBaseType.default.classes.struct = OMTStruct;
var _default = OMTStruct;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTString.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTString.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _generator = require("absol/src/JSMaker/generator");


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTString() {
  _OMTBaseType.default.apply(this, arguments);

  this.value = null;
}

_OOP.default.mixClass(OMTString, _OMTBaseType.default);

_OMTBaseType.default.classes.string = OMTString;

OMTString.prototype.assign = function (o) {
  this.value = o;
  this.$body.clearChild();
  this.$value = (0, _ACore._)({
    tag: 'span',
    child: {
      text: (o || '') + ''
    }
  });
  this.$body.addChild(this.$value);
};

OMTString.prototype.getRaw = function () {
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'span',
      child: {
        text: this.export()
      }
    }]
  };
};

var _default = OMTString;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTFile.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTFile.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _FileListItem = _interopRequireDefault(require("../../FileListItem"));

var _utils = require("../../utils");


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTFile() {
  _OMTBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(OMTFile, _OMTBaseType.default);

_OMTBaseType.default.classes.file = OMTFile;
_OMTBaseType.default.prototype.type = 'file';

OMTFile.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    tag: _FileListItem.default.tag,
    class: 'as-omt-field-value'
  });
  this.$body.addChild(this.$value);
};

OMTFile.prototype.assign = function (o) {
  this.value = o;

  if (o) {
    this.$value.value = o;
    this.$value.removeStyle('display');
  } else {
    this.$value.addStyle('display', 'none');
  }
};

OMTFile.prototype.getRaw = function () {
  var info = (0, _utils.fileInfoOf)(this.value);
  var href = info.url;
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'a',
      props: {
        href: href,
        target: '_blank'
      },
      child: {
        text: info.name
      }
    }]
  };
};

var _default = OMTFile;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTImage.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTImage.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _OMTFile = _interopRequireDefault(require("./OMTFile"));


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTImage() {
  _OMTBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(OMTImage, _OMTBaseType.default);

_OMTBaseType.default.classes.image = OMTImage;
_OMTBaseType.default.prototype.type = 'image';

OMTImage.prototype.assign = function (o) {
  this.value = o;
  var title = '';
  this.$body.clearChild();

  var handle = val => {
    if (!val) return;

    if (val && val.then) {
      val.then(handle);
      return;
    }

    if (val && val.url) {
      handle(val.url);
      return;
    }

    if (val instanceof File || val instanceof Blob) {
      val.url = val.url || URL.createObjectURL(val);
      if (!title && val.filename) title = val.filename;
      handle(val);
      return;
    }

    if (!title) title = val.split('/').pop().split('?').shift();
    this.$value = (0, _ACore._)({
      tag: 'img',
      class: 'as-omt-field-value',
      props: {
        src: val,
        title: title
      }
    });
    this.$body.addChild(this.$value);
  };

  handle(o);
};

OMTImage.prototype.getRaw = _OMTFile.default.prototype.getRaw;
var _default = OMTImage;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTEnum.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTEnum.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _SelectTreeMenu = _interopRequireDefault(require("../../SelectTreeMenu"));

var _generator = require("absol/src/JSMaker/generator");


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTEnum() {
  _OMTBaseType.default.apply(this, arguments);

  this.value = null;
}

_OOP.default.mixClass(OMTEnum, _OMTBaseType.default);

_OMTBaseType.default.classes.enum = OMTEnum;

OMTEnum.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    tag: _SelectTreeMenu.default.tag,
    class: 'as-border-none',
    style: {
      height: '18px'
    },
    props: {
      readOnly: true
    }
  });
  this.$body.addChild(this.$value);

  if (this.descriptor.items && this.descriptor.items.then) {
    this.descriptor.items.then(items => {
      this.$value.items = items;
    });
  } else {
    this.$value.items = this.descriptor.items;
  }
};

OMTEnum.prototype.assign = function (o) {
  this.value = o;
  this.$value.value = o;
};

OMTEnum.prototype.getRaw = function () {
  var text = '';
  var holders = this.$value.findItemsByValue(this.export());

  if (holders && holders.length > 0) {
    text = holders[0].item.text;
    if (holders[0].item.desc) text += ' - ' + holders[0].item.desc;
  }

  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'span',
      child: {
        text: text
      }
    }]
  };
};

var _default = OMTEnum;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/dialog/OMTArrayMergeDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/dialog/OMTArrayMergeDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _ACore = require("../../../ACore");

var _MessageDialog = _interopRequireDefault(require("../../MessageDialog"));

var _Modal = _interopRequireDefault(require("../../Modal"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _MultiCheckTreeMenu = _interopRequireDefault(require("../../MultiCheckTreeMenu"));

var _CheckBoxInput = _interopRequireDefault(require("../../CheckBoxInput"));

var _Array = require("absol/src/DataStructure/Array");

var _RadioButton = _interopRequireDefault(require("../../RadioButton"));

var _OMTSelectOptionsDialog = _interopRequireDefault(require("./OMTSelectOptionsDialog"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _CheckboxButton = _interopRequireDefault(require("../../CheckboxButton"));

var _stringUtils = require("absol/src/String/stringUtils");


function hashArrayOf(node) {
  var res = (node.children || []).map(child => child.getHash());
  res.sort((a, b) => a - b);
  return (0, _Array.arrayUnique)(res);
}
/***
 * @extends Fragment
 * @param {OMTArray} node
 * @constructor
 */


function OMTArrayMergeDialog(node) {
  _Fragment.default.call(this);

  this.node = node;
  this.calc();
  this.getView();
  this.start();
}

_OOP.default.mixClass(OMTArrayMergeDialog, _Fragment.default);

OMTArrayMergeDialog.prototype.calc = function () {
  this.options = this.node.getSelectOptions();
  this.curHash = hashArrayOf(this.node);
  this.selectedNodes = {};
};

OMTArrayMergeDialog.prototype.onStart = function () {
  this.$modal.addTo(document.body);
};

OMTArrayMergeDialog.prototype.onStop = function () {
  this.$modal.remove();
};

OMTArrayMergeDialog.prototype.assignResult = function () {
  var dict = {};
  var itemArr = [];
  var hashArr = [];
  var node;

  for (var key in this.selectedNodes) {
    node = this.selectedNodes[key];

    if (node.children) {
      node.children.forEach(cr => {
        var hash = cr.getHash();
        if (dict[hash]) return;
        dict[hash] = true;
        itemArr.push(cr.export());
        hashArr.push(hash);
      });
    }
  }

  if (this.curHash === hashArr && (0, _Array.arrayUnique)(this.curHash.concat(hashArr)).length === this.curHash.length) return;
  this.node.assign(itemArr);
  this.node.updateRaw();
  this.node.notifyChange();
};

OMTArrayMergeDialog.prototype._makeOptionRow = function (opt, i, dict) {
  var self = this;
  var descriptor = Object.assign({}, this.node.descriptor);
  var clazz = this.node.constructor;
  var node = new clazz(this.node.tool, this.node.parent, descriptor);
  node.assign(opt);
  var nodeHash = (0, _stringUtils.stringHashCode)(hashArrayOf(node).join(','));
  if (dict[nodeHash]) return null;
  dict[nodeHash] = node;
  var checked = (0, _Array.arrayUnique)(this.curHash.concat(hashArrayOf(node))).length === this.curHash.length;
  if (checked) this.selectedNodes[nodeHash] = node;
  var radio = (0, _ACore._)({
    tag: _CheckBoxInput.default.tag,
    style: {
      marginRight: '10px'
    },
    props: {
      checked: checked
    },
    on: {
      change: function () {
        if (radio.checked) {
          self.selectedNodes[nodeHash] = node;
        } else {
          delete self.selectedNodes[nodeHash];
        }

        self.$view.$actionBtns[1].disabled = Object.keys(self.selectedNodes).length === 0;
      }
    }
  });
  return (0, _ACore._)({
    class: 'as-omt-option-row',
    child: [radio, node.elt]
  });
};

OMTArrayMergeDialog.prototype.createView = function () {
  var self = this;
  /***
   * @type MessageDialog
   */

  this.$view = (0, _ACore._)({
    tag: _MessageDialog.default.tag,
    class: 'as-omt-dialog',
    props: {
      dialogTitle: {
        mlKey: 'txt_option'
      },
      dialogActions: [{
        text: 'OK',
        name: 'ok'
      }, {
        text: 'Cancel',
        name: 'cancel'
      }]
    },
    on: {
      action: function (event) {
        self.stop();
        var action = event.action;
        if (action.name === 'cancel') return;

        if (action.name === 'ok') {
          self.assignResult();
        }
      }
    }
  });
  var dict = {};
  var rows = this.options.map((opt, i) => this._makeOptionRow(opt, i, dict)).filter(x => !!x);
  this.$view.addChild(rows);
  this.$modal = (0, _ACore._)({
    tag: _Modal.default.tag,
    style: {
      zIndex: 1000000
    },
    child: this.$view
  });
};

var _default = OMTArrayMergeDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTArray.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTArray.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _OMTArrayMergeDialog = _interopRequireDefault(require("../dialog/OMTArrayMergeDialog"));


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTArray() {
  _OMTBaseType.default.apply(this, arguments);

  this.value = null;
}

_OOP.default.mixClass(OMTArray, _OMTBaseType.default);

_OMTBaseType.default.classes.array = OMTArray;
OMTArray.prototype.commands = OMTArray.prototype.commands.concat([{
  name: 'merge',
  icon: 'span.mdi.mdi-set-merge',
  title: 'Merge'
}]);

OMTArray.prototype.execCmd = function (commandName) {
  _OMTBaseType.default.prototype.execCmd.call(this, commandName);

  if (commandName === 'merge') {
    new _OMTArrayMergeDialog.default(this);
  }
};

OMTArray.prototype.assign = function (o) {
  this.$body.clearChild();
  this.children = (o || []).map((it, i) => {
    var desc = Object.assign({
      name: i,
      displayName: i + 1 + ''
    }, this.descriptor.of);
    if (!desc.displayName) desc.displayName = i + 1 + '';

    var res = _OMTBaseType.default.make(this.tool, this.parent, desc);

    res.assign(it);
    return res;
  });
  this.$body.addChild(this.children.map(c => c.elt));
};

OMTArray.prototype.export = function () {
  return this.children.map(c => c.export());
};

OMTArray.prototype.getRaw = function () {
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      style: {
        paddingLeft: '25px'
      },
      child: this.children.map(child => child.getRaw())
    }]
  };
};

var _default = OMTArray;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/dialog/OMTEnumSetMergeDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/dialog/OMTEnumSetMergeDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _ACore = require("../../../ACore");

var _MessageDialog = _interopRequireDefault(require("../../MessageDialog"));

var _Modal = _interopRequireDefault(require("../../Modal"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _MultiCheckTreeMenu = _interopRequireDefault(require("../../MultiCheckTreeMenu"));

var _CheckBoxInput = _interopRequireDefault(require("../../CheckBoxInput"));

var _Array = require("absol/src/DataStructure/Array");


/***
 * @extends Fragment
 * @param {OMTEnumSet} node
 * @constructor
 */
function OMTEnumSetMergeDialog(node) {
  _Fragment.default.call(this);

  this.node = node;
  this.calc();
  this.getView();
  this.start();
}

_OOP.default.mixClass(OMTEnumSetMergeDialog, _Fragment.default);

OMTEnumSetMergeDialog.prototype.calc = function () {
  this.currentValues = this.node.export();
  this.descriptor = this.node.descriptor;
  this.selectOptions = this.node.getSelectOptions();
  this.selected = {};
};

OMTEnumSetMergeDialog.prototype.onStart = function () {
  this.$modal.addTo(document.body);
};

OMTEnumSetMergeDialog.prototype.onStop = function () {
  this.$modal.remove();
};

OMTEnumSetMergeDialog.prototype.assignResult = function () {
  var selectedValues = this._getCurrent();

  if (selectedValues.length > 0) {
    this.node.assign((0, _Array.arrayUnique)(this.currentValues.concat(selectedValues)));
    this.node.notifyChange();
  }
};

OMTEnumSetMergeDialog.prototype._getCurrent = function () {
  var selectedValues = this.selectOptions.reduce((ac, cr, i) => {
    if (this.selected[i]) ac = ac.concat(cr);
    return ac;
  }, []);
  selectedValues = (0, _Array.arrayUnique)(selectedValues);
  return selectedValues;
};

OMTEnumSetMergeDialog.prototype._makeOptionRow = function (opt, i) {
  var self = this;
  var checked = (0, _Array.arrayUnique)(this.currentValues.concat(opt)).length === (0, _Array.arrayUnique)(this.currentValues).length;
  this.selected[i] = checked;
  var checkbox = (0, _ACore._)({
    tag: _CheckBoxInput.default.tag,
    style: {
      marginRight: '10px'
    },
    props: {
      checked: checked
    },
    on: {
      change: function () {
        self.selected[i] = checkbox.checked;

        var currentValues = self._getCurrent();

        self.previewNode.assign(currentValues);
        self.$view.$actionBtns[1].disabled = currentValues.length === 0;
      }
    }
  });
  var mSelect = (0, _ACore._)({
    tag: _MultiCheckTreeMenu.default.tag,
    class: 'as-border-none',
    props: {
      pendingValues: opt,
      readOnly: true
    }
  });
  return (0, _ACore._)({
    class: 'as-omt-option-row',
    child: [checkbox, mSelect]
  });
};

OMTEnumSetMergeDialog.prototype.createView = function () {
  var self = this;
  this.$optionRows = this.selectOptions.map((opt, i) => this._makeOptionRow(opt, i));
  this.previewNode = new this.node.constructor(this.node.tool, this.node.parent, this.node.descriptor);
  this.previewNode.assign(this.currentValues);
  this.$view = (0, _ACore._)({
    tag: _MessageDialog.default.tag,
    class: ['as-omt-dialog'],
    props: {
      dialogTitle: 'Merge',
      dialogActions: [{
        text: 'OK',
        name: 'ok'
      }, {
        text: 'Cancel',
        name: 'cancel'
      }]
    },
    on: {
      action: function (event) {
        self.stop();

        if (event.action.name === 'ok') {
          self.assignResult();
        }
      }
    },
    child: [this.previewNode, {
      child: [{
        class: 'as-omt-field-name',
        child: {
          text: 'Merge From'
        }
      }].concat(this.$optionRows)
    }]
  });
  Promise.resolve(this.descriptor.items).then(items => {
    (0, _ACore.$$)(_MultiCheckTreeMenu.default.tag, this.$view).forEach(elt => {
      elt.items = items;
      elt.values = elt.pendingValues;
    });
  });
  this.$modal = (0, _ACore._)({
    tag: _Modal.default.tag,
    style: {
      zIndex: 1000000
    },
    child: this.$view
  });
};

var _default = OMTEnumSetMergeDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTEnumSet.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTEnumSet.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _OMTArray = _interopRequireDefault(require("./OMTArray"));

var _OMTEnumSetMergeDialog = _interopRequireDefault(require("../dialog/OMTEnumSetMergeDialog"));

var _MultiCheckMenu = _interopRequireDefault(require("../../MultiCheckMenu"));


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTEnumSet() {
  _OMTBaseType.default.apply(this, arguments);

  this.value = null;

  this._flatTreeItems();
}

_OOP.default.mixClass(OMTEnumSet, _OMTBaseType.default);

_OMTBaseType.default.classes['{enum}'] = OMTEnumSet;
OMTEnumSet.prototype.commands = _OMTArray.default.prototype.commands.slice();

OMTEnumSet.prototype._flatTreeItems = function () {
  if (!this.descriptor.flat) {
    this.descriptor.flat = true;
    this.descriptor.items = this.descriptor.items.reduce(function visit(ac, cr) {
      var item = Object.assign({}, cr);
      ac.push(item);

      if (item.items && item.items.length > 0) {
        item.items.reduce(visit, ac);
      }

      delete item.items;
      return ac;
    }, []);
  }
};

OMTEnumSet.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    tag: _MultiCheckMenu.default.tag,
    class: 'as-border-none',
    style: {
      height: '18px'
    },
    props: {
      readOnly: true,
      strictValue: false
    }
  });
  this.$body.addChild(this.$value);
  this.$value.items = this.descriptor.items;
  this.$value.values = this.value;
};

OMTEnumSet.prototype.assign = function (o) {
  this.value = o;
  this.$value.values = o;
};

OMTEnumSet.prototype.execCmd = function (commandName) {
  _OMTBaseType.default.prototype.execCmd.call(this, commandName);

  if (commandName === 'merge') {
    this.userMerge();
  }
};

OMTEnumSet.prototype.userMerge = function () {
  //as-omt-option-row
  new _OMTEnumSetMergeDialog.default(this);
};

OMTEnumSet.prototype.getRaw = function () {
  var textItems = this.export().map(value => {
    var text = '';
    var holders = this.$value.findItemsByValue(value);

    if (holders && holders.length > 0) {
      text = holders[0].item.text;
      if (holders[0].item.desc) text += ' - ' + holders[0].item.desc;
    }

    return text;
  });
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      style: {
        paddingLeft: '25px'
      },
      child: textItems.map(text => ({
        tag: 'li',
        child: {
          text: text
        }
      }))
    }]
  };
};

var _default = OMTEnumSet;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTFileArray.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTFileArray.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _FileListInput = _interopRequireDefault(require("../../FileListInput"));

var _OMTArray = _interopRequireDefault(require("./OMTArray"));

var _utils = require("../../utils");


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTFileArray() {
  _OMTBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(OMTFileArray, _OMTBaseType.default);

_OMTBaseType.default.classes['file[]'] = OMTFileArray;
OMTFileArray.prototype.type = 'file[]';
OMTFileArray.prototype.commands = _OMTArray.default.prototype.commands.slice();

OMTFileArray.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    tag: _FileListInput.default.tag,
    class: ['as-omt-field-value', 'as-border-none'],
    props: {
      readOnly: true
    }
  });
  this.$body.addChild(this.$value);
};

OMTFileArray.prototype.assign = function (o) {
  this.value = o;

  if (o instanceof Array) {
    this.$value.files = o;
    this.$value.removeStyle('display');
  } else {
    this.$value.addStyle('display', 'none');
  }
};

OMTFileArray.prototype.getHash = function () {
  return (0, _utils.calcDTQueryHash)(this.value);
};

OMTFileArray.prototype.getRaw = function () {
  var infoArr = (this.value || []).map(it => (0, _utils.fileInfoOf)(it));
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      style: {
        paddingLeft: '25px'
      },
      child: infoArr.map(info => ({
        tag: 'a',
        props: info.url ? {
          href: info.url,
          target: '_blank'
        } : {},
        child: {
          text: info.name
        }
      }))
    }]
  };
};

var _default = OMTFileArray;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTColor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTColor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _OMTFile = _interopRequireDefault(require("./OMTFile"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _stringUtils = require("absol/src/String/stringUtils");


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTColor() {
  _OMTBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(OMTColor, _OMTBaseType.default);

_OMTBaseType.default.classes.color = OMTColor;
OMTColor.prototype.type = 'color';

OMTColor.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    class: "as-omt-field-color-value-bg",
    child: '.as-omt-field-color-value'
  });
  this.$body.addChild(this.$value);
};

OMTColor.prototype.assign = function (o) {
  this.value = o;
  var color = 'transparent';

  try {
    if (o instanceof _Color.default) {
      color = o.toString("hex8");
    } else if (typeof o === "string") {
      color = _Color.default.parse(o).toString("hex8");
    }
  } catch (err) {}

  this.color = color;
  this.$value.addStyle('--omt-color-value', color);
};

OMTColor.prototype.getHash = function () {
  return (0, _stringUtils.stringHashCode)(this.color + '');
};

OMTColor.prototype.getRaw = function () {
  var color = _Color.default.parse(this.color);

  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'span',
      style: {
        color: color.toString('hex6')
      },
      child: {
        text: this.color
      }
    }]
  };
};

var _default = OMTColor;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTBool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTBool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _OMTFile = _interopRequireDefault(require("./OMTFile"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _CheckBoxInput = _interopRequireDefault(require("../../CheckBoxInput"));


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTBool() {
  _OMTBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(OMTBool, _OMTBaseType.default);

_OMTBaseType.default.classes.bool = OMTBool;
OMTBool.prototype.type = 'bool';

OMTBool.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    tag: _CheckBoxInput.default,
    props: {
      readOnly: true
    }
  });
  this.$body.addChild(this.$value);
};

OMTBool.prototype.assign = function (o) {
  this.value = o;
  this.$value.checked = !!o;
};

var _default = OMTBool;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTHtml.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTHtml.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _generator = require("absol/src/JSMaker/generator");


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTHtml() {
  _OMTBaseType.default.apply(this, arguments);

  this.value = null;
}

_OOP.default.mixClass(OMTHtml, _OMTBaseType.default);

_OMTBaseType.default.classes.html = OMTHtml;
OMTHtml.prototype.type = 'html';

OMTHtml.prototype.assign = function (o) {
  this.value = o;
  this.$body.clearChild();
  this.$value = (0, _ACore._)({
    tag: 'div',
    props: {
      innerHTML: o
    }
  });
  this.$body.addChild(this.$value);
};

OMTHtml.prototype.getRaw = function () {
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'span',
      child: {
        text: this.export()
      }
    }]
  };
};

var _default = OMTHtml;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMDateTime.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMDateTime.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _CheckBoxInput = _interopRequireDefault(require("../../CheckBoxInput"));

var _DateTimeInput = _interopRequireDefault(require("../../DateTimeInput"));


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTDateTime() {
  _OMTBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(OMTDateTime, _OMTBaseType.default);

_OMTBaseType.default.classes.datetime = OMTDateTime;
OMTDateTime.prototype.type = 'datetime';

OMTDateTime.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    tag: _DateTimeInput.default.tag,
    class: 'as-border-none',
    props: {
      readOnly: true
    }
  });
  if (this.descriptor.format) this.$value.format = this.descriptor.format;
  this.$body.addChild(this.$value);
};

OMTDateTime.prototype.assign = function (o) {
  this.value = o;
  this.$value.value = o;
};

OMTDateTime.prototype.getRaw = function () {
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'span',
      child: {
        text: this.$value.text
      }
    }]
  };
};

var _default = OMTDateTime;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMDate.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMDate.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _CheckBoxInput = _interopRequireDefault(require("../../CheckBoxInput"));

var _DateTimeInput = _interopRequireDefault(require("../../DateTimeInput"));

var _DateInput = _interopRequireDefault(require("../../DateInput2"));


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTDate() {
  _OMTBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(OMTDate, _OMTBaseType.default);

_OMTBaseType.default.classes.date = OMTDate;
OMTDate.prototype.type = 'date';

OMTDate.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    tag: _DateInput.default.tag,
    class: 'as-border-none',
    props: {
      readOnly: true
    }
  });
  if (this.descriptor.format) this.$value.format = this.descriptor.format;
  this.$body.addChild(this.$value);
};

OMTDate.prototype.assign = function (o) {
  this.value = o;
  this.$value.value = o;
};

OMTDate.prototype.getRaw = function () {
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'span',
      child: {
        text: this.$value.text
      }
    }]
  };
};

var _default = OMTDate;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/type/OMTEnumOfPair.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/type/OMTEnumOfPair.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OMTBaseType = _interopRequireDefault(require("./OMTBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../../ACore");

var _SelectTreeMenu = _interopRequireDefault(require("../../SelectTreeMenu"));

var _DualSelectMenu = _interopRequireDefault(require("../../DualSelectMenu"));


/***
 * @extends OMTBaseType
 * @constructor
 */
function OMTEnumOfPair() {
  _OMTBaseType.default.apply(this, arguments);

  this.value = null;
}

_OOP.default.mixClass(OMTEnumOfPair, _OMTBaseType.default);

_OMTBaseType.default.classes['enum<pair>'] = OMTEnumOfPair;
OMTEnumOfPair.prototype.type = 'enum<pair>';

OMTEnumOfPair.prototype.render = function () {
  _OMTBaseType.default.prototype.render.call(this);

  this.$value = (0, _ACore._)({
    tag: _DualSelectMenu.default.tag,
    class: 'as-border-none',
    style: {
      height: '18px'
    },
    props: {
      readOnly: true
    }
  });
  this.$body.addChild(this.$value);

  if (this.descriptor.items && this.descriptor.items.then) {
    this.descriptor.items.then(items => {
      this.$value.items = items;
    });
  } else {
    this.$value.items = this.descriptor.items;
  }
};

OMTEnumOfPair.prototype.assign = function (o) {
  this.value = o;
  this.$value.value = o;
};

OMTEnumOfPair.prototype.getRaw = function () {
  var text = this.$value.$item && this.$value.$item.innerText;
  return {
    child: [{
      tag: 'span',
      class: 'as-omt-field-name',
      child: {
        text: (this.descriptor.displayName || this.descriptor.name || "ROOT") + ': '
      }
    }, {
      tag: 'span',
      child: {
        text: text
      }
    }]
  };
};

var _default = OMTEnumOfPair;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/objectmergetool/ObjectMergeTool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/objectmergetool/ObjectMergeTool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/objectmergetool.css");

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _OMTBaseType = _interopRequireDefault(require("./type/OMTBaseType"));

require("./type/OMTStruct");

require("./type/OMTString");

require("./type/OMTImage");

require("./type/OMTEnum");

require("./type/OMTArray");

require("./type/OMTEnumSet");

require("./type/OMTFile");

require("./type/OMTFileArray");

require("./type/OMTColor");

require("./type/OMTBool");

require("./type/OMTHtml");

require("./type/OMDateTime");

require("./type/OMDate");

require("./type/OMTEnumOfPair");




/***
 * @extends AElement
 * @constructor
 */
function ObjectMergeTool() {
  this._descriptors = null;
  this._objects = null;
  this.root = null;
  this.$body = (0, _ACore.$)('.as-omt-body', this).on('mouseover', this.eventHandler.mouseOverNode);
  this.hoveringNode = null;
  /**
   * @type {Object[]}
   * @memberOf ObjectMergeTool#
   * @name objects
   */

  /**
   * @type {Object}
   * @memberOf ObjectMergeTool#
   * @name descriptors
   */
}

ObjectMergeTool.tag = 'ObjectMergeTool'.toLowerCase();

ObjectMergeTool.render = function () {
  return (0, _ACore._)({
    class: 'as-omt',
    extendEvent: ['change'],
    child: [{
      class: 'as-omt-body'
    }]
  });
};

ObjectMergeTool.prototype._tryFlushData = function () {
  if (this.root && this.objects && this.objects.length > 0) {
    this.root.assign(this.objects[0]);
  }
};

ObjectMergeTool.prototype._findNode = function (targetElt) {
  while (targetElt && targetElt !== this) {
    if (targetElt.omtNode) return targetElt.omtNode;
    targetElt = targetElt.parentElement;
  }

  return null;
};

ObjectMergeTool.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change',
    target: this
  }, this);
};

ObjectMergeTool.property = {};
ObjectMergeTool.property.descriptor = {
  set: function (value) {
    this._descriptor = value || {};
    this.$body.clearChild();
    this.root = _OMTBaseType.default.make(this, null, this._descriptor);
    this.$body.addChild(this.root.elt);

    this._tryFlushData();
  },
  get: function () {
    return this._descriptor;
  }
};
ObjectMergeTool.property.objects = {
  set: function (value) {
    this._objects = value || [];

    this._tryFlushData();
  },
  get: function () {
    return this._objects;
  }
};
ObjectMergeTool.property.data = {
  get: function () {
    if (this.root) {
      return this.root.export();
    }

    if (this._objects && this.objects.length > 0) return this._objects[0];
    return null;
  }
};
/***
 * @type {{}}
 * @memberOf ObjectMergeTool#
 */

ObjectMergeTool.eventHandler = {};
/***
 * @this ObjectMergeTool
 * @param {MouseEvent} event
 */

ObjectMergeTool.eventHandler.mouseOverNode = function (event) {
  var node = this._findNode(event.target);

  if (this.hoveringNode === node) return;

  if (this.hoveringNode) {
    this.hoveringNode.elt.removeClass('as-hover');
  }

  this.hoveringNode = node;

  if (this.hoveringNode) {
    this.hoveringNode.elt.addClass('as-hover');
  }
};

_ACore.default.install(ObjectMergeTool);

var _default = ObjectMergeTool;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tokenizeiput/TIHistory.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tokenizeiput/TIHistory.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 * @param {TokenizeInput} elt
 * @constructor
 */
function TIHistory(elt) {
  this.elt = elt;
  this.stack = [];
  this.topIdx = -1;
}

TIHistory.prototype.commit = function (text, offset) {
  while (this.topIdx < this.stack.length - 1) {
    this.stack.pop();
  }

  var lastText = this.stack.length > 0 ? this.stack[this.stack.length - 1].text : null;

  if (text === lastText) {
    if (this.stack[this.stack.length - 1].offset !== offset) this.stack[this.stack.length - 1].offset = offset;
  } else {
    this.topIdx = this.stack.length;
    var record = {
      text: text,
      offset: offset
    };
    this.stack.push(record);
    this.elt.emit('change', {
      target: this,
      value: record.text,
      action: 'commit',
      record: record,
      type: 'change'
    }, this);
  }
};

TIHistory.prototype.undo = function () {
  if (this.topIdx <= 0) return;
  this.topIdx--;
  var record = this.stack[this.topIdx];
  this.elt.applyData(record.text, record.offset);
  this.elt.emit('change', {
    target: this,
    value: record.text,
    action: 'undo',
    record: record,
    type: 'change'
  }, this);
};

TIHistory.prototype.redo = function () {
  if (this.topIdx + 1 >= this.stack.length) return;
  this.topIdx++;
  var record = this.stack[this.topIdx];
  this.elt.applyData(record.text, record.offset);
  this.elt.emit('change', {
    target: this,
    value: record.text,
    action: 'redo',
    record: record,
    type: 'change'
  }, this);
};

var _default = TIHistory;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tokenizeiput/TISelectionController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tokenizeiput/TISelectionController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _tiutils = require("./tiutils");

var _utils = require("../utils");

/****
 *
 * @param {TokenizeInput} elt
 * @constructor
 */
function TISelectionController(elt) {
  this.elt = elt;
  this.prevRange = null;
}

TISelectionController.prototype.onSelect = function () {
  var key = this.elt.prevKey && new Date().getTime() - this.elt.prevKey.time < 100 ? this.elt.prevKey.value : '';
  var sel = document.getSelection();
  var range = sel.getRangeAt(0);
  var direction = (0, _utils.getSelectionRangeDirection)(range);
  var newRange;

  var handleEmojiToken = () => {
    var startCtn = range.startContainer;
    var startOffset = range.startOffset;
    var startToken;
    var endCtn = range.endContainer;
    var endOffset = range.endOffset;
    var endToken;
    var changed = 0;
    var textData;
    var nextTextNode;
    var prevTextNode;
    var displayText;
    var newText;

    if ((0, _tiutils.isTokenText)(startCtn)) {
      startToken = startCtn.parentElement;
      displayText = startToken.getAttribute('data-display');
      textData = startCtn.data;

      if (range.collapsed) {
        if (textData.length < displayText.length) {
          prevTextNode = this.getPrevTextNode(startCtn);

          if (!(0, _tiutils.isText)(prevTextNode)) {
            prevTextNode = document.createTextNode('');
            startToken.parentElement.insertBefore(prevTextNode, startToken);
          }

          startToken.remove();
          startCtn = prevTextNode;
          startOffset = prevTextNode.data.length;
          changed = 1;
        } else if (textData === displayText && startOffset < displayText.length && startOffset > 0) {
          if (key === 'arrowright' || !key) {
            startOffset = displayText.length;
            changed = 1;
          } else if (key === 'arrowleft') {
            startOffset = 0;
            changed = 1;
          } else if (key === 'mouseup') {
            startOffset = 0;
            endOffset = displayText.length;
            changed = 2;
          }
        } else if (textData.length > displayText.length) {
          if (startOffset === textData.length) {
            nextTextNode = startToken.nextSibling;

            if (!(0, _tiutils.isText)(nextTextNode)) {
              newText = document.createTextNode('');
              nextTextNode.parentElement.insertBefore(newText, nextTextNode);
              nextTextNode = newText;
            }

            nextTextNode.data = textData.substring(displayText.length) + nextTextNode.data;
            startCtn.data = displayText;
            startCtn = nextTextNode;
            startOffset = textData.length - displayText.length;
            changed = 1;
          } else {
            prevTextNode = startToken.previousSibling;

            if (!(0, _tiutils.isText)(prevTextNode)) {
              newText = document.createTextNode('');
              startToken.parentElement.insertBefore(newText, startToken);
              prevTextNode = newText;
            }

            prevTextNode.data += textData.substring(0, textData.length - displayText.length);
            startCtn.data = displayText;
            startCtn = prevTextNode;
            startOffset = startCtn.data.length;
          }
        }
      } else {
        if (startOffset > 0 && startOffset < displayText.length) {
          startOffset = 0;
          changed = 2;
        }
      }
    }

    if ((0, _tiutils.isTokenText)(endCtn)) {
      endToken = endCtn.parentElement;
      displayText = endToken.getAttribute('data-display');

      if (!range.collapsed) {
        if (endOffset < displayText.length) {
          endOffset = displayText.length;
          changed = 2;
        }
      }
    }

    if (changed > 0) {
      newRange = document.createRange();
      newRange.setStart(startCtn, startOffset);

      if (changed > 1) {
        newRange.setEnd(endCtn, endOffset);
      } else {
        //for saving
        endOffset = startOffset;
        endCtn = startCtn;
      }

      (0, _utils.setSelectionRange)(newRange, direction === 'backward');
    }

    var nextToken, nextText;

    if ((0, _tiutils.isToken)(endCtn.nextSibling)) {
      nextToken = endCtn.nextSibling;
      displayText = nextToken.getAttribute('data-display');
      nextText = (0, _tiutils.getFirstTextNode)(nextToken);
      if (!nextText || nextText.data !== displayText) nextToken.remove();
    }

    this.prevRange = {
      startOffset: startOffset,
      startContainer: startCtn,
      endOffset: endOffset,
      endContainer: endCtn
    };
  };

  handleEmojiToken();
};

TISelectionController.prototype.getNextTextNode = function (current) {
  return (0, _tiutils.findNextTextNode)(this.elt, current);
};

TISelectionController.prototype.getPrevTextNode = function (current) {
  return (0, _tiutils.findPrevTextNode)(this.elt, current);
};

TISelectionController.prototype.setRangeByOffset = function (offset) {
  var start, end, direction;

  if (typeof offset === "number") {
    start = offset;
    end = offset;
    direction = 'forward';
  } else {
    start = offset.start;
    end = offset.end;
    direction = offset.direction || 'forward';
  }

  var startCtn = null;
  var startOffset = 0;
  var endCtn = null;
  var endOffset = 0;
  var st = '';
  var nodes = Array.prototype.slice.call(this.elt.childNodes);
  if ((0, _tiutils.isNewLine)(nodes[nodes.length - 1])) nodes.pop();
  var node;

  for (var i = 0; i < nodes.length; ++i) {
    node = nodes[i];

    if ((0, _tiutils.isText)(node)) {
      st += node.data;

      if (!startCtn && st.length >= start) {
        startCtn = node;
        startOffset = node.data.length - (st.length - start);
      }

      if (!endCtn && st.length >= end) {
        endCtn = node;
        endOffset = node.data.length - (st.length - end);
      }
    } else if ((0, _tiutils.isToken)(node)) {
      st += node.getAttribute('data-text');

      if (!startCtn && st.length >= start) {
        startCtn = (0, _tiutils.getFirstTextNode)(node);
        startOffset = startCtn.data.length;
      }

      if (!endCtn && st.length >= end) {
        endCtn = (0, _tiutils.getFirstTextNode)(node);
        endOffset = endCtn.data.length;
      }
    } else if ((0, _tiutils.isNewLine)(node)) {
      st += '\n';

      if (!startCtn && st >= start) {
        startCtn = this.elt;
        startOffset = i + 1;
      }

      if (!endCtn && st.length >= end) {
        endCtn = this.elt;
        endOffset = i + 1;
      }
    }
  }

  if (!startCtn) {
    if (nodes.length > 0) {
      node = nodes[nodes.length - 1];

      if ((0, _tiutils.isNewLine)(node)) {
        startCtn = this.elt;
        startOffset = nodes.length;
      } else if ((0, _tiutils.isText)(node)) {
        startCtn = node;
        startOffset = node.length;
      } else {
        startCtn = (0, _tiutils.getLastTextNode)(node);
        startOffset = node.length;
      }
    } else {
      startCtn = this.elt;
      startOffset = 0;
    }
  }

  if (!endCtn) {
    endCtn = startCtn;
    endOffset = startOffset;
  }

  this.prevRange = {
    startContainer: startCtn,
    startOffset: startOffset,
    endContainer: endCtn,
    endOffset: endOffset
  };
  var range = document.createRange();
  range.setStart(startCtn, startOffset);
  range.setEnd(endCtn, endOffset);
  (0, _utils.setSelectionRange)(range, direction === 'backward');
};

TISelectionController.prototype.getOffset = function (range) {
  range = range || this.elt.selectionCtrl.prevRange;
  if (!range) return null;
  var nodes = Array.prototype.slice.call(this.elt.childNodes);
  if ((0, _tiutils.isNewLine)(nodes[nodes.length - 1])) nodes.pop();
  var startCtn = range.startContainer;
  var startOffset = range.startOffset;
  var endCtn = range.endContainer;
  var endOffset = range.endOffset;

  if (startCtn === this.elt) {
    startCtn = this.elt.childNodes[startOffset - 1];
    startOffset = 1;
  } else if ((0, _tiutils.isTokenText)(startCtn)) {
    startCtn = startCtn.parentElement;
    if (startOffset > 0) startOffset = startCtn.getAttribute('data-text').length;
  }

  if (endCtn === this.elt) {
    endCtn = this.elt.childNodes[endOffset];
    endOffset = 1;
  } else if ((0, _tiutils.isTokenText)(endCtn)) {
    endCtn = endCtn.parentElement;
    if (endOffset > 0) endOffset = endCtn.getAttribute('data-text').length;
  }

  var start = undefined;
  var end = undefined;
  var direction = (0, _utils.getSelectionRangeDirection)(range);
  var st = '';
  var node;

  for (var i = 0; i < nodes.length; ++i) {
    node = nodes[i];

    if ((0, _tiutils.isText)(node)) {
      if (start === undefined && node === startCtn) {
        start = st.length + startOffset;
      }

      if (end === undefined && node === endCtn) {
        end = st.length + endOffset;
      }

      st += node.data;
    } else if ((0, _tiutils.isToken)(node)) {
      if (start === undefined && node === startCtn) {
        start = st.length + startOffset;
      }

      if (end === undefined && node === endCtn) {
        end = st.length + endOffset;
      }

      st += node.getAttribute('data-text');
    } else if ((0, _tiutils.isNewLine)(node)) {
      st += '\n';

      if (start === undefined && node === startCtn) {
        start = st.length;
      }

      if (end === undefined && node === endCtn) {
        end = st.length;
      }
    }
  }

  if (start === undefined) start = 0;

  if (end === undefined) {
    end = start;
  }

  return {
    start: start,
    end: end,
    direction: direction
  };
};

var _default = TISelectionController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/tokenizeiput/TokenizeHyperInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/tokenizeiput/TokenizeHyperInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/tokenizeinput.css");

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _file = require("absol/src/Converter/file");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _TIHistory = _interopRequireDefault(require("./TIHistory"));

var _TITextController = _interopRequireDefault(require("./TITextController"));

var _TISelectionController = _interopRequireDefault(require("./TISelectionController"));

var _keyboard = require("absol/src/Input/keyboard");

var _utils = require("../utils");

var _tiutils = require("./tiutils");




var textDelay = _BrowserDetector.default.isSafari ? 100 : 1;
/***
 * @extends AElement
 * @constructor
 */

function TokenizeHyperInput() {
  this._tagMap = {};
  this.$br = (0, _ACore.$)('br', this);
  this.historyCtrl = new _TIHistory.default(this);
  this.textCtrl = new _TITextController.default(this);
  this.selectionCtrl = new _TISelectionController.default(this);
  this.prevKey = null;
  this.defineEvent(['pasteimg', 'pastefile', 'pastetext', 'change']);
  this.on('paste', this.eventHandler.paste);
  this.on('keydown', this.eventHandler.keydown);
  this.on('mouseup', this.eventHandler.mouseup);
  this.value = '';
  this.historyCtrl.commit('', 0);
  /***
   * @type {{}}
   * @name tagMap
   *@memberOf TokenizeHyperInput#
   *
   */
}

TokenizeHyperInput.tag = 'TokenizeHyperInput'.toLowerCase();

TokenizeHyperInput.render = function () {
  return (0, _ACore._)({
    tag: 'pre',
    class: 'as-tokenize-hyper-input',
    attr: {
      contenteditable: 'true',
      spellcheck: "false"
    },
    child: 'br'
  });
};

TokenizeHyperInput.prototype.applyData = function (text, offset) {
  this.textCtrl.applyData(text, offset);
};

TokenizeHyperInput.prototype.select = function (offset) {
  if (document.activeElement !== this) this.focus();
  this.applyData(this.value, offset);
};

TokenizeHyperInput.prototype.scrollIntoRange = function (range) {
  var elementBound = range.getBoundingClientRect();
  var viewportBound = this.getBoundingClientRect();
  var dBottom = 0;
  if (range.startContainer && range.startContainer.data && range.startContainer.data.charAt(range.startContainer.data.length - 1) == '\n') dBottom += this.getFontSize() * 1.5;
  var currentScrollTop = this.scrollTop;
  var newScrollTop = currentScrollTop;

  if (elementBound.bottom + dBottom > viewportBound.bottom) {
    newScrollTop = currentScrollTop + (elementBound.bottom + dBottom - viewportBound.bottom);
  }

  if (elementBound.top < viewportBound.top) {
    newScrollTop = currentScrollTop - (viewportBound.top - elementBound.top);
  }

  if (newScrollTop != currentScrollTop) {
    this.scrollTop = newScrollTop;
  }

  var currentScrollLeft = this.scrollLeft;
  var newScrollLeft = currentScrollLeft;

  if (elementBound.right > viewportBound.right) {
    newScrollLeft = currentScrollLeft + (elementBound.right - viewportBound.right);
  }

  if (elementBound.left < viewportBound.left) {
    newScrollLeft = currentScrollLeft - (viewportBound.left - elementBound.left);
  }

  if (newScrollLeft != currentScrollLeft) {
    this.scrollLeft = newScrollLeft;
  }
};

TokenizeHyperInput.prototype.undo = function () {
  this.historyCtrl.undo();
};

TokenizeHyperInput.prototype.redo = function () {
  this.historyCtrl.redo();
};

TokenizeHyperInput.prototype.commitChange = function (text, offset) {
  this.historyCtrl.commit(text, offset);
  this.emit('change', {}, this);
};

TokenizeHyperInput.prototype.waitToCommit = function (text, offset) {
  var thisInput = this;
  if (this._commitTimeout > 0) clearTimeout(this._commitTimeout);
  this._commitTimeout = setTimeout(function () {
    thisInput.commitChange(text, offset);
  }, textDelay);
};

TokenizeHyperInput.prototype.getPosition = function (node, offset) {
  if (!node) return NaN;
  if (node === this) return offset;
  var parent = node.parentElement;
  if (!parent) return NaN;
  var text = '';
  var child;
  var lastBr = false;

  for (var i = 0; i < parent.childNodes.length; ++i) {
    child = parent.childNodes[i];
    if (child == node) break;
    text += this.stringOf(child);
  }

  return this.getPosition(parent, text.length + offset);
};

TokenizeHyperInput.prototype.getSelectPosition = function () {
  return this.selectionCtrl.getOffset();
};
/**
 * @type {TokenizeHyperInput}
 */


TokenizeHyperInput.eventHandler = {};

TokenizeHyperInput.eventHandler.paste = function (event) {
  var clipboardData = event.clipboardData || window.clipboardData;

  if (!clipboardData) {
    alert('Input not support browser without clipboard API!');
    return;
  }

  if (clipboardData.items) {
    var items = Array.prototype.slice.call(clipboardData.items);
    var imgItems = items.filter(item => item.type.indexOf('image') >= 0);
    var fileItems = items.filter(item => item.type !== 'text/plain' && item.type.indexOf('image') < 0);
    var plainTextItems = items.filter(item => item.type.indexOf('text/plain') >= 0);

    if (imgItems.length > 0) {
      var imgFiles = imgItems.map(function (it) {
        return it.getAsFile();
      });
      this.emit('pasteimg', {
        target: this,
        imageFile: imgFiles[0],
        imageFiles: imgFiles,
        originalEvent: event
      }, this);
    }

    if (fileItems.length > 0) {
      var files = fileItems.map(item => item.getAsFile());
      this.emit('pastefile', {
        target: this,
        file: files[0],
        files: files,
        originalEvent: event
      }, this);
    }

    if (plainTextItems.length > 0) {
      var plainTextItem = plainTextItems[0]; //only one item

      plainTextItem.getAsString(text => {
        this.textCtrl.insertText(text);
      });
    }

    event.preventDefault();
  } else {
    var text = event.clipboardData.getData('text/plain');

    if (text) {
      event.preventDefault();
      this.textCtrl.insertText(text);
    }
  }

  this.waitToCommit();
};

TokenizeHyperInput.eventHandler.keydown = function (event) {
  this.prevKey = {
    time: new Date().getTime(),
    value: (0, _keyboard.keyboardEventToKeyBindingIdent)(event)
  };
  setTimeout(() => {
    this.selectionCtrl.onSelect();
    this.waitToCommit();
  }, textDelay);
};
/***
 * @this TokenizeHyperInput
 * @param event
 */


TokenizeHyperInput.eventHandler.mouseup = function (event) {
  this.prevKey = {
    time: new Date().getTime(),
    value: 'mouseup'
  };
  this.selectionCtrl.onSelect();
};

TokenizeHyperInput.property = {};
TokenizeHyperInput.property.value = {
  set: function (value) {
    value = value || '';
    this.textCtrl.setText(value); // this.applyData(value, value.length);

    this.commitChange(value, value.length);
  },
  get: function () {
    return this.textCtrl.getText();
  }
};
TokenizeHyperInput.property.disabled = {
  set: function (value) {
    value = !!value;
    if (value === this.hasClass('as-disabled')) return;

    if (value) {
      this.addClass('as-disabled');
      this.attr({
        contenteditable: undefined,
        oncut: 'return false',
        onpaste: 'return false',
        onkeydown: 'if(event.metaKey) return true; return false;'
      });
    } else {
      this.removeClass('as-disabled');
      this.attr({
        contenteditable: true,
        oncut: undefined,
        onpaste: undefined,
        onkeydown: undefined
      });
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
TokenizeHyperInput.property.tagList = {
  get: function () {
    return (0, _utils.getTagListInTextMessage)(this.value);
  }
};
TokenizeHyperInput.property.tagMap = {
  set: function (o) {
    o = o || {};
    this._tagMap = o;
    Array.prototype.forEach.call(this.childNodes, child => {
      var id, text;

      if (child.classList && child.classList.contains('as-tag-token')) {
        id = child.getAttribute('data-text') || '';
        id = id.substring(5, id.length - 1);
        text = this._tagMap[id];

        if (text) {
          child.getAttribute('data-display', '@' + text);
          child.firstChild.data = '@' + text;
        }
      }
    });
  },
  get: function () {
    return this._tagMap;
  }
};

_ACore.default.install(TokenizeHyperInput);

var _default = TokenizeHyperInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selectlistbox/SelectListBoxPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selectlistbox/SelectListBoxPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var SelectListBoxPropHandlers = {};
SelectListBoxPropHandlers.enableSearch = {
  /***
   * @this SelectListBox
   * @param {boolean} value
   */
  set: function (value) {
    if (value) this.addClass('as-enable-search');else this.removeClass('as-enable-search');
  },

  /***
   * @this SelectListBox
   */
  get: function () {
    return this.hasClass('as-enable-search');
  }
};
SelectListBoxPropHandlers.items = {
  /***
   * @this SelectListBox
   * @param {{}} items
   */
  set: function (items) {
    this.itemListCtrl.setItems(items);
  },
  get: function () {
    return this.itemListCtrl.getItems();
  }
};
var _default = SelectListBoxPropHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/list/ListDictionary.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/list/ListDictionary.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _utils = require("../utils");

/***
 *
 * @param {SelectionItem[]} arr
 * @constructor
 */
function ItemDictionary(arr, opt) {
  this.opt = Object.assign({
    depth: true
  }, opt || {});
  this.arr = arr;
  this.dict = {};
  this.dupKeys = [];
  this.update();
}

ItemDictionary.prototype.update = function () {
  this.dict = {};
  var dict = this.dict;
  var depth = this.opt.depth;
  var dupKeyDict = {};

  function scan(arr) {
    var item;
    var key;

    for (var i = 0; i < arr.length; ++i) {
      item = arr[i];
      key = (0, _utils.keyStringOf)(item.value);

      if (dict[key]) {
        dict[key].dupItems = dict[key].dupItems || [];
        dict[key].dupItems.push(item);
        dupKeyDict[key] = 1;
      } else {
        dict[key] = {
          idx: i,
          item: item
        };
      }

      if (depth && item.items && item.items.length > 0) {
        scan(item.items);
      }
    }
  }

  scan(this.arr);
  this.dupKeys = Object.keys(dupKeyDict);
};
/***
 *
 * @param {String | Number} value
 * @returns {SelectionItem | null}
 */


ItemDictionary.prototype.getItemByValue = function (value) {
  var iDict = this.dict[(0, _utils.keyStringOf)(value)];
  if (iDict) return iDict.item;
  return null;
};
/***
 *
 * @param {String | Number} value
 * @returns {Array<SelectionItem> }
 */


ItemDictionary.prototype.getAllItemByValue = function (value) {
  var key = (0, _utils.keyStringOf)(value);
  var iDict = this.dict[key];
  if (iDict) return [iDict.item].concat(iDict.dupItems[key] || []);
  return [];
};

ItemDictionary.prototype.getDuplicateKeys = function () {
  return this.dupKeys;
};

var _default = ItemDictionary;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selectlistbox/SLBItemHolder.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selectlistbox/SLBItemHolder.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SelectListItem = _interopRequireDefault(require("../SelectListItem"));

var _ACore = require("../../ACore");


function SLBItemHolder(parent, data) {
  this.data = data;
  this.parent = parent;
  this._elt = null;
}

Object.defineProperty(SLBItemHolder.prototype, 'elt', {
  get: function () {
    if (!this._elt) {
      this._elt = (0, _ACore._)({
        tag: _SelectListItem.default.tag,
        props: {
          data: this.data
        }
      });
    }

    return this._elt;
  }
});
var _default = SLBItemHolder;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selectlistbox/SLBModes.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selectlistbox/SLBModes.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SLBModeNormal = SLBModeNormal;
exports.SLBModeSearch = SLBModeSearch;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SLBItemHolder = _interopRequireDefault(require("./SLBItemHolder"));

var _ACore = require("../../ACore");

var _Dom = require("absol/src/HTML5/Dom");


function SLBModeNormal(elt, items) {
  this.elt = elt;
  this.$scroller = this.elt.$scroller;
  this.$content = this.elt.$content;
  this.items = items;
  this.children = items.map(item => new _SLBItemHolder.default(this, item));
  this.children.forEach((child, i) => {
    child.idx = i; // child.elt;
  });
  this.$pages = [];
}

SLBModeNormal.prototype._getPageElt = function (idx) {
  if (this.$pages[idx]) return this.$pages[idx];

  while (this.$pages.length <= idx) this.$pages.push(undefined);

  var children = this.children.slice(idx * 50, idx * 50 + 50);
  var pageElt = (0, _ACore._)({
    class: 'as-select-list-box-page',
    style: {
      top: 20 * idx * 50 + 'px'
    },
    child: children.map(child => child.elt)
  });
  this.$pages[idx] = pageElt;
  return pageElt;
};

SLBModeNormal.prototype._getPageCount = function () {
  return Math.ceil(this.items.length / 50);
};

SLBModeNormal.prototype.onStart = function () {
  this.elt.$content.addStyle('height', this.items.length * 20 + 'px'); // var n = this._getPageCount();
  // for (var i =0; i < n; ++i){
  //     this.$content.addChild(this._getPageElt(i));
  // }

  this.updateListView();
};

SLBModeNormal.prototype.onStop = function () {};

SLBModeNormal.prototype.updateListView = function () {
  var maxHeight = Math.max(4096, (0, _Dom.getScreenSize)().height);
  var startIdx = Math.floor(this.$scroller.scrollTop / 1000) - 1;
  var endIdx = startIdx + Math.ceil(maxHeight / 1000) + 1;
  startIdx = Math.max(0, startIdx);
  endIdx = Math.min(this._getPageCount(), endIdx);
  var needViewPages = Array(endIdx - startIdx).fill(null).map((u, i) => this._getPageElt(startIdx + i));
  Array.prototype.forEach.call(this.$content.childNodes, elt => {
    if (needViewPages.indexOf(elt) < 0) {
      elt.remove();
    }
  });
  needViewPages.forEach(elt => {
    if (!elt.parentElement) {
      this.$content.addChild(elt);
    }
  });
};

function SLBModeSearch(elt, items) {
  this.items = items;
}

_OOP.default.mixClass(SLBModeSearch, SLBModeNormal); // SLBModeSearch.prototype.onStart
};

moduleFactories["node_modules/absol-acomp/js/selectlistbox/SLBItemListController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selectlistbox/SLBItemListController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ListDictionary = _interopRequireDefault(require("../list/ListDictionary"));

var _utils = require("../utils");

var _SLBModes = require("./SLBModes");

var _search = require("../list/search");


/***
 * @extends ListDictionary
 * @param {SelectListBox} elt
 * @constructor
 */
function SLBItemListController(elt) {
  this.elt = elt;
  this.items = [];
  this.elt.$scroller.on('scroll', this.updateListView.bind(this));
}

_OOP.default.mixClass(SLBItemListController, _ListDictionary.default);

SLBItemListController.itemHeight = 20;
SLBItemListController.preLoadN = 3;
SLBItemListController.prototype.toLoadNextY = 200;

SLBItemListController.prototype.getItems = function () {
  return (0, _utils.copySelectionItemArray)(this.items);
};

SLBItemListController.prototype.setItems = function (items) {
  this.items = (0, _utils.copySelectionItemArray)(items || []);
  var mode = new _SLBModes.SLBModeNormal(this.elt, this.items);
  this.elt.modes.normal = mode;
  this.elt.mode = mode;
  mode.onStart();
};

SLBItemListController.prototype.updateListView = function () {
  this.elt.mode.updateListView();
};

var _default = SLBItemListController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selectlistbox/SelectListBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selectlistbox/SelectListBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _SelectListBoxPropHandlers = _interopRequireDefault(require("./SelectListBoxPropHandlers"));

var _SLBItemListController = _interopRequireDefault(require("./SLBItemListController"));

var _SLBModes = require("./SLBModes");




/***
 * @extends AElement
 * @constructor
 */
function SelectListBox() {
  this.$box = this;
  this.$content = $('.as-select-list-box-content', this);
  this.$scroller = $('.as-select-list-box-scroller', this);
  this.itemListCtrl = new _SLBItemListController.default(this);
  this.modes = {
    normal: new _SLBModes.SLBModeNormal(this, []),
    search: null
  };
  this.mode = this.modes.normal;
}

SelectListBox.tag = 'selectlistbox_v2'.toLowerCase();

SelectListBox.render = function () {
  return (0, _ACore._)({
    tag: 'follower',
    attr: {
      tabindex: 0
    },
    class: 'as-select-list-box',
    extendEvent: ['pressitem'],
    child: [{
      class: 'as-select-list-box-search-ctn',
      child: 'searchtextinput'
    }, {
      class: ['as-bscroller', 'as-select-list-box-scroller'],
      child: [{
        class: ['as-select-list-box-content'],
        child: Array(SelectListBox.prototype.preLoadN).fill('.as-select-list-box-page')
      }]
    }, 'attachhook.as-dom-signal'],
    props: {
      anchor: [1, 6, 2, 5]
    }
  });
};

SelectListBox.property = _SelectListBoxPropHandlers.default;

_ACore.default.install('selectlistbox_v2', SelectListBox);

var _default = SelectListBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreebox/CTBPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreebox/CTBPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var CTBPropHandlers = {};
CTBPropHandlers.items = {
  /***
   * @this CheckTreeBox|MCheckTreeBox
   * @param items
   */
  set: function (items) {
    this.itemListCtrl.setItems(items);
    var values = this.pendingValues || this.values;
    this.modes.normal.setValues(values);

    if (this.mode !== this.modes.normal) {
      this.mode.updateSelectedFromRef();
    }
  },
  get: function () {
    return this.itemListCtrl.getItems();
  }
};
CTBPropHandlers.values = {
  /***
   * @this CheckTreeBox|MCheckTreeBox
   * @param values
   */
  set: function (values) {
    this.pendingValues = values || [];
    this.modes.normal.setValues(values);

    if (this.mode !== this.modes.normal) {
      this.mode.updateSelectedFromRef();
    }
  },
  get: function () {
    return this.modes.normal.getValues();
  }
};
CTBPropHandlers.viewValues = {
  get: function () {
    return this.modes.normal.getViewValues();
  }
};
CTBPropHandlers.enableSearch = {
  /***
   * @this CheckTreeBox|MCheckTreeBox
   * @param value
   */
  set: function (value) {
    if (value) {
      this.$box.addClass('as-enable-search');
    } else {
      this.$box.removeClass('as-enable-search');
    }
  },
  get: function () {
    return this.$box.hasClass('as-enable-search');
  }
};
CTBPropHandlers.leafOnly = {
  /***
   * @this CheckTreeBox|MCheckTreeBox
   * @param value
   */
  set: function (value) {
    if (value) {
      this.$box.addClass('as-leaf-only');
    } else {
      this.$box.removeClass('as-leaf-only');
    }

    var values = this.pendingValues || this.values;
    this.modes.normal.setValues(values);
  },
  get: function () {
    return this.$box.hasClass('as-leaf-only');
  }
};
var _default = CTBPropHandlers;
/***
 *
 * @type {boolean}
 * @name enableSearch
 * @memberOf MCheckTreeBox#
 */

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreebox/CTIPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreebox/CTIPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _utils = require("../utils");

var CTIPropHandlers = {};
CTIPropHandlers.data = {
  /***
   * @this MCheckTreeItem|CheckTreeItem
   * @param data
   */
  set: function (data) {
    this._data = data;

    this._updateData();
  },
  get: function () {
    return this._data;
  }
};
CTIPropHandlers.text = {
  get: function () {
    if (!this._data) return '';
    if (this._data.charAt) return this._data;
    var text = this._data.text;
    if (text === undefined || text === null) return '';
    return this._data.text + '';
  }
};
CTIPropHandlers.value = {
  get: function () {
    if (!this._data) return null;
    if (this._data.charAt) return this._data;
    return this._data.value;
  }
};
CTIPropHandlers.desc = {
  get: function () {
    if (!this._data) return '';
    var desc = this._data.desc;
    if (desc === undefined || desc === null) return '';
    return desc + '';
  }
};
CTIPropHandlers.level = {
  set: function (value) {
    if (!(0, _utils.isNaturalNumber)(value)) value = 0;
    this._level = value;
    this.addStyle('--level', value + '');
  },
  get: function () {
    return this._level;
  }
};
CTIPropHandlers.status = {
  set: function (value) {
    value = value === 'open' || value === 'close' ? value : 'none';
    this._status = value;
    this.removeClass('as-status-open').removeClass('as-status-close');

    if (value !== "none") {
      this.addClass('as-status-' + value);
    }
  },
  get: function () {
    return this._status || 'none';
  }
};
CTIPropHandlers.selected = {
  set: function (value) {
    if (value === 'all') {
      this.$checkbox.checked = true;
      this.$checkbox.removeClass('as-has-minus');
    } else if (value === 'child') {
      this.$checkbox.checked = false;
      this.$checkbox.addClass('as-has-minus');
    } else {
      this.$checkbox.checked = false;
      this.$checkbox.removeClass('as-has-minus');
    }
  },
  get: function () {
    if (this.$checkbox.checked) {
      return 'all';
    } else {
      if (this.$checkbox.hasClass('as-has-minus')) {
        return 'child';
      } else {
        return 'none';
      }
    }
  }
};
CTIPropHandlers.hasLeaf = {
  set: function (value) {
    if (value) {
      this.addClass('as-has-leaf');
    } else {
      this.removeClass('as-has-leaf');
    }
  },
  get: function () {
    return this.hasClass('as-has-leaf');
  }
};
CTIPropHandlers.noSelect = {
  set: function (value) {
    if (value) {
      this.addClass('as-no-select');
    } else {
      this.removeClass('as-no-select');
    }

    this.$checkbox.disabled = !!value;
  },
  get: function () {
    return this.hasClass('as-no-select');
  }
};
var _default = CTIPropHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreebox/CheckTreeItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreebox/CheckTreeItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _CTIPropHandlers = _interopRequireDefault(require("./CTIPropHandlers"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _utils = require("../utils");


/***
 * @extends AElement
 * @constructor
 */
function CheckTreeItem() {
  this._data = null;
  this._status = 'none';
  this.$text = (0, _ACore.$)('.am-check-tree-item-text', this).firstChild;
  this.$desc = (0, _ACore.$)('.am-check-tree-item-desc', this).firstChild;
  this.$iconCtn = (0, _ACore.$)('.am-check-tree-item-icon-ctn', this);
  this.$checkbox = (0, _ACore.$)('checkboxinput', this).on('change', this.eventHandler.checkboxChange);
  this.addEventListener('click', this.eventHandler.click);
}

CheckTreeItem.tag = 'CheckTreeItem'.toLowerCase();

CheckTreeItem.render = function () {
  return (0, _ACore._)({
    extendEvent: ['checkedchange', 'click', 'statuschange'],
    class: ['am-check-tree-item', 'am-dropdown-box-item'],
    child: [{
      class: 'am-check-tree-item-toggle-ctn',
      child: 'toggler-ico'
    }, {
      class: 'am-check-tree-item-icon-ctn'
    }, {
      class: 'am-check-tree-item-checkbox-ctn',
      child: 'checkboxinput'
    }, {
      class: 'am-check-tree-item-text',
      child: {
        text: ''
      }
    }, {
      class: 'am-check-tree-item-desc',
      child: {
        text: ''
      }
    }]
  });
};

CheckTreeItem.prototype._updateData = function () {
  this.$text.data = this.text;
  this.$desc.data = this.desc;
  this.$iconCtn.clearChild();
  this.$icon = null;
  this.attr('data-key', (0, _utils.keyStringOf)(this.value));

  if (this._data && this._data.icon) {
    this.$icon = (0, _ACore._)(this._data.icon);

    if (this.$icon.parentElement) {
      this.$icon = this.$icon.cloneNode(true);
    }

    this.$iconCtn.addChild(this.$icon);
    this.addClass('as-has-icon');
  } else {
    this.removeClass('as-has-icon');
  }

  if (this._data && this._data.isLeaf) {
    this.addClass('as-is-leaf');
  } else {
    this.removeClass('as-is-leaf');
  }
};

CheckTreeItem.eventHandler = {};

CheckTreeItem.eventHandler.click = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$checkbox, event)) return;
  var checkboxBound = this.$checkbox.getBoundingClientRect();
  var canCheck = this.$checkbox.getComputedStyleValue('pointer-events') !== 'none' && !this.$checkbox.disabled && checkboxBound.width > 0;

  if (this.status === 'none' && canCheck) {
    this.$checkbox.checked = !this.$checkbox.checked;
    this.$checkbox.notifyChange();
  } else if (this.status !== 'none') {
    if (!checkboxBound.width) {
      checkboxBound = this.$iconCtn.getBoundingClientRect();
    }

    if (!checkboxBound.width) {
      checkboxBound = {
        left: this.getBoundingClientRect().left + parseFloat(this.$text.parentElement.getComputedStyleValue('padding-left').replace('px'))
      };
    }

    if (event.clientX < checkboxBound.left || !canCheck) {
      this.status = this.status === 'open' ? 'close' : 'open';
      this.emit('statuschange', {
        type: 'statuschange',
        target: this
      }, this);
    } else if (canCheck) {
      this.$checkbox.checked = !this.$checkbox.checked;
      this.$checkbox.notifyChange();
    }
  }
};

CheckTreeItem.eventHandler.checkboxChange = function () {
  this.emit('checkedchange', {
    type: 'checkedchange'
  }, this);
};

CheckTreeItem.property = _CTIPropHandlers.default;
/***
 * @name data
 * @memberOf CheckTreeItem#
 */

/***
 * @name text
 * @type {string}
 * @memberOf CheckTreeItem#
 */

/***
 * @name desc
 * @type {string}
 * @memberOf CheckTreeItem#
 */

/***
 * @name value
 * @memberOf CheckTreeItem#
 */

var _default = CheckTreeItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreebox/MCTBItemHolder.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreebox/MCTBItemHolder.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _CheckTreeItem = _interopRequireDefault(require("./CheckTreeItem"));

var _utils = require("../utils");


/***
 *
 * @param {MCheckTreeBox} boxElt
 * @param {MCTBItemHolder|CTBModeNormal|CTBModeSearch}parent
 * @param data
 * @constructor
 */
function MCTBItemHolder(boxElt, parent, data) {
  this.ref = null;
  this.boxElt = boxElt;
  this.$list = this.boxElt.$list;
  this.data = data;
  this.parent = parent;
  this.level = parent ? parent.level + 1 : 0;
  this._elt = null;
  this.children = null;
  this.hasIcon = !!data.icon;
  this.hasDesc = !!data.desc;
  this.status = 'none';
  this.selected = 'none';
  this.hasLeaf = data.isLeaf;
  this.noSelect = data.noSelect;
  this.hasNoSelect = this.noSelect;

  if (data.items && data.items.map && data.items.length > 0) {
    this.children = data.items.map(it => new MCTBItemHolder(boxElt, this, it));
    this.hasIcon = this.hasIcon || this.children.some(child => child.hasIcon);
    this.hasDesc = this.hasDesc || this.children.some(child => child.hasDesc);
    this.hasLeaf = this.hasLeaf || this.children.some(child => child.hasLeaf);
    this.hasNoSelect = this.hasNoSelect || this.children.some(child => child.hasNoSelect);
    this.status = 'close';
  }
}

MCTBItemHolder.prototype.getViewElements = function (ac) {
  ac = ac || [];
  ac.push(this.elt);

  if (this.status === 'open' && this.children) {
    this.children.forEach(child => child.getViewElements(ac));
  }

  return ac;
};

Object.defineProperty(MCTBItemHolder.prototype, 'elt', {
  get: function () {
    if (!this._elt) {
      this._elt = (0, _ACore._)({
        tag: this.boxElt.classes.ItemElement,
        props: {
          data: this.data,
          level: this.level,
          status: this.status,
          selected: this.selected,
          hasLeaf: this.hasLeaf,
          noSelect: this.hasNoSelect
        },
        on: {
          checkedchange: this.ev_checkedChange.bind(this),
          statuschange: this.ev_statusChange.bind(this)
        }
      });
    }

    return this._elt;
  }
});

MCTBItemHolder.prototype.ev_checkedChange = function () {
  var selected = this._elt.selected;

  if (this.ref) {
    if (selected === 'all') {
      this.ref.select(true);
    } else {
      this.ref.select(false);
    }

    this.getRoot().updateSelectedFromRef();
  } else {
    if (selected === 'all') {
      this.select(true);
    } else {
      this.select(false);
    }
  }

  this.boxElt.notifyChange();
};

MCTBItemHolder.prototype.ev_statusChange = function () {
  if (this._elt.status === this.status) return;
  var viewElements;

  if (this.status === 'open') {
    viewElements = this.getViewElements();
    viewElements.shift();
    viewElements.forEach(elt => {
      elt.remove();
    });
    this.status = this._elt.status;
  } else if (this.status === 'close') {
    this.status = this._elt.status;
    viewElements = this.getViewElements();
    viewElements.shift();
    (0, _utils.addElementAfter)(this.$list, viewElements, this._elt);
  }
};

MCTBItemHolder.prototype.updateUp = function () {
  var selected = {
    child: 0,
    all: 0,
    none: 0
    /*dont: 0*/

  };
  var childN = this.children.length;
  this.children.reduce((ac, child) => {
    ac[child.selected]++;
    return ac;
  }, selected);

  if (childN === selected.all) {
    this.selected = 'all';
  } else if (childN === selected.none) {
    this.selected = "none";
  } else {
    this.selected = 'child';
  }

  if (this._elt) {
    this._elt.selected = this.selected;
  }

  if (this.parent) this.parent.updateUp();
};

MCTBItemHolder.prototype.select = function (flag, isDownUpdate) {
  var leafOnly = this.boxElt.leafOnly;
  if (flag && leafOnly && !this.hasLeaf) return;
  var selected = {
    child: 0,
    all: 0,
    none: 0,
    exclude: 0
    /*dont: 0*/

  };
  var childN = 0;

  if (this.children && this.children.length > 0) {
    childN = this.children.length;
    this.children.reduce((ac, child) => {
      child.select(flag, true);

      if (leafOnly && !child.hasLeaf) {
        ac.exclude++;
      } else {
        ac[child.selected]++;
      }

      return ac;
    }, selected);

    if (leafOnly) {
      if (this.hasLeaf) {
        if (childN === selected.all + selected.exclude) {
          this.selected = 'all';
        } else if (selected.all + selected.child > 0) {
          this.selected = 'child';
        } else {
          this.selected = 'none';
        }
      } else {
        this.selected = "none";
      }
    } else {
      if (childN === selected.all) {
        this.selected = 'all';
      } else if (childN === selected.none) {
        this.selected = "none";
      } else {
        this.selected = 'child';
      }
    }
  } else {
    if (flag && (!leafOnly || this.hasLeaf)) {
      this.selected = 'all';
    } else {
      this.selected = 'none';
    }
  }

  if (this._elt) {
    this._elt.selected = this.selected;
  }

  if (!isDownUpdate && this.parent) {
    this.parent.updateUp();
  }
};

MCTBItemHolder.prototype.getRoot = function () {
  var c = this;

  while (c.parent) {
    c = c.parent;
  }

  return c;
};

var _default = MCTBItemHolder;
/*********************************** ADAPT OLD VERSION ***************************************************************/

exports.default = _default;
Object.defineProperty(MCTBItemHolder.prototype, 'item', {
  get: function () {
    return this.data;
  }
});
};

moduleFactories["node_modules/absol-acomp/js/checktreebox/CTBModes.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreebox/CTBModes.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CTBModeNormal = CTBModeNormal;
exports.CTBModeSearch = CTBModeSearch;

var _MCTBItemHolder = _interopRequireDefault(require("./MCTBItemHolder"));

var _utils = require("../utils");


/***
 *
 * @param {MCheckTreeBox} elt
 * @param {[]} items
 * @constructor
 */
function CTBModeNormal(elt, items) {
  this.level = -1;
  this.selected = 'none';
  this.elt = elt;
  this.$list = this.elt.$list;
  /***
   *
   * @type {MCTBItemHolder[]}
   */

  this.children = items.map(item => new this.elt.classes.ItemHolder(elt, this, item));
  this.hasLeaf = this.children.some(holder => holder.hasLeaf);
  this.hasNoSelect = this.children.some(holder => holder.hasNoSelect);
  this.hasDesc = this.children.some(holder => holder.hasDesc);
  this.hasIcon = this.children.some(holder => holder.hasIcon);

  if (this.hasLeaf) {
    this.elt.addClass('as-has-leaf');
  } else {
    this.elt.removeClass('as-has-leaf');
  }

  if (this.hasNoSelect) {
    this.elt.addClass('as-has-no-select');
    this.elt.$chekAll.disabled = true;
  } else {
    this.elt.removeClass('as-has-no-select');
    this.elt.$chekAll.disabled = false;
  }

  this.dict = this.children.reduce(function visit(ac, child) {
    var key = (0, _utils.keyStringOf)(child.data.value);

    if (ac[key]) {
      console.error('Duplicate value:', ac[key].data, child.data);
    }

    ac[key] = child;

    if (child.children) {
      child.children.reduce(visit, ac);
    }

    return ac;
  }, {});
}

CTBModeNormal.prototype.onStart = function () {
  this.$list.clearChild();
  var rootHolders = this.children;
  var viewElements = [];
  rootHolders.forEach(holder => {
    holder.getViewElements(viewElements);
  }, []);
  this.$list.addChild(viewElements);
};

CTBModeNormal.prototype.onStop = function () {};

CTBModeNormal.prototype.updateUp = function () {
  var selected = {
    child: 0,
    all: 0,
    none: 0
    /*dont: 0*/

  };
  var childN = this.children.length;
  this.children.reduce((ac, child) => {
    ac[child.selected]++;
    return ac;
  }, selected);

  if (childN === selected.all) {
    this.selected = 'all';
  } else if (childN === selected.none) {
    this.selected = "none";
  } else {
    this.selected = 'child';
  }

  this.elt.$chekAll.checked = this.selected === 'all';
};

CTBModeNormal.prototype.select = function (flag) {
  this.children.forEach(child => child.select(flag, true));
  this.updateUp();
};

CTBModeNormal.prototype.getHolderByValue = function (value) {
  return this.dict[(0, _utils.keyStringOf)(value)] || null;
};

CTBModeNormal.prototype.setValues = function (values) {
  this.children.forEach(node => node.select(false));
  values.forEach(value => {
    var holder = this.getHolderByValue(value);
    if (holder) holder.select(true);
  });
};

CTBModeNormal.prototype.getValues = function () {
  var values = [];
  var leafOnly = this.elt.leafOnly;
  this.children.forEach(function visit(node) {
    if (node.selected === 'all' && !node.hasNoSelect) {
      if (leafOnly) {
        if (node.data.isLeaf) {
          values.push(node.data.value);
        } else if (node.data.items) {
          node.data.items.forEach(function visitLeaf(item) {
            if (item.isLeaf) {
              values.push(item.value);
            } else if (item.items) {
              item.items.forEach(visitLeaf);
            }
          });
        }
      } else {
        values.push(node.data.value);
      }
    } else if (node.children) {
      node.children.forEach(visit);
    }
  });
  return values;
};

CTBModeNormal.prototype.getViewValues = function () {
  var values = [];
  this.children.forEach(function visit(node) {
    if (node.selected === 'all' && !node.hasNoSelect) {
      values.push(node.data.value);
    } else if (node.children) {
      node.children.forEach(visit);
    }
  });
  return values;
};
/***
 *
 * @param {MCheckTreeBox} elt
 * @param {[]} items
 * @constructor
 */


function CTBModeSearch(elt, items) {
  this.level = -1;
  this.selected = 'none';
  this.elt = elt;
  this.$list = this.elt.$list;
  this.children = items.map(item => new this.elt.classes.ItemHolder(elt, this, item));
}

CTBModeSearch.prototype.onStart = function () {
  CTBModeNormal.prototype.onStart.call(this);
  this.updateSelectedFromRef();
};

CTBModeSearch.prototype.onStop = function () {};

CTBModeSearch.prototype.updateSelectedFromRef = function () {
  var normalMode = this.elt.modes.normal;
  this.children.forEach(function visit(holder) {
    holder.selected = holder.ref.selected;

    if (holder._elt) {
      holder._elt.selected = holder.selected;
    }

    if (holder.children) holder.children.forEach(visit);
  });
};
};

moduleFactories["node_modules/absol-acomp/js/checktreebox/MCTBItemListController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreebox/MCTBItemListController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ListDictionary = _interopRequireDefault(require("../list/ListDictionary"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _utils = require("../utils");

var _CTBModes = require("./CTBModes");

var _search = _interopRequireWildcard(require("../list/search"));




/***
 * not optimize
 * @param {MCheckTreeBox} elt
 * @constructor
 */
function MCTBItemListController(elt) {
  this.elt = elt;
}

_OOP.default.mixClass(MCTBItemListController, _ListDictionary.default);

MCTBItemListController.prototype.setItems = function (items) {
  items = items || [];
  if (!items.forEach || !items.map) items = [];
  this.items = (0, _utils.copySelectionItemArray)(items, {
    removeNoView: true
  });
  this.update();
};

MCTBItemListController.prototype.update = function () {
  var mode = new this.elt.classes.ModeNormal(this.elt, this.items);
  this.elt.modes.normal = mode;

  if (mode.hasDesc) {
    this.elt.$list.addClass('as-has-desc');
  } else {
    this.elt.$list.removeClass('as-has-desc');
  }

  if (mode.hasIcon) {
    this.elt.$list.addClass('as-has-icon');
  } else {
    this.elt.$list.removeClass('as-has-icon');
  }

  this.elt.mode = mode;
  mode.onStart();
  this._searchItems = (0, _search.prepareSearchForList)((0, _utils.copySelectionItemArray)(this.items));
  this._searchCache = {};
};

MCTBItemListController.prototype.getItems = function () {
  return (0, _utils.copySelectionItemArray)(this.items);
};

MCTBItemListController.prototype.makeSearch = function (query) {
  if (this._searchCache[query]) return this._searchCache[query].resetAndGet();
  var searchItem = (0, _search.default)({
    text: query
  });
  var minScore = Infinity;
  var maxScore = -Infinity;

  var scoredHolders = this._searchItems.map(function visit(item) {
    var holder = {
      item: item,
      score: (0, _search.calcItemMatchScore)(searchItem, item),
      childMaxScore: -Infinity
    };
    minScore = Math.min(minScore, holder.score);
    maxScore = Math.max(maxScore, holder.score);

    if (item.items && item.items.length > 0) {
      holder.children = item.items.map(visit);
      holder.childMaxScore = holder.children.reduce((ac, cr) => {
        return Math.max(ac, cr.score, cr.childMaxScore);
      }, 0);
    }

    return holder;
  });

  var threshHold = maxScore - (maxScore - minScore) / 3;
  var result = scoredHolders.reduce(function filterVisit(ac, cr) {
    var subItems;

    if (Math.max(cr.score, cr.childMaxScore) >= threshHold) {
      ac.items.push(cr.item);

      if (cr.children && cr.childMaxScore >= cr.score) {
        ac.status[(0, _utils.keyStringOf)(cr.item.value)] = 'open';
        subItems = cr.children.reduce(filterVisit, {
          items: [],
          status: ac.status
        }).items;
        cr.item.items = subItems;
      } else {
        if (cr.children && cr.children.length > 0) {
          ac.status[(0, _utils.keyStringOf)(cr.item.value)] = 'open';
        }
      }
    }

    return ac;
  }, {
    items: [],
    status: {}
  });
  var normalMode = this.elt.modes.normal;
  result.mode = new this.elt.classes.ModeSearch(this.elt, result.items);

  result.resetAndGet = function () {
    this.mode.children && this.mode.children.forEach(function resetVisit(holder) {
      var key = (0, _utils.keyStringOf)(holder.data.value);
      holder.ref = normalMode.getHolderByValue(holder.data.value);

      if (holder.status === 'open' && result.status[key] !== 'open') {
        holder.status = 'close';

        if (holder._elt) {
          holder._elt.status = 'close';
        }
      } else if (holder.status === 'close' && result.status[key] === 'open') {
        holder.status = 'open';

        if (holder._elt) {
          holder._elt.status = 'open';
        }
      }

      if (holder.children) holder.children.forEach(resetVisit);
    });
    return this.mode;
  };

  this._searchCache[query] = result;
  return result.resetAndGet();
};

var _default = MCTBItemListController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreebox/MCheckTreeBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreebox/MCheckTreeBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/dropdownbox.css");

var _ACore = require("../../ACore");

var _CTBPropHandlers = _interopRequireDefault(require("./CTBPropHandlers"));

var _MCTBItemListController = _interopRequireDefault(require("./MCTBItemListController"));

var _Searcher = _interopRequireDefault(require("../Searcher"));

var _CTBModes = require("./CTBModes");

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _MCTBItemHolder = _interopRequireDefault(require("./MCTBItemHolder"));

var _CheckTreeItem = _interopRequireDefault(require("./CheckTreeItem"));


/***
 * @extends AElement
 * @constructor
 */
function MCheckTreeBox() {
  this.$box = (0, _ACore.$)('.am-check-tree-box', this);
  this.$body = (0, _ACore.$)('.am-check-tree-box-body', this);
  this.$list = (0, _ACore.$)('.am-check-tree-box-list', this);
  this.$chekAll = (0, _ACore.$)('.as-select-list-box-check-all', this).on('change', function () {
    this.modes.normal.select(this.$chekAll.checked);
    if (this.mode.updateSelectedFromRef) this.mode.updateSelectedFromRef();
    this.notifyChange();
  }.bind(this));
  this.$searchInput = (0, _ACore.$)(_Searcher.default.tag, this).on('stoptyping', this.eventHandler.searchTextInputModify);
  this.$cancelBtn = (0, _ACore.$)('.as-select-list-box-cancel-btn', this).on('click', function () {
    this.emit('cancel', {
      type: 'cancel',
      target: this
    }, this);
  }.bind(this));
  this.$closeBtn = (0, _ACore.$)('.as-select-list-box-close-btn', this);
  this.$boxCloseBtn = (0, _ACore.$)('.am-dropdown-box-close-btn', this);
  this.on('click', function (event) {
    if (event.target === this || (0, _EventEmitter.hitElement)(this.$closeBtn, event) || (0, _EventEmitter.hitElement)(this.$boxCloseBtn, event)) {
      this.emit('close', {
        type: 'close',
        target: this
      }, this);
    }
  }.bind(this));
  this.pendingValues = null;
  this.modes = {
    normal: new this.classes.ModeNormal(this, [])
  };
  /***
   *
   * @type {CTBModeNormal | CTBModeSearch}
   */

  this.mode = this.modes.normal;
  this.itemListCtrl = new this.classes.ListController(this);
}

MCheckTreeBox.prototype.classes = {
  ListController: _MCTBItemListController.default,
  ModeSearch: _CTBModes.CTBModeSearch,
  ModeNormal: _CTBModes.CTBModeNormal,
  ItemHolder: _MCTBItemHolder.default,
  ItemElement: _CheckTreeItem.default
};
MCheckTreeBox.tag = 'MCheckTreeBox'.toLowerCase();

MCheckTreeBox.render = function () {
  return (0, _ACore._)({
    extendEvent: ['change', 'close', 'cancel'],
    class: ['am-modal', 'am-dropdown-box-modal'],
    child: {
      class: ['am-check-tree-box', 'am-dropdown-box', 'as-dropdown-box-common-style'],
      child: [{
        class: 'am-dropdown-box-header',
        child: [{
          tag: _Searcher.default.tag
        }, {
          tag: 'button',
          class: 'am-dropdown-box-close-btn',
          child: 'span.mdi.mdi-close'
        }]
      }, {
        class: ['am-dropdown-box-body', 'am-check-tree-box-body'],
        child: {
          class: 'am-check-tree-box-list'
        }
      }, {
        class: 'as-dropdown-box-footer',
        child: [{
          tag: 'checkbox',
          class: 'as-select-list-box-check-all',
          props: {
            checked: false,
            text: _LanguageSystem.default.getText('txt_check_all') || _LanguageSystem.default.getText('txt_all') || 'Check All'
          }
        }, {
          class: 'as-dropdown-box-footer-right',
          child: [{
            tag: 'a',
            class: 'as-select-list-box-cancel-btn',
            attr: {
              "data-ml-key": 'txt_cancel'
            }
          }, {
            tag: 'a',
            class: 'as-select-list-box-close-btn',
            attr: {
              "data-ml-key": 'txt_close'
            }
          }]
        }]
      }]
    }
  });
};

MCheckTreeBox.prototype.getHolderByValue = function (value) {
  return this.modes.normal.getHolderByValue(value);
};

MCheckTreeBox.prototype.select = function (value, flag) {
  var holder = this.modes.normal.getHolderByValue(value);

  if (holder) {
    holder.select(flag);

    if (this.mode !== this.modes.normal) {
      this.mode.updateSelectedFromRef();
    }

    return true;
  }

  return false;
};

MCheckTreeBox.prototype.getItemByValue = function (value) {
  var holder = this.modes.normal.getHolderByValue(value);
  if (holder) return holder.data;
  return null;
};

MCheckTreeBox.prototype.focus = function () {
  if (this.enableSearch) {
    this.$searchInput.focus();
  }
};

MCheckTreeBox.prototype.resetSearchState = function () {
  this.$searchInput.value = '';
  this.eventHandler.searchTextInputModify();
};

MCheckTreeBox.prototype.notifyChange = function () {
  this.pendingValues = null;
  this.emit('change', {
    type: 'change',
    target: this
  }, this);
};
/***
 * @name eventHandler
 * @type {{}}
 * @memberOf MCheckTreeBox#
 */


MCheckTreeBox.eventHandler = {};

MCheckTreeBox.eventHandler.searchTextInputModify = function () {
  var query = this.$searchInput.value.trim().replace(/\s+/g, ' ');

  if (query.length > 0) {
    if (this.mode === this.modes.normal) {
      this.mode.onStop();
    }

    this.mode.search = this.itemListCtrl.makeSearch(query);
    this.mode = this.mode.search;
    this.mode.onStart();
  } else {
    if (this.mode !== this.modes.normal) {
      this.mode.onStop();
      this.mode = this.modes.normal;
      this.mode.onStart();
    }
  }
};

MCheckTreeBox.property = _CTBPropHandlers.default;
var _default = MCheckTreeBox;
/*********************************** ADAPT OLD VERSION ***************************************************************/

exports.default = _default;

MCheckTreeBox.prototype.findItemHoldersByValue = function (value) {
  var holder = this.getHolderByValue(value);

  if (holder) {
    return [holder];
  } else {
    return [];
  }
};
};

moduleFactories["node_modules/absol-acomp/js/PathMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/PathMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/pathmenu.css");

var _ACore = _interopRequireWildcard(require("../ACore"));

var _QuickMenu = _interopRequireDefault(require("./QuickMenu"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));




/***
 * @extends AElement
 * @constructor
 */
function PathMenu() {
  this._path = [];
  this.$items = [];
}

PathMenu.tag = 'PathMenu'.toLowerCase();

PathMenu.render = function () {
  return (0, _ACore._)({
    attr: {
      tabindex: '1'
    },
    extendEvent: ['press', 'change'],
    class: 'as-path-menu'
  });
};

PathMenu.prototype._makeItem = function (data, idx) {
  var self = this;
  var button = (0, _ACore._)({
    class: ['as-ribbon-split-button', 'as-path-menu-item'],
    child: {
      class: 'as-ribbon-split-button-content',
      child: [{
        tag: 'button',
        attr: {
          'tabindex': '-1'
        },
        class: 'as-ribbon-split-button-primary',
        child: {
          tag: 'span',
          class: 'as-ribbon-split-button-text',
          child: {
            text: (data.name || data.text || '') + ''
          }
        }
      }, {
        tag: 'button',
        attr: {
          'tabindex': '-1'
        },
        class: 'as-ribbon-split-button-extend',
        child: ['span.mdi.mdi-chevron-right']
      }]
    }
  });
  button.on('mouseenter', function () {
    if (document.activeElement && _AElement.default.prototype.isDescendantOf.call(document.activeElement, self) && self.hasClass('as-opening-item')) {
      if (button.quickMenu) button.quickMenu.open();
    }
  });
  var extendIconElt = (0, _ACore.$)('.as-ribbon-split-button-extend .mdi', button);
  var primaryBtn = (0, _ACore.$)('.as-ribbon-split-button-primary', button).on('click', function () {
    self.emit('press', {
      target: self,
      pathItem: data,
      index: idx
    }, self);
  }); //as-ribbon-split-button-icon

  var icon = null;

  if (data.icon) {
    icon = (0, _ACore._)(data.icon);
  } else if (data.iconSrc) {
    icon = (0, _ACore._)({
      tag: 'img',
      props: {
        src: data.iconSrc
      }
    });
  }

  if (icon) {
    if (icon.parentElement) icon = (0, _ACore.$)(icon.cloneNode(true));
    icon.addClass('as-ribbon-split-button-icon');
    primaryBtn.addChildBefore(icon, primaryBtn.firstChild);
  }

  var quickTrigger = (0, _ACore.$)('.as-ribbon-split-button-extend', button);

  if (data.items && data.items.length > 0) {
    button.quickMenu = _QuickMenu.default.toggleWhenClick(quickTrigger, {
      getMenuProps: function () {
        return {
          items: data.items.map(function (it, menuIndex) {
            if (typeof it === "string") return it;

            if (typeof it === "object") {
              if (it.icon || it.iconSrc || it.name || it.text) {
                return {
                  text: it.name || it.text,
                  menuIndex: menuIndex,
                  icon: it.iconSrc ? {
                    tag: 'img',
                    props: {
                      src: it.iconSrc
                    }
                  } : it.icon || undefined,
                  extendStyle: it.extendStyle || {},
                  extendClass: it.extendClass || []
                };
              }
            }

            return it;
          })
        };
      },
      anchor: [1, 6, 0, 7],
      onOpen: function () {
        self.addClass('as-opening-item');
        extendIconElt.addClass('mdi-rotate-90');
      },
      onClose: function () {
        self.removeClass('as-opening-item');
        extendIconElt.removeClass('mdi-rotate-90');
      },
      onSelect: function (item) {
        var dataItem = data.items[item.menuIndex];
        self.emit('change', {
          target: self,
          pathItem: data,
          item: dataItem,
          index: idx
        }, self);
        button.removeClass('as-open');
      }
    });
  } else {
    button.addClass('as-has-no-item');
  }

  return button;
};

PathMenu.property = {};
PathMenu.property.path = {
  set: function (path) {
    this._path = path || [];
    this.$items.forEach(elt => elt.remove());
    this.$items = this._path.map((it, i) => this._makeItem(it, i));
    this.addChild(this.$items);
  },
  get: function () {
    return this._path;
  }
};

_ACore.default.install(PathMenu);

var _default = PathMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/multichecktreemenu/MCTMPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/multichecktreemenu/MCTMPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _datetime = require("absol/src/Time/datetime");

var _Array = require("absol/src/DataStructure/Array");

var MCTMPropHandlers = {};
MCTMPropHandlers.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this.hasClass('as-read-only');
  }
};
MCTMPropHandlers.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
MCTMPropHandlers.items = {
  set: function (items) {
    this.$box.items = items;
    this.tokenCtrl.updateFromViewValues();
  },
  get: function () {
    return this.$box.items;
  }
};
MCTMPropHandlers.values = {
  set: function (values) {
    this.$box.values = values || [];
    this.tokenCtrl.updateFromViewValues();
  },
  get: function () {
    if (this.isFocus) {
      return this.savedValues;
    } else {
      return this.$box.values;
    }
  }
};
MCTMPropHandlers.leafOnly = {
  set: function (value) {
    if (!!value === this.hasClass('as-leaf-only')) return;

    if (value) {
      this.addClass('as-leaf-only');
      this.$box.leafOnly = true;
    } else {
      this.removeClass('as-leaf-only');
      this.$box.leafOnly = false;
    }

    this.tokenCtrl.updateFromViewValues();
  },
  get: function () {
    return this.hasClass('as-leaf-only');
  }
};
MCTMPropHandlers.isFocus = {
  /***
   * @this MultiCheckTreeMenu
   * @param value
   */
  set: function (value) {
    if (!!value === this.hasClass('as-focus')) return;

    if (value) {
      this.savedValues = this.$box.values;
      this.addClass('as-focus');
      this.boxCtrl.onFocus();
    } else {
      this.removeClass('as-focus');
      this.boxCtrl.onBlur();
      var newValues = this.values;

      if (!(0, _Array.arrayCompare)(this.savedValues, newValues)) {
        this.notifyChange();
      } else {
        this.tokenCtrl.updateFromViewValues();
      }

      this.savedValues = this.values;
    }
  },
  get: function () {
    return this.hasClass('as-focus');
  }
};
MCTMPropHandlers.enableSearch = {
  set: function (value) {
    this.$box.enableSearch = value;
  },
  get: function () {
    return this.$box.enableSearch;
  }
};
var _default = MCTMPropHandlers;
/**************************** ADAPT OLD VERSION **********************************************************************/

exports.default = _default;
MCTMPropHandlers.$checkTreeBox = {
  get: function () {
    return this.$box;
  }
};
};

moduleFactories["node_modules/absol-acomp/js/multichecktreemenu/MMCTMBoxController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/multichecktreemenu/MMCTMBoxController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param elt
 * @constructor
 */
function MMCTMBoxController(elt) {
  this.elt = elt;
  this.$box = elt.$box;

  for (var key in this) {
    if (key.startsWith('ev_')) this[key] = this[key].bind(this);
  }

  this.elt.on('click', this.ev_click);
  this.$box.on('close', this.ev_close);
  this.$box.on('cancel', this.ev_cancel);
  this.$box.on('change', this.ev_boxValuesChange);
}

MMCTMBoxController.prototype.onFocus = function () {
  this.$box.addTo(document.body);
  this.elt.off('click', this.ev_click);
};

MMCTMBoxController.prototype.onBlur = function () {
  this.$box.remove();
  setTimeout(() => {
    this.elt.on('click', this.ev_click);
  }, 50);
};

MMCTMBoxController.prototype.ev_click = function (event) {
  if (!this.elt.disabled && !this.elt.readOnly && (event.target === this.elt || event.target === this.elt.$itemCtn)) {
    this.elt.isFocus = true;
  }
};

MMCTMBoxController.prototype.ev_close = function (event) {
  this.elt.isFocus = false;
};

MMCTMBoxController.prototype.ev_cancel = function (event) {
  this.$box.values = this.elt.savedValues;
  this.elt.isFocus = false;
};

MMCTMBoxController.prototype.ev_boxValuesChange = function () {
  this.elt.tokenCtrl.updateFromViewValues();
};

var _default = MMCTMBoxController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/multichecktreemenu/MCTMTokenController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/multichecktreemenu/MCTMTokenController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SelectBoxItem = _interopRequireDefault(require("../SelectBoxItem"));

var _ACore = require("../../ACore");

var _utils = require("../utils");


/****
 *
 * @param {MultiCheckTreeMenu} elt
 * @constructor
 */
function MCTMTokenController(elt) {
  this.elt = elt;
  this.$box = elt.$box;
  this.$itemCtn = elt.$itemCtn;
}

MCTMTokenController.prototype.updateFromViewValues = function () {
  var values = this.$box.viewValues;
  this.requireItems(values.length);
  var holder;

  for (var i = 0; i < values.length; ++i) {
    holder = this.$box.getHolderByValue(values[i]);
    this.$itemCtn.childNodes[i].data = holder.data;
  }
};

MCTMTokenController.prototype.requireItems = function (count) {
  while (this.$itemCtn.childNodes.length < count) {
    this.$itemCtn.addChild(this.makeToken());
  }

  while (this.$itemCtn.childNodes.length > count) {
    this.$itemCtn.lastChild.remove();
  }
};

MCTMTokenController.prototype.removeValue = function (targetValue) {
  var values = this.elt.values;
  var targetKey = (0, _utils.keyStringOf)(targetValue);
  var idx = values.findIndex(value => (0, _utils.keyStringOf)(value) === targetKey);

  if (idx >= 0) {
    values.splice(idx, 1);
    this.values = values;
    this.elt.notifyChange();
  }
};

MCTMTokenController.prototype.makeToken = function () {
  var ctrl = this;
  return (0, _ACore._)({
    tag: _SelectBoxItem.default,
    on: {
      close: function () {
        ctrl.removeValue(this.value);
      }
    }
  });
};

var _default = MCTMTokenController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/multichecktreemenu/MultiCheckTreeMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/multichecktreemenu/MultiCheckTreeMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _MCTMPropHandlers = _interopRequireDefault(require("./MCTMPropHandlers"));

var _MMCTMBoxController = _interopRequireDefault(require("./MMCTMBoxController"));

var _MCheckTreeBox = _interopRequireDefault(require("../checktreebox/MCheckTreeBox"));

var _MCTMTokenController = _interopRequireDefault(require("./MCTMTokenController"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));




/***
 * @extends AElement
 * @constructor
 */
function MultiCheckTreeMenu() {
  this.$box = (0, _ACore._)({
    tag: this.classes.Box
  });
  this.$itemCtn = (0, _ACore.$)('.as-multi-select-menu-item-ctn', this);
  this.boxCtrl = new _MMCTMBoxController.default(this);
  this.tokenCtrl = new _MCTMTokenController.default(this);
}

MultiCheckTreeMenu.tag = 'MultiCheckTreeMenu'.toLowerCase();
MultiCheckTreeMenu.prototype.classes = {
  Box: _MCheckTreeBox.default
};

MultiCheckTreeMenu.render = function () {
  return (0, _ACore._)({
    class: ['as-multi-select-menu', 'as-multi-check-tree-menu'],
    extendEvent: ['change'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: ['as-multi-select-menu-item-ctn', 'as-bscroller']
    }, {
      tag: 'button',
      class: 'as-multi-select-menu-toggle-btn',
      child: 'dropdown-ico'
    }, 'attachhook']
  });
};

MultiCheckTreeMenu.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change',
    target: this
  }, this);
};

MultiCheckTreeMenu.property = _MCTMPropHandlers.default;

_ACore.default.install(MultiCheckTreeMenu);

var _default = MultiCheckTreeMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/multichecktreeleafmenu/MCTLMPropHandler.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/multichecktreeleafmenu/MCTLMPropHandler.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _MCTMPropHandlers = _interopRequireDefault(require("../multichecktreemenu/MCTMPropHandlers"));


var MCTLMPropHandler = Object.assign({}, _MCTMPropHandlers.default);
MCTLMPropHandler.leafOnly = {
  value: true,
  enumerable: true
};
var _default = MCTLMPropHandler;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreeleafbox/CTLBPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreeleafbox/CTLBPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _CTBPropHandlers = _interopRequireDefault(require("../checktreebox/CTBPropHandlers"));


var CTLBPropHandlers = Object.keys(_CTBPropHandlers.default).reduce((ac, key) => {
  ac[key] = Object.assign({}, _CTBPropHandlers.default[key]);
  return ac;
}, {});
CTLBPropHandlers.leafOnly = {
  enumerable: true,
  value: true
};
var _default = CTLBPropHandlers;
/***
 *
 * @type {boolean}
 * @name enableSearch
 * @memberOf MCheckTreeBox#
 */

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreeleafbox/CTLIPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreeleafbox/CTLIPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _CTIPropHandlers = _interopRequireDefault(require("../checktreebox/CTIPropHandlers"));


var CTLIPropHandlers = Object.keys(_CTIPropHandlers.default).reduce((ac, key) => {
  ac[key] = Object.assign({}, _CTIPropHandlers.default[key]);
  return ac;
}, {});
var _default = CTLIPropHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreeleafbox/CheckTreeLeafItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreeleafbox/CheckTreeLeafItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _CTLIPropHandlers = _interopRequireDefault(require("./CTLIPropHandlers"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _CheckTreeItem = _interopRequireDefault(require("../checktreebox/CheckTreeItem"));


/***
 * @extends AElement
 * @constructor
 */
function CheckTreeLeafItem() {
  this._data = null;
  this._status = 'none';
  this.$text = (0, _ACore.$)('.am-check-tree-item-text', this).firstChild;
  this.$desc = (0, _ACore.$)('.am-check-tree-item-desc', this).firstChild;
  this.$iconCtn = (0, _ACore.$)('.am-check-tree-item-icon-ctn', this);
  this.$checkbox = (0, _ACore.$)('checkboxinput', this).on('change', this.eventHandler.checkboxChange);
  this.addEventListener('click', this.eventHandler.click);
}

_OOP.default.mixClass(CheckTreeLeafItem, _CheckTreeItem.default);

CheckTreeLeafItem.tag = 'CheckTreeLeafItem'.toLowerCase();

CheckTreeLeafItem.render = function () {
  return (0, _ACore._)({
    extendEvent: ['checkedchange', 'click', 'statuschange'],
    class: ['am-check-tree-leaf-item', 'am-check-tree-item', 'am-dropdown-box-item'],
    child: [{
      class: 'am-check-tree-item-toggle-ctn',
      child: 'toggler-ico'
    }, {
      class: 'am-check-tree-item-icon-ctn'
    }, {
      class: 'am-check-tree-item-checkbox-ctn',
      child: 'checkboxinput'
    }, {
      class: 'am-check-tree-item-text',
      child: {
        text: ''
      }
    }, {
      class: 'am-check-tree-item-desc',
      child: {
        text: ''
      }
    }]
  });
};

CheckTreeLeafItem.eventHandler = Object.assign({}, _CheckTreeItem.default.eventHandler);
CheckTreeLeafItem.property = _CTLIPropHandlers.default;
/***
 * @name data
 * @memberOf CheckTreeLeafItem#
 */

/***.
 * @name text
 * @type {string}
 * @memberOf CheckTreeLeafItem#
 */

/***
 * @name desc
 * @type {string}
 * @memberOf CheckTreeLeafItem#
 */

/***
 * @name value
 * @memberOf CheckTreeLeafItem#
 */

var _default = CheckTreeLeafItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/checktreeleafbox/CTLBModes.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreeleafbox/CTLBModes.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CTLBModeNormal = CTLBModeNormal;

var _CTBModes = require("../checktreebox/CTBModes");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/***
 * @extends CTBModeNormal
 * @param {MCheckTreeBox} elt
 * @param {[]} items
 * @constructor
 */
function CTLBModeNormal(elt, items) {
  _CTBModes.CTBModeNormal.apply(this, arguments);
}

_OOP.default.mixClass(CTLBModeNormal, _CTBModes.CTBModeNormal);

CTLBModeNormal.prototype.getViewValues = function () {
  var values = [];
  this.children.forEach(function visit(node) {
    if (node.selected === 'all' && node.data.isLeaf) {
      values.push(node.data.value);
    } else if (node.children) {
      node.children.forEach(visit);
    }
  });
  return values;
};
};

moduleFactories["node_modules/absol-acomp/js/checktreeleafbox/MCheckTreeLeafBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/checktreeleafbox/MCheckTreeLeafBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _MCheckTreeBox = _interopRequireDefault(require("../checktreebox/MCheckTreeBox"));

var _CTLBPropHandlers = _interopRequireDefault(require("./CTLBPropHandlers"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _CheckTreeLeafItem = _interopRequireDefault(require("./CheckTreeLeafItem"));

var _CTLBModes = require("./CTLBModes");




/***
 * @extends MCheckTreeBox
 * @constructor
 */
function MCheckTreeLeafBox() {
  _MCheckTreeBox.default.apply(this, arguments);

  this.$box.addClass('as-check-tree-leaf-box');
}

_OOP.default.mixClass(MCheckTreeLeafBox, _MCheckTreeBox.default);

MCheckTreeLeafBox.tag = 'MCheckTreeLeafBox'.toLowerCase();
MCheckTreeLeafBox.prototype.classes = Object.assign({}, _MCheckTreeBox.default.prototype.classes, {
  ItemElement: _CheckTreeLeafItem.default,
  ModeNormal: _CTLBModes.CTLBModeNormal
});

MCheckTreeLeafBox.render = function () {
  return _MCheckTreeBox.default.render();
};

MCheckTreeLeafBox.property = _CTLBPropHandlers.default;
MCheckTreeLeafBox.eventHandler = Object.assign({}, _MCheckTreeBox.default.eventHandler);

_ACore.default.install(MCheckTreeLeafBox);

var _default = MCheckTreeLeafBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/multichecktreeleafmenu/MultiCheckTreeLeafMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/multichecktreeleafmenu/MultiCheckTreeLeafMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _MCTLMPropHandler = _interopRequireDefault(require("./MCTLMPropHandler"));

var _MultiCheckTreeMenu = _interopRequireDefault(require("../multichecktreemenu/MultiCheckTreeMenu"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _MCheckTreeLeafBox = _interopRequireDefault(require("../checktreeleafbox/MCheckTreeLeafBox"));




function MultiCheckTreeLeafMenu() {
  _MultiCheckTreeMenu.default.apply(this, arguments);
}

_OOP.default.mixClass(MultiCheckTreeLeafMenu, _MultiCheckTreeMenu.default);

MultiCheckTreeLeafMenu.tag = 'MultiCheckTreeLeafMenu'.toLowerCase();
MultiCheckTreeLeafMenu.prototype.classes = {
  Box: _MCheckTreeLeafBox.default
};

MultiCheckTreeLeafMenu.render = function () {
  return _MultiCheckTreeMenu.default.render().addClass('as-multi-check-tree-leaf-menu');
};

MultiCheckTreeLeafMenu.property = _MCTLMPropHandler.default;

_ACore.default.install(MultiCheckTreeLeafMenu);

var _default = MultiCheckTreeLeafMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafbox/STLIPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafbox/STLIPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _CTIPropHandlers = _interopRequireDefault(require("../checktreebox/CTIPropHandlers"));


var STLIPropHandlers = {};
STLIPropHandlers.data = {
  set: function (data) {
    this._data = data;

    this._updateData();
  },
  get: function () {
    return this._data;
  }
};
STLIPropHandlers.text = {
  get: function () {
    var data = this._data;
    if (data === undefined || data === null) return '';
    if (typeof data === 'string') return data;
    if (data && data.text) return data.text + '';
    return data + '';
  }
};
STLIPropHandlers.value = {
  get: function () {
    var data = this._data;
    if (data === undefined || data === null) return data;
    if (data && 'value' in data) return data.value;
    return data;
  }
};
STLIPropHandlers.level = _CTIPropHandlers.default.level;
STLIPropHandlers.status = _CTIPropHandlers.default.status;
STLIPropHandlers.selected = {
  set: function (value) {
    if (value) {
      this.addClass('as-selected');
    } else {
      this.removeClass('as-selected');
    }
  },
  get: function () {
    return this.hasClass('as-selected');
  }
};
/****
 * @name text
 * @type {string}
 * @memberOf SelectTreeLeafItem#
 */

/****
 * @name value
 * @type {string|number}
 * @memberOf SelectTreeLeafItem#
 */

/****
 * @name data
 * @type {*}
 * @memberOf SelectTreeLeafItem#
 */

/****
 * @name selected
 * @type {boolean}
 * @memberOf SelectTreeLeafItem#
 */

var _default = STLIPropHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafbox/SelectTreeLeafItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafbox/SelectTreeLeafItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _STLIPropHandlers = _interopRequireDefault(require("./STLIPropHandlers"));

var _utils = require("../utils");

require("../../css/selecttreeeleafbox.css");


/***
 * @extends AElement
 * @constructor
 */
function SelectTreeLeafItem() {
  this.$text = (0, _ACore.$)('.am-select-tree-leaf-item-text', this);
  this.$desc = (0, _ACore.$)('.am-select-tree-leaf-item-desc', this);
  this.$iconCtn = (0, _ACore.$)('.am-select-tree-leaf-item-icon-ctn', this);
  this.addEventListener('click', this.eventHandler.click);
}

SelectTreeLeafItem.tag = 'SelectTreeLeafItem'.toLowerCase();

SelectTreeLeafItem.render = function () {
  return (0, _ACore._)({
    extendEvent: ['click', 'statuschange'],
    class: ['am-select-tree-leaf-item', 'am-dropdown-box-item'],
    child: [{
      class: 'am-select-tree-leaf-item-toggle-ctn',
      child: 'toggler-ico'
    }, {
      class: 'am-select-tree-leaf-item-icon-ctn'
    }, {
      class: 'am-select-tree-leaf-item-text',
      child: {
        text: ''
      }
    }, {
      class: 'am-select-tree-leaf-item-desc',
      child: {
        text: ''
      }
    }]
  });
};

SelectTreeLeafItem.prototype._updateData = function () {
  this.$text.firstChild.data = this.text;
  this.attr('data-key', (0, _utils.keyStringOf)(this.value));
  this.$iconCtn.clearChild();
  var icon = this.data && this.data.icon;

  if (icon) {
    icon = (0, _ACore._)(icon);
    if (icon.parentElement) icon = (0, _ACore.$)(icon.cloneNode(true));
    this.$iconCtn.addChild(icon);
    this.addClass('as-has-icon');
  } else {
    this.removeClass('as-has-icon');
  }

  if (this.data && this.data.isLeaf) {
    this.addClass('as-is-leaf');
  } else {
    this.removeClass('as-is-leaf');
  }
};

SelectTreeLeafItem.property = _STLIPropHandlers.default;
SelectTreeLeafItem.eventHandler = {};

SelectTreeLeafItem.eventHandler.click = function (event) {
  if (this._data && this._data.isLeaf) {
    this.emit('click', {
      type: 'click',
      target: this,
      originalEvent: event
    }, this);
  } else {
    if (this.status !== 'none') {
      this.status = this.status === 'open' ? 'close' : 'open';
      this.emit('statuschange', {
        type: 'statuschange',
        target: this,
        originalEvent: event
      }, this);
    }
  }
};

var _default = SelectTreeLeafItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafbox/MSTBItemHolder.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafbox/MSTBItemHolder.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _MCTBItemHolder = _interopRequireDefault(require("../checktreebox/MCTBItemHolder"));

var _ACore = require("../../ACore");

var _SelectTreeLeafItem = _interopRequireDefault(require("./SelectTreeLeafItem"));


function MSTBItemHolder(boxElt, parent, data) {
  this.ref = null;
  this.$list = boxElt.$list;
  this.level = parent.level + 1;
  this.status = 'none';
  this.boxElt = boxElt;
  this.parent = parent;
  this.data = data;
  this._elt = null;
  this.hasDesc = !!data.desc;
  this.hasIcon = !!data.icon;
  this.selected = false;

  if (data.items && data.items.length > 0) {
    this.children = data.items.map(item => new MSTBItemHolder(boxElt, this, item));
    this.hasDesc = this.hasDesc || this.children.some(child => child.hasDesc);
    this.hasIcon = this.hasIcon || this.children.some(child => child.hasIcon);
    this.status = 'close';
  }
}

MSTBItemHolder.prototype.ev_statusChange = _MCTBItemHolder.default.prototype.ev_statusChange;
MSTBItemHolder.prototype.getViewElements = _MCTBItemHolder.default.prototype.getViewElements;

MSTBItemHolder.prototype.select = function (flag) {
  this.selected = flag;

  if (this._elt) {
    this._elt.selected = flag;
  }
};

MSTBItemHolder.prototype.ev_click = function (event) {
  if (this.ref) {
    this.ref.ev_click(event);
  } else {
    this.boxElt.modes.normal.setValue(this.data.value);

    if (this.boxElt.mode !== this.boxElt.modes.normal) {
      this.boxElt.mode.updateSelectedFromRef();
    }

    this.boxElt.notifyPressItem();
  }
};

Object.defineProperty(MSTBItemHolder.prototype, 'elt', {
  get: function () {
    if (!this._elt) {
      this._elt = (0, _ACore._)({
        tag: _SelectTreeLeafItem.default,
        props: {
          data: this.data,
          level: this.level,
          status: this.status,
          selected: this.selected
        },
        on: {
          statuschange: this.ev_statusChange.bind(this),
          click: this.ev_click.bind(this)
        }
      });
    }

    return this._elt;
  }
});
var _default = MSTBItemHolder;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafbox/STLBModes.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafbox/STLBModes.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.STLBModeNormal = STLBModeNormal;
exports.STLBModeSearch = STLBModeSearch;

var _MSTBItemHolder = _interopRequireDefault(require("./MSTBItemHolder"));

var _utils = require("../utils");

var _CTBModes = require("../checktreebox/CTBModes");


function STLBModeNormal(elt, items) {
  this.level = -1;
  this.elt = elt;
  this.$list = elt.$list;
  this.children = items.map(item => new _MSTBItemHolder.default(elt, this, item));
  this.hasDesc = this.hasDesc || this.children.some(child => child.hasDesc);
  this.hasIcon = this.hasIcon || this.children.some(child => child.hasIcon);
  this.dict = this.children.reduce(function visit(ac, child) {
    var key = (0, _utils.keyStringOf)(child.data.value);

    if (ac[key]) {
      console.error('Duplicate value:', ac[key].data, child.data);
    }

    ac[key] = child;

    if (child.children) {
      child.children.reduce(visit, ac);
    }

    return ac;
  }, {});
  this.selectedHolder = null;
}

STLBModeNormal.prototype.getHolderByValue = _CTBModes.CTBModeNormal.prototype.getHolderByValue;

STLBModeNormal.prototype.getItemByValue = function (value) {
  var holder = this.getHolderByValue(value);
  if (holder) return holder.data;
  return null;
};

STLBModeNormal.prototype.getFirstLeafHolder = function () {
  var res = null;

  if (this.children) {
    this.children.some(function visit(node) {
      if (node.data.isLeaf) {
        res = node;
        return true;
      }

      if (node.children) {
        return node.children.some(visit);
      }

      return false;
    });
  }

  return res;
};

STLBModeNormal.prototype.onStart = function () {
  this.$list.clearChild();
  var rootHolders = this.children;
  var viewElements = [];
  rootHolders.forEach(holder => {
    holder.getViewElements(viewElements);
  }, []);
  this.$list.addChild(viewElements);
};

STLBModeNormal.prototype.setValue = function (value, strict) {
  var holder = this.selectedHolder;

  if (holder) {
    holder.select(false);
  }

  holder = this.getHolderByValue(value);
  if (holder && !holder.data.isLeaf) holder = null;

  if (!holder && strict) {
    holder = this.getFirstLeafHolder();
  }

  if (holder && holder.data.isLeaf) {
    holder.select(true);
  }

  this.selectedHolder = holder;
};

STLBModeNormal.prototype.getValue = function (strict) {
  var holder = this.selectedHolder;
  if (strict && !holder) holder = this.getFirstLeafHolder();

  if (holder) {
    return holder.data.value;
  } else {
    throw new Error('Not selected!');
  }
};

STLBModeNormal.prototype.viewToSelected = function () {
  if (!this.selectedHolder) return;

  var visitUp = node => {
    var parent = node.parent;

    if (parent !== this) {
      visitUp(parent);
    }

    if (node.status === 'close') {
      node.elt.status = 'open';
      node.ev_statusChange();
    }
  };

  visitUp(this.selectedHolder);
  (0, _utils.vScrollIntoView)(this.selectedHolder.elt);
};

STLBModeNormal.prototype.onStop = function () {};

function STLBModeSearch(elt, items) {
  this.level = -1;
  this.elt = elt;
  this.$list = this.elt.$list;
  this.children = items.map(item => new _MSTBItemHolder.default(elt, this, item));
  this.dict = this.children.reduce(function visit(ac, child) {
    var key = (0, _utils.keyStringOf)(child.data.value);

    if (ac[key]) {
      console.error('Duplicate value:', ac[key].data, child.data);
    }

    ac[key] = child;

    if (child.children) {
      child.children.reduce(visit, ac);
    }

    return ac;
  }, {});
  this.selectedHolder = null;
}

STLBModeSearch.prototype.updateSelectedFromRef = function () {
  if (this.selectedHolder) this.selectedHolder.select(false);
  this.selectedHolder = null;
  var value = this.elt.value;
  var holder = this.dict[(0, _utils.keyStringOf)(value)];

  if (holder) {
    holder.select(true);
    this.selectedHolder = holder;
  }
};

STLBModeSearch.prototype.onStart = function () {
  STLBModeNormal.prototype.onStart.call(this);
  this.updateSelectedFromRef();
};

STLBModeSearch.prototype.onStop = function () {};
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafbox/MSTLBItemListController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafbox/MSTLBItemListController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _utils = require("../utils");

var _STLBModes = require("./STLBModes");

var _search = _interopRequireWildcard(require("../list/search"));



function MSTLBItemListController(elt) {
  this.elt = elt;
  this.items = [];
  this._searchCache = {};
}

MSTLBItemListController.prototype.setItems = function (items) {
  if (!items || !items.forEach || !items.map) items = [];
  this.items = (0, _utils.copySelectionItemArray)(items, {
    removeNoView: true
  });
  this.update();
};

MSTLBItemListController.prototype.update = function () {
  var mode = new _STLBModes.STLBModeNormal(this.elt, this.items);
  this.elt.modes.normal = mode;
  this.elt.mode = mode;

  if (mode.hasDesc) {
    this.elt.$list.addClass('as-has-desc');
  } else {
    this.elt.$list.removeClass('as-has-list');
  }

  if (mode.hasIcon) {
    this.elt.$list.addClass('as-has-icon');
  } else {
    this.elt.$list.removeClass('as-has-icon');
  }

  this.elt.mode = mode;
  mode.onStart();
  this._searchItems = (0, _search.prepareSearchForList)((0, _utils.copySelectionItemArray)(this.items));
  this._searchCache = {};
};

MSTLBItemListController.prototype.getItems = function () {
  return (0, _utils.copySelectionItemArray)(this.items);
};

MSTLBItemListController.prototype.makeSearch = function (query) {
  if (this._searchCache[query]) return this._searchCache[query].resetAndGet();
  var searchItem = (0, _search.default)({
    text: query
  });
  var minScore = Infinity;
  var maxScore = -Infinity;

  var scoredHolders = this._searchItems.map(function visit(item) {
    var holder = {
      item: item,
      score: (0, _search.calcItemMatchScore)(searchItem, item),
      childMaxScore: -Infinity
    };
    minScore = Math.min(minScore, holder.score);
    maxScore = Math.max(maxScore, holder.score);

    if (item.items && item.items.length > 0) {
      holder.children = item.items.map(visit);
      holder.childMaxScore = holder.children.reduce((ac, cr) => {
        return Math.max(ac, cr.score, cr.childMaxScore);
      }, 0);
    }

    return holder;
  });

  var threshHold = maxScore - (maxScore - minScore) / 3;
  var result = scoredHolders.reduce(function filterVisit(ac, cr) {
    var subItems;

    if (Math.max(cr.score, cr.childMaxScore) >= threshHold) {
      ac.items.push(cr.item);

      if (cr.children && cr.childMaxScore >= cr.score) {
        ac.status[(0, _utils.keyStringOf)(cr.item.value)] = 'open';
        subItems = cr.children.reduce(filterVisit, {
          items: [],
          status: ac.status
        }).items;
        cr.item.items = subItems;
      } else {
        if (cr.children && cr.children.length > 0) {
          ac.status[(0, _utils.keyStringOf)(cr.item.value)] = 'open';
        }
      }
    }

    return ac;
  }, {
    items: [],
    status: {}
  });
  var normalMode = this.elt.modes.normal;
  result.mode = new _STLBModes.STLBModeSearch(this.elt, result.items);

  result.resetAndGet = function () {
    this.mode.children && this.mode.children.forEach(function resetVisit(holder) {
      var key = (0, _utils.keyStringOf)(holder.data.value);
      holder.ref = normalMode.getHolderByValue(holder.data.value);

      if (holder.status === 'open' && result.status[key] !== 'open') {
        holder.status = 'close';

        if (holder._elt) {
          holder._elt.status = 'close';
        }
      } else if (holder.status === 'close' && result.status[key] === 'open') {
        holder.status = 'open';

        if (holder._elt) {
          holder._elt.status = 'open';
        }
      }

      if (holder.children) holder.children.forEach(resetVisit);
    });
    return this.mode;
  };

  this._searchCache[query] = result;
  return result.resetAndGet();
};

var _default = MSTLBItemListController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafbox/STLBPropsHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafbox/STLBPropsHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var STLBPropsHandlers = {};
STLBPropsHandlers.items = {
  set: function (items) {
    var curValue;
    var selected = true;

    if ('pendingValue' in this) {
      curValue = this.pendingValue;
    } else {
      try {
        curValue = this.modes.normal.getValue(this.strictValue);
      } catch (err) {
        selected = false;
      }
    }

    this.itemListCtrl.setItems(items);
    if (selected || this.strictValue) this.modes.normal.setValue(curValue, this.strictValue);

    if (this.mode !== this.modes.normal) {
      this.mode.updateSelectedFromRef();
    }
  },
  get: function () {
    this.itemListCtrl.getItems();
  }
};
STLBPropsHandlers.strictValue = {
  set: function (value) {
    if (value) {
      this.$box.addClass('as-strict-value');
    } else {
      this.$box.removeClass('as-strict-value');
    }

    this.modes.normal.setValue(this.pendingValue, this.strictValue);

    if (this.mode !== this.modes.normal) {
      this.mode.updateSelectedFromRef();
    }
  },
  get: function () {
    return this.$box.hasClass('as-strict-value');
  }
};
STLBPropsHandlers.value = {
  /***
   * @this MSelectTreeLeafBox
   * @param value
   */
  set: function (value) {
    this.pendingValue = value;
    this.modes.normal.setValue(this.pendingValue, this.strictValue);
  },
  get: function () {
    if ('pendingValue' in this) {
      return this.pendingValue;
    } else {
      try {
        return this.modes.normal.getValue(this.strictValue);
      } catch (err) {
        return undefined;
      }
    }
  }
};
STLBPropsHandlers.enableSearch = {
  set: function (value) {
    if (value) {
      this.$box.addClass('as-enable-search');
    } else {
      this.$box.removeClass('as-enable-search');
    }
  },
  get: function () {
    return this.$box.hasClass('as-enable-search');
  }
};
var _default = STLBPropsHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafbox/MSelectTreeLeafBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafbox/MSelectTreeLeafBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _Searcher = _interopRequireDefault(require("../Searcher"));

require("../../css/selecttreeeleafbox.css");

var _MSTLBItemListController = _interopRequireDefault(require("./MSTLBItemListController"));

var _STLBModes = require("./STLBModes");

var _STLBPropsHandlers = _interopRequireDefault(require("./STLBPropsHandlers"));

var _MCheckTreeBox = _interopRequireDefault(require("../checktreebox/MCheckTreeBox"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/****
 * @extends AElement
 * @constructor
 */
function MSelectTreeLeafBox() {
  this.$box = (0, _ACore.$)('.am-dropdown-box', this);
  this.$list = (0, _ACore.$)('.am-select-tree-leaf-box-list', this);
  this.itemListCtrl = new _MSTLBItemListController.default(this);
  this.$searchInput = (0, _ACore.$)(_Searcher.default.tag, this).on('stoptyping', this.eventHandler.searchTextInputModify);
  this.$boxCloseBtn = (0, _ACore.$)('.am-dropdown-box-close-btn', this);
  this.on('click', function (event) {
    if (event.target === this || (0, _EventEmitter.hitElement)(this.$boxCloseBtn, event)) {
      this.emit('close', {
        type: 'close',
        target: this
      }, this);
    }
  }.bind(this));
  this.modes = {
    normal: new _STLBModes.STLBModeNormal(this, []),
    search: null
  };
  this.mode = this.modes.normal;
}

MSelectTreeLeafBox.tag = 'MSelectTreeLeafBox'.toString();

MSelectTreeLeafBox.render = function () {
  return (0, _ACore._)({
    extendEvent: ['pressitem', 'close'],
    class: ['am-modal', 'am-dropdown-box-modal'],
    child: {
      class: ['am-select-tree-leaf-box', 'am-dropdown-box', 'as-dropdown-box-common-style'],
      child: [{
        class: 'am-dropdown-box-header',
        child: [{
          tag: _Searcher.default.tag
        }, {
          tag: 'button',
          class: 'am-dropdown-box-close-btn',
          child: 'span.mdi.mdi-close'
        }]
      }, {
        class: ['am-dropdown-box-body', 'am-select-tree-leaf-box-body'],
        child: {
          class: 'am-select-tree-leaf-box-list'
        }
      }]
    }
  });
};

MSelectTreeLeafBox.prototype.viewToSelected = function () {
  this.modes.normal.viewToSelected();
};

MSelectTreeLeafBox.prototype.notifyPressItem = function () {
  delete this.pendingValue;
  this.emit('pressitem', {
    type: 'pressitem',
    target: this
  }, this);
};

MSelectTreeLeafBox.prototype.getItemByValue = function (value) {
  return this.modes.normal.getItemByValue(value);
};

MSelectTreeLeafBox.prototype.resetSearchState = _MCheckTreeBox.default.prototype.resetSearchState;
MSelectTreeLeafBox.property = _STLBPropsHandlers.default;
MSelectTreeLeafBox.eventHandler = {};
MSelectTreeLeafBox.eventHandler.searchTextInputModify = _MCheckTreeBox.default.eventHandler.searchTextInputModify;

_ACore.default.install(MSelectTreeLeafBox);

var _default = MSelectTreeLeafBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafmenu/STLMPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafmenu/STLMPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _utils = require("../utils");

var STLMPropHandlers = {};
STLMPropHandlers.isFocus = {
  set: function (value) {
    value = !!value;
    if (this.hasClass('as-focus') === value) return;

    if (value) {
      this.addClass('as-focus');
      this.savedValue = this.$box.value;
      this.boxCtrl.onFocus();
      this.$box.viewToSelected();
    } else {
      this.removeClass('as-focus');
      this.boxCtrl.onBlur();
      this.$box.resetSearchState();

      if ((0, _utils.keyStringOf)(this.savedValue) !== (0, _utils.keyStringOf)(this.$box.value)) {
        this._updateText();

        this.notifyChange();
      }
    }
  },
  get: function () {
    return this.hasClass('as-focus');
  }
};
STLMPropHandlers.items = {
  set: function (items) {
    this.$box.items = (0, _utils.copySelectionItemArray)(items, {
      removeNoView: true
    });

    this._updateText();
  },
  get: function () {
    return this.$box.items;
  }
};
STLMPropHandlers.value = {
  set: function (value) {
    this.$box.value = value;

    this._updateText();
  },
  get: function () {
    return this.$box.value;
  }
};
STLMPropHandlers.strictValue = {
  set: function (value) {
    if (value) {
      this.addClass('as-strict-value');
    } else {
      this.removeClass('as-strict-value');
    }

    this.$box.strictValue = value;

    this._updateText();
  },
  get: function () {
    return this.$box.strictValue;
  }
};
STLMPropHandlers.disabled = {
  set: function (value) {
    if (value) {
      this.addClass('as-disabled');
    } else {
      this.removeClass('as-disabled');
    }
  },
  get: function () {
    return this.hasClass('as-disabled');
  }
};
var _default = STLMPropHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafmenu/MSLTLMBoxController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafmenu/MSLTLMBoxController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function MSLTLMBoxController(elt) {
  this.elt = elt;
  this.$box = this.elt.$box;

  for (var key in this) {
    if (key.startsWith('ev_')) this[key] = this[key].bind(this);
  }

  this.elt.on('click', this.ev_click);
  this.$box.on('close', this.ev_boxClose);
}

MSLTLMBoxController.prototype.onFocus = function () {
  this.elt.off('click', this.ev_click);
  this.$box.addTo(document.body);
};

MSLTLMBoxController.prototype.onBlur = function () {
  this.$box.remove();
  setTimeout(() => {
    this.elt.on('click', this.ev_click);
  }, 10);
};

MSLTLMBoxController.prototype.ev_click = function () {
  if (this.elt.disabled || this.elt.readOnly) return;
  this.elt.isFocus = true;
};

MSLTLMBoxController.prototype.ev_boxClose = function () {
  this.elt.isFocus = false;
};

var _default = MSLTLMBoxController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/selecttreeleafmenu/SelectTreeLeafMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/selecttreeleafmenu/SelectTreeLeafMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _STLMPropHandlers = _interopRequireDefault(require("./STLMPropHandlers"));

var _MSelectTreeLeafBox = _interopRequireDefault(require("../selecttreeleafbox/MSelectTreeLeafBox"));

var _MSLTLMBoxController = _interopRequireDefault(require("./MSLTLMBoxController"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


function SelectTreeLeafMenu() {
  this.$box = (0, _ACore._)({
    tag: _MSelectTreeLeafBox.default,
    on: {
      pressitem: this.eventHandler.boxPressItem
    }
  });

  _OOP.default.drillProperty(this, this.$box, 'enableSearch');

  this.$holderItem = (0, _ACore.$)('selectlistitem', this);
  this.boxCtrl = new _MSLTLMBoxController.default(this);
  this.strictValue = true; //default
}

SelectTreeLeafMenu.tag = 'SelectTreeLeafMenu'.toLowerCase();

SelectTreeLeafMenu.render = function () {
  return (0, _ACore._)({
    class: ['am-select-tree-menu', 'absol-selectmenu', 'as-select-menu', 'as-select-tree-leaf-menu'],
    extendEvent: ['change'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: 'absol-selectmenu-holder-item',
      child: 'selectlistitem'
    }, {
      tag: 'button',
      class: 'absol-selectmenu-btn',
      child: ['dropdown-ico']
    }]
  });
};

SelectTreeLeafMenu.prototype._updateText = function () {
  var value = this.value;
  var item = this.$box.getItemByValue(value);
  this.$holderItem.data = item || {
    text: '',
    value: 0
  };
};

SelectTreeLeafMenu.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change',
    target: this
  }, this);
};

SelectTreeLeafMenu.eventHandler = {};

SelectTreeLeafMenu.eventHandler.boxPressItem = function () {
  setTimeout(() => {
    this.isFocus = false;
  }, 100);
};

SelectTreeLeafMenu.property = _STLMPropHandlers.default;
var _default = SelectTreeLeafMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dualselectbox/DSBPropHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dualselectbox/DSBPropHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var DSBPropHandlers = {};
DSBPropHandlers.items = {
  set: function (items) {
    this.itemListCtrl.setItems(items);

    if ('savedValue' in this) {
      this.modes.normal.setValue(this.savedValue, this.strictValue);
    }
  },
  get: function () {
    return this.itemListCtrl.getItems();
  }
};
DSBPropHandlers.value = {
  set: function (value) {
    this.savedValue = value;
    this.modes.normal.setValue(value, this.strictValue);
  },
  get: function () {
    return this.modes.normal.getValue(this.strictValue);
  }
};
DSBPropHandlers.selectedItem = {
  get: function () {
    return this.modes.normal.getSelectedItem();
  }
};
DSBPropHandlers.strictValue = {
  set: function (value) {
    if (value) {
      this.$box.addClass('as-strict-value');
    } else {
      this.$box.removeClass('as-strict-value');
    }
  },
  get: function () {
    return this.$box.hasClass('as-strict-value');
  }
};
DSBPropHandlers.enableSearch = {
  set: function (value) {
    if (value) {
      this.$box.addClass('as-enable-search');
    } else {
      this.$box.removeClass('as-enable-search');
    }
  },
  get: function () {
    return this.$box.hasClass('as-enable-search');
  }
};
var _default = DSBPropHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dualselectbox/DSBModes.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dualselectbox/DSBModes.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DSBModeNormal = DSBModeNormal;
exports.DSBModeSearch = DSBModeSearch;

var _ACore = require("../../ACore");

var _utils = require("../utils");

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


function DSBModeNormal(elt, items) {
  this.items = items;
  this.value = [undefined, undefined];
  this.elt = elt;
  this.$lists = this.elt.$lists;
  this.$leftItems = items.map(item => this._makeLeftItem(item));
  this.$leftItemDict = this.$leftItems.reduce((ac, cr) => {
    ac[(0, _utils.keyStringOf)(cr.itemData.value)] = cr;
    return ac;
  }, {});
  this.$rightItemDict = {};
  this.$rightItems = [];
  this.rightListDict = {};

  if (items.length > 0) {
    this.viewRight(items[0].value);
  }

  this.$selectedLeft = null;
  this.$selectedRight = null;
}

DSBModeNormal.prototype._makeLeftItem = function (item) {
  var self = this;
  var itemElt = (0, _ACore._)({
    class: 'absol-selectlist-item',
    attr: {
      'data-key': (0, _utils.keyStringOf)(item.value)
    },
    child: {
      tag: 'span',
      class: 'absol-selectlist-item-text',
      child: {
        text: item.text
      }
    },
    on: {
      click: function () {
        self.selectLeft(item.value);
        self.viewToSelected();
        self.elt.notifyChange();
      }
    }
  });
  itemElt.itemData = item;
  return itemElt;
};

DSBModeNormal.prototype._makeRightItem = function (leftItem, item) {
  var self = this;
  var itemElt = (0, _ACore._)({
    class: 'absol-selectlist-item',
    attr: {
      'data-key': (0, _utils.keyStringOf)(item.value)
    },
    child: {
      tag: 'span',
      class: 'absol-selectlist-item-text',
      child: {
        text: item.text
      }
    },
    on: {
      click: function () {
        self.selectLeft(leftItem.value);
        self.selectRight(item.value);
        self.elt.notifyChange();
      }
    }
  });
  itemElt.itemData = item;
  return itemElt;
};

DSBModeNormal.prototype.selectLeft = function (leftValue) {
  var itemElt = this.$leftItemDict[(0, _utils.keyStringOf)(leftValue)];
  if (!itemElt) return false;
  if (this.$selectedLeft === itemElt) return true;

  if (this.$selectedLeft) {
    this.$selectedLeft.removeClass('as-selected');
    this.$selectedLeft = null;
  }

  itemElt.addClass('as-selected');
  this.$selectedLeft = itemElt;
  this.value[0] = leftValue;
  this.viewRight(leftValue);
  var ok = this.selectRight(this.value[1]);
  var sItems;

  if (!ok) {
    sItems = itemElt.itemData.items;
    if (sItems && sItems.length > 0) this.selectRight(sItems[0].value);
  }

  return true;
};

DSBModeNormal.prototype.viewRight = function (leftValue) {
  var key = (0, _utils.keyStringOf)(leftValue);
  var holder = this.rightListDict[key];
  var items;
  var leftItem;

  if (!holder) {
    leftItem = this.$leftItemDict[key] && this.$leftItemDict[key].itemData;
    items = leftItem && leftItem.items;

    if (items) {
      holder = {};
      holder.list = items.map(sItem => this._makeRightItem(leftItem, sItem));
      holder.dict = holder.list.reduce((ac, cr) => {
        ac[(0, _utils.keyStringOf)(cr.itemData.value)] = cr;
        return ac;
      }, {});
      this.rightListDict[key] = holder;
    }
  }

  if (holder) {
    if (this.$rightItems !== holder.list) {
      this.$rightItems = holder.list;
      this.$rightItemDict = holder.dict;
      this.$lists[1].clearChild().addChild(this.$rightItems);
    }
  } else {
    this.$lists[1].clearChild();
    this.$rightItems = null;
    this.$rightItemDict = {};
  }
};

DSBModeNormal.prototype.selectRight = function (value) {
  var itemElt = this.$rightItemDict[(0, _utils.keyStringOf)(value)];
  if (!itemElt) return false;
  if (this.$selectedRight === itemElt) return true;

  if (this.$selectedRight) {
    this.$selectedRight.removeClass('as-selected');
    this.$selectedRight = null;
  }

  itemElt.addClass('as-selected');
  this.$selectedRight = itemElt;
  this.value[1] = value;
  return true;
};

DSBModeNormal.prototype.onStart = function () {
  this.$lists[0].clearChild().addChild(this.$leftItems);
  this.$lists[1].clearChild().addChild(this.$rightItems);
  this.viewToSelected();
};

DSBModeNormal.prototype.onStop = _noop.default;

DSBModeNormal.prototype.setValue = function (value, strictValue) {
  if (!(value instanceof Array)) {
    value = [undefined, undefined];
  }

  while (value.length < 2) {
    value.push(undefined);
  }

  while (value.length > 2) value.pop();

  var leftOK = this.selectLeft(value[0]);

  if (!leftOK && strictValue) {
    if (this.items.length > 0) {
      leftOK = this.selectLeft(this.items[0].value);
    }
  }

  if (leftOK) this.viewRight(this.value[0]);
  var rightOK = this.selectRight(value[1]);

  if (!rightOK && strictValue) {
    if (this.$selectedLeft && this.$selectedLeft.itemData.items && this.$selectedLeft.itemData.items.length > 0) {
      rightOK = this.selectRight(this.$selectedLeft.itemData.items[0].value);
    }
  }

  this.viewToSelected();
};

DSBModeNormal.prototype.getValue = function (strictValue) {
  var value = this.value.slice();
  if (!strictValue) return value;

  if (!this.$leftItemDict[(0, _utils.keyStringOf)(value[0])]) {
    value[0] = this.items[0] && this.items[0].value;
  }

  var rightHolder = this.rightListDict[(0, _utils.keyStringOf)(value[0])];

  if (rightHolder) {
    if (!rightHolder.dict[(0, _utils.keyStringOf)(value[1])]) {
      if (rightHolder.list.length > 0) {
        value[1] = rightHolder.list[0].itemData.value;
      }
    }
  }

  return value;
};

DSBModeNormal.prototype.getSelectedItem = function () {
  var value = this.value.slice();
  var item = [null, null];

  if (this.$leftItemDict[(0, _utils.keyStringOf)(value[0])]) {
    item[0] = this.$leftItemDict[(0, _utils.keyStringOf)(value[0])].itemData;
  }

  var rightHolder = this.rightListDict[(0, _utils.keyStringOf)(value[0])];

  if (rightHolder) {
    if (rightHolder.dict[(0, _utils.keyStringOf)(value[1])]) {
      item[1] = rightHolder.dict[(0, _utils.keyStringOf)(value[1])].itemData;
    }
  }

  return item;
};

DSBModeNormal.prototype.viewToSelected = function () {
  setTimeout(() => {
    if (this.$selectedLeft) {
      (0, _utils.vScrollIntoView)(this.$selectedLeft);
    }

    if (this.$selectedRight) {
      (0, _utils.vScrollIntoView)(this.$selectedRight);
    }
  }, 50);
};
/***
 * @extends DSBModeNormal
 * @param elt
 * @param items
 * @constructor
 */


function DSBModeSearch(elt, items) {
  DSBModeNormal.apply(this, arguments);
}

_OOP.default.mixClass(DSBModeSearch, DSBModeNormal);

delete DSBModeSearch.prototype.getValue;
delete DSBModeSearch.prototype.setValue;

DSBModeSearch.prototype.onStart = function () {
  DSBModeNormal.prototype.onStart.call(this);
  this.$lists[0].scrollTop = 0;
  this.$lists[1].scrollTop = 0;

  if (this.$selectedLeft) {
    this.$selectedLeft.removeClass('as-selected');
    this.$selectedLeft = null;
  }

  if (this.$selectedRight) {
    this.$selectedRight.removeClass('as-selected');
    this.$selectedRight = null;
  }
};

DSBModeSearch.prototype.updateSelectedFromRef = function () {
  var normalMode = this.elt.modes.normal;

  if (normalMode.$selectedLeft) {
    this.selectLeft(normalMode.$selectedLeft.itemData.value, true);
  }

  if (normalMode.$selectedRight) {
    this.selectRight(normalMode.$selectedRight.itemData.value, true);
  }
};

DSBModeSearch.prototype.selectLeft = function (leftValue, viewOnly) {
  if (!viewOnly) this.elt.modes.normal.selectLeft(leftValue);
  var itemElt = this.$leftItemDict[(0, _utils.keyStringOf)(leftValue)];
  if (this.$selectedLeft === itemElt) return true;

  if (this.$selectedLeft) {
    this.$selectedLeft.removeClass('as-selected');
    this.$selectedLeft = null;
  }

  if (!itemElt) return false;
  itemElt.addClass('as-selected');
  this.$selectedLeft = itemElt;
  this.viewRight(leftValue);
  var sItems = itemElt.itemData.items;
  if (sItems && sItems.length > 0 && !viewOnly) this.selectRight(sItems[0].value);
  return true;
};

DSBModeSearch.prototype.selectRight = function (value, viewOnly) {
  if (!viewOnly) this.elt.modes.normal.selectRight(value);
  var itemElt = this.$rightItemDict[(0, _utils.keyStringOf)(value)];
  if (this.$selectedRight === itemElt) return true;

  if (this.$selectedRight) {
    this.$selectedRight.removeClass('as-selected');
    this.$selectedRight = null;
  }

  if (!itemElt) return false;
  itemElt.addClass('as-selected');
  this.$selectedRight = itemElt;
  return true;
};
};

moduleFactories["node_modules/absol-acomp/js/dualselectbox/MDSBItemListController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dualselectbox/MDSBItemListController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _utils = require("../utils");

var _search = _interopRequireWildcard(require("../list/search"));

var _DSBModes = require("./DSBModes");



function MDSBItemListController(elt) {
  this.elt = elt;
  this.items = [];
  this._searchItems = [];
  this._searchCache = {};
}

MDSBItemListController.prototype.setItems = function (items) {
  this.items = (0, _utils.copySelectionItemArray)(items);
  this._searchItems = (0, _search.prepareSearchForList)((0, _utils.copySelectionItemArray)(this.items));
  this._searchCache = {};
  var mode = new _DSBModes.DSBModeNormal(this.elt, this.items);
  this.elt.modes.normal = mode;
  this.elt.mode = mode;
  mode.onStart();
};

MDSBItemListController.prototype.getItems = function () {
  return (0, _utils.copySelectionItemArray)(this.items);
};

MDSBItemListController.prototype.makeSearch = function (query) {
  if (this._searchCache[query]) return this._searchCache[query].resetAndGet();
  var items = this._searchItems;
  var queryItem = (0, _search.default)({
    text: query
  });
  var maxScore = 0;
  var holders = items.map(function (item) {
    var h = {
      item: item,
      itemScore: (0, _search.calcItemMatchScore)(queryItem, item)
    };
    maxScore = Math.max(maxScore, h.itemScore);
    var childMaxScore = 0;

    if (item.items && item.items.length > 0) {
      h.child = item.items.map(function (cItem) {
        var cItemScore = (0, _search.calcItemMatchScore)(queryItem, cItem);
        maxScore = Math.max(maxScore, cItemScore);
        childMaxScore = Math.max(childMaxScore, cItemScore);
        return {
          item: cItem,
          itemScore: cItemScore
        };
      });
      h.childScore = childMaxScore;
    }

    return h;
  });
  holders.sort(function (a, b) {
    return -Math.max(a.itemScore, a.childScore) + Math.max(b.itemScore, b.childScore);
  });
  var midScore = maxScore / 2;
  holders = holders.filter(function (holder) {
    return Math.max(holder.itemScore, holder.childScore) >= midScore;
  });
  var searchingResultItems = holders.map(function (holder) {
    var oldItem = holder.item;
    var item = {
      text: oldItem.text,
      value: oldItem.value
    };
    var childHolders;

    if (holder.child) {
      childHolders = holder.child.slice();
      childHolders.sort(function (a, b) {
        return -a.itemScore + b.itemScore;
      });
      item.items = childHolders.map(function (cHolder) {
        return cHolder.item;
      });
      item.isSearchItem = true;
    }

    return item;
  });
  var mode = new _DSBModes.DSBModeSearch(this.elt, searchingResultItems);
  this._searchCache[query] = {
    mode: mode,
    resetAndGet: function () {
      return this.mode;
    }
  };
  return mode;
};

var _default = MDSBItemListController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dualselectbox/MDualSelectBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dualselectbox/MDualSelectBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Searcher = _interopRequireDefault(require("../Searcher"));

var _ACore = require("../../ACore");

var _DSBPropHandlers = _interopRequireDefault(require("./DSBPropHandlers"));

var _MDSBItemListController = _interopRequireDefault(require("./MDSBItemListController"));

var _DSBModes = require("./DSBModes");

require("../../css/dualselectbox.css");

var _utils = require("../utils");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");


/***
 * @extends {AElement}
 * @constructor
 */
function MDualSelectBox() {
  this.$box = (0, _ACore.$)('.am-dropdown-box', this);
  this.$lists = (0, _ACore.$$)('.as-dual-select-box-list', this);
  this.itemListCtrl = new _MDSBItemListController.default(this);
  this.$searchInput = (0, _ACore.$)(_Searcher.default.tag, this).on('stoptyping', this.eventHandler.searchModify);
  this.$closeBtn = (0, _ACore.$)('.am-dropdown-box-close-btn', this);
  this.modes = {
    normal: new _DSBModes.DSBModeNormal(this, [])
  };
  this.mode = this.modes.normal;
  this.strictValue = true;
  this.on('click', this.eventHandler.click);
}

MDualSelectBox.tag = 'MDualSelectBox'.toLowerCase();

MDualSelectBox.render = function () {
  return (0, _ACore._)({
    extendEvent: ['change', 'close'],
    class: ['am-modal', 'am-dropdown-box-modal'],
    child: {
      class: ['am-dual-select-box', 'am-dropdown-box', 'as-dropdown-box-common-style'],
      child: [{
        class: 'am-dropdown-box-header',
        child: [{
          tag: _Searcher.default.tag
        }, {
          tag: 'button',
          class: 'am-dropdown-box-close-btn',
          child: 'span.mdi.mdi-close'
        }]
      }, {
        class: ['am-dropdown-box-body', 'am-check-tree-box-body', 'as-dual-select-box-list-ctn'],
        child: [{
          class: ['as-dual-select-box-list', 'absol-selectlist']
        }, {
          class: 'as-dual-select-box-arrow-ctn',
          child: 'span.mdi.mdi-menu-right'
        }, {
          class: ['as-dual-select-box-list', 'absol-selectlist']
        }]
      }]
    }
  });
};

MDualSelectBox.prototype.viewToSelected = function () {
  this.modes.normal.viewToSelected();
};

MDualSelectBox.prototype.notifyChange = function () {
  var newValue = this.value;

  if ((0, _utils.keyStringOf)(newValue) !== (0, _utils.keyStringOf)(this['savedValue'])) {
    this.savedValue = newValue;
    this.emit('change', {
      type: 'change',
      target: this
    }, this);
  }
};

MDualSelectBox.prototype.resetSearchState = function () {
  this.$searchInput.value = '';
  this.eventHandler.searchModify();
};

MDualSelectBox.property = _DSBPropHandlers.default;
MDualSelectBox.eventHandler = {};

MDualSelectBox.eventHandler.searchModify = function () {
  var query = this.$searchInput.value.trim().replace(/\s+/g, ' ');

  if (query.length > 0) {
    if (this.mode === this.modes.normal) {
      this.mode.onStop();
      this.$box.addClass('as-searching');
    }

    this.mode.search = this.itemListCtrl.makeSearch(query);
    this.mode = this.mode.search;
    this.mode.onStart();
  } else {
    if (this.mode !== this.modes.normal) {
      this.mode.onStop();
      this.mode = this.modes.normal;
      this.mode.onStart();
      this.$box.removeClass('as-searching');
    }
  }
};

MDualSelectBox.eventHandler.click = function (event) {
  if (event.target === this || (0, _EventEmitter.hitElement)(this.$closeBtn, event)) {
    this.emit('close', {
      type: 'close',
      target: this,
      originalEvent: event
    }, this);
  }
};

var _default = MDualSelectBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dualselectmenu/MDSMBoxController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dualselectmenu/MDSMBoxController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function MDSMBoxController(elt) {
  this.elt = elt;
  this.$box = elt.$box;

  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }

  this.elt.on('click', this.ev_click);
  this.$box.on('close', this.ev_close);
}

MDSMBoxController.prototype.ev_click = function () {
  this.elt.isFocus = true;
};

MDSMBoxController.prototype.ev_close = function () {
  this.elt.isFocus = false;
};

MDSMBoxController.prototype.onFocus = function () {
  this.$box.addTo(document.body);
  this.$box.viewToSelected();
  this.elt.off('click', this.ev_click);
};

MDSMBoxController.prototype.onBlur = function () {
  this.$box.remove();
  setTimeout(() => {
    this.elt.on('click', this.ev_click);
  }, 50);
};

var _default = MDSMBoxController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dualselectmenu/DSMPropsHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dualselectmenu/DSMPropsHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _utils = require("../utils");

var _VarScope = _interopRequireDefault(require("absol/src/AppPattern/VarScope"));


var DSMPropsHandlers = {};
DSMPropsHandlers.isFocus = {
  set: function (value) {
    value = !!value;
    if (value === this.hasClass('as-focus')) return;

    if (value) {
      this.savedValue = this.$box.value;
      this.addClass('as-focus');
      this.boxCtrl.onFocus();
    } else {
      this.removeClass('as-focus');
      this.boxCtrl.onBlur();
      this.updateText();

      if ((0, _utils.keyStringOf)(this.savedValue) !== (0, _utils.keyStringOf)(this.$box.value)) {
        delete this.savedValue;
        this.notifyChange();
      }
    }
  },
  get: function () {
    return this.hasClass('as-focus');
  }
};
DSMPropsHandlers.items = {
  set: function (items) {
    this.$box.items = items;

    if ('pendingValue' in this) {
      this.$box.value = this.pendingValue;
    }

    this.updateText();
  },
  get: function () {
    return this.$box.items;
  }
};
DSMPropsHandlers.value = {
  set: function (value) {
    this.pendingValue = value;
    this.$box.value = value;
    this.updateText();
  },
  get: function () {
    if (!this.strictValue && 'pendingValue' in this) {
      return this.pendingValue;
    }

    var value = this.$box.value;
    var selectedItem = this.$box.selectedItem;
    if (!selectedItem || !selectedItem[0] || !selectedItem[1]) return null;
    return value;
  }
};
DSMPropsHandlers.format = {
  set: function (value) {
    this.attr('data-format', value);
    this.updateText();
  },
  get: function () {
    return this.attr('data-format') || '$0, $1';
  }
};
DSMPropsHandlers.strictValue = {
  set: function (value) {
    this.$box.strictValue = value;

    if (value) {
      this.addClass('as-strict-value');
    } else {
      this.removeClass('as-strict-value');
    }
  },
  get: function () {
    return this.$box.strictValue;
  }
};
var _default = DSMPropsHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dualselectmenu/DualSelectMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dualselectmenu/DualSelectMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _MDualSelectBox = _interopRequireDefault(require("../dualselectbox/MDualSelectBox"));

var _MDSMBoxController = _interopRequireDefault(require("./MDSMBoxController"));

var _DSMPropsHandlers = _interopRequireDefault(require("./DSMPropsHandlers"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


function DualSelectMenu() {
  this.$box = (0, _ACore._)({
    tag: _MDualSelectBox.default
  });
  this.$item = (0, _ACore.$)('.absol-selectlist-item', this);

  _OOP.default.drillProperty(this, this.$box, 'enableSearch');

  this.boxCtrl = new _MDSMBoxController.default(this);
  this.strictValue = true;
}

DualSelectMenu.tag = 'DualSelectMenu'.toLowerCase();

DualSelectMenu.render = function () {
  return (0, _ACore._)({
    class: ['am-dual-select-menu', 'absol-selectmenu', 'as-dual-select-menu'],
    extendEvent: ['change'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: 'absol-selectmenu-holder-item',
      child: '.absol-selectlist-item'
    }, {
      tag: 'button',
      class: 'absol-selectmenu-btn',
      child: ['dropdown-ico']
    }, 'attachhook']
  });
};

DualSelectMenu.prototype.notifyChange = function () {
  // console.log('change')
  delete this['pendingValue'];
  this.emit('change', {
    type: 'change',
    target: this
  }, this);
};

DualSelectMenu.prototype.updateText = function () {
  var selectedItem = this.$box.selectedItem;
  var format = this.format;
  var firstToken = '__';
  var secToken = '__';

  if (selectedItem[0]) {
    firstToken = selectedItem[0].text + '';
  }

  if (selectedItem[1]) {
    secToken = selectedItem[1].text + '';
  }

  var text = format.replace('$0', firstToken).replace('$1', secToken);
  this.$item.clearChild().addChild((0, _ACore._)({
    tag: 'span',
    class: 'absol-selectlist-item-text',
    child: {
      text: text
    }
  }));
};

DualSelectMenu.property = _DSMPropsHandlers.default;
DualSelectMenu.eventHandler = {};
var _default = DualSelectMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTHeadCell.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTHeadCell.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

/***
 *
 * @param {TTHeadRow} row
 * @param {TTDHeadCell} data
 * @constructor
 */
function TTHeadCell(row, data) {
  this.row = row;
  this.data = data;
  this.elt = (0, _ACore._)({
    tag: 'th',
    class: 'as-tree-table-head-cell'
  });
  this.row.head.table.elt.mAdapter.renderHeadCell(this.elt, this.data, this);
}

TTHeadCell.prototype.render = function () {};

var _default = TTHeadCell;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTHeadRow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTHeadRow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _TTHeadCell = _interopRequireDefault(require("./TTHeadCell"));


/**
 *
 * @param {TTHead} head
 * @param {TTDHeadRow} data
 * @constructor
 */
function TTHeadRow(head, data) {
  this.head = head;
  this.data = data;
  this.cells = this.data.cells.map(cellData => new _TTHeadCell.default(this, cellData));
  this.elt = (0, _ACore._)({
    tag: 'tr',
    class: 'as-tree-table-head-row'
  });
  this.elt.addChild(this.cells.map((cell, i) => cell.elt.attr('data-col-idx', '' + i)));
}

var _default = TTHeadRow;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTHead.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTHead.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TTHeadRow = _interopRequireDefault(require("./TTHeadRow"));


/***
 *
 * @param {TTTable} table
 * @param {TTDHead} data
 * @constructor
 */
function TTHead(table, data) {
  this.data = data;
  this.table = table;
  this.elt = this.table.elt.$head;
  this.rows = (this.data.rows || []).map(rowData => new _TTHeadRow.default(this, rowData));
  this.elt.clearChild().addChild(this.rows.map(r => r.elt));
}

var _default = TTHead;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTCell.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTCell.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _DTBodyCell = _interopRequireDefault(require("../dynamictable/DTBodyCell"));


/***
 *
 * @param {TTRow} row
 * @param {TTDCell} data
 * @constructor
 */
function TTCell(row, data) {
  this.row = row;
  this.data = data;
}

Object.defineProperty(TTCell.prototype, 'elt', {
  get: function () {
    if (!this._elt) {
      this._elt = (0, _ACore._)({
        tag: 'td',
        class: 'as-tree-table-cell'
      });
      this.row.body.table.elt.mAdapter.renderBodyCell(this.elt, this.data, this);
    }

    return this._elt;
  }
});
Object.defineProperty(TTCell.prototype, 'innerText', Object.getOwnPropertyDescriptor(_DTBodyCell.default.prototype, 'innerText'));
var _default = TTCell;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTRow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTRow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.TTClonedRow = TTClonedRow;
exports.default = void 0;

var _ACore = require("../../ACore");

var _TTCell = _interopRequireDefault(require("./TTCell"));

var _DTBodyRow = _interopRequireDefault(require("../dynamictable/DTBodyRow"));

var _utils = require("../utils");

var _stringGenerate = require("absol/src/String/stringGenerate");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


/***
 *
 * @param {TTBody} body
 * @param {TTDRow}data
 * @param parentRow
 * @constructor
 */
function TTRow(body, data, parentRow) {
  this.id = (0, _stringGenerate.randomIdent)(8);
  this.level = parentRow ? parentRow.level + 1 : 0;
  this.body = body;
  this.data = data;
  this.parentRow = parentRow;
  this.clonedRow = null;
  this.cells = (this.data.cells || []).map(cellData => new _TTCell.default(this, cellData));
  this.subRows = (this.data.subRows || []).map(rowData => new TTRow(body, rowData, this));

  if (!(0, _utils.isNone)(data.id) && data.subRows && data.subRows.length > 0 && data.id in this.body.table.elt.savedState) {
    this.isOpened = !!this.body.table.elt.savedState[data.id];
  } else if (typeof data.initOpened === 'boolean') {
    this.isOpened = data.initOpened;
  } else if (typeof body.table.data.initOpened === "boolean") {
    this.isOpened = body.table.data.initOpened;
  }
}

TTRow.prototype.isOpened = false;
/***
 *
 * @param {Array<AElement>=} ac
 */

TTRow.prototype.getRowElements = function (ac) {
  ac = ac || [];
  ac.push(this.elt);

  if (this.isOpened) {
    this.subRows.forEach(row => row.getRowElements(ac));
  }

  return ac;
};

TTRow.prototype.toggle = function () {
  if (this.isOpened) this.close();else this.open();
};

TTRow.prototype.open = function () {
  if (this.isOpened) return;
  if (this.subRows.length === 0) return;
  this.isOpened = true;
  if (!(0, _utils.isNone)(this.data.id) && this.cells) //real node
    this.body.table.elt.savedState[this.data.id] = this.isOpened;
  this.elt.addClass('as-is-opened');
  var rowElements = this.getRowElements();
  rowElements.shift();
  var bodyElt = this.body.elt;
  var bf = this.body.elt.findChildAfter(this.elt);

  if (bf) {
    rowElements.forEach(elt => bodyElt.addChildBefore(elt, bf));
  } else {
    bodyElt.addChild(rowElements);
  }

  this.updateSizeUp();
};

TTRow.prototype.close = function () {
  if (!this.isOpened) return;
  var rowElements = this.getRowElements();
  rowElements.shift();
  rowElements.forEach(elt => elt.remove());
  this.isOpened = false;
  if (!(0, _utils.isNone)(this.data.id) && this.cells) this.body.table.elt.savedState[this.data.id] = this.isOpened;

  this._elt.removeClass('as-is-opened');

  this.updateSizeUp();
};

TTRow.prototype.updateSizeUp = function () {
  this.body.table.elt.notifySizeChange();
};

TTRow.prototype.remove = function () {
  var idx = -1;
  var rowElements;

  var removeRow = (idx, rows, dataRows) => {
    rows.splice(idx, 1);
    dataRows.splice(idx, 1);
    if (this.clonedRow) this.clonedRow.remove();

    if (this.elt.parentElement) {
      rowElements = this.clonedRow ? this.clonedRow.getRowElements() : this.getRowElements();
      rowElements.forEach(elt => elt.selfRemove());

      _ResizeSystem.default.requestUpdateSignal();
    }

    this.body.table.elt.queryCtrl.requestTransferSearchItems();
  };

  if (this.parentRow) {
    idx = this.parentRow.subRows.indexOf(this);

    if (idx >= 0) {
      removeRow(idx, this.parentRow.subRows, this.parentRow.data.subRows);
      if (this.parentRow.subRows.length === 0) this.parentRow.elt.removeClass('as-has-sub-row');
    }
  } else {
    idx = this.body.rows.indexOf(this);

    if (idx >= 0) {
      removeRow(idx, this.body.rows, this.body.data.rows);
    }
  }
};
/***
 * @param {TTDRow} rowData
 */


TTRow.prototype.addSubRow = function (rowData) {
  var row = new TTRow(this.body, rowData, this);
  var clonedRow;
  if (this.clonedRow) clonedRow = new TTClonedRow(row, null, this.subRows.length); //idx is not important

  var rowElements;
  var bf;

  if (this.elt.parentElement && this.isOpened) {
    rowElements = this.clonedRow ? this.clonedRow.getRowElements() : this.getRowElements();
    bf = this.body.elt.findChildAfter(rowElements[rowElements.length - 1]);
    rowElements = clonedRow ? clonedRow.getRowElements() : row.getRowElements();

    if (bf) {
      rowElements.forEach(elt => this.body.elt.addChildBefore(elt, bf));
    } else {
      rowElements.forEach(elt => this.body.elt.addChild(elt));
    }

    _ResizeSystem.default.requestUpdateSignal();
  }

  this.subRows.push(row);

  if (this.data.subRows) {
    this.data.subRows.push(rowData);
  } else {
    this.data.subRows = [rowData];
  }

  if (this.clonedRow) this.clonedRow.addSubRow(clonedRow);
  if (this._elt) this.elt.addClass('as-has-sub-row');
  this.body.table.elt.queryCtrl.requestTransferSearchItems();
};
/***
 *
 @param {TTDRow} newRowData
 */


TTRow.prototype.replace = function (newRowData) {
  var idx = -1;
  var rowElements;
  var bf;
  var newRow;
  var newClonedRow;
  var needView;

  var makeReplaceRow = (idx, rows, dataRows) => {
    newRow = new TTRow(this.body, newRowData, this.parentRow);
    rows.splice(idx, 1, newRow);
    dataRows.splice(idx, 1, newRowData);

    if (this.clonedRow) {
      newClonedRow = new TTClonedRow(newRow, null, idx);
      this.clonedRow.replace(newClonedRow);
    }

    if (this.elt.parentElement) {
      rowElements = this.clonedRow ? this.clonedRow.getRowElements() : this.getRowElements();
      bf = this.body.elt.findChildAfter(rowElements[rowElements.length - 1]);
      rowElements.forEach(elt => elt.selfRemove());
      rowElements = newClonedRow ? newClonedRow.getRowElements() : newRow.getRowElements();

      if (bf) {
        rowElements.forEach(elt => this.body.elt.addChildBefore(elt, bf));
      } else {
        rowElements.forEach(elt => this.body.elt.addChild(elt));
      }

      _ResizeSystem.default.requestUpdateSignal();
    }

    this.body.table.elt.queryCtrl.requestTransferSearchItems();
  };

  if (this.parentRow) {
    idx = this.parentRow.subRows.indexOf(this);

    if (idx >= 0) {
      makeReplaceRow(idx, this.parentRow.subRows, this.parentRow.data.subRows);
    }
  } else {
    idx = this.body.rows.indexOf(this);

    if (idx >= 0) {
      makeReplaceRow(idx, this.body.rows, this.body.data.rows);
    }
  }
};
/***
 *
 @param {TTDRow} newRowData
 */


TTRow.prototype.addRowBefore = function (newRowData) {
  var idx = -1;

  var makeNewRowBefore = (idx, rows, dataRows) => {
    var row, clonedRow;
    var rowElements;
    row = new TTRow(this.body, newRowData, this.parentRow);

    if (this.clonedRow) {
      clonedRow = new TTClonedRow(row, null, idx);
    }

    if (this.elt.parentElement) {
      rowElements = clonedRow ? clonedRow.getRowElements() : row.getRowElements();
      rowElements.forEach(elt => this.body.elt.addChildBefore(elt, this.elt));

      _ResizeSystem.default.requestUpdateSignal();
    }

    rows.splice(idx, 0, row);
    dataRows.splice(idx, 0, newRowData);

    if (this.clonedRow) {
      this.clonedRow.addRowBefore(clonedRow);
    }

    this.body.table.elt.queryCtrl.requestTransferSearchItems();
  };

  if (this.parentRow) {
    idx = this.parentRow.subRows.indexOf(this);

    if (idx >= 0) {
      makeNewRowBefore(idx, this.parentRow.subRows, this.parentRow.data.subRows);
    }
  } else {
    idx = this.body.rows.indexOf(this);

    if (idx >= 0) {
      makeNewRowBefore(idx, this.body.rows, this.body.data.rows);
    }
  }
};
/***
 *
 @param {TTDRow} newRowData
 */


TTRow.prototype.addRowAfter = function (newRowData) {
  var idx = -1;
  var rowElements;
  var bf;

  var makeNewRowAfter = (idx, rows, dataRows) => {
    var row = new TTRow(this.body, newRowData, this.parentRow);
    var clonedRow;
    if (this.clonedRow) clonedRow = new TTClonedRow(row, null, idx);

    if (this.elt.parentElement) {
      rowElements = this.clonedRow ? this.clonedRow.getRowElements() : this.getRowElements();
      bf = this.body.elt.findChildAfter(rowElements[rowElements.length - 1]);
      rowElements = clonedRow ? clonedRow.getRowElements() : row.getRowElements();

      if (bf) {
        rowElements.forEach(elt => this.body.elt.addChildBefore(elt, bf));
      } else {
        rowElements.forEach(elt => this.body.elt.addChild(elt));
      }

      _ResizeSystem.default.requestUpdateSignal();
    }

    rows.splice(idx + 1, 0, row);
    dataRows.splice(idx + 1, 0, newRowData);
    if (this.clonedRow) this.clonedRow.addRowBefore(clonedRow);
    this.body.table.elt.queryCtrl.requestTransferSearchItems();
  };

  if (this.parentRow) {
    idx = this.parentRow.subRows.indexOf(this);

    if (idx >= 0) {
      makeNewRowAfter(idx, this.parentRow.subRows, this.parentRow.data.subRows);
    }
  } else {
    idx = this.body.rows.indexOf(this);

    if (idx >= 0) {
      makeNewRowAfter(idx, this.body.rows, this.body.data.rows);
    }
  }
};

Object.defineProperty(TTRow.prototype, 'elt', {
  get: function () {
    if (!this._elt) {
      this._elt = (0, _ACore._)({
        tag: 'tr',
        class: 'as-tree-table-row',
        attr: {
          'data-level': this.level + ''
        }
      });
      if (this.data.id) this._elt.attr('data-id', this.data.id);
      if (this.isOpened) this._elt.addClass('as-is-opened');
      if (this.subRows.length > 0) this._elt.addClass('as-has-sub-row');

      this._elt.addChild(this.cells.map((cell, i) => cell.elt.attr('data-col-idx', i + '')));

      this.$toggle = (0, _ACore.$)('.as-tree-table-toggle', this._elt);

      if (this.$toggle) {
        this.$toggleCell = this.$toggle.parentElement;
        this.$toggleCell.addClass('as-has-toggle');
        this.$toggle = (0, _ACore._)({
          elt: this.$toggle,
          child: 'toggler-ico',
          on: {
            click: () => {
              if (this.clonedRow) {
                this.clonedRow.toggle();
              } else {
                this.toggle();
              }
            }
          }
        });
      }
    }

    return this._elt;
  }
});
Object.defineProperty(TTRow.prototype, 'innerText', Object.getOwnPropertyDescriptor(_DTBodyRow.default.prototype, 'innerText'));
var _default = TTRow;
/***
 *
 * @param {TTRow} origin
 * @param queryResult
 * @param idx
 * @constructor
 */

exports.default = _default;

function TTClonedRow(origin, queryResult, idx) {
  this.body = origin.body;
  this.idx = idx;
  this.id = origin.id;
  this._elt = origin.elt;
  this.elt = origin.elt;
  this.data = origin.data;
  this.origin = origin;
  this.score = queryResult && queryResult[this.id];
  if (!queryResult) this.score = 1e6;
  this.isOpened = this.score && this.score[0] <= this.score[1];
  this.attach();

  if (this.isOpened) {
    this.subRows = this.origin.subRows.filter(row => queryResult[row.id]).map((row, i) => new TTClonedRow(row, queryResult, i));
    this.subRows.sort((a, b) => {
      var sa = a.score[1];
      var sb = b.score[1];
      if (sa !== sb) return sb - sa;
      return a.idx - b.idx;
    });
  } else {
    this.subRows = this.origin.subRows.map((row, i) => new TTClonedRow(row, queryResult, i));
  }
}

['toggle', 'open', 'close', 'getRowElements', 'updateSizeUp'].forEach(key => {
  TTClonedRow.prototype[key] = TTRow.prototype[key];
});

TTClonedRow.prototype.remove = function () {
  var parentRow = this.origin.parentRow && this.origin.parentRow.clonedRow;
  var idx;

  if (parentRow) {
    idx = parentRow.subRows.indexOf(this);

    if (idx >= 0) {
      parentRow.subRows.splice(idx, 1);
    }
  } else {
    idx = this.origin.body.clonedRows.indexOf(this);

    if (idx >= 0) {
      this.origin.body.clonedRows.splice(idx, 1);
    }
  }
};

TTClonedRow.prototype.replace = function (newClonedRow) {
  var parentRow = this.origin.parentRow && this.origin.parentRow.clonedRow;
  var idx;

  if (parentRow) {
    idx = parentRow.subRows.indexOf(this);

    if (idx >= 0) {
      parentRow.subRows.splice(idx, 1, newClonedRow);
    }
  } else {
    idx = this.origin.body.clonedRows.indexOf(this);

    if (idx >= 0) {
      this.origin.body.clonedRows.splice(idx, 1, newClonedRow);
    }
  }
};

TTClonedRow.prototype.addRowBefore = function (newClonedRow) {
  var parentRow = this.origin.parentRow && this.origin.parentRow.clonedRow;
  var idx;

  if (parentRow) {
    idx = parentRow.subRows.indexOf(this);

    if (idx >= 0) {
      parentRow.subRows.splice(idx, 0, newClonedRow);
    }
  } else {
    idx = this.origin.body.clonedRows.indexOf(this);

    if (idx >= 0) {
      this.origin.body.clonedRows.splice(idx, 0, newClonedRow);
    }
  }
};

TTClonedRow.prototype.addRowAfter = function (newClonedRow) {
  var parentRow = this.origin.parentRow && this.origin.parentRow.clonedRow;
  var idx;

  if (parentRow) {
    idx = parentRow.subRows.indexOf(this);

    if (idx >= 0) {
      parentRow.subRows.splice(idx + 1, 0, newClonedRow);
    }
  } else {
    idx = this.origin.body.clonedRows.indexOf(this);

    if (idx >= 0) {
      this.origin.body.clonedRows.splice(idx + 1, 0, newClonedRow);
    }
  }
};

TTClonedRow.prototype.addSubRow = function (newClonedRow) {
  this.subRows.push(newClonedRow);
};

TTClonedRow.prototype.attach = function () {
  if (this.isOpened) {
    this.origin.elt.addClass('as-is-opened');
  } else {
    this.origin.elt.removeClass('as-is-opened');
  }

  this.origin.clonedRow = this;
};

TTClonedRow.prototype.detach = function () {
  if (this.origin.isOpened) {
    this.origin.elt.addClass('as-is-opened');
  } else {
    this.origin.elt.removeClass('as-is-opened');
  }

  this.origin.clonedRow = null;
  this.subRows.forEach(row => row.detach());
};
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTBody.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTBody.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TTRow = _interopRequireWildcard(require("./TTRow"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




/***
 *
 * @param {TTTable}table
 * @param {TTDBody} data
 * @constructor
 */
function TTBody(table, data) {
  this.table = table;
  this.data = data;
  this.elt = this.table.elt.$body;
  /***
   *
   * @type {TTRow[]}
   */

  this.rows = (this.data.rows || []).map(rowData => new _TTRow.default(this, rowData, null));
  this.clonedRows = null;
  this.renderRows();
}

TTBody.prototype.applyQueryResult = function (queryResult) {
  this.clearClonedRows();

  if (queryResult) {
    this.clonedRows = this.rows.filter(row => queryResult[row.id]).map((row, i) => new _TTRow.TTClonedRow(row, queryResult, i));
    this.clonedRows.sort((a, b) => {
      var sa = a.score[1];
      var sb = b.score[1];
      if (sa !== sb) return sb - sa;
      return a.idx - b.idx;
    });
    this.renderRows(this.clonedRows);
    this.table.elt.notifySizeChange();
  } else {
    this.renderRows();
  }
};

TTBody.prototype.clearClonedRows = function () {
  if (this.clonedRows) this.clonedRows.forEach(row => row.detach());
  this.clonedRows = null;
};
/***
 *
 */


TTBody.prototype.renderRows = function (rows) {
  rows = rows || this.rows;
  this.elt.clearChild().addChild(rows.reduce((ac, row) => {
    row.getRowElements(ac);
    return ac;
  }, []));
};
/***
 *
 * @param data
 */


TTBody.prototype.rowOf = function (data) {
  if (data instanceof _TTRow.default) {
    data = data.data;
  }

  var result = null;
  var queue = this.rows.slice();
  var cr;

  while (queue.length > 0 && !result) {
    cr = queue.shift();

    if (cr.data === data || cr.data.id === data || data.id && cr.data.id === data.id) {
      result = cr;
    } else {
      queue.push.apply(queue, cr.subRows);
    }
  }

  return result;
};
/***
 *
 * @param {TTDRow} rowData
 */


TTBody.prototype.addRow = function (rowData) {
  var row = new _TTRow.default(this, rowData, null);
  this.data.rows.push(rowData);
  this.rows.push(row);
  var elements = row.getRowElements();
  elements.forEach(elt => this.elt.addChild(elt));

  _ResizeSystem.default.requestUpdateSignal();
};

var _default = TTBody;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TTHead = _interopRequireDefault(require("./TTHead"));

var _TTBody = _interopRequireDefault(require("./TTBody"));


/***
 *
 * @param {TreeTable} elt
 * @param data
 * @constructor
 */
function TTTable(elt, data) {
  this.data = data;
  this.elt = elt;
  this.head = new _TTHead.default(this, this.data.head);
  this.body = new _TTBody.default(this, this.data.body);
}

var _default = TTTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTDataAdapter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTDataAdapter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _TTTable = _interopRequireDefault(require("./TTTable"));


/***
 *
 * @param {TreeTable} tableElt
 * @param opt
 * @constructor
 */
function TTDataAdapter(tableElt, opt) {
  this.tableElt = tableElt;
  this.data = null;
  Object.assign(this, opt || {});
}

TTDataAdapter.prototype.render = function () {
  if (this.tableElt.table) {}

  this.tableElt.table = new _TTTable.default(this.tableElt, this.data);
};
/***
 *
 * @param {AElement} elt
 * @param {TTDHeadCell} data
 * @param {TTHeadCell} controller
 */


TTDataAdapter.prototype.renderHeadCell = function (elt, data, controller) {
  if (data.child) {
    if (data.child.map) {
      elt.addChild(data.child.map(function (it) {
        return (0, _ACore._)(it);
      }));
    } else {
      elt.addChild((0, _ACore._)(data.child));
    }
  }

  if (data.render) {
    data.render.call(null, elt, data, controller);
  }

  if (data.style) {
    elt.addStyle(data.style);
  }
};
/***
 *
 * @param {AElement} elt
 * @param {TTDCell} data
 * @param {TTCell} controller
 */


TTDataAdapter.prototype.renderBodyCell = function (elt, data, controller) {
  if (data.child) {
    if (data.child.map) {
      elt.addChild(data.child.map(function (it) {
        return (0, _ACore._)(it);
      }));
    } else {
      elt.addChild((0, _ACore._)(data.child));
    }
  }

  if (data.render) {
    data.render.call(null, elt, data, controller);
  }

  if (data.style) {
    elt.addStyle(data.style);
  }

  if (data.class) {
    elt.addClass(data.class);
  }

  if (data.attr) {
    elt.attr(data.attr);
  }
};

var _default = TTDataAdapter;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/treetable/TTQueryController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TTQueryController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

var _ListSearchMaster = _interopRequireDefault(require("../list/ListSearchMaster"));


/***
 *
 * @param {TreeTable} elt
 * @constructor
 */
function TTQueryController(elt) {
  this.searchMaster = new _ListSearchMaster.default();
  this.elt = elt;
  this.$filterInputs = [];
  this.$searchInput = null;
  this['request'] = this['request'].bind(this);

  this._waitDestroy();

  this._rtsiIdx = -1;
}

TTQueryController.prototype._waitDestroy = function () {
  setTimeout(() => {
    if (this.elt.isDescendantOf(document.body)) {
      this._waitDestroy();
    } else {
      this.searchMaster.destroy();
    }
  }, 10000);
};

TTQueryController.prototype.attachFilterInput = function (input) {
  if (this.$filterInputs.indexOf(input) >= 0) return;
  if (input.detachTreeTable) input.detachTreeTable();
  input.$treeTable = this;

  if ((0, _ACore.$)(input).isSupportedEvent('stoptyping')) {
    input.on('stoptyping', this.request);
  } else {
    input.on('change', this.request);
  }

  input.detachTreeTable = this.detachFilterInput.bind(this, input);
  this.$filterInputs.push(input);
};

TTQueryController.prototype.detachFilterInput = function (input) {
  var idx = this.$filterInputs.indexOf(input);
  if (idx < 0) return;
  this.$filterInputs.splice(idx, 1);
  input.off(this.$searchInput.isSupportedEvent('stoptyping') ? 'stoptyping' : 'change', this.request);
  input.detachTreeTable = null;
};

TTQueryController.prototype.attachSearchInput = function (input) {
  if (this.$searchInput === input) return;
  if (input.detachTreeTable) input.detachTreeTable();
  this.$searchInput = input;

  if ((0, _ACore.$)(input).isSupportedEvent('stoptyping')) {
    input.on('stoptyping', this.request);
  } else {
    input.on('change', this.request);
  }

  input.detachTreeTable = this.detachSearchInput.bind(this, input);
};

TTQueryController.prototype.detachSearchInput = function (input) {
  input = input || this.$searchInput;
  if (input !== this.$searchInput) return;
  input.off(this.$searchInput.isSupportedEvent('stoptyping') ? 'stoptyping' : 'change', this.request);
  input.detachTreeTable = null;
  this.$searchInput = null;
};

TTQueryController.prototype.makeQuery = function () {
  var res = {};

  if (this.$searchInput && this.$searchInput.value.trim().length > 0) {
    res.text = this.$searchInput.value.trim();
  }

  for (var key in res) {
    return res;
  }

  return null;
};

TTQueryController.prototype.request = function () {
  var query = this.makeQuery();
  if (query) this.searchMaster.query(query).then(searchResult => {
    this.elt.table.body.applyQueryResult(searchResult);
  });else this.elt.table.body.applyQueryResult(null);
};

TTQueryController.prototype.getSearchItems = function () {
  var getSearchItemOf = row => {
    var res = {};
    res.text = row.innerText;
    res.value = row.id;

    if (row.subRows && row.subRows.length > 0) {
      res.items = row.subRows.map(getSearchItemOf);
    }

    return res;
  };

  return this.elt.table.body.rows.map(getSearchItemOf);
};

TTQueryController.prototype.transferSearchItems = function () {
  this.searchMaster.transfer(this.getSearchItems());
};

TTQueryController.prototype.requestTransferSearchItems = function () {
  if (this._rtsiIdx > 0) return;
  this._rtsiIdx = setTimeout(() => {
    this._rtsiIdx = -1;
    this.transferSearchItems();
  }, 0);
};

var _default = TTQueryController;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/LinearColorTinyBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/LinearColorTinyBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _LinearColorBar = _interopRequireDefault(require("./LinearColorBar"));

var _ACore = _interopRequireWildcard(require("../ACore"));

var _printer = require("absol/src/Print/printer");

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));




/***
 * @extends {AElement}
 * @constructor
 */
function LinearColorTinyBar() {
  this._value = 0;
  this._colorMapping = 0;
  this._colorMapping = this.BUILDIN_COLORS_RANGE.rainbow;
  /***
   *
   * @type {Text}
   */

  this.$text = (0, _ACore.$)('.as-linear-color-tiny-text', this).firstChild;
  /***
   * @type {string} valueText
   * @memberOf LinearColorTinyBar#
   * @name valueText
   */

  /***
   * @type {number}  from 0..1..Inf
   * @memberOf LinearColorTinyBar#
   * @name value
   */

  /***
   * @type {Array} - from 0..1..Inf
   * @memberOf LinearColorTinyBar#
   * @name colorMapping#
   */
}

LinearColorTinyBar.tag = 'LinearColorTinyBar'.toLowerCase();

LinearColorTinyBar.render = function () {
  return (0, _ACore._)({
    class: 'as-linear-color-tiny-bar',
    child: [{
      tag: 'span',
      class: 'as-linear-color-tiny-text',
      child: {
        text: '0.00%'
      }
    }, '.as-linear-color-tiny-bar-rect']
  });
};

LinearColorTinyBar.prototype.BUILDIN_COLORS_RANGE = _LinearColorBar.default.prototype.BUILDIN_COLORS_RANGE;

LinearColorTinyBar.prototype._updateColor = function () {
  var value = this._value;
  var colorMapping = this.colorMapping;
  var i = 0;

  while (i < colorMapping.length) {
    if (i + 1 == colorMapping.length || colorMapping[i + 1].value > value) break;
    ++i;
  }

  this.addStyle('--color', colorMapping[i].color + '');
};

LinearColorTinyBar.property = {};
LinearColorTinyBar.property.value = {
  set: function (value) {
    if (typeof value === "string") value = parseFloat(value);
    if (typeof value !== "number") value = 0;
    if (isNaN(value)) value = 0;
    this._value = Math.max(value, 0);
    this.addStyle('--value', this._value + '');

    this._updateColor();
  },
  get: function () {
    return this._value;
  }
};
LinearColorTinyBar.property.valueText = {
  set: function (value) {
    this.$text.data = value;
  },
  get: function () {
    return this.$text.data;
  }
};
LinearColorTinyBar.property.colorMapping = {
  set: function (value) {
    var ok = true;

    if (typeof value === 'string') {
      if (!(value in this.BUILDIN_COLORS_RANGE)) {
        value = 'rainbow';
      }

      value = this.BUILDIN_COLORS_RANGE[value];
    } else if (value instanceof Array) {
      ok = value.length > 1;

      if (!ok) {
        console.warn("colorMapping.length must > 1", value);
      }
    } else {
      console.warn("Invalid colorMapping", value);
    }

    if (!ok) value = this.BUILDIN_COLORS_RANGE.rainbow;
    this._colorMapping = value;

    this._updateColor();
  },
  get: function () {
    return this._colorMapping;
  }
};

_ACore.default.install(LinearColorTinyBar);

var _default = LinearColorTinyBar;
exports.default = _default;

_printer.ShareSerializer.addHandlerBefore({
  match: (elt, scope, stack) => {
    return elt.hasClass && elt.hasClass('as-linear-color-tiny-bar-rect');
  },
  exec: (printer, elt, scope, stack, accept) => {
    var bound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    bound.x -= printer.O.x;
    bound.y -= printer.O.y;
    printer.rect(bound, {
      fill: elt.getComputedStyleValue('background-color')
    });
  }
}, '*');
};

moduleFactories["node_modules/absol-acomp/js/treetable/TreeTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/treetable/TreeTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ttStructAdapter2TTDAdapter = ttStructAdapter2TTDAdapter;
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _TTDataAdapter = _interopRequireDefault(require("./TTDataAdapter"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _DynamicCSS = _interopRequireDefault(require("absol/src/HTML5/DynamicCSS"));

require("../../css/treetable.css");

var _TTQueryController = _interopRequireDefault(require("./TTQueryController"));

var _datetime = require("absol/src/Time/datetime");

var _LinearColorTinyBar = _interopRequireDefault(require("../LinearColorTinyBar"));

var _utils = require("../utils");

var _attribute = require("absol/src/JSX/attribute");

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _printer = require("absol/src/Print/printer");




/***
 * @typedef {Object} TTDHeadCell
 * @property {AbsolConstructDescriptor|Array<AbsolConstructDescriptor>|AElement} [child]
 * @property {function(elt:AElement, data:TTDHeadCell, controller:TTCell): void} render
 * @property {CSSStyleDeclaration} style
 */

/***
 * @typedef {Object} TTDHeadRow
 * @property {Array<TTDHeadCell>} cells
 * @property {Array<TTDHeadRow>} subRows
 */

/***
 * @typedef {Object} TTDHead
 * @property {Array<TTDHeadRow>} rows
 */

/***
 * @typedef {Object} TTDCell
 * @property {AbsolConstructDescriptor|Array<AbsolConstructDescriptor>|AElement} [child]
 * @property {function(elt:AElement, data:TTDCell, controller:TTCell): void} render
 * @property {CSSStyleDeclaration} [style]
 * @property {string|Array<string>} class
 * @property {Object} attr
 */

/***
 * @typedef {Object} TTDRow
 * @property {Array<TTDCell>} cells
 * @property {Array<TTDRow>} subRows
 * @property {string} [id]
 *
 */

/***
 * @typedef {Object} TTDHead
 * @property {Array<TTDHeadRow>} rows
 */

/***
 * @typedef {Object} TTDBody
 * @property {Array<TTDRow>} rows
 */

/***
 * @typedef {Object} TTData
 * @property {TTDHead} head
 * @property {TTDBody} body
 * @property {boolean} [initOpened]
 */

/***
 * @typedef {Object} TTDAdapter
 * @property {TTData} data
 */
var loadCss = () => {
  var dynamicCss = new _DynamicCSS.default();
  dynamicCss.setRules(Array(20).fill(null).reduce((ac, cr, i) => {
    ac[`.as-tree-table-row[data-level="${i}"] .as-tree-table-toggle::before`] = {
      width: 2 * i + 'em'
    };
    ac[['.as-tree-table.as-hide-col-' + i + ' td[data-col-idx="' + i + '"]', '.as-tree-table.as-hide-col-' + i + ' th[data-col-idx="' + i + '"]'].join(',')] = {
      display: 'none'
    };
    ac[`.as-tree-table-row[data-level="${i}"] .as-tree-table-cell.as-has-toggle`] = {
      'padding-left': `calc(5px + ${2 * i + 1.5}em)`
    };
    ac[`.as-printer-content .as-tree-table-row[data-level="${i}"] .as-tree-table-cell.as-has-toggle`] = {
      'padding-left': `calc(5px + ${2 * i}em)`
    };
    return ac;
  }, {})).commit();
  loadCss = _noop.default;
};
/***
 * @extends AElement
 * @constructor
 */


function TreeTable() {
  loadCss();
  this._hiddenColumns = [];
  this.$head = (0, _ACore.$)('thead', this);
  this.$body = (0, _ACore.$)('tbody', this);
  this.savedState = {};
  /**
   *
   * @type {null|TTTable}
   */

  this.table = null;
  /***
   *
   * @type {null|TTDataAdapter}
   */

  this.mAdapter = null;
  this.queryCtrl = new _TTQueryController.default(this);
  /***
   * @name adapter
   * @type TTDAdapter
   * @memberOf TreeTable#
   */

  /***
   * @name searchInput
   * @type SearchTextInput
   * @memberOf TreeTable#
   */
}

TreeTable.tag = 'TreeTable'.toLowerCase();

TreeTable.render = function () {
  return (0, _ACore._)({
    tag: 'table',
    class: 'as-tree-table',
    child: [{
      tag: 'thead',
      class: 'as-tree-table-head'
    }, {
      tag: 'tbody'
    }]
  });
};

TreeTable.prototype.removeRow = function (rowData) {
  if (!this.table) return;
  var row = this.table.body.rowOf(rowData);
  if (row) row.remove();
};

TreeTable.prototype.replaceRow = function (rowData, oldRowData) {
  if (!this.table) return;
  var row = this.table.body.rowOf(oldRowData);
  if (row) row.replace(rowData);
};
/***
 *
 * @param rowData
 * @param {any|null} parentRow
 */


TreeTable.prototype.addRowIn = function (rowData, parentRow) {
  if (!this.table) return;
  var row;

  if (parentRow) {
    row = this.table.body.rowOf(parentRow);
    if (row) row.addSubRow(rowData);else {
      console.error('Can not find row', parentRow);
    }
  } else {
    this.table.body.addRow(rowData);
  }
};
/***
 *
 * @param rowData
 * @param {any|null} bfRow
 */


TreeTable.prototype.addRowBefore = function (rowData, bfRow) {
  if (!this.table) return;
  var row;

  if (bfRow) {
    row = this.table.body.rowOf(bfRow);
    if (row) row.addRowBefore(rowData);else {
      console.error('Can not find row', bfRow);
    }
  } else {
    this.table.body.addRow(rowData);
  }
};
/***
 *
 * @param rowData
 * @param {any|null} atRow
 */


TreeTable.prototype.addRowAfter = function (rowData, atRow) {
  if (!this.table) return;
  var row;

  if (atRow) {
    row = this.table.body.rowOf(atRow);
    if (row) row.addRowAfter(rowData);else {
      console.error('Can not find row', atRow);
    }
  } else {
    if (this.table.body.rows.length === 0) {
      this.table.body.addRow(rowData);
    } else {
      this.table.body.rows[0].addRowBefore(rowData);
    }
  }
};

TreeTable.prototype.rowOf = function (rowData) {
  return this.table.body.rowOf(rowData);
};

TreeTable.prototype.notifySizeChange = function () {
  var c = this.parentElement;

  while (c) {
    if (typeof c.updateSize === 'function') c.updateSize();
    c = c.parentElement;
  }
};

TreeTable.prototype.attachSearchInput = function (input) {
  this.searchInput = input;
};

TreeTable.property = {};
TreeTable.property.adapter = {
  set: function (adapter) {
    if (adapter.type === 'struct') {
      adapter = ttStructAdapter2TTDAdapter(adapter);
    }

    this._adapterData = adapter;
    this.mAdapter = new _TTDataAdapter.default(this, adapter);
    this.mAdapter.render();
    this.queryCtrl.transferSearchItems();
    var c = this.parentElement;

    while (c) {
      if (c.hasClass && c.hasClass('absol-table-vscroller') && c.update) {
        c.update();
        break;
      }

      c = c.parentElement;
    }
  },
  get: function () {
    return this._adapterData;
  }
};
TreeTable.property.filterInputs = {
  set: function (inputs) {},
  get: function () {}
};
TreeTable.property.searchInput = {
  set: function (input) {
    if (input) this.queryCtrl.attachSearchInput(input);else this.queryCtrl.detachSearchInput();
  },
  get: function () {
    return this.queryCtrl.$searchInput;
  }
};
TreeTable.property.hiddenColumns = {
  set: function (value) {
    value = value || [];

    this._hiddenColumns.forEach(function (idxV) {
      this.removeClass('as-hide-col-' + idxV);
    }.bind(this));

    this._hiddenColumns = value;

    this._hiddenColumns.forEach(function (idxV) {
      this.addClass('as-hide-col-' + idxV);
    }.bind(this));

    var c = this.parentElement;

    while (c) {
      if (c.hasClass && c.hasClass('absol-table-vscroller') && c.update) {
        c.update();
        break;
      }

      c = c.parentElement;
    }
  },
  get: function () {
    return this._hiddenColumns;
  }
};

_ACore.default.install(TreeTable);

var _default = TreeTable;
/***
 *
 * @param adapterData
 * @returns {TTDAdapter}
 */

exports.default = _default;

function ttStructAdapter2TTDAdapter(adapterData) {
  var toString = {
    'Date': x => x ? (0, _datetime.formatDateTime)(x, 'dd/MM/yyyy') : '',
    'DateTime': x => x ? (0, _datetime.formatDateTime)(x, 'dd/MM/yyyy HH:mm') : '',
    text: x => (x || '') + ''
  };

  var getItemDict = desc => {
    var dict = desc.__dict__;

    if (!dict) {
      Object.defineProperty(desc, '__dict__', {
        enumerable: false,
        writable: true,
        configurable: true,
        value: (desc.items || []).reduce(function makeDict(ac, cr) {
          var key = (0, _utils.keyStringOf)(cr.value);
          ac[key] = cr;

          if (cr.items && cr.items.reduce) {
            cr.items.reduce(makeDict, ac);
          }

          return ac;
        }, {})
      });
      dict = desc.__dict__;
    }

    return dict;
  };

  var handlers = {
    'Date': x => [{
      tag: 'span',
      child: {
        text: x ? (0, _datetime.formatDateTime)(x, 'dd/MM/yyyy') : ''
      }
    }],
    'DateTime': x => [{
      tag: 'span',
      child: {
        text: x ? (0, _datetime.formatDateTime)(x, 'dd/MM/yyyy HH:mm') : ''
      }
    }],
    text: x => [{
      tag: 'span',
      child: {
        text: (x || '') + ''
      }
    }],
    performance: (x, desc) => {
      return [{
        tag: _LinearColorTinyBar.default.tag,
        props: {
          colorMapping: desc.colorMapping || 'performance',
          value: x,
          extend: typeof desc.extend === "number" && desc.extend > 0 ? desc.extend : 0.5,
          valueText: typeof x === 'number' ? (x * 100).toFixed(2) + '%' : x + ''
        }
      }];
    },
    enum: (x, desc) => {
      var dict = getItemDict(desc);
      var item = dict[(0, _utils.keyStringOf)(x)];
      if (item) return [{
        tag: 'span',
        child: {
          text: item.text
        }
      }];else return [{
        tag: 'span',
        child: {
          text: ''
        }
      }];
    },
    '{enum}': (x, desc) => {
      var dict = getItemDict(desc);
      if (!(x instanceof Array)) return [{
        tag: 'span',
        child: {
          text: ''
        }
      }];
      var items = x.map(it => dict[(0, _utils.keyStringOf)(it)]).filter(it => !!it);
      var text = items.map(it => it.text).join(', ');
      return [{
        tag: 'span',
        child: {
          text: text
        }
      }];
    }
  };
  /**
   *
   * @type {TTDAdapter}
   */

  var res = {
    data: {
      initOpened: true,
      head: {
        rows: [{
          cells: adapterData.propertyNames.map(name => {
            var cellData = {
              child: {
                text: name
              }
            };
            var descriptor = adapterData.propertyDescriptors[name];
            if (descriptor && descriptor.text) cellData.child.text = descriptor.text;
            return cellData;
          })
        }]
      },
      body: {
        rows: adapterData.records.map(function visit(it) {
          var row = {};
          row.cells = adapterData.propertyNames.map(name => {
            var descriptor = adapterData.propertyDescriptors[name];
            var type = descriptor && descriptor.type || 'text';
            var value = it[name];
            var f = toString[type] || toString.text;
            var text = f(value);
            var handler = handlers[type] || handlers.text;
            var cell = {
              innerText: text,
              attr: {
                'data-type': type
              },
              child: handler(value, descriptor)
            };

            if (name === adapterData.treeBy) {
              cell.child.unshift('.as-tree-table-toggle');
            }

            return cell;
          });

          if (it.__children__) {
            row.subRows = it.__children__.map(visit);
          }

          return row;
        })
      }
    }
  };
  return res;
}

_printer.ShareSerializer.addHandlerBefore({
  id: 'TreeTableCellBorder',
  match: (elt, scope, stack) => {
    if (!elt.hasClass) return false;
    if (!elt.hasClass('as-tree-table-head-cell') && !elt.hasClass('as-tree-table-cell')) return false;
    var style = getComputedStyle(elt);
    var borderColor = style.getPropertyValue('border-color');
    var borderStyle = style.getPropertyValue('border-style');
    var borderWidth = style.getPropertyValue('border-width');
    var borderRadius = style.getPropertyValue('border-radius');
    if (borderStyle === 'none' || borderWidth === '0px') return false;
    scope.declare('borderStyle', {
      width: parseFloat(borderWidth.replace('px', '')),
      radius: (0, _attribute.parseMeasureValue)(borderRadius),
      color: borderColor
    });
    return true;
  },
  exec: (printer, elt, scope, stack, accept) => {
    var borderStyle = scope.get('borderStyle');

    var bound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    var rect = bound.clone();
    var strokeWidth = borderStyle.width;
    rect.x -= printer.O.x;
    rect.y -= printer.O.y;
    var radius = borderStyle.radius;
    var rounded;

    if (radius) {
      switch (radius.unit) {
        case '%':
          rounded = [radius.value * rect.width / 100, radius.value * rect.height / 100];
          break;

        case 'px':
          rounded = radius.value;
          break;
      }
    }

    printer.rect(rect, {
      stroke: borderStyle.color,
      rounded: rounded,
      strokeWidth: strokeWidth
    });
    return true;
  }
}, 'Border');
};

moduleFactories["node_modules/absol/src/AppPattern/TaskManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/TaskManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _stringGenerate = require("../String/stringGenerate");

var _EventEmitter = _interopRequireDefault(require("../HTML5/EventEmitter"));

var _OOP = _interopRequireDefault(require("../HTML5/OOP"));


/***
 *
 * @param {TaskManager} manager
 * @param {function(finishTask: function, bundle: any): (void|Promise)=} func
 * @param {any=} bundle
 * @constructor
 */
function Task(manager, func, bundle) {
  this.manager = manager;
  this.id = (0, _stringGenerate.randomIdent)(12);
  this.func = func;
  this.bundle = bundle;
  this.state = 0;
}

Task.prototype.begin = function () {
  if (this.state !== 0) return;
  this.state = 1;
  var sync;

  if (this.func) {
    try {
      sync = this.func(this.end.bind(this), this.bundle);
    } catch (error) {
      console.error(error);
    }
  }

  if (sync && sync.then) sync.catch(error => console.error(error)).then(this.end.bind(this));
};

Task.prototype.end = function () {
  if (this.state !== 1) return;
  this.state = 2;
  this.manager.onFinishTask(this);
};

function TaskManager(opt) {
  _EventEmitter.default.call(this);

  opt = opt || {};
  this.limit = typeof opt.limit === "number" && opt.limit >= 1 ? opt.limit : Infinity;
  this.pendingTasks = [];
  this.runningTasks = [];
}

_OOP.default.mixClass(TaskManager, _EventEmitter.default);
/***
 *
 * @param {function(finishTask: function, bundle: any): (void|Promise)} func
 * @param {any} bundle
 */


TaskManager.prototype.requestTask = function (func, bundle) {
  var task = new Task(this, func, bundle);

  if (this.runningTasks.length < this.limit) {
    this.runningTasks.push(task);
    this.emit('task_begin', {
      type: 'task_begin',
      task
    }, this);
    task.begin();
  } else {
    this.pendingTasks.push(task);
  }
};

TaskManager.prototype.onFinishTask = function (task) {
  var idx = this.runningTasks.indexOf(task);
  if (idx < 0) return;
  this.runningTasks.splice(idx, 1);
  this.emit('task_end', {
    type: 'task_end',
    task
  }, this);

  while (this.pendingTasks.length > 0 && this.runningTasks.length < this.limit) {
    task = this.pendingTasks.shift();
    this.runningTasks.push(task);
    this.emit('task_begin', {
      type: 'task_begin',
      task
    }, this);
    task.begin();
  }
};

TaskManager.prototype.newTask = function () {
  var task = new Task(this, null, null);
  this.runningTasks.push(task);
  this.emit('task_begin', {
    type: 'task_begin',
    task
  }, this);
  task.begin();
  return task;
};

var _default = TaskManager;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/finder/FileThumbnail.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/finder/FileThumbnail.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _utils = require("../utils");

var _catalog = _interopRequireDefault(require("../../assets/exticons/catalog.json"));

var _MessageInput = _interopRequireDefault(require("../messageinput/MessageInput"));




var thumbnailCache = {};
var dbSync;

var getDb = () => {
  dbSync = dbSync || new Promise(resolve => {
    var request = window.indexedDB.open('FileThumbnailDB', 1);

    request.onupgradeneeded = event => {
      var db = event.target.result;
      db.createObjectStore("files", {});
    };

    request.onsuccess = event => {
      var db = event.target.result;
      var request1;

      if (localStorage.getItem('FileThumbnail_clear_cache') === '1') {
        localStorage.removeItem('FileThumbnail_clear_cache');
        request1 = db.transaction('files', 'readwrite').objectStore('files').clear();

        request1.onsuccess = () => {
          resolve(db);
        };

        request1.onerror = () => {
          resolve(null);
        };
      } else resolve(db);
    };

    request.onerror = () => {
      resolve(null);
    };
  });
  return dbSync;
};

var dbGetItem = key => {
  return getDb().then(db => {
    if (!db) return null;
    var request = db.transaction('files').objectStore('files').get(key);
    return new Promise(resolve => {
      request.onsuccess = event => {
        var data = event.target.result;
        resolve(data);
      };

      request.onerror = () => {
        resolve(null);
      };
    });
  });
};

var dbSetItem = (key, value) => {
  return getDb().then(db => {
    if (!db) return null;
    var objectStore = db.transaction('files', 'readwrite').objectStore('files');
    var request = objectStore.put(value, key);
    return new Promise(resolve => {
      request.onsuccess = event => {
        var data = event.target.result;
        resolve(data);
      };

      request.onerror = () => {
        resolve(null);
      };
    });
  });
};

document.addEventListener('keydown', event => {
  if (event.ctrlKey && event.key === 'F5') {
    localStorage.setItem('FileThumbnail_clear_cache', '1');
  }
});

var url2small = url => {
  return new Promise(resolve => {
    var image = new Image();
    image.crossOrigin = 'anonymous';
    image.crossorigin = 'anonymous';
    image.src = url;

    image.onload = function () {
      var now = new Date();

      if (image.naturalWidth <= 100 && image.naturalHeight < 100) {
        resolve(url);
        return;
      }

      var scale = Math.min(100 / image.naturalWidth, 100 / image.naturalHeight);
      var width = Math.round(image.naturalWidth * scale);
      var height = Math.round(image.naturalHeight * scale);
      var canvas = document.createElement('canvas');
      canvas.width = width;
      canvas.height = height;
      var ctx = canvas.getContext('2d');

      for (var i = 0; i < 20; ++i) for (var j = 0; j < 20; ++j) {
        ctx.fillStyle = (i ^ j) & 1 ? '#BBBBBB' : '#FFFFFF';
        ctx.fillRect(i * 5, j * 5, 5, 5);
      }

      ctx.drawImage(image, 0, 0, width, height);
      resolve(canvas.toDataURL('image/jpeg', 0.5));
    };
  });
};

var getThumbnailUrl = url => {
  if (!thumbnailCache[url]) {
    thumbnailCache[url] = dbGetItem(url).then(result => {
      if (!result) {
        result = url2small(url).then(canvasResult => {
          if (canvasResult) dbSetItem(url, canvasResult);
          return canvasResult;
        });
      }

      return result;
    });
  }

  return thumbnailCache[url];
};

function FileThumbnail() {
  this._value = null;
  this.$fileName = (0, _ACore.$)('.as-file-thumbnail-file-name', this);
  this.$bg = (0, _ACore.$)('.as-file-thumbnail-background', this);
  /***
   * @type {string}
   * @name fileName
   * @memberOf FileThumbnail#
   */

  /***
   * @type {string|null}
   * @name fileType
   * @memberOf FileThumbnail#
   */

  /***
   * @type {string|null}
   * @name thumbnail
   * @memberOf FileThumbnail#
   */

  /***
   * @type {boolean}
   * @name isDirectory
   * @memberOf FileThumbnail#
   */
}

FileThumbnail.tag = 'FileThumbnail'.toLowerCase();

FileThumbnail.render = function () {
  return (0, _ACore._)({
    class: 'as-file-thumbnail',
    child: [{
      class: 'as-file-thumbnail-background'
    }, {
      class: 'as-file-thumbnail-file-name',
      child: []
    }, {
      class: 'as-file-thumbnail-check',
      child: 'span.mdi.mdi-check-bold'
    }]
  });
};

FileThumbnail.prototype._updateFileName = function () {
  var fileName = this.fileName;

  if (!fileName) {
    return;
  }

  var parts;
  var matched;
  matched = fileName.match(/([^_+\-.]+)|([_+\-.]+)/g);
  parts = matched || [];

  if (parts.length > 2 && parts[parts.length - 2] === '.') {
    parts[parts.length - 2] += parts[parts.length - 1];
    parts.pop();
  }

  parts = parts.map(txt => {
    return (0, _ACore._)({
      tag: 'span',
      child: {
        text: txt
      }
    });
  });
  this.$fileName.clearChild().addChild(parts);
};

FileThumbnail.prototype._updateThumbnail = function () {
  var previewUrl;
  var thumbnail = this.thumbnail;
  var fileType = this.isDirectory ? 'folder' : this.fileType;

  if (thumbnail) {
    if (typeof thumbnail === "string") {
      this._previewUrl = thumbnail;
      getThumbnailUrl(thumbnail).then(smallerUrl => {
        if (thumbnail !== this._previewUrl) return;
        this.$bg.addStyle('backgroundImage', 'url("' + smallerUrl + '")');
      });
    } else if (thumbnail instanceof Blob || thumbnail instanceof File) {
      thumbnail.url = thumbnail.url || URL.createObjectURL(thumbnail);
      this._previewUrl = thumbnail.url;
    }
  }

  if (_catalog.default.indexOf(fileType) >= 0) {
    previewUrl = _MessageInput.default.iconAssetRoot + '/' + fileType + '.svg';
  } else {
    previewUrl = _MessageInput.default.iconAssetRoot + '/' + 'blank' + '.svg';
  }

  if (previewUrl) {
    this.$bg.addStyle('backgroundImage', 'url("' + encodeURI(previewUrl) + '")');
  } else {
    this.$bg.removeStyle('backgroundImage');
  }
};

FileThumbnail.property = {};
FileThumbnail.property.value = {
  set: function (value) {
    value = value || null;
    this._value = value;
    this._valueInfo = (0, _utils.fileInfoOf)(value);

    this._updateFileName();

    this._updateThumbnail();
  },
  get: function () {
    return this._value;
  }
};
FileThumbnail.property.fileName = {
  set: function (value) {
    this._fileName = value;

    this._updateFileName();
  },
  get: function () {
    return this._fileName || this._valueInfo && this._valueInfo.name || null;
  }
};
FileThumbnail.property.fileType = {
  set: function (value) {
    this._fileType = value;

    this._updateThumbnail();
  },

  /***
   * @this FileInputBox
   * @return {*}
   */
  get: function () {
    if (this.isDirectory) return null;
    return this._fileType || this._valueInfo && this._valueInfo.type || null;
  }
};
FileThumbnail.property.checked = {
  set: function (value) {
    if (value) {
      this.addClass('as-checked');
    } else {
      this.removeClass('as-checked');
    }
  },
  get: function () {
    return this.hasClass('as-checked');
  }
};
FileThumbnail.property.thumbnail = {
  set: function (value) {
    this._thumbnail = value || null;

    this._updateThumbnail();
  },
  get: function () {
    return this._thumbnail;
  }
};
FileThumbnail.property.isDirectory = {
  set: function (value) {
    if (value) {
      this.addClass('as-is-directory');
    } else {
      this.removeClass('as-is-directory');
    }
  },
  get: function () {
    return this.hasClass('as-is-directory');
  }
};

_ACore.default.install(FileThumbnail);

var _default = FileThumbnail;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/finder/Finder.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/finder/Finder.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.FinderFileSystem = FinderFileSystem;
exports.FinderCommands = exports.default = void 0;

require("../../css/finder.css");

require("../../css/mobileapp.css");

var _ACore = _interopRequireWildcard(require("../../ACore"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _FlexiconButton = _interopRequireDefault(require("../FlexiconButton"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ExpTree = require("../ExpTree");

var _MessageInput = _interopRequireDefault(require("../messageinput/MessageInput"));

var _ext2MineType = _interopRequireDefault(require("absol/src/Converter/ext2MineType"));

var _utils = require("../utils");

var _random = require("absol/src/Math/random");

var _TaskManager = _interopRequireDefault(require("absol/src/AppPattern/TaskManager"));

var _Modal = _interopRequireDefault(require("../Modal"));

var _MessageDialog = _interopRequireDefault(require("../MessageDialog"));

var _Hanger = _interopRequireDefault(require("../Hanger"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _WindowBox = _interopRequireDefault(require("../WindowBox"));

var _FileSaver = require("absol/src/Network/FileSaver");

var _DropZone = _interopRequireDefault(require("../DropZone"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _EventEmitter = _interopRequireWildcard(require("absol/src/HTML5/EventEmitter"));

var _ContextMenu = _interopRequireDefault(require("../ContextMenu"));

var _TextArea = _interopRequireDefault(require("../TextArea2"));

var _FileThumbnail = _interopRequireDefault(require("./FileThumbnail"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _Searcher = _interopRequireDefault(require("../Searcher"));

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _stringFormat = require("absol/src/String/stringFormat");

var _stringGenerate = require("absol/src/String/stringGenerate");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));




var isMobile = _BrowserDetector.default.isMobile;
/***
 * @extends AElement
 * @constructor
 */

function Finder() {
  if (isMobile) this.addClass('as-mobile'); // if (BrowserDetector.isMobile) alert("Chưa hỗ trợ điện thoại!");

  this.$attachhook = (0, _ACore._)('attachhook').addTo(this);

  this.$attachhook.requestUpdateSize = () => {
    this.layoutCtn.update();
    this.navCtrl.notifyVisibleContentItems();
  };

  this.$attachhook.once('attached', () => {
    _ResizeSystem.default.add(this.$attachhook);

    this.layoutCtn.update();
    this.navCtrl.onStart();
    this.navCtrl.notifyVisibleContentItems();

    _ContextMenu.default.auto();
  });
  this.domSignal = new _DomSignal.default((0, _ACore._)('attachhook').addTo(this));
  this.$header = (0, _ACore.$)('.as-finder-header', this);
  this.$nomalActionCtn = (0, _ACore.$)('.as-finder-normal-action-button-ctn', this);
  this.$tinyActionCtn = (0, _ACore.$)('.as-finder-tiny-action-button-ctn', this);
  this.$contentHeader = (0, _ACore.$)('.as-finder-content-header', this);
  this.$navCtn = (0, _ACore.$)('.as-finder-nav-ctn', this);
  this.$nav = (0, _ACore.$)(_ExpTree.ExpGroup.tag, this.$navCtn);
  this.$searchCtn = (0, _ACore.$)('.as-finder-search-ctn', this);
  this.$contentCtn = (0, _ACore.$)('.as-finder-content-ctn', this);
  this.$content = (0, _ACore.$)('.as-finder-content', this);
  this.$body = (0, _ACore.$)('.as-finder-body', this);
  this.$commandButtons = (0, _ACore.$$)('.as-finder-nav-header button', this).concat((0, _ACore.$$)('.as-finder-content-header button', this)).concat((0, _ACore.$$)('.as-finder-search-footer button', this)).concat((0, _ACore.$$)('.as-finder-search-header button', this)).reduce((ac, cr) => {
    ac[cr.attr('name')] = cr;
    cr.on('click', () => {
      this.execCommand(cr.attr('name'));
    });
    return ac;
  }, {});
  this.$searchTypeSelect = (0, _ACore.$)('.as-finder-search-type-select', this);
  this.$searchText = (0, _ACore.$)('.as-finder-search-text', this);
  this.fileSystem = new AbsolFileSystem();
  this.layoutCtn = new LayoutController(this);
  this.navCtrl = new NavigatorController(this);
  this.selectCtrl = isMobile ? new MobileSelectController(this) : new SelectController(this);
  this.uploadCtrl = new UploadController(this);
  this.commandCtrl = new CommandController(this);
  this.folderDialog = new FolderDialog(this);
  this.searchCtrl = new SearchController(this);
  /***
   * @type {string}
   * @name displayPath
   * @memberOf Finder#
   */

  /***
   * @type {string}
   * @name path
   * @memberOf Finder#
   */

  /***
   * @type {string}
   * @name rootPath
   * @memberOf Finder#
   */
}

Finder.tag = 'Finder'.toLowerCase();

Finder.render = function () {
  return (0, _ACore._)({
    class: 'as-finder',
    extendEvent: ['selectedchange'],
    attr: {
      'data-selected-file-count': '0',
      'data-selected-folder-count': '0'
    },
    child: [{
      class: 'as-finder-header',
      child: [{
        class: 'as-finder-normal-action-button-ctn'
        /* child: Finder.prototype.actions.map(act => ({
             tag: FlexiconButton.tag,
             attr: { name: act.name },
             props: {
                 text: act.text,
                 // icon: act.icon
             }
         }))*/

      }, {
        class: 'as-finder-tiny-action-button-ctn'
        /*child: Finder.prototype.actions.map(act => ({
            tag: 'button',
            attr: { name: act.name, title: act.text },
            child: act.icon
        }))*/

      }]
    }, {
      class: ['as-finder-nav-ctn'],
      child: [{
        class: 'as-finder-nav-header',
        child: [{
          class: 'as-finder-nav-header-left',
          child: [{
            tag: 'button',
            class: 'as-transparent-button',
            attr: {
              title: "Close Navigator",
              name: 'nav_toggle'
            },
            child: 'span.mdi.mdi-menu-open'
          }]
        }, {
          class: 'as-finder-nav-header-right',
          child: [{
            tag: 'button',
            class: 'as-transparent-button',
            attr: {
              title: "Search",
              name: 'switch_to_search'
            },
            child: 'span.mdi.mdi-magnify'
          }, {
            tag: 'button',
            class: 'as-transparent-button',
            attr: {
              title: "Expand All",
              name: 'nav_expand_all'
            },
            child: 'span.mdi.mdi-arrow-expand-vertical'
          }, {
            tag: 'button',
            class: 'as-transparent-button',
            attr: {
              title: "Collapse All",
              name: 'nav_collapse_all'
            },
            child: 'span.mdi.mdi-arrow-collapse-vertical'
          }, {
            tag: 'button',
            class: 'as-transparent-button',
            attr: {
              title: "Reload",
              name: 'reload'
            },
            child: 'span.mdi.mdi-reload'
          }]
        }]
      }, {
        tag: _ExpTree.ExpGroup.tag,
        class: 'as-bscroller'
      }]
    }, {
      class: 'as-finder-search-ctn',
      child: [{
        class: 'as-finder-search-header',
        child: [{
          tag: 'button',
          class: 'as-transparent-button',
          attr: {
            title: "Close Navigator",
            name: 'nav_toggle'
          },
          child: 'span.mdi.mdi-menu-open'
        }]
      }, {
        class: 'as-finder-search-body',
        child: [{
          tag: _Searcher.default.tag,
          class: 'as-finder-search-text'
        }, {
          class: 'as-finder-search-field',
          child: [{
            child: {
              text: 'Kiểu'
            }
          }, {
            child: {
              tag: 'selectmenu',
              class: 'as-finder-search-type-select',
              props: {
                items: [{
                  text: 'Tất cả',
                  value: 'all',
                  icon: 'span.mdi.mdi-asterisk'
                }, {
                  text: 'Hình ảnh',
                  value: 'image',
                  icon: 'span.mdi.mdi-image-outline'
                }, {
                  text: 'Tài liệu',
                  value: 'document',
                  icon: 'span.mdi.mdi-file-document'
                }]
              }
            }
          }]
        }, {
          class: 'as-finder-search-footer',
          child: [{
            tag: _FlexiconButton.default.tag,
            attr: {
              name: 'start_search'
            },
            props: {
              text: 'OK'
            }
          }, {
            tag: _FlexiconButton.default.tag,
            attr: {
              name: 'cancel_search'
            },
            props: {
              text: 'Hủy'
            }
          }]
        }]
      }]
    }, {
      tag: _DropZone.default.tag,
      attr: {
        'data-view-as': 'content'
      },
      class: ['as-finder-body'],
      child: [{
        class: 'as-finder-content-header',
        child: [{
          class: 'as-finder-content-header-left',
          child: [{
            tag: 'button',
            attr: {
              title: 'Open Navigator',
              name: 'nav_toggle'
            },
            class: 'as-transparent-button',
            child: ['span.mdi.mdi-menu']
          }, {
            tag: 'button',
            attr: {
              title: 'View As List',
              name: 'content_view_as'
            },
            class: 'as-transparent-button',
            child: ['span.mdi.mdi-format-list-bulleted-square']
          }]
        }, {
          class: 'as-finder-content-header-right'
        }]
      }, {
        tag: _Hanger.default.tag,
        class: 'as-finder-content-ctn',
        props: {
          hangOn: 5
        },
        child: {
          class: ['as-finder-content']
        }
      }, {
        class: 'as-finder-upload-overlay',
        child: [{
          class: 'as-finder-upload-overlay-icon-ctn',
          child: 'span.mdi.mdi-cloud-upload-outline'
        }, {
          child: {
            text: 'Thả file vào đây để tải lên'
          }
        }]
      }]
    }]
  });
};

Finder.property = {};
Finder.property.fileSystem = {
  set: function (fs) {
    this._fileSystem = fs;
  },
  get: function () {
    return this._fileSystem;
  }
};
Finder.property.path = {
  set: function (path) {
    this.navCtrl.path = path;
  },
  get: function () {
    return this.navCtrl.path;
  }
};
Finder.property.displayPath = {
  // set: function (path) {
  //     this.navCtrl.path = path;
  // },
  get: function () {
    return this.navCtrl.displayPath;
  }
};
Finder.property.rootPath = {
  set: function (path) {
    this.navCtrl.rootPath = path;
  },
  get: function () {
    return this.navCtrl.rootPath;
  }
};
Finder.property.selectedFiles = {
  get: function () {
    return this.selectCtrl.$selectedItems.filter(elt => elt.stat && !elt.stat.isDirectory).map(elt => elt.stat);
  }
};

Finder.prototype.execCommand = function (name) {
  return this.commandCtrl.execCommand.apply(this.commandCtrl, arguments);
};

Finder.prototype.addCommand = function (name, descriptor) {
  this.commandCtrl.addCommand(name, descriptor);
};

Finder.prototype.addButton = function (name, bf) {
  this.commandCtrl.addButton(name, bf);
};
/****
 *
 * @param {string} name
 * @param {string=} bf
 */


Finder.prototype.addFolderMenuItem = function (name, bf) {
  this.commandCtrl.addFolderMenuItem(name, bf);
};

Finder.prototype.findZIndex = function () {
  var c = this;
  var res = 0;
  var zIndex;

  while (c) {
    zIndex = parseInt(getComputedStyle(c).getPropertyValue('z-index'));
    if (!isNaN(zIndex)) res = Math.max(zIndex, res);
    c = c.parentElement;
  }

  return res;
};

_ACore.default.install(Finder);

var _default = Finder;
exports.default = _default;
var FinderCommands = {};
exports.FinderCommands = FinderCommands;
FinderCommands.upload = {
  text: 'Tải lên',
  icon: 'span.mdi.mdi-upload-outline',
  match: function (fileElt) {
    return !fileElt && this.searchCtrl.state !== 'RUNNING';
  },

  /***
   * @this Finder
   */
  exec: function () {
    (0, _utils.openFileDialog)({
      multiple: true
    }).then(files => {
      if (files && files.length > 0) {
        this.uploadCtrl.upload(files);
      }
    });
  }
};
FinderCommands.upload_to_folder = {
  text: 'Tải lên',
  icon: 'span.mdi.mdi-upload-outline',
  match: function (treElt) {
    return !!treElt;
  },

  /***
   * @this Finder
   */
  exec: function () {
    //todo: selected folder
    (0, _utils.openFileDialog)({
      multiple: true
    }).then(files => {
      if (files && files.length > 0) {
        this.uploadCtrl.upload(files);
      }
    });
  }
};
FinderCommands.delete = {
  icon: 'span.mdi.mdi-delete-outline',
  text: 'Xóa',

  /***
   * @this Finder
   */
  match: function (fileElt) {
    return fileElt && this.selectCtrl.$selectedItems.length > 0 && this.selectCtrl.$selectedItems.every(elt => elt.stat && !elt.stat.isDirectory);
  },

  /***
   * @this Finder
   */
  exec: function () {
    var paths = this.selectCtrl.$selectedItems.map(elt => elt.stat.path);
    var names = this.selectCtrl.$selectedItems.map(elt => elt.fileName);
    if (names.length === 0) return;
    var contentElt = (0, _ACore._)({
      style: {
        maxHeight: '50vh',
        overflow: 'auto'
      },
      child: {
        style: {
          display: 'table'
        },
        child: names.map(name => ({
          style: {
            display: 'table-row'
          },
          child: [{
            style: {
              display: 'table-cell',
              padding: '5px 20px 5px 10px'
            },
            child: {
              style: {
                'min-width': '30em'
              },
              child: {
                text: name
              }
            }
          }, {
            style: {
              display: 'table-cell',
              padding: '5px 10px'
            },
            child: {
              class: 'as-finder-task-check',
              style: {
                'min-width': '3em',
                textAlign: 'right'
              },
              child: 'span'
            }
          }]
        }))
      }
    });
    var modal = (0, _ACore._)({
      tag: _Modal.default.tag,
      style: {
        zIndex: this.findZIndex() + 9000
      },
      child: {
        tag: _MessageDialog.default.tag,
        props: {
          dialogTitle: 'Xóa file',
          dialogActions: [{
            name: "ok",
            text: "OK"
          }, {
            name: 'cancel',
            text: 'Hủy'
          }]
        },
        child: [{
          child: {
            tag: 'span',
            child: {
              text: "Xác nhận xóa những file dưới đây: "
            }
          }
        }, contentElt],
        on: {
          action: (event, sender) => {
            var promises;
            var errors = [];

            if (event.action.name === 'ok') {
              sender.$actionBtns[0].disabled = true;
              sender.$actionBtns[0].text = "Đang tiến hành xóa..";
              sender.$actionBtns[1].disabled = true;
              promises = paths.map((path, i) => {
                return this.fileSystem.unlink(path).then(() => {
                  (0, _ACore.$)('.as-finder-task-check', contentElt.firstChild.childNodes[i]).addChild((0, _ACore._)('.span.mdi.mdi-check'));
                }).catch(err => {
                  errors.push(err);
                  (0, _ACore.$)('.as-finder-task-check', contentElt.firstChild.childNodes[i]).addChild((0, _ACore._)('.span.mdi.mdi-alert-decagram-outline').attr('title', err.message));
                });
              });
              Promise.all(promises).then(() => {
                var commands = {};

                if (errors.length > 0) {
                  errors.forEach(err => {
                    if (err.command) {
                      commands[err.command] = true;
                    }
                  });
                  if (commands.reload) this.execCommand('reload');
                } else {
                  this.navCtrl.reload(this.path, true).then(() => modal.remove());
                }
              });
            } else {
              modal.remove();
            }
          }
        }
      }
    }).addTo(document.body);
  }
};
FinderCommands.view = {
  icon: 'span.mdi.mdi-eye-outline',
  text: 'Xem',
  match: function (fileElt) {
    return !!fileElt;
  },

  /***
   * @this Finder
   */
  exec: function () {
    var elt = this.selectCtrl.$selectedItems[0];
    if (!elt) return;

    if (elt.stat.isDirectory) {
      this.navCtrl.viewDir(elt.stat.path);
      return;
    }

    var url = elt.stat.url;
    if (!url) return;
    var type = elt.fileType;

    if (type === 'xlsx' || type === 'docx' || type === 'xls' || type === 'doc' || type === 'ppt' || type === 'pptx') {
      url = 'https://view.officeapps.live.com/op/embed.aspx?src=' + encodeURIComponent(url);
    } else {
      url = encodeURI(url);
    }

    var mineType = _ext2MineType.default[type] || 'none';
    var content;

    if (mineType.startsWith('video')) {
      content = (0, _ACore._)({
        tag: 'video',
        style: {
          maxWidth: 'calc(90vw - 20px)',
          maxHeight: 'calc(90vh - 80px)',
          width: '900px',
          height: 'auto'
        },
        attr: {
          autoplay: 'true',
          controls: 'true'
        },
        props: {
          src: url
        }
      });
    } else if (mineType.startsWith('audio')) {
      content = (0, _ACore._)({
        tag: 'audio',
        style: {
          margin: '5px'
        },
        attr: {
          autoplay: 'true',
          controls: 'true'
        },
        props: {
          src: url
        }
      });
    } else if (mineType.startsWith('image')) {
      content = (0, _ACore._)({
        tag: 'img',
        style: {
          maxWidth: 'calc(90vw - 20px)',
          maxHeight: 'calc(90vh - 80px)',
          width: 'auto',
          height: 'auto'
        },
        attr: {},
        props: {
          src: url
        }
      });
    } else {
      content = (0, _ACore._)({
        tag: 'iframe',
        style: {
          maxWidth: 'calc(90vw - 20px)',
          maxHeight: 'calc(90vh - 80px)',
          width: '900px',
          height: '600px'
        },
        props: {
          src: url,
          onload: function () {// console.log(this.contentWindow.document.body.offsetHeight, this.contentWindow.document.body.offsetWidth)
          }
        }
      });
    }

    var modal = (0, _ACore._)({
      tag: _Modal.default.tag,
      style: {
        zIndex: this.findZIndex() + 9000
      },
      child: {
        tag: _WindowBox.default.tag,
        child: content,
        props: {
          windowTitle: elt.stat.displayName || elt.stat.name,
          windowActions: [{
            name: 'close',
            icon: 'span.mdi.mdi-close'
          }]
        },
        on: {
          action: () => {
            modal.remove();
          }
        }
      }
    }).addTo(document.body);
  }
};
FinderCommands.download = {
  icon: 'span.mdi.mdi-download-outline',
  text: 'Tải về',
  match: function (elt) {
    return elt && this.selectCtrl.$selectedItems.length > 0 && this.selectCtrl.$selectedItems.every(elt => elt.stat && !elt.stat.isDirectory);
  },

  /***
   * @this Finder
   */
  exec: function () {
    var taskMng = new _TaskManager.default({
      limit: 4
    });
    this.selectCtrl.$selectedItems.forEach(elt => {
      if (elt.isDirectory) return;
      var url = elt.stat.url;
      if (!url) return;
      taskMng.requestTask(function (onFinish, bundle) {
        (0, _FileSaver.saveAs)(bundle.url, bundle.name);
        setTimeout(onFinish, 100);
      }, {
        url: url,
        name: elt.fileName
      });
    });
  }
};
FinderCommands.rename = {
  icon: 'span.mdi.mdi-rename',
  text: 'Đổi tên',

  /***
   * @this Finder
   */
  match: function (elt) {
    return elt && this.selectCtrl.$selectedItems.length === 1 && elt.stat && !elt.stat.isDirectory; //todo: rename folder
  },

  /***
   * @this Finder
   */
  exec: function () {
    var elt = this.selectCtrl.$selectedItems[0];
    if (!elt) return;
    var path = elt.stat.path;
    var value = elt.fileName;
    var input = (0, _ACore._)({
      tag: _TextArea.default.tag,
      style: {
        outline: 'none',
        position: 'absolute',
        zIndex: 100,
        left: 0,
        bottom: 0,
        width: '100%'
      },
      props: {
        value: elt.fileName
      },
      on: {
        blur: () => {
          var newValue = input.value.replace(/<>:\\\/\|\?\*\^/g, '').trim();
          input.remove();
          if (!value) return;
          if (value === newValue) return;
          this.fileSystem.rename(path, newValue).then(newStat => {
            elt.stat = newStat;
            elt.value = newStat.url;
            elt.fileName = newStat.displayName || newStat.name;
          });
        }
      }
    });
    elt.addChild(input);
    input.on('keydown', function (event) {
      if (event.key.match(/<>:\\\/\|\?\*\^/)) {
        event.preventDefault();
        setTimeout(() => input.updateSize(), 30);
      } else if (event.key === 'Enter') {
        input.blur();
      } else if (event.key === 'Escape') {
        input.value = value;
        input.updateSize();
        input.blur();
      }
    }, true);
    input.updateSize();
    input.focus();
    var ext = value.match(/\.[a-zA-Z0-9]+$/);

    if (ext) {
      ext = ext[0];
    } else {
      ext = '';
    }

    input.setSelectionRange(0, value.length - ext.length);
  }
};
FinderCommands.copy = {
  icon: 'span.mdi.mdi-content-copy',
  text: 'Sao chép',
  exec: function () {}
};
FinderCommands.move = {
  text: 'Di chuyển',
  icon: 'span.mdi.mdi-file-move-outline',
  match: function (fileElt) {
    if (arguments.length === 0) return true;
    return !!fileElt;
  },

  /***
   * @this Finder
   */
  exec: function () {
    var itemElements = this.selectCtrl.$selectedItems.slice();
    var paths = itemElements.map(elt => elt.stat.path);
    var names = itemElements.map(elt => elt.fileName);
    if (names.length === 0) return;
    var currentFolderPath = this.path;
    this.folderDialog.open(currentFolderPath, false, newFolderPath => newFolderPath !== currentFolderPath, 'Di chuyển file').then(newFolderPath => {
      if (!newFolderPath) return;
      if (newFolderPath === currentFolderPath) return;
      var contentElt = (0, _ACore._)({
        style: {
          maxHeight: '50vh',
          overflow: 'auto'
        },
        child: {
          style: {
            display: 'table'
          },
          child: names.map(name => ({
            style: {
              display: 'table-row'
            },
            child: [{
              style: {
                display: 'table-cell',
                padding: '5px 20px 5px 10px'
              },
              child: {
                style: {
                  'min-width': '30em'
                },
                child: {
                  text: name
                }
              }
            }, {
              style: {
                display: 'table-cell',
                padding: '5px 10px'
              },
              child: {
                class: 'as-finder-task-check',
                style: {
                  'min-width': '3em',
                  textAlign: 'right'
                },
                child: 'span'
              }
            }]
          }))
        }
      });
      var modal = (0, _ACore._)({
        tag: _Modal.default.tag,
        style: {
          zIndex: this.findZIndex() + 9000
        },
        child: {
          tag: _MessageDialog.default.tag,
          props: {
            dialogTitle: 'Di chuyển file',
            dialogActions: [{
              name: 'close',
              text: 'Đóng'
            }]
          },
          child: [{
            child: {
              tag: 'span',
              child: {
                text: "Danh sách đang di chuyển: "
              }
            }
          }, contentElt],
          on: {
            action: (event, sender) => {
              modal.remove();
            }
          }
        }
      }).addTo(document.body);
      var errors = [];
      var promises = paths.map((path, i) => {
        var newPath = newFolderPath + '/' + path.split('/').pop();
        return this.fileSystem.move(path, newPath).then(() => {
          (0, _ACore.$)('.as-finder-task-check', contentElt.firstChild.childNodes[i]).addChild((0, _ACore._)('.span.mdi.mdi-check'));
        }).catch(err => {
          errors.push(err);
          (0, _ACore.$)('.as-finder-task-check', contentElt.firstChild.childNodes[i]).addChild((0, _ACore._)('.span.mdi.mdi-alert-decagram-outline').attr('title', err.message));
        });
      });
      Promise.all(promises).then(() => {
        var commands = {};

        if (errors.length > 0) {
          errors.forEach(err => {
            if (err.command) {
              commands[err.command] = true;
            }
          });
          if (commands.reload) this.execCommand('reload');
        } else {
          this.navCtrl.reload(this.path, true).then(() => modal.remove());
        }
      });
    });
  }
};
FinderCommands.move_dir = {
  text: 'Di chuyển',
  icon: 'span.mdi.mdi-folder-arrow-right-outline',
  match: function (expElt) {
    return !!expElt;
  },

  /***
   * @this Finder
   */
  exec: function (expElt) {
    var path = expElt.stat.path;
    var currentFolderPath = path.split('/');
    var name = currentFolderPath.pop();
    currentFolderPath = currentFolderPath.join('/');
    this.folderDialog.open(currentFolderPath, true, newPath => !newPath.startsWith(path), 'Di chuyển thư mục').then(newFolderPath => {
      if (!newFolderPath) return;
      return this.fileSystem.move(path, newFolderPath + '/' + name).then(() => {
        this.path = newFolderPath + '/' + name;
        this.navCtrl.reload(this.rootPath).then(() => {
          this.navCtrl.viewDir(this.path);
        });
      });
    });
  }
};
FinderCommands.rmdir = {
  text: 'Xóa',
  icon: 'span.mdi.mdi-delete-outline',

  /***
   * @this Finder
   * @param elt
   */
  match: function (elt) {
    if (elt) return true;
    return false;
  },
  exec: function (elt) {}
};
FinderCommands.select_all = {
  text: 'Chọn tất cả',
  icon: 'span.mdi.mdi-select-all',
  match: function (fileElt) {
    return !fileElt;
  },

  /***
   * @this Finder
   */
  exec: function () {
    this.selectCtrl.selectAll();
  }
};
FinderCommands.nav_expand_all = {
  /***
   * @this Finder
   */
  exec: function () {
    this.navCtrl.expandAll();
  }
};
FinderCommands.nav_collapse_all = {
  /***
   * @this Finder
   */
  exec: function () {
    this.navCtrl.collapseAll();
  }
};
FinderCommands.reload = {
  /***
   * @this Finder
   */
  exec: function () {
    this.fileSystem.clearCache();
    this.navCtrl.reload().then(() => {
      this.navCtrl.viewDir(this.path);
    });
  }
};
FinderCommands.content_view_as = {
  /***
   * @this Finder
   */
  exec: function () {
    var viewAs = this.$body.attr('data-view-as');

    if (viewAs === 'content') {
      this.$body.attr('data-view-as', 'list');
      this.$commandButtons['content_view_as'].attr('title', 'View As Content');
      this.$commandButtons['content_view_as'].firstChild.attr('class', 'mdi mdi-view-grid');
    } else {
      this.$body.attr('data-view-as', 'content');
      this.$commandButtons['content_view_as'].attr('title', 'View As List');
      this.$commandButtons['content_view_as'].firstChild.attr('class', 'mdi mdi-format-list-bulleted-square');
    }
  }
};
FinderCommands.switch_to_search = {
  /***
   * @this Finder
   */
  exec: function () {
    this.searchCtrl.start();
  }
};
FinderCommands.cancel_search = {
  /***
   * @this Finder
   */
  exec: function () {
    this.searchCtrl.stop();
    this.navCtrl.viewDir(this.path);
  }
};
FinderCommands.start_search = {
  /***
   * @this Finder
   */
  exec: function () {
    this.searchCtrl.search();
  }
};
FinderCommands.nav_toggle = {
  icon: 'span.mdi.mdi-menu',
  exec: function () {
    if (this.hasClass('as-nav-open')) {
      this.removeClass('as-nav-open');
    } else {
      this.addClass('as-nav-open');
    }
  }
};
/***
 *
 * @param {Finder} elt
 * @constructor
 */

function LayoutController(elt) {
  this.elt = elt;
  this.actionButtonWidth = 0;
  this.elt.domSignal.on('requestUpdateActionButtonSize', this.updateActionButtonSize.bind(this));
  this.elt.on('click', this.ev_click.bind(this));
}

LayoutController.prototype.requestUpdateActionButtonSize = function () {
  this.elt.domSignal.emit('requestUpdateActionButtonSize');
};

LayoutController.prototype.updateActionButtonSize = function () {
  var font = this.elt.$nomalActionCtn.getComputedStyleValue('font');
  var fontSize = this.elt.$nomalActionCtn.getFontSize();
  this.actionButtonWidth = Array.prototype.reduce.call(this.elt.$nomalActionCtn.childNodes, (ac, cr) => {
    return ac + Math.max(110, 0.715 * fontSize * 2 + (0, _utils.measureText)(cr.text, font).width) + 10;
  }, 60);
  this.update();
};

LayoutController.prototype.update = function () {
  var bound = this.elt.getBoundingClientRect();

  if (bound.width < 500) {
    if (!this.elt.hasClass('as-mini-layout')) this.elt.addClass('as-mini-layout');
  } else {
    if (this.elt.hasClass('as-mini-layout')) {
      this.elt.removeClass('as-mini-layout');
      this.elt.removeClass('as-nav-open');
    }
  }

  if (this.elt.hasClass('as-action-button-minimized')) {
    if (this.actionButtonWidth <= bound.width) {
      this.elt.removeClass('as-action-button-minimized');
    }
  } else {
    if (this.actionButtonWidth > bound.width) {
      this.elt.addClass('as-action-button-minimized');
    }
  }

  var bodyBound = this.elt.$body.getBoundingClientRect();
  var col = Math.floor(bodyBound.width / 300) || 1;
  this.elt.$body.addStyle('--col', col + '');
};

LayoutController.prototype.ev_click = function (event) {
  if (event.target === this.elt) {
    this.elt.removeClass('as-nav-open');
  }
};
/***
 *
 * @param {Finder} elt
 * @constructor
 */


function CommandController(elt) {
  Object.keys(this.constructor.prototype).forEach(key => {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  });
  this.elt = elt;
  this.$normalActionCtn = this.elt.$nomalActionCtn;
  this.$tinyActionCtn = this.elt.$tinyActionCtn;
  this.commands = Object.assign({}, FinderCommands);
  this.buttonNames = ['upload', 'view', 'download', 'move', 'rename', 'delete'];
  this.folderMenuItemNames = ['upload_to_folder', 'move_dir'];
  this.contentMenuItemNames = ['view', 'download', 'upload', 'select_all', 'move', 'delete', 'rename'];
  this.$navCtn = this.elt.$navCtn;
  this.$navCtn.defineEvent('contextmenu').on('contextmenu', this.ev_navContextMenu);
  this.$contentCtn = this.elt.$contentCtn;
  this.$contentCtn.defineEvent('contextmenu').on('contextmenu', this.ev_contentContextMenu);
  this.updateButtons();
}

CommandController.prototype.updateButtons = function () {
  this.$normalActionCtn.clearChild();
  var buttons = this.buttonNames.map(name => {
    var desc = this.commands[name] || {};
    return (0, _ACore._)({
      tag: _FlexiconButton.default.tag,
      attr: {
        name: name
      },
      props: {
        text: desc.text || name
      },
      on: {
        click: () => {
          this.execCommand(name);
        }
      }
    });
  });
  this.$normalActionCtn.addChild(buttons);
  buttons = this.buttonNames.map(name => {
    var desc = this.commands[name] || {};
    return (0, _ACore._)({
      tag: 'button',
      class: 'as-transparent-button',
      attr: {
        name: name
      },
      child: desc.icon,
      on: {
        click: () => {
          this.execCommand(name);
        }
      }
    });
  });
  this.$tinyActionCtn.addChild(buttons);
  this.elt.layoutCtn.requestUpdateActionButtonSize();
};

CommandController.prototype.execCommand = function (name) {
  var args = Array.prototype.slice.call(arguments, 1);
  var desc = this.commands[name];

  if (desc && typeof desc.exec === 'function') {
    return desc.exec.apply(this.elt, args);
  }

  return null;
};

CommandController.prototype.addCommand = function (name, desc) {
  this.commands[name] = Object.assign({}, this.commands[name], desc);
};
/****
 *
 * @param {string} name
 * @param {string=} bf
 */


CommandController.prototype.addButton = function (name, bf) {
  var idx = this.buttonNames.indexOf(bf);
  var bfElt;

  if (idx >= 0) {
    this.buttonNames.splice(idx, 0, name);
    bfElt = (0, _ACore.$)(`button[name="${name}"]`, this.$normalActionCtn);
  } else {
    this.buttonNames.push(name);
  }

  var desc = this.commands[name] || {};
  this.$normalActionCtn.addChildBefore((0, _ACore._)({
    tag: _FlexiconButton.default.tag,
    attr: {
      name: name
    },
    props: {
      text: desc.text || name
    },
    on: {
      click: () => {
        this.execCommand(name);
      }
    }
  }), bfElt);
  this.elt.layoutCtn.requestUpdateActionButtonSize();
};
/****
 *
 * @param {string} name
 * @param {string=} bf
 */


CommandController.prototype.addFolderMenuItem = function (name, bf) {
  idx = this.folderMenuItemNames.indexOf(name);
  if (idx >= 0) return;
  var idx = this.folderMenuItemNames.indexOf(bf);
  if (idx >= 0) this.folderMenuItemNames.splice(idx, 0, name);else this.folderMenuItemNames.push(name);
};
/****
 *
 * @param {string} name
 * @param {string=} bf
 */


CommandController.prototype.addContentMenuItem = function (name, bf) {
  idx = this.folderMenuItemNames.indexOf(name);
  if (idx >= 0) return; //todo

  var idx = this.folderMenuItemNames.indexOf(bf);
  if (idx >= 0) this.folderMenuItemNames.splice(idx, 0, name);else this.folderMenuItemNames.push(name);
};

CommandController.prototype.ev_navContextMenu = function (event) {
  var expTree;
  var c = event.target;

  while (c && !expTree) {
    if (c.stat) expTree = c;
    c = c.parentElement;
  }

  if (expTree) this.elt.navCtrl.viewDir(expTree.stat.path, [this.elt.rootPath].concat(expTree.getPath()).join('/'));
  var items = this.folderMenuItemNames.map(name => {
    var desc = this.commands[name];
    if (!desc) return null;

    if (typeof desc.match === "function") {
      if (!desc.match.call(this.elt, expTree)) return null;
    }

    return {
      text: desc.text,
      icon: desc.icon,
      cmd: name
    };
  }).filter(x => !!x);

  if (items.length > 0) {
    event.showContextMenu({
      items: items
    }, event => {
      var cmd = event.menuItem.cmd;
      this.execCommand(cmd, expTree);
    });
  }
};

CommandController.prototype.ev_contentContextMenu = function (event) {
  var fileElt;
  var c = event.target;

  while (c && !fileElt) {
    if (c.stat) fileElt = c;
    c = c.parentElement;
  }

  var selectedElements = this.elt.selectCtrl.$selectedItems;

  if (fileElt && selectedElements.indexOf(fileElt) < 0) {
    this.elt.selectCtrl.deselectAll();
    this.elt.selectCtrl.select(fileElt);
  } // if (expTree) this.elt.navCtrl.viewDir(expTree.stat.path, [this.elt.rootPath].concat(expTree.getPath()).join('/'));


  var items = this.contentMenuItemNames.map(name => {
    var desc = this.commands[name];
    if (!desc) return null;

    if (typeof desc.match === "function") {
      if (!desc.match.call(this.elt, fileElt)) return null;
    }

    return {
      text: desc.text,
      icon: desc.icon,
      cmd: name
    };
  }).filter(x => !!x);

  if (items.length > 0) {
    event.showContextMenu({
      items: items
    }, event => {
      var cmd = event.menuItem.cmd;
      this.execCommand(cmd, fileElt);
    });
  }
};
/***
 * for desktop
 * @param {Finder} elt
 * @constructor
 */


function SelectController(elt) {
  this.elt = elt;
  this.$selectedItems = []; // first element is focus

  this.$content = this.elt.$content;
  this.$contentCtn = this.elt.$contentCtn;
  Object.keys(this.constructor.prototype).forEach(key => {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  });

  this._setupSelectTool();
}
/***
 *
 * @protected
 */


SelectController.prototype._setupSelectTool = function () {
  this._draged = false;
  this._dragOffset = new _Vec.default(0, 0);
  this.$selectArea = (0, _ACore._)('.as-finder-select-area');
  this.$contentCtn.on('draginit', this.ev_dragInit).on('dragdeinit', this.ev_dragDeinit).on('dragstart', this.ev_dragStart).on('drag', this.ev_drag).on('dragend', this.ev_dragEnd);
};

SelectController.prototype.deselectAll = function () {
  while (this.$selectedItems.length > 0) {
    this.$selectedItems.pop().checked = false;
  }

  this._updateCount();

  this.elt.emit('selectedchange');
};

SelectController.prototype.select = function (elt) {
  //todo: more option
  this.deselectAll();
  this.$selectedItems.push(elt);
  elt.checked = true;

  this._updateCount();

  this.elt.emit('selectedchange');
};

SelectController.prototype.selectAll = function () {
  //todo: more option
  this.deselectAll();
  var fileElements = Array.prototype.slice.call(this.$content.childNodes);
  this.$selectedItems.push.apply(this.$selectedItems, fileElements);
  fileElements.forEach(elt => {
    elt.checked = true;
  });

  this._updateCount();

  this.elt.emit('selectedchange');
};

SelectController.prototype.ev_dragInit = function (event) {
  if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {
    event.cancel();
    return;
  } // event.preventDefault();


  this._draged = false;
};

SelectController.prototype.ev_dragDeinit = function (event) {
  if (!this._draged) this.ev_click(event);
};

SelectController.prototype.ev_dragStart = function (event) {
  this._draged = true;
  this.elt.addClass('as-dragging');
  this.$selectArea.addStyle('z-index', this.elt.findZIndex() + 100 + '').addTo(document.body);

  var bound = _Rectangle.default.fromClientRect(this.$content.getBoundingClientRect());

  this._dragOffset = event.currentPoint.sub(bound.A());
  var pos = bound.A().add(this._dragOffset);
  this.$selectArea.addStyle({
    left: pos.x + 'px',
    top: pos.y + 'px'
  });
};

SelectController.prototype.ev_drag = function (event) {
  this._draged = true;

  var bound = _Rectangle.default.fromClientRect(this.$content.getBoundingClientRect());

  var A = bound.A().add(this._dragOffset);
  var C = event.currentPoint;

  var sRect = _Rectangle.default.boundingPoints([A, C]);

  this.$selectArea.addStyle({
    left: sRect.x + 'px',
    top: sRect.y + 'px',
    width: sRect.width + 'px',
    height: sRect.height + 'px'
  });
};

SelectController.prototype.ev_dragEnd = function () {
  while (this.$selectedItems.length > 0) {
    this.$selectedItems.pop().checked = false;
  }

  var selectBound = _Rectangle.default.fromClientRect(this.$selectArea.getBoundingClientRect());

  Array.prototype.forEach.call(this.$content.childNodes, elt => {
    var bound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    if (selectBound.isCollapse(bound, 0)) {
      this.$selectedItems.push(elt);
      elt.checked = true;
    }
  });
  this._draged = true;
  this.$selectArea.remove();
  this.elt.removeClass('as-dragging');

  this._updateCount();

  this.elt.layoutCtn.update();
  this.elt.emit('selectedchange');
};

SelectController.prototype._updateCount = function () {
  var folderCount = this.$selectedItems.filter(elt => elt.stat.isDirectory).length;
  this.elt.attr('data-selected-file-count', this.$selectedItems.length - folderCount + '');
  this.elt.attr('data-selected-folder-count', folderCount + '');
};

SelectController.prototype.ev_click = function (event) {
  event = event.originalEvent || event.originEvent || event;
  var c = event.target;
  var itemElt;

  while (c && !itemElt) {
    if (c.hasClass && c.hasClass('as-file-thumbnail')) {
      itemElt = c;
      break;
    }

    c = c.parentElement;
  }

  var focusIdx;
  var currentIdx;

  if (this.$selectedItems.length === 0 && itemElt) {
    this.$selectedItems.push(itemElt);
    itemElt.checked = true;
  } else if ((0, _EventEmitter.isMouseRight)(event)) {} else if (!event.ctrlKey && !event.shiftKey) {
    while (this.$selectedItems.length > 0) {
      this.$selectedItems.pop().checked = false;
    }

    if (itemElt) {
      this.$selectedItems.push(itemElt);
      itemElt.checked = true;
    }
  } else if (event.shiftKey) {
    if (itemElt) {
      focusIdx = Array.prototype.indexOf.call(this.$content.childNodes, this.$selectedItems[0]);
      currentIdx = Array.prototype.indexOf.call(this.$content.childNodes, itemElt);

      while (this.$selectedItems.length > 1) {
        this.$selectedItems.pop().checked = false;
      }

      while (currentIdx !== focusIdx) {
        itemElt = this.$content.childNodes[currentIdx];
        this.$selectedItems.push(itemElt);
        itemElt.checked = true;
        if (currentIdx < focusIdx) currentIdx++;else currentIdx--;
      }
    }
  } else if (event.ctrlKey) {
    if (itemElt) {
      currentIdx = this.$selectedItems.indexOf(itemElt);

      if (currentIdx >= 0) {
        this.$selectedItems.splice(currentIdx, 1);
        itemElt.checked = false;
      } else {
        this.$selectedItems.unshift(itemElt);
        itemElt.checked = true;
      }
    }
  }

  this._updateCount();

  this.elt.layoutCtn.update();
  this.elt.emit('selectedchange');
};
/***
 * @extends SelectController
 * @param elt
 * @constructor
 */


function MobileSelectController(elt) {
  SelectController.apply(this, arguments);
}

_OOP.default.mixClass(MobileSelectController, SelectController);

MobileSelectController.prototype._setupSelectTool = function () {
  this.$content.on('click', this.ev_click);
};
/***
 *
 * @param {Finder} elt
 * @constructor
 */


function UploadController(elt) {
  /***
   *
   * @type {Finder}
   */
  this.elt = elt;
  this.$body = this.elt.$body;
  Object.keys(this.constructor.prototype).forEach(key => {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  });
  this.$body.on({
    fileenter: this.ev_fileEnter,
    filedrop: this.ev_fileDrop
  });
}

UploadController.prototype.upload = function (files) {
  var contentElt = (0, _ACore._)({
    style: {
      maxHeight: '50vh',
      overflow: 'auto'
    },
    child: {
      style: {
        display: 'table'
      },
      child: files.map(file => ({
        style: {
          display: 'table-row'
        },
        child: [{
          style: {
            display: 'table-cell',
            padding: '5px 20px 5px 10px'
          },
          child: {
            style: {
              'min-width': '30em'
            },
            child: {
              text: file.name
            }
          }
        }, {
          style: {
            display: 'table-cell',
            padding: '5px 10px'
          },
          child: {
            class: 'as-upload-percent',
            style: {
              'min-width': '3em',
              textAlign: 'right',
              color: 'rgb(30,237,219)'
            },
            child: {
              text: ''
            }
          }
        }]
      }))
    }
  });
  var modal = (0, _ACore._)({
    tag: _Modal.default.tag,
    style: {
      zIndex: this.elt.findZIndex() + 9000
    },
    child: {
      tag: _MessageDialog.default.tag,
      props: {
        dialogTitle: 'Tải lên'
      },
      child: contentElt
    }
  }).addTo(document.body);
  var syncs = files.map((file, i) => {
    var percentText = (0, _ACore.$)('.as-upload-percent', contentElt.firstChild.childNodes[i]);
    return this.elt.fileSystem.writeFile(this.elt.path + '/' + file.name, file, done => {
      var textBound = percentText.getBoundingClientRect();
      var ctnBound = contentElt.getBoundingClientRect();

      if (textBound.bottom > ctnBound.bottom) {
        contentElt.scrollTop += textBound.bottom - ctnBound.bottom;
      }

      percentText.firstChild.data = Math.round(done * 100) + '%';
    });
  });
  Promise.all(syncs).then(() => {
    this.elt.navCtrl.reload(this.elt.path, true).then(() => modal.remove());
  });
};

UploadController.prototype.ev_fileEnter = function (event) {
  var files = Array.prototype.slice.call(event.dataTransfer.files);
  if (files.length === 0) return;
};

UploadController.prototype.ev_fileDrop = function (event) {
  if (this.elt.searchCtrl.state === "RUNNING") return;
  var files = event.files;
  if (files.length > 0) this.upload(files);
};
/***
 * @extends EventEmitter
 * @param {Finder} elt
 * @constructor
 */


function FolderDialog(elt) {
  _EventEmitter.default.call(this);

  this.elt = elt;
}

_OOP.default.mixClass(FolderDialog, _EventEmitter.default);

FolderDialog.prototype._init = function () {
  if (this.$modal) return;
  this.$modal = (0, _ACore._)({
    tag: 'modal',
    class: 'as-finder-folder-dialog-modal',
    child: {
      tag: _MessageDialog.default.tag,
      props: {
        dialogTitle: 'Duyệt thư mục',
        dialogActions: [{
          name: 'ok',
          text: 'OK'
        }, {
          name: 'cancel',
          text: 'Hủy'
        }]
      },
      child: [{
        class: 'as-finder-folder-dialog-content',
        child: [{
          class: 'as-finder-folder-dialog-selected-ctn',
          child: [{
            tag: 'span',
            child: {
              text: 'Đã chọn thư mục: '
            }
          }, {
            tag: 'span',
            child: {
              text: ' ... '
            }
          }]
        }, {
          class: 'as-finder-folder-dialog-tree-ctn',
          child: [{
            tag: _ExpTree.ExpGroup.tag
          }, {
            tag: _ExpTree.ExpTree.tag,
            class: 'as-finder-folder-dialog-tree-root',
            props: {
              name: 'root',
              icon: 'span.mdi.mdi-harddisk'
            }
          }]
        }]
      }]
    }
  });
  this.$dialog = (0, _ACore.$)(_MessageDialog.default.tag, this.$modal);
  this.$treeCtn = (0, _ACore.$)('.as-finder-folder-dialog-tree-ctn', this.$modal);
  this.$rootTree = (0, _ACore.$)('.as-finder-folder-dialog-tree-root', this.$modal);
  this.$content = (0, _ACore.$)('.as-finder-folder-dialog-content', this.$modal);
  this.$expGroup = (0, _ACore.$)(_ExpTree.ExpGroup.tag, this.$content);
  this.$selectedCtn = (0, _ACore.$)('.as-finder-folder-dialog-selected-ctn', this.$content);
  this.$selectedPath = this.$selectedCtn.childNodes[1];
  this.$activeNode = null;
};

FolderDialog.prototype.open = function (initPath, showRoot, checkFunc, title) {
  var cPath = initPath;

  this._init();

  var fileSystem = this.elt.fileSystem;
  var zIndex = this.elt.findZIndex() + 9000;
  this.$modal.addStyle('z-index', zIndex + '');
  this.$modal.addTo(document.body);

  if (this.$activeNode) {
    this.$activeNode.active = false;
    this.$activeNode = null;
  }

  this.$dialog.$actionBtns[0].disabled = true;
  this.$dialog.dialogTitle = title || 'Duyệt';

  var makeTree = (path, ctnElt, level) => {
    level = level || 0;
    return fileSystem.readDir(path).then(dirs => Promise.all(dirs.map(dir => fileSystem.stat(path + '/' + dir)))).then(stats => stats.filter(stat => {
      return stat.isDirectory;
    })).then(stats => {
      var syncs = [];
      ctnElt.clearChild();
      var children = stats.map(stat => {
        var nodePath = path + '/' + stat.name;
        var node = (0, _ACore._)({
          tag: _ExpTree.ExpTree.tag,
          props: {
            stat: stat,
            name: stat.displayName || stat.name,
            icon: {
              tag: 'img',
              props: {
                src: _MessageInput.default.iconAssetRoot + '/folder.svg'
              }
            },
            path: nodePath
          },
          on: {
            statuschage: () => {},
            press: () => {
              if (this.$activeNode) this.$activeNode.active = false;
              this.$activeNode = node;
              this.$activeNode.active = true;
              this.$selectedPath.firstChild.data = node.getPath().join('/');
              cPath = nodePath;

              if (checkFunc && !checkFunc(cPath)) {
                this.$dialog.$actionBtns[0].disabled = true;
              } else {
                this.$dialog.$actionBtns[0].disabled = false;
              }
            }
          }
        });

        if (nodePath === cPath) {
          node.active = true;
          this.$activeNode = node;
        }

        if (checkFunc && !checkFunc(nodePath)) {
          node.getNode().addStyle('opacity', 0.3 + '');
        }

        node.getNode().on({
          dblclick: () => {
            if (node.status === 'close') {
              node.status = 'open';
            } else if (node.status === 'open') {
              node.status = 'close';
            }
          }
        });
        if (stat.name !== 'node_modules') syncs.push(makeTree(nodePath, node, level + 1));
        return node;
      });
      children.forEach(c => {
        ctnElt.addChild(c);
      });

      if (children.length) {
        ctnElt.status = level > 1 ? 'close' : 'open';
      } else {
        ctnElt.status = 'none';
      }

      return Promise.all(syncs);
    });
  };

  var onRootPress;

  if (showRoot) {
    this.$expGroup.addStyle('display', 'none');
    this.$rootTree.removeStyle('display');

    if (cPath === this.elt.rootPath) {
      this.$activeNode = this.$rootTree;
      this.$activeNode.active = true;
    }

    onRootPress = () => {
      var node = this.$rootTree;
      var nodePath = this.elt.rootPath;
      if (this.$activeNode) this.$activeNode.active = false;
      this.$activeNode = node;
      this.$activeNode.active = true;
      this.$selectedPath.firstChild.data = node.getPath().join('/');
      cPath = nodePath;

      if (cPath === initPath || checkFunc && !checkFunc(cPath)) {
        this.$dialog.$actionBtns[0].disabled = true;
      } else {
        this.$dialog.$actionBtns[0].disabled = false;
      }
    };

    this.$rootTree.on('press', onRootPress);
  } else {
    this.$expGroup.removeStyle('display');
    this.$rootTree.addStyle('display', 'none');
  }

  makeTree(this.elt.rootPath, showRoot ? this.$rootTree : this.$expGroup).then(() => {
    var p;

    if (this.$activeNode) {
      this.$selectedPath.firstChild.data = this.$activeNode.getPath().join('/');
      p = this.$activeNode.getParent();

      while (p) {
        if (p.status === 'close') {
          p.status = 'open';
        }

        p = p.getParent && p.getParent();
      }

      setTimeout(() => {
        (0, _utils.vScrollIntoView)(this.$activeNode.firstChild);
      }, 10);
    }
  });
  return new Promise(resolve => {
    var finish = event => {
      this.$dialog.off('action', finish);
      this.$modal.remove();
      if (event.action.name === 'cancel') resolve(null);else resolve(cPath);

      if (onRootPress) {
        this.$rootTree.off('press', onRootPress);
      }
    };

    this.$dialog.on('action', finish);
  });
};
/***
 *
 * @param {Finder} elt
 * @constructor
 */


function NavigatorController(elt) {
  this.elt = elt;
  this.path = '';
  this.rootPath = '';
  this._states = {};
  this._notifiedVisibleIdx = 0;
  this.$navCtn = this.elt.$navCtn;
  this.$nav = this.elt.$nav;
  this.$contentCtn = this.elt.$contentCtn;
  this.$content = this.elt.$content;
  Object.keys(this.constructor.prototype).forEach(key => {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  });
  this.$contentCtn.on('scroll', this.ev_contentScroll);
}

NavigatorController.prototype.onStart = function () {
  /**
   *
   * @type {AbsolFileSystem}
   */
  this.fileSystem = this.elt.fileSystem;
  this.$treeByPath = {};
  this.$treeByPath[this.rootPath || '..'] = this.$nav;
  this.reload(this.rootPath, true);
};

NavigatorController.prototype.reload = function (fromPath, autoOpen) {
  var opened = !autoOpen;

  var makeTree = (path, ctnElt) => {
    if (!opened && ctnElt.path) {
      this.viewDir(ctnElt.path, [this.elt.rootPath].concat(ctnElt.getPath()).join('/'));
      opened = true;
    }

    return this.fileSystem.readDir(path).then(dirs => Promise.all(dirs.map(dir => this.fileSystem.stat(path + '/' + dir)))).then(stats => stats.filter(stat => {
      return stat.isDirectory;
    })).then(stats => {
      var syncs = [];
      ctnElt.clearChild();
      var children = stats.map(stat => {
        var nodePath = path + '/' + stat.name;
        var node = (0, _ACore._)({
          tag: _ExpTree.ExpTree.tag,
          props: {
            stat: stat,
            name: stat.displayName || stat.name,
            icon: {
              tag: 'img',
              props: {
                src: _MessageInput.default.iconAssetRoot + '/folder.svg'
              }
            },
            path: nodePath
          },
          on: {
            statuschage: () => {
              this._states[path + '/' + stat.name] = node.status;
            },
            press: () => {
              if (this.path !== nodePath) this.viewDir(nodePath, [this.elt.rootPath].concat(node.getPath()).join('/'));
            }
          }
        });
        node.getNode().on({
          dblclick: () => {
            if (node.status === 'close') {
              node.status = 'open';
            } else if (node.status === 'open') {
              node.status = 'close';
            }

            this._states[nodePath] = node.status;
          }
        });
        this.$treeByPath[nodePath] = node;
        if (stat.name !== 'node_modules') syncs.push(makeTree(nodePath, node));

        if (!opened) {
          this.viewDir(nodePath, [this.elt.rootPath].concat(node.getPath()).join('/'));
          opened = true;
        }

        return node;
      });
      children.forEach(c => {
        ctnElt.addChild(c);
      });

      if (children.length) {
        if (this._states[ctnElt.path] === 'close' || this._states[ctnElt.path] === 'open') {
          ctnElt.status = this._states[ctnElt.path];
        } else {
          ctnElt.status = 'close';
        }
      } else {
        ctnElt.status = 'none';
      }

      return Promise.all(syncs);
    });
  };

  if (this.$treeByPath[fromPath || '..']) return makeTree(fromPath, this.$treeByPath[fromPath || '..']);
  return Promise.resolve();
};

NavigatorController.prototype.viewDir = function (path) {
  this.elt.selectCtrl.deselectAll();

  if (this.$treeByPath[this.path]) {
    this.$treeByPath[this.path].active = false;
    this.$treeByPath[this.path].active = false;
  }

  this.path = path;
  this.$treeByPath[this.path].active = true;
  var c = this.$treeByPath[this.path].getParent();

  while (c) {
    if (c.status === 'close') c.status = 'open';
    c = c.getParent && c.getParent();
  }

  (0, _utils.vScrollIntoView)(this.$treeByPath[this.path].firstChild);
  this.fileSystem.stat(path).then(stat => {
    if (this.path !== path) return;
    if (stat.writable) this.elt.addClass('as-writable-folder');else this.elt.removeClass('as-writable-folder');
  });
  this.fileSystem.readDir(path).then(dirs => Promise.all(dirs.map(dir => this.fileSystem.stat(path + '/' + dir)))).then(stats => {
    if (this.path !== path) return;
    stats.sort((a, b) => {
      var aName, bName;

      if (a.isDirectory === b.isDirectory) {
        aName = a.displayName || a.name;
        bName = b.displayName || b.name;
        if (aName < bName) return -1;
        return 1;
      } else {
        if (a.isDirectory) return -1;
        return 1;
      }
    });
    this.viewContent(stats);
  });
};

NavigatorController.prototype.viewContent = function (stats) {
  this.clearContent();
  stats.forEach(stat => {
    this.pushContentItem(stat);
  });
  this.notifyVisibleContentItems();
};

NavigatorController.prototype.clearContent = function () {
  this._notifiedVisibleIdx = 0;
  this.$content.clearChild();
};

NavigatorController.prototype.pushContentItem = function (stat) {
  var elt = (0, _ACore._)({
    tag: _FileThumbnail.default.tag,
    extendEvent: ['visible'],
    attr: {
      title: stat.displayName || stat.name
    },
    props: {
      isDirectory: stat.isDirectory,
      value: stat.url,
      fileName: stat.displayName || stat.name,
      stat: stat
    },
    on: {
      visible: () => {
        var mineType = _ext2MineType.default[elt.fileType];

        if (mineType && mineType.startsWith('image/')) {
          elt.thumbnail = stat.url;
        }
      },
      dblclick: () => {
        this.elt.execCommand('view');
      }
    }
  });
  this.$content.addChild(elt);
};

NavigatorController.prototype.notifyVisibleContentItems = function () {
  var elt;
  var bound = this.$contentCtn.getBoundingClientRect();
  var eBound;

  while (this._notifiedVisibleIdx < this.$content.childNodes.length) {
    elt = this.$content.childNodes[this._notifiedVisibleIdx];
    eBound = elt.getBoundingClientRect();

    if (eBound.top < bound.bottom) {
      elt.emit('visible');
    } else {
      break;
    }

    this._notifiedVisibleIdx++;
  }
};

NavigatorController.prototype.expandAll = function () {
  var visit = nodeElt => {
    if (nodeElt.status === 'close') {
      nodeElt.status = 'open';
      this._states[nodeElt.path] = 'open';
    }

    if (nodeElt.status === 'open') {
      nodeElt.getChildren().forEach(visit);
    }
  };

  Array.prototype.forEach.call(this.$nav.childNodes, visit);
};

NavigatorController.prototype.collapseAll = function () {
  var visit = nodeElt => {
    if (nodeElt.status === 'open') {
      nodeElt.status = 'close';
      this._states[nodeElt.path] = 'close';
    }

    if (nodeElt.status === 'close') {
      nodeElt.getChildren().forEach(visit);
    }
  };

  Array.prototype.forEach.call(this.$nav.childNodes, visit);
};

NavigatorController.prototype.ev_contentScroll = function (event) {
  this.notifyVisibleContentItems();
};

var fileTextQuery2Regex = text => {
  var code = (0, _stringFormat.nonAccentVietnamese)(text.toLowerCase()).replace(/[.,+^$()\[\]{}|\\]/g, x => '\\' + x).replace(/\*+/g, '(.*)').replace(/\?/g, '.');
  return new RegExp(code, 'i');
};
/***
 * @extends Context
 * @param {Finder} elt
 * @constructor
 */


function SearchController(elt) {
  _Context.default.apply(this);

  this.elt = elt;
  this.$searchText = this.elt.$searchText.on('keydown', event => {
    if (event.key === 'Enter') {
      this.$searchText.blur();
      this.search();
    }
  });
}

_OOP.default.mixClass(SearchController, _Context.default);

SearchController.prototype.onStart = function () {
  // console.log('start')
  this.elt.addClass('as-searching');
  this.$searchText.value = '';
  this.$searchText.focus();
};

SearchController.prototype.onStop = function () {
  this.elt.removeClass('as-searching');
  this.session = (0, _stringGenerate.randomIdent)(10);
  this.$searchText.waiting = false;
};

SearchController.prototype.search = function () {
  var session = (0, _stringGenerate.randomIdent)(10);
  this.session = session;
  this.elt.navCtrl.clearContent();
  this.$searchText.waiting = true;
  var fileSystem = this.elt.fileSystem;
  var rootPath = this.elt.rootPath;
  var result = [];
  var type = this.elt.$searchTypeSelect.value;
  var text = this.$searchText.value.trim();
  var regex = fileTextQuery2Regex(text);

  var isMatched = stat => {
    var fileInfo = (0, _utils.fileInfoOf)(stat.displayName || stat.name);
    var mineType = fileInfo.mimeType || '';
    var fileType = fileInfo.type || '';
    fileType = fileType.toLowerCase();

    if (mineType && type !== 'all') {
      if (type === 'image' && !mineType.startsWith('image') && type !== 'svg') {
        return false;
      } else if (type === 'document' && ['doc', 'docx', 'pdf', 'xlsx'].indexOf(fileType) < 0 && !mineType.startsWith('text')) {
        return false;
      }
    }

    if (text.length === 0) return true;
    if (stat.displayName && stat.displayName.match(regex)) return true;
    if (stat.name && (0, _stringFormat.nonAccentVietnamese)(stat.name.toLowerCase()).match(regex)) return true;
    return false;
  };

  var handleStat = stat => {
    if (session !== this.session) return;
    if (stat.isDirectory) return visitDir(stat.path);

    if (isMatched(stat)) {
      this.elt.navCtrl.pushContentItem(stat);
      this.elt.navCtrl.notifyVisibleContentItems();
    }
  };

  var handleDirResult = (dir, names) => {
    var syncs = names.map(name => {
      return fileSystem.stat(dir + '/' + name).then(stat => {
        if (session !== this.session) return;
        if (stat) return handleStat(stat);
      });
    });
    return Promise.all(syncs);
  };

  var visitDir = path => {
    return fileSystem.readDir(path).then(names => handleDirResult(path, names));
  };

  visitDir(rootPath).then(() => {
    if (session !== this.session) return;
    this.$searchText.waiting = false;
  });
};
/***
 *
 * @constructor
 */


function FinderFileSystem() {}

FinderFileSystem.prototype.supporteDisplayName = false;

FinderFileSystem.prototype.readDir = function (path) {};

FinderFileSystem.prototype.unlink = function (path) {
  console.log(path);
};

FinderFileSystem.prototype.stat = function (path) {};

FinderFileSystem.prototype.rmdir = function (path) {};

FinderFileSystem.prototype.mkdir = function (path) {};

FinderFileSystem.prototype.writeFile = function (file, data) {};

FinderFileSystem.prototype.copy = function () {};

FinderFileSystem.prototype.rename = function (path, name) {};

FinderFileSystem.prototype.move = function (oldPath, newPath) {};

FinderFileSystem.prototype.clearCache = function () {};
/***
 * @extends FinderFileSystem
 * @constructor
 */


function AbsolFileSystem() {
  FinderFileSystem.apply(this, arguments);
  this.sync = Promise.resolve();
  this.cache = {
    readDir: {},
    stats: {}
  };
  this.taskMng = new _TaskManager.default({
    limit: 4
  });
}

_OOP.default.mixClass(AbsolFileSystem, FinderFileSystem);

AbsolFileSystem.prototype.clearCache = function () {
  this.cache = {
    readDir: {},
    stats: {}
  };
};

AbsolFileSystem.prototype.readDir = function (path) {
  this.sync = this.sync.then(() => {
    if (this.cache.readDir[path || '..']) return this.cache.readDir[path || '..'];
    return fetch('https://absol.cf/filesystem/ls.php', {
      method: 'POST',
      cache: "no-cache",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        path: path
      })
    }).then(res => res.json()).then(res => {
      res = res.filter(c => c.path.startsWith('/html'));
      res.forEach(c => {
        c.name = c.path.split('/').pop();
        c.url = c.path.replace('/html', 'https://absol.cf');
      });
      this.cache.readDir[path || '..'] = res.map(c => c.name);
      res.forEach(c => {
        this.cache.stats[c.path] = c;
      });
    }).then(() => {
      return this.cache.readDir[path || '..'];
    });
  });
  return this.sync;
};

AbsolFileSystem.prototype.stat = function (path) {
  return this.sync.then(() => {
    path = path || '';
    if (this.cache.stats[path || '..']) return this.cache.stats[path || '..'];
    var dir = path.split('/');
    dir.pop();
    dir = dir.join('/');
    return this.readDir(dir).then(() => {
      return this.cache.stats[path || '..'];
    });
  });
};
/***
 *
 * @param file
 * @param {File|Blob}data
 * @param {function(done: number):void=}onProcess
 */


AbsolFileSystem.prototype.writeFile = function (file, data, onProcess) {
  if (file.toLowerCase().endsWith('.php')) file += '.txt';
  var folderPath = file.split('/');
  folderPath.pop();
  folderPath = folderPath.join('/');
  delete this.cache.readDir[folderPath];
  var prefix = ['file', new Date().getTime(), (0, _random.randomArbitrary)(0, 1000000) >> 0].join('_');
  var parts = [];
  var chuck_limit = 2 << 20;
  var partName;
  var fileSize = data.size;
  var fileStartOffset = 0;
  var fileEndOffset = 0;
  var idx = 0;
  var syncs = [];
  var syncDone = 0;
  var bundle;
  var began = false;

  var handle = bundle => {
    return new Promise(rs => {
      this.taskMng.requestTask((finishTask, bundle) => {
        if (typeof onProcess === "function" && !began) {
          began = true;
          onProcess(syncDone / (syncs.length || 1));
        }

        var form = new FormData();
        form.append('action', 'upload_part');
        form.append('fileUpload', bundle.file, bundle.name);
        fetch('https://absol.cf/filesystem/writefile.php', {
          method: 'POST',
          body: form
        }).then(res => res.text()).then(text => {
          if (text !== 'OK') throw new Error(text);
          syncDone++;

          if (typeof onProcess === "function") {
            onProcess(syncDone / (syncs.length || 1));
          }

          rs('https://absol.cf');
          finishTask();
        });
      }, bundle);
    });
  };

  while (fileStartOffset < fileSize) {
    fileEndOffset = Math.min(fileStartOffset + chuck_limit, fileSize);
    partName = prefix + '.p' + idx;
    parts.push(partName);
    bundle = {
      file: data.slice(fileStartOffset, fileEndOffset),
      idx: idx,
      name: partName
    };
    idx++;
    fileStartOffset = fileEndOffset;
    syncs.push(handle(bundle));
  }

  return Promise.all(syncs).then(() => {
    var form = new FormData();
    form.append('action', 'join_parts');
    form.append('parts', parts.join(';'));
    form.append('path', file);
    fetch('https://absol.cf/filesystem/writefile.php', {
      method: 'POST',
      body: form
    }).then(res => res.text()).then(text => {
      if (text !== 'OK') throw new Error(text);
    });
  });
};

AbsolFileSystem.prototype.unlink = function (path) {
  var folderPath = path.split('/');
  folderPath.pop();
  folderPath = folderPath.join('/');
  delete this.cache.readDir[folderPath];
  var form = new FormData();
  form.append('action', 'delete_files');
  form.append('paths', path);
  return fetch('https://absol.cf/filesystem/writefile.php', {
    method: 'POST',
    body: form
  }).then(res => res.text()).then(text => {
    if (text !== 'OK') throw new Error(text);
  });
};

AbsolFileSystem.prototype.rename = function (path, name) {
  var folderPath = path.split('/');
  folderPath.pop();
  folderPath = folderPath.join('/');
  var form = new FormData();
  form.append('action', 'rename');
  form.append('path', path);
  form.append('new_name', name);
  return fetch('https://absol.cf/filesystem/writefile.php', {
    method: 'POST',
    body: form
  }).then(res => res.text()).then(text => {
    if (text !== 'OK') throw new Error(text);
    var newPath = folderPath + '/' + name;
    delete this.cache.readDir[folderPath];
    delete this.cache.stats[path];
    return {
      url: newPath.replace('/html', 'https://absol.cf'),
      path: newPath,
      name: name
    };
  });
};

AbsolFileSystem.prototype.move = function (oldPath, newPath) {
  var oldFolderPath = oldPath.split('/');
  oldFolderPath.pop();
  oldFolderPath = oldFolderPath.join('/');
  var newFolderPath = newPath.split('/');
  newFolderPath.pop();
  newFolderPath = newFolderPath.join('/');
  var form = new FormData();
  form.append('action', 'move');
  form.append('old_path', oldPath);
  form.append('new_path', newPath);
  return fetch('https://absol.cf/filesystem/writefile.php', {
    method: 'POST',
    body: form
  }).then(res => res.text()).then(text => {
    if (text !== 'OK') throw new Error(text);
    delete this.cache.readDir[oldFolderPath];
    delete this.cache.readDir[newFolderPath];
    delete this.cache.stats[oldPath];
  });
};
};

moduleFactories["node_modules/absol-acomp/js/TreeChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TreeChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../css/treechart.css");

var _ACore = _interopRequireWildcard(require("../ACore"));

var _generator = require("absol/src/JSMaker/generator");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _utils = require("./utils");

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));




function autoThemeVariable(viewElt) {
  var cp = getComputedStyle(document.body);
  var color = cp.getPropertyValue('--menu-background-color') || cp.getPropertyValue('--variant-color-primary') || 'blue';
  color = _Color.default.parse(color.trim());
  var hsla = color.toHSLA();
  hsla[2] = (hsla[2] + 1) / 2;
  hsla[1] = (hsla[1] + 0.2) / 2;

  var nColor = _Color.default.fromHSLA(hsla[0], hsla[1], hsla[2], hsla[3]);

  viewElt.addStyle('--node-background-color', nColor.toString('rgba'));
  nColor = nColor.getContrastYIQ();
  viewElt.addStyle('--node-text-color', nColor.toString('rgba'));
}
/***
 * @extends AElement
 * @constructor
 */


function TreeChart() {
  autoThemeVariable(this);
  this.$domSignal = (0, _ACore._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('formatSize', this._formatSize.bind(this));
  this.$root = null;
  this._maxHorizonLevel = 2;
  /***
   * @name data
   * @type {any}
   * @memberOf TreeChart#
   */

  /***
   * @name maxHorizonLevel
   * @type {number}
   * @memberOf TreeChart#
   */
}

TreeChart.tag = 'TreeChart';

TreeChart.render = function () {
  return (0, _ACore._)({
    class: 'as-tree-chart'
  });
};

TreeChart.prototype._updateContent = function () {
  if (this.$root) {
    this.$root.remove();
    this.$root = null;
  }

  var data = this.data;
  if (!data) return;

  var makeTree = (nodeData, level) => {
    var elt = (0, _ACore._)({
      class: 'as-tree-chart-node',
      attr: {
        "data-level": level + ''
      },
      child: [{
        class: 'as-tree-chart-text-ctn',
        child: {
          class: 'as-tree-chart-text',
          child: {
            text: nodeData.text || nodeData.name
          }
        }
      }, {
        class: 'as-tree-chart-child-ctn'
      }]
    });
    elt.$text = (0, _ACore.$)('.as-tree-chart-text', elt);
    elt.$childCtn = (0, _ACore.$)('.as-tree-chart-child-ctn', elt);
    if (level === this.maxHorizonLevel) elt.addClass('as-horizontal');

    if (nodeData.items && nodeData.items.length > 0) {
      elt.addClass('as-has-children');
      /***
       * @type {AElement[]}
       */

      elt.$children = nodeData.items.map(it => makeTree(it, level + 1));
      elt.$childCtn.addChild(elt.$children);
    }

    return elt;
  };

  this.$root = makeTree(data, 0).addTo(this);
  this.domSignal.emit('formatSize');
};

TreeChart.prototype._formatSize = function () {
  if (!this.$root) return;
  var cBound = this.getBoundingClientRect();
  var maxHorizonLevel = this.maxHorizonLevel;

  var visit = (elt, level) => {
    if (!elt.$children) return;
    var sArr, maxS;

    if (level < maxHorizonLevel) {
      sArr = elt.$children.map(e => e.$text.getBoundingClientRect().height);
      maxS = Math.max.apply(Math, sArr);
      elt.$children.forEach((elt, i) => {
        if (sArr[i] < maxS) {
          elt.$text.addStyle('height', maxS + 'px');
        }
      });
    } else {
      sArr = elt.$children.map(e => e.$text.getBoundingClientRect().width);
      maxS = Math.max.apply(Math, sArr);
      console.log(elt.$children, sArr);
      elt.$children.forEach((elt, i) => {
        if (sArr[i] < maxS) {
          elt.$text.addStyle('width', maxS + 'px');
        }
      });
    }

    elt.$children.forEach(c => visit(c, level + 1));
  };

  visit(this.$root, 0);
  var newBound = this.getBoundingClientRect();

  if (cBound.width !== newBound.width || cBound.height !== newBound.height) {
    _ResizeSystem.default.update();
  }
};

TreeChart.property = {};
TreeChart.property.data = {
  set: function (data) {
    data = (0, _generator.copyJSVariable)(data || null);
    this._data = data;

    this._updateContent();
  },
  get: function () {
    return this._data;
  }
};
TreeChart.property.maxHorizonLevel = {
  set: function (value) {
    if (!(0, _utils.isNaturalNumber)(value)) value = 2; //default

    this._maxHorizonLevel = value;

    this._updateContent();
  },
  get: function () {
    return this._maxHorizonLevel;
  }
};

_ACore.default.install(TreeChart);

var _default = TreeChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/dom/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/dom/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.publicCreators = void 0;

var _AutoCompleteInput = _interopRequireDefault(require("../AutoCompleteInput"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _BoardTable = _interopRequireDefault(require("../BoardTable"));

var _Board = _interopRequireDefault(require("../Board"));

var _BScroller = _interopRequireDefault(require("../BScroller"));

var _ButtonArray = _interopRequireDefault(require("../ButtonArray"));

var _CalendarInput = _interopRequireWildcard(require("../CalendarInput"));

var _CheckBoxInput = _interopRequireDefault(require("../CheckBoxInput"));

var _CheckBox = _interopRequireDefault(require("../CheckBox"));

var _ChromeCalendar = _interopRequireDefault(require("../ChromeCalendar"));

var _CircleSectionLabel = _interopRequireDefault(require("../CircleSectionLabel"));

var _Scroller = require("../Scroller");

var _ContextMenu = _interopRequireDefault(require("../ContextMenu"));

var _Menu = require("../Menu");

var _DateInput = _interopRequireDefault(require("../DateInput2"));

var _DraggableHStack = _interopRequireDefault(require("../DraggableHStack"));

var _DraggableVStack = _interopRequireDefault(require("../DraggableVStack"));

var _Hanger = _interopRequireDefault(require("../Hanger"));

var _DropPanel = _interopRequireDefault(require("../DropPanel"));

var _DropPanelStack = _interopRequireDefault(require("../DropPanelStack"));

var _EditableText = _interopRequireDefault(require("../EditableText"));

var _EmojiPicker = _interopRequireDefault(require("../EmojiPicker"));

var _Sprite = _interopRequireDefault(require("../Sprite"));

var _ExpTree = _interopRequireWildcard(require("../ExpTree"));

var _FlexiconButton = _interopRequireDefault(require("../FlexiconButton"));

var _FlexiconInput = _interopRequireDefault(require("../FlexiconInput"));

var _Follower = _interopRequireDefault(require("../Follower"));

var _Frame = _interopRequireDefault(require("../Frame"));

var _FrameView = _interopRequireDefault(require("../FrameView"));

var _TabFrame = _interopRequireDefault(require("../TabFrame"));

var _TabView = _interopRequireDefault(require("../TabView"));

var _SinglePage = _interopRequireDefault(require("../SinglePage"));

var _HexaSectionLabel = _interopRequireDefault(require("../HexaSectionLabel"));

var _VRuler = _interopRequireDefault(require("../VRuler"));

var _HRuler = _interopRequireDefault(require("../HRuler"));

var _IconSprite = _interopRequireDefault(require("../IconSprite"));

var _LinearColorBar = _interopRequireDefault(require("../LinearColorBar"));

var _MediaInput = _interopRequireDefault(require("../MediaInput"));

var _MessageInput = _interopRequireWildcard(require("../messageinput/MessageInput"));

var _NumberInput = _interopRequireDefault(require("../numberinput/NumberInput"));

var _NumberSpanInput = _interopRequireDefault(require("../NumberSpanInput"));

var _OnsScreenWindow = _interopRequireDefault(require("../OnsScreenWindow"));

var _PageSelector = _interopRequireDefault(require("../PageSelector"));

var _PreInput = _interopRequireDefault(require("../PreInput"));

var _ProgressBar = _interopRequireDefault(require("../ProgressBar"));

var _QuickListButton = _interopRequireDefault(require("../QuickListButton"));

var _FollowerToggler = _interopRequireDefault(require("../FollowerToggler"));

var _SelectList = _interopRequireDefault(require("../SelectList"));

var _QuickMenu = _interopRequireDefault(require("../QuickMenu"));

var _QuickPath = _interopRequireDefault(require("../QuickPath"));

var _RadioButton = _interopRequireDefault(require("../RadioButton"));

var _Radio = _interopRequireDefault(require("../Radio"));

var _RemoteSvg = _interopRequireDefault(require("../RemoteSvg"));

var _ResizeBox = _interopRequireDefault(require("../ResizeBox"));

var _Searcher = _interopRequireDefault(require("../Searcher"));

var _SelectBox = _interopRequireDefault(require("../SelectBox"));

var _SelectBoxItem = _interopRequireDefault(require("../SelectBoxItem"));

var _SelectTable = _interopRequireDefault(require("../SelectTable"));

var _SelectTable2 = _interopRequireDefault(require("../SelectTable2"));

var _SpanInput = _interopRequireDefault(require("../SpanInput"));

var _StaticTabbar = _interopRequireDefault(require("../StaticTabbar"));

var _Switch = _interopRequireDefault(require("../Switch"));

var _CheckboxButton = _interopRequireDefault(require("../CheckboxButton"));

var _TableScroller = _interopRequireDefault(require("../tablescroller/TableScroller"));

var _TableVScroller = _interopRequireDefault(require("../TableVScroller"));

var _TextArea = _interopRequireDefault(require("../TextArea2"));

var _TextClipboard = _interopRequireDefault(require("../TextClipboard"));

var _TimeInput = _interopRequireDefault(require("../TimeInput"));

var _TimePicker = _interopRequireDefault(require("../TimePicker"));

var _Tooltip = _interopRequireDefault(require("../Tooltip"));

var _TreeList = _interopRequireDefault(require("../TreeList"));

var _TreeListItem = _interopRequireDefault(require("../TreeListItem"));

var _SelectTreeMenu = _interopRequireDefault(require("../SelectTreeMenu"));

var _WidthHeightSizer = _interopRequireDefault(require("../WidthHeightSizer"));

var _Modal = _interopRequireDefault(require("../Modal"));

var _TrackBar = _interopRequireDefault(require("../TrackBar"));

var _TrackBarInput = _interopRequireDefault(require("../TrackBarInput"));

var _SelectMenu = _interopRequireDefault(require("../SelectMenu2"));

var _ButtonRange = _interopRequireDefault(require("../ButtonRange"));

var _DropZone = _interopRequireDefault(require("../DropZone"));

var _RadioInput = _interopRequireDefault(require("../RadioInput"));

var _OnScreenWidget = _interopRequireDefault(require("../OnScreenWidget"));

var _SelectListBox = _interopRequireDefault(require("../SelectListBox"));

var _SelectTreeBox = _interopRequireDefault(require("../SelectTreeBox"));

var _RibbonSplitButton = _interopRequireDefault(require("../RibbonSplitButton"));

var _RibbonButton = _interopRequireDefault(require("../RibbonButton"));

var _TimeSelectInput = _interopRequireDefault(require("../TimeSelectInput"));

var _Snackbar = _interopRequireDefault(require("../Snackbar"));

var _MultiSelectMenu = _interopRequireDefault(require("../MultiSelectMenu"));

var _CountdownClock = _interopRequireDefault(require("../CountdownClock"));

var _Toast = _interopRequireDefault(require("../Toast"));

var _Icons = require("../Icons");

var _EmojiPickerTooltip = _interopRequireDefault(require("../EmojiPickerTooltip"));

var _PageIndicator = _interopRequireDefault(require("../PageIndicator"));

var _EmojiCounter = _interopRequireDefault(require("../EmojiCounter"));

var _EmojiCounterList = _interopRequireDefault(require("../EmojiCounterList"));

var _RotatedText = _interopRequireDefault(require("../RotatedText"));

var _VerticalTreeDiagram = _interopRequireWildcard(require("../VerticalTreeDiagram"));

var _TokenField = _interopRequireDefault(require("../TokenField"));

var _DateTimeInput = _interopRequireDefault(require("../DateTimeInput"));

var _ChromeTimePicker = _interopRequireDefault(require("../ChromeTimePicker"));

var _DVExpTree = _interopRequireDefault(require("../DVExpTree"));

var _CheckListItem = _interopRequireDefault(require("../CheckListItem"));

var _CheckListBox = _interopRequireDefault(require("../CheckListBox"));

var _MultiCheckMenu = _interopRequireDefault(require("../MultiCheckMenu"));

var _ChromeTime24Picker = _interopRequireDefault(require("../ChromeTime24Picker"));

var _Time24Input = _interopRequireDefault(require("../Time24Input"));

var _TimeRange24Input = _interopRequireDefault(require("../TimeRange24Input"));

var _CheckTreeItem = _interopRequireDefault(require("../CheckTreeItem"));

var _CheckTreeBox = _interopRequireDefault(require("../CheckTreeBox"));

var _MultiCheckTreeMenu = _interopRequireDefault(require("../MultiCheckTreeMenu"));

var _FileInputBox = _interopRequireDefault(require("../FileInputBox"));

var _CountdownText = _interopRequireDefault(require("../CountdownText"));

var _YesNoQuestionDialog = _interopRequireDefault(require("../YesNoQuestionDialog"));

var _LoadingCubeModal = _interopRequireDefault(require("../LoadingCubeModal"));

var _SelectTreeLeafBox = _interopRequireDefault(require("../SelectTreeLeafBox"));

var _SelectTreeLeafMenu = _interopRequireDefault(require("../SelectTreeLeafMenu"));

var _MultiCheckTreeLeafBox = _interopRequireDefault(require("../MultiCheckTreeLeafBox"));

var _MultiCheckTreeLeafMenu = _interopRequireDefault(require("../MultiCheckTreeLeafMenu"));

var _FileListInput = _interopRequireDefault(require("../FileListInput"));

var _DateInYearPicker = _interopRequireDefault(require("../DateInYearPicker"));

var _DateInYearInput = _interopRequireDefault(require("../DateInYearInput"));

var _CheckTreeLeafOnlyBox = _interopRequireDefault(require("../CheckTreeLeafOnlyBox"));

var _FileListItem = _interopRequireDefault(require("../FileListItem"));

var _DualSelectBox = _interopRequireDefault(require("../DualSelectBox"));

var _DualSelectMenu = _interopRequireDefault(require("../DualSelectMenu"));

var _TOCItem = _interopRequireDefault(require("../TOCItem"));

var _TOCList = _interopRequireDefault(require("../TOCList"));

var _CKPlaceholder = _interopRequireDefault(require("../ckeditor/CKPlaceholder"));

var _CKInlineShortText = _interopRequireDefault(require("../ckeditor/CKInlineShortText"));

var _VerticalTimeline = _interopRequireDefault(require("../VerticalTimeline"));

var _LocationView = _interopRequireDefault(require("../LocationView"));

var _PlaceSearchAutoCompleteInput = _interopRequireDefault(require("../PlaceSearchAutoCompleteInput"));

var _LocationPicker = _interopRequireDefault(require("../LocationPicker"));

var _LocationInput = _interopRequireDefault(require("../LocationInput"));

var _MKNavigator = _interopRequireDefault(require("../MKNavigator"));

var _ProcessLBar = _interopRequireDefault(require("../ProcessLBar"));

var _KVCommentItem = _interopRequireDefault(require("../KVCommentItem"));

var _DynamicTable = _interopRequireDefault(require("../dynamictable/DynamicTable"));

var _WindowBox = _interopRequireDefault(require("../WindowBox"));

var _MessageDialog = _interopRequireDefault(require("../MessageDialog"));

var _ObjectMergeTool = _interopRequireDefault(require("../objectmergetool/ObjectMergeTool"));

var _TokenizeHyperInput = _interopRequireDefault(require("../tokenizeiput/TokenizeHyperInput"));

var _SelectListBox2 = _interopRequireDefault(require("../selectlistbox/SelectListBox"));

var _MCheckTreeBox = _interopRequireDefault(require("../checktreebox/MCheckTreeBox"));

var _PathMenu = _interopRequireDefault(require("../PathMenu"));

var _MultiCheckTreeMenu2 = _interopRequireDefault(require("../multichecktreemenu/MultiCheckTreeMenu"));

var _MultiCheckTreeLeafMenu2 = _interopRequireDefault(require("../multichecktreeleafmenu/MultiCheckTreeLeafMenu"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _MCheckTreeLeafBox = _interopRequireDefault(require("../checktreeleafbox/MCheckTreeLeafBox"));

var _MSelectTreeLeafBox = _interopRequireDefault(require("../selecttreeleafbox/MSelectTreeLeafBox"));

var _SelectTreeLeafMenu2 = _interopRequireDefault(require("../selecttreeleafmenu/SelectTreeLeafMenu"));

var _MDualSelectBox = _interopRequireDefault(require("../dualselectbox/MDualSelectBox"));

var _DualSelectMenu2 = _interopRequireDefault(require("../dualselectmenu/DualSelectMenu"));

var _TreeTable = _interopRequireDefault(require("../treetable/TreeTable"));

var _LinearColorTinyBar = _interopRequireDefault(require("../LinearColorTinyBar"));

var _Finder = _interopRequireDefault(require("../finder/Finder"));

var _TreeChart = _interopRequireDefault(require("../TreeChart"));




var publicCreators = [_Icons.MdiStoreMarkerOutline, _AutoCompleteInput.default, _BoardTable.default, _Board.default, _BScroller.default, _ButtonArray.default, _ButtonRange.default, _CalendarInput.default, _CalendarInput.OldCalendarInput, _CheckBoxInput.default, _CheckBox.default, _CheckboxButton.default, _CheckListItem.default, _CheckListBox.default, _CheckTreeLeafOnlyBox.default, _ChromeCalendar.default, _ChromeTimePicker.default, _ChromeTime24Picker.default, _CircleSectionLabel.default, _CountdownClock.default, _CountdownText.default, _DateInYearPicker.default, _DateInYearInput.default, _DateTimeInput.default, _DropZone.default, _EmojiPickerTooltip.default, _FileInputBox.default, _FileListItem.default, _FileListInput.default, _Finder.default, _Scroller.Scrollbar, _Scroller.VScrollbar, _Scroller.HScrollbar, _Scroller.VScroller, _Scroller.HScroller, _ContextMenu.default, _Menu.HMenu, _Menu.VMenuItem, _Menu.VMenu, _Menu.Dropright, _Menu.VMenuLine, _Menu.Dropdown, _Menu.HMenuItem, _Menu.VMenu, _Menu.VRootMenu, _Menu.MenuButton, _DateInput.default, _Hanger.default, _DraggableHStack.default, _DraggableVStack.default, _DropPanel.default, _DropPanelStack.default, _EditableText.default, _EmojiPicker.default, _EmojiCounter.default, _EmojiCounterList.default, _Sprite.default, _ExpTree.ExpNode, _ExpTree.default, _ExpTree.ExpGroup, _DVExpTree.default, _FlexiconButton.default, _FlexiconInput.default, _Follower.default, _FollowerToggler.default, _Frame.default, _FrameView.default, _TabFrame.default, _TabView.default, _SinglePage.default, _HexaSectionLabel.default, _VRuler.default, _HRuler.default, _IconSprite.default, _LinearColorBar.default, _LinearColorTinyBar.default, _MediaInput.default, _MessageInput.default, _MessageInput.MessageQuote, _Modal.default, _LoadingCubeModal.default, _NumberInput.default, _NumberSpanInput.default, _OnsScreenWindow.default, _OnScreenWidget.default, _PageIndicator.default, _PageSelector.default, _PreInput.default, _ProgressBar.default, _QuickListButton.default, _QuickMenu.default, _QuickPath.default, _PathMenu.default, _Radio.default, _RadioButton.default, _RadioInput.default, _RibbonSplitButton.default, _RibbonButton.default, _RotatedText.default, _SelectList.default, _RemoteSvg.default, _ResizeBox.default, _Searcher.default, _SelectListBox.default, _SelectTreeBox.default, _SelectMenu.default, _SelectBox.default, _MultiSelectMenu.default, _MultiCheckTreeLeafBox.default, _BrowserDetector.default.isMobile ? _MultiCheckTreeLeafMenu2.default : _MultiCheckTreeLeafMenu.default, _SelectBoxItem.default, _DualSelectBox.default, _BrowserDetector.default.isMobile ? _DualSelectMenu2.default : _DualSelectMenu.default, _SelectTable.default, _SelectTable2.default, _SelectTreeMenu.default, _SelectTreeLeafBox.default, _BrowserDetector.default.isMobile ? _SelectTreeLeafMenu2.default : _SelectTreeLeafMenu.default, _SpanInput.default, _Snackbar.default, _StaticTabbar.default, _Switch.default, _TableScroller.default, _TableVScroller.default, _TreeTable.default, _TextArea.default, _TextClipboard.default, _TimeInput.default, _Time24Input.default, _TimeRange24Input.default, _TimeSelectInput.default, _TimePicker.default, _DateTimeInput.default, _Tooltip.default, _Toast.default, _TreeList.default, _TreeListItem.default, _TokenField.default, _WidthHeightSizer.default, _TrackBar.default, _TrackBarInput.default, _Icons.SpinnerIco, _VerticalTreeDiagram.VerticalTreeDiagramNode, _VerticalTreeDiagram.default, _MultiCheckMenu.default, _CheckTreeItem.default, _CheckTreeBox.default, _BrowserDetector.default.isMobile ? _MultiCheckTreeMenu2.default : _MultiCheckTreeMenu.default, _MessageDialog.default, _YesNoQuestionDialog.default, _TOCItem.default, _TOCList.default, _CKPlaceholder.default, _CKInlineShortText.default, _VerticalTimeline.default, _WindowBox.default, _LocationView.default, _LocationPicker.default, _LocationInput.default, _PlaceSearchAutoCompleteInput.default, _MKNavigator.default, _ProcessLBar.default, _KVCommentItem.default, _DynamicTable.default, _ObjectMergeTool.default, _TokenizeHyperInput.default, _SelectListBox2.default, _MCheckTreeBox.default, _MCheckTreeLeafBox.default, _MSelectTreeLeafBox.default, _MDualSelectBox.default, _TreeChart.default];
/***
 *
 * @param {Dom} core
 */

exports.publicCreators = publicCreators;

function install(core) {
  core.install(publicCreators);
  core.install('checkboxbutton', _CheckBoxInput.default);
  core.install('selectbox', _MultiSelectMenu.default);
}

var _default = install;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/AComp.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/AComp.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("./ACore"));

require("./js/MultiLanguageCSS");

var _DebugTask = _interopRequireDefault(require("./js/DebugTask"));

require("./css/debugtask.css");

require("./css/common.css");

var _Draggable = _interopRequireDefault(require("./js/Draggable"));

var _EmojiChars = _interopRequireDefault(require("./js/EmojiChars"));

var _EmojiAnims = _interopRequireDefault(require("./js/EmojiAnims"));

var _install = _interopRequireDefault(require("./js/dom/install"));

var _BlurTrigger = _interopRequireDefault(require("./js/tool/BlurTrigger"));


var AComp = {
  core: _ACore.default,
  $: _ACore.default.$,
  _: _ACore.default._,
  creator: _ACore.default.creator,
  buildDom: _ACore.default.buildDom,
  runDebugTask: _DebugTask.default.start.bind(_DebugTask.default),
  Draggable: _Draggable.default,
  EmojiChars: _EmojiChars.default,
  EmojiAnims: _EmojiAnims.default,
  install: _install.default,
  BlurTrigger: _BlurTrigger.default
};
window.runDebugTask = _DebugTask.default.start.bind(_DebugTask.default);
var _default = AComp;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/materializeIconTrigger.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/materializeIconTrigger.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = materializeIconTrigger;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _ACore = _interopRequireDefault(require("../ACore"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


function materializeIconTrigger() {
  _Dom.default.documentReady.then(function () {
    var linkMaterial = _ACore.default.$('link', document.head, function (elt) {
      if (elt.href && elt.href.indexOf('Material+Icons')) return true;
    });

    if (!linkMaterial) return;
    var checkInv = -1;

    function onLoaded() {
      if (checkInv > 0) {
        clearTimeout(checkInv);
        checkInv = -1;
      }

      linkMaterial.off('loaded', onLoaded).off('load', onLoaded).off('error', onLoaded);
      i.remove();
      requestAnimationFrame(function () {
        _ResizeSystem.default.update();

        if (document.cookie.indexOf('absol_debug') >= 0) {
          console.info('Resize after MaterialIcons load');
        }
      });
    }

    linkMaterial.on('loaded', onLoaded).on('load', onLoaded).on('error', onLoaded);

    var i = _ACore.default._({
      tag: 'i',
      class: "material-icons",
      style: {
        fontSize: '14px',
        position: 'fix',
        top: '0',
        left: '0',
        zIndex: '-1000',
        visibility: 'hidden'
      },
      child: {
        text: 'account_balance_wallet'
      }
    }).addTo(document.body);

    var iBox = i.getBoundingClientRect();

    if (iBox.width < iBox.height * 3) {
      onLoaded();
      return;
    }

    var intervalCount = 50;
    checkInv = setInterval(function () {
      intervalCount--;

      if (intervalCount < 0) {
        onLoaded();
      }

      iBox = i.getBoundingClientRect();

      if (iBox.width < iBox.height * 3) {
        onLoaded();
      }
    }, 200);
  });
}
};

moduleFactories["node_modules/absol-acomp/js/TextMeasureData.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TextMeasureData.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = {
  chars: (" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~©´ÀÁÂÊÍÒÔÙÚ" + "ÝàáâãèéêìíðòóôõùúýĂăĐđĩũƠơƯưɐɔɕɗəɛɡɣɲʃʒʝʰˆː˘̪̀̃͡τφχẠạẢảẤấẦầẩẫẬậắằẳặẸẹẻẽếỀềểễỆệỉịọỏỐốồổỗỘộỚớỜờởỡỢợụỦủỨứỪừửữựỳỷỹ" + "–‘“”…♥♪【】🤣️�").split(''),
  fonts: {
    "Times New Roman": {
      "width": {
        "0": "̪̀̃͡️",
        "5": " ,.",
        "10": "0123456789#$*_bdghknopquvxyðòóôõùúýđũɗɡɣɲọỏốồổỗộụủỳỷỹ–♪",
        "20": "…【】",
        "6.66015625": "!()-I[]`fr´Íʃˆ˘‘",
        "8.1640625": "\"",
        "16.66015625": "%",
        "15.556640625": "&m",
        "3.603515625": "'",
        "11.279296875": "+<=>",
        "5.556640625": "/:;\\ijltìíĩʝːỉị",
        "8.876953125": "?acezàáâãèéêăɐɔɕəʒχạảấầẩẫậắằẳặẹẻẽếềểễệ“”",
        "18.41796875": "@",
        "14.443359375": "ADGHKNOQUVXYwÀÁÂÒÔÙÚÝĂĐƠẠẢẤẦẬỐỘỚỜỢỦ",
        "13.33984375": "BCR",
        "12.216796875": "ELTZÊẸỀỆ",
        "11.123046875": "FPS",
        "7.783203125": "Js",
        "17.783203125": "M",
        "18.876953125": "W",
        "9.384765625": "^",
        "9.599609375": "{}",
        "4.00390625": "|",
        "10.8203125": "~",
        "15.1953125": "©",
        "10.576171875": "ơớờởỡợ",
        "15.517578125": "ƯỨỪ",
        "10.83984375": "ưứừửữự",
        "8.3984375": "ɛ",
        "6.42578125": "ʰ",
        "8.037109375": "τ",
        "11.54296875": "φ",
        "11.875": "♥",
        "19.423828125": "🤣�"
      },
      "spacing": {
        "-0.7421875": "11W:W;",
        "-2.216796875": "ATP,P.VaVeVyWAY-YAYqYu",
        "-2.578125": "AVV,V.VAVoY,Y.",
        "-1.6015625": "AWF,F.RVTAWaWeWo",
        "-1.8359375": "AYAwAyLTLVPAT-V-W,W.Y:Y;Yp",
        "-1.484375": "AvFALWT,T.V:V;‘‘",
        "-2.001953125": "LYYaYeYoYv",
        "-1.103515625": "LyRWRYT;W-Yir.",
        "-1.201171875": "RTViVrVuWy",
        "-0.80078125": "RyWiWrWur,",
        "-0.99609375": "T:",
        "-0.361328125": "TOffrg",
        "-1.396484375": "TaTcTeToTsTwTy",
        "-0.703125": "TiTrTu",
        "-0.400390625": "r-",
        "-1.298828125": "v,v.w,w.y,y.",
        "-0.439453125": "χφ",
        "-4.443359375": "【̀【̃【̪【͡】̀】̃】̪】͡",
        "-11.38671875": "🤣"
      },
      "fontBoundingBoxAscent": 18,
      "fontBoundingBoxDescent": 4
    },
    "Arial": {
      "width": {
        "0": "̪̀̃͡️",
        "10": "Jcksvxyzýɔɕỳỷỹ♪",
        "20": "…【】",
        "11.123046875": "0123456789#$?L_abdeghnopquàáâãèéêðòóôõùúăđũɐɗəɡɲạảấầẩẫậắằẳặẹẻẽếềểễệọỏốồổỗộụủ–",
        "5.556640625": " !,./:;I[\\]ftÍìíĩː",
        "7.099609375": "\"",
        "17.783203125": "%",
        "13.33984375": "&ABEKPSVXYÀÁÂÊÝĂẠẢẤẦẬẸỀỆ",
        "3.818359375": "'",
        "6.66015625": "()-`r´ˆ˘“”",
        "7.783203125": "*",
        "11.6796875": "+<=>~",
        "20.302734375": "@",
        "14.443359375": "CDHNRUwÙÚĐỦ",
        "12.216796875": "FTZ",
        "15.556640625": "GOQÒÔỐỘ",
        "16.66015625": "Mm",
        "18.876953125": "W",
        "9.384765625": "^",
        "4.443359375": "ijlʃỉị‘",
        "6.6796875": "{}",
        "5.1953125": "|",
        "14.736328125": "©",
        "17.1484375": "ƠỚỜỢ",
        "13.115234375": "ơớờởỡợ",
        "17.080078125": "ƯỨỪ",
        "13.388671875": "ưứừửữự",
        "9.169921875": "ɛ",
        "10.01953125": "ɣ",
        "10.8984375": "ʒ",
        "7.94921875": "ʝ",
        "7.666015625": "ʰ",
        "7.900390625": "τ",
        "12.96875": "φ",
        "10.498046875": "χ",
        "11.875": "♥",
        "19.423828125": "🤣�"
      },
      "spacing": {
        "-1.484375": "11ATAVAYLTLVLWLYPATAVAVaYAYaYpv,v.y,y.",
        "-0.7421875": "AWLyTiTrTuV:V;VrVuVyWAWaYi",
        "-0.361328125": "AvAwAyRTRVRWRYTOViW-W:W;WeWoWrWuff‘‘",
        "-2.216796875": "F,F.T,T.T:T;TaTcTeToTs",
        "-1.103515625": "FAT-TwTyV-VeVoW,W.Y:YuYvr,r.w,w.",
        "-2.578125": "P,P.Y,Y.",
        "-1.8359375": "V,V.Y-YeYoYq",
        "-0.17578125": "Wy",
        "-1.298828125": "Y;",
        "1.11328125": "ìĩ",
        "-0.283203125": "τφφτ",
        "-0.537109375": "φχχφ",
        "-5": "【̀【̃【̪【͡】̀】̃】̪】͡",
        "-11.38671875": "🤣"
      },
      "fontBoundingBoxAscent": 18,
      "fontBoundingBoxDescent": 4
    }
  }
};
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/TextMeasure.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/TextMeasure.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TextMeasureData = _interopRequireDefault(require("./TextMeasureData"));


function TextMeasure() {
  this.$canvas = null;
  this.data = {};

  this._loadComputedData(); // if the font is not in data, create it and copy console log to TextMeasureData.js
  // this._makeFontSize('Times New Roman');
  // this._makeFontSize('Arial');

}

TextMeasure.prototype._loadComputedData = function () {
  var thisO = this;
  this.data.chars = _TextMeasureData.default.chars;
  this.data.fonts = Object.keys(_TextMeasureData.default.fonts).reduce(function (ac, fontName) {
    var font = _TextMeasureData.default.fonts[fontName];
    ac[fontName] = {
      width: thisO._valueDict2KeyDict(font.width),
      spacing: thisO._valueDict2KeyDict(font.spacing, 2),
      fontBoundingBoxAscent: font.fontBoundingBoxAscent,
      fontBoundingBoxDescent: font.fontBoundingBoxDescent
    };
    return ac;
  }, {});
};

TextMeasure.prototype._valueDict2KeyDict = function (dict, keyLength) {
  var thisO = this;
  return Object.keys(dict).reduce(function (ac, valueText) {
    var keys = thisO._splitKey(dict[valueText], keyLength || 1);

    var value = parseFloat(valueText);
    keys.reduce(function (ac1, key) {
      ac1[key] = value;
      return ac1;
    }, ac);
    return ac;
  }, {});
};

TextMeasure.prototype._keyDic2ValueDict = function (keyDict) {
  return Object.keys(keyDict).reduce(function (ac, cr) {
    var vKey = keyDict[cr].toString();
    ac[vKey] = ac[vKey] || '';
    ac[vKey] += cr;
    return ac;
  }, {});
};
/***
 *
 * @param s
 * @param l
 * @returns {string[]}
 * @private
 */


TextMeasure.prototype._splitKey = function (s, l) {
  var cArr = s.split('');
  if (!l || l < 2) return cArr;
  return cArr.reduce(function (ac, cr) {
    ac.last += cr;

    if (ac.last.length >= l) {
      ac.arr.push(ac.last);
      ac.last = '';
    }

    return ac;
  }, {
    arr: [],
    last: ''
  }).arr;
};

TextMeasure.prototype._array2keyDict = function (arrKey, arrVal) {
  return arrKey.reduce(function (ac, cr, i) {
    ac[cr] = arrVal[i];
    return ac;
  }, {});
};

TextMeasure.prototype._makeFontSize = function (fontName) {
  var thisO = this;
  var charList = _TextMeasureData.default.chars;
  var fontMt = this.measureTextByCanvas("demo-abgH", '20px ' + fontName);
  var cWidthArr = charList.map(function (c) {
    return thisO.measureTextByCanvas(c).width;
  });

  var width = this._array2keyDict(charList, cWidthArr);

  var spacing = charList.reduce(function (ac, c1, i1) {
    return charList.reduce(function (ac1, c2, i2) {
      var d = thisO.measureTextByCanvas(c1 + c2).width - cWidthArr[i1] - cWidthArr[i2];
      if (d !== 0) ac1[c1 + c2] = d;
      return ac1;
    }, ac);
  }, {});
  _TextMeasureData.default[fontName] = {
    width: thisO._keyDic2ValueDict(width),
    spacing: thisO._keyDic2ValueDict(spacing),
    fontBoundingBoxAscent: fontMt.fontBoundingBoxAscent,
    fontBoundingBoxDescent: fontMt.fontBoundingBoxDescent
  };
  this.data.fonts[fontName] = {
    width: width,
    spacing: spacing,
    fontBoundingBoxAscent: fontMt.fontBoundingBoxAscent,
    fontBoundingBoxDescent: fontMt.fontBoundingBoxDescent
  }; // copy from console and paste it to TextMeasureData
  // console.log(fontName+":"+JSON.stringify(this.data.fonts[fontName]));
};
/***
 *
 * @param {string} text
 * @param {string} fontName
 * @param {number} fontSize
 * @return {number}
 */


TextMeasure.prototype.measureWidth = function (text, fontName, fontSize) {
  var width = this.data.fonts[fontName].width;
  var spacing = this.data.fonts[fontName].spacing;
  var res = 0;
  var prevC = text[0];
  var c = text[0];
  res += width[c] || 0;

  for (var i = 1; i < text.length; ++i) {
    c = text[i];
    res += spacing[prevC + c] || 0;
    res += width[c] || 0;
    prevC = c;
  }

  return res * fontSize / 20;
};
/***
 *
 * @param {string}text
 * @param {string=} font - without font-size, default is 20px
 * @returns {TextMetrics}
 */


TextMeasure.prototype.measureTextByCanvas = function (text, font) {
  if (!document || !document.createElement) throw new Error("Not support renderer!");
  var canvas = this.$canvas || (this.$canvas = document.createElement("canvas"));
  var context = canvas.getContext("2d");
  if (font) context.font = font;
  var metrics = context.measureText(text);
  return metrics;
};

var _default = new TextMeasure();

exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/BContextCapture.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/BContextCapture.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _ContextMenu = _interopRequireDefault(require("./ContextMenu"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));


/***
 * simple way, to replace old ContextCapture version
 ***/
function BContextCapture() {
  _EventEmitter.default.call(this);

  this.sync = Promise.resolve();
  this.$root = null;
  this._pointerSession = 0;
  this.ev_contextMenu = this.ev_contextMenu.bind(this);
}

_OOP.default.mixClass(BContextCapture, _EventEmitter.default);

BContextCapture.prototype.attachTo = function (elt) {
  if (this.$root) this.$root.removeEventListener('contextmenu', this.ev_contextMenu, false);
  this.$root = elt;
  if (this.$root) this.$root.addEventListener('contextmenu', this.ev_contextMenu, false);
};

BContextCapture.prototype.auto = function () {
  _Dom.default.documentReady.then(function () {
    this.attachTo(document.body);
  }.bind(this));
};

BContextCapture.prototype.showContextMenu = _ContextMenu.default.prototype.showContextMenu;
BContextCapture.prototype._fireContextMenuEvent = _ContextMenu.default.prototype._fireContextMenuEvent;
BContextCapture.prototype._checkNeedHandle = _ContextMenu.default.prototype._checkNeedHandle;
/***
 *
 * @param {PointerEvent} event
 */

BContextCapture.prototype.ev_contextMenu = function (event) {
  this._pointerSession++;
  this._posCurrent = new _Vec.default(event.clientX, event.clientY);
  this.$target = event.target;

  if (this._checkNeedHandle(event.target)) {
    if (this._fireContextMenuEvent()) {
      event.preventDefault();
    }
  }
};

var instance = new BContextCapture();

if ((!_BrowserDetector.default.isMobile || !_BrowserDetector.default.isSafari) && _BrowserDetector.default.os.type !== 'ios') {
  _BrowserDetector.default.nativeContextMenuSupport = true;
  _ContextMenu.default.auto = instance.auto.bind(instance); //override old version
} else {
  _BrowserDetector.default.nativeContextMenuSupport = false;
}

var _default = instance;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/keeview/OWModalManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/keeview/OWModalManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = require("../../ACore");

require("../../css/keeview/owmodal.css");

var _Dom = require("absol/src/HTML5/Dom");

var _FlexiconButton = _interopRequireDefault(require("../FlexiconButton"));


function implicitNode(data) {
  if (!data) return (0, _ACore._)('div');

  if (data instanceof Array) {
    return data.map(implicitNode);
  } else if ((0, _Dom.isDomNode)(data)) {
    return data;
  } else if (typeof data === "string") {
    return (0, _ACore._)({
      tag: 'span',
      child: {
        text: data
      }
    });
  } else if (typeof data === "object") {
    return (0, _ACore._)(data);
  } else return (0, _ACore._)('div');
}
/***
 *
 * @constructor
 */


function OWModalManager() {}

OWModalManager.prototype.getView = function () {
  if (!this.$view) this.createView();
  return this.$view;
};

OWModalManager.prototype.createView = function () {
  this.$view = (0, _ACore._)('.kv-ow-modal-manager');
};

OWModalManager.prototype.createModal = function (opt, caller) {
  console.trace(1);
  opt = opt || {};
  var modal = (0, _ACore._)({
    class: 'kv-ow-modal',
    child: {
      class: 'kv-ow-modal-window',
      child: [{
        class: 'kv-ow-modal-header',
        child: [{
          class: 'kv-ow-modal-title',
          child: {
            text: 'Tiêu đề'
          }
        }]
      }, {
        class: 'kv-ow-modal-body',
        child: Array(3).fill({
          tag: 'span',
          child: {
            text: 'Bạn có chắc muốn thoát khỏi nhóm? Đây là nội dung hơi bị dài luôn nè'
          }
        })
      }, {
        class: 'kv-ow-modal-footer'
      }]
    }
  });
  modal.$body = (0, _ACore.$)('.kv-ow-modal-body', modal);
  modal.$title = (0, _ACore.$)('.kv-ow-modal-title', modal);
  modal.$footer = (0, _ACore.$)('.kv-ow-modal-footer', modal);

  if (modal.$title) {
    if (typeof opt.title === "string") {
      modal.$title.clearChild().addChild((0, _ACore._)({
        text: opt.title
      }));
    } else {
      modal.$title.clearChild().addChild(implicitNode(opt.title));
    }
  } else {
    modal.$title.addStyle('display', 'none');
  }

  modal.$body.clearChild();

  if (opt.content || opt.contentbody) {
    modal.$body.addChild(implicitNode(opt.content || opt.contentbody));
  }

  modal.$footer.clearChild();

  if (opt.buttons || opt.buttonlist) {
    modal.$footer.addChild((opt.buttons || opt.buttonlist).map(function (bt) {
      var props = Object.assign({}, bt);
      delete props.onclick;
      var onclick = bt.onclick;
      return (0, _ACore._)({
        tag: _FlexiconButton.default.tag,
        props: props,
        on: {
          click: function (event) {
            if (typeof onclick === "function") {
              onclick.call(this, event, modal, caller);
            }
          }
        }
      });
    }));
  }

  return modal;
};

OWModalManager.prototype.showModal = function (opt, caller) {
  var modal = this.createModal(opt, caller);
  var minZIndex = Array.prototype.reduce.call(this.getView(), function (ac, cr) {
    return Math.max(ac, parseFloat(cr.style.zIndex) || 0);
  }, 0);
  modal.addStyle('zIndex', minZIndex + 1 + '');
  this.$view.addChild(modal);
  return modal;
};

var _default = OWModalManager;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/keeview/OverviewWidget.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/keeview/OverviewWidget.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _ACore = require("../../ACore");

require("../../css/keeview/overviewwidget.css");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TabView = _interopRequireDefault(require("../TabView"));

var _Hanger = _interopRequireDefault(require("../Hanger"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _utils = require("../utils");

var _Dom = require("absol/src/HTML5/Dom");

var _OnScreenWidget = _interopRequireDefault(require("../OnScreenWidget"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _OWModalManager = _interopRequireDefault(require("./OWModalManager"));


/***
 * @extends Fragment
 * @param {{}} host
 * @param {Fragment[]} children
 * @constructor
 */
function OverviewWidget(host, children) {
  _Fragment.default.call(this);

  this.setting = {
    viewPos: {
      x: 0,
      y: 0
    },
    minimize: true
  };
  this.host = host;
  this.children = children || [];
  this.childrenById = this.children.reduce(function (ac, child) {
    ac[child.id] = child;
    return ac;
  }, {});
  this._position = new _Vec.default(0, 0);
  this.setContext("OVERVIEW_WIDGET", this);
  this.children.forEach(function (fg) {
    fg.attach(this);
  }.bind(this));
  this.modalMng = new _OWModalManager.default();
}

_OOP.default.mixClass(OverviewWidget, _Fragment.default);

OverviewWidget.prototype.createView = function () {
  this.$title = (0, _ACore._)({
    tag: 'span',
    class: 'kv-overview-widget-title',
    child: {
      text: '...'
    }
  });
  this.$tabs = this.children.map(function (fg) {
    return (0, _ACore._)({
      tag: 'tabframe',
      class: 'kv-overview-widget-page',
      child: fg.getView(),
      props: {
        name: '&nbsp;'.repeat(5),
        //||fg.name,
        tabIcon: fg.tabIcon,
        id: fg.id
      }
    });
  });
  this.$view = (0, _ACore._)({
    class: 'kv-overview-widget',
    style: {
      '--x': '0px',
      '--y': '0px',
      visibility: 'hidden'
    },
    child: [{
      tag: _Hanger.default.tag,
      class: 'kv-overview-widget-header',
      child: [this.$title, {
        class: 'kv-overview-widget-header-window-action',
        child: [{
          tag: 'button',
          child: 'span.mdi.mdi-window-minimize',
          on: {
            click: this.minimize.bind(this)
          }
        }]
      }],
      on: {
        predrag: this.ev_headerPredrag.bind(this),
        dragstart: this.ev_headerDragStart.bind(this),
        drag: this.ev_headerDrag.bind(this),
        dragend: this.ev_headerDragEnd.bind(this)
      }
    }, {
      class: 'kv-overview-widget-body',
      child: {
        tag: _TabView.default.tag,
        class: ['kv-overview-widget-tab-view', 'xp-tiny'],
        child: this.$tabs,
        on: {
          activetab: this.ev_activeTab.bind(this)
        }
      }
    }, this.modalMng.getView()]
  });

  this._updateViewPosition();

  this.$bubble = (0, _ACore._)({
    tag: _OnScreenWidget.default.tag,
    class: 'kv-overview-widget-bubble',
    id: 'overview_widget_bubble',
    style: {
      // visibility: 'hidden'
      '--cx': '0.02',
      '--cy': '0.96'
    },
    child: ['<svg class="kv-overview-widget-bubble-background"  viewBox="0 0 24 24">\n' + '    <path fill="currentColor" d="M3 11H11V3H3M5 5H9V9H5M13 21H21V13H13M15 15H19V19H15M3 21H11V13H3M5 15H9V19H5M13 3V11H21V3M19 9H15V5H19Z" />\n' + '</svg>', {
      class: 'kv-overview-widget-bubble-badge',
      child: {
        tag: 'span',
        child: {
          text: '0'
        }
      }
    }],
    on: {
      click: this.toggle.bind(this)
    }
  });
  this.$tabview = (0, _ACore.$)('.kv-overview-widget-tab-view', this.$view);
  this.$action = (0, _ACore.$)('.kv-overview-widget-header-window-action', this.$view);
  this.$bubbleBadge = (0, _ACore.$)('.kv-overview-widget-bubble-badge', this.$bubble);
  this.$badgeText = (0, _ACore.$)('span', this.$bubbleBadge);
  this.$badgeText.requestUpdateSize = this._updateViewPosition.bind(this);
  var self = this;
  this.$tabs.forEach(function (tabElt) {
    tabElt.on('active', function () {
      self.childrenById[this.id].start();
    });
    tabElt.on('deactive', function () {
      self.childrenById[this.id].pause();
    });
  });
  this.updateCounter();
};

OverviewWidget.prototype.saveSetting = function () {
  localStorage.setItem('overview_widget_setting', JSON.stringify(this.setting));
};

OverviewWidget.prototype.loadSetting = function () {
  var setting = {};

  try {
    var settingJson = localStorage.getItem('overview_widget_setting');
    if (settingJson) setting = JSON.parse(settingJson);
  } catch (err) {}

  Object.assign(this.setting, setting);
  this._position = new _Vec.default(this.setting.viewPos.x, this.setting.viewPos.y);

  this._updateViewPosition();
};

OverviewWidget.prototype.updateCounter = function (from) {
  var id;
  var tabElt;
  var counter;

  if (from) {
    id = from.id;
    tabElt = this.$tabview.getTabById(id);
    counter = from.counter;
    if (counter) tabElt.name = '(' + counter + ')';else tabElt.name = '&nbsp;'.repeat(5);
  } else {
    this.$tabs.forEach(function (tabElt) {
      id = tabElt.id;
      var frg = this.childrenById[id];
      var counter = frg.counter;
      if (counter) tabElt.name = '(' + counter + ')';else tabElt.name = '&nbsp;'.repeat(5);
    }.bind(this));
  }

  var sumCounter = this.children.reduce(function (ac, cr) {
    return ac + cr.counter;
  }, 0);
  this.$badgeText.firstChild.data = sumCounter + '';

  if (sumCounter > 0) {
    this.$bubbleBadge.removeStyle('visibility');
  } else {
    this.$bubbleBadge.addStyle('visibility', 'hidden');
  }
};

OverviewWidget.prototype.onStart = function () {
  this.getView();
  this.loadSetting();
  this.$view.addTo(document.body);
  this.$bubble.addTo(document.body);

  _ResizeSystem.default.add(this.$badgeText);

  this._updateViewPosition();

  if (this.setting.minimize) {
    this.$bubble.removeStyle('visibility');
  } else {
    this.$view.removeStyle('visibility');
  }

  this.children.forEach(function (fg) {
    fg.start(true);
  });
  var activeTabId = this.$tabview.getActiveTabId();
  this.childrenById[activeTabId].start();
};

OverviewWidget.prototype.onStop = function () {
  this.getView().remove();
};

OverviewWidget.prototype.ev_activeTab = function (event) {
  var frag = this.childrenById[event.id];
  this.$title.firstChild.data = frag.name + '';
};

OverviewWidget.prototype.ev_headerPredrag = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$action, event)) {
    event.cancel();
  }
};

OverviewWidget.prototype.ev_headerDragStart = function (event) {
  var bound = this.$view.getBoundingClientRect();
  this._dragData = {
    bound: bound,
    p0: new _Vec.default(bound.left, bound.top),
    modal: (0, _ACore._)({
      style: {
        position: 'fixed',
        zIndex: '1000000000',
        left: 0,
        right: 0,
        top: 0,
        bottom: 0,
        background: 'transparent'
      }
    }).addTo(document.body)
  };
};

OverviewWidget.prototype.ev_headerDrag = function (event) {
  var d = event.currentPoint.sub(event.startingPoint);
  this._position = this._dragData.p0.add(d);

  this._updateViewPosition();
};

OverviewWidget.prototype.ev_headerDragEnd = function (event) {
  this._dragData.modal.remove();

  this.setting.viewPos.x = this._position.x;
  this.setting.viewPos.y = this._position.y;
  this.saveSetting();
};

OverviewWidget.prototype._updateViewPosition = function () {
  if (!this.$view) return;
  var screenSize = (0, _Dom.getScreenSize)();
  var bound = this.$view.getBoundingClientRect();
  var x = Math.max(0, Math.min(this._position.x, screenSize.width - bound.width));
  var y = Math.max(0, Math.min(this._position.y, screenSize.height - bound.height));
  this.$view.addStyle({
    '--x': x + 'px',
    '--y': y + 'px'
  });
};

OverviewWidget.prototype.showModal = function (opt) {
  return this.modalMng.showModal(opt, this);
};

Object.defineProperty(OverviewWidget.prototype, 'position', {
  set: function (value) {
    if (!value) value = new _Vec.default(0, 0);

    if (value instanceof Array) {
      if ((0, _utils.isRealNumber)(value[0] && (0, _utils.isRealNumber)(value[1]))) {
        value = new _Vec.default(value[0], value[1]);
      } else {
        value = new _Vec.default(0, 0);
      }
    } else if (!(value instanceof _Vec.default)) {
      if ((0, _utils.isRealNumber)(value.x && (0, _utils.isRealNumber)(value.y))) {
        value = new _Vec.default(value[0], value[1]);
      } else {
        value = new _Vec.default(0, 0);
      }
    }

    this._position = value;

    this._updateViewPosition();
  },
  get: function () {
    return this._position;
  }
});

OverviewWidget.prototype.minimize = function () {
  this.$view.addStyle('visibility', 'hidden'); // this.$bubble.removeStyle('visibility');

  this.setting.minimize = true;
  this.saveSetting();
  var activeTabId = this.$tabview.getActiveTabId();
  this.childrenById[activeTabId].pause();
};

OverviewWidget.prototype.maximize = function () {
  // this.$bubble.addStyle('visibility', 'hidden');
  this.$view.removeStyle('visibility');
  this.setting.minimize = false;
  this.saveSetting();
  var activeTabId = this.$tabview.getActiveTabId();
  this.childrenById[activeTabId].start();
};

OverviewWidget.prototype.toggle = function () {
  if (this.setting.minimize) {
    this.maximize();
  } else {
    this.minimize();
  }
};

var _default = OverviewWidget;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/keeview/OverviewPage.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/keeview/OverviewPage.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ACore = require("../../ACore");

var _stringGenerate = require("absol/src/String/stringGenerate");

var _utils = require("../utils");


/***
 * @extends Fragment
 * @param {{}} host
 * @constructor
 */
function OverviewPage(host) {
  _Fragment.default.call(this);

  this.host = host;
  this.id = (0, _stringGenerate.randomIdent)(5);
  this._counter = 0;
}

_OOP.default.mixClass(OverviewPage, _Fragment.default);

OverviewPage.prototype.tabIcon = 'span.mdi.mdi-cube-outline';
OverviewPage.prototype.name = 'Overview Page';

OverviewPage.prototype.createView = function () {
  return (0, _ACore._)({
    child: {
      tag: 'span',
      child: {
        text: 'OverviewPage'
      }
    }
  });
};

OverviewPage.prototype.showModal = function (opt) {
  if (this.parent && this.parent.showModal) return this.parent.showModal(opt, this);
};

Object.defineProperty(OverviewPage.prototype, 'counter', {
  set: function (value) {
    /***
     *
     * @type {OverviewWidget}
     */
    var parent = this.parent;
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    value = Math.max(0, value >> 0);
    this._counter = value;
    parent.updateCounter();
  },
  get: function () {
    return this._counter;
  }
});
var _default = OverviewPage;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/dev.js ***/
"use strict";

require("absol/src/polyfill");

require("absol/src/absol");

var _MaterialDesignIconsAdapter = require("./js/adapter/MaterialDesignIconsAdapter");

var _AComp = _interopRequireDefault(require("./AComp"));

var string = _interopRequireWildcard(require("absol/src/String/stringMatching"));

require("./css/keeview.css");

var _QuickMenu = _interopRequireDefault(require("./js/QuickMenu"));

var _ChromeCalendar = _interopRequireDefault(require("./js/ChromeCalendar"));

var _Radio = _interopRequireDefault(require("./js/Radio"));

var _EmojiChars = _interopRequireDefault(require("./js/EmojiChars"));

var _EmojiAnims = _interopRequireDefault(require("./js/EmojiAnims"));

var _MessageInput = _interopRequireWildcard(require("./js/messageinput/MessageInput"));

var _EmojiPicker = _interopRequireDefault(require("./js/EmojiPicker"));

var _ContextMenu = _interopRequireDefault(require("./js/ContextMenu"));

var _install = _interopRequireDefault(require("./js/dom/install"));

var _Searcher = _interopRequireDefault(require("./js/Searcher"));

var utils = _interopRequireWildcard(require("./js/utils"));

var _materializeIconTrigger = _interopRequireDefault(require("./js/materializeIconTrigger"));

var _VariantColors = _interopRequireDefault(require("./js/VariantColors"));

var _Tooltip = _interopRequireDefault(require("./js/Tooltip"));

var _TextMeasure = _interopRequireDefault(require("./js/TextMeasure"));

var _BContextCapture = _interopRequireDefault(require("./js/BContextCapture"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _CPUViewer = _interopRequireDefault(require("./js/CPUViewer"));

var _ListDictionary = _interopRequireDefault(require("./js/list/ListDictionary"));

var _OverviewWidget = _interopRequireDefault(require("./js/keeview/OverviewWidget"));

var _OverviewPage = _interopRequireDefault(require("./js/keeview/OverviewPage"));

var _DynamicCSS = _interopRequireDefault(require("absol/src/HTML5/DynamicCSS"));

var _Finder = require("./js/finder/Finder");




absol.VariantColors = _VariantColors.default;
absol.parseMessage = _MessageInput.parseMessage;
absol.vScrollIntoView = utils.vScrollIntoView; //for export to window

absol.Tooltip = _Tooltip.default;
absol.QuickMenu = _QuickMenu.default;
absol.AComp = _AComp.default;
absol.Radio = _Radio.default;
absol.EmojiChars = _EmojiChars.default;
absol.EmojiAnims = _EmojiAnims.default;
absol.ChromeCalendar = _ChromeCalendar.default;
(0, _install.default)(absol.coreDom); //old module

absol.coreDom.install('searchcrosstextinput', _Searcher.default);
Object.assign(absol.string, string);
absol.MessageInput = _MessageInput.default;
absol.EmojiPicker = _EmojiPicker.default;
absol.ContextCaptor = _ContextMenu.default;
absol.ListDictionary = _ListDictionary.default;
absol.FinderFileSystem = _Finder.FinderFileSystem;
window.AComp = absol.AComp;
absol.TextMeasure = _TextMeasure.default;

_Dom.default.documentReady.then(function () {
  var mdiLink = absol.$('link', document.head, function (e) {
    if (e.href && e.href.toLowerCase().indexOf('materialdesignicons') >= 0) return true;
  });

  if (!mdiLink) {
    mdiLink = absol._({
      tag: 'link',
      attr: {
        rel: 'stylesheet',
        href: 'https://absol.cf/vendor/materialdesignicons/materialdesignicons.css'
      }
    }).addTo(document.head);
  }
});

Object.assign(absol.$, utils); // materializeIconTrigger();

absol.MaterialDesignIconsNameMap = _MaterialDesignIconsAdapter.MaterialDesignIconsNameMap;
absol.openFileDialog = utils.openFileDialog;
absol.CPUViewer = _CPUViewer.default;
absol.OverviewWidget = _OverviewWidget.default;
absol.OverviewPage = _OverviewPage.default;

_Dom.default.documentReady.then(function () {
  _ContextMenu.default.auto();
});

function testFont() {
  var dynamicCSs = new _DynamicCSS.default();
  var value = parseInt(localStorage.getItem('as_test_font_size')) || 14;

  var fontSizeInput = absol._({
    tag: 'numberinput',
    props: {
      step: 1,
      min: 5,
      value: value
    },
    on: {
      change: () => {
        localStorage.setItem('as_test_font_size', fontSizeInput.value + '');
        dynamicCSs.setProperty(':root', 'font-size', fontSizeInput.value + 'px').commit();
        window.dispatchEvent(new Event('resize'));
      }
    }
  });

  dynamicCSs.setProperty(':root', 'font-size', fontSizeInput.value + 'px').commit();
  window.dispatchEvent(new Event('resize'));

  var modal = absol._({
    style: {
      background: 'white',
      position: 'fixed',
      top: '5px',
      right: '5px',
      padding: '5px',
      border: '1px solid #ddd',
      zIndex: 1e9
    },
    child: ['<label>font-size </label>', fontSizeInput]
  }).addTo(document.body);
}

if (location.href.indexOf('localhost') >= 0) {// Dom.documentReady.then(testFont);
}
};

moduleFactories["node_modules/absol-mobile/js/dom/Core.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/Core.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$ = exports._ = void 0;

var _AComp = _interopRequireDefault(require("absol-acomp/AComp"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var Core = new _Dom.default();
Core.install(_AComp.default.core);
var _ = Core._;
exports._ = _;
var $ = Core.$;
exports.$ = $;
var _default = Core;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/mobile_app/MTabApplication.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/mobile_app/MTabApplication.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mobileapp.css");

var _GrandContext = _interopRequireDefault(require("absol/src/AppPattern/GrandContext"));

var _Core = _interopRequireDefault(require("../dom/Core"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MTabApplication(props) {
  _GrandContext.default.call(this);

  this.setContext("APP", this);
  this.tabActivities = [];
  this.currentActivity = null;
  Object.assign(this, props);
}

Object.defineProperties(MTabApplication.prototype, Object.getOwnPropertyDescriptors(_GrandContext.default.prototype));

MTabApplication.prototype.createView = function () {
  var app = this;
  this.$activity = this.tabActivities.map(function (act) {
    return act.getView();
  });
  this.activityTabIcons = this.tabActivities.map(function (act) {
    return act.tabIcon;
  });
  this.$view = _({
    class: 'am-application',
    child: [{
      tag: 'mbottomtabbar',
      class: 'am-application-tabbar',
      props: {
        items: this.activityTabIcons.map(function (icon, i) {
          return {
            icon: icon,
            value: i,
            counter: app.tabActivities.counter
          };
        })
      },
      on: {
        change: this.ev_tabChange.bind(this)
      }
    }, {
      tag: 'frameview',
      class: 'am-application-frameview',
      child: this.$activity
    }]
  });
  this.$frameview = $('.am-application-frameview ', this.$view);
  this.$tabbar = $('.am-application-tabbar', this.$view);
};

MTabApplication.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = this.createView() || this.$view;
  if (!this.$view) throw new Error("this.$view must be not null!");
  return this.$view;
};

MTabApplication.prototype.showTabbar = function (flag) {
  var current = this.$view.containsClass('am-show-tabbar');
  if (current == flag) return;

  if (flag) {
    this.$view.addClass('am-show-tabbar');
  } else {
    this.$view.removeClass('am-show-tabbar');
  }

  absol.Dom.updateResizeSystem();
};

MTabApplication.prototype.start = function () {
  var app = this;
  this.tabActivities.forEach(function (act) {
    act.attach(app);
  });
  this.getView().addTo(document.body);

  _GrandContext.default.prototype.start.apply(this, arguments);

  this.startActivity("start", this.initActivity || this.tabActivities[0]);
};

MTabApplication.prototype.startActivity = function (session, act, args) {
  act.stop(); //stop before call new 

  act.caller = this;
  act.arguments = args;
  act.result = null;
  act.session = session;
  act.attach(this);
  this.viewActivity(act);
  act.start();
};

MTabApplication.prototype.activityReturn = function (session, act, result) {
  if (this.onActivityReturn) {
    this.onActivityReturn(session, act, result);
  }

  var tabIndex = this.tabActivities.indexOf(act);
  if (tabIndex < 0) act.getView().selfRemove();
};

MTabApplication.prototype.viewActivity = function (act) {
  var activityView = act.getView();
  var tabIndex = this.tabActivities.indexOf(act);

  if (tabIndex >= 0) {
    this.showTabbar(true);
    activityView.requestActive();
    if (tabIndex != this.$tabbar.value) this.$tabbar.value = tabIndex;
  } else {
    this.showTabbar(false);

    if (activityView.isDescendantOf(this.$frameview)) {
      activityView.requestActive();
    } else {
      this.$frameview.addChild(activityView);
      activityView.requestActive();
    }
  }
};

MTabApplication.prototype.updateActivityCounter = function (act) {
  var tabIndex = this.tabActivities.indexOf(act);

  if (tabIndex >= 0) {
    this.$tabbar.items[tabIndex].counter = act.counter;
  }
};

MTabApplication.prototype.activeTabActivityByIndex = function (index) {
  var act = this.tabActivities[index];
  if (this.currentActivity == act) return;

  if (this.currentActivity) {
    this.currentActivity.pause();
  }

  this.viewActivity(act);
  act.arguments = null;
  act.result = null;
  act.session = null;
  act.caller = this;
  this.currentActivity = act;
  act.start(); //may be resume
};

MTabApplication.prototype.ev_tabChange = function () {
  this.activeTabActivityByIndex(this.$tabbar.value);
};

var _default = MTabApplication;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/mobile_app/MActivity.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/mobile_app/MActivity.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mobileapp.css");

var _GrandContext = _interopRequireDefault(require("absol/src/AppPattern/GrandContext"));

var _Core = _interopRequireDefault(require("../dom/Core"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MActivity() {
  _GrandContext.default.call(this);

  this.caller = null;
  this.arguments = null;
  this.result = null;
}

Object.defineProperties(MActivity.prototype, Object.getOwnPropertyDescriptors(_GrandContext.default.prototype));
MActivity.prototype.constructor = MActivity;

MActivity.prototype.createView = function () {
  this.$view = _({
    class: 'am-activity'
  });
};

MActivity.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = this.createView() || this.$view;
  if (!this.$view) throw new Error("this.$view must be not null!");
  if (this.onCreated) this.onCreated();
  return this.$view;
};

MActivity.prototype.viewToApp = function () {
  /**
   * @type {import('./MTabApplication').default}
   */
  var app = this.getContext("APP");
  app.viewActivity(this);
};

MActivity.prototype.finish = function () {
  if (!this.session) {
    throw new Error("Activity is not started!");
  }

  this.stop();
  if (this.onFinished) this.onFinished();

  if (this.caller) {
    this.caller.activityReturn(this.session, this, this.result);
    this.caller = null;
    this.result = null;
    this.arguments = null;
    this.session = null;
  }
};
/**
 * @param {MActivity} activity
 * @param {*} bundle
 */


MActivity.prototype.startActivity = function (session, activity, args) {
  activity.stop(); //stop before call new 

  this.pause();
  activity.caller = this;
  activity.arguments = args;
  activity.result = null;
  activity.session = session;
  activity.attach(this);
  activity.viewToApp();
  activity.start();
};

MActivity.prototype.activityReturn = function (session, act, result) {
  if (this.onActivityReturn) {
    this.onActivityReturn(session, act, result);
  }

  this.viewToApp();
  this.resume();
};

var _default = MActivity;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/mobile_app/MTabActivity.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/mobile_app/MTabActivity.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mobileapp.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _MActivity = _interopRequireDefault(require("./MActivity"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MTabActivity() {
  _MActivity.default.call(this);

  this.counter = '';
}

Object.defineProperties(MTabActivity.prototype, Object.getOwnPropertyDescriptors(_MActivity.default.prototype));
MTabActivity.prototype.constructor = MTabActivity;
MTabActivity.prototype.tabIcon = "span.mdi.mdi-view-dashboard";

MTabActivity.prototype.setCounter = function (value) {
  this.counter = value;
  /**
   * @type {import('./MTabApplication').default}
   */

  var app = this.getContext("APP");

  if (app) {
    app.updateActivityCounter(this);
  }
};

MTabActivity.prototype.getCounter = function (value) {
  return this.counter;
};

var _default = MTabActivity;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MLeftNavigator.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MLeftNavigator.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mleftnavigator.css");

var _Core = _interopRequireDefault(require("./Core"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MLeftNavigator() {
  this.on('dragstart', this.eventHandler.modalDragStart).on('drag', this.eventHandler.modalDrag).on('dragend', this.eventHandler.modalDragEnd);
  this.$content = $('.am-navigator-content', this);
  this.$modal = $('.am-navigator-modal', this);
  this._contentWidth = 0;
  this._speedTimeout = -1;
  this._dragSpeed = 0;
  this._preDragTime = 0;
  this._state = -1;
  this._preventDrag = false;
}

MLeftNavigator.tag = 'MLeftNavigator'.toLowerCase();

MLeftNavigator.render = function () {
  return _({
    tag: 'hanger',
    class: 'am-navigator',
    child: ['.am-navigator-modal', '.am-navigator-content'],
    props: {
      hangOn: 9
    }
  });
};

['addChild', 'addChildBefore', 'addChildAfter', 'clearChild', 'findChildBefore', 'findChildAfter', 'removeChild'].forEach(function (key) {
  MLeftNavigator.prototype[key] = function () {
    return this.$content[key].apply(this.$content, arguments);
  };
});

MLeftNavigator.prototype.getChildNodes = function () {
  return this.$modal.childNodes;
};

MLeftNavigator.prototype.open = function (v0) {
  if (this._state == 1) return;
  v0 = v0 || 1000;
  v0 = Math.max(400, Math.min(4000, v0));
  var ctBound = this.$content.getBoundingClientRect();
  var dx = -ctBound.left;
  var dt = Math.sqrt(2 * dx / v0) / 2;
  this.$content.addStyle('transition', 'right ease-out ' + dt + 's');
  this.$modal.addStyle('transition', 'opacity ease-out ' + dt + 's');
  this.$content.addStyle('right', 'calc(100% - ' + ctBound.width + 'px)');
  this.$modal.addStyle('opacity', '0.5');
  this.addClass('am-open');
  var thisnm = this;
  this._state = -1;
  thisnm.$modal.on('click', thisnm.eventHandler.clickModal);
  setTimeout(function () {
    thisnm._state = 1;
    thisnm.$content.removeStyle('transition');
    thisnm.$modal.removeStyle('transition');
  }, dt * 1000 + 1);
};

MLeftNavigator.prototype.close = function (v0) {
  if (this._state == -1) return;
  this.$modal.off('click', this.eventHandler.clickModal);
  v0 = v0 || 0;
  v0 = v0 || 1000;
  v0 = Math.max(400, Math.min(4000, v0));
  var ctBound = this.$content.getBoundingClientRect();
  var dx = ctBound.right;
  var dt = Math.sqrt(2 * dx / v0) / 2;
  this.$content.addStyle('transition', 'right ease-out ' + dt + 's');
  this.$modal.addStyle('transition', 'opacity ease-out ' + dt + 's');
  this.$content.addStyle('right', '100%');
  setTimeout(this.$modal.addStyle.bind(this.$modal, 'opacity', '0.001'), 4); // this.$modal.addStyle('opacity', '0.001');

  var thisnm = this;
  this._state = 0;
  setTimeout(function () {
    thisnm._state = -1;
    thisnm.$content.removeStyle('transition');
    thisnm.$modal.removeStyle('transition');
    thisnm.removeClass('am-open');
  }, dt * 1000 + 1);
};
/** 
 * @type {MLeftNavigator}
 */


MLeftNavigator.eventHandler = {};

MLeftNavigator.eventHandler.modalDragStart = function (event) {
  this.$modal.off('click', this.eventHandler.clickModal);
  this._contentWidth = this.$content.getBoundingClientRect().width;
  this._prevState = this._state;
  this._preDragTime = new Date().getTime();
  this._preMoveDistance = 0;
  this._dragSpeed = 0;
  this._preX = event.clientX;
  var moveVec = event.currentPoint.sub(event.startingPoint);

  if (Math.abs(moveVec.x) > Math.abs(moveVec.y)) {
    this.addClass('am-dragging');
    event.preventDefault();
    this._preventDrag = false;
  } else {
    this._preventDrag = true;
  }
};

MLeftNavigator.eventHandler.modalDrag = function (event) {
  if (this._preventDrag) return;
  var thisnm = this;
  var now = new Date().getTime();

  if (now - this._preDragTime > 10) {
    var dt = now - this._preDragTime;
    this._dragSpeed = (event.clientX - this._preX) * 1000 / dt;
    this._preDragTime = now;
    this._preX = event.clientX;
  }

  if (this._speedTimeout > 0) {
    this._speedTimeout = -1;
  }

  this._speedTimeout = setTimeout(function () {
    thisnm._dragSpeed = 0;
  }, 200);
  var moveVec = event.currentPoint.sub(event.startingPoint);
  var dx;

  if (this._state != 0) {
    event.preventDefault();

    if (this._state == -1) {
      dx = Math.max(0, Math.min(moveVec.x, this._contentWidth));
    } else if (this._state == 1) {
      dx = Math.max(0, Math.min(this._contentWidth + moveVec.x, this._contentWidth));
    }

    this.$content.addStyle({
      right: 'calc(100% - ' + dx + 'px)'
    });
    this.$modal.addStyle('opacity', dx / this._contentWidth / 2 + '');
  } // this.$modal.addStyle('opacity', dx / this._contentWidth / 2 +'')

};

MLeftNavigator.eventHandler.clickModal = function (event) {
  if (event.target == this.$modal) this.close();
};
/**
 * throwing_speed 400px/s
 * 
 */


MLeftNavigator.eventHandler.modalDragEnd = function () {
  if (this._preventDrag) {
    this._preventDrag = false;
  } else {
    this.removeClass('am-dragging');
    this._state = 0; //animating state

    var ctBound = this.$content.getBoundingClientRect();

    if (this._dragSpeed > -200 || ctBound.right > ctBound.width / 2 && this._dragSpeed >= 0) {
      this.open(this._dragSpeed);
    } else if (this._dragSpeed < -200 || ctBound.right < ctBound.width / 2 && this._dragSpeed <= 0) {
      this.close(-this._dragSpeed);
    } else {
      if (this._prevState == 1) this.open();else if (this._prevState == -1) this.close();
    }
  }
};

_Core.default.install(MLeftNavigator);

var _default = MLeftNavigator;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MNavigatorMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MNavigatorMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mnavigatormenu.css");

var _Core = _interopRequireDefault(require("./Core"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MNavigatorMenu() {
  this.$header = $('.am-navigator-menu-body', this);
  this.$body = $('.am-navigator-menu-body', this);
  var data = [{
    items: [{
      text: 'Trang chủ',
      icon: 'span.mdi.mdi-home'
    }]
  }, {
    gname: 'Danh mục',
    items: [{
      text: 'Kiểu dữ liệu',
      icon: 'span.mdi.mdi-alpha-t-box-outline'
    }, {
      text: 'Bảng',
      icon: 'span.mdi.mdi-file-table-outline'
    }, {
      text: 'Trạng thái',
      icon: 'span.mdi.mdi-check'
    }, {
      text: 'Nhóm đối tượng',
      icon: 'span.mdi.mdi-google-circles-communities'
    }, {
      text: 'Đối tượng',
      icon: 'span.mdi.mdi-cube-outline'
    }, {
      text: 'Chat',
      icon: 'span.mdi.mdi-chat-outline'
    }, {
      text: 'Quốc gia',
      icon: 'span.mdi.mdi-earth'
    }, {
      text: 'Công ty',
      icon: 'span.mdi.mdi-warehouse'
    }, {
      text: 'Liên hệ',
      icon: 'span.mdi.mdi-contact-mail'
    }, {
      text: 'Loại',
      icon: 'span.mdi.mdi-grain'
    }]
  }, {
    gname: 'Báo cáo',
    items: [{
      text: 'Báo cáo của tôi',
      icon: 'span.mdi.mdi-note-text'
    }, {
      text: 'Báo cáo công khai',
      icon: 'span.mdi.mdi-note-text-outline'
    }]
  }, {
    gname: 'Hệ thống',
    items: [{
      text: 'Người dùng',
      icon: 'span.mdi.mdi-account-outline'
    }, {
      text: 'Hồ sơ cá nhân',
      icon: 'span.mdi.mdi-file-account'
    }, {
      text: 'Đăng xuất',
      icon: 'span.mdi.mdi-logout'
    }]
  }];
  var thismn = this;
  data.forEach(function (gr) {
    thismn.$body.addChild(thismn._makeGroup(gr.gname, gr.items));
  });
}

MNavigatorMenu.tag = 'MNavigatorMenu'.toLowerCase();

MNavigatorMenu.render = function () {
  return _({
    tag: 'mleftnavigator',
    class: 'am-navigator-menu',
    child: [{
      class: 'am-navigator-menu-header',
      child: [{
        class: 'am-navigator-menu-avatar-ctn',
        child: '.am-navigator-menu-avatar'
      }, {
        class: 'am-navigator-menu-full-name',
        child: {
          text: 'Phạm Quốc Du Thiên'
        }
      }, {
        class: 'am-navigator-menu-email',
        child: {
          text: 'blueskythien2010@live.com'
        }
      }]
    }, {
      class: 'am-navigator-menu-body',
      child: []
    }]
  }, true);
};
/**
 *
                    {
                        class: 'am-navigator-menu-group',
                        child: [

                            {
                                class: 'am-navigator-menu-item',
                                child: [
                                    {
                                        class: 'am-navigator-menu-item-icon-ctn',
                                        child: 'span.mdi.mdi-home'
                                    },
                                    {
                                        tag: 'span',
                                        class: 'am-navigator-menu-item-text',
                                        child: { text: 'Trang chủ' }
                                    }
                                ]

                            }
                        ]
                    },
                    {
                        class: 'am-navigator-menu-group',
                        child: [
                            {
                                class: 'am-navigator-menu-group-name',
                                child: { text: 'Danh mục' }
                            },
                            {
                                class: 'am-navigator-menu-item',
                                child: [
                                    {
                                        class: 'am-navigator-menu-item-icon-ctn',
                                        child: 'span.mdi.mdi-alpha-t-box-outline'
                                    },
                                    {
                                        tag: 'span',
                                        class: 'am-navigator-menu-item-text',
                                        child: { text: 'Kiểu dữ liệu' }
                                    }
                                ]

                            }
                        ]
                    }
 */


MNavigatorMenu.prototype._makeItem = function (icon, text) {
  return _({
    class: 'am-navigator-menu-item',
    child: [{
      class: 'am-navigator-menu-item-icon-ctn',
      child: icon ? icon : []
    }, {
      tag: 'span',
      class: 'am-navigator-menu-item-text',
      child: {
        text: text
      }
    }]
  });
};

MNavigatorMenu.prototype._makeGroup = function (groupName, items) {
  var aobj = {
    class: 'am-navigator-menu-group',
    child: []
  }; //absol object

  if (groupName) {
    aobj.child.push({
      class: 'am-navigator-menu-group-name',
      child: {
        text: groupName + ''
      }
    });
  }

  ;
  var thismn = this;
  aobj.child = aobj.child.concat(items.map(function (item) {
    return thismn._makeItem(item.icon, item.text);
  }));
  return _(aobj);
};

MNavigatorMenu.property = {};
/**
 * @type {MNavigatorMenu}
 */

MNavigatorMenu.property.headerBackgroundSrc = {
  set: function () {},
  get: function () {}
};
/**
 * @type {MNavigatorMenu}
 */

MNavigatorMenu.property.avatarSrc = {
  set: function () {},
  get: function () {}
};

_Core.default.install(MNavigatorMenu);

var _default = MNavigatorMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MBottomTabbar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MBottomTabbar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mbottomtabbar.css");

var _Core = _interopRequireDefault(require("./Core"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _stringGenerate = require("absol/src/String/stringGenerate");


var _ = _Core.default._;
var $ = _Core.default.$;

function MBottomTabbar() {
  this._items = [];
  this.$row = $('.am-bottom-tabbar-content-row', this);
  this.$itemDict = {};
  this.$line = $('.am-bottom-tabbar-line', this);
  this.$attachhook = _('attachhook').addTo(this);
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$attachhook.on('error', function () {
    _Dom.default.addToResizeSystem(this);
  });
  this.$activeItem = null;
  this.$subActiveItem = null;
}

MBottomTabbar.tag = 'MBottomTabbar'.toLowerCase();

MBottomTabbar.render = function () {
  return _({
    class: 'am-bottom-tabbar',
    extendEvent: 'change',
    child: ['.am-bottom-tabbar-line', {
      class: 'am-bottom-tabbar-content',
      child: '.am-bottom-tabbar-content-row'
    }]
  });
};

MBottomTabbar.prototype.getItemEltByValue = function (value) {
  return this.$itemDict[value];
};

MBottomTabbar.prototype.modifyItem = function (itemValue, propertyName, newValue) {
  if (this.$itemDict[itemValue]) this.$itemDict[itemValue].data[propertyName] = newValue;
};

MBottomTabbar.prototype.getItem = function (itemValue) {
  if (this.$itemDict[itemValue]) return this.$itemDict[itemValue].data;
  return null;
};

MBottomTabbar.prototype.updateSize = function () {
  this.updateLinePosition();
};

MBottomTabbar.prototype.notifyChange = function () {
  this.emit('change', {
    target: this,
    value: this._value
  }, this);
};

MBottomTabbar.prototype.updateLinePosition = function () {
  if (this.$activeItem) {
    var bound = this.getBoundingClientRect();
    var iBound = this.$activeItem.getBoundingClientRect();
    this.$line.addStyle({
      width: iBound.width + 'px',
      left: iBound.left - bound.left + 'px'
    });
  } else {
    this.$line.addStyle('width', '0');
  }
};

MBottomTabbar.prototype._makeSubItem = function (data, parentElt) {
  var self = this;

  var itemElt = _({
    class: 'am-bottom-tabbar-item',
    child: [data.icon, '.am-bottom-tabbar-item-counter'],
    props: {
      parentItemElt: parentElt
    }
  });

  itemElt.attr('tabindex', 1);
  this.$itemDict[data.value] = itemElt;
  var counterElt = $('.am-bottom-tabbar-item-counter', itemElt);
  var counter = data.counter;

  if (!data.__bindCounter__) {
    Object.defineProperties(data, {
      __dataBinding__: {
        value: true,
        writable: false,
        enumerable: false
      },
      counter: {
        set: function (value) {
          counter = value;

          if (value >= 0) {
            if (value > 9) {
              counterElt.innerHTML = '9+';
            } else if (value > 0) {
              counterElt.innerHTML = value;
            } else {
              counterElt.innerHTML = '';
            }
          } else {
            if (value) counterElt.innerHTML = value + "";else counterElt.innerHTML = '';
          }

          if (parentElt.$subItems && parentElt.data) {
            parentElt.data.counter = parentElt.data.items.reduce(function (ac, cr) {
              return ac + (cr.counter || 0);
            }, 0);
          }
        },
        get: function () {
          return counter;
        }
      }
    });
  }

  data.counter = counter;
  itemElt.data = data;

  function onPress() {
    if (self._value !== data.value) {
      parentElt.lastSubValue = data.value;
      self.value = data.value;
      self.notifyChange();
    }
  }

  itemElt.on('touchstart', onPress, true);
  itemElt.on('pointerdown', onPress, true);
  return itemElt;
};

MBottomTabbar.prototype._makeItem = function (data) {
  var self = this;

  var itemElt = _({
    class: 'am-bottom-tabbar-item',
    child: [data.icon, '.am-bottom-tabbar-item-counter']
  });

  itemElt.attr('tabindex', 1);
  if (!('value' in data)) data.value = (0, _stringGenerate.randomIdent)();
  this.$itemDict[data.value] = itemElt;
  var subItemCtn;
  var counterElt = $('.am-bottom-tabbar-item-counter', itemElt);
  var counter = data.counter;

  if (data.items && data.items.length > 0) {
    itemElt.lastSubValue = data.items[0].value;
    itemElt.$subItems = data.items.map(function (sItem) {
      return this._makeSubItem(sItem, itemElt);
    }.bind(this));
    counter = data.items.reduce(function (ac, cr) {
      return ac + (cr.counter || 0);
    }, 0);
    subItemCtn = _({
      class: 'am-bottom-tabbar-sub-item-ctn',
      child: {
        class: 'am-bottom-tabbar-sub-item-box',
        child: itemElt.$subItems
      }
    });
    var lastTimeFocus = 0;
    var isTouch;

    function onPress(event) {
      isTouch = event.type === 'touchstart';
      lastTimeFocus = new Date().getTime();
      subItemCtn.addClass('am-prepare-appear'); // self.addChildAfter(subItemCtn, null);

      document.body.appendChild(subItemCtn);
      setTimeout(function () {
        subItemCtn.removeClass('am-prepare-appear').addClass('am-appear');
      }, 3);
      itemElt.off('touchstart', onPress).off('mousedown', onPress);
      setTimeout(function () {
        itemElt.on('touchstart', onRepress) // .on('mousedown', onRepress)
        .on('blur', onRepress);
      }, 100);
    }

    function onRepress(event) {
      if (isTouch && event.type === 'mousedown') return;
      subItemCtn.removeClass('am-appear').addClass('am-prepare-disappear');
      setTimeout(function () {
        subItemCtn.removeClass('am-prepare-disappear').remove();
      }, 205);
      itemElt.off('touchstart', onRepress) // .off('mousedown', onRepress)
      .off('blur', onRepress);
      setTimeout(function () {
        itemElt.on('touchstart', onPress); // .on('mousedown', onPress);
      }, 100);
    }

    itemElt.on('touchstart', onPress); // .on('mousedown', onPress);
  }

  if (!data.__bindCounter__) {
    Object.defineProperties(data, {
      __dataBinding__: {
        value: true,
        writable: false,
        enumerable: false
      },
      counter: {
        set: function (value) {
          counter = value;

          if (value >= 0) {
            if (value > 9) {
              counterElt.innerHTML = '9+';
            } else if (value > 0) {
              counterElt.innerHTML = value;
            } else {
              counterElt.innerHTML = '';
            }
          } else {
            if (value) counterElt.innerHTML = value + "";else counterElt.innerHTML = '';
          }
        },
        get: function () {
          return counter;
        }
      }
    });
  }

  data.counter = counter;
  itemElt.data = data;
  itemElt.on('click', function () {
    if (data.items && data.items.length > 0) {
      if (self.$itemDict[self._value] && self.$itemDict[self._value].parentItemElt !== itemElt) {
        self.value = itemElt.lastSubValue;
        self.notifyChange();
      }
    } else if (self._value !== data.value) {
      self.value = data.value;
      self.notifyChange();
    }
  });
  return itemElt;
};

MBottomTabbar.property = {};
/**
 * @type {MBottomTabbar}
 */

MBottomTabbar.property.items = {
  set: function (items) {
    items = items || [];
    this._items = items;
    this.$row.clearChild();
    this.$itemDict = {};
    this.$activeItem = null;
    this.$itemDict = {};

    for (var i = 0; i < items.length; ++i) {
      this._makeItem(items[i]).addTo(this.$row);
    }

    if (items && items.length > 0) {
      if (this.$itemDict[this._value]) {
        this.value = this._value;
      } else {
        this.value = items[0].value;
      }
    }
  },
  get: function () {
    return this._items;
  }
};
/**
 * @type {MBottomTabbar}
 */

MBottomTabbar.property.value = {
  set: function (value) {
    this._value = value;

    if (this.$activeItem) {
      this.$activeItem.removeClass('am-active');
      this.$activeItem = null;
    }

    if (this.$subActiveItem) {
      this.$subActiveItem.removeClass('am-active');
      this.$subActiveItem = null;
    }

    this.$activeItem = this.$itemDict[value];

    if (this.$activeItem && this.$activeItem.parentItemElt) {
      this.$subActiveItem = this.$activeItem;
      this.$activeItem = this.$activeItem.parentItemElt;
    }

    if (this.$activeItem) {
      this.$activeItem.addClass('am-active');
    }

    if (this.$subActiveItem) {
      this.$subActiveItem.addClass('am-active');
    }

    this.updateLinePosition();
  },
  get: function () {
    return this._value;
  }
};

_Core.default.install(MBottomTabbar);

var _default = MBottomTabbar;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MTinyProfileBlock.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MTinyProfileBlock.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mtinyprofileblock.css");

var _Core = _interopRequireDefault(require("./Core"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MTinyProfileBlock() {
  this._avatarSrc = '';
  this.$name = $('.am-tiny-profile-block-name', this);
  this.$desc = $('.am-tiny-profile-block-desc', this);
  this.$avatar = $('.am-tiny-profile-block-avatar', this);
}

MTinyProfileBlock.tag = 'MTinyProfileBlock'.toLowerCase();

MTinyProfileBlock.render = function () {
  return _({
    class: 'am-tiny-profile-block',
    extendEvent: 'change',
    child: [{
      class: 'am-tiny-profile-block-avatar'
    }, {
      class: 'am-tiny-profile-block-text-ctn',
      child: [{
        class: 'am-tiny-profile-block-name',
        child: {
          text: 'Pham Quoc Du Thien'
        }
      }, {
        class: 'am-tiny-profile-block-desc',
        child: {
          text: 'View your profile'
        }
      }]
    }]
  });
};

MTinyProfileBlock.property = {};
/**
 * @type {MTinyProfileBlock}
 */

MTinyProfileBlock.property.desc = {
  set: function (value) {
    this.$desc.firstChild.data = value + '';
  },
  get: function () {
    return this.$desc.firstChild.data;
  }
};
/**
 * @type {MTinyProfileBlock}
 */

MTinyProfileBlock.property.name = {
  set: function (value) {
    this.$name.firstChild.data = value + '';
  },
  get: function () {
    return this.$name.firstChild.data;
  }
};
/**
 * @type {MTinyProfileBlock}
 */

MTinyProfileBlock.property.avatarSrc = {
  set: function (value) {
    value = value + '';
    this._avatarSrc = value;
    this.$avatar.addStyle('background-image', 'url(' + value + ')');
  },
  get: function () {
    return this._avatarSrc;
  }
};

_Core.default.install(MTinyProfileBlock);

var _default = MTinyProfileBlock;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MMdiRect.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MMdiRect.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mmdirect.css");

var _Core = _interopRequireDefault(require("./Core"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MMdiRect() {
  this.$icon = $('.am-mdi-rect-icon', this);
  this._iconName = undefined;
}

MMdiRect.tag = 'MMdiRect'.toLowerCase();

MMdiRect.render = function () {
  return _({
    class: 'am-mdi-rect',
    child: 'span.mdi.am-mdi-rect-icon'
  });
};

MMdiRect.property = {};
/**
 * @type {MMdiRect}
 */

MMdiRect.property.iconName = {
  set: function (value) {
    value = value || null;
    if (this._iconName) this.$icon.removeClass('mdi-' + this._iconName);
    this._iconName = value;
    if (this._iconName) this.$icon.addClass('mdi-' + this._iconName);
  },
  get: function () {
    return this._iconName;
  }
};
MMdiRect.attribute = {};
MMdiRect.attribute.iconName = {
  set: function (value) {
    this.iconName = value;
  },
  get: function () {
    return this.iconName;
  },
  remove: function () {
    this.iconName = undefined;
  }
};

_Core.default.install(MMdiRect);

var _default = MMdiRect;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MMatMenuButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MMatMenuButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mmatmenu.css");

var _Core = _interopRequireDefault(require("./Core"));

var _MMdiRect = _interopRequireDefault(require("./MMdiRect"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MMatMenuButton() {
  this.$toggleIcon = $('.am-mat-menu-button-toggle-icon-ctn span.mdi.mdi-chevron-right', this);
  this.$icon = null;
  this.$iconCtn = $('.am-mat-menu-button-icon-ctn', this);
  this.$text = $('.am-mat-menu-button-text', this);
  this.icon = {
    tag: 'mmdirect',
    props: {
      iconName: "home"
    }
  };
  this._status = 'none';
  this._level = 0;
  this.$level = $('.am-mat-menu-button-level', this);
}

MMatMenuButton.tag = 'MMatMenuButton'.toLowerCase();

MMatMenuButton.render = function () {
  return _({
    tag: 'button',
    class: 'am-mat-menu-button',
    child: [{
      class: 'am-mat-menu-button-level'
    }, {
      class: 'am-mat-menu-button-icon-ctn'
    }, {
      tag: 'span',
      class: 'am-mat-menu-button-text',
      child: {
        text: 'Trang chủ'
      }
    }, {
      class: 'am-mat-menu-button-toggle-icon-ctn',
      child: 'span.mdi.mdi-chevron-right'
    }]
  });
};

MMatMenuButton.property = {};
/**
 * @type {MMatMenuButton}
*/

MMatMenuButton.property.level = {
  set: function (value) {
    value = Math.max(0, value || 0);
    this.$level.innerHTML = '&nbsp;'.repeat(value * 4);
    this.attr('data-level', value);
  },
  get: function () {
    return this._level;
  }
};
/**
 * @type {MMatMenuButton}
*/

MMatMenuButton.property.status = {
  set: function (value) {
    this.removeClass('am-status-open').removeClass('am-status-close');

    if (value == 'open') {
      this.$toggleIcon.addClass('mdi-rotate-90');
      this.addClass('am-status-open');
    } else if (value == 'close') {
      this.$toggleIcon.removeClass('mdi-rotate-90');
      this.addClass('am-status-close');
    } else {
      value = 'none';
    }

    this._status = value;
  },
  get: function () {
    return this._status;
  }
};
/**
 * @type {MMatMenuButton}
*/

MMatMenuButton.property.icon = {
  set: function (value) {
    value = value || null;

    if (this.$icon) {
      this.$icon.remove();
    }

    if (value) {
      this.$icon = _(value).addTo(this.$iconCtn);
    }
  },
  get: function () {
    return this._icon;
  }
};
/**
 * @type {MMatMenuButton}
*/

MMatMenuButton.property.text = {
  set: function (value) {
    this.$text.firstChild.data = value;
  },
  get: function () {
    return this.$text.firstChild.data;
  }
};

_Core.default.install(MMatMenuButton);

var _default = MMatMenuButton;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MMatMenuItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MMatMenuItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mmatmenu.css");

var _Core = _interopRequireDefault(require("./Core"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MMatMenuItem() {
  this.$node = $('mmatmenubutton', this).on('click', this.eventHandler.clickNode);

  _OOP.default.drillProperty(this, this.$node, ['icon', 'text']);
  /**
   * @type {import('./MMatMenu').default}
   */


  this.$matmenu = $('mmatmenu', this).on('press', this.eventHandler.itemPress);
  this.$dropdown = $('.am-mat-menu-dropdown', this);
}

MMatMenuItem.tag = 'MMatMenuItem'.toLowerCase();

MMatMenuItem.render = function () {
  return _({
    extendEvent: ['press'],
    class: 'am-mat-menu-item',
    child: [{
      tag: 'mmatmenubutton'
    }, {
      class: 'am-mat-menu-dropdown',
      child: {
        tag: 'mmatmenu'
      }
    }]
  });
};

MMatMenuItem.prototype.getNode = function () {
  return this.$node;
};

MMatMenuItem.prototype.openChild = function () {
  this.$node.status = 'open';
  this.addClass('am-status-open');
  var menuBound = this.$matmenu.getBoundingClientRect();
  this.$dropdown.addStyle('max-height', menuBound.height + 2 + 'px');
};

MMatMenuItem.prototype.closeChild = function () {
  this.$node.status = 'close';
  this.removeClass('am-status-open');
  this.$dropdown.removeStyle('max-height');
};

MMatMenuItem.prototype.toggleChild = function () {
  if (this.$node.status == 'open') {
    this.closeChild();
  } else if (this.$node.status == 'close') {
    this.openChild();
  }
};

MMatMenuItem.prototype.notifyPress = function (args) {
  this.emit('press', Object.assign({
    target: this,
    type: 'press',
    item: this,
    menuItem: this
  }, args || {}), this);
};

MMatMenuItem.property = {};
MMatMenuItem.property.items = {
  set: function (items) {
    items = items || [];
    if (items.length > 0) this.$node.status = 'close';else this.$node.status = 'none';
    this.$matmenu.items = items;
    this.level = this.level; // update
  },
  get: function () {
    return this.$matmenu.items;
  }
};
MMatMenuItem.property.level = {
  set: function (value) {
    this.$node.level = value;
    value = this.$node.level;

    for (var i = 0; i < this.$matmenu.childNodes.length; ++i) {
      this.$matmenu.childNodes[i].level = value + 1;
    }
  },
  get: function () {
    return this.$node.level;
  }
};
/**
 * @type {MMatMenuItem}
 */

MMatMenuItem.eventHandler = {};

MMatMenuItem.eventHandler.clickNode = function (event) {
  if (this.$node.status == 'none') {
    //todo
    this.notifyPress();
  } else {
    this.toggleChild();
  }
};

MMatMenuItem.eventHandler.itemPress = function (event) {
  this.notifyPress(event);
};

_Core.default.install(MMatMenuItem);

var _default = MMatMenuItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MMatMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MMatMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mmatmenu.css");

var _Core = _interopRequireDefault(require("./Core"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _MMatMenuItem = _interopRequireDefault(require("./MMatMenuItem"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MMatMenu() {}

MMatMenu.tag = 'MMatMenu'.toLowerCase();

MMatMenu.render = function () {
  return _({
    extendEvent: ['press'],
    class: 'am-mat-menu'
  });
};

MMatMenu.prototype.notifyPress = function (args) {
  this.emit('press', Object.assign({
    target: this,
    type: 'press'
  }, args || {}), this);
};

MMatMenu.property = {};
MMatMenu.property.items = {
  set: function (items) {
    items = items || [];
    this.clearChild();
    var item;
    var itemElt;

    for (var i = 0; i < items.length; ++i) {
      item = items[i];
      itemElt = _({
        tag: 'mmatmenuitem',
        props: Object.assign({}, item),
        on: {
          press: this.eventHandler.itemPress
        }
      });
      this.addChild(itemElt);
    }
  },
  get: function () {
    return Array.map.call(this.childNodes, function (elt) {
      return {
        text: elt.text,
        items: elt.items,
        icon: elt.icon
      };
    });
  }
};
/***
 * @type {MMatMenuItem}
 */

MMatMenu.eventHandler = {};

MMatMenu.eventHandler.itemPress = function (event) {
  this.notifyPress(event);
};

_Core.default.install(MMatMenu);

var _default = MMatMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MHeaderBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MHeaderBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mheaderbar.css");

var _Core = _interopRequireDefault(require("./Core"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MHeaderBar() {
  this._title = null;
  this._titleDesc = null;
  this._actionIcon = null;
  this._commands = [];
  this._quickmenuHolder = null;
  this._quickmenu = null;
  this.$right = $('.am-header-bar-right', this);
  this.$leftBtn = null;
  this.$titleCtn = null;
  this.$title = null;
  this.$titleDesc = null;
  this.$commands = [];
}

MHeaderBar.tag = 'MHeaderBar'.toLowerCase();

MHeaderBar.render = function () {
  return _({
    extendEvent: ['action', 'command'],
    class: 'am-header-bar',
    child: [{
      class: 'am-header-bar-right'
    }]
  });
};

MHeaderBar.prototype.notifyAction = function () {
  this.emit('action', {
    type: 'action',
    target: this
  }, this);
};

MHeaderBar.prototype.notifyCommand = function (commandItem) {
  this.emit('command', {
    type: 'command',
    target: this,
    commandName: commandItem.name,
    commandItem
  }, this);
};

MHeaderBar.prototype.showTitle = function (flag) {
  if (!this.$titleCtn && flag) {
    this.$titleCtn = _({
      class: 'am-header-bar-title-ctn',
      child: [{
        class: 'am-header-bar-no-size-wrapper',
        child: {
          class: 'am-header-bar-title-wrapper',
          child: [{
            class: 'am-header-bar-title'
          }, {
            class: 'am-header-bar-title-desc'
          }]
        }
      }]
    });
    this.$title = $('.am-header-bar-title', this.$titleCtn);
    this.$titleDesc = $('.am-header-bar-title-desc', this.$titleCtn);
  }

  if (flag) {
    this.insertBefore(this.$titleCtn, this.$right);
  } else {
    if (this.$titleCtn) this.$titleCtn.remove();
  }
};

MHeaderBar.prototype.showActionBtn = function (flag) {
  if (!this.$leftBtn && flag) {
    this.$leftBtn = _({
      tag: 'button',
      class: 'am-header-bar-left-btn',
      child: 'span.mdi.mdi-chevron-left',
      on: {
        click: this.notifyAction.bind(this)
      }
    });
  }

  if (flag) {
    this.insertBefore(this.$leftBtn, this.firstChild);
  } else {
    if (this.$leftBtn) this.$leftBtn.remove();
  }
};

MHeaderBar.prototype.showQuickMenu = function (flag) {
  if (!this.$quickmenuBtn && flag) {
    this.$quickmenuBtn = _({
      tag: 'button',
      class: ['am-header-bar-action', 'am-header-bar-quickmenu-btn'],
      child: {
        class: 'am-header-bar-quickmenu-btn-circle',
        child: ['span.mdi.mdi-dots-horizontal-circle-outline', 'span.mdi.mdi-dots-horizontal-circle']
      }
    });
  }

  if (flag) {
    this.$right.addChild(this.$quickmenuBtn);
  } else {
    if (this.$quickmenuBtn) this.$quickmenuBtn.remove();
  }
};

MHeaderBar.prototype._makeCommandBtn = function (item) {
  return _({
    tag: 'button',
    class: 'am-header-bar-command',
    child: item.icon || [],
    on: {
      click: this.notifyCommand.bind(this, item)
    }
  });
};

MHeaderBar.property = {};
/**
 * @type {MHeaderBar}
 */

MHeaderBar.property.quickmenu = {
  set: function (value) {
    if (this._quickmenuHolder) {
      this._quickmenuHolder.remove();

      this._quickmenu = null;
    }

    if (value) {
      this.showQuickMenu(true);
      var button = this.$quickmenuBtn;
      var onClose = value.onClose;
      var onOpen = value.onOpen;

      value.onOpen = function () {
        button.addClass('am-status-active');
        onOpen && onOpen.apply(this, arguments);
      };

      value.onClose = function () {
        button.removeClass('am-status-active');
        onClose && onClose.apply(this, arguments);
      };

      if (!value.getAnchor) {
        value.getAnchor = function () {
          return [2];
        };
      }

      if (!value.getMenuProps && value.props) {
        value.getMenuProps = function () {
          var res = Object.assign({}, value.props);

          if (typeof res.items === "function") {
            res.items = res.items();
          }

          return res;
        };
      }

      this._quickmenuHolder = _QuickMenu.default.toggleWhenClick(this.$quickmenuBtn, value);
    } else {
      this.showQuickMenu(false);
      value = null;
    }

    this._quickmenu = value;
  },
  get: function () {
    return this._quickmenu;
  }
};
/**
 * @type {MHeaderBar}
 */

MHeaderBar.property.title = {
  set: function (value) {
    if (value) {
      this.showTitle(true);

      if (typeof value === 'string') {
        this.$title.innerHTML = value;
      } else {
        this.$title.clearChild().addChild(_(value));
      }
    } else {
      this.showTitle(false);
      value = null;
    }

    this._title = value;
  },
  get: function () {
    return this._title;
  }
};
/**
 * @type {MHeaderBar}
 */

MHeaderBar.property.titleDesc = {
  set: function (value) {
    if (value) {
      value = value + '';
      this.showTitle(true);
      this.$titleDesc.clearChild().addChild(_({
        text: value
      }));
    } else {
      this.showTitle(false);
      if (this.$titleDesc) this.$titleDesc.clearChild();
      value = null;
    }

    this._titleDesc = value;
  },
  get: function () {
    return this._titleDesc;
  }
};
/**
 * @type {MHeaderBar}
 */

MHeaderBar.property.actionIcon = {
  set: function (value) {
    if (value) {
      this.showActionBtn(true);
      this.$leftBtn.clearChild().addChild(_(value));
    } else {
      this.showActionBtn(false);
      value = null;
    }

    this._actionIcon = value;
  },
  get: function () {
    return this._actionIcon;
  }
};
/**
 * @type {MHeaderBar}
 */

MHeaderBar.property.commands = {
  set: function (value) {
    this.$commands.forEach(function (e) {
      e.selftRemove();
    });
    this.$commands = [];
    var commandBtn;

    if (value) {
      var firstChild = this.$right.firstChild;

      if (firstChild) {
        for (var i = 0; i < value.length; ++i) {
          commandBtn = this._makeCommandBtn(value[i]);
          this.$right.addChildBefore(commandBtn, firstChild);
        }
      } else {
        for (var i = 0; i < value.length; ++i) {
          commandBtn = this._makeCommandBtn(value[i]);
          this.$right.addChild(commandBtn);
        }
      }
    } else {
      this._commands = [];
    }

    this._commands = value;
  },
  get: function () {
    return this._commands;
  }
};

_Core.default.install(MHeaderBar);

var _default = MHeaderBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MConversation.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MConversation.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mconversation.css");

var _Core = _interopRequireDefault(require("./Core"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MConversation() {
  this._name = '';
  this._shortContent = '';
  this._time = '';
  this._avatarSrc = null;
  this.$name = $('.am-conversation-name', this);
  this.$shortContent = $('.am-conversation-short-content', this);
  this.$time = $('span.am-conversation-time', this);
  this.$counter = $('.am-conversation-counter', this);
  this.$avatar = $('.am-conversation-avatar', this);

  _OOP.default.drillProperty(this, this.$counter, 'counter', 'innerHTML');

  _OOP.default.drillProperty(this, this.$avatar, 'avatarSrc', 'src');

  _OOP.default.drillProperty(this, this.$avatar, 'onlineStatus', 'status');
}

MConversation.tag = 'MConversation'.toLowerCase();

MConversation.render = function () {
  return _({
    class: 'am-conversation',
    child: [{
      class: 'am-conversation-avatar-ctn',
      child: 'mcircleavatar.am-conversation-avatar'
    }, {
      class: 'am-conversation-body',
      child: ['.am-conversation-name', '.am-conversation-short-content']
    }, {
      class: 'am-conversation-time-ctn',
      child: 'span.am-conversation-time'
    }, {
      class: 'am-conversation-counter'
    }, '.am-conversation-bottom-line']
  });
};

MConversation.property = {};
/**
 * @type {MConversation}
 */

MConversation.property.name = {
  set: function (value) {
    value = value || '';
    this.$name.clearChild();

    if (value) {
      this.$name.addChild(_({
        text: value
      }));
    }

    this._name = value;
  },
  get: function () {
    return this._name;
  }
};
/**
 * @type {MConversation}
 */

MConversation.property.time = {
  set: function (value) {
    value = value || '';
    this.$time.clearChild().addChild(_({
      text: value
    }));
    this._time = value;
  },
  get: function () {
    return this._time;
  }
};
/**
 * @type {MConversation}
 */

MConversation.property.shortContent = {
  set: function (value) {
    if (typeof value == 'object') {
      this.$shortContent.clearChild().addChild(_(value));
    } else {
      this.$shortContent.innerHTML = value + '';
    }

    this._shortContent = value;
  },
  get: function () {
    return this._shortContent;
  }
};
/**
 * @type {MConversation}
 */

MConversation.property.unread = {
  set: function (value) {
    if (value) {
      this.addClass('am-status-unread');
    } else {
      this.removeClass('am-status-unread');
    }
  },
  get: function () {
    return this.containsClass('am-status-unread');
  }
};

_Core.default.install(MConversation);

var _default = MConversation;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MMessageTool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MMessageTool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireDefault(require("./Core"));

require("../../css/mmessagetool.css");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _utils = require("absol-acomp/js/utils");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _stringGenerate = require("absol/src/String/stringGenerate");


var _ = _Core.default._;
var $ = _Core.default.$;
var supportContactPicker = 'contacts' in navigator && 'ContactsManager' in window && false; //disable until done

/***
 * @extends AElement
 * @constructor
 */

function MMessageTool() {
  this.$contactPicker = $('.am-message-tool-contact-picker', this);

  if (!supportContactPicker) {
    this.$contactPicker.remove(); // this.$contactPicker.addStyle('display', 'none');
  }

  this.$image = $('.am-message-tool-image', this).on('click', this.openImages.bind(this));
  this.$video = $('.am-message-tool-video', this).on('click', this.openVideos.bind(this));
  this.$file = $('.am-message-tool-file', this).on('click', this.openFiles.bind(this));
  this.$closeBtn = $('.am-message-tool-header-close-btn', this).on('click', this.notifyClose.bind(this));
}

MMessageTool.tag = 'MMessageTool'.toLowerCase();

function makePlugin(data) {
  return {
    class: ['am-message-tool-plugin'].concat(data.class ? [data.class] : []),
    child: [{
      class: 'am-message-tool-plugin-icon-ctn',
      child: data.icon
    }, {
      class: 'am-message-tool-plugin-content',
      child: [{
        class: 'am-message-tool-plugin-name',
        child: {
          text: data.name
        }
      }, {
        class: 'am-message-tool-plugin-desc',
        child: {
          text: data.desc
        }
      }]
    }]
  };
}

MMessageTool.render = function () {
  return _({
    class: 'am-message-tool',
    extendEvent: ['pressclose', 'resolve'],
    child: [{
      class: 'am-message-tool-box',
      child: [{
        class: 'am-message-tool-header',
        child: [{
          class: 'am-message-tool-header-close-btn-ctn',
          child: {
            tag: 'button',
            class: 'am-message-tool-header-close-btn',
            child: 'span.mdi.mdi-close'
          }
        }, {
          class: 'am-message-tool-title',
          child: {
            text: this.prototype.titleText
          }
        }]
      }, {
        class: 'am-message-tool-body',
        child: [makePlugin({
          class: 'am-message-tool-image',
          name: "Ảnh",
          desc: "Chia sẻ ảnh",
          icon: 'span.mdi.mdi-file-image-outline'
        }), makePlugin({
          class: 'am-message-tool-video',
          name: "Video",
          desc: "Chia sẻ video",
          icon: 'span.mdi.mdi-file-video-outline'
        }), makePlugin({
          class: 'am-message-tool-file',
          name: "Tệp",
          desc: "Chia sẻ tệp",
          icon: 'span.mdi.mdi-file-outline'
        }), makePlugin({
          class: 'am-message-tool-contact-picker',
          name: "Liên hệ",
          desc: "Chia sẻ liên hệ từ danh bạ",
          icon: 'span.mdi.mdi-account-box-outline'
        })]
      }]
    }]
  });
};

MMessageTool.prototype.titleText = "Nội dung và công cụ";

MMessageTool.prototype.openImages = function () {
  var thisMT = this;
  return (0, _utils.openFileDialog)({
    multiple: true,
    accept: "image/*"
  }).then(function (files) {
    if (files && files.length > 0) {
      thisMT.notifyResolve({
        type: 'image',
        files: files
      });
    } else {
      thisMT.notifyClose();
    }
  });
};

MMessageTool.prototype.openVideos = function () {
  var thisMT = this;
  (0, _utils.openFileDialog)({
    multiple: true,
    accept: "video/*"
  }).then(function (files) {
    console.log('resolve', files);

    if (files && files.length > 0) {
      thisMT.notifyResolve({
        type: 'video',
        files: files
      });
    } else {
      thisMT.notifyClose();
    }
  });
};

MMessageTool.prototype.openFiles = function () {
  var thisMT = this;
  return (0, _utils.openFileDialog)({
    multiple: true
  }).then(function (files) {
    if (files && files.length > 0) {
      thisMT.notifyResolve({
        type: 'file',
        files: files
      });
    } else {
      thisMT.notifyClose();
    }
  });
};

MMessageTool.prototype.notifyClose = function () {
  this.emit('pressclose', {
    type: 'pressclose',
    target: this
  }, this);
};

MMessageTool.prototype.notifyResolve = function (value) {
  this.emit('resolve', {
    type: 'resolve',
    target: this,
    value: value
  }, this);
};

_Core.default.install(MMessageTool);

MMessageTool.$share = _('mmessagetool');
MMessageTool.resolveCB = null;
MMessageTool.rejectCB = null;
MMessageTool.currentSession = null;
MMessageTool._closeTimeout = -1;

MMessageTool.open = function () {
  if (MMessageTool._closeTimeout >= 0) {
    clearTimeout(MMessageTool._closeTimeout);
    MMessageTool._closeTimeout = -1;
  }

  if (typeof MMessageTool.resolveCB == "function") {
    MMessageTool.rejectCB();
    MMessageTool.resolveCB = null;
    MMessageTool.rejectCB = null;
  } // MMessageTool.$share


  MMessageTool.$share.addStyle('visibility', 'hidden');
  MMessageTool.$share.addClass('am-hiding');
  setTimeout(function () {
    MMessageTool.$share.removeStyle('visibility');
    MMessageTool.$share.removeClass('am-hiding');
  }, 1);
  MMessageTool.$share.addTo(document.body);
  var ss = (0, _stringGenerate.randomIdent)(20);
  return new Promise(function (rs, rj) {
    MMessageTool.currentSession = ss;
    MMessageTool.resolveCB = rs;
    MMessageTool.rejectCB = rj;

    function finish() {
      MMessageTool.$share.off('pressclose', pressClose);
      MMessageTool.$share.off('resolve', resolve);
      if (MMessageTool.currentSession !== ss) return;
      MMessageTool.resolveCB = null;
      MMessageTool.resolveCB = null;
      MMessageTool.rejectCB = null;
      MMessageTool.$share.addClass('am-hiding');
      MMessageTool._closeTimeout = setTimeout(function () {
        MMessageTool.$share.remove();
      }, 250);

      if (arguments.length === 0) {
        rj();
      } else {
        rs(arguments[0]);
      }
    }

    function pressClose() {
      finish();
    }

    function resolve(event) {
      finish(event.value);
    }

    MMessageTool.$share.on('pressclose', pressClose);
    MMessageTool.$share.on('resolve', resolve);
  });
};

var _default = MMessageTool;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MMessageInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MMessageInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mmessageinput.css");

var _Core = _interopRequireDefault(require("./Core"));

var _utils = require("absol-acomp/js/utils");

var _MMessageTool = _interopRequireDefault(require("./MMessageTool"));

var _MessageInput = _interopRequireDefault(require("absol-acomp/js/messageinput/MessageInput"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends MessageInput
 * @constructor
 */

function MMessageInput() {
  this.autoSend = true;
  this.$left = _('.am-message-input-left').addTo(this);
  this.$moreBtn = _({
    tag: 'button',
    class: ['as-message-input-plugin-btn', 'am-message-input-plugin-more'],
    child: 'span.mdi.mdi-plus'
  }).addTo(this.$left).on('click', this.eventHandler.clickMore);
  this.$cameraBtn = _({
    tag: 'button',
    class: ['as-message-input-plugin-btn', 'am-message-input-plugin-camera'],
    child: 'span.mdi.mdi-camera-outline'
  }).on('click', this.eventHandler.clickCameraBtn);
  this.$right = $('.as-message-input-right', this);
  this.$right.addChildBefore(this.$cameraBtn, this.$fileBtn);
}

MMessageInput.tag = 'mmessageinput';

MMessageInput.render = function (data) {
  return _('messageinput.am-message-input', true);
};
/***
 *
 * @type {{}|MMessageInput}
 */


MMessageInput.eventHandler = {};

MMessageInput.eventHandler.clickCameraBtn = function (event) {
  var thisMi = this;
  (0, _utils.openFileDialog)('camera').then(function (files) {
    if (files.length > 0) {
      this.notifyAddFiles(files).then(function (files) {
        this.handleAddingFileByType(files);
      }.bind(this));
    }
  }.bind(this));
};

MMessageInput.eventHandler.clickMore = function () {
  _MMessageTool.default.open().then(function (result) {
    if (result.type === 'file' || result.type == 'image') {
      this.notifyAddFiles(result.files).then(function (files) {
        this.handleAddingFileByType(files);
      }.bind(this));
    }
  }.bind(this), function () {});
};

_Core.default.install(MMessageInput);

var _default = MMessageInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MSelectListItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MSelectListItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mselectlistitem.css");

var _Core = _interopRequireDefault(require("./Core"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SelectListItem = _interopRequireDefault(require("absol-acomp/js/SelectListItem"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 *
 * @extends {AElement}
 * @constructor
 */

function MSelectListItem() {
  this.$textCtn = $('.am-selectlist-item-text-ctn', this);
  this.$text = $('span.am-selectlist-item-text', this);
  this.$textValue = this.$text.childNodes[0];
  this.$descCtn = $('.am-selectlist-item-desc-ctn', this);
  this.$desc = $('span.am-selectlist-item-desc', this.$descCtn);
  this.$descValue = this.$desc.childNodes[0];
  this._extendClasses = [];
  this._extendStyle = {};
  this._data = "";
  this._level = 0;
}

MSelectListItem.tag = 'MSelectListItem'.toLowerCase();

MSelectListItem.render = function () {
  return _({
    class: 'am-selectlist-item',
    child: [{
      class: 'am-selectlist-item-text-ctn',
      child: {
        tag: 'span',
        class: 'am-selectlist-item-text',
        child: {
          text: ''
        }
      }
    }, {
      class: 'am-selectlist-item-desc-ctn',
      child: {
        tag: 'span',
        class: 'am-selectlist-item-desc',
        child: {
          text: ''
        }
      }
    }]
  });
};

MSelectListItem.property = Object.assign({}, _SelectListItem.default.property);
MSelectListItem.property.icon = {
  set: function (icon) {
    if (this.$icon) {
      this.$icon.remove();
      this.$icon = null;
    }

    this._icon = icon || null;

    if (this._icon) {
      this.$icon = _(this._icon).addClass('am-selectlist-item-icon');
      this.$textCtn.addChildAfter(this.$icon, null);
    }
  },
  get: function () {
    return this._icon;
  }
};

_Core.default.install(MSelectListItem);

var _default = MSelectListItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MSelectList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MSelectList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.measureListSize = measureListSize;
exports.makeItem = makeItem;
exports.requireItem = requireItem;
exports.releaseItem = releaseItem;
exports.default = void 0;

var _Core = _interopRequireDefault(require("./Core"));

var _MSelectListItem = _interopRequireDefault(require("./MSelectListItem"));

require("../../css/mselectlist.css");

var _SelectList = _interopRequireWildcard(require("absol-acomp/js/SelectList"));




var _ = _Core.default._;
var $ = _Core.default.$;

function measureListSize(items) {
  var descWidth = (0, _SelectList.measureMaxDescriptionWidth)(items);
  var textWidth = (0, _SelectList.measureMaxTextWidth)(items);
  var width = descWidth + 20 + textWidth + 12 + 15; //padding, margin

  return {
    width: width,
    descWidth: descWidth,
    textWidth: textWidth
  };
}

var itemPool = [];

function onClickItem(event) {
  var thisSL = this.$parent;

  if (thisSL) {
    thisSL.value = this.value;
    thisSL.emit('pressitem', {
      type: 'pressitem',
      target: thisSL,
      itemElt: this,
      value: this.value,
      data: this.data
    });
  }
}
/**
 * @returns {MSelectListItem}
 */


function makeItem() {
  return _({
    tag: 'mselectlistitem',
    on: {
      click: onClickItem
    }
  });
}

function requireItem($parent) {
  var item;

  if (itemPool.length > 0) {
    item = itemPool.pop();
  } else {
    item = makeItem();
  }

  item.$parent = $parent;
  return item;
}

function releaseItem(item) {
  item.$parent = null;
  item.attr('class', 'am-selectlist-item');
  item.selected = false;
  itemPool.push(item);
}
/*global absol*/

/***
 * @extends Element
 * @constructor
 */


function MSelectList() {
  var res = this;
  this.defineEvent(['pressitem', 'cancelasync', 'valuevisibilityasync', 'finishasync', 'sizechangeasync']);
  this.$attachhook = _('attachhook').addTo(this);
  this.sync = new Promise(function (rs) {
    res.$attachhook.once('error', rs);
  });
  this.$items = [];
  this.$itemByValue = {}; //quick find element

  this.$selectedItem = undefined;
  this._itemSession = 0;
  this._finished = true;
  this._resourceReady = true;
}

;
MSelectList.tag = "MSelectList".toLowerCase();

MSelectList.render = function () {
  return _('.am-selectlist');
}; //todo: update this feature to SelectList

/***
 *
 * @param value
 * @return {MSelectListItem|null}
 */


MSelectList.prototype.getItemElementByValue = function (value) {
  return this.$itemByValue[value + ''] || null;
};

MSelectList.prototype._updateSelectedItem = function () {
  var newSelectedItemElt = this.$itemByValue[this._selectValue + ''];

  if (newSelectedItemElt != this.$selectedItem) {
    if (this.$selectedItem) {
      this.$selectedItem.removeClass('selected');
    }

    if (newSelectedItemElt) {
      newSelectedItemElt.addClass('selected');
      this.$selectedItem = newSelectedItemElt;
    }
  }
};

MSelectList.prototype._requireItems = function (itemCout) {
  var item;

  while (this.$items.length < itemCout) {
    item = requireItem(this);
    this.$items.push(item);
    this.addChild(item);
  }

  while (this.$items.length > itemCout) {
    item = this.$items.pop();
    item.remove();
    releaseItem(item);
  }
};

MSelectList.prototype._assignItems = function (from, to) {
  var foundSelected = false;
  var itemElt;
  var item;

  for (var i = from; i < to; ++i) {
    itemElt = this.$items[i];
    item = this._items[i];
    itemElt.data = item;
    itemElt.__index__ = i;

    if (this.$itemByValue[item.value + '']) {
      console.warn('Value  ' + this.$items[i].value + ' is duplicated!');
    } else {
      this.$itemByValue[item.value + ''] = itemElt;

      if (this._selectValue == item.value) {
        itemElt.selected = true;
        this.$selectedItem = itemElt;
        foundSelected = true;
      } else {
        itemElt.selected = false;
      }
    }
  }

  return foundSelected;
};

MSelectList.prototype.setItemsAsync = function (items) {
  //start process
  this._finished = false;
  var session = Math.floor(Math.random() * 1000000);
  this._itemSession = session;
  this._items = items || [];
  this.$itemByValue = {};
  this.measuredSize = measureListSize(items);
  var thisSL = this;
  var i = 0;
  var limit = 20;

  function tick() {
    if (thisSL._itemSession != session) {
      thisSL.emit('cancelasync', {
        session: session,
        type: 'cancelasync'
      }, this);
      return;
    }

    if (i >= items.length) {
      thisSL._updateSelectedItem();

      thisSL._finished = false;
      thisSL.emit('finishasync', {
        session: session,
        type: 'finishasync'
      }, this);
      return;
    }

    var n = Math.min(items.length - i, limit);
    var itemCout = i + n;

    thisSL._requireItems(itemCout);

    i = itemCout;

    var foundSelected = thisSL._assignItems(itemCout - n, itemCout);

    if (foundSelected) {
      thisSL.emit('valuevisibilityasync', {
        session: session,
        type: 'valuevisibilityasync',
        itemElt: thisSL.$items[i]
      }, thisSL);
    }

    thisSL.emit('sizechangeasync', {
      session: session,
      type: 'sizechangeasync'
    }, this);
    setTimeout(tick, 2);
  }

  setTimeout(tick, 2);
  return Object.assign({
    session: session
  }, this.measuredSize);
};

MSelectList.prototype.setItems = function (items) {
  this._finished = false;
  var session = Math.floor(Math.random() * 1000000);
  this._itemSession = session;
  this._items = items || [];
  this.$itemByValue = {};
  this.measuredSize = measureListSize(items);
  var itemCount = items.length;

  this._requireItems(itemCount);

  this._assignItems(0, itemCount);

  this._finished = true;
  return Object.assign({
    session: this._itemSession
  }, this.measuredSize);
};

MSelectList.property = Object.assign({}, _SelectList.default.property);
MSelectList.prototype.init = _SelectList.default.prototype.init;
MSelectList.eventHandler = {};

_Core.default.install(MSelectList);

var _default = MSelectList;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MListModal.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MListModal.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.VALUE_NORMAL = exports.VALUE_HIDDEN = void 0;

require("../../css/mlistmodal.css");

var _Core = _interopRequireDefault(require("./Core"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _search = require("absol-acomp/js/list/search");

var _MSelectList = require("./MSelectList");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _SelectListBox = _interopRequireDefault(require("absol-acomp/js/SelectListBox"));

var _ListSearchMaster = _interopRequireDefault(require("absol-acomp/js/list/ListSearchMaster"));

var _utils = require("absol-acomp/js/utils");


var _ = _Core.default._;
var $ = _Core.default.$;
var $$ = _Core.default.$$;
var VALUE_HIDDEN = -1;
exports.VALUE_HIDDEN = VALUE_HIDDEN;
var VALUE_NORMAL = 1;
/***
 * @extends AElement
 * @constructor
 */

exports.VALUE_NORMAL = VALUE_NORMAL;

function MListModal() {
  this._initDomHook();

  this._initControl();

  this._initScroller();

  this._initProperty();
}

MListModal.tag = "MListModal".toLowerCase();

MListModal.render = function () {
  return _({
    extendEvent: ['pressitem', 'pressclose', 'pressout'],
    class: 'am-list-modal',
    child: [{
      class: ['am-list-popup-box'],
      child: [{
        class: 'am-list-popup-header',
        child: [{
          tag: 'searchtextinput'
        }, {
          tag: 'button',
          class: 'am-list-popup-close-btn',
          child: 'span.mdi.mdi-close'
        }]
      }, {
        class: 'am-list-popup-list-scroller',
        child: {
          class: 'am-list-popup-content',
          child: Array(MListModal.prototype.preLoadN).fill('.am-list-popup-list-page.am-selectlist')
        }
      }]
    }]
  });
};

MListModal.prototype.toLoadNextY = 200;
MListModal.prototype.preLoadN = 5;

MListModal.prototype._initDomHook = function () {
  this.estimateSize = {
    width: 0
  };
  this.$attachhook = _('attachhook').addTo(this);
  this.$attachhook._isAttached = false;
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$attachhook.on('attached', function () {
    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
    this._isAttached = true;
  });
  this.$domSignal = _('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('viewListAt', this.viewListAt.bind(this));
  this.domSignal.on('viewListAtFirstSelected', this.viewListAtFirstSelected.bind(this));
  this.searchMaster = new _ListSearchMaster.default();
};

MListModal.prototype._initControl = function () {
  this._currentOffset = 0;
  this._startItemIdx = 0;
  this.$closeBtn = $('.am-list-popup-close-btn', this).on('click', this.notifyPressClose.bind(this));
  this.on('click', this.eventHandler.click);
  this.$box = $('.am-list-popup-box', this);
  this.$searchInput = $('searchtextinput', this).on('stoptyping', this.eventHandler.searchModify);
};

MListModal.prototype._initScroller = function () {
  this._estimateHeight = 0;
  this._pageOffsets = Array(this.preLoadN + 1).fill(0);
  this._pageYs = Array(this.preLoadN + 1).fill(0);
  this.$listScroller = $('.am-list-popup-list-scroller', this).on('scroll', this.eventHandler.scroll);
  this.$content = $('.am-list-popup-content', this);
  this.$listPages = $$('.am-list-popup-list-page', this);
};

MListModal.prototype._initProperty = function () {
  this._items = [];
  this._values = [];
  this._valueDict = {};
  this._preDisplayItems = [];
  this._displayItems = [];
  this._searchCache = {};
  this._displayValue = VALUE_NORMAL;
  this.displayValue = VALUE_NORMAL;
  this.items = [];
};

MListModal.prototype.updateSize = function () {
  var bound = this.getBoundingClientRect();
  var boxBound = this.$box.getBoundingClientRect();
  var listScrollerBound = this.$listScroller.getBoundingClientRect();
  this.$listScroller.addStyle('max-height', 'calc(' + (bound.height - listScrollerBound.top + boxBound.top) + 'px - var(--modal-margin-bottom) - var(--modal-margin-top))');
};

MListModal.prototype._requireItem = function (pageElt, n) {
  var itemElt;

  while (pageElt.childNodes.length > n) {
    itemElt = pageElt.lastChild;
    itemElt.selfRemove();
    (0, _MSelectList.releaseItem)(itemElt);
  }

  while (pageElt.childNodes.length < n) {
    itemElt = (0, _MSelectList.requireItem)(this);
    pageElt.addChild(itemElt);
  }
};

MListModal.prototype._listToDisplay = function (items) {
  return items;
};
/***
 *
 * @param {Array<{value:String|Number}>} items
 * @return {Array<{value:String|Number}>}
 */


MListModal.prototype._filterValue = function (items) {
  if (this._displayValue === VALUE_NORMAL) return items;
  var dict = this._valueDict;
  return items.filter(function (item) {
    return !dict[item.value + ''];
  });
};

MListModal.prototype._assignItems = function (pageElt, offset) {
  var n = Math.min(this._displayItems.length - offset, pageElt.childNodes.length);
  var itemElt, value;

  for (var i = 0; i < n; ++i) {
    itemElt = pageElt.childNodes[i];
    itemElt.data = this._displayItems[offset + i];
    value = itemElt.value + '';
  }
};

MListModal.prototype._alignPage = function () {
  var pageElt;
  var pageBound;

  for (var i = 0; i < this.$listPages.length; ++i) {
    pageElt = this.$listPages[i];
    pageBound = pageElt.getBoundingClientRect();
    if (i > 0) this.$listPages[i].addStyle('top', this._pageYs[i] + 'px');
    this._pageYs[i + 1] = this._pageYs[i] + pageBound.height;
  }

  this.$content.addStyle('height', this._pageYs[this.preLoadN] + 'px');
};

MListModal.prototype._updateSelectedItem = function () {
  var valueDict = this._valueDict;
  this.$listPages.forEach(function (pageElt) {
    Array.prototype.forEach.call(pageElt.childNodes, function (itemElt) {
      var value = itemElt.value + '';

      if (valueDict[value]) {
        itemElt.selected = true;
      } else {
        itemElt.selected = false;
      }
    });
  });
  if (this._displayValue === VALUE_HIDDEN) this._alignPage();
};

MListModal.prototype.viewListAt = function (offset) {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('viewListAt', offset);
    return;
  }

  var fontSize = this.$listScroller.getFontSize() || 14;
  offset = Math.max(0, Math.min(offset, this._displayItems.length - 1));

  var screenSize = _Dom.default.getScreenSize();

  var maxItem = Math.ceil(screenSize.height / (fontSize * 2.25));
  var contentBound = this.$content.getBoundingClientRect();
  this._pageOffsets[0] = Math.max(offset - maxItem, 0);

  for (var i = 1; i <= this.preLoadN; ++i) {
    this._pageOffsets[i] = Math.min(this._pageOffsets[i - 1] + maxItem, this._displayItems.length);
  }

  var sIdx, nItem, pageBound;
  var pageElt;

  for (var pageIndex = 0; pageIndex < this.preLoadN; ++pageIndex) {
    sIdx = this._pageOffsets[pageIndex];
    nItem = this._pageOffsets[pageIndex + 1] - sIdx;
    pageElt = this.$listPages[pageIndex];

    if (pageIndex === 0) {
      this._pageYs[pageIndex] = sIdx / this._displayItems.length * contentBound.height;
    }

    pageElt.addStyle('top', this._pageYs[pageIndex] + 'px');

    this._requireItem(pageElt, nItem);

    this._assignItems(pageElt, sIdx);

    pageBound = pageElt.getBoundingClientRect();
    this._pageYs[pageIndex + 1] = this._pageYs[pageIndex] + pageBound.height;
  }

  if (this._pageOffsets[this.preLoadN] === this._displayItems.length) {
    this.$content.addStyle('height', this._pageYs[this.preLoadN] + 'px');
  } else {
    this.$content.addStyle('height', this._estimateHeight + 'px');
  }

  this._updateSelectedItem();
};

MListModal.prototype.viewListAtFirstSelected = function () {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('viewListAtFirstSelected');
    return;
  }

  if (this._displayValue == VALUE_HIDDEN) {
    return false;
  } else if (this._values.length > 0) {
    var value = this._values[0];
    var itemHolders = this._itemHolderByValue[value + ''];

    if (itemHolders) {
      this.domSignal.once('scrollIntoSelected', function () {
        var holder = itemHolders[0];
        this.viewListAt(holder.idx);
        var itemElt = $('.as-selected', this.$listScroller);

        if (itemElt) {
          var scrollBound = this.$listScroller.getBoundingClientRect();
          var itemBound = itemElt.getBoundingClientRect();
          this.$listScroller.scrollTop += itemBound.top - scrollBound.top;
        }
      }.bind(this));
      this.domSignal.emit('scrollIntoSelected');
      return true;
    } else return false;
  } else return false;
};

MListModal.prototype.searchItemByText = _SelectListBox.default.prototype.searchItemByText;

MListModal.prototype.resetSearchState = function () {
  this.$searchInput.value = '';
  this._preDisplayItems = this._listToDisplay(this._items);
  this._displayItems = this._filterValue(this._preDisplayItems);

  this._updateItemIndex();

  this.domSignal.emit('viewListAt', 0);
  this.$listScroller.scrollTop = 0;
};

MListModal.prototype.notifyPressOut = function () {
  this.emit('pressout', {
    target: this,
    type: 'pressout'
  }, this);
};

MListModal.prototype.notifyPressClose = function () {
  this.emit('pressclose', {
    target: this,
    type: 'pressclose'
  }, this);
};

MListModal.prototype._findFirstPageIdx = function () {
  for (var i = 0; i < this.preLoadN; ++i) {
    if (this._pageOffsets[i + 1] - this._pageOffsets[i] > 0) {
      return i;
    }
  }

  return -1;
};

MListModal.prototype._findLastPageIdx = function () {
  for (var i = this.preLoadN - 1; i >= 0; --i) {
    if (this._pageOffsets[i + 1] - this._pageOffsets[i] > 0) {
      return i;
    }
  }

  return -1;
};

MListModal.prototype._updateItemIndex = function () {
  this._itemHolderByValue = this._displayItems.reduce(function (ac, cr, idx) {
    var value = typeof cr === "string" ? cr : cr.value + '';
    ac[value] = ac[value] || [];
    ac[value].push({
      idx: idx,
      item: cr
    });
    return ac;
  }, {});
};

MListModal.property = {};
/***
 *
 * @type {MListModal}
 */

MListModal.property.items = {
  get: function () {
    return this._items;
  },
  set: function (items) {
    var items = items || [];
    this._items = items;
    this._preDisplayItems = this._listToDisplay(this._items);
    this._displayItems = this._filterValue(this._preDisplayItems);

    this._updateItemIndex();
    /*****************/


    this.idx2key = [];

    var makeSearchItem = it => {
      var res = {
        value: this.idx2key.length
      };
      var valueKey;
      res.text = it.text + '';
      if (it.desc) res.text += it.desc;
      valueKey = (0, _utils.keyStringOf)(it.value);
      it.valueKey = valueKey;
      this.idx2key.push(valueKey);

      if (it.items && it.items.length > 0 && it.items.map) {
        res.items = it.items.map(makeSearchItem);
      }

      return res;
    };

    this.searchingItems = this._items.map(makeSearchItem);
    this.key2idx = this.idx2key.reduce((ac, cr, i) => {
      ac[cr] = i;
      return ac;
    }, {});
    this.searchMaster.transfer(this.searchingItems);
    /*****************/

    this._searchCache = {};
    var estimateSize = (0, _MSelectList.measureListSize)(this._preDisplayItems);

    if (estimateSize.descWidth > 0) {
      this.$listScroller.addStyle('--desc-width', 100 * (estimateSize.descWidth + 15) / estimateSize.width + '%');
    } else {
      this.$listScroller.removeStyle('--desc-width');
    }

    var estimateHeight = this._displayItems.length * 30 * Math.ceil(estimateSize.width * 1.2 / Math.min(_Dom.default.getScreenSize().width - 80, 500));
    this._estimateHeight = estimateHeight;
    this.$content.addStyle('height', estimateHeight + 'px');
    this.estimateSize = estimateSize;
    this.domSignal.emit('viewListAt', 0);
  }
};
MListModal.property.values = {
  set: function (values) {
    values = values || [];
    values = values.slice();
    this._values = values;
    this._valueDict = values.reduce(function (ac, cr) {
      ac[cr + ''] = true;
      return ac;
    }, {});
    this._displayItems = this._filterValue(this._preDisplayItems);

    this._updateItemIndex(); //todo


    if (this._pageOffsets[this.preLoadN] > this._pageOffsets[0]) this._updateSelectedItem();
  },
  get: function () {
    return this._values;
  }
};
MListModal.property.displayValue = {
  set: function (value) {
    this._displayValue = value;
    this._displayItems = this._filterValue(this._preDisplayItems);

    this._updateItemIndex();

    if (value === VALUE_HIDDEN) {
      this.addClass('am-value-hidden');
    } else {
      this.removeClass('am-value-hidden');
    }
  },
  get: function () {
    return this._displayValue;
  }
};
MListModal.property.enableSearch = {
  set: function (value) {
    if (value) this.$box.addClass('am-enable-search');
  },
  get: function () {
    return this.$box.removeClass('am-enable-search');
  }
};
/***
 *
 * @type {MListModal}
 */

MListModal.eventHandler = {};
/***
 *
 * @param {MouseEvent} event
 */

MListModal.eventHandler.click = function (event) {
  if (event.target === this) this.notifyPressOut();
};

MListModal.eventHandler.searchModify = function () {
  var text = this.$searchInput.value;
  var searchSession = Math.random() + '';
  this._seachSession = searchSession;
  this.searchItemByText(text).then(searchedItems => {
    if (this._seachSession !== searchSession) return;
    this._preDisplayItems = this._listToDisplay(searchedItems);
    this._displayItems = this._filterValue(this._preDisplayItems);

    this._updateItemIndex();

    this.viewListAt(0);
    this.$listScroller.scrollTop = 0;
  });
};

MListModal.eventHandler.scroll = function () {
  var scrollerBound = this.$listScroller.getBoundingClientRect();

  var topIdx = this._findFirstPageIdx();

  var fontSize = this.$listScroller.getFontSize() || 14;

  var screenSize = _Dom.default.getScreenSize();

  var maxItem = Math.ceil(screenSize.height / (fontSize * 2.25));
  var pageBound;
  var topBound = this.$listPages[topIdx].getBoundingClientRect();
  ;

  if (this._pageOffsets[topIdx] > 0) {
    if (topBound.top + this.toLoadNextY > scrollerBound.top) {
      this._pageOffsets.unshift(this._pageOffsets.pop());

      this._pageYs.unshift(this._pageYs.pop());

      this.$listPages.unshift(this.$listPages.pop());
      this._pageOffsets[topIdx] = Math.max(0, this._pageOffsets[topIdx + 1] - maxItem);

      this._requireItem(this.$listPages[topIdx], this._pageOffsets[topIdx + 1] - this._pageOffsets[topIdx]);

      this._assignItems(this.$listPages[topIdx], this._pageOffsets[topIdx]);

      pageBound = this.$listPages[topIdx].getBoundingClientRect();
      this._pageYs[topIdx] = this._pageYs[topIdx + 1] - pageBound.height;
      this.$listPages[topIdx].addStyle('top', this._pageYs[topIdx] + 'px');

      this._updateSelectedItem();

      if (this._pageOffsets[topIdx] === 0) {
        this.$listPages[0].addStyle('top', '0');
        this._pageYs[0] = 0;

        this._alignPage();

        this.$listScroller.scrollTop = 0;
      }
    }
  } else {
    if (topBound.top > scrollerBound.top) {
      this.$listScroller.scrollTop += topBound.top - scrollerBound.top;
    }
  }

  var botIdx = this._findLastPageIdx();

  var botBound;
  botBound = this.$listPages[botIdx].getBoundingClientRect();

  if (this._pageOffsets[botIdx + 1] < this._displayItems.length) {
    if (botBound.bottom - this.toLoadNextY < scrollerBound.bottom) {
      this._pageOffsets.push(this._pageOffsets.shift());

      this._pageYs.push(this._pageYs.shift());

      this.$listPages.push(this.$listPages.shift());
      this._pageOffsets[botIdx + 1] = Math.min(this._displayItems.length, this._pageOffsets[botIdx] + maxItem);
      this.$listPages[botIdx].addStyle('top', this._pageYs[botIdx] + 'px');

      this._requireItem(this.$listPages[botIdx], this._pageOffsets[botIdx + 1] - this._pageOffsets[botIdx]);

      this._assignItems(this.$listPages[botIdx], this._pageOffsets[botIdx]);

      pageBound = this.$listPages[botIdx].getBoundingClientRect();
      this._pageYs[botIdx + 1] = this._pageYs[botIdx] + pageBound.height;

      this._updateSelectedItem();

      if (this._pageOffsets[botIdx + 1] < this._displayItems.length) {
        this.$content.addStyle('height', this._estimateHeight + 'px');
      } else {
        this.$content.addStyle('height', this._pageYs[botIdx + 1] + 'px');
      }
    }
  }
};

_Core.default.install(MListModal);

var _default = MListModal;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MSelectMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MSelectMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mselectmenu.css");

var _Core = _interopRequireDefault(require("./Core"));

var _SelectMenu = _interopRequireDefault(require("absol-acomp/js/SelectMenu"));

var _MListModal = _interopRequireDefault(require("./MListModal"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends AElement
 * @constructor
 */

function MSelectMenu() {
  this._isFocus = false;
  this._itemsByValue = {};
  this.$holderItem = $('.am-selectmenu-holder-item', this);
  /***
   * @type {MListModal}
   */

  this.$selectlist = _('mlistmodal');

  var checkView = () => {
    if (this.isDescendantOf(document.body)) {
      setTimeout(checkView, 10000);
    } else {
      if (this.$selectlist.searchMaster) this.$selectlist.searchMaster.destroy();
    }
  };

  setTimeout(checkView, 30000);
  this.$selectlist.on('pressitem', this.eventHandler.pressItem, true).on('pressout', this.eventHandler.pressOut).on('pressclose', this.eventHandler.pressOut);
  this.on('click', this.eventHandler.click, true);
  this.$attachhook = $('attachhook', this).on('error', this.eventHandler.attached);
}

MSelectMenu.tag = 'mselectmenu';

MSelectMenu.render = function () {
  return _({
    class: ['absol-selectmenu', 'am-selectmenu'],
    extendEvent: ['change', 'minwidthchange'],
    attr: {
      tabindex: '1'
    },
    child: ['.am-selectmenu-holder-item', {
      tag: 'button',
      class: 'absol-selectmenu-btn',
      child: ['dropdown-ico']
    }, 'attachhook']
  });
};

MSelectMenu.prototype.updateItem = function () {
  this.$holderItem.clearChild();

  if (this._itemsByValue[this.value]) {
    var elt = _({
      tag: 'mselectlistitem',
      props: {
        data: this._itemsByValue[this.value]
      }
    }).addTo(this.$holderItem); // elt.$descCtn.addStyle('width', this.$selectlist._descWidth + 'px');

  }
};

MSelectMenu.prototype.notifyChange = function (data) {
  this.emit('change', Object.assign({}, data, {
    type: 'chage',
    target: this
  }), this);
};

MSelectMenu.prototype._dictByValue = _SelectMenu.default.prototype._dictByValue;

MSelectMenu.prototype.getRecommendWith = function () {
  return this.$selectlist.estimateSize.width + 36;
};

MSelectMenu.prototype.init = _SelectMenu.default.prototype.init;
MSelectMenu.property = {};
MSelectMenu.property.items = {
  set: function (value) {
    this._itemIdxByValue = null;
    /**
     * verity data
     */

    if (value) {
      value.forEach(function (it) {
        if (it && it.text) {
          it.text = it.text + '';
        }
      });
    }

    this._items = value;
    this._itemsByValue = this._dictByValue(value);

    if (!this._itemsByValue[this.value] && value.length > 0 && false) {
      //todo
      this.value = value[0].value;
    } else this.updateItem();

    this.$selectlist.items = value;
  },
  get: function () {
    return this._items || [];
  }
};
MSelectMenu.property.value = {
  set: function (value) {
    this._value = value;
    this.$selectlist.values = [value];
    this.updateItem();
  },
  get: function () {
    return this._value;
  }
};
MSelectMenu.property.enableSearch = {
  set: function (value) {
    this.$selectlist.enableSearch = !!value;
  },
  get: function () {
    return this.$selectlist.enableSearch;
  }
};
MSelectMenu.property.isFocus = {
  set: function (value) {
    var thisSM = this;
    value = !!value;
    if (value === this._isFocus) return;
    this._isFocus = value;

    if (value) {
      thisSM.$selectlist.viewListAt(0);
      thisSM.$selectlist.viewListAtFirstSelected();
      this.$selectlist.addTo(document.body);
    } else {
      this.$selectlist.selfRemove();
      setTimeout(function () {
        thisSM.$selectlist.resetSearchState();
      }, 100);
    }
  },
  get: function () {
    return this._isFocus;
  }
};
MSelectMenu.property.selectedIndex = _SelectMenu.default.property.selectedIndex;
MSelectMenu.property.disabled = _SelectMenu.default.property.disabled;
MSelectMenu.property.hidden = _SelectMenu.default.property.hidden;
/**
 * @type {MSelectMenu}
 */

MSelectMenu.eventHandler = {};

MSelectMenu.eventHandler.attached = function () {
  if (this.style.width === 'auto') {
    this.addStyle('width', this.getRecommendWith() / 14 + 'em');
  }
};

MSelectMenu.eventHandler.click = function (event) {
  this.isFocus = !this.isFocus;
};

MSelectMenu.eventHandler.pressOut = function (event) {
  this.isFocus = false;
};

MSelectMenu.eventHandler.pressItem = function (event) {
  var newValue = event.value;

  if (newValue !== this._value) {
    var lastValue = this._value;
    this._value = newValue;
    this.$selectlist.values = [newValue];
    this.updateItem();
    var changeEvent = Object.assign({}, event, {
      lastValue: lastValue
    });
    setTimeout(function () {
      this.notifyChange(changeEvent);
    }.bind(this), 1);
  }

  setTimeout(function () {
    this.isFocus = false;
  }.bind(this), 100);
};

_Core.default.install(MSelectMenu);

var _default = MSelectMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MTreeModal.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MTreeModal.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _MListModal = _interopRequireDefault(require("./MListModal"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _treeListToList = _interopRequireDefault(require("absol-acomp/js/list/treeListToList"));

var _Core = _interopRequireDefault(require("./Core"));

var _search = require("absol-acomp/js/list/search");


/***
 * @extends MListModal
 * @constructor
 */
function MTreeModal() {
  _MListModal.default.call(this);
}

MTreeModal.tag = 'MTreeModal'.toLowerCase();

MTreeModal.render = function () {
  return _MListModal.default.render().addClass('am-tree-modal');
};

Object.assign(MTreeModal.prototype, _MListModal.default.prototype);

MTreeModal.prototype._listToDisplay = function (items) {
  return (0, _treeListToList.default)(items);
};

MTreeModal.property = Object.assign({}, _MListModal.default.property);
MTreeModal.eventHandler = Object.assign({}, _MListModal.default.eventHandler);

_Core.default.install(MTreeModal);

var _default = MTreeModal;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MSelectTreeMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MSelectTreeMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mselecttreemenu.css");

var _Core = _interopRequireDefault(require("./Core"));

var _MSelectMenu = _interopRequireDefault(require("./MSelectMenu"));

var _MTreeModal = _interopRequireDefault(require("./MTreeModal"));


var _ = _Core.default._;
var $ = _Core.default.$;

function MSelectTreeMenu() {
  this._isFocus = false;
  this._itemsByValue = {};
  this.$holderItem = $('.am-selectmenu-holder-item', this);
  /***
   * @type {MTreeModal}
   */

  this.$selectlist = _('mtreemodal');
  this.$selectlist.on('pressitem', this.eventHandler.pressItem, true).on('pressout', this.eventHandler.pressOut).on('pressclose', this.eventHandler.pressOut);
  this.on('click', this.eventHandler.click, true);
  this.$attachhook = $('attachhook', this).on('error', this.eventHandler.attached);
}

MSelectTreeMenu.tag = 'MSelectTreeMenu'.toLowerCase();

MSelectTreeMenu.render = function () {
  return _MSelectMenu.default.render().addClass('am-select-tree-menu');
};

Object.assign(MSelectTreeMenu.prototype, _MSelectMenu.default.prototype);
MSelectTreeMenu.property = Object.assign({}, _MSelectMenu.default.property);
MSelectTreeMenu.eventHandler = Object.assign({}, _MSelectMenu.default.eventHandler);

MSelectTreeMenu.prototype._dictByValue = function (items) {
  return items.reduce(function visitor(ac, cr) {
    if (cr.items && cr.items.reduce) {
      cr.items.reduce(visitor, ac);
    }

    var value = cr.value + '';
    ac[value] = cr;
    return ac;
  }, {});
};

_Core.default.install(MSelectTreeMenu);

var _default = MSelectTreeMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MSelectBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MSelectBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.makeItem = makeItem;
exports.requireBoxItem = requireBoxItem;
exports.releaseBoxItem = releaseBoxItem;
exports.default = void 0;

require("../../css/mselectbox.css");

var _MSelectMenu = _interopRequireDefault(require("./MSelectMenu"));

var _Core = _interopRequireDefault(require("./Core"));

var _MListModal = _interopRequireWildcard(require("./MListModal"));




/*global absol*/
var _ = _Core.default._;
var $ = _Core.default.$;
var boxItemPool = [];

function closeBoxItem(event) {
  var thisSB = this.$parent;
  if (!thisSB) return;
  var itemValue = this.value;
  var index = thisSB.values.indexOf(itemValue);

  if (index >= 0) {
    thisSB.values = thisSB.values.slice(0, index).concat(thisSB.values.slice(index + 1));
    thisSB.emit('remove', {
      type: 'remove',
      values: thisSB.values,
      target: thisSB,
      itemElt: this,
      value: this.value,
      itemData: this.data
    }, thisSB);
    thisSB.emit('change', {
      type: 'change',
      values: thisSB.values,
      target: thisSB
    }, thisSB);
  }
}
/**
 * @returns {MSelectListItem}
 */


function makeItem() {
  return _({
    tag: 'selectboxitem',
    on: {
      close: closeBoxItem
    }
  });
}

function requireBoxItem($parent) {
  var item;

  if (boxItemPool.length > 0) {
    item = boxItemPool.pop();
  } else {
    item = makeItem();
  }

  item.$parent = $parent;
  return item;
}

function releaseBoxItem(item) {
  item.$parent = null;
  boxItemPool.push(item);
}
/***
 * @extends Element
 * @constructor
 */


function MSelectBox() {
  this._isFocus = false;
  this._values = [];
  this._orderly = false;
  this._itemsByValue = {};
  this.$boxItems = [];
  this.$selectlist = _('mlistmodal');
  this.$selectlist.displayValue = _MListModal.VALUE_HIDDEN;
  this.$selectlist.on('pressitem', this.eventHandler.pressItem, true).on('pressout', this.eventHandler.pressOut).on('pressclose', this.eventHandler.pressOut);
  this.on('click', this.eventHandler.click);
  this.$attachhook = $('attachhook', this).on('error', this.eventHandler.attached);
  this._values = [];
  this.orderly = false;
  this.items = [];
  this.values = [];
}

MSelectBox.tag = 'MSelectBox'.toLowerCase();

MSelectBox.render = function () {
  return _({
    tag: 'bscroller',
    class: ['absol-selectbox', 'absol-bscroller', 'am-select-box'],
    extendEvent: ['change', 'add', 'remove', 'minwidthchange'],
    attr: {
      tabindex: '1'
    },
    child: 'attachhook'
  }, true);
};

MSelectBox.prototype.getRecommendWith = function () {
  return this.$selectlist.estimateSize.textWidth + 60;
};

MSelectBox.prototype._dictByValue = _MSelectMenu.default.prototype._dictByValue;
MSelectBox.property = {};
MSelectBox.property.disabled = _MSelectMenu.default.property.disabled;
MSelectBox.property.hidden = _MSelectMenu.default.property.hidden;
MSelectBox.property.enableSearch = _MSelectMenu.default.property.enableSearch;

MSelectBox.prototype.init = function (props) {
  props = props || [];
  Object.keys(props).forEach(function (key) {
    if (props[key] === undefined) delete props[key];
  });
  this.super(props);
};

MSelectBox.prototype._requireBoxItems = function (n) {
  var boxItemElt;

  while (this.$boxItems.length < n) {
    boxItemElt = requireBoxItem(this);
    this.$boxItems.push(boxItemElt);
    this.addChild(boxItemElt);
  }

  while (this.$boxItems.length > n) {
    boxItemElt = this.$boxItems.pop();
    boxItemElt.selfRemove();
    releaseBoxItem(boxItemElt);
  }
};

MSelectBox.prototype._sortValuesIfNeed = function (values) {
  if (this._orderly) {
    var thisMB = this;
    values.sort(function (a, b) {
      var aItem = thisMB._itemsByValue[a];
      var bItem = thisMB._itemsByValue[b];
      if (!aItem) return 1;
      if (!bItem) return -1;
      return aItem.__index__ - bItem.__index__;
    });
  }
};

MSelectBox.prototype._assignBoxItems = function (values) {
  var n = values.length;
  var item;
  var value;

  for (var i = 0; i < n; ++i) {
    value = values[i];
    item = this._itemsByValue[value];
    this.$boxItems[i].data = item || {
      text: 'error'
    };
  }
};

MSelectBox.prototype._updateValues = function () {
  this.viewItemsByValues(this._values);
};

MSelectBox.prototype.viewItemsByValues = function (values) {
  this._requireBoxItems(values.length);

  this._assignBoxItems(values);
};

MSelectBox.prototype.querySelectedItems = function () {
  return Array.prototype.map.call(this.$holderItem.childNodes, function (e) {
    return e.data;
  });
};

MSelectBox.property.isFocus = _MSelectMenu.default.property.isFocus;
/***
 *
 * @type {MSelectBox}
 */

MSelectBox.property.items = {
  set: function (items) {
    items = items || [];
    items.forEach(function (item, i) {
      item.__index__ = i;
    });
    this._items = items;
    this._itemsByValue = this._dictByValue(items);
    this.$selectlist.items = items;
    this.addStyle('--item-min-width', this.$selectlist.estimateSize.textWidth + 60 + 'px');

    this._sortValuesIfNeed(this._values);

    this._updateValues();
  },
  get: function () {
    return this._items;
  }
};
MSelectBox.property.values = {
  set: function (values) {
    values = values || [];
    values = values instanceof Array ? values : [values];
    values = values.slice();
    this._values = values;
    this.$selectlist.values = values;

    this._sortValuesIfNeed(this._values);

    this._updateValues();
  },
  get: function () {
    return this._values || [];
  }
};
MSelectBox.property.orderly = {
  set: function (value) {
    this._orderly = !!value;

    this._sortValuesIfNeed(this._values);

    this._updateValues();
  },
  get: function () {
    return !!this._orderly;
  }
};
/***
 *
 * @type {MSelectBox}
 */

MSelectBox.eventHandler = {};
MSelectBox.eventHandler.pressOut = _MSelectMenu.default.eventHandler.pressOut;
MSelectBox.eventHandler.attached = _MSelectMenu.default.eventHandler.attached;

MSelectBox.eventHandler.click = function (event) {
  if (event.target == this) {
    this.isFocus = !this.isFocus;
  }
};

MSelectBox.eventHandler.pressItem = function (event) {
  this.values.push(event.value);

  this._sortValuesIfNeed(this._values);

  this._updateValues();

  this.$selectlist.values = this.values;
  this.emit('add', {
    type: 'add',
    itemData: event.itemElt.data,
    value: event.value,
    values: this.values
  }, this);
  this.emit('change', {
    type: 'change',
    values: this.values,
    target: this
  }, this);
  this.isFocus = false;
};

_Core.default.install('MSelectBox'.toLowerCase(), MSelectBox);

var _default = MSelectBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MBlinkModal.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MBlinkModal.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mblinkmodal.css");

var _Core = _interopRequireDefault(require("./Core"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * extends {Element}
 * @constructor
 */

function MBlinkModal() {
  this.$attachhook = _('attachhook');
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$attachhook.addTo(this).on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
  });
  this._show = false;
  this.show = false;
}

MBlinkModal.tag = 'MBlinkModal'.toLowerCase();

MBlinkModal.render = function () {
  return _({
    class: 'am-blink-modal'
  });
};

MBlinkModal.prototype.clearChild = function () {
  var child = Array.prototype.slice(this.childNodes);
};

MBlinkModal.prototype.updateSize = function () {
  this.removeClass('am-animation');
  var bound = this.getBoundingClientRect();
  this.addStyle('--hide-top', -(bound.height + 2) + 'px');
  this.addClass('am-animation');
};

MBlinkModal.property = {};
MBlinkModal.property.show = {
  set: function (value) {
    this._show = !!value;

    if (this._show) {
      this.addClass('am-show');
    } else {
      this.removeClass('am-show');
    }
  },
  get: function () {
    return this._show;
  }
};

MBlinkModal.newInstance = function (instanceData) {
  instanceData = instanceData || {};
  instanceData.duration = instanceData.duration || 2000;

  var modal = _(Object.assign({
    tag: 'mblinkmodal'
  }, instanceData || {}));

  var state = 0; //not attach

  function waitToRemove() {
    setTimeout(function () {
      if (state !== 3) return;
      state = 4;
      modal.selfRemove();
    }, 300);
  }

  function waitToShow() {
    setTimeout(function () {
      if (state !== 1) return;
      state = 2;
      modal.show = true;
      waitToClose(instanceData.duration);
    }, 1);
  }

  function waitToClose(mil) {
    if (state === 2) {
      setTimeout(function () {
        if (state !== 2) return;
        state = 3;
        modal.show = false;
        waitToRemove();
      }, mil);
    }
  }

  modal.addTo(document.body);
  modal.$attachhook.once('attached', function () {
    state = 1; //attached

    waitToShow();
  });
  return {
    modal: modal,
    close: waitToClose.bind(null, 100)
  };
};

_Core.default.install(MBlinkModal);

var _default = MBlinkModal;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MHSnapScroller.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MHSnapScroller.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/mhsnapscroller.css");

var _Core = _interopRequireDefault(require("./Core"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 *  @extends AElement
 * @constructor
 */

function MHSnapScroller() {
  this.addClass('am-h-snap-scroller'); //still fail on iOS, disable all
  // this.on('touchstart', this.eventHandler.touchstart);
  // this.on('touchend', this.eventHandler.touchend);
  // this.on('scroll', this.eventHandler.scroll);

  this._scroll = {
    speed: 0,
    lastEventTime: 0,
    homeGoing: false,
    release: true,
    homeX: 0,
    x: 0,
    scrollEnded: true
  };
}

MHSnapScroller.tag = 'MHSnapScroller'.toLowerCase();

MHSnapScroller.render = function () {
  return _({});
};

MHSnapScroller.prototype._findHomeX = function () {
  var bound = this.getBoundingClientRect();
  var centerX = (bound.left + bound.right) / 2;
  var eBounds = Array.prototype.map.call(this.childNodes, function (elt) {
    return elt.getBoundingClientRect();
  }).filter(function (bound) {
    return bound.width > 0;
  });
  var scrollLeft = this.scrollLeft;
  var nearestX = Infinity;
  var nextX = Infinity;
  var childCenterX;

  for (var i = 0; i < eBounds.length; ++i) {
    childCenterX = (eBounds[i].left + eBounds[i].right) / 2;

    if (Math.abs(childCenterX - centerX) < Math.abs(nearestX - centerX)) {
      nearestX = childCenterX;
    }

    if (childCenterX - centerX >= 0 == this._scroll.speed >= 0) {
      if (Math.abs(childCenterX - centerX) < Math.abs(nextX - centerX)) {
        nextX = childCenterX;
      }
    }
  }

  if (nearestX - centerX >= 0 != this._scroll.speed >= 0 && nextX != Infinity) {
    nearestX = nextX;
  }

  return Math.max(0, Math.min(this.scrollWidth - this.clientWidth, scrollLeft + (nearestX - centerX)));
};

MHSnapScroller.prototype.startHomeGoing = function () {
  if (this._scroll.homeGoing || !this._scroll.release || !this._scroll.scrollEnded) return;

  var homeX = this._findHomeX();

  this._scroll.homeX = homeX;
  this._scroll.homeGoing = true;

  if (this._scroll.speed < 50 && this._scroll.speed >= 0) {
    this._scroll.speed = 50;
  } else if (this._scroll.speed > -50 && this._scroll.speed < 0) {
    this._scroll.speed = -50;
  }

  this.eventHandler.homeGoingTick();
};

MHSnapScroller.prototype.stopHomeGoing = function () {
  if (!this._scroll.homeGoing) return;
  this._scroll.homeGoing = false;
};
/***
 *
 * @type {{}|MHSnapScroller}
 */


MHSnapScroller.eventHandler = {};

MHSnapScroller.eventHandler.homeGoingTick = function (toFinish) {
  if (!this._scroll.homeGoing) return;

  if (toFinish === true) {
    this.stopHomeGoing();
    return;
  }

  var last = this._scroll.lastEventTime;
  var now = new Date().getTime();
  var dt = (now - last) / 1000;
  var dx = dt * this._scroll.speed;
  var limitDx = this._scroll.homeX - this._scroll.x;
  var needContinue = false;

  if (Math.abs(dx) >= Math.abs(limitDx) || dx * limitDx <= 0) {
    this._scroll.x = this._scroll.homeX;
  } else {
    this._scroll.x += dx;
    needContinue = true;
  }

  this.scrollLeft = this._scroll.x;
  if (needContinue) requestAnimationFrame(this.eventHandler.homeGoingTick);else requestAnimationFrame(this.eventHandler.homeGoingTick.bind(this, true));
};

MHSnapScroller.eventHandler.stopScroll = function () {
  this._scroll.scrollEnded = true;
  this.startHomeGoing();
};
/***
 *
 * @param {TouchEvent} event
 */


MHSnapScroller.eventHandler.touchstart = function (event) {
  this.stopHomeGoing();
  this._scroll.release = false;
};
/***
 *
 * @param {TouchEvent} event
 */


MHSnapScroller.eventHandler.touchend = function (event) {
  if (event.touches.length === 0) {
    this._scroll.release = true;
    this.startHomeGoing();
  }
};

MHSnapScroller.eventHandler.scroll = function () {
  if (this._scroll.homeGoing) return;
  var last = this._scroll.lastEventTime;
  this._scroll.scrollEnded = false;
  var now = new Date().getTime();

  if (now - last > 100) {
    this._scroll.speed = 0;
    this._scroll.lastEventTime = now;
    this._scroll.x = this.scrollLeft;
  } else if (now > last) {
    this._scroll.speed = (this.scrollLeft - this._scroll.x) * 1000 / (now - last);
    this._scroll.lastEventTime = now;
    this._scroll.x = this.scrollLeft;
  }

  if (this._scroll.stopTimeout > 0) {
    clearTimeout(this._scroll.stopTimeout);
  }

  this._scroll.stopTimeout = setTimeout(this.eventHandler.stopScroll, 30);
};

var _default = MHSnapScroller;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MChecklistItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MChecklistItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("./Core"));

var _MSelectListItem = _interopRequireDefault(require("./MSelectListItem"));

var _CheckboxButton = _interopRequireDefault(require("absol-acomp/js/CheckboxButton"));

require("../../css/mchecklist.css");

var _CheckListItem = _interopRequireDefault(require("absol-acomp/js/CheckListItem"));




/****
 * @extends MSelectListItem
 * @constructor
 */
function MChecklistItem() {
  this.$checkbox = (0, _Core.$)('.am-selectlist-item-check-ctn > ' + _CheckboxButton.default.tag, this).on('change', this.eventHandler.checkboxChange);

  _MSelectListItem.default.call(this);

  this.on('click', this.eventHandler.clickText);
}

MChecklistItem.tag = 'MChecklistItem'.toLowerCase();
MChecklistItem.property = Object.assign({}, _MSelectListItem.default.property);

MChecklistItem.render = function () {
  return (0, _Core._)({
    extendEvent: ['change', 'select'],
    class: 'am-selectlist-item',
    child: [{
      class: 'am-selectlist-item-check-ctn',
      child: {
        tag: _CheckboxButton.default.tag
      }
    }, {
      class: 'am-selectlist-item-text-ctn',
      child: {
        tag: 'span',
        class: 'am-selectlist-item-text',
        child: {
          text: ''
        }
      }
    }, {
      class: 'am-selectlist-item-desc-ctn',
      child: {
        tag: 'span',
        class: 'am-selectlist-item-desc',
        child: {
          text: ''
        }
      }
    }]
  });
};

MChecklistItem.eventHandler = {};
MChecklistItem.eventHandler.clickText = _CheckListItem.default.eventHandler.clickText;
MChecklistItem.eventHandler.checkboxChange = _CheckListItem.default.eventHandler.checkboxChange;
MChecklistItem.property.selected = _CheckListItem.default.property.selected;

_Core.default.install(MChecklistItem);

var _default = MChecklistItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MChecklistModal.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MChecklistModal.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.measureListSize = measureListSize;
exports.makeItem = makeItem;
exports.requireItem = requireItem;
exports.releaseItem = releaseItem;
exports.default = void 0;

var _MListModal = _interopRequireDefault(require("./MListModal"));

var _Core = _interopRequireWildcard(require("./Core"));

var _SelectList = require("absol-acomp/js/SelectList");

var _MChecklistItem = _interopRequireDefault(require("./MChecklistItem"));

var _CheckListBox = _interopRequireDefault(require("absol-acomp/js/CheckListBox"));




function measureListSize(items) {
  var descWidth = (0, _SelectList.measureMaxDescriptionWidth)(items);
  var textWidth = (0, _SelectList.measureMaxTextWidth)(items);
  var width = descWidth + 20 + textWidth + 12 + 15 + 18; //padding, margin

  return {
    width: width,
    descWidth: descWidth,
    textWidth: textWidth
  };
}

var itemPool = [];

function onClickItem(event) {
  var thisSL = this.$parent;

  if (thisSL) {
    thisSL.eventHandler.selectItem(this, event);
  }
}
/**
 * @returns {MSelectListItem}
 */


function makeItem() {
  return (0, _Core._)({
    tag: _MChecklistItem.default,
    on: {
      select: onClickItem
    }
  });
}

function requireItem($parent) {
  var item;

  if (itemPool.length > 0) {
    item = itemPool.pop();
  } else {
    item = makeItem();
  }

  item.$parent = $parent;
  return item;
}

function releaseItem(item) {
  item.$parent = null;
  item.attr('class', 'am-selectlist-item');
  item.selected = false;
  itemPool.push(item);
}
/***
 * @extends MListModal
 * @constructor
 */


function MChecklistModal() {
  this._initFooter();

  _MListModal.default.call(this);
}

MChecklistModal.tag = 'MChecklistModal'.toLowerCase();
Object.assign(MChecklistModal.prototype, _MListModal.default.prototype);
MChecklistModal.property = Object.assign({}, _MListModal.default.property);
MChecklistModal.eventHandler = Object.assign({}, _MListModal.default.eventHandler);

MChecklistModal.render = function () {
  return (0, _Core._)({
    extendEvent: ['change', 'pressclose', 'pressout', 'cancel'],
    class: 'am-list-modal',
    child: [{
      class: ['am-list-popup-box'],
      child: [{
        class: 'am-list-popup-header',
        child: [{
          tag: 'searchtextinput'
        }, {
          tag: 'button',
          class: 'am-list-popup-close-btn',
          child: 'span.mdi.mdi-close'
        }]
      }, {
        class: 'am-list-popup-list-scroller',
        child: {
          class: 'am-list-popup-content',
          child: Array(this.prototype.preLoadN).fill('.am-list-popup-list-page.am-selectlist.am-check-list')
        }
      }, {
        class: 'as-dropdown-box-footer',
        child: [{
          tag: 'checkbox',
          class: 'as-select-list-box-check-all',
          props: {
            checked: false,
            text: 'Check All'
          }
        }, {
          class: 'as-dropdown-box-footer-right',
          child: {
            tag: 'a',
            class: 'as-select-list-box-cancel-btn',
            child: {
              text: 'Cancel'
            }
          }
        }]
      }]
    }]
  });
};

MChecklistModal.prototype._requireItem = function (pageElt, n) {
  var itemElt;

  while (pageElt.childNodes.length > n) {
    itemElt = pageElt.lastChild;
    itemElt.selfRemove();
    releaseItem(itemElt);
  }

  while (pageElt.childNodes.length < n) {
    itemElt = requireItem(this);
    pageElt.addChild(itemElt);
  }
};

MChecklistModal.prototype._initFooter = _CheckListBox.default.prototype._initFooter;
MChecklistModal.property.values = {
  set: function (value) {
    _MListModal.default.property.values.set.apply(this, arguments);

    console.log(this._values.length, this.items.length);
    this.$checkAll.checked = this._values.length === this.items.length;
  },
  get: _CheckListBox.default.property.values.get
};
MChecklistModal.property.items = {
  set: function (value) {
    _MListModal.default.property.items.set.apply(this, arguments);

    this.$checkAll.checked = this._values.length === this._items.length;
  },
  get: _CheckListBox.default.property.items.get
};

MChecklistModal.eventHandler.selectItem = function (itemElt, event) {
  var selected = itemElt.selected;
  var data = itemElt.data;
  var value = itemElt.value;
  var idx;

  if (selected) {
    this._valueDict[value + ''] = true;

    this._values.push(value);
  } else {
    delete this._valueDict[value + ''];
    idx = this._values.indexOf(value);
    if (idx >= 0) this._values.splice(idx, 1);
    this.$checkAll.checked = false;
  }

  this.emit('change', {
    type: 'change',
    target: this,
    itemElt: this,
    value: value,
    data: data,
    itemData: data,
    action: selected ? "check" : "uncheck",
    originalEvent: event.originalEvent || event.originEvent || event
  });
};

MChecklistModal.eventHandler.checkAllChange = _CheckListBox.default.eventHandler.checkAllChange;
MChecklistModal.eventHandler.clickCancelBtn = _CheckListBox.default.eventHandler.clickCancelBtn;

_Core.default.install(MChecklistModal);

var _default = MChecklistModal;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MMultiCheckMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MMultiCheckMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.makeItem = makeItem;
exports.requireBoxItem = requireBoxItem;
exports.releaseBoxItem = releaseBoxItem;
exports.default = void 0;

require("../../css/mselectbox.css");

var _MSelectMenu = _interopRequireDefault(require("./MSelectMenu"));

var _Core = _interopRequireWildcard(require("./Core"));

require("../../css/mmulticheckmenu.css");

var _MSelectBox = _interopRequireDefault(require("./MSelectBox"));

var _SelectListItem = require("absol-acomp/js/SelectListItem");




var boxItemPool = [];

function closeBoxItem(event) {
  var thisSB = this.$parent;
  if (!thisSB) return;
  var itemValue = this.value;
  var index = thisSB.values.indexOf(itemValue);

  if (index >= 0) {
    thisSB.values = thisSB.values.slice(0, index).concat(thisSB.values.slice(index + 1));
    thisSB.emit('remove', {
      type: 'remove',
      values: thisSB.values,
      target: thisSB,
      itemElt: this,
      value: this.value,
      itemData: this.data
    }, thisSB);
    thisSB.emit('change', {
      type: 'change',
      values: thisSB.values,
      target: thisSB
    }, thisSB);
  }
}
/**
 * @returns {MSelectListItem}
 */


function makeItem() {
  return (0, _Core._)({
    tag: 'selectboxitem',
    on: {
      close: closeBoxItem
    }
  });
}

function requireBoxItem($parent) {
  var item;

  if (boxItemPool.length > 0) {
    item = boxItemPool.pop();
  } else {
    item = makeItem();
  }

  item.$parent = $parent;
  return item;
}

function releaseBoxItem(item) {
  item.$parent = null;
  boxItemPool.push(item);
}
/***
 * @extends AElement
 * @constructor
 */


function MMultiCheckMenu() {
  this._isFocus = false;
  this._values = [];
  this._orderly = false;
  this._itemsByValue = {};
  this.$boxItems = [];
  this.$selectlist = (0, _Core._)({
    tag: 'mchecklistmodal',
    on: {
      change: this.eventHandler.modalChange,
      pressout: this.eventHandler.modalSubmit,
      pressclose: this.eventHandler.modalSubmit,
      cancel: this.eventHandler.modalCancel
    }
  });
  this.on('click', this.eventHandler.click);
  this.$attachhook = (0, _Core.$)('attachhook', this).on('error', this.eventHandler.attached);
  this._tempValues = []; //20p

  this.orderly = false;
  this.items = [];
  this.values = [];
}

MMultiCheckMenu.tag = 'MMultiCheckMenu'.toLowerCase();
Object.assign(MMultiCheckMenu.prototype, _MSelectBox.default.prototype);
MMultiCheckMenu.property = Object.assign({}, _MSelectBox.default.property);
MMultiCheckMenu.eventHandler = Object.assign({}, _MSelectBox.default.eventHandler);

MMultiCheckMenu.render = function () {
  return (0, _Core._)({
    tag: 'bscroller',
    class: ['absol-selectbox', 'absol-bscroller', 'am-select-box', 'am-multi-check-menu'],
    extendEvent: ['change', 'add', 'remove', 'minwidthchange'],
    attr: {
      tabindex: '1'
    },
    child: 'attachhook'
  }, true);
};

MMultiCheckMenu.property.isFocus = {
  set: function (value) {
    if (!this._isFocus && value) {
      this._tempValues = this._values.slice();
      this.$selectlist.values = this._tempValues;
    }

    _MSelectBox.default.property.isFocus.set.call(this, value);
  },
  get: _MSelectBox.default.property.isFocus.get
};

MMultiCheckMenu.eventHandler.modalChange = function (event) {
  var value, idx;

  switch (event.action) {
    case "check":
      value = event.value;
      idx = this._tempValues.indexOf(value);

      if (idx < 0) {
        this._tempValues.push(value);

        this._sortValuesIfNeed(this._tempValues);
      }

      break;

    case "uncheck":
      value = event.value;
      idx = this._tempValues.indexOf(value);

      if (idx >= 0) {
        this._tempValues.splice(idx, 1);
      }

      break;

    case "check_all":
      this._tempValues = this._items.map(function (item) {
        return (0, _SelectListItem.getValueOfListItem)(item);
      });
      break;

    case "uncheck_all":
      this._tempValues.splice(0, this._tempValues.length);

      break;
  }

  this.viewItemsByValues(this._tempValues);
};

MMultiCheckMenu.eventHandler.modalSubmit = function (event) {
  var curDict = this._values.reduce(function (ac, cr) {
    ac[cr + ''] = true;
    return ac;
  }, {});

  var newDict = this._tempValues.reduce(function (ac, cr) {
    ac[cr + ''] = true;
    return ac;
  }, {});

  var removedValues = this._values.filter(function (val) {
    return !newDict[val + ''];
  });

  var addedValues = this._tempValues.filter(function (val) {
    return !curDict[val + ''];
  });

  this._values = this._tempValues.slice();

  this._sortValuesIfNeed(this._values);

  this.$selectlist.remove();

  if (removedValues.length > 0) {
    removedValues.forEach(function (value) {
      var item = this._itemsByValue[value + ''];
      this.emit('remove', {
        type: 'remove',
        itemData: item,
        value: value
      }, this);
    }.bind(this));
  }

  if (addedValues.length > 0) {
    addedValues.forEach(function (value) {
      var item = this._itemsByValue[value + ''];
      this.emit('remove', {
        type: 'add',
        itemData: item,
        value: value
      }, this);
    }.bind(this));
  }

  if (removedValues.length > 0 || addedValues.length > 0) {
    this.emit('change', {
      type: 'change',
      values: this.values,
      target: this
    }, this);
  }

  this.isFocus = false;
};

MMultiCheckMenu.eventHandler.modalCancel = function (event) {
  this.viewItemsByValues(this._values);
  this.isFocus = false;
};

_Core.default.install('MSelectBox'.toLowerCase(), MMultiCheckMenu);

_Core.default.install(MMultiCheckMenu);

var _default = MMultiCheckMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MCabinetItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MCabinetItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _Core = _interopRequireWildcard(require("./Core"));

require("../../css/mcabinetlist.css");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _Hanger = _interopRequireDefault(require("absol-acomp/js/Hanger"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function MCabinetItem() {
  this._content = null;
  this.$content = (0, _Core.$)('.am-cabinet-item-content', this);
  this.$body = (0, _Core.$)('.am-cabinet-item-body', this).on('predrag', this.eventHandler.bodyPredrag).on('touchstart', this.eventHandler.bodyMouseDown).on('touchend', this.eventHandler.bodyMouseUp).on('dragstart', this.eventHandler.bodyDragStart).on('dragend', this.eventHandler.bodyDragEnd).on('drag', this.eventHandler.bodyDrag);
  this.$quickmenuBtn = (0, _Core.$)('.am-cabinet-item-quick-menu-btn', this);
  this.$right = (0, _Core.$)('.am-cabinet-item-right-action-ctn', this);
  this.$drag = (0, _Core.$)('.am-cabinet-item-drag', this).on('touchstart', function () {
    if (MCabinetItem.$openingItem) {
      MCabinetItem.$openingItem.resetView();
      MCabinetItem.$openingItem = null;
    }
  });
  this.$searchInput = null;
  this._quickmenu = null;
  this.commandViewState = 0;

  this._makeQuickMenu();
}

MCabinetItem.tag = 'MCabinetItem'.toLowerCase();

MCabinetItem.render = function () {
  return (0, _Core._)({
    tag: _Board.default.tag,
    extendEvent: ['click', 'action'],
    class: 'am-cabinet-item',
    child: [{
      tag: _Hanger.default.tag,
      class: ['am-cabinet-item-body'],
      props: {
        hangOn: 10
      },
      child: [{
        class: ['am-cabinet-item-drag', _BoardTable.default.DRAG_ZONE_CLASS_NAME],
        child: '<i class="material-icons drag-icon-button">drag_indicator</i>'
      }, {
        class: ['am-cabinet-item-content']
      }, {
        class: 'am-cabinet-item-quick-menu-ctn',
        child: {
          tag: 'button',
          class: 'am-cabinet-item-quick-menu-btn',
          child: '<i class="material-icons">more_horiz</i>'
        }
      }]
    }, {
      class: 'am-cabinet-item-right-action-ctn'
    }]
  });
};

['addChild', 'removeChild', 'addChildBefore', 'addChildAfter', 'clearChild', 'findChildBefore', 'findChildAfter'].forEach(function (name) {
  MCabinetItem.prototype[name] = function () {
    this.$content[name].apply(this.$content, arguments);
  };
});

MCabinetItem.prototype._makeQuickMenu = function () {
  var self = this;
  this.quickmenuHolder = _QuickMenu.default.toggleWhenClick(this.$quickmenuBtn, {
    getAnchor: function () {
      return [3, 4, 13, 14];
    },
    getMenuProps: function () {
      return self._quickmenu && self._quickmenu.props;
    },
    onOpen: function () {
      self.resetView();
    },
    onClose: function () {},
    onSelect: function (item) {
      if (self._quickmenu.onSelect) {
        self._quickmenu.onSelect.call(this, item);
      }
    }
  });
};

MCabinetItem.prototype._makeActionBtn = function (data) {
  var btn = (0, _Core._)({
    tag: 'button',
    class: 'am-cabinet-item-action',
    on: {
      click: function (event) {
        this.resetView();
        this.emit('action', {
          type: 'action',
          originalEvent: event,
          action: data
        }, this);
      }.bind(this)
    }
  });

  if (data.text) {
    btn.addChild((0, _Core._)({
      text: data.text
    }));
  } else if (data.icon) {
    btn.addChild((0, _Core._)(data.icon));
  }

  return btn;
};

MCabinetItem.prototype.getChildren = function () {
  return this.$body.childNodes;
};

MCabinetItem.prototype.resetView = function () {
  this.$body.addStyle('left', 0 + 'px');
  this.commandViewState = 0;
  this.$quickmenuBtn.removeStyle('opacity').removeStyle('pointer-events');
};

MCabinetItem.prototype.getSearchingText = function () {
  var parts = [];

  function visit(node) {
    if (node.nodeType === 3) {
      parts.push(node.data);
    } else if (node.nodeType === 1) {
      if (node.tagName === 'BUTTON') return;

      if (node.tagName === 'INPUT') {
        parts.push(node.value);
      }

      Array.prototype.forEach.call(node.childNodes, visit);
    }
  }

  visit(this.$content);
  parts = parts.filter(function (p) {
    return !!p;
  });
  return parts.join(' ');
};

MCabinetItem.prototype.selfRemove = function () {
  var parent = this.parentElement;
  if (!parent) return;

  if (parent.hasClass('am-cabinet-list-searching-items-ctn')) {
    parent = parent.parentElement;
  }

  parent.removeChild(this);
};

MCabinetItem.property = {};
MCabinetItem.property.quickmenu = {
  set: function (value) {
    this._quickmenu = value;

    if (value) {
      this.addClass('am-has-quick-menu');
    } else {
      this.removeClass('am-has-quick-menu');
    }
  },
  get: function () {
    return this._quickmenu;
  }
};
MCabinetItem.property.rightActions = {
  set: function (value) {
    value = value || [];
    this._rightActions = value;
    this.$right.clearChild().addChild(value.map(function (data) {
      return this._makeActionBtn(data);
    }.bind(this)));
  },
  get: function () {
    return this._rightActions;
  }
};
MCabinetItem.property.draggable = {
  set: function (value) {
    if (this.parentElement && this.parentElement.classList.contains('as-board-table')) {
      console.warn("Don't set draggable after MCabinetItem attached!");
    }

    if (value) {
      this.addClass('as-board');
    } else {
      this.removeClass('as-board');
    }
  },
  get: function () {
    return this.hasClass('as-board');
  }
};
MCabinetItem.property.content = {
  set: function (value) {
    value = value || null;
    this._content = value;
    this.$content.clearChild();
    if (!value) return;

    if (value instanceof Array) {
      this.$content.addChild(value.map(function (c) {
        return (0, _Core._)(c);
      }));
    } else {
      this.$content.addChild((0, _Core._)(value));
    }
  },
  get: function () {
    return this._content;
  }
};
/***
 * @memberOf MCabinetItem#
 * @type {{}}
 */

MCabinetItem.eventHandler = {};
/**
 * @this MCabinetItem
 * @param event
 */

MCabinetItem.eventHandler.bodyMouseUp = function (event) {
  if (this._waitClick) {
    this.emit('click', event, this);
  }
};
/**
 * @this MCabinetItem
 * @param event
 */


MCabinetItem.eventHandler.bodyMouseDown = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$quickmenuBtn, event)) return;
  this._waitClick = true;
};
/**
 * @this MCabinetItem
 * @param event
 */


MCabinetItem.eventHandler.bodyPredrag = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$drag, event)) {
    event.cancel();
  }
};
/**
 * @this MCabinetItem
 * @param event
 */


MCabinetItem.eventHandler.bodyDragStart = function (event) {
  _QuickMenu.default.close(true);

  this._bodyDraging = false;
  this._rightWidth = this.$right.getBoundingClientRect().width;
  this._waitClick = false;
  if (this._rightWidth === 0) return;
  var d = event.currentPoint.sub(event.startingPoint);
  if (Math.abs(d.x) <= Math.abs(d.y)) return;

  if (this.commandViewState === 0) {
    if (d.x < 0) {
      if (MCabinetItem.$openingItem) {
        MCabinetItem.$openingItem.resetView();
      }

      MCabinetItem.$openingItem = this;
      this._bodyDraging = true;
      this._x0 = 0;
      this.commandViewState = -1;
      this.$body.addStyle('left', d.x + 'px');
    }
  } else if (this.commandViewState === -1) {
    if (d.x > 0) {
      this._bodyDraging = true;
      this.commandViewState = 0;
      this._x0 = -this._rightWidth;
      this.$body.addStyle('left', this._rightWidth - d.x + 'px');
    }
  }

  setTimeout(function () {
    this.addClass('as-dragging');
  }.bind(this), 5);
};
/**
 * @this MCabinetItem
 * @param event
 */


MCabinetItem.eventHandler.bodyDrag = function (event) {
  if (!this._bodyDraging) return;
  var d = event.currentPoint.sub(event.startingPoint);
  var x = this._x0 + d.x;
  this.$body.addStyle('left', x + 'px');

  if (-x > this._rightWidth) {
    this.$right.addStyle('width', -x + 'px');
  }

  this.$quickmenuBtn.addStyle('opacity', 1 - Math.max(0, Math.min(1, -x / this._rightWidth)) + '');
};
/**
 * @this MCabinetItem
 * @param event
 */


MCabinetItem.eventHandler.bodyDragEnd = function (event) {
  if (!this._bodyDraging) return;
  this._bodyDraging = false;
  this.removeClass('as-dragging');

  if (this.commandViewState === 0) {
    this.$right.addStyle('width', this._rightWidth + 'px');
    this.$body.addStyle('left', 0 + 'px');
    if (MCabinetItem.$openingItem === this) MCabinetItem.$openingItem = null;
    this.$quickmenuBtn.removeStyle('opacity').removeStyle('pointer-events');
  } else {
    this.$right.addStyle('width', this._rightWidth + 'px');
    this.$body.addStyle('left', -this._rightWidth + 'px');
    this.$quickmenuBtn.addStyle('opacity', 0 + '').addStyle('pointer-events', 'none');
  }

  setTimeout(function () {
    this.$right.removeStyle('width');
  }.bind(this), 110);
};

_Core.default.install(MCabinetItem);

var _default = MCabinetItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MCabinetList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MCabinetList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _Core = _interopRequireWildcard(require("./Core"));

var _search = _interopRequireWildcard(require("absol-acomp/js/list/search"));

var _MCabinetItem = _interopRequireDefault(require("./MCabinetItem"));




/***
 * @extends BoardTable
 * @constructor
 */
function MCabinetList() {
  this.on('dragitemstart', this.eventHandler.dragItemStart);
  /***
   * @type {boolean}
   * @name searching
   * @memberOf MCabinetList#
   */
}

MCabinetList.tag = 'MCabinetList'.toLowerCase();

MCabinetList.render = function () {
  return (0, _Core._)({
    tag: _BoardTable.default.tag,
    extendEvent: ['searchstart', 'searchend'],
    class: 'am-cabinet-list'
  });
};
/****
 * @memberOf MCabinetList#
 * @type {{}}
 */


MCabinetList.eventHandler = {};

MCabinetList.eventHandler.dragItemStart = function () {
  var bound = this.getBoundingClientRect();
  this.addStyle('--am-cabinet-list-bound-left', bound.left + 'px');
};

MCabinetList.prototype.getChildren = function () {
  if (this.searching) return this.$items;
  return Array.prototype.slice.call(this.childNodes);
};

MCabinetList.prototype.clearChild = function () {
  if (this.searching) {
    this.$items = [];
    this._cache = {};
    this._searchingItems = [];
    this.eventHandler.searchModify(null);
    return this;
  } else {
    while (this.firstChild) {
      this.firstChild.remove();
    }

    this._childHolders = [];
    return this;
  }
};

MCabinetList.prototype.removeChild = function (elt) {
  var idx;

  if (this.searching) {
    idx = this.$items.indexOf(elt);
    if (idx < 0) return this;
    this.$items.splice(idx, 1);

    this._searchingItems.splice(idx, 1);

    this._cache = {};
    elt.remove();
    this.eventHandler.searchModify(null);
  } else {
    _BoardTable.default.prototype.removeChild.call(this, elt);
  }

  return this;
};

MCabinetList.prototype.addChild = function (elt) {
  if (elt instanceof Array) {
    elt.forEach(function (it) {
      this.addChild(it);
    }.bind(this));
    return this;
  }

  if (this.searching) {
    this.$items.push(elt);

    this._searchingItems.push((0, _search.default)({
      text: elt.getSearchingText(),
      value: elt
    }));

    this.eventHandler.searchModify(null);
  } else {
    _BoardTable.default.prototype.addChild.call(this, elt);
  }
};

MCabinetList.prototype.addChildBefore = function (elt, bf) {
  elt.selfRemove();
  var idx;

  if (this.searching) {
    if (!bf) {
      this.$items.push(elt);

      this._searchingItems.push((0, _search.default)({
        text: elt.getSearchingText(),
        value: elt
      }));
    } else {
      idx = this.$items.indexOf(bf);

      if (idx >= 0) {
        this.$items.splice(idx, 0, elt);

        this._searchingItems.splice(idx, 0, (0, _search.default)({
          text: elt.getSearchingText(),
          value: elt
        }));
      } else {
        throw new Error("Failed to execute 'addChildAfter' on 'Node': The node before which the new node is to be inserted is not a child of this node.");
      }
    }

    this.eventHandler.searchModify(null);
  } else {
    _BoardTable.default.prototype.addChildBefore.call(this, elt, bf);
  }
};

MCabinetList.prototype.addChildAfter = function (elt, at) {
  elt.selfRemove();
  var idx;

  if (this.searching) {
    if (!at) {
      this.$items.unshift(elt);

      this._searchingItems.unshift((0, _search.default)({
        text: elt.getSearchingText(),
        value: elt
      }));
    } else {
      idx = this.$items.indexOf(at);

      if (idx >= 0) {
        this.$items.splice(idx + 1, 0, elt);

        this._searchingItems.splice(idx + 1, 0, (0, _search.default)({
          text: elt.getSearchingText(),
          value: elt
        }));
      } else {
        throw new Error("Failed to execute 'addChildAfter' on 'Node': The node before which the new node is to be inserted is not a child of this node.");
      }
    }

    this.eventHandler.searchModify(null);
  } else {
    _BoardTable.default.prototype.addChildBefore.call(this, elt, at);
  }
};

MCabinetList.prototype.findChildBefore = function (elt) {
  if (this.searching) {
    return this.$items[this.$items.indexOf(elt) - 1] || null;
  } else {
    return _BoardTable.default.prototype.findChildBefore.call(this, elt);
  }
};

MCabinetList.prototype.findChildAfter = function (elt) {
  if (this.searching) {
    return this.$items[this.$items.indexOf(elt) + 1] || null;
  } else {
    return _BoardTable.default.prototype.findChildBefore.call(this, elt);
  }
};

MCabinetList.property = {};
MCabinetList.property.draggable = {
  set: function (value) {
    if (value) {
      this.addClass('am-draggable');
    } else {
      this.removeClass('am-draggable');
    }
  },
  get: function () {
    return this.hasClass('am-draggable');
  }
};
/***
 * @this MCabinetList
 * @param searchInputElt
 */

MCabinetList.prototype.attachSearchInput = function (searchInputElt) {
  if (this.$searchInput) {
    this.$searchInput.off('stoptyping', this.eventHandler.searchModify);
  }

  this.$searchInput = searchInputElt;

  if (this.$searchInput) {
    if (this.$searchInput.$list) {
      this.$searchInput.off('stoptyping', this.$searchInput.$list.eventHandler.searchModify);
    }

    this.$searchInput.$list = this;
    this.$searchInput.on('stoptyping', this.eventHandler.searchModify);
  }
};
/***
 * @this MCabinetList
 * @param event
 */


MCabinetList.eventHandler.searchModify = function (event) {
  if (_MCabinetItem.default.$openingItem) {
    _MCabinetItem.default.$openingItem.resetView();

    _MCabinetItem.default.$openingItem = null;
  }

  var query = this.$searchInput.value;
  query = query.trim();

  if (query.length === 0 && this.hasClass('am-searching')) {
    this.$searchingItemsCtn.remove(); //pure add

    this._childHolders = [];
    this.$items.forEach(function (e) {
      this.appendChild(e);

      if (e.draggable) {
        this._childHolders.push({
          elt: e
        });
      }
    }.bind(this));
    this.removeClass('am-searching');
    this.emit('searchend', {
      type: 'searchend',
      target: this
    }, this);
  } else if (!this.hasClass('am-searching') && query.length > 0) {
    this.$searchingItemsCtn = this.$searchingItemsCtn || (0, _Core._)('.am-cabinet-list-searching-items-ctn');
    this.cache = {};
    this._searchingItems = Array.prototype.map.call(this.childNodes, function (elt) {
      return (0, _search.default)({
        text: elt.getSearchingText(),
        value: elt
      });
    });
    this.$items = Array.prototype.slice.call(this.childNodes);
    this.addClass('am-searching'); //dom clear

    this.innerHTML = '';
    this._childHolders = [];
    this.appendChild(this.$searchingItemsCtn);
    this.emit('searchstart', {
      type: 'searchstart',
      target: this
    }, this);
  }

  if (query.length === 0) return;
  var resultItems = this.cache[query] || (0, _search.searchListByText)(query, this._searchingItems);
  var resultEltList = resultItems.map(function (it) {
    return it.value;
  });
  this.$searchingItemsCtn.clearChild().addChild(resultEltList);
};

MCabinetList.prototype.addInputSearch = MCabinetList.prototype.attachSearchInput;
MCabinetList.prototype.addSearchBox = MCabinetList.prototype.attachSearchInput;
MCabinetList.property.searching = {
  get: function () {
    return this.hasClass('am-searching');
  }
};

_Core.default.install(MCabinetList);

var _default = MCabinetList;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MCabinetTreeList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MCabinetTreeList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("./Core"));

var _MCabinetList = _interopRequireDefault(require("./MCabinetList"));

var _Searcher = _interopRequireDefault(require("absol-acomp/js/Searcher"));

var _search = require("absol-acomp/js/list/search");




/***
 * @extends AElement
 * @constructor
 */
function MCabinetTreeList() {
  /***
   *
   * @type {null|SearchTextInput}
   */
  this.$searchInput = null;
  this._searchCache = {};
}

MCabinetTreeList.tag = 'MCabinetTreeList'.toLowerCase();

MCabinetTreeList.render = function () {
  return (0, _Core._)({
    class: 'am-cabinet-tree-list',
    child: []
  });
};

MCabinetTreeList.prototype.attachSearchInput = _MCabinetList.default.prototype.attachSearchInput;
MCabinetTreeList.prototype.addInputSearch = MCabinetTreeList.prototype.attachSearchInput;
MCabinetTreeList.prototype.addSearchBox = MCabinetTreeList.prototype.attachSearchInput;
/***
 * @type {{}}
 * @memberOf MCabinetTreeList#
 */

MCabinetTreeList.eventHandler = {};

MCabinetTreeList.eventHandler.searchModify = function (event) {
  var query = this.$searchInput.value;
  query = query.trim();

  if (this.$orderingNodes) {
    this.$orderingNodes.forEach(function (nodeElt) {
      nodeElt.removeClass('am-in-search-result').removeStyle('order');
    });

    if (this.$orderingNodes[0]) {
      this.$orderingNodes[0].removeClass('am-first-result');
    }
  }

  this.$orderingNodes = null;

  if (this.hasClass('am-searching') && query.length === 0) {
    this.removeClass('am-searching');
    return;
  } else if (!this.hasClass('am-searching') && query.length > 0) {
    this._searchCache = {};
    this.addClass('am-searching');
  }

  this._searchCache[' all '] = this._searchCache[' all '] || Array.prototype.map.call(this.childNodes, function (tree) {
    return tree.getSearchingItem();
  });
  this._searchCache[query] = this._searchCache[query] || (0, _search.searchTreeListByText)(query, this._searchCache[' all ']);
  var orderingNodes = [];

  this._searchCache[query].forEach(function visit(item, i) {
    item.value.addClass('am-in-search-result').addStyle('order', i);
    orderingNodes.push(item.value);
    if (item.items && item.items.length > 0) item.items.forEach(visit);
  });

  if (orderingNodes[0]) {
    orderingNodes[0].addClass('am-first-result');
  }

  this.$orderingNodes = orderingNodes;
};

_Core.default.install(MCabinetTreeList);

var _default = MCabinetTreeList;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MCabinetTreeNode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MCabinetTreeNode.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("./Core"));

require("../../css/mcabinetlist.css");

require("../../css/mcabinettreelist.css");

var _MCabinetItem = _interopRequireDefault(require("./MCabinetItem"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));




/***
 * @extends AElement
 * @constructor
 */
function MCabinetTreeNode() {
  this._level = 0;
  this.$content = (0, _Core.$)('.am-cabinet-tree-node-content', this);
  this.$body = (0, _Core.$)('.am-cabinet-tree-node-body', this);
  this.$toggleCtn = (0, _Core.$)('.am-cabinet-tree-node-toggle-ctn', this);
  this.addEventListener('click', this.eventHandler.click);
  this.$quickmenuBtn = (0, _Core.$)('.am-cabinet-item-quick-menu-btn', this);

  this._makeQuickMenu();
  /***
   * @type {number}
   * @name level
   * @memberOf MCabinetTreeNode#
   */

}

MCabinetTreeNode.tag = 'MCabinetTreeNode'.toLowerCase();

MCabinetTreeNode.render = function () {
  return (0, _Core._)({
    extendEvent: ['click', 'toggle'],
    class: 'am-cabinet-tree-node',
    child: [{
      class: 'am-cabinet-tree-node-body',
      child: [{
        class: 'am-cabinet-tree-node-toggle-ctn',
        child: ['span.mdi.mdi-chevron-right']
      }, {
        class: 'am-cabinet-tree-node-content'
      }, {
        class: 'am-cabinet-tree-node-quick-menu-ctn',
        child: {
          tag: 'button',
          class: 'am-cabinet-item-quick-menu-btn',
          child: '<i class="material-icons">more_horiz</i>'
        }
      }]
    }]
  });
};

MCabinetTreeNode.prototype._makeQuickMenu = _MCabinetItem.default.prototype._makeQuickMenu;
MCabinetTreeNode.prototype.getSearchingText = _MCabinetItem.default.prototype.getSearchingText;
MCabinetTreeNode.prototype.resetView = _noop.default;
MCabinetTreeNode.property = {};
MCabinetTreeNode.property.content = _MCabinetItem.default.property.content;
MCabinetTreeNode.property.quickmenu = _MCabinetItem.default.property.quickmenu;
MCabinetTreeNode.property.level = {
  set: function (value) {
    this._level = value;
    this.$body.addStyle('--level-padding', value * 1.5 + 'em');
  },
  get: function () {
    return this._level;
  }
};
/***
 * @memberOf MCabinetTreeNode#
 * @type {{}}
 */

MCabinetTreeNode.eventHandler = {};
/***
 * @this MCabinetTreeNode
 * @param event
 */

MCabinetTreeNode.eventHandler.click = function (event) {
  var c = event.target;
 
  while (c) {
    if (c === this) break;

    if (c === this.$toggleCtn) {
      this.emit('toggle', {
        type: 'toggle',
        target: this,
        originalEvent: event
      }, this);
      this.opened = !this.opened;
      return;
    }

    if (c.tagName === 'INPUT') return;
    if (c.tagName === 'BUTTON') return;
    if (typeof c.checked === "boolean") return;
    if (typeof c.value !== 'undefined') return;
    if (c.isInput) return;
    c = c.parentElement;
  }

  this.emit('click', {
    type: 'click',
    target: this,
    originalEvent: event
  }, this);
};

_Core.default.install(MCabinetTreeNode);

var _default = MCabinetTreeNode;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/MCabinetTree.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/MCabinetTree.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("./Core"));

var _MCabinetTreeNode = _interopRequireDefault(require("./MCabinetTreeNode"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _search = _interopRequireDefault(require("absol-acomp/js/list/search"));




/***
 * @extends AElement
 * @constructor
 */
function MCabinetTree() {
  this.$node = (0, _Core.$)(_MCabinetTreeNode.default.tag, this).on('toggle', this.eventHandler.toggle).on('click', this.eventHandler.click);
  this.$children = (0, _Core.$)('.am-cabinet-tree-children', this);

  _OOP.default.drillProperty(this, this.$node, ['content', 'quickmenu']);
  /***
   * @type {number}
   * @name level
   * @memberOf MCabinetTree#
   */

}

MCabinetTree.tag = 'MCabinetTree'.toLowerCase();

MCabinetTree.render = function () {
  return (0, _Core._)({
    extendEvent: ['click'],
    class: 'am-cabinet-tree',
    child: [{
      tag: _MCabinetTreeNode.default.tag
    }, {
      class: 'am-cabinet-tree-children'
    }]
  });
};

MCabinetTree.prototype._updateChildClass = function () {
  if (this.$children.childNodes.length > 0) {
    this.addClass('am-has-children');
  } else {
    this.removeClass('am-has-children');
  }
};

MCabinetTree.prototype.addChild = function (child) {
  if (child && child.forEach) {
    child.forEach(function (c) {
      this.addChild(c);
    }.bind(this));
    return this;
  }

  this.$children.addChild(child);
  child.level = this.level + 1;

  this._updateChildClass();
};

MCabinetTree.prototype.getSearchingItem = function () {
  var text = this.$node.getSearchingText();
  var value = this;
  var items = Array.prototype.map.call(this.$children.childNodes, function (subTree) {
    return subTree.getSearchingItem();
  });
  var res = {
    text: text,
    value: value
  };
  if (items.length > 0) res.items = items;
  return (0, _search.default)(res);
};

MCabinetTree.property = {};
MCabinetTree.property.level = {
  set: function (value) {
    this.$node.level = value;
    Array.prototype.forEach.call(this.$children.childNodes, function (treeElt) {
      treeElt.level = value + 1;
    });
  },
  get: function () {
    return this.$node.level;
  }
};
MCabinetTree.property.opened = {
  set: function (value) {
    if (value) {
      this.addClass('am-opened');
    } else {
      this.removeClass('am-opened');
    }
  },
  get: function () {
    return this.hasClass('am-opened');
  }
};
/***
 * @memberOf MCabinetTree#
 * @type {{}}
 */

MCabinetTree.eventHandler = {};

MCabinetTree.eventHandler.toggle = function (event) {
  this.opened = !this.opened;
};

MCabinetTree.eventHandler.click = function (event) {
  this.emit('click', event, this);
};

_Core.default.install(MCabinetTree);

var _default = MCabinetTree;
exports.default = _default;
};

moduleFactories["node_modules/absol-mobile/js/dom/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/js/dom/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = install;

var _MLeftNavigator = _interopRequireDefault(require("./MLeftNavigator"));

var _MNavigatorMenu = _interopRequireDefault(require("./MNavigatorMenu"));

var _MBottomTabbar = _interopRequireDefault(require("./MBottomTabbar"));

var _MTinyProfileBlock = _interopRequireDefault(require("./MTinyProfileBlock"));

var _MMatMenuButton = _interopRequireDefault(require("./MMatMenuButton"));

var _MMatMenuItem = _interopRequireDefault(require("./MMatMenuItem"));

var _MMatMenu = _interopRequireDefault(require("./MMatMenu"));

var _MHeaderBar = _interopRequireDefault(require("./MHeaderBar"));

var _MConversation = _interopRequireDefault(require("./MConversation"));

var _MMessageInput = _interopRequireDefault(require("./MMessageInput"));

var _MSelectListItem = _interopRequireDefault(require("./MSelectListItem"));

var _MSelectList = _interopRequireDefault(require("./MSelectList"));

var _MSelectMenu = _interopRequireDefault(require("./MSelectMenu"));

var _MSelectTreeMenu = _interopRequireDefault(require("./MSelectTreeMenu"));

var _MSelectBox = _interopRequireDefault(require("./MSelectBox"));

var _MBlinkModal = _interopRequireDefault(require("./MBlinkModal"));

var _MListModal = _interopRequireDefault(require("./MListModal"));

var _MTreeModal = _interopRequireDefault(require("./MTreeModal"));

var _MHSnapScroller = _interopRequireDefault(require("./MHSnapScroller"));

var _MChecklistModal = _interopRequireDefault(require("./MChecklistModal"));

var _MChecklistItem = _interopRequireDefault(require("./MChecklistItem"));

var _MMultiCheckMenu = _interopRequireDefault(require("./MMultiCheckMenu"));

var _MCabinetList = _interopRequireDefault(require("./MCabinetList"));

var _MCabinetItem = _interopRequireDefault(require("./MCabinetItem"));

var _MCabinetTreeList = _interopRequireDefault(require("./MCabinetTreeList"));

var _MCabinetTree = _interopRequireDefault(require("./MCabinetTree"));


function install(core) {
  core.install([_MMessageInput.default, _MNavigatorMenu.default, _MBottomTabbar.default, _MLeftNavigator.default, _MTinyProfileBlock.default, _MMatMenuButton.default, _MMatMenuItem.default, _MMatMenu.default, _MHeaderBar.default, _MConversation.default, _MSelectListItem.default, _MSelectList.default, _MSelectMenu.default, _MSelectTreeMenu.default, _MSelectBox.default, _MBlinkModal.default, _MListModal.default, _MTreeModal.default, _MHSnapScroller.default, _MChecklistItem.default, _MChecklistModal.default, _MMultiCheckMenu.default, _MCabinetItem.default, _MCabinetList.default, _MCabinetTreeList.default, _MCabinetTree.default]);
}
};

moduleFactories["node_modules/absol-mobile/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-mobile/dev.js ***/
"use strict";

require("absol/src/absol");

require("absol-acomp/dev");

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _MTabApplication = _interopRequireDefault(require("./js/mobile_app/MTabApplication"));

var _MTabActivity = _interopRequireDefault(require("./js/mobile_app/MTabActivity"));

var _MActivity = _interopRequireDefault(require("./js/mobile_app/MActivity"));

var _install = _interopRequireDefault(require("./js/dom/install"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


//todo
(0, _install.default)(absol.coreDom);
Object.assign(absol, {
  MTabApplication: _MTabApplication.default,
  MTabActivity: _MTabActivity.default,
  MActivity: _MActivity.default
});
if (_BrowserDetector.default.isMobile) _Dom.default.documentReady.then(function () {
  document.body.classList.add('am-mobile-theme');

  var bodySizeHookElt = absol._('attachhook').on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdateSize();
  });

  bodySizeHookElt.requestUpdateSize = function () {
    var bodyBound = document.body.getBoundingClientRect();
    document.body.style.setProperty('--body-width', bodyBound.width + 'px');
    document.body.style.setProperty('--body-height', bodyBound.height + 'px');
  };

  document.body.appendChild(bodySizeHookElt);
});
};

moduleFactories["node_modules/absol-svg/js/svg/Core.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/svg/Core.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$$ = exports.$ = exports._ = void 0;

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));


var Core = new _Svg.default();
var _ = Core._;
exports._ = _;
var $ = Core.$;
exports.$ = $;
var $$ = Core.$$;
exports.$$ = $$;
var _default = Core;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/controller/Turtle.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/controller/Turtle.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));


/**
 * @typedef TurtleCommand
 * @property {String} cmd
 * @property {String} action
 * @property {Number[]} args
 * @property {Vec2} dest
 * @property {Vec2} tangent
 */

/***
 *
 * @constructor
 */
function Turtle() {
  /**
   * @type {Array<TurtleCommand>}
   */
  this._commands = [];
  /**
   * @type {Vec2}
   */

  this._pos = new _Vec.default(0, 0);
  /**
   * @type {Vec2}
   */

  this._startPos = this._pos;
  /**
   * @type {Vec2}
   */

  this._tangent = new _Vec.default(0, 0);
}
/**
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.moveBy = function (dx, dy) {
  this._tangent = new _Vec.default(dx, dy);
  this._pos = this._pos.add(this._tangent);
  this._startPos = this._pos;

  this._commands.push({
    cmd: 'm',
    action: 'moveBy',
    args: [dx, dy],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} x
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.moveTo = function (x, y) {
  this._tangent = this._pos;
  this._pos = new _Vec.default(x, y);
  this._tangent = this._pos.sub(this._tangent);
  this._startPos = this._pos;

  this._commands.push({
    cmd: 'M',
    action: 'moveTo',
    args: [x, y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};

Turtle.prototype.moveForward = function (length) {
  var dV = this._tangent.normalized().mult(length);

  this._pos = this._pos.add(dV);
  this._startPos = this._pos;

  this._commands.push({
    cmd: 'm',
    action: 'moveTo',
    args: [dV.x, dV.y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};

Turtle.prototype.lineForward = function (length) {
  var dV = this._tangent.normalized().mult(length);

  this._pos = this._pos.add(dV);
  this._startPos = this._pos;

  this._commands.push({
    cmd: 'l',
    action: 'moveTo',
    args: [dV.x, dV.y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/***
 *
 * @param {Number} angle - degree
 *  @returns {this}
 */


Turtle.prototype.rotateDirTo = function (angle) {
  this._tangent = _Vec.default.fromDirection(angle * Math.PI / 180);
  return this;
};
/***
 *
 * @param {Number} dAngle
 * @returns {this}
 */


Turtle.prototype.rotateDirBy = function (dAngle) {
  this._tangent = this._tangent.rotate(dAngle * Math.PI / 180);
  return this;
};
/**
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.lineBy = function (dx, dy) {
  this._tangent = new _Vec.default(x, y);
  this._pos = this._pos.add(this._tangent);

  this._commands.push({
    cmd: 'l',
    action: 'lineBy',
    args: [dx, dy],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} x
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.lineTo = function (x, y) {
  this._tangent = this._pos;
  this._pos = new _Vec.default(x, y);
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'L',
    action: 'lineTo',
    args: [x, y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.lineBy = function (dx, dy) {
  this._tangent = new _Vec.default(dx, dy);
  this._pos = this._pos.add(this._tangent);

  this._commands.push({
    cmd: 'l',
    action: 'lineBy',
    args: [dx, dy],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} x
 * @returns {this}
 */


Turtle.prototype.hLineTo = function (x) {
  this._tangent = this._pos;
  this._pos = new _Vec.default(x, this._pos.y);
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'H',
    action: 'hLineTo',
    args: [x],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} x
 * @returns {this}
 */


Turtle.prototype.hLineBy = function (x) {
  this._tangent = new _Vec.default(x, 0);
  this._pos = this._pos.add(this._tangent);

  this._commands.push({
    cmd: 'h',
    action: 'hLineBy',
    args: [x],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.vLineTo = function (y) {
  this._tangent = this._pos;
  this._pos = new _Vec.default(this._pos.x, y);
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'V',
    action: 'vLineTo',
    args: [y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.vLineBy = function (y) {
  this._tangent = new _Vec.default(0, y);
  this._pos = this._pos.add(this._tangent);

  this._commands.push({
    cmd: 'v',
    action: 'vLineBy',
    args: [y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} c1x
 * @param {Number} c1y
 * @param {Number} c2x
 * @param {Number} c2y
 * @param {Number} x
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.cubicBezierTo = function (c1x, c1y, c2x, c2y, x, y) {
  this._tangent = new _Vec.default(c2x, c2y);
  this._pos = new _Vec.default(x, y);
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'C',
    action: 'cubicBezierTo',
    args: [c1x, c1y, c2x, c2y, x, y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} c1dx
 * @param {Number} c1dy
 * @param {Number} c2dx
 * @param {Number} c2dy
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.cubicBezierBy = function (c1dx, c1dy, c2dx, c2dy, dx, dy) {
  this._tangent = this._pos.add(new _Vec.default(c2dx, c2dy));
  this._pos = this._pos.add(new _Vec.default(dx, dy));
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'c',
    action: 'cubicBezierBy',
    args: [c1dx, c1dy, c2dx, c2dy, dx, dy],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} c2x
 * @param {Number} c2y
 * @param {Number} x
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.smoothCubicBezierTo = function (c2x, c2y, x, y) {
  this._tangent = new _Vec.default(c2x, c2y);
  this._pos = new _Vec.default(x, y);
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'S',
    action: 'smoothCubicBezierTo',
    args: [c2x, c2y, x, y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} c2dx
 * @param {Number} c2dy
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.smoothCubicBezierBy = function (c2dx, c2dy, dx, dy) {
  this._tangent = this._pos.add(new _Vec.default(c2dx, c2dy));
  this._pos = this._pos.add(new _Vec.default(dx, dy));
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 's',
    action: 'smoothCubicBezierBy',
    args: [c2dx, c2dy, dx, dy],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} cx
 * @param {Number} cy
 * @param {Number} x
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.quadraticBezierTo = function (cx, cy, x, y) {
  this._tangent = new _Vec.default(cx, cy);
  this._pos = new _Vec.default(x, y);
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'Q',
    action: 'quadraticBezierTo',
    args: [cx, cy, x, y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} cdx
 * @param {Number} cdy
 * @param {Number} cdx
 * @param {Number} cdy
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.quadraticBezierBy = function (cdx, cdy, dx, dy) {
  this._tangent = this._pos.add(new _Vec.default(cdx, cdy));
  this._pos = this._pos.add(new _Vec.default(dx, dy));
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'q',
    action: 'quadraticBezierBy',
    args: [cdx, cdy, dx, dy],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} cx
 * @param {Number} cy
 * @param {Number} x
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.smoothQuadraticBezierTo = function (cx, cy, x, y) {
  this._tangent = new _Vec.default(cx, cy);
  this._pos = new _Vec.default(x, y);
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'T',
    action: 'smoothQuadraticBezierTo',
    args: [cx, cy, x, y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @param {Number} cdx
 * @param {Number} cdy
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.smoothQuadraticBezierBy = function (cdx, cdy, dx, dy) {
  this._tangent = this._pos.add(new Vec(cdx, cdy));
  this._pos = this._pos.add(new _Vec.default(dx, dy));
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 't',
    action: 'smoothQuadraticBezierBy',
    args: [cdx, cdy, dx, dy],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/***
 *
 * @param {Number} rx
 * @param {Number} ry
 * @param {Number} angle
 * @param {Number} large
 * @param {Number} sweep
 * @param {Number} x
 * @param {Number} y
 * @returns {this}
 */


Turtle.prototype.arcTo = function (rx, ry, angle, large, sweep, x, y) {
  this._tangent = this._pos;
  this._pos = new _Vec.default(x, y);

  var AB = this._pos.sub(this._tangent); //in ellipse


  var AB_inE = AB.rotate(-angle / 180 * Math.PI); //in circle

  var AB_inC = new _Vec.default(AB_inE.x / rx, AB_inE.y / ry);
  var AH_inC;
  var HO_length_inC;
  var AH_length_inC;
  var HO_inC;
  var BO_inC;
  var tangent_inC;
  var tangent_inE;
  AH_inC = AB_inC.div(2);
  AH_length_inC = AH_inC.abs();
  HO_length_inC = Math.sqrt(1 - AH_length_inC * AH_length_inC);

  if (!sweep != !large) {
    HO_inC = AB_inC.rotate90().normalized().mult(HO_length_inC);
    BO_inC = AH_inC.inv().add(HO_inC);
    tangent_inC = BO_inC.rotate90().inv();
  } else {
    HO_inC = AB_inC.rotate90().inv().normalized().mult(HO_length_inC); //ok

    BO_inC = AH_inC.inv().add(HO_inC);
    tangent_inC = BO_inC.rotate90();
  }

  if (large) tangent_inC = tangent_inC.inv();
  tangent_inE = new _Vec.default(tangent_inC.x * rx, tangent_inC.y * ry);
  this._tangent = tangent_inE.rotate(angle / 180 * Math.PI);

  this._commands.push({
    cmd: 'A',
    action: 'lineTo',
    args: [rx, ry, angle, large, sweep, x, y],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/***
 *
 * @param {Number} rx
 * @param {Number} ry
 * @param {Number} angle
 * @param {Number} large
 * @param {Number} sweep
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.arcBy = function (rx, ry, angle, large, sweep, dx, dy) {
  //todo: wrong_tangent
  this._tangent = new _Vec.default(dx, dy);
  this._pos = this._pos.add(this._tangent);

  this._commands.push({
    cmd: 'a',
    action: 'arcBy',
    args: [rx, ry, angle, large, sweep, dx, dy],
    dest: this._pos,
    tangent: this._tangent
  });

  return this;
};
/**
 * @returns {this}
 */


Turtle.prototype.closePath = function () {
  this._tangent = this._pos;
  this._pos = this._startPos;
  this._tangent = this._pos.sub(this._tangent);

  this._commands.push({
    cmd: 'z',
    action: 'closePath',
    args: [],
    dest: this._pos
  });

  return this;
};
/**
 * @param {Number} dx
 * @param {Number} dy
 * @returns {this}
 */


Turtle.prototype.translate = function (dx, dy) {
  var command;
  var deltaVec = new _Vec.default(dx, dy);

  for (var i = 0; i < this._commands.length; ++i) {
    command = this._commands[i];
    command.dest = command.dest.add(deltaVec);

    switch (command.cmd) {
      case 'M':
      case 'L':
        command.args[0] = command.dest.x;
        command.args[1] = command.dest.y;
        break;

      case 'H':
        command.args[0] = command.dest.x;
        break;

      case 'V':
        command.args[0] = command.dest.y;
        break;

      case 'C':
        command.args[0] += dx;
        command.args[1] += dy;
        command.args[2] += dx;
        command.args[3] += dy;
        command.args[4] = command.dest.x;
        command.args[5] = command.dest.y;
        break;

      case 'Q':
        command.args[0] += dx;
        command.args[1] += dy;
        command.args[3] = command.dest.x;
        command.args[4] = command.dest.y;
        break;

      case 'A':
        command.args[5] = command.dest.x;
        command.args[6] = command.dest.y;
        break;
    }
  }

  return this;
};
/**
 * @returns {String}
 */


Turtle.prototype.getPath = function () {
  return this._commands.map(function (command) {
    return command.cmd + ' ' + command.args.join(',');
  }).join(' ');
};
/***
 *
 * @returns {this}
 */


Turtle.prototype.reset = function () {
  this._commands = [];
  this._pos = new _Vec.default(0, 0);
  this._startPos = this._pos;
  this._tangent = new _Vec.default(0, 0);
  return this;
};

Turtle.prototype.clone = function () {
  var res = new Turtle();

  res._commands.push.apply(res._commands, this._commands);

  res._pos = this._pos.copy();
  res._startPos = this._startPos.copy();
  res._tangent = this._tangent.copy();
  return res;
};

var _default = Turtle;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/svg/Shape.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/svg/Shape.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireDefault(require("./Core"));

var _AElementNS = _interopRequireDefault(require("absol/src/HTML5/AElementNS"));

var _Turtle = _interopRequireDefault(require("../controller/Turtle"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends {AElementNS}
 * @constructor
 */

function Shape() {
  this._turtle = new _Turtle.default();
}

Shape.tag = 'shape';

Shape.render = function () {
  return _('path');
};
/***
 *
 * @return {Shape}
 */


Shape.prototype.begin = function () {
  this._turtle.reset();

  return this;
};
/***
 *
 * @return {Shape}
 */


Shape.prototype.end = function () {
  this.attr('d', this._turtle.getPath());
  return this;
};
/***
 *
 * @param {Number} angle - degree
 *  @returns {Shape}
 */


Shape.prototype.rotateDirTo = function (angle) {
  this._turtle.rotateDirTo(angle);

  return this;
};
/***
 *
 * @param {Number} dAngle
 * @returns {Shape}
 */


Shape.prototype.rotateDirBy = function (dAngle) {
  this._turtle.rotateDirBy(dAngle);

  return this;
};
/***
 *
 * @param {Number} x
 * @param {Number} y
 * @return {Shape}
 */


Shape.prototype.moveTo = function (x, y) {
  this._turtle.moveTo(x, y);

  return this;
};
/***
 *
 * @param {Number} dx
 * @param {Number} dy
 * @return {Shape}
 */


Shape.prototype.moveBy = function (dx, dy) {
  this._turtle.moveBy(dx, dy);

  return this;
};
/***
 *
 * @return {Shape}
 */


Shape.prototype.closePath = function () {
  this._turtle.closePath();

  return this;
};
/***
 *
 * @param {Number} x
 * @param {Number} y
 * @return {Shape}
 */


Shape.prototype.lineTo = function (x, y) {
  this._turtle.lineTo(x, y);

  return this;
};
/***
 *
 * @param {Number} dx
 * @param {Number} dy
 * @return {Shape}
 */


Shape.prototype.lineBy = function (dx, dy) {
  this._turtle.lineBy(dx, dy);

  return this;
};
/***
 *
 * @param {Number} x
 * @return {Shape}
 */


Shape.prototype.hLineTo = function (x) {
  this._turtle.hLineTo(x);

  return this;
};
/***
 *
 * @param {Number} dx
 * @return {Shape}
 */


Shape.prototype.hLineBy = function (dx) {
  this._turtle.hLineBy(x);

  return this;
};
/***
 *
 * @param {Number} y
 * @return {Shape}
 */


Shape.prototype.vLineTo = function (y) {
  this._turtle.vLineTo(y);

  return this;
};
/***
 *
 * @param {Number} dy
 * @return {Shape}
 */


Shape.prototype.vLineBy = function (dy) {
  this._turtle.vLineBy(dy);

  return this;
};
/**
 * @param {Number} c1x
 * @param {Number} c1y
 * @param {Number} c2x
 * @param {Number} c2y
 * @param {Number} x
 * @param {Number} y
 * @returns {Shape}
 */


Shape.prototype.cubicBezierTo = function (c1x, c1y, c2x, c2y, x, y) {
  this._turtle.cubicBezierTo(c1x, c1y, c2x, c2y, x, y);

  return this;
};
/**
 * @param {Number} c1dx
 * @param {Number} c1dy
 * @param {Number} c2dx
 * @param {Number} c2dy
 * @param {Number} dx
 * @param {Number} dy
 * @returns {Shape}
 */


Shape.prototype.cubicBezierBy = function (c1dx, c1dy, c2dx, c2dy, dx, dy) {
  this._turtle.cubicBezierBy(c1dx, c1dy, c2dx, c2dy, dx, dy);

  return this;
};
/**
 * @param {Number} c2x
 * @param {Number} c2y
 * @param {Number} x
 * @param {Number} y
 * @returns {Shape}
 */


Shape.prototype.smoothCubicBezierTo = function (c2x, c2y, x, y) {
  this._turtle.smoothCubicBezierTo(c2x, c2y, x, y);

  return this;
};
/**
 * @param {Number} c2dx
 * @param {Number} c2dy
 * @param {Number} dx
 * @param {Number} dy
 * @returns {Shape}
 */


Shape.prototype.smoothCubicBezierBy = function (c2dx, c2dy, dx, dy) {
  this._turtle.smoothCubicBezierBy(c2dx, c2dy, dx, dy);

  return this;
};
/**
 * @param {Number} cx
 * @param {Number} cy
 * @param {Number} x
 * @param {Number} y
 * @returns {Shape}
 */


Shape.prototype.quadraticBezierTo = function (cx, cy, x, y) {
  this._turtle.quadraticBezierTo(cx, cy, x, y);

  return this;
};
/**
 * @param {Number} cdx
 * @param {Number} cdy
 * @param {Number} cdx
 * @param {Number} cdy
 * @param {Number} dx
 * @param {Number} dy
 * @returns {Shape}
 */


Shape.prototype.quadraticBezierBy = function (cdx, cdy, dx, dy) {
  this._turtle.quadraticBezierBy(cdx, cdy, dx, dy);

  return this;
};
/**
 * @param {Number} cx
 * @param {Number} cy
 * @param {Number} x
 * @param {Number} y
 * @returns {Shape}
 */


Shape.prototype.smoothQuadraticBezierTo = function (cx, cy, x, y) {
  this._turtle.smoothQuadraticBezierTo(cx, cy, x, y);

  return this;
};
/**
 * @param {Number} cdx
 * @param {Number} cdy
 * @param {Number} dx
 * @param {Number} dy
 * @returns {Shape}
 */


Shape.prototype.smoothQuadraticBezierBy = function (cdx, cdy, dx, dy) {
  this._turtle.smoothQuadraticBezierBy(cdx, cdy, dx, dy);

  return this;
};
/***
 *
 * @param {Number} x
 * @param {Number} y
 * @param {Number} rx
 * @param {Number} ry
 * @param {Number} lf
 * @param {Number} sf
 * @param {Number} xRotate
 * @return {Shape}
 */


Shape.prototype.arcTo = function (x, y, rx, ry, lf, sf, xRotate) {
  ry = ry || rx;
  lf = lf || 0;
  sf = sf || 0;
  xRotate = xRotate || 0;

  this._turtle.arcTo(rx, ry, xRotate, lf, sf, x, y);

  return this;
};
/***
 *
 * @param {Number} dx
 * @param {Number} yd
 * @param {Number} rx
 * @param {Number} ry
 * @param {Number} lf
 * @param {Number} sf
 * @param {Number} xRotate
 * @return {Shape}
 */


Shape.prototype.arcBy = function (dx, yd, rx, ry, lf, sf, xRotate) {
  ry = ry || rx;
  lf = lf || 0;
  sf = sf || 0;
  xRotate = xRotate || 0;

  this._turtle.arcBy(rx, ry, xRotate, lf, sf, dx, yd);

  return this;
};
/***
 *
 * @param {Number} x
 * @param {Number} y
 * @param {Number} x0
 * @param {Number} y0
 * @param {Number} x1
 * @param {Number} y1
 * @return {Shape}
 */


Shape.prototype.curveTo = function (x, y, x0, y0, x1, y1) {
  this._turtle.cubicBezierTo(x0, y0, x1, y1, x, y);

  return this;
};

_Core.default.install(Shape);

var _default = Shape;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/controller/CCanvasBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/controller/CCanvasBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {SvgCanvas} $svg
 * @constructor
 */
function CCanvasBox($svg) {
  this.$svg = $svg;
  this._width = 0;
  this._height = 0;
  this.width = 0;
  this.height = 0;
}
/***
 *
 * @param {number} width
 * @param {number} height
 */


CCanvasBox.prototype.setSize = function (width, height) {
  this.$svg.attr('width', width + '');
  this.$svg.attr('height', height + '');
  this.$svg.attr('viewBox', [-0.5, -0.5, width, height].join(' '));
  this._width = width;
  this._height = height;
};

Object.defineProperty(CCanvasBox.prototype, 'width', {
  /***
   *
   * @param {Number} width
   */
  set: function (width) {
    this.setSize(width, this._height);
  },

  /***
   *
   * @return {number}
   */
  get: function () {
    return this._width;
  }
});
Object.defineProperty(CCanvasBox.prototype, 'height', {
  /***
   *
   * @param {Number} height
   */
  set: function (height) {
    this.setSize(this._width, height);
  },

  /***
   *
   * @return {number}
   */
  get: function () {
    return this._height;
  }
});
Object.defineProperty(CCanvasBox.prototype, 'size', {
  /***
   *
   * @param {{width: number, height:number}} size
   */
  set: function (size) {
    this.setSize(size.width, size.height);
  },

  /***
   *
   * @return {{width: number, height: number}}
   */
  get: function () {
    return {
      width: this._width,
      height: this._height
    };
  }
});
var _default = CCanvasBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/svg/SvgCanvas.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/svg/SvgCanvas.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireDefault(require("./Core"));

var _AElementNS = _interopRequireDefault(require("absol/src/HTML5/AElementNS"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _CCanvasBox = _interopRequireDefault(require("../controller/CCanvasBox"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends AElementNS
 * @constructor
 */

function SvgCanvas() {
  var thisSC = this;
  this.box = new _CCanvasBox.default(this);
  this.$attachhook = $('sattachhook', this).on('attached', this.eventHandler.svgAttached);

  this.$attachhook.requestUpdateSize = function () {
    thisSC.updateSize();
  };
}

SvgCanvas.tag = 'svgcanvas';

SvgCanvas.render = function () {
  return _({
    tag: 'svg',
    class: 'ag-canvas',
    child: 'sattachhook'
  });
};

SvgCanvas.prototype.clearChild = function () {
  while (this.lastChild && this.lastChild !== this.$attachhook) {
    this.removeChild(this.firstChild);
  }

  return this;
};

SvgCanvas.prototype._updateCanvasSize = function () {
  var bound = this.getBoundingClientRect();
  var width = bound.width;
  var height = bound.height;
  this.box.setSize(width, height);
};

SvgCanvas.prototype.updateSize = function () {
  this._updateCanvasSize();
};
/***
 * @type {SvgCanvas}
 */


SvgCanvas.eventHandler = {};

SvgCanvas.eventHandler.svgAttached = function () {
  _ResizeSystem.default.add(this.$attachhook);

  this.updateSize();
};

_Core.default.install(SvgCanvas);

var _default = SvgCanvas;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/controller/CContainerBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/controller/CContainerBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {GContainer} $g
 * @constructor
 */
function CContainerBox($g) {
  this.$g = $g;
  this._width = 0;
  this._height = 0;
  this._x = 0;
  this._y = 0;
  this.width = 0;
  this.height = 0;
  this.x = 0;
  this.y = 0;
}
/***
 *
 * @param {number} width
 * @param {number} height
 * @returns {CContainerBox}
 */


CContainerBox.prototype.setSize = function (width, height) {
  this._width = width;
  this._height = height;
  return this;
};
/***
 *
 * @param {number} x
 * @param {number} y
 * @returns {CContainerBox}
 */


CContainerBox.prototype.setPosition = function (x, y) {
  if (x === 0 && y === 0) {} else {
    this.$g.attr('transform', 'translate(' + x + ',' + y + ')');
  }

  this._x = x;
  this._y = y;
};

Object.defineProperty(CContainerBox.prototype, 'width', {
  /***
   *
   * @param {number} width
   */
  set: function (width) {
    this.setSize(width, this._height);
  },

  /***
   *
   * @return {number}
   */
  get: function () {
    return this._width;
  }
});
Object.defineProperty(CContainerBox.prototype, 'height', {
  /***
   *
   * @param {number} height
   */
  set: function (height) {
    this.setSize(this._width, height);
  },

  /***
   *
   * @return {number}
   */
  get: function () {
    return this._height;
  }
});
Object.defineProperty(CContainerBox.prototype, 'size', {
  /***
   *
   * @param {{width: number, height:number}} size
   */
  set: function (size) {
    this.setSize(size.width, size.height);
  },

  /***
   *
   * @return {{width: number, height: number}}
   */
  get: function () {
    return {
      width: this._width,
      height: this._height
    };
  }
});
Object.defineProperty(CContainerBox.prototype, 'x', {
  /***
   *
   * @param {number} x
   */
  set: function (x) {
    this.setPosition(x, this._y);
  },

  /***
   *
   * @return {number}
   */
  get: function () {
    return this._x;
  }
});
Object.defineProperty(CContainerBox.prototype, 'y', {
  /***
   *
   * @param {number} y
   */
  set: function (y) {
    this.setPosition(this._x, y);
  },

  /***
   *
   * @return {number}
   */
  get: function () {
    return this._y;
  }
});
Object.defineProperty(CContainerBox.prototype, 'position', {
  /***
   *
   * @param {{x: number, y:number}} position
   */
  set: function (position) {
    this.setPosition(position.x, position.y);
  },

  /***
   *
   * @return {{x: number, y:number}}
   */
  get: function () {
    return {
      x: this._x,
      y: this._y
    };
  }
});
var _default = CContainerBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/svg/GContainer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/svg/GContainer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireDefault(require("./Core"));

var _CContainerBox = _interopRequireDefault(require("../controller/CContainerBox"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends {AElementNS}
 * @constructor
 */

function GContainer() {
  this.box = new _CContainerBox.default(this);
}

GContainer.tag = 'gcontainer';

GContainer.render = function () {
  return _('g');
};

_Core.default.install(GContainer);

var _default = GContainer;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/controller/CViewBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/controller/CViewBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));


/***
 *
 * @param {SvgViewBox}  $svg
 * @constructor
 */
function CViewBox($svg) {
  this.$svg = $svg;
  this.clientRect = {
    width: 0,
    height: 0
  };
  this.viewBox = {
    x: 0,
    y: 0,
    width: 0,
    height: 0
  };
  this._zoom = 1;
  this._origin = new _Vec.default(0, 0);
}
/***
 *
 * @param {Vec2} v
 * @return Vec2
 */


CViewBox.prototype.screen2view = function (v) {
  return v.div(this._zoom).sub(this._origin);
};
/***
 *
 * @param {Vec2} v
 * @return Vec2
 */


CViewBox.prototype.view2screen = function (v) {
  return v.add(this._origin).mult(this._zoom);
};

CViewBox.prototype.updateClientRect = function () {
  var bound = this.$svg.getBoundingClientRect();
  this.clientRect.width = bound.width;
  this.clientRect.height = bound.height;
  this.updateViewBox();
};

CViewBox.prototype.updateViewBox = function () {
  var o = this._origin;
  var cRect = this.clientRect;
  var zoom = this._zoom;
  var viewBox = this.viewBox;
  viewBox.x = -o.x / this.zoom;
  viewBox.y = -o.y / zoom;
  viewBox.width = cRect.width / zoom;
  viewBox.height = cRect.height / zoom;
  this.$svg.attr('viewBox', [viewBox.x, viewBox.y, viewBox.width, viewBox.height].join(' '));
};

Object.defineProperty(CViewBox.prototype, 'zoom', {
  set: function (val) {
    this._zoom = val;
    this.updateViewBox();
  },
  get: function () {
    return this._zoom;
  }
});
Object.defineProperty(CViewBox.prototype, 'origin', {
  set: function (val) {
    this._origin = val;
    this.updateViewBox();
  },
  get: function () {
    return this._origin;
  }
});
var _default = CViewBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/svg/SvgViewBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/svg/SvgViewBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("./Core"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _CViewBox = _interopRequireDefault(require("../controller/CViewBox"));

require("../../css/svg.css");




/***
 * @augments AElementNS
 * @augments SVGElement
 * @constructor
 */
function SvgViewBox() {
  this.box = new _CViewBox.default(this);
  this.$attachhook = (0, _Core.$)('sattachhook', this).on('attached', this.eventHandler.svgAttached);
  this.$attachhook.requestUpdateSize = this.eventHandler.requestUpdateSize;
}

SvgViewBox.tag = 'SvgViewBox'.toLowerCase();

SvgViewBox.render = function () {
  return (0, _Core._)({
    tag: 'svg',
    class: 'ag-view-box',
    child: ['sattachhook']
  });
};

SvgViewBox.eventHandler = {};
/***
 * @this SvgViewBox
 */

SvgViewBox.eventHandler.requestUpdateSize = function () {
  this.box.updateClientRect();
};
/***
 * @this SvgViewBox
 */


SvgViewBox.eventHandler.svgAttached = function () {
  this.box.updateClientRect();

  _ResizeSystem.default.add(this.$attachhook);
};

_Core.default.install(SvgViewBox);

var _default = SvgViewBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/svg/GViewBoxGrid.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/svg/GViewBoxGrid.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("./Core"));

var _Turtle = _interopRequireDefault(require("../controller/Turtle"));

require("../../css/svg.css");




/***
 * @extends AElementNS
 * @constructor
 */
function GViewBoxGrid() {
  /***
   *
   * @type {null| SvgViewBox}
   */
  this.$svg = null;
  /**
   *
   * @type {AElementNS}
   */

  this.$primary = this.childNodes[0];
  /**
   *
   * @type {AElementNS}
   */

  this.$secondary = this.childNodes[1];
}

GViewBoxGrid.tag = 'GViewBoxGrid'.toLowerCase();

GViewBoxGrid.render = function () {
  return (0, _Core._)({
    tag: 'g',
    class: 'ag-view-box-grid',
    child: ['path.ag-view-box-grid-primary', 'path.ag-view-box-grid-secondary']
  });
};

GViewBoxGrid.prototype.update = function () {
  if (!this.$svg) return;
  var viewBox = this.$svg.box.viewBox;
  var clientRect = this.$svg.box.clientRect;
  var zoom = this.$svg.box.zoom;
  var primary = new _Turtle.default();
  var secondary = new _Turtle.default();
  var x0 = Math.floor((viewBox.x - viewBox.width) / 100) * 100;
  var y0 = Math.floor((viewBox.y - viewBox.height) / 100) * 100;
  var xM = Math.ceil((viewBox.x + viewBox.width * 2) / 100) * 100;
  var yM = Math.ceil((viewBox.y + viewBox.height * 2) / 100) * 100;
  var dy = yM - y0;
  var dx = xM - x0;
  var x = x0,
      y = y0;
  var i = 0;

  while (x < xM) {
    if (i % 8 === 0) {
      primary.moveTo(x, y0).vLineBy(dy);
    } else {
      secondary.moveTo(x, y0).vLineBy(dy);
    }

    x += 12.5;
    ++i;
  }

  i = 0;

  while (y < yM) {
    if (i % 8 === 0) {
      primary.moveTo(x0, y).hLineBy(dx);
    } else {
      secondary.moveTo(x0, y).hLineBy(dx);
    }

    y += 12.5;
  }

  this.addStyle('--zoom-rev', 1 / zoom + '');
  this.$primary.attr('d', primary.getPath());
  this.$secondary.attr('d', secondary.getPath());
};

_Core.default.install(GViewBoxGrid);

var _default = GViewBoxGrid;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/js/svg/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/js/svg/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = install;
exports.Creators = void 0;

var _Shape = _interopRequireDefault(require("./Shape"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _SvgCanvas = _interopRequireDefault(require("./SvgCanvas"));

var _GContainer = _interopRequireDefault(require("./GContainer"));

var _SvgViewBox = _interopRequireDefault(require("./SvgViewBox"));

var _GViewBoxGrid = _interopRequireDefault(require("./GViewBoxGrid"));


var Creators = [_Shape.default, _SvgCanvas.default, _GContainer.default, _SvgViewBox.default, _GViewBoxGrid.default];
/***
 *
 * @param {Dom | Svg} core
 */

exports.Creators = Creators;

function install(core) {
  core.install(Creators);
}

;
};

moduleFactories["node_modules/absol-vchart/src/VCore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/VCore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$ = exports._ = void 0;

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _install = _interopRequireDefault(require("absol-svg/js/svg/install"));


var Vcore = new _Svg.default();
(0, _install.default)(Vcore);
var _ = Vcore._;
exports._ = _;
var $ = Vcore.$;
exports.$ = $;
var _default = Vcore;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/style/vchartStyle.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/style/vchartStyle.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./minicomp.css");

require("./basechart.css");

require("./linechart.css");

require("./tooltip.css");

require("./rangechart.css");

require("./assessmentchart.css");

require("./columnchart.css");

require("./rangegroupchart.css");

require("./rankchart.css");

require("./sunburstchart.css");

require("./squarechart.css");

require("./grouprankchart.css");

require("./mappingchart.css");

require("./imagechart.css");

require("./horizontalbarchart.css");

require("./resizeablediv.css");

var _default = {};
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/Axis.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/Axis.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends GContainer
 * @constructor
 */

function Axis() {
  this.$oxy = $('#oxy', this);
  this.$oxArrow = $('#ox-arrow', this);
  this.$oyArrow = $('#oy-arrow', this);
  this.$oyDivision = $('.cv-oy-division', this);
  this.oxLength = 1;
  this.oyLength = 1;
  this.oyPadding = 0;
  this.oyDivision = NaN;
}

Axis.tag = 'Axis'.toLowerCase();

Axis.render = function () {
  return _({
    tag: 'gcontainer',
    class: "vchart-axis",
    child: [{
      tag: 'path',
      id: "oy-arrow",
      attr: {
        d: "m-5 0h10l-5-6.8z"
      }
    }, {
      tag: 'path',
      id: "ox-arrow",
      attr: {
        d: 'm0 -5v10l6.8 -5z'
      }
    }, {
      tag: 'path',
      id: 'oxy',
      attr: {
        d: 'm0 -1v1 h1',
        fill: 'none'
      }
    }, {
      tag: 'path',
      class: 'cv-oy-division',
      style: {
        display: 'none'
      }
    }]
  });
};

Axis.prototype.updateOyDivision = function () {
  if (this.oyDivision) {
    this.$oyDivision.removeStyle('display');
    var y = this.oyDivision + this.oyPadding;
    if (this.oyPadding) y -= this.oyDivision;
    var d = '';

    while (y <= this.oyLength) {
      d += 'M-2 ' + -y + 'H 2 ';
      y += this.oyDivision;
    }

    this.$oyDivision.attr('d', d);
  } else {
    this.$oyDivision.addStyle('display', 'none');
  }
};

Axis.prototype.updateSize = function () {
  this.$oxy.attr('d', 'm0 ' + -this.oyLength + 'v' + this.oyLength + ' h' + this.oxLength);
  this.$oxArrow.attr('transform', 'translate(' + this.oxLength + ', 0)');
  this.$oyArrow.attr('transform', 'translate(0, ' + -this.oyLength + ')');
  this.updateOyDivision();
};

Axis.prototype.resize = function (oxLength, oyLength) {
  this.oxLength = oxLength;
  this.oyLength = oyLength;
  this.updateSize();
};

Axis.prototype.moveTo = function (x, y) {
  this.attr('transform', 'translate(' + x + ',' + y + ')');
};

Axis.prototype.init = function (props) {
  if (props) {
    if (props.oxLength && props.oyLength) this.resize(props.oxLength, props.oyLength);
    if (props.x && props.y) this.moveTo(props.x, props.y);
  }
};

_VCore.default.install(Axis);

var _default = Axis;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/ScrollArrow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/ScrollArrow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _Mat = _interopRequireDefault(require("absol/src/Math/Mat3"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

require("./style/scrollarrow.css");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));


var _ = _VCore.default._;
var $ = _VCore.default.$;

function ScrollArrow() {
  this.$left = $('.vc-scroll-arrow-left', this);
  this.$right = $('.vc-scroll-arrow-right', this);
  this.width = 100;
  this.on('pointerdown', this.eventHandler.pointerDown);
  this.$leftArrow = this.$left;
  this.$rightArrow = this.$right;
  this._pointerItv = -1; //     .on('pointerdown', function (event) {
  //         event.preventDefault();
  //         var iv = setInterval(function () {
  //             res.emit('pressleft', event, res);
  //         }, 30);
  //
  //         function finish(event) {
  //             clearInterval(iv);
  //             this.off('pointerleave', finish);
  //             this.off('pointerup', finish);
  //         };
  //         this.on('pointerleave', finish);
  //         this.on('pointerup', finish);
  //     });
  //
  // res.$hitBoxLeft = _({
  //     tag: 'rect',
  //     attr: {
  //         x: -5,
  //         y: -5,
  //         width: 30,
  //         height: 37,
  //         rx: 5,
  //         ry: 5
  //     },
  //     style: {
  //         fill: 'rgba(0, 0, 255, 0.1)'
  //     }
  // }).addTo(res.$leftArrow);
  //
  // res.$rightArrow = _(
  //     [
  //         '<g>',
  //         '<g transform="translate(0,-270)">',
  //         '<g transform="matrix(.26164 0 0 .26164 .23843 218.56)" style="fill:#00a5d6">',
  //         '<path d="m0.99976 198 49.214 48.519-49.213 49.481v-14.201l35.215-35.079-35.164-34.611z" style="fill:#00a5d6"/>',
  //         '<path d="m28.531 198.44v13.96l35.057 34.608-35.057 34.963v13.555l48.91-48.844z" style="fill:#00a5d6"/>',
  //         '</g>',
  //         '</g>',
  //         '</g>'
  //     ].join('')
  // ).addTo(res)
  //     .on('pointerdown', function (event) {
  //         event.preventDefault();
  //         var iv = setInterval(function () {
  //             res.emit('pressright', event, res);
  //         }, 30);
  //
  //         function finish(event) {
  //             clearInterval(iv);
  //             this.off('pointerleave', finish);
  //             this.off('pointerup', finish);
  //         };
  //         this.on('pointerleave', finish);
  //         this.on('pointerup', finish);
  //     });
  //
  // res.$hitBoxRight = _({
  //     tag: 'rect',
  //     attr: {
  //         x: -5,
  //         y: -5,
  //         width: 30,
  //         height: 37,
  //         rx: 5,
  //         ry: 5
  //     },
  //     style: {
  //         fill: 'rgba(0, 0, 255, 0.1)'
  //     }
  // }).addTo(res.$rightArrow);
  //
  // return res;
}

_Mat.default.prototype.apply2DTransform = function (v, isPoint) {
  var a = this.data;
  var x0 = v.x;
  var y0 = v.y;
  var x = x0 * a[0] + y0 * a[3] + (isPoint ? a[6] : 0);
  var y = x0 * a[1] + y0 * a[4] + (isPoint ? a[7] : 0);
  return new _Vec.default(x, y);
};

ScrollArrow.tag = 'ScrollArrow'.toLowerCase();

ScrollArrow.render = function () {
  return _({
    tag: 'gcontainer',
    extendEvent: ['pressleft', 'pressright'],
    class: 'vc-scroll-arrow',
    child: [{
      attr: {// transform: "matrix(.26164 0 0 .26164 .23843 218.56)"
      },
      child: [{
        tag: 'gcontainer',
        class: 'vc-scroll-arrow-left',
        child: [{
          tag: 'rect',
          class: 'vc-scroll-arrow-hit-box',
          attr: {
            x: 0,
            y: -19,
            width: 30,
            height: 38,
            rx: 5,
            ry: 5
          }
        }, {
          tag: 'path',
          class: 'vc-scroll-arrow-icon',
          attr: {
            d: 'm 24.02314720639999998 -12.3647199999999984 -12.876350959999998 12.69451116 12.87608932 12.946208839999999' + ' v -3.71554964 l -9.2136526 -9.178069559999999 9.20030896 -9.05562204 z' + ' M 17.226420839999999 -12.4798416000000003 v 3.6524944 l -9.17231348 9.054837119999998 9.17231348 9.14771932' + ' v 3.5465302 l -12.796812399999999 -12.77954416 z'
          }
        }]
      }, {
        tag: 'gcontainer',
        class: 'vc-scroll-arrow-right',
        child: [{
          tag: 'rect',
          class: 'vc-scroll-arrow-hit-box',
          attr: {
            x: -30,
            y: -19,
            width: 30,
            height: 38,
            rx: 5,
            ry: 5
          }
        }, {
          tag: 'path',
          class: 'vc-scroll-arrow-icon',
          attr: {
            d: 'm -22.5000072064 -12.3647199999999984 12.876350959999998 12.69451116 -12.87608932 12.946208839999999' + ' v -3.71554964 l 9.2136526 -9.178069559999999 -9.20030896 -9.05562204 z ' + 'M -15.70328084 -12.4798416000000003 v 3.6524944 l 9.17231348 9.054837119999998 ' + '-9.17231348 9.14771932 v 3.5465302 l 12.796812399999999 -12.77954416 z'
          }
        }]
      }]
    }]
  });
};

ScrollArrow.property = {
  width: {
    set: function (value) {
      this.box.width = value;
      this.$right.box.x = value;
    },
    get: function () {
      return this.box.width;
    }
  }
};
ScrollArrow.eventHandler = {};

ScrollArrow.eventHandler.pointerDown = function (event) {
  event.preventDefault();
  var button = _EventEmitter.default.hitElement(this.$left, event) ? 0 : 1;
  var thisSB = this;
  this._buttonIdx = button;

  if (this._pointerItv < 0) {
    this._pointerItv = setInterval(function () {
      if (thisSB._buttonIdx === 0) {
        thisSB.emit('pressleft', event, thisSB);
      } else if (thisSB._buttonIdx === 1) {
        thisSB.emit('pressright', event, thisSB);
      }
    }, 30);
  }

  $(document.body).on('pointerup', this.eventHandler.pointerUp);

  if (thisSB._buttonIdx === 0) {
    thisSB.emit('pressleft', event, thisSB);
  } else if (thisSB._buttonIdx === 1) {
    thisSB.emit('pressright', event, thisSB);
  }
};

ScrollArrow.eventHandler.pointerUp = function () {
  clearInterval(this._pointerItv);
  this._pointerItv = -1;
  $(document.body).off('pointerup', this.eventHandler.pointerUp);
};

_VCore.default.install(ScrollArrow);

var _default = ScrollArrow;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/vchart.resizablediv.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/vchart.resizablediv.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("absol-acomp/ACore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));


var _ = _ACore.default._;
var $ = _ACore.default.$;

function ResizeableDiv() {
  this.$resizebox = $('resizebox', this).on('beginmove', this.eventHandler.beginMove);
  this.on('click', this.eventHandler.click);
}

ResizeableDiv.tag = 'ResizeableDiv'.toLowerCase();

ResizeableDiv.render = function () {
  return _({
    class: ['vchart-resizable-div'],
    extendEvent: 'sizechange',
    child: {
      tag: 'resizebox',
      props: {
        canResize: true
      }
    }
  });
};

_ACore.default.install('resizablediv', ResizeableDiv);

ResizeableDiv.eventHandler = {};

ResizeableDiv.eventHandler.click = function () {
  this.enableResize();
};

ResizeableDiv.eventHandler.clickBody = function (event) {
  if (_EventEmitter.default.hitElement(this.$modal, event) || _EventEmitter.default.hitElement(this, event)) return;
  this.disableResize();
};

ResizeableDiv.eventHandler.beginMove = function (event) {
  this.$modal = (this.$modal || _({
    style: {
      position: 'fixed',
      left: '1px',
      right: '1px',
      top: '1px',
      bottom: '1px',
      zIndex: '1000'
    }
  })).addTo(document.body);
  this.$resizebox.on('moving', this.eventHandler.moving);
  this.$resizebox.on('endmove', this.eventHandler.endMove);
  this._preBound = this.getBoundingClientRect();
};

ResizeableDiv.eventHandler.moving = function (event) {
  var w = this._preBound.width;
  var h = this._preBound.height;

  if (event.option.bottom) {
    h += event.clientDY;
    this.addStyle('height', this._preBound.height + event.clientDY + 'px');
  }

  if (event.option.right) {
    w += event.clientDX;
    this.addStyle('width', this._preBound.width + event.clientDX + 'px');
  }

  this.emit('sizechange', {
    type: 'type',
    target: this,
    width: w,
    height: h,
    originEvent: event.originEvent || event
  });
};

ResizeableDiv.eventHandler.endMove = function (event) {
  this.$resizebox.off('moving', this.eventHandler.moving);
  this.$resizebox.off('endmove', this.eventHandler.endMove);
  this.$modal.remove();
};

ResizeableDiv.prototype.enableResize = function () {
  if (this.containsClass('vchart-resizable-div-active')) return;
  this.addClass('vchart-resizable-div-active');
  $(document.body).on('click', this.eventHandler.clickBody);
};

ResizeableDiv.prototype.disableResize = function () {
  if (!this.containsClass('vchart-resizable-div-active')) return;
  this.removeClass('vchart-resizable-div-active');
  $(document.body).off('click', this.eventHandler.clickBody);
};

var _default = ResizeableDiv;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/helper.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/helper.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.circle = circle;
exports.text = text;
exports.vline = vline;
exports.moveVLine = moveVLine;
exports.hline = hline;
exports.moveHLine = moveHLine;
exports.rect = rect;
exports.line = line;
exports.calBeautySegment = calBeautySegment;
exports.autoCurve = autoCurve;
exports.generateBackgroundColors = generateBackgroundColors;
exports.isNumber = isNumber;
exports.toLocalString = toLocalString;
exports.map = map;
exports.getSubNumberArray = getSubNumberArray;
exports.wrapChartInWHResizer = wrapChartInWHResizer;
exports.paddingLeft = paddingLeft;
exports.pathTokenize = pathTokenize;
exports.getMinWidthBox = getMinWidthBox;
exports.getMinHeightBox = getMinHeightBox;
exports.getMaxWidthBox = getMaxWidthBox;
exports.getMaxHeightBox = getMaxHeightBox;
exports.lighterColor = lighterColor;
exports.fresherColor = fresherColor;
exports.wrapToLines = wrapToLines;
exports.addDevContextMenu = addDevContextMenu;
exports.beautyStep = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _AComp = _interopRequireDefault(require("absol-acomp/AComp"));

require("./vchart.resizablediv");

var _TextMeasure = _interopRequireDefault(require("absol-acomp/js/TextMeasure"));

var _BContextCapture = _interopRequireDefault(require("absol-acomp/js/BContextCapture"));


var _ = _VCore.default._;
var beautyStep = [0.001, 0.002, 0.0025, 0.005, 0.01, 0.02, 0.025, 0.05, 0.1, 0.2, 0.25, 0.5, 1, 2, 5].concat(function () {
  var res = [];
  var h = 1;

  while (h < 10000000000) {
    res.push(10 * h);
    res.push(20 * h);
    res.push(25 * h);
    res.push(50 * h);
    h *= 10;
  }

  return res;
}());
exports.beautyStep = beautyStep;

function circle(x, y, r, eClss) {
  return _({
    tag: 'circle',
    class: eClss,
    attr: {
      cx: x,
      cy: y,
      r: r
    }
  });
}

;
/**
 * @param {String} text
 * @param {Number} x
 * @param {Number} y
 * @param {String=} eClss
 * @returns {SVGTextElement}
 */

function text(text, x, y, eClss) {
  if (eClss instanceof Array) eClss = eClss.join(' ');
  return _('<text x="' + x + '" y="' + y + '" ' + (eClss ? 'class="' + eClss + '"' : '') + '>' + text + '</text>');
}

function vline(x, y, length, eClss) {
  return _({
    tag: 'path',
    class: eClss,
    attr: {
      d: 'm' + x + ' ' + y + 'v' + length
    }
  });
}

function moveVLine(e, x, y, length) {
  return e.attr('d', 'm' + x + ' ' + y + 'v' + length);
}

function hline(x, y, length, eClss) {
  return _({
    tag: 'path',
    class: eClss,
    attr: {
      d: 'm' + x + ' ' + y + 'h' + length
    }
  });
}

function moveHLine(e, x, y, length) {
  return e.attr('d', 'm' + x + ' ' + y + 'h' + length);
}
/**
 *
 * @param {Number} x
 * @param {Number} y
 * @param {Number} width
 * @param {Number} height
 * @param {Number} eClss
 * @returns {SVGRect}
 */


function rect(x, y, width, height, eClss) {
  var option = {
    tag: 'rect',
    attr: {
      x: x,
      y: y,
      width: width,
      height: height
    },
    class: eClss
  };
  return _(option);
}

function line(x0, y0, x1, y1) {
  return _({
    tag: 'path',
    class: eClss,
    attr: {
      d: 'M' + x0 + ' ' + y0 + 'L' + x1 + ' ' + y1
    }
  });
}

function calBeautySegment(maxSegment, minValue, maxValue, integerOnly) {
  var i = 0;
  var res = {
    step: 1,
    segmentCount: maxValue - minValue,
    maxValue: maxValue,
    minValue: minValue
  };

  while (i < beautyStep.length) {
    var step = beautyStep[i];

    if (!integerOnly || step >= 1) {
      var bot = Math.floor(minValue / step);
      var top = Math.ceil(maxValue / step);

      if (top - bot <= maxSegment) {
        res.step = step;
        res.segmentCount = top - bot;
        res.maxValue = top * step;
        res.minValue = bot * step;
        break;
      }
    }

    ++i;
  }

  return res;
} //x[i] < x[i+1]


function autoCurve(points, strong, free) {
  if (!(strong > 0)) strong = 0.5;

  if (points.length == 0) {
    return '';
  }

  var paddingLeft = points[0].slice();
  var paddingRight = points[points.length - 1].slice();

  if (typeof free == "number") {
    paddingLeft[0] -= (points[1][0] - points[0][0]) * free;
    paddingLeft[1] -= (points[1][1] - points[0][1]) * free;
    paddingRight[0] += (points[points.length - 1][0] - points[points.length - 2][0]) * free;
    paddingRight[1] += (points[points.length - 1][1] - points[points.length - 2][1]) * free;
  } else if (free instanceof Array) {
    paddingLeft[0] -= free[0][0];
    paddingLeft[1] -= free[0][1];
    paddingRight[0] += free[1][0];
    paddingRight[1] += free[1][1];
  }

  points = [paddingLeft].concat(points).concat([paddingRight]);
  var Cs = [];
  Cs.push('M' + points[1].join(' '));

  for (var i = 1; i < points.length - 2; ++i) {
    var A = _Vec.default.make(points[i - 1]);

    var B = _Vec.default.make(points[i]);

    var C = _Vec.default.make(points[i + 1]);

    var D = _Vec.default.make(points[i + 2]);

    var AB = B.sub(A);
    var BC = C.sub(B);
    var CB = BC.inv();
    var DC = C.sub(D);
    var lAB = AB.abs();
    var lBC = BC.abs();
    var lDC = DC.abs();
    var lCB = lBC;
    var h1 = Math.sqrt(lAB * lBC);
    var h2 = Math.sqrt(lBC * lDC);
    if (h1 == 0) h1 = 1;
    if (h2 == 0) h2 = 1;
    var N1 = AB.normalized().add(BC.normalized()).normalized();
    var N2 = CB.normalized().add(DC.normalized()).normalized();
    var lN1 = lBC == 0 ? 0 : lBC * (N1.dot(BC) / (N1.abs() * BC.abs())) * h1 / (h1 + h2) * strong;
    var lN2 = lCB == 0 ? 0 : lCB * (N2.dot(CB) / (N2.abs() * CB.abs())) * h2 / (h1 + h2) * strong;
    N1 = N1.mult(lN1);
    N2 = N2.mult(lN2);
    var P1 = B.add(N1);
    var P2 = C.add(N2);
    var x1 = P1.x;
    var y1 = P1.y;
    var x2 = P2.x;
    var y2 = P2.y;
    var x = C.x;
    var y = C.y;
    Cs.push('C ' + x1 + ' ' + y1 + ', ' + x2 + ' ' + y2 + ', ' + x + ' ' + y);
  }

  return Cs.join('');
}

;

function generateBackgroundColors(n) {
  var l = Math.ceil(Math.sqrt(n));
  var arrs = Array(n).fill(null).reduce(function (ac, cr, i) {
    var tail = ac[ac.length - 1];

    if (tail.length >= l) {
      tail = [];
      ac.push(tail);
    }

    var color = _Color.default.fromHSL(i / n, 0.5, 0.5);

    tail.push(color);
    return ac;
  }, [[]]);
  var res = [];
  var i = 0;

  while (res.length < n) {
    if (arrs[i].length > 0) {
      res.push(arrs[i].shift());
    }

    i = (i + 1) % arrs.length;
  }

  return res;
}

function isNumber(x) {
  return -Infinity < x && x < Infinity && typeof x == 'number';
}

function toLocalString(fixedRight) {
  var separatorReal = 1.5.toLocaleString().replace(/[0-9]/g, '');
  var separatorInt = 10000 .toLocaleString().replace(/[0-9]/g, '');
  return function (value) {
    var x = Math.abs(value);
    if (fixedRight !== undefined) x = x.toFixed(fixedRight);
    var s = x.toString().split('.');
    var int = s[0] || '';
    var realText = s[1] || '';
    int = int.split('').reduce(function (ac, cr, i, arr) {
      if (i == 0 || (arr.length - i) % 3 == 0) {
        ac.push(cr);
      } else {
        ac[ac.length - 1] += cr;
      }

      return ac;
    }, []).join(separatorInt);
    return (value < 0 ? '-' : '') + int + (realText.length > 0 ? separatorReal + realText : '');
  };
}

;

function map(x, l, h, L, H) {
  return L + (x - l) * (H - L) / (h - l);
}

function getSubNumberArray(arr) {
  return arr.reduce(function (ac, value, j) {
    if (isNumber(value)) {
      var cr;

      if (ac.last + 1 < j) {
        cr = {
          start: j,
          values: []
        };
        ac.currentSubArea = cr;
        ac.result.push(cr);
      } else {
        cr = ac.currentSubArea;
      }

      ac.last = j;
      cr.values.push(value);
    }

    return ac;
  }, {
    last: -100,
    result: [],
    currentSubArea: null
  }).result;
}

function wrapChartInWHResizer(chartElt, outerParam) {
  outerParam = outerParam || {};
  var newVersion = chartElt.containsClass('ag-canvas');

  if (newVersion) {
    outerParam.style = outerParam.style || {};
    outerParam.style.width = outerParam.width || chartElt.style.width;
    outerParam.style.height = outerParam.width || chartElt.style.height;

    if (chartElt._isAutoWidth) {
      outerParam.style.width = 'auto';
      chartElt.addStyle({
        height: '100%'
      });
      setTimeout(function () {
        res.addStyle('width', chartElt.getBoundingClientRect().width + 'px');
        chartElt.addStyle({
          width: '100%',
          height: '100%'
        });
      }, 1000);
    } else {
      chartElt.addStyle({
        width: '100%',
        height: '100%'
      });
    }
  }

  var res = _AComp.default._({
    tag: 'resizablediv',
    style: {
      display: 'inline-block',
      verticalAlign: 'top'
    },
    child: chartElt,
    on: {
      sizechange: function (event) {
        if (chartElt.update) {
          if (event.width) {
            chartElt.canvasWidth = event.width;
          }

          if (event.height) {
            chartElt.canvasHeight = event.height;
          }

          chartElt.update();
        } else if (newVersion) {
          chartElt.updateSize();
        }
      }
    }
  }, false, true).addStyle(outerParam.style || {});

  return res;
}

function paddingLeft(text, char, length) {
  while (text.length < length) text = char + '' + text;

  return text;
}
/**
 *
 * @param {String} text
 */


function pathTokenize(text) {
  return text.match(/[a-zA-Z]+|(\-?[0-9\.]+(e\-?[0-9]+)?)/g);
}
/**
 * @argument {Array<SVGElement>}
 * @returns {Number}
 */


function getMinWidthBox() {
  return Array.prototype.reduce.call(arguments, function (ac, elt) {
    return Math.min(ac, elt.getBBox().width);
  }, 100000000);
}
/**
 * @argument {Array<SVGElement>}
 * @returns {Number}
 */


function getMinHeightBox() {
  return Array.prototype.reduce.call(arguments, function (ac, elt) {
    return Math.min(ac, elt.getBBox().height);
  }, 100000000);
}
/**
 * @argument {Array<SVGElement>}
 * @returns {Number}
 */


function getMaxWidthBox() {
  return Array.prototype.reduce.call(arguments, function (ac, elt) {
    return Math.max(ac, elt.getBBox().width);
  }, -100000000);
}
/**
 * @argument {Array<SVGElement>}
 * @returns {Number}
 */


function getMaxHeightBox() {
  return Array.prototype.reduce.call(arguments, function (ac, elt) {
    return Math.max(ac, elt.getBBox().height);
  }, -100000000);
}
/**
 *
 * @param {import ('absol/src/Color/Color').default} color
 * @returns {import ('absol/src/Color/Color').default}
 */


function lighterColor(color, delta) {
  delta = delta || 0;
  var hsla = color.toHSLA();
  hsla[2] = Math.max(0, Math.min(1, hsla[2] + delta));
  return _Color.default.fromHSLA.apply(_Color.default, hsla);
}

function fresherColor(color, delta) {
  delta = delta || 0.2;
  var hsla = color.toHSLA();
  hsla[1] = Math.max(0, Math.min(1, hsla[1] + delta));
  return _Color.default.fromHSLA.apply(_Color.default, hsla);
}
/***
 * Default font size: Arial
 * @param {string} text
 * @param {number} fontSize
 * @param {number} width
 */


function wrapToLines(text, fontSize, width) {
  var words = text.split(' ');
  var line = [words.shift()];
  var lines = [line];
  var newText;

  for (var i = 0; i < words.length; ++i) {
    newText = line.concat([words[i]]).join(' ');

    if (_TextMeasure.default.measureWidth(newText, 'Arial', 14) <= width) {
      line.push(words[i]);
    } else {
      line = [words[i]];
      lines.push(line);
    }
  }

  for (var i = 0; i < lines.length; ++i) {
    lines[i] = lines[i].join(' ');
  }

  return lines;
}

function addDevContextMenu(svg) {
  _BContextCapture.default.auto();

  svg.defineEvent('contextmenu');
  svg.on({
    contextmenu: function (event) {
      var img = this;
      event.showContextMenu({
        items: [{
          icon: 'span.mdi.mdi-download-outline',
          text: 'Download as SVG',
          cmd: 'download'
        }]
      }, function (ev) {
        var menuItem = ev.menuItem;

        if (menuItem.cmd === 'download') {
          var url = absol.Svg.svgToSvgUrl(img);

          var a = absol._({
            tag: 'a',
            style: {
              display: 'none'
            },
            attr: {
              href: url,
              download: 'export.svg'
            }
          }).addTo(document.body);

          a.click();
          a.remove();
        }
      });
    }
  });
}
};

moduleFactories["node_modules/absol-vchart/src/template.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/template.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.translate = translate;
exports.rotate = rotate;

function translate(x, y) {
  return 'translate(' + x + ', ' + y + ')';
}

;

function rotate() {
  return 'rotate(' + Array.prototype.join.call(arguments, ',') + ')';
}

;
};

moduleFactories["node_modules/absol-vchart/src/BaseChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/BaseChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _helper = require("./helper");

var _template = require("./template");


var _ = _VCore.default._;
var $ = _VCore.default.$;

function BaseChart() {
  var _ = vchart._;
  var $ = vchart.$;

  var res = _({
    tag: 'svg',
    class: 'base-chart',
    child: [{
      tag: 'g',
      attr: {
        id: 'contentBox'
      },
      child: 'g#content'
    }, {
      tag: 'path',
      class: 'base-chart-white-mask',
      attr: {
        fill: 'white',
        stroke: 'white',
        'fill-rule': 'evenodd',
        d: 'M0,0  0,2000 2000,2000 2000,0zM100,0  0,200 200,200 200,0z'
      }
    }, 'axis', 'hscrollbar']
  });

  res.sync = res.afterAttached();
  res.$axis = $('axis', res);
  res.$whiteBoxMask = $('.base-chart-white-mask', res);
  res.$content = $('g#content', res);
  res.eventHandler = _OOP.default.bindFunctions(res, BaseChart.eventHandler); // res.on('wheel', res.eventHandler.wheel);

  res.$hscrollbar = $('hscrollbar', res).on('scroll', res.eventHandler.scrollbarscroll);
  res.integerOnly = false;
  return res;
}

;
BaseChart.prototype.integerOnly = false;
BaseChart.eventHandler = {};

BaseChart.eventHandler.wheel = function (event) {
  var d = this.scrollBy(event.deltaY);

  if (d != 0) {
    event.preventDefault();
  }
};

BaseChart.eventHandler.scrollArrowsPressLeft = function (event) {
  this.scrollBy(-60);
};

BaseChart.eventHandler.scrollArrowsPressRight = function (event) {
  this.scrollBy(60);
};

BaseChart.eventHandler.scrollbarscroll = function (event) {
  this.scrollLeft = this.$hscrollbar.scrollLeft;
  event.preventDefault();
};

BaseChart.prototype.scrollBy = function (dX) {
  var scrollLeft = this.scrollLeft + dX / 5;
  var scrollLeft = Math.max(0, Math.min(this.oxContentLength - this.oxLength, scrollLeft));
  var deltaX = scrollLeft - this.scrollLeft;

  if (deltaX != 0) {
    this.scrollLeft = scrollLeft;
    this.$hscrollbar.scrollLeft = scrollLeft;
  }

  return deltaX;
};

BaseChart.prototype._createOyValues = function (minValue, step, segmentCount, extendOY) {
  var child = Array(segmentCount + 1 + (extendOY ? 1 : 0)).fill(0).map(function (u, i) {
    var value;

    if (extendOY) {
      if (i == 0) {
        value = 0;
      } else {
        value = minValue + (i - 1) * step;
      }
    } else {
      value = minValue + i * step;
    }

    return {
      tag: 'text',
      attr: {
        x: '-14',
        y: '0',
        'text-anchor': 'end'
      },
      props: {
        innerHTML: this.numberToString(value)
      }
    };
  }.bind(this));
  return vchart._({
    tag: 'g',
    child: child
  });
};

BaseChart.prototype._createOYSegmentLines = function (n) {
  var _ = vchart._;

  var res = _({
    tag: 'g',
    child: Array(n).fill('path.vchart-segment-line')
  });

  return res;
};

BaseChart.prototype.numberToString = function (value) {
  return value.toString();
};

BaseChart.prototype.mapOYValue = function (val) {
  return -this.paddingnAxisBottom + (this.extendOY ? -this.oySegmentLength : 0) - (0, _helper.map)(val, this.oyMinValue, this.oyMaxValue, 0, this.oyLength - (this.extendOY ? this.oySegmentLength : 0));
};

BaseChart.prototype.preInit = function () {};

BaseChart.prototype.updateSize = function () {
  this.attr({
    width: this.canvasWidth + '',
    height: this.canvasHeight + '',
    viewBox: [0, 0, this.canvasWidth, this.canvasHeight].join(' ')
  });
};

BaseChart.prototype.updateOyValues = function () {
  this.oyLength = this.oxyBottom - 70 - this.paddingnAxisBottom;
  this.oySegmentLength = this.oyLength / (this.oySegmentCount + (this.extendOY ? 1 : 0));
  Array.prototype.forEach.call(this.$oyValues.childNodes, function (e, i) {
    e.attr({
      y: -i * this.oySegmentLength + 5 - this.paddingnAxisBottom,
      x: -10
    });
  }.bind(this));
  var oyValuesBox = this.$oyValues.getBBox();
  this.oxyLeft = Math.max(this.oxyLeft, oyValuesBox.width + 14, this.$oyName.getBBox().width);
  this.oxLength = this.oxLength || this.canvasWidth - this.oxyLeft - 50;
  this.$oyValues.attr('transform', 'translate(' + this.oxyLeft + ',' + this.oxyBottom + ')');
};

BaseChart.prototype.updateOYSegmentLines = function () {
  this.$oySegmentLines.attr('transform', 'translate(' + this.oxyLeft + ',' + this.oxyBottom + ')');
  Array.prototype.forEach.call(this.$oySegmentLines.childNodes, function (e, i) {
    (0, _helper.moveHLine)(e, -2, -i * this.oySegmentLength - this.paddingnAxisBottom, 4);
  }.bind(this));
};

BaseChart.prototype.updateBackComp = function () {
  this.$title.attr('x', this.canvasWidth / 2);
  this.updateOyValues();
  this.updateOYSegmentLines();
};

BaseChart.prototype.updateAxis = function () {
  this.$axis.attr('transform', (0, _template.translate)(this.oxyLeft, this.oxyBottom));
  this.$axis.resize(this.canvasWidth - this.oxyLeft - 10, this.oxyBottom - 50);
  this.$oyName.attr({
    x: this.oxyLeft,
    y: 30,
    'text-anchor': 'end'
  });
  this.$whiteBoxMask.attr('d', 'M0,0  0,cvh cvw,cvh cvw,0zMleft,top  left,bottom right,bottom right,topz'.replace(/cvh/g, this.canvasHeight).replace(/cvw/g, this.canvasWidth).replace(/left/g, this.oxyLeft).replace(/top/g, 1).replace(/bottom/g, this.canvasHeight).replace(/right/g, this.canvasWidth - 10));
  this.$content.attr('transform', 'translate(' + this.oxyLeft + ',' + this.oxyBottom + ')');
  this.$oxName.attr({
    x: this.canvasWidth - this.$oxName.getBBox().width - 3,
    y: this.oxyBottom - 9
  });
};

BaseChart.prototype.updateFrontComp = function () {};

BaseChart.prototype.updateComp = function () {};

BaseChart.prototype.updateScrollArrows = function () {
  this.$scrollArrows.box.setPosition(this.oxyLeft + 7, this.oxyBottom - this.oyLength / 2);
  this.$scrollArrows.width = this.oxLength - 15;
  this.scrollLeft = this.scrollLeft + 0; //update

  this.$hscrollbar.resize(this.oxLength, 10);
  this.$hscrollbar.moveTo(this.oxyLeft, this.oxyBottom - 10);
  this.$hscrollbar.outterWidth = this.oxLength;
  this.$hscrollbar.innerWidth = this.oxContentLength;
};

BaseChart.prototype.update = function () {
  if (typeof this.canvasWidth != 'number') {
    this.canvasWidth = 300;
    this.autoWidth = true;
  }

  this.oxLength = 0; //init

  this.updateSize();
  this.updateBackComp();
  this.updateAxis();
  this.updateComp();
  this.updateScrollArrows();
  this.updateFrontComp();
  requestAnimationFrame(function () {
    if (this.autoWidth) {
      var requireWidth = this.canvasWidth + this.overflowOX;
      var proviceWidth = this.parentElement.getBoundingClientRect().width;
      this.canvasWidth = Math.max(Math.min(requireWidth, proviceWidth), 300);
      this.autoWidth = false;
      this.update();
    }
  }.bind(this));
};

BaseChart.prototype.initScroll = function () {
  this.$scrollArrows = vchart._('scrollarrow').addTo(this).on('pressleft', this.eventHandler.scrollArrowsPressLeft).on('pressright', this.eventHandler.scrollArrowsPressRight);
};

BaseChart.prototype.preInit = function () {
  this.canvasWidth = 900;
  this.canvasHeight = 600;
  this.paddingnAxisBottom = 0;
  this.maxSegment = 9;
  this.oyMaxValue = 10;
  this.oyMinValue = 0;
  this.valueName = '';
  this.keyName = '';
  this.colorTable = ['#821616', ' #824116', '#826C16', '#6C8216', '#418216', '#168216', '#168241', '#16826C', '#166C82', '#164182', '#161682', '#411682', '#6C1682', '#82166C', '#821641'];
};

BaseChart.prototype.processMinMax = function () {
  this.minValue = 0;
  this.maxValue = 10;
};

BaseChart.prototype.beautifyMinMax = function () {
  if (!(this.maxValue >= this.minValue)) {
    this.maxValue = 10;
    this.minValue = 0;
  }

  if (this.maxValue == this.minValue) this.maxValue += this.maxSegment;
  var btSgmt = (0, _helper.calBeautySegment)(this.maxSegment, this.minValue, this.maxValue, this.integerOnly);
  this.oySegmentCount = btSgmt.segmentCount;
  this.oyMinValue = btSgmt.minValue;
  this.oyMaxValue = btSgmt.maxValue;
  this.extendOY = !!(this.zeroOY && this.oyMinValue > 0);
  this.oyStep = btSgmt.step;
  this.oxyLeft = 20;
  this.oxyBottom = this.canvasHeight - 40;
};

BaseChart.prototype.initBackComp = function () {
  this.$oyValues = this._createOyValues(this.oyMinValue, this.oyStep, this.oySegmentCount, this.extendOY).addTo(this);
  this.$oySegmentLines = this._createOYSegmentLines(this.oySegmentCount + 1 + (this.extendOY ? 1 : 0)).addTo(this);
  this.$title = (0, _helper.text)(this.title || '', 0, 19, 'base-chart-title').attr('text-anchor', 'middle').addTo(this);
  this.$oyName = (0, _helper.text)(this.valueName || '', 0, 0, 'base-chart-oxy-text').addTo(this);
  this.$oxName = (0, _helper.text)(this.keyName || '', 0, 0, 'base-chart-oxy-text').addTo(this);
};

BaseChart.prototype.initComp = function () {};

BaseChart.prototype.initFrontComp = function () {};

BaseChart.prototype.initScroll = function () {
  this.$scrollArrows = vchart._('scrollarrow').addTo(this).on('pressleft', this.eventHandler.scrollArrowsPressLeft).on('pressright', this.eventHandler.scrollArrowsPressRight);
};

BaseChart.prototype.init = function (props) {
  for (var key in props) {
    if (props[key] === undefined) delete props[key];
  }

  this.preInit();
  this.super(props);
  this.processMinMax();
  this.beautifyMinMax();
  this.initBackComp();
  this.initComp();
  this.initFrontComp();
  this.initScroll();
  this.sync = this.sync.then(this.update.bind(this));
};

BaseChart.property = {};
BaseChart.property.scrollLeft = {
  set: function (value) {
    this._scrollLeft = value || 0;
    this.$content.attr('transform', 'translate(' + (this.oxyLeft - this.scrollLeft) + ',' + this.oxyBottom + ')');

    if (this.scrollLeft > 0.001) {
      this.$scrollArrows.$leftArrow.removeStyle('display');
    } else {
      this.$scrollArrows.$leftArrow.addStyle('display', 'none');
    }

    if (this.oxContentLength - this.oxLength > this.scrollLeft + 0.001) {
      this.$scrollArrows.$rightArrow.removeStyle('display');
    } else {
      this.$scrollArrows.$rightArrow.addStyle('display', 'none');
    }
  },
  get: function () {
    return this._scrollLeft || 0;
  }
};
BaseChart.property.overflowOX = {
  get: function () {
    return Math.max(0, this.oxContentLength - this.oxLength);
  }
};
BaseChart.property.showInlineValue = {
  set: function (value) {
    if (value) {
      this.addClass('vchart-show-inline-value');
    } else {
      this.removeClass('vchart-show-inline-value');
    }
  },
  get: function () {
    return this.containsClass('vchart-show-inline-value');
  }
};
_VCore.default.creator.basechart = BaseChart;
var _default = BaseChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/ToolTip.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/ToolTip.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.showTooltip = showTooltip;
exports.closeTooltip = closeTooltip;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var syncTooltip = _Dom.default.documentReady.then(function () {
  var _ = _Dom.default.ShareInstance._;
  var $ = _Dom.default.ShareInstance.$;

  var higne = _({
    class: 'vchart-tooltip-higne',
    child: {
      class: 'vchart-tooltip-anchor-container',
      child: {
        class: 'vchart-tooltip-anchor',
        child: '.vchart-tooltip-container'
      }
    }
  }).addTo(document.body);

  var container = $('.vchart-tooltip-container', higne);
  container.addStyle({
    left: -10000,
    top: -1000
  });
  var anchorContainer = $('.vchart-tooltip-anchor-container', higne);
  var sync = higne.afterAttached();
  var currentToken = 0;
  var anchorClientX, anchorClientY;

  function updateTooltipContainer() {
    var containerBound = container.getBoundingClientRect();

    var viewBound = _Dom.default.traceOutBoundingClientRect(higne);

    if (anchorClientX + containerBound.width > viewBound.right) {
      container.addStyle({
        left: 'auto',
        right: '0'
      });
    } else {
      container.addStyle({
        left: '0',
        right: 'auto'
      });
    }

    if (anchorClientY - containerBound.height < viewBound.top) {
      container.addStyle({
        top: '0',
        bottom: 'auto'
      });
    } else {
      container.addStyle({
        top: 'auto',
        bottom: '0'
      });
    }
  }

  function close() {
    container.addClass('absol-hidden');
    window.removeEventListener('scroll', close, false);
  }

  var ToolTip = {};

  ToolTip.showTooltip = function (text, clientX, clientY) {
    window.addEventListener('scroll', close, false);
    anchorClientX = clientX;
    anchorClientY = clientY;
    var higneBound = higne.getBoundingClientRect();
    anchorContainer.addStyle({
      left: clientX - higneBound.left + 'px',
      top: clientY - higneBound.top + 'px'
    });
    container.addClass('vchart-hidden');
    container.clearChild();
    text.split(/\r?\n/).forEach(function (line) {
      _('<div><span>' + line + '</span></div>').addTo(container);
    });
    sync = sync.then(updateTooltipContainer).then(function () {
      container.removeClass('vchart-hidden');
    });
    return ++currentToken;
  };

  ToolTip.closeTooltip = function (token) {
    if (currentToken == token) {
      container.addClass('vchart-hidden');
    }
  };

  return ToolTip;
});

function showTooltip(text, clientX, clientY) {
  return syncTooltip.then(function (tooltip) {
    return tooltip.showTooltip(text, clientX, clientY);
  });
}

function closeTooltip(text, clientX, clientY) {
  return syncTooltip.then(function (tooltip) {
    tooltip.closeTooltip(text, clientX, clientY);
  });
}
};

moduleFactories["node_modules/absol-vchart/src/HLineArrow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/HLineArrow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _template = require("./template");

var _helper = require("./helper");

var _AElementNS = _interopRequireDefault(require("absol/src/HTML5/AElementNS"));

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends AElementNS
 * @constructor
 */

function HLineArrow() {
  this._length = 0;
  this.$line = $('path.vchart-line-arrow-line', this);
  this.$arrow = $('.vchart-line-arrow-rect', this);
  this.length = 0;
}

HLineArrow.tag = 'HLineArrow'.toLowerCase();

HLineArrow.render = function () {
  return _({
    class: 'vchart-line-arrow',
    child: ['path.vchart-line-arrow-line', {
      tag: 'path',
      class: 'vchart-line-arrow-rect',
      attr: {
        d: 'm-6.8 -5v10l6.8 -5z'
      }
    }]
  });
};

HLineArrow.prototype.resize = function (length) {
  if (typeof length !== 'number') length = parseFloat(length + '');
  length = length || 0;
  if (length < 0) length = 0;
  this._length = length;
  this.$arrow.attr('transform', (0, _template.translate)(length, 0));
  (0, _helper.moveHLine)(this.$line, 0, 0, length);
  this._length = length;
};

HLineArrow.property = {};
HLineArrow.property.length = {
  set: function (value) {
    this.resize(this._length);
  },
  get: function () {
    return this._length;
  }
};
_VCore.default.creator.hlinearrow = HLineArrow;
var _default = HLineArrow;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/HScrollBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/HScrollBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Draggable = _interopRequireDefault(require("absol-acomp/js/Draggable"));

var _template = require("./template");

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));

var _Hanger = _interopRequireDefault(require("absol-acomp/js/Hanger"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/**
 * @augments Hanger
 * @augments GContainer
 * @constructor
 */

function HScrollBar() {
  var res = _({
    tag: _Hanger.default,
    elt: this
  });

  this._scrollLeft = 0;
  this.on('predrag', res.eventHandler.predrag).on('drag', res.eventHandler.drag);
  this.$bar = $('.vchart-vscrollbar-bar', this);
  this.$button = $('.vchart-vscrollbar-button', this);
}

HScrollBar.tag = 'HScrollBar'.toLowerCase();

HScrollBar.render = function () {
  return _({
    tag: 'gcontainer',
    extendEvent: ['scroll'],
    class: 'vchart-vscrollbar',
    child: [{
      tag: 'rect',
      class: 'vchart-vscrollbar-bar',
      attr: {
        x: '0',
        y: '0'
      }
    }, {
      tag: 'rect',
      class: 'vchart-vscrollbar-button'
    }]
  });
};

HScrollBar.eventHandler = {};

HScrollBar.eventHandler.predrag = function (event) {
  var bBox = this.$bar.getBBox();
  var bound = this.$bar.getBoundingClientRect();

  if (event.target !== this.$button) {
    var centerOfset = Math.max(0, Math.min(1, (event.clientX - bound.left) / bound.width));
    var newScrollLeft = centerOfset * this.innerWidth - this.outterWidth / 2;
    newScrollLeft = Math.max(0, Math.min(this.innerWidth - this.outterWidth, newScrollLeft));
    this._scrollLeft = newScrollLeft;
    this.updateButtonPosition();
  }

  this.__predragScrollLeft = this._scrollLeft;
  this.emit('scroll', event, this);
};

HScrollBar.eventHandler.drag = function (event) {
  event.preventDefault();
  var bBox = this.$bar.getBBox();
  var bound = this.$bar.getBoundingClientRect();
  var scaleX = bBox.width / bound.width * this.innerWidth / this.outterWidth;
  event.moveDX = event.currentPoint.sub(event.startingPoint).x;
  var newScrollLeft = this.__predragScrollLeft + event.moveDX * scaleX;
  newScrollLeft = Math.max(0, Math.min(this.innerWidth - this.outterWidth, newScrollLeft));
  this._scrollLeft = newScrollLeft;
  this.updateButtonPosition();
  this.emit('scroll', event, this);
};

HScrollBar.prototype.updateButtonPosition = function () {
  var maxButtonX = (this.innerWidth - this.outterWidth) / this.innerWidth * this.width;
  var buttonX = this.scrollLeft / this.innerWidth * this.width;
  if (maxButtonX < 0) maxButtonX = 0;
  if (!(buttonX >= 0)) buttonX = 0;
  if (!(buttonX <= maxButtonX)) buttonX = maxButtonX;
  this.$button.attr('x', buttonX + '');
};

HScrollBar.prototype.updateView = function () {
  if (this.outterWidth >= this.innerWidth) {
    this.addClass('vchart-hidden');
  } else {
    this.removeClass('vchart-hidden');
    this.$bar.attr({
      rx: this.height / 2.5 + '',
      ry: this.height / 2.5 + ''
    });
    var buttonWidth = 1 / (this.innerWidth / this.outterWidth) * this.width;
    if (!(buttonWidth >= 0 && buttonWidth < Infinity)) buttonWidth = 0;
    this.$button.attr('width', buttonWidth + '');
    this.$button.attr({
      height: this.height * 0.8 + '',
      y: this.height / 10 + '',
      rx: this.height / 2.5 + '',
      ry: this.height / 2.5 + ''
    });
    this.updateButtonPosition();
  }
};

HScrollBar.property = {
  width: {
    set: function (value) {
      this.$bar.attr('width', value + '');
      this.updateView();
    },
    get: function () {
      var r = (this.$bar.attr('width') || '0').replace(/px|em|rem/g, '');
      var c = parseFloat(r);
      if (c > 0) return c;
      return 0;
    }
  },
  height: {
    set: function (value) {
      this.$bar.attr('height', value + '');
      this.updateView();
    },
    get: function () {
      var r = (this.$bar.attr('height') || '0').replace(/px|em|rem/g, '');
      var c = parseFloat(r);
      if (c > 0) return c;
      return 0;
    }
  },
  innerWidth: {
    set: function (value) {
      if (value >= 0) {
        this._innerWidth = value;
        this.updateView();
      }
    },
    get: function () {
      return this._innerWidth || 0;
    }
  },
  outterWidth: {
    set: function (value) {
      if (value >= 0) {
        this._outterWidth = value;
        this.updateView();
      }
    },
    get: function () {
      return this._outterWidth || 0;
    }
  },
  scrollLeft: {
    set: function (value) {
      value = Math.max(0, value);
      value = Math.min(value, this.innerWidth - this.outterWidth);
      this._scrollLeft = value;
      this.updateView();
    },
    get: function () {
      return this._scrollLeft || 0;
    }
  }
};

HScrollBar.prototype.resize = function (width, height) {
  this.height = height;
  this.width = width;
};

HScrollBar.prototype.moveTo = function (x, y) {
  this.attr('transform', (0, _template.translate)(x, y));
};

_VCore.default.creator.hscrollbar = HScrollBar;
var _default = HScrollBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/LineChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/LineChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _helper = require("./helper");

var _ToolTip = require("./ToolTip");

var _template = require("./template");


var _ = _VCore.default._;
var $ = _VCore.default.$;

function LineChart() {
  return _('basechart', true);
}

;

LineChart.prototype.processMinMax = function () {
  this.minValue = this.lines.reduce(function (minValue, line) {
    return line.values.reduce(function (minValue, value) {
      if (!(0, _helper.isNumber)(value)) return minValue;
      return Math.min(minValue, value);
    }, minValue);
  }, 1000000000);
  this.maxValue = this.lines.reduce(function (maxValue, line) {
    return line.values.reduce(function (maxValue, value) {
      if (!(0, _helper.isNumber)(value)) return maxValue;
      return Math.max(maxValue, value);
    }, maxValue);
  }, -1000000000);

  if (this.minValue > this.maxValue) {
    this.minValue = 0;
    this.maxValue = this.minValue + 10;
  }
};

LineChart.prototype._createLineNote = function (name, color) {
  var res = _('g');

  res.$line = (0, _helper.hline)(0, -5, this.noteLineLength, 'line-chart-line').addStyle('stroke', color).addTo(res);
  res.$name = (0, _helper.text)(name, this.noteLineLength + 5, 0).addTo(res);
  return res;
};

LineChart.prototype._createKeyName = function (key) {
  var res = _('g');

  res.$text = (0, _helper.text)(key, 0, 5).addTo(res);
  return res;
};

LineChart.prototype._createLine = function (line, color) {
  var res = _({
    tag: 'g',
    style: {
      fill: color,
      stroke: color
    }
  });

  res.$path = _('shape.line-chart-line').addTo(res);
  res.$plots = line.values.map(function (u, i) {
    var plot = (0, _helper.circle)(0, 0, this.plotRadius, 'line-chart-plot').addTo(res).on('mouseenter', function (event) {
      var text = line.texts && line.texts[i];
      if (!text) return;
      var currentBound = this.getBoundingClientRect();
      (0, _ToolTip.showTooltip)(text, (currentBound.left + currentBound.right) / 2, (currentBound.top + currentBound.bottom) / 2).then(function (token) {
        this.once('mouseleave', function () {
          setTimeout(function () {
            (0, _ToolTip.closeTooltip)(token);
          }, 1000);
        });
      }.bind(this));
    });

    if (line.plotColors && line.plotColors[i]) {
      plot.addStyle('fill', line.plotColors[i]);
    }

    return plot;
  }.bind(this));
  return res;
};

LineChart.prototype.initBackComp = function () {
  this.super();
  this.colors = this.lines.map(function (line, i, arr) {
    if (line.color) return line.color;
    return this.colorTable[Math.floor(this.colorTable.length * i / arr.length)];
  }.bind(this));
  this.$lineNotes = this.lines.map(function (line, i) {
    return this._createLineNote(line.name, this.colors[i]).addTo(this);
  }.bind(this));
  this.$keyNames = this.keys.map(function (key) {
    return this._createKeyName(key).addTo(this.$content);
  }.bind(this));
};

LineChart.prototype.updateBackComp = function () {
  this.super();
  this.oxyBottom = this.canvasHeight - 25;
  var lineNoteWidth = this.$lineNotes.reduce(function (lineNoteWidth, $lineNote) {
    return lineNoteWidth + $lineNote.getBBox().width + 15;
  }.bind(this), 0);
  this.$lineNotes.reduce(function (x, $lineNote) {
    $lineNote.attr('transform', (0, _template.translate)(x, this.canvasHeight - 5));
    return x + $lineNote.getBBox().width + 15;
  }.bind(this), (this.canvasWidth - lineNoteWidth) / 2);
  var maxKeyNameWidth = this.$keyNames.reduce(function (w, $keyName) {
    return Math.max(w, $keyName.$text.getBBox().width);
  }, 0);
  this.oxSegmentLength = this.oxLength / this.keys.length;
  this.oxContentLength = this.oxLength;

  if (this.oxSegmentLength < maxKeyNameWidth + this.keyPaddingH * 2) {
    this.rotateText = true;
  } else if (this.minOXSegmentLength > this.oxSegmentLength) {
    this.oxSegmentLength = this.minOXSegmentLength;
    this.rotateText = true;
    this.oxContentLength = this.oxSegmentLength * this.keys.length;
  }

  if (this.rotateText) {
    this.$keyNames.forEach(function (e, i) {
      e.attr('transform', (0, _template.translate)((i + 0.5) * this.oxSegmentLength - 5, 12));
      e.$text.attr('transform', (0, _template.rotate)(45));
    }.bind(this));
    this.oxyBottom -= maxKeyNameWidth / 1.4 + 12;
  } else {
    this.$keyNames.forEach(function (e, i) {
      e.attr('transform', (0, _template.translate)((i + 0.5) * this.oxSegmentLength, 12));
      e.$text.attr('text-anchor', 'middle');
    }.bind(this));
    this.oxyBottom -= 30;
  } //reupdate because update oxybottom


  this.super();
};

LineChart.prototype.initComp = function () {
  this.$lines = this.lines.map(function (line, i) {
    return this._createLine(line, this.colors[i]).addTo(this.$content);
  }.bind(this));
};

LineChart.prototype.updateComp = function () {
  console.log(this.lines);
  this.$lines.map(function ($line, i) {
    var line = this.lines[i];
    $line.$plots.forEach(function ($plot, j) {
      $plot.attr('display');
      var value = line.values[j];

      if ((0, _helper.isNumber)(value)) {
        $plot.attr({
          cx: this.oxSegmentLength * (j + 0.5),
          cy: this.mapOYValue(value)
        });
      } else {
        $plot.attr('display', 'none');
      }
    }.bind(this));
    $line.$path.begin();
    line.values.reduce(function (state, value, j) {
      if (line.length == 1) {
        if (!(0, _helper.isNumber)(value)) return 'NOT_START';
        var y = this.mapOYValue(value);
        var x = this.oxSegmentLength * j;
        $line.$path.moveTo(x, y);
        x = this.oxSegmentLength * (j + 1);
        $line.$path.lineTo(x, y);
        return "IN_LINE";
      }

      if (state == "NOT_START") {
        if (!(0, _helper.isNumber)(value)) return 'NOT_START';
        var y = this.mapOYValue(value);
        var x = this.oxSegmentLength * (j + 0.5);
        $line.$path.moveTo(x, y);
        return 'IN_LINE';
      } else if (state == 'IN_LINE') {
        if (!(0, _helper.isNumber)(value)) return 'NOT_START';
        var y = this.mapOYValue(value);
        var x = this.oxSegmentLength * (j + 0.5);
        $line.$path.lineTo(x, y);
        return 'IN_LINE';
      }

      return ac;
    }.bind(this), "NOT_START");
    $line.$path.end();
  }.bind(this));
};

LineChart.prototype.preInit = function () {
  this.super();
  this.rotateText = true;
  this.noteLineLength = 40;
  this.plotRadius = 6;
  this.keyPaddingH = 4;
  this.minOXSegmentLength = 25;
  this.colorTable = ['#821616', ' #824116', '#826C16', '#6C8216', '#418216', '#168216', '#168241', '#16826C', '#166C82', '#164182', '#161682', '#411682', '#6C1682', '#82166C', '#821641'];
  this.lines = [];
};

_VCore.default.creator.linechart = LineChart;
var _default = LineChart; // LineChart = function () {
//     var _ = _;
//     var $ = $;
//     var res = _({
//         tag: 'svg',
//         class: 'vchart-linechart',
//         child: [
//             {
//                 tag: 'g',
//                 child: 'axis'
//             }
//         ]
//     });
//     res.$axis = $('.axis', res);
//     res._axisLeft = 50;
//     res._axisBottom = 50;
//     res.$g = $('g', res);
//     res.sync = res.afterAttached();
//     return res;
// };
// LineChart.property = {};
// LineChart.property.colCount = {
//     set: function (value) {
//         this._colCount = value;
//     },
//     get: function () {
//         return this._colCount || 0;
//     }
// };
// LineChart.property.colNames = {
//     set: function (value) {
//         this._colNames = value || [];
//         if (this.$colNames) this.$colNames.forEach(function (e) { e.selftRemove() });
//         this.$colNames = this._colNames.map(function (name) {
//             return this._createColText(name, 0, 0).addTo(this.$g);
//         }.bind(this));
//     },
//     get: function () {
//         return this._colNames || [];
//     }
// };
// LineChart.property.lines = {
//     set: function (value) {
//         this._lines = value || [];
//         if (this.$lines) this.$lines.map(function (e) { e.selftRemove() });
//         this.$lines = this._lines.map(function (props) {
//             return this._createLine(props).addTo(this.$g);
//         }.bind(this));
//     },
//     get: function () {
//         return this._lines;
//     }
// }
// LineChart.prototype._createColText = function (text, x, y) {
//     return _([
//         '<g transform="translate(' + x + ',' + y + ')">',
//         '<g  transform="rotate(60)">',
//         '<text class="vchart-coltext" >',
//         '<tspan>' + text + '</tspan>',
//         '</text>',
//         '</g>',
//         '</g>'
//     ].join(''));
// };
// LineChart.prototype._createLine = function (props) {
//     var res = _({
//         tag: 'g',
//         style: {
//             fill: props.color || 'rgb(68, 68, 255)',
//             stroke: props.color || 'rgb(68, 68, 255)'
//         }
//     });
//     res.$dots = Array(props.values.length)
//         .fill('<ellipse  rx="7" ry="7" style="stroke:none" />').map(_)
//         .map(function (e) { e.addTo(res); return e; });
//     res.$path = _('<path style="fill:none"/>').addTo(res);
//     res._values = props.values;
//     return res;
// };
// LineChart.prototype.updateColNamePositions = function () {
//     if (this.$colNames) {
//         var maxSize = this.$colNames.reduce(function (ac, text) {
//             ac.width = Math.max(text.getBBox().width, ac.width);
//             ac.height = Math.max(text.getBBox().height, ac.height);
//             return ac;
//         }.bind(this), { width: 0, height: 0 });
//         this._oxLength = this.canvasWidth - this._axisLeft - maxSize.width;
//         this._oxSegmentLength = this._oxLength / (this.colCount + 1);
//         this._oyLength = this.canvasHeight - maxSize.height - 50;
//         this._axisBottom = maxSize.height + 20;
//         var x0 = this._axisLeft + this._oxSegmentLength / 2;
//         var y0 = this.canvasHeight - maxSize.height - 5;
//         this.$colNames.forEach(function (text, index) {
//             text.attr('transform',
//                 'translate(' +
//                 (x0 + index * this._oxSegmentLength) + ',' +
//                 y0 + ')'
//             );
//         }.bind(this));
//     }
// };
// LineChart.prototype.updateAxis = function () {
//     this.$axis.moveTo(this._axisLeft, this.canvasHeight - this._axisBottom);
//     this.$axis.resize(this._oxLength, this._oyLength);
// }
// LineChart.prototype.updateSize = function () {
//     this.attr({ width: this.canvasWidth + '', height: this.canvasHeight + '', viewBox: [0, 0, this.canvasWidth, this.canvasHeight].join(' ') });
// };
// LineChart.prototype._updateLines = function () {
//     if (this.$lines) {
//         this.$lines.forEach(function (e) {
//             var x0 = this._axisLeft + this._oxSegmentLength / 2;
//             var y0 = this.canvasHeight - this._axisBottom - Math.map(e._values[0], 0, this.max - this.min, 0, this._oyLength);
//             e.$dots[0].attr({ cx: x0, cy: y0 });
//             var d = 'm' + x0 + ' ' + y0;
//             var dx = this._oxSegmentLength, dy;
//             for (var i = 1; i < e._values.length; ++i) {
//                 dy = -Math.map((e._values[i] - e._values[i - 1]), 0, this.max - this.min, 0, this._oyLength);
//                 d += ' ' + dx + ' ' + dy;
//                 x0 += dx;
//                 y0 += dy;
//                 e.$dots[i].attr({ cx: x0, cy: y0 });
//             }
//             e.$path.attr('d', d);
//         }.bind(this));
//     }
// };
// LineChart.prototype.update = function (width, height) {
//     this.updateSize();
//     this.updateColNamePositions();
//     this.updateAxis();
//     this._updateLines();
//     //todo
// };
// LineChart.prototype.init = function (props) {
//     props = props || {};
//     props.canvasWidth = props.canvasWidth || 400;
//     props.canvasHeight = props.canvasHeight || 300;
//     this.super(props);
//     this.sync.then(this.update.bind(this));
// };

exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/DualChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/DualChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _helper = require("./helper");

var _template = require("./template");

var _LineChart = _interopRequireDefault(require("./LineChart"));


var _ = _VCore.default._;
var $ = _VCore.default.$;

function DualChart() {
  var res = _('basechart.dualchart', true);

  return res;
}

;

DualChart.prototype.processMinMax = function () {
  this.minValue = this.lines.reduce(function (minValue, line) {
    return line.values.reduce(function (minValue, value) {
      if (!(0, _helper.isNumber)(value)) return minValue;
      return Math.min(minValue, value);
    }, minValue);
  }, 1000000000);
  this.minValue = this.areas.reduce(function (minValue, area) {
    return area.values.reduce(function (minValue, value) {
      if (!(0, _helper.isNumber)(value)) return minValue;
      return Math.min(minValue, value);
    }, minValue);
  }, this.minValue);
  this.maxValue = this.lines.reduce(function (maxValue, line) {
    return line.values.reduce(function (maxValue, value) {
      if (!(0, _helper.isNumber)(value)) return maxValue;
      return Math.max(maxValue, value);
    }, maxValue);
  }, -1000000000);
  this.maxValue = this.areas.reduce(function (maxValue, area) {
    return area.values.reduce(function (maxValue, value) {
      if (!(0, _helper.isNumber)(value)) return maxValue;
      return Math.max(maxValue, value);
    }, maxValue);
  }, this.maxValue);

  if (this.minValue > this.maxValue) {
    this.minValue = 0;
    this.maxValue = this.minValue + 10;
  }
};

DualChart.prototype._createArea = function (area, color) {
  var res = _({
    tag: 'shape',
    class: 'dualchart-area',
    style: {
      fill: color,
      stroke: color
    }
  });

  return res;
};

DualChart.prototype._createAreaNote = function (area, color) {
  var res = _({
    tag: 'g'
  });

  res.$rect = (0, _helper.rect)(0, -14, 14, 14, 'dualchart-note-rect').addTo(res);

  if (color) {
    res.$rect.addStyle('fill', color);
  }

  res.$name = (0, _helper.text)(area.name, 17, 0, 'dualchart-note-text').addTo(res);
  return res;
};

DualChart.prototype.initBackComp = function () {
  this.super();
  this.noteLineLength = 14;
  this.colors = this.lines.concat(this.areas).map(function (items, i, arr) {
    if (items.color) return items.color;
    return i < this.lines.length ? this.colorTable[Math.floor(this.colorTable.length * i / arr.length)] : this.colorTable[Math.floor(this.colorTable.length * i / arr.length)].replace(/#/, '#80');
  }.bind(this));
  this.$lineNotes = this.lines.map(function (line, i) {
    return this._createLineNote(line.name, this.colors[i]).addTo(this);
  }.bind(this));
  this.$arealNotes = this.areas.map(function (area, i) {
    return this._createAreaNote(area, this.colors[i + this.lines.length]).addTo(this);
  }.bind(this));
  this.$keyNames = this.keys.map(function (key) {
    return this._createKeyName(key).addTo(this.$content);
  }.bind(this));
};

DualChart.prototype.updateBackComp = function () {
  this.super();
  this.oxyBottom = this.canvasHeight - 5;
  var $notes = this.$lineNotes.concat(this.$arealNotes);
  var notesWidth = $notes.reduce(function (noteWidth, $lineNote) {
    return noteWidth + $lineNote.getBBox().width + 15;
  }.bind(this), 0);

  if (notesWidth >= this.canvasWidth) {
    var maxNoteWidth = $notes.reduce(function (maxNoteWidth, $lineNote) {
      return Math.max(maxNoteWidth, $lineNote.getBBox().width + 10);
    }.bind(this), 0);
    var notePerLine = Math.max(1, Math.floor(this.canvasWidth / maxNoteWidth));
    var x0 = (this.canvasWidth - notePerLine * maxNoteWidth) / 2 + 5;
    var y0 = this.canvasHeight - 5;
    $notes.forEach(function ($note, i) {
      $note.attr('transform', (0, _template.translate)(x0 + maxNoteWidth * (i % notePerLine), y0));
      if (i % notePerLine == notePerLine - 1) y0 -= 20;
      this.oxyBottom -= 20;
    }.bind(this));
  } else {
    $notes.reduce(function (x, $line) {
      $line.attr('transform', (0, _template.translate)(x, this.canvasHeight - 5));
      return x + $line.getBBox().width + 15;
    }.bind(this), (this.canvasWidth - notesWidth) / 2);
    this.oxyBottom -= 20;
  }

  var maxKeyNameWidth = this.$keyNames.reduce(function (w, $keyName) {
    return Math.max(w, $keyName.$text.getBBox().width);
  }, 0);
  this.oxSegmentLength = this.oxLength / this.keys.length;
  this.oxContentLength = this.oxLength;

  if (this.oxSegmentLength < maxKeyNameWidth + this.keyPaddingH * 2) {
    this.rotateText = true;
  } else if (this.minOXSegmentLength > this.oxSegmentLength) {
    this.oxSegmentLength = this.minOXSegmentLength;
    this.rotateText = true;
    this.oxContentLength = this.oxSegmentLength * this.keys.length;
  }

  if (this.rotateText) {
    this.$keyNames.forEach(function (e, i) {
      e.attr('transform', (0, _template.translate)((i + 0.5) * this.oxSegmentLength - 5, 12));
      e.$text.attr('transform', (0, _template.rotate)(45));
    }.bind(this));
    this.oxyBottom -= maxKeyNameWidth / 1.4 + 12;
  } else {
    this.$keyNames.forEach(function (e, i) {
      e.attr('transform', (0, _template.translate)((i + 0.5) * this.oxSegmentLength, 12));
      e.$text.attr('text-anchor', 'middle');
    }.bind(this));
    this.oxyBottom -= 30;
  } //reupdate because update oxybottom


  this.super();
};

DualChart.prototype.initComp = function () {
  this.$areas = this.areas.map(function (line, i) {
    return this._createArea(line, this.colors[i + this.lines.length]).addTo(this.$content);
  }.bind(this));
  this.$lines = this.lines.map(function (line, i) {
    return this._createLine(line, this.colors[i]).addTo(this.$content);
  }.bind(this));
};

DualChart.prototype.updateComp = function () {
  this.updateLine();
  this.updateArea();
};

DualChart.prototype.updateLine = function () {
  this.$lines.map(function ($line, i) {
    var line = this.lines[i];
    var subLines = (0, _helper.getSubNumberArray)(line.values);
    $line.$path.begin();
    subLines.forEach(function (subLine, j) {
      var start = subLine.start;
      var values = subLine.values;

      if (values.length > 1) {
        $line.$path.moveTo(this.oxSegmentLength * (start + 0.5), this.mapOYValue(values[0]));

        for (var xi = 1; xi < values.length; ++xi) {
          $line.$path.lineTo(this.oxSegmentLength * (start + xi + 0.5), this.mapOYValue(values[xi]));
        }
      } else {
        $line.$path.moveTo(this.oxSegmentLength * (start + 0.25), this.mapOYValue(values[0]));
        $line.$path.lineTo(this.oxSegmentLength * (start + 0.75), this.mapOYValue(values[0]));
      }
    }.bind(this));
    $line.$path.end();
    $line.$plots.forEach(function ($plot, j) {
      $plot.attr('display');
      var value = line.values[j];

      if ((0, _helper.isNumber)(value)) {
        $plot.attr({
          display: undefined,
          cx: this.oxSegmentLength * (j + 0.5),
          cy: this.mapOYValue(value)
        });
      } else $plot.attr('display', 'none');
    }.bind(this));
    $line.$path.end();
  }.bind(this));
};

DualChart.prototype.updateArea = function () {
  this.$areas.map(function ($area, i) {
    var values = this.areas[i].values;
    var subAreas = (0, _helper.getSubNumberArray)(values);
    $area.begin();
    subAreas.forEach(function (subArea) {
      var start = subArea.start;
      var values = subArea.values;

      if (values.length > 1) {
        $area.moveTo(this.oxSegmentLength * (start + 0.5), -1);

        for (var xi = 0; xi < values.length; ++xi) {
          $area.lineTo(this.oxSegmentLength * (start + xi + 0.5), this.mapOYValue(values[xi]));
        }

        $area.lineTo(this.oxSegmentLength * (start + values.length - 1 + 0.5), -1);
        $area.closePath();
      } else {
        $area.moveTo(this.oxSegmentLength * (start + 0.25), -1);
        $area.lineTo(this.oxSegmentLength * (start + 0.25), this.mapOYValue(values[0]));
        $area.lineTo(this.oxSegmentLength * (start + 0.75), this.mapOYValue(values[0]));
        $area.lineTo(this.oxSegmentLength * (start + 0.75), -1);
        $area.closePath();
      }
    }.bind(this)); // $area
    //     .moveTo(this.oxSegmentLength * (values.length - (this.keys.length == 1 ? 0.25 : 0.5)), -1)
    //     .lineTo(this.oxSegmentLength * (this.keys.length == 1 ? 0.25 : 0.5), -1);
    // if (this.keys.length == 1) {
    //     $area.lineTo(this.oxSegmentLength * 0.25, isNumber(values[0]) ? this.mapOYValue(values[0]) : 0);
    // }
    // for (var i = 0; i < values.length; ++i) {
    //     $area.lineTo(this.oxSegmentLength * (i + 0.5), isNumber(values[i]) ? this.mapOYValue(values[i]) : 0);
    // }
    // if (this.keys.length == 1) {
    //     $area.lineTo(this.oxSegmentLength * 0.75, isNumber(values[0]) ? this.mapOYValue(values[0]) : 0);
    // }
    // $area.closePath().end();

    $area.end();
  }.bind(this));
};

Object.keys(_LineChart.default.prototype).filter(function (key) {
  return !DualChart.prototype[key];
}).forEach(function (key) {
  DualChart.prototype[key] = _LineChart.default.prototype[key];
});
_VCore.default.creator.dualchart = DualChart;
var _default = DualChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/RectNote.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/RectNote.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));


var _ = _VCore.default._;
var $ = _VCore.default.$;

function RectNote() {
  this._text = '';
  this._color = 'black';
  this.$rect = $('.vc-note-rect', this);
  this.$text = $('.vc-note-text', this);
}

RectNote.tag = 'RectNote'.toLowerCase();

RectNote.render = function () {
  var fontSize = $(document.body).getFontSize();
  return _({
    tag: 'gcontainer',
    class: 'cv-note',
    child: [{
      tag: 'rect',
      class: 'vc-note-rect',
      attr: {
        x: 0,
        y: 0,
        width: Math.ceil(24 * fontSize / 14) + '',
        height: fontSize + ''
      }
    }, {
      tag: 'text',
      class: 'vc-note-text',
      attr: {
        x: Math.ceil(30 * fontSize / 14) + '',
        y: Math.ceil(11 * fontSize / 14) + ''
      }
    }]
  });
};

RectNote.property = {
  text: {
    set: function (value) {
      value = value || '';
      this._text = value;
      this.$text.clearChild().addChild(_({
        text: value
      }));
    },
    get: function () {
      return this._text;
    }
  },
  color: {
    set: function (value) {
      this._color = value;
      this.$rect.addStyle('fill', value.toString());
    },
    get: function () {
      return this._color;
    }
  }
};

_VCore.default.install('RectNote'.toLowerCase(), RectNote);

var _default = RectNote;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/StrokeNote.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/StrokeNote.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./style/note.css");

var _VCore = _interopRequireDefault(require("./VCore"));


var _ = _VCore.default._;
var $ = _VCore.default.$;

function StrokeNote() {
  this._text = '';
  this._color = 'black';
  this.$line = $('.vc-note-line', this);
  this.$text = $('.vc-note-text', this);
}

StrokeNote.tag = 'StrokeNote'.toLowerCase();

StrokeNote.render = function () {
  return _({
    tag: 'gcontainer',
    class: 'vc-note',
    child: [{
      tag: 'path',
      class: 'vc-note-line',
      attr: {
        d: 'M0 7 h24'
      }
    }, {
      tag: 'text',
      class: 'vc-note-text',
      attr: {
        x: '30',
        y: '11'
      }
    }]
  });
};

StrokeNote.property = {
  text: {
    set: function (value) {
      value = value || '';
      this._text = value;
      this.$text.clearChild().addChild(_({
        text: value
      }));
    },
    get: function () {
      return this._text;
    }
  },
  color: {
    set: function (value) {
      this._color = value;
      this.$line.addStyle('stroke', value.toString());
    },
    get: function () {
      return this._color;
    }
  }
};

_VCore.default.install('StrokeNote'.toLowerCase(), StrokeNote);

var _default = StrokeNote;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/ChartResizeBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/ChartResizeBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ACore = _interopRequireDefault(require("absol-acomp/ACore"));

var _ResizeBox = _interopRequireDefault(require("absol-acomp/js/ResizeBox"));

var _Dom = require("absol/src/HTML5/Dom");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

require("./style/chartresizebox.css");


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 * @augments AElement
 * @extends ResizeBox
 * @constructor
 */

function ChartResizeBox() {
  /***
   *
   * @type {null|AElement}
   */
  this.$target = null;
  this._listenInterval = -1;
  this.$attachhook = $('attachhook', this);
  this.updateSize = this.updateSize.bind(this);
  this.$attachhook.requestUpdateSize = this.updateSize;
  this.$trackedScrollers = [];
  this.canResize = true;
  this._endMoveTime = 0;
  this.on({
    beginmove: this.eventHandler.crbBeginMove,
    moving: this.eventHandler.crbMove,
    endmove: function () {
      this._endMoveTime = new Date().getTime();
    }
  });
}

ChartResizeBox.tag = 'ChartResizeBox'.toLowerCase();

ChartResizeBox.render = function () {
  return _({
    tag: _ResizeBox.default.tag,
    class: 'vc-chart-resize-box',
    child: ['attachhook']
  }, true);
};

ChartResizeBox.prototype.isAttached = function (target) {
  return this.$target === target;
};

ChartResizeBox.prototype.isAfterMoving = function () {
  return new Date().getTime() - this._endMoveTime < 5;
};

ChartResizeBox.prototype.attachTo = function (target) {
  if (this.$target === target) return;
  this.detach();
  if (!target || !(0, _Dom.isDomNode)(target)) return;

  _ResizeSystem.default.add(this.$attachhook);

  this.$target = target;
  var pe = target.parentElement;

  if (pe) {
    pe.appendChild(this);
  }

  while (pe) {
    if (pe.addEventListener) {
      pe.addEventListener('scroll', this.updateSize);
      this.$trackedScrollers.push(pe);
    } else break;

    pe = pe.parentElement;
  }

  document.addEventListener('scroll', this.updateSize);
  this.$trackedScrollers.push(document);
  this.updateSize();
};

ChartResizeBox.prototype.detach = function () {
  clearInterval(this._listenInterval);
  this._listenInterval = -1;

  while (this.$trackedScrollers.length > 0) {
    this.$trackedScrollers.pop().removeEventListener('scroll', this.updateSize);
  }

  this.remove();
  this.$target = null;
};

ChartResizeBox.prototype.updateSize = function () {
  var target = this.$target;
  if (!target) return;
  var bound = target.getBoundingClientRect();
  this.addStyle({
    left: bound.left + 'px',
    top: bound.top + 'px',
    width: bound.width + 'px',
    height: bound.height + 'px'
  });
};

ChartResizeBox.eventHandler = {};

ChartResizeBox.eventHandler.crbBeginMove = function (event) {
  this._targetInitBound = this.$target.getBoundingClientRect();
};

ChartResizeBox.eventHandler.crbMove = function (event) {
  if (event.option.right) {
    this.$target.addStyle('width', this._targetInitBound.width + event.clientDX + 'px');
  }

  if (event.option.bottom) {
    this.$target.addStyle('height', this._targetInitBound.height + event.clientDY + 'px');
  }

  _ResizeSystem.default.update();
};

_ACore.default.install(ChartResizeBox);

var _default = ChartResizeBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/BChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/BChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./style/base.css");

var _VCore = _interopRequireDefault(require("./VCore"));

var _SvgCanvas = _interopRequireDefault(require("absol-svg/js/svg/SvgCanvas"));

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _RectNote = _interopRequireDefault(require("./RectNote"));

var _StrokeNote = _interopRequireDefault(require("./StrokeNote"));

var _helper = require("./helper");

var _BaseChart = _interopRequireDefault(require("./BaseChart"));

var _ACore = _interopRequireDefault(require("absol-acomp/ACore"));

var _ChartResizeBox = _interopRequireDefault(require("./ChartResizeBox"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _int = require("absol/src/Math/int");


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends SvgCanvas
 * @constructor
 */

function BChart() {
  this.resizable = false;
  this.ready = false;
  this.contentPadding = 5;
  this.title = '';
  this.domSignal = new _DomSignal.default($('sattachhook.vc-dom-signal', this));
  this.domSignal.on({
    updateContent: this.updateContent.bind(this)
  });
  /**
   * @type {GContainer}
   */

  this.$body = $('.vc-body', this);
  /**
   * @type {GContainer}
   */

  this.$noteCtn = $('.vc-note-ctn', this);
  this.domSignal.emit('updateContent');
  this.$title = $('.vc-title', this);
  this.computedData = {
    /***
     * @type {Array<{color: Color, type: ("stroke"|"rect"), text:string}>}
     */
    notes: []
  };
  this.on('click', this.eventHandler.click2Resize.bind(this));

  if (!this.numberToText) {
    _OOP.default.drillProperty(this, this, 'numberToText', 'numberToString');
  }
}

BChart.tag = 'BChart'.toLowerCase();

BChart.render = function () {
  return _({
    tag: 'svgcanvas',
    class: 'vc-chart',
    child: [{
      tag: 'gcontainer',
      class: 'vc-body'
    }, {
      tag: 'text',
      class: 'vc-title',
      child: {
        text: ''
      }
    }, {
      tag: 'gcontainer',
      class: 'vc-note-ctn'
    }, 'sattachhook.vc-dom-signal']
  });
};

BChart.prototype.normalizeData = function () {};

BChart.prototype.computeData = function () {
  this.computedData.notes = this.computeNotes();
};

BChart.prototype._createNote = function () {
  var thisC = this;
  this.$noteCtn.clearChild();
  this.$notes = this.computedData.notes.map(function (note) {
    var noteElt = _({
      tag: note.type === "rect" ? _RectNote.default : _StrokeNote.default,
      props: {
        color: note.color,
        text: note.text
      }
    });

    thisC.$noteCtn.addChild(noteElt);
    return noteElt;
  });
};

BChart.prototype._createTitle = function () {
  this.$title.firstChild.data = this.title || '';
};

BChart.prototype.createContent = function () {
  this.ready = true;

  this._createTitle();

  this._createNote();
};

BChart.prototype._updateNotesPosition = function () {
  var noteBoundWidth = this.$notes.reduce(function (ac, noteElt) {
    var box = noteElt.getBBox();
    return Math.max(ac, box.width);
  }, 0);
  var noteCtnMaxWidth = Math.max(this.box.width - this.contentPadding * 2, noteBoundWidth + 1);
  var x = 0;
  var y = 0;
  var pieceElt;

  for (var i = 0; i < this.$notes.length; ++i) {
    pieceElt = this.$notes[i];

    if (x + noteBoundWidth > noteCtnMaxWidth) {
      x = 0;
      y += 20;
    }

    pieceElt.box.setPosition(x, y);
    x += noteBoundWidth + 15;
  }

  var noteCtnBound = this.$noteCtn.getBBox();
  this.$noteCtn.box.setPosition(this.box.width / 2 - noteCtnBound.width / 2, this.box.height - this.contentPadding - noteCtnBound.height);
};

BChart.prototype._updateTitlePosition = function () {
  this.$title.attr({
    x: this.box.width / 2,
    y: 15
  });
};

BChart.prototype.updateBodyPosition = function () {
  var titleHeight = this.$title.getBBox().height;
  var top = this.contentPadding;
  if (titleHeight > 0) top += titleHeight + 10;
  this.$body.box.setPosition(this.contentPadding, top);
  this.$body.box.setSize(this.box.width - this.contentPadding * 2, this.$noteCtn.box.y - top - 10);
};

BChart.prototype.updateContentPosition = function () {
  this._updateTitlePosition();

  this._updateNotesPosition();

  this.updateBodyPosition();
};
/***
 *
 * @returns {{color: Color, text: string, type: ("stroke"|"rect")}[]}
 */


BChart.prototype.computeNotes = function () {
  return [];
};

BChart.prototype.updateContent = function () {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('updateContent');
    return;
  }

  this.normalizeData();
  this.computeData();
  this.createContent();
  this.updateContentPosition();
};

BChart.prototype.updateSize = function () {
  _SvgCanvas.default.prototype.updateSize.call(this);

  if (!this.ready) return;
  this.updateContentPosition();
};

BChart.property = {};
BChart.property.canvasWidth = {
  get: function () {
    return this.box.width;
  },
  set: function (value) {
    this.addStyle('width', value + 'px');
    this.updateSize();
  }
};
BChart.property.canvasHeight = {
  get: function () {
    return this.box.height;
  },
  set: function (value) {
    this.addStyle('height', value + 'px');
    this.updateSize();
  }
};
BChart.property.showInlineValue = {
  set: function (value) {
    if (value) {
      this.addClass('vc-show-inline-value');
    } else {
      this.removeClass('vc-show-inline-value');
    }
  },
  get: function () {
    return this.containsClass('vc-show-inline-value');
  }
};
BChart.eventHandler = {};
/***
 *
 * @type {ChartResizeBox}
 */

BChart.$resizebox = _ACore.default._({
  tag: _ChartResizeBox.default.tag
});

BChart.eventHandler.click2Resize = function () {
  if (this.resizable) if (!BChart.$resizebox.isAttached(this)) {
    BChart.$resizebox.attachTo(this);
    document.addEventListener('click', this.eventHandler.click2CancelResize);
  }
};

BChart.eventHandler.click2CancelResize = function (event) {
  if ((0, _EventEmitter.hitElement)(this, event)) return;
  if ((0, _EventEmitter.hitElement)(BChart.$resizebox, event)) return;
  if (BChart.$resizebox.isAfterMoving()) return;
  if (BChart.$resizebox.isAttached(this)) BChart.$resizebox.detach();
  document.removeEventListener('click', this.eventHandler.click2CancelResize);
};

_VCore.default.install(BChart);

var _default = BChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/VerticalChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/VerticalChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BChart = _interopRequireDefault(require("./BChart"));

var _VCore = _interopRequireDefault(require("./VCore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _helper = require("./helper");

var _Axis = _interopRequireDefault(require("./Axis"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/**
 * @extends BChart
 * @constructor
 */

function VerticalChart() {
  _BChart.default.call(this);

  this.oxColMargin = 10;
  this.oxColWidth = 17;
  this.computedData.min = 0;
  this.computedData.max = 10;
  this.computedData.paddingAxisBottom = 0;
  this.computedData.oyUpdated = false;
  this.computedData.oy = {};
  this.computedData.numberToFixed = 0;
  this.integerOnly = false;
  this.zeroOY = false;
  this.valueName = '';
  this.keyName = '';
  this.numberToString = null;
  /**
   *
   * @type {string[]}
   */

  this.keys = [];
  this.$oxLabelCtn = _('gcontainer.vc-ox-label-ctn');
  this.$oyValueCtn = _('gcontainer.vc-oy-value-ctn');
  this.$axisCtn = _('gcontainer.vc-axis-ctn');
  this.$whiteMask = _({
    tag: 'path',
    class: 'vc-white-mask',
    attr: {
      fill: 'white',
      stroke: 'white',
      'fill-rule': 'evenodd',
      d: 'M0,0  0,2000 2000,2000 2000,0zM100,0  0,200 200,200 200,0z'
    }
  });
  /**
   *
   * @type {Axis}
   */

  this.$axis = _('axis');
  this.$oxySpace = _('gcontainer.vc-oxy-space');
  /***
   *
   * @type {HSC}
   */

  this.$hscrollbar = _('hscrollbar').on('scroll', this.eventHandler.scrollOxySpace);
  this.$scrollArrow = _('scrollarrow').on('pressleft', this.eventHandler.scrollArrowsPressLeft).on('pressright', this.eventHandler.scrollArrowsPressRight);
  this.$scrollArrow.box.x = 10;
  this.$hscrollbar.height = 12;
  this.$valueName = _({
    tag: 'text',
    class: 'vc-value-name',
    attr: {
      y: 14,
      x: 5
    },
    child: {
      text: ''
    }
  });
  this.$keyName = _({
    tag: 'text',
    class: 'vc-key-name',
    attr: {
      y: 14,
      x: 5
    },
    child: {
      text: ''
    }
  });
  this.$oxySpace.addChild(this.$oxLabelCtn);
  this.$axisCtn.addChild(this.$oxySpace);
  this.$axisCtn.addChild(this.$whiteMask);
  this.$axisCtn.addChild(this.$axis);
  this.$axisCtn.addChild(this.$hscrollbar);
  this.$axisCtn.addChild(this.$scrollArrow);
  this.$axisCtn.addChild(this.$valueName);
  this.$axisCtn.addChild(this.$keyName);
  this.$oxLabels = [];
  this.$oyValues = [];
  this.$body.addChild(this.$axisCtn);
  this.$body.addChild(this.$oyValueCtn);
}

_OOP.default.mixClass(VerticalChart, _BChart.default);

VerticalChart.property = Object.assign({}, _BChart.default.property);
VerticalChart.eventHandler = Object.assign({}, _BChart.default.eventHandler);
VerticalChart.tag = 'VerticalChart'.toLowerCase();

VerticalChart.render = function () {
  return _BChart.default.render();
};

VerticalChart.prototype.computeMinMax = function () {
  this.computedData.min = 0;
  this.computedData.max = 10;
};
/***
 *
 * @param {Number}number
 * @returns {string}
 */


VerticalChart.prototype.numberToText = function (number) {
  return this.numberToString ? this.numberToString(number) : number.toFixed(this.computedData.numberToFixed);
};

VerticalChart.prototype.computeData = function () {
  _BChart.default.prototype.computeData.call(this);

  this.computeMinMax();

  if (this.computedData.min >= this.computedData.max) {
    this.computedData.min = 0;
    this.computedData.max = 10;
  }

  if (this.computedData.min === this.computedData.max) {
    this.computedData.max += 1;
  }

  if (this.zeroOY) this.computedData.min = Math.min(this.computedData.min, 0);
};

VerticalChart.prototype.mapOYValue = function (val) {
  return (0, _helper.map)(val, this.computedData.oy.minValue, this.computedData.oy.maxValue, 0, this.computedData.oyLength);
};

VerticalChart.prototype._computeOYSegment = function () {
  var oyLength = this.$body.box.height - 20 - 10 - this.computedData.paddingAxisBottom;
  var valueNameHeight = this.$valueName.getBBox().height;

  if (valueNameHeight > 0) {
    oyLength -= valueNameHeight + 5;
  }

  var segment = (0, _helper.calBeautySegment)(Math.floor(oyLength / 30), this.computedData.min, this.computedData.max, this.integerOnly);

  if (segment && segment.segmentCount < 30 && segment.segmentCount >= 1) {
    if (segment.step !== this.computedData.oy.step || segment.segmentCount !== this.computedData.oy.segmentCount || segment.maxValue !== this.computedData.oy.maxValue || segment.minValue !== this.computedData.oy.minValue) {
      this.computedData.oy = segment;
      this.computedData.oyUpdated = false;
      this.computedData.numberToFixed = 0;
      if (segment.step < 1) this.computedData.numberToFixed++;
      if (segment.step < 0.1) this.computedData.numberToFixed++;
      if (segment.step < 0.01) this.computedData.numberToFixed++;
      if (segment.step < 0.001) this.computedData.numberToFixed++;
      if (segment.step < 0.0001) this.computedData.numberToFixed++;
    }
  }

  this.computedData.oyLength = oyLength;
  this.computedData.oySegmentLength = oyLength / segment.segmentCount;
};

VerticalChart.prototype._createOxLabel = function () {
  var thisC = this;
  this.$oxLabelCtn.clearChild();
  this.$oxLabels = this.keys.map(function (key) {
    var labelElt = _({
      tag: 'text',
      class: 'vc-ox-label',
      attr: {
        y: 15
      },
      child: {
        text: key
      }
    });

    thisC.$oxLabelCtn.addChild(labelElt);
    return labelElt;
  });
  this.computedData.oxLabelMaxWidth = this.$oxLabels.reduce(function (ac, elt) {
    return Math.max(ac, elt.getBBox().width);
  }, 0);
  this.$valueName.firstChild.data = this.valueName || '';
  this.$keyName.firstChild.data = this.keyName || '';
};

VerticalChart.prototype._createOyValue = function () {
  this.computedData.oyUpdated = true;
  var segment = this.computedData.oy;
  var textElt;

  while (this.$oyValues.length < segment.segmentCount + 1) {
    textElt = _({
      tag: 'text',
      class: 'vc-oy-value',
      child: {
        text: '0'
      }
    });
    this.$oyValues.push(textElt);
    this.$oyValueCtn.addChild(textElt);
  }

  while (this.$oyValues.length > segment.segmentCount + 1) {
    textElt = this.$oyValues.pop();
    textElt.remove();
  }

  for (var i = 0; i < this.$oyValues.length; ++i) {
    this.$oyValues[i].firstChild.data = this.numberToText(segment.minValue + i * segment.step);
  }
};

VerticalChart.prototype.createContent = function () {
  _BChart.default.prototype.createContent.call(this);

  this._createOxLabel();
};

VerticalChart.prototype._updateLabelPosition = function () {
  this.$oxLabelCtn.box.y = this.$body.box.height = 15;
};

VerticalChart.prototype._updateOYValuePosition = function () {
  this._computeOYSegment();

  if (!this.computedData.oyUpdated) {
    this._createOyValue();
  }

  var y = this.$body.box.height - 20 + 6 - this.computedData.paddingAxisBottom;
  var valueElt;

  for (var i = 0; i < this.$oyValues.length; ++i) {
    valueElt = this.$oyValues[i];
    valueElt.attr({
      y: y,
      x: -10
    });
    y -= this.computedData.oySegmentLength;
  }

  var box = this.$oyValueCtn.getBBox();
  this.$oyValueCtn.box.x = Math.max(box.width + 10, this.$valueName.getBBox().width - 5);
};

VerticalChart.prototype.updateAxis = function () {
  var valueNameBox = this.$valueName.getBBox();
  var valueNameHeight = valueNameBox.height;
  var keyNameWidth = this.$keyName.getBBox().width;
  this.$axisCtn.box.setPosition(this.$oyValueCtn.box.x, 0);
  this.$axisCtn.box.setSize(this.$body.box.width - this.$oyValueCtn.box.x, this.$body.box.height - 20);
  this.$keyName.attr({
    y: this.$axisCtn.box.height - 10,
    x: this.$axisCtn.box.width
  });
  this.$whiteMask.attr('d', 'M-300 -300 H' + (this.$axisCtn.box.width + 100) + ' V' + (this.$axisCtn.box.height + 600) + 'H -300z' + 'M0 0 H ' + (this.$axisCtn.box.width - keyNameWidth) + ' V ' + (this.$axisCtn.box.height + 300) + ' H 0z');
  this.$axis.box.setPosition(0, this.$axisCtn.box.height);
  this.$axis.resize(this.$axisCtn.box.width - 8, this.$axisCtn.box.height - 5 - (valueNameHeight > 0 ? valueNameHeight + 5 : 0));
  this.$oxySpace.box.setPosition(0, this.$axisCtn.box.height);
  this.computedData.oxLength = this.$axisCtn.box.width - 1 - keyNameWidth;
  this.computedData.oyLength = this.$axisCtn.box.height - 15 - (valueNameHeight > 0 ? valueNameHeight + 5 : 0) - this.computedData.paddingAxisBottom;
  this.$hscrollbar.box.y = this.$axisCtn.box.height - this.$hscrollbar.height;

  if (!this.style.getPropertyValue('--vc-require-width')) {
    this.addStyle('--vc-require-width', this.$axisCtn.box.x + this.contentPadding + this.$keyName.getBBox().width + 50 + 'px');
    this.addStyle('--vc-require-height', this.box.height - this.$axisCtn.box.height + this.contentPadding * 2 + +this.computedData.paddingAxisBottom + this.$title.getBBox().height + 60 + 'px');
  }
};

VerticalChart.prototype._updateOxLabelPosition = function () {
  this.computedData.oxSegmentLength = this.computedData.oxLength / this.$oxLabels.length;
  this.computedData.oxSegmentLength = Math.max(this.oxColMargin + Math.max(this.oxColWidth, this.computedData.oxLabelMaxWidth), this.computedData.oxSegmentLength);
  var dx = this.computedData.oxSegmentLength;
  var x = this.computedData.oxSegmentLength / 2;

  for (var i = 0; i < this.$oxLabels.length; ++i) {
    this.$oxLabels[i].attr('x', x);
    x += dx;
  }

  this.computedData.oxScrollWidth = dx * this.$oxLabels.length - 1;
  this.computedData.oxOverFlow = this.computedData.oxScrollWidth > this.computedData.oxLength;
  this.$hscrollbar.outterWidth = this.computedData.oxLength;
  this.$hscrollbar.innerWidth = this.computedData.oxScrollWidth;
  this.$hscrollbar.width = this.computedData.oxLength;
  this.$hscrollbar.scrollLeft = Math.max(0, Math.min(this.$hscrollbar.scrollLeft, this.computedData.oxScrollWidth - this.computedData.oxLength));
  this.$oxySpace.box.x = -this.$hscrollbar.scrollLeft;

  if (this.computedData.oxOverFlow) {
    this.$scrollArrow.removeStyle('display');
    this.$scrollArrow.box.y = this.computedData.oyLength / 2;
    this.$scrollArrow.width = this.computedData.oxLength - 20;

    this._updateScrollArrowBtb();
  } else {
    this.$scrollArrow.addStyle('display', 'none');
  }

  this.$axis.oyDivision = this.computedData.oySegmentLength;
  this.$axis.updateOyDivision();
};

VerticalChart.prototype._updateScrollArrowBtb = function () {
  if (this.$hscrollbar.scrollLeft <= 0) {
    this.$scrollArrow.$left.addStyle('display', 'none');
  } else {
    this.$scrollArrow.$left.removeStyle('display');
  }

  if (this.$hscrollbar.scrollLeft >= this.$hscrollbar.innerWidth - this.$hscrollbar.outterWidth) {
    this.$scrollArrow.$right.addStyle('display', 'none');
  } else {
    this.$scrollArrow.$right.removeStyle('display');
  }
};

VerticalChart.prototype.updateBodyPosition = function () {
  _BChart.default.prototype.updateBodyPosition.call(this);

  this._updateOYValuePosition();

  this.updateAxis();

  this._updateOxLabelPosition();
};

VerticalChart.eventHandler.scrollOxySpace = function () {
  this.$oxySpace.box.x = -this.$hscrollbar.scrollLeft;

  this._updateScrollArrowBtb();
};

VerticalChart.eventHandler.scrollArrowsPressLeft = function () {
  this.$hscrollbar.scrollLeft -= 10;
  this.eventHandler.scrollOxySpace();
};

VerticalChart.eventHandler.scrollArrowsPressRight = function () {
  this.$hscrollbar.scrollLeft += 10;
  this.eventHandler.scrollOxySpace();
};

_VCore.default.install(VerticalChart);

var _default = VerticalChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/RangeChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/RangeChart.js ***/
"use strict";

require("./style/rangechart.css");

var _VCore = _interopRequireDefault(require("./VCore"));

var _helper = require("./helper");

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));

var _BChart = _interopRequireDefault(require("./BChart"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _VerticalChart = _interopRequireDefault(require("./VerticalChart"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends BChart
 * @constructor
 */

function RangeChart() {
  /** default config**/
  this.valuePlotRadius = 10;
  this.minKeyWidth = 90;
  this.maxKeyWidthRatio = 1.5;
  this.limitLineLength = 40;
  this.lineHeight = 22;

  _BChart.default.call(this);

  this.contentPadding = 0;
  /** data **/

  this.integerOnly = false;
  this.zeroOY = false;
  this.ranges = [];
  this.valueName = '';
  this.keyName = '';
  this.maxText = 'Maximum';
  this.minText = 'Minimum';
  this.midText = 'Median';
  this.normalText = 'Normal';
  this.numberToString = null;
  this.createStatic();
  this.$oyValueCtn = $('gcontainer.vc-oy-value-ctn', this);
  this.$rangeCtn = $('.vc-range-ctn', this);
  this.$whiteMask = $('.vc-white-mask', this);
  this.$axisCtn = $('gcontainer.vc-axis-ctn', this);
  this.$axis = $('axis', this);
  this.$oxTable = $('gcontainer.vc-ox-table', this);
  this.$oxLabelCtn = $('gcontainer.vc-ox-label-ctn', this);
  this.$oxValueCtn = $('gcontainer.vc-ox-value-ctn', this);
  this.$valueName = $('text.vc-value-name', this);
  this.$keyName = $('text.vc-key-name', this);
  this.$oxySpace = $('.vc-oxy-space', this);
  this.$oyValues = [];
  /***
   *
   * @type {ScrollArrow}
   */

  this.$scrollArrow = $('scrollarrow', this).on('pressleft', this.eventHandler.scrollArrowsPressLeft).on('pressright', this.eventHandler.scrollArrowsPressRight);
  this.$hscrollbar = $('hscrollbar', this).on('scroll', this.eventHandler.scrollOxySpace);
  this.$hscrollbar.height = 12;
  this.$hscrollbar.box.y = -11;
  this.sync = new Promise(function (resolve) {
    this.$attachhook.once('attached', resolve);
  }.bind(this));
}

_OOP.default.mixClass(RangeChart, _BChart.default);

RangeChart.property = Object.assign({}, _VerticalChart.default.property);
RangeChart.eventHandler = Object.assign({}, _VerticalChart.default.eventHandler);
RangeChart.tag = 'RangeChart'.toLowerCase();

RangeChart.render = function () {
  return _BChart.default.render().addClass('range-chart').addClass('vc-range-chart');
};

RangeChart.prototype.createStatic = function () {
  _({
    elt: this.$body,
    child: [{
      tag: 'gcontainer',
      class: 'vc-axis-ctn',
      child: [{
        tag: 'gcontainer',
        class: 'vc-oxy-space',
        child: [{
          tag: 'gcontainer',
          class: 'vc-ox-table',
          child: ['gcontainer.vc-ox-label-ctn', 'gcontainer.vc-ox-value-ctn']
        }, {
          tag: 'gcontainer',
          class: 'vc-range-ctn'
        }]
      }, {
        tag: 'path',
        class: 'vc-white-mask',
        attr: {
          fill: 'white',
          stroke: 'white',
          'fill-rule': 'evenodd',
          d: 'M0,0  0,2000 2000,2000 2000,0zM100,0  0,200 200,200 200,0z'
        }
      }, 'gcontainer.vc-oy-value-ctn', 'axis', {
        tag: 'text',
        class: 'vc-value-name',
        attr: {
          y: 14,
          x: 5
        },
        child: {
          text: ''
        }
      }, {
        tag: 'text',
        class: 'vc-key-name',
        attr: {
          y: 14,
          x: 5
        },
        child: {
          text: ''
        }
      }, 'scrollarrow', 'hscrollbar']
    }]
  });
};

RangeChart.prototype.normalizeData = function () {
  this.ranges.some(function (range) {
    if ((0, _helper.isNumber)(range.min) && (0, _helper.isNumber)(range.max)) {
      if (range.min > range.max) {
        console.error(range, "Violation: min > max");
        return true;
      } else {
        if ((0, _helper.isNumber)(range.mid)) {
          if (range.mid < range.min || range.mid > range.max) {
            console.error(range, "Violation: mid < min or mid > max");
            return true;
          }
        }
      }
    }

    return false;
  });
};

RangeChart.prototype.computeData = function () {
  // this.computedData
  this.computedData.hasMidValue = this.ranges.some(function (range) {
    return (0, _helper.isNumber)(range.mid);
  });
  this.computedData.hasNormalValue = this.ranges.some(function (range) {
    return (0, _helper.isNumber)(range.normal);
  });
  this.computedData.max = this.ranges.reduce(function (ac, range) {
    if ((0, _helper.isNumber)(range.max)) ac = Math.max(ac, range.max);
    if ((0, _helper.isNumber)(range.mid)) ac = Math.max(ac, range.mid);
    if ((0, _helper.isNumber)(range.min)) ac = Math.max(ac, range.min);
    if ((0, _helper.isNumber)(range.normal)) ac = Math.max(ac, range.normal);
    return ac;
  }, -Infinity);
  this.computedData.min = this.ranges.reduce(function (ac, range) {
    if ((0, _helper.isNumber)(range.max)) ac = Math.min(ac, range.max);
    if ((0, _helper.isNumber)(range.mid)) ac = Math.min(ac, range.mid);
    if ((0, _helper.isNumber)(range.min)) ac = Math.min(ac, range.min);
    if ((0, _helper.isNumber)(range.normal)) ac = Math.min(ac, range.normal);
    return ac;
  }, Infinity);

  if (this.computedData.min > this.computedData.max) {
    this.computedData.min = 0;
    this.computedData.max = 10;
  }

  if (this.zeroOY) {
    this.computedData.min = 0;
  }

  if (this.computedData.min === this.computedData.max) {
    this.computedData.max += 1;
  }
};

RangeChart.prototype.mapOYValue = _VerticalChart.default.prototype.mapOYValue;

RangeChart.prototype._computeOYSegment = function () {
  var res = false;
  var segment = (0, _helper.calBeautySegment)(Math.floor(this.$axisCtn.box.height / 50), this.computedData.min, this.computedData.max, this.integerOnly);

  if (segment && segment.segmentCount < 30) {
    //error
    if (!this.computedData.oy || segment.step !== this.computedData.oy.step || segment.segmentCount !== this.computedData.oy.segmentCount || segment.maxValue !== this.computedData.oy.maxValue || segment.minValue !== this.computedData.oy.minValue) {
      this.computedData.oy = segment;
      this.computedData.oyUpdated = false;
      this.computedData.numberToFixed = 0;
      if (segment.step < 1) this.computedData.numberToFixed++;
      if (segment.step < 0.1) this.computedData.numberToFixed++;
      if (segment.step < 0.01) this.computedData.numberToFixed++;
      if (segment.step < 0.001) this.computedData.numberToFixed++;
      if (segment.step < 0.0001) this.computedData.numberToFixed++;
      res = true;
    }
  }

  this.computedData.oySegmentLength = this.$axisCtn.box.height / segment.segmentCount;
  return res;
};

RangeChart.prototype._createNote = function () {
  var ctn = this.$noteCtn.clearChild();
  var y0 = this.lineHeight / 2 + 1;
  var labelX = this.limitLineLength + 10;
  ctn.$maxLine = this._createLimitLine(0, y0, this.limitLineLength, 'max').addTo(ctn);
  ctn.$maxText = (0, _helper.text)(this.maxText, labelX, y0 + 5).addTo(ctn);
  y0 += this.lineHeight;

  if (this.computedData.hasMidValue) {
    this._createLimitLine(0, y0, this.limitLineLength, 'mid').addTo(ctn);

    (0, _helper.text)(this.midText, labelX, y0 + 5).addTo(ctn);
    y0 += this.lineHeight;
  }

  ctn.$minLine = this._createLimitLine(0, y0, this.limitLineLength, 'min').addTo(ctn);
  ctn.$minText = (0, _helper.text)(this.minText, labelX, y0 + 5).addTo(ctn);

  if (this.computedData.hasNormalValue) {
    y0 += this.lineHeight;

    if (this.ranges[0].normal !== undefined) {
      (0, _helper.circle)(this.limitLineLength / 2, y0, this.valuePlotRadius, 'range-chart-value-plot').addTo(ctn);
      (0, _helper.text)(this.normalText, labelX, y0 + 5).addTo(ctn);
    }
  }

  y0 += this.lineHeight / 2;
  ctn.box.setSize(ctn.getBBox().width + 7, y0);
};

RangeChart.prototype._updateNotesPosition = function () {
  var box = this.$noteCtn.box;
  this.$noteCtn.box.setPosition(this.contentPadding, this.box.height - box.height - this.contentPadding);
};

RangeChart.prototype.createOxTable = function () {
  var thisC = this;
  this.$oxValueCtn.clearChild();
  var hasMidValue = this.computedData.hasMidValue;
  var hasNormalValue = this.computedData.hasNormalValue;
  var maxValueWidth = 0;
  this.$oxRangeCols = this.ranges.map(function (range, i, arr) {
    var ctn = _({
      tag: _GContainer.default.tag
    });

    thisC.$oxValueCtn.addChild(ctn);
    var maxText = '"';
    var midText = '"';
    var minText = '"';
    var normalText = '"';
    var y0 = 17;
    if ((0, _helper.isNumber)(range.max)) maxText = thisC.numberToText(range.max);
    ctn.$maxText = _({
      tag: 'text',
      attr: {
        x: 0,
        y: y0
      },
      child: {
        text: maxText
      }
    });
    ctn.addChild(ctn.$maxText);
    y0 += thisC.lineHeight;

    if (hasMidValue) {
      if ((0, _helper.isNumber)(range.mid)) midText = thisC.numberToText(range.mid);
      ctn.$midText = _({
        tag: 'text',
        attr: {
          x: 0,
          y: y0
        },
        child: {
          text: midText
        }
      });
      ctn.addChild(ctn.$midText);
      y0 += thisC.lineHeight;
    }

    if ((0, _helper.isNumber)(range.min)) minText = thisC.numberToText(range.min);
    ctn.$minText = _({
      tag: 'text',
      attr: {
        x: 0,
        y: y0
      },
      child: {
        text: minText
      }
    });
    ctn.addChild(ctn.$minText);

    if (hasNormalValue) {
      y0 += thisC.lineHeight;
      if ((0, _helper.isNumber)(range.normal)) normalText = thisC.numberToText(range.normal);
      ctn.$normalText = _({
        tag: 'text',
        attr: {
          x: 0,
          y: y0
        },
        child: {
          text: normalText
        }
      });
      ctn.addChild(ctn.$normalText);
    }

    y0 += thisC.lineHeight / 2 - 5;
    var textWidth = ctn.getBBox().width;
    ctn.box.setSize(textWidth, y0);
    maxValueWidth = Math.max(maxValueWidth, textWidth);
    return ctn;
  });
  this.computedData.maxValueWidth = maxValueWidth;
  if (this.$oxRangeCols.length > 0) this.$oxValueCtn.box.height = this.$oxRangeCols[0].box.height;
};

RangeChart.prototype.createOxLabel = function () {
  var lineHeight = this.lineHeight;
  var ctn = this.$oxLabelCtn;
  var keyLimitWidth = Math.max(this.minKeyWidth, this.computedData.maxValueWidth * this.maxKeyWidthRatio);
  var keyMaxWidth = 0;
  ctn.clearChild();
  this.$oxLabels = this.ranges.map(function (range) {
    var lines = (0, _helper.wrapToLines)(range.name, 14, keyLimitWidth);
    if (lines.length < 2) lines = [];else lines = lines.map(function (line, i) {
      return {
        tag: 'text',
        class: 'vc-range-chart-label-line',
        attr: {
          x: '0',
          y: 17 + i * lineHeight + ''
        },
        child: {
          text: line
        }
      };
    });

    var labelBlock = _({
      tag: _GContainer.default.tag,
      child: [{
        tag: 'text',
        attr: {
          x: '0',
          y: 17
        },
        class: lines.length >= 2 ? 'vc-range-chart-label-full' : 'vc-range-chart-label',
        child: {
          text: range.name
        }
      }].concat(lines)
    }).addTo(ctn);

    keyMaxWidth = Math.max(keyMaxWidth, labelBlock.getBBox().width);
    return labelBlock;
  });
  this.computedData.keyMaxWidth = keyMaxWidth;
};

RangeChart.prototype.createAxisName = function () {
  this.$valueName.firstChild.data = this.valueName;
  this.computedData.valueNameWidth = this.$valueName.getBBox().width;
  this.$keyName.firstChild.data = this.keyName;
  this.computedData.keyNameWidth = this.$keyName.getBBox().width;
};

RangeChart.prototype.updateAxisX = function () {
  this.$axisCtn.box.x = Math.max(this.computedData.valueNameWidth, this.computedData.maxValueWidth + 5, this.$noteCtn.box.width);
  this.$axisCtn.box.width = this.$body.box.width - this.$axisCtn.box.x - 7 - this.computedData.keyNameWidth;
  this.$axis.resize(this.$axisCtn.box.width + this.computedData.keyNameWidth, 10);
  this.$keyName.attr('x', this.$axisCtn.box.width + 7 + this.computedData.keyNameWidth);
  this.$hscrollbar.width = this.$axisCtn.box.width;
  this.$hscrollbar.outterWidth = this.$axisCtn.box.width;
};

RangeChart.prototype.updateOxTablePosition = function () {
  var requireMinWidth = (Math.max(this.computedData.keyMaxWidth, this.computedData.maxValueWidth) + 10) * this.ranges.length;
  var colWidth = Math.max(this.computedData.maxValueWidth + 10, this.$axisCtn.box.width / this.ranges.length);
  this.computedData.oxLabelWrap = requireMinWidth > this.$axisCtn.box.width;

  if (this.computedData.oxLabelWrap) {
    this.addClass('vc-ox-label-wrap');
  } else {
    this.removeClass('vc-ox-label-wrap');
  }

  colWidth = this.$oxLabels.reduce(function (ac, labelBlock) {
    return Math.max(ac, labelBlock.getBBox().width + 10);
  }, colWidth);
  this.$oxLabelCtn.box.height = this.$oxLabelCtn.getBBox().height + 5;
  this.$oxValueCtn.box.y = this.$oxLabelCtn.box.height;
  this.$oxValueCtn.box.height = this.$noteCtn.box.height;
  this.$oxLabels.forEach(function (labelBlock, i) {
    labelBlock.box.x = colWidth * (i + 0.5);
  }, 0);
  this.$oxRangeCols.forEach(function (colElt, i) {
    colElt.box.x = colWidth * (i + 0.5) + colElt.box.width / 2;
  }, 0);
  this.$oxTable.box.width = colWidth * this.ranges.length;
  this.$oxTable.box.height = this.$oxLabelCtn.box.height + this.$oxValueCtn.box.height;
  this.$axisCtn.box.y = this.$noteCtn.box.y - this.$body.box.y - this.$oxLabelCtn.box.height;
  this.$axisCtn.box.height = this.$axisCtn.box.y - 20;
  this.$scrollArrow.width = this.$axisCtn.box.width - 10;
  this.$scrollArrow.box.setPosition(5, -this.$axisCtn.box.height / 2);
  this.computedData.collWidth = colWidth;
  this.computedData.oyLength = this.$axisCtn.box.height;
  this.$hscrollbar.innerWidth = this.$oxTable.box.width;

  this._updateScrollArrowBtb();

  if (!this.style.getPropertyValue('--vc-require-width')) {
    this.addStyle('--vc-require-width', this.$axisCtn.box.x + this.contentPadding + this.$keyName.getBBox().width + 50 + 'px');
    this.addStyle('--vc-require-height', this.box.height - this.$axisCtn.box.height + this.contentPadding * 2 + this.$title.getBBox().height + 60 + 'px');
  }

  ;
};

RangeChart.prototype.updateAxisY = function () {
  this.$axis.resize(this.$axisCtn.box.width + this.computedData.keyNameWidth, this.$axisCtn.box.height + 10);
  this.$valueName.attr('y', -this.$axisCtn.box.height - 22);
  this.$whiteMask.attr('d', 'M' + (-this.$axisCtn.box.x - this.$body.box.x - 1) + ' ' + (-this.$axisCtn.box.y - this.$body.box.y) + ' h' + (this.box.width + 2) + 'v' + this.box.height + 'h' + (-this.box.width - 2) + 'z' + 'M0 ' + (-this.$axisCtn.box.height - 10) + 'h ' + this.$axisCtn.box.width + 'v' + (this.$axisCtn.box.height + this.$oxTable.box.height + 10) + ' H 0z');
};

RangeChart.prototype._updateScrollArrowBtb = _VerticalChart.default.prototype._updateScrollArrowBtb;
RangeChart.prototype._createOyValue = _VerticalChart.default.prototype._createOyValue;

RangeChart.prototype._updateOYValuePosition = function () {
  this._computeOYSegment();

  if (!this.computedData.oyUpdated) {
    this._createOyValue();
  }

  var y = 0;
  var valueElt;

  for (var i = 0; i < this.$oyValues.length; ++i) {
    valueElt = this.$oyValues[i];
    valueElt.attr({
      y: y + 5,
      x: -10
    });
    y -= this.computedData.oySegmentLength;
  }

  this.$axis.oyDivision = this.computedData.oySegmentLength;
  this.$axis.updateOyDivision();
};

RangeChart.prototype.createRanges = function () {
  var ctn = this.$rangeCtn;
  ctn.clearChild();
  this.$ranges = this.ranges.map(function (range) {
    return this._createRange(range).addTo(ctn);
  }.bind(this));
};

RangeChart.prototype.updateRangesPosition = function () {
  var colWidth = this.computedData.collWidth;
  var thisC = this;
  this.$ranges.forEach(function (rangeElt, i) {
    var range = thisC.ranges[i];
    rangeElt.box.x = colWidth * (i + 0.5);
    var yMin, yMax, yMid, yNormal;

    if ((0, _helper.isNumber)(range.min) && rangeElt.$minLine) {
      yMin = -thisC.mapOYValue(range.min);
      (0, _helper.moveHLine)(rangeElt.$minLine, -thisC.limitLineLength / 2, yMin, thisC.limitLineLength);
    }

    if ((0, _helper.isNumber)(range.max) && rangeElt.$maxLine) {
      yMax = -thisC.mapOYValue(range.max);
      (0, _helper.moveHLine)(rangeElt.$maxLine, -thisC.limitLineLength / 2, yMax, thisC.limitLineLength);
    }

    if ((0, _helper.isNumber)(range.mid) && rangeElt.$midLine) {
      yMid = -thisC.mapOYValue(range.mid);
      (0, _helper.moveHLine)(rangeElt.$midLine, -thisC.limitLineLength / 2, yMid, thisC.limitLineLength);
    }

    if ((0, _helper.isNumber)(range.normal) && rangeElt.$plot) {
      yNormal = -thisC.mapOYValue(range.normal);
      rangeElt.$plot.attr('cy', yNormal);
    }

    if ((0, _helper.isNumber)(range.min) && (0, _helper.isNumber)(range.max)) {
      rangeElt.$rect.attr({
        x: -thisC.limitLineLength / 2,
        y: yMax,
        height: yMin - yMax,
        width: thisC.limitLineLength
      });
    }
  });
};

RangeChart.prototype.createContent = function () {
  _BChart.default.prototype.createContent.call(this);

  this.createOxTable();
  this.createOxLabel();
  this.createAxisName();
  this.createRanges();
};

RangeChart.prototype.updateBodyPosition = function () {
  _BChart.default.prototype.updateBodyPosition.call(this);

  this.updateAxisX();
  this.updateOxTablePosition();
  this.updateAxisY();

  this._updateOYValuePosition();

  this.updateRangesPosition();
};

RangeChart.prototype._createLimitLine = function (x, y, length, eClss) {
  return (0, _helper.hline)(x, y, length, ['range-chart-limit-line'].concat(eClss ? [eClss] : []));
};

RangeChart.prototype.numberToText = _VerticalChart.default.prototype.numberToText;
/***
 *
 * @param range
 * @return {GContainer}
 * @private
 */

RangeChart.prototype._createRange = function (range) {
  var res = _({
    tag: _GContainer.default.tag
  });

  if ((0, _helper.isNumber)(range.max) && (0, _helper.isNumber)(range.min)) res.$rect = _('rect.vc-range-rect').addTo(res);
  if ((0, _helper.isNumber)(range.max)) res.$maxLine = this._createLimitLine(-this.limitLineLength / 2, 0, this.limitLineLength, 'max').addTo(res);
  if ((0, _helper.isNumber)(range.mid)) res.$midLine = this._createLimitLine(-this.limitLineLength / 2, 0, this.limitLineLength, 'mid').addTo(res);
  if ((0, _helper.isNumber)(range.min)) res.$minLine = this._createLimitLine(-this.limitLineLength / 2, 0, this.limitLineLength, 'min').addTo(res);
  if ((0, _helper.isNumber)(range.normal)) res.$plot = (0, _helper.circle)(0, 0, this.valuePlotRadius, 'range-chart-value-plot').addTo(res);
  return res;
};

_VCore.default.install(RangeChart);

_VCore.default.install('ostickchart', function () {
  return _('rangechart.base-chart.o-stick-chart', true);
});
};

moduleFactories["node_modules/absol-vchart/src/AssessmentChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/AssessmentChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./style/assessmentchart.css");

var _helper = require("./helper");

var _VCore = _interopRequireDefault(require("./VCore"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _template = require("./template");

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _BChart = _interopRequireDefault(require("./BChart"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 *
 * @extends BChart
 * @constructor
 */

function AssessmentChart() {
  _BChart.default.call(this);

  this.rangePlotRadius = 5;
  this.rangeFillColor = null;
  this.rangeFillColor = null;
  this.rangeMaxStrokeColor = _Color.default.parse('rgba(255, 150, 0, 0.3)');
  this.rangeMinStrokeColor = _Color.default.parse('rgba(200, 200, 0, 0.3)');
  /**
   *
   * @type {{values:number[], name: string, stroke: Color|string, fill:Color|string, color:Color|string}[]}
   */

  this.areas = [];
  this.ranges = [];
  /***
   *
   * @type {string[]}
   */

  this.keys = [];
  this.levels = [];
  /***
   *
   * @type {null|[]}
   */

  this.axisWeight = null;
  /***
   *
   * @type {GContainer}
   */

  this.$netCtn = _('gcontainer.vc-assessment-net-ctn');
  this.$netCtn = _('gcontainer.vc-assessment-net-ctn');
  this.$body.addChild(this.$netCtn);
  this.$netCtn.box.setPosition(200, 200);
  this.$axisCnt = _('gcontainer.vc-assessment-axis-ctn');
  this.$levelValueCnt = _('gcontainer.vc-assessment-axis-level-ctn');
  this.$levelCnt = _('gcontainer.vc-assessment-level-ctn');
  this.$areaCtn = _('gcontainer.vc-assessment-area-ctn');
  this.$rangeCtn = _('gcontainer.vc-assessment-range-ctn');
  this.$netCtn.addChild(this.$levelCnt);
  this.$netCtn.addChild(this.$axisCnt);
  this.$netCtn.addChild(this.$rangeCtn);
  this.$netCtn.addChild(this.$areaCtn);
  this.$netCtn.addChild(this.$levelValueCnt);
}

_OOP.default.mixClass(AssessmentChart, _BChart.default);

AssessmentChart.property = Object.assign({}, _BChart.default.property);
AssessmentChart.eventHandler = Object.assign({}, _BChart.default.eventHandler);
AssessmentChart.tag = 'AssessmentChart'.toLowerCase();

AssessmentChart.render = function () {
  return _BChart.default.render().addClass('vc-assessment-chart');
};

AssessmentChart.prototype.normalizeData = function () {
  var thisC = this; // fill: area.fill || this.autoColor(i, 0.3),
  //     stroke: area.stroke || this.autoColor(i, 0.8),

  this.areas.forEach(function (area, i) {
    var color = area.color || area.stroke || area.fill || thisC.autoColor(i);
    color = _Color.default.parse(color + '');
    color.rgba[3] = 1;
    var strokeColor = color.clone();
    strokeColor.rgba[3] = 0.8;
    var filColor = color.clone();
    filColor.rgba[3] = 0.3;

    if (area.color) {
      area.fill = area.fill || filColor;
      area.stroke = area.stroke || strokeColor;
    } else {
      if (area.stroke) {
        area.fill = area.fill || 'none';
      } else if (area.fill) {
        area.stroke = area.stroke || 'none';
      } else {
        area.fill = filColor;
        area.stroke = strokeColor;
      }

      area.color = color;
    }
  });
};

AssessmentChart.prototype.computeNotes = function () {
  return this.areas.map(function (area) {
    return {
      type: 'stroke',
      color: area.color,
      text: area.name
    };
  });
};

AssessmentChart.prototype._createAxis = function () {
  this.$axisCnt.clearChild();
  this.$axisLines = this.keys.map(function (u, i) {
    var res = _('hlinearrow');

    res.resize(200);
    res.attr('transform', (0, _template.rotate)(-90 + i * 360 / this.keys.length));
    res.addTo(this.$axisCnt);
    return res;
  }.bind(this));
  this.$axisNames = this.keys.map(function (key, i, arr) {
    var anchor = 'start';
    if (i === 0 || i === arr.length / 2) anchor = 'middle';else if (i > arr.length / 2) anchor = 'end';
    return _({
      tag: 'text',
      attr: {
        x: 0,
        y: 0
      },
      style: {
        textAnchor: anchor
      },
      child: {
        text: key
      }
    }).addTo(this.$axisCnt);
  }.bind(this));
  this.$levelCnt.clearChild();
  this.$levels = this.levels.map(function (level, i, levels) {
    return _('path.vc-assessment-chart-level' + (i + 1 == levels.length ? '.last' : '')).addTo(this.$levelCnt);
  }.bind(this));
  this.computedData.axisNameSize = this.$axisNames.map(function (elt) {
    var box = elt.getBBox();
    return {
      width: box.width,
      height: box.height
    };
  });
  this.$levelValueCnt.clearChild();
  this.$levelValues = this.levels.map(function (level) {
    return this._createLevelValue(level).addTo(this.$levelValueCnt);
  }.bind(this));
};

AssessmentChart.prototype._createAreas = function () {
  this.$areaCtn.clearChild();
  this.$areas = this.areas.map(function (area, i, arr) {
    return _('path.vc-assessment-chart-area').addTo(this.$areaCtn).addStyle({
      fill: area.fill,
      stroke: area.stroke
    });
  }.bind(this));
};

AssessmentChart.prototype._createRanges = function () {
  this.$rangeCtn.clearChild();

  if (this.ranges && this.ranges.length > 0) {
    this.$rangeArea = _('shape.vc-assessment-chart-range-area').addStyle('fill-rule', "evenodd").addTo(this.$rangeCtn);

    if (this.rangeFillColor) {
      var rangeFillColor = _Color.default.parse(this.rangeFillColor + '');

      rangeFillColor.rgba[3] = 0.3;
      this.$rangeArea.addStyle({
        fill: rangeFillColor.toString()
      });
    }

    this.$ranges = this.ranges.map(function (range, i, arr) {
      return this._createRangeLine().addTo(this.$rangeCtn);
    }.bind(this));
    this.$rangeMax = _('shape.vc-assessment-chart-range-area-stroke').addTo(this.$rangeCtn).addStyle({
      stroke: this.rangeMaxStrokeColor || 'rgba(255, 150, 0, 0.3)'
    });
    this.$rangeMin = _('shape.vc-assessment-chart-range-area-stroke').addTo(this.$rangeCtn).addStyle({
      stroke: this.rangeMinStrokeColor || 'rgba(200, 200, 0, 0.3)'
    });
  }
};

AssessmentChart.prototype.createContent = function () {
  _BChart.default.prototype.createContent.call(this);

  this._createAxis();

  this._createRanges();

  this._createAreas();
};

AssessmentChart.prototype._createLevelValue = function (value) {
  var res = _('gcontainer.vc-assessment-chart-level-value');

  res.$bound = (0, _helper.rect)(0, -6, 0, 13).attr({
    rx: '4',
    ry: '4'
  }).addTo(res);
  res.$text = (0, _helper.text)(value + '', 0, 4).attr({
    'text-anchor': 'middle'
  }).addTo(res);
  if (value === '' || value === undefined || value === null) res.addStyle('visibility', 'hidden');
  return res;
};

AssessmentChart.prototype.autoColor = function (index, alpha) {
  var hsla = [index / this.areas.length, 0.8, 0.5, alpha === undefined ? 1 : alpha];

  var c = _Color.default.fromHSLA(hsla[0], hsla[1], hsla[2], hsla[3]);

  return c.toString('rgba');
};

AssessmentChart.prototype.mapAngle = function (i, deg) {
  return (-90 + i * 360 / this.keys.length) * (deg ? 1 : Math.PI / 180);
};

AssessmentChart.prototype.mapRadius = function (level) {
  return this.computedData.axisLength * (level / (this.levels.length - 1));
};

AssessmentChart.prototype.mapLevel = function (value) {
  if (this.isMappingLevel) {
    if (value < this.levelMappingArray[0]) return (0, _helper.map)(value, this.levelMappingArray[0], this.levelMappingArray[1], 0, 1);
    if (value > this.levelMappingArray[this.levels.length - 1]) return (0, _helper.map)(value, this.levelMappingArray[this.levels.length - 2], this.levelMappingArray[this.levels.length - 1], 0, 1);

    for (var i = 1; i < this.levels.length; ++i) {
      if (value >= this.levelMappingArray[i - 1] && value <= this.levelMappingArray[i]) return (0, _helper.map)(value, this.levelMappingArray[i - 1], this.levelMappingArray[i], i - 1, i);
    }
  } else {
    return value;
  }
};

AssessmentChart.prototype._createRangeLine = function () {
  var res = _({
    tag: 'g',
    class: 'vc-assessment-chart-range-segment'
  });

  res.$min = (0, _helper.circle)(0, 0, this.rangePlotRadius, 'vc-assessment-chart-range-plot').addTo(res);
  res.$max = (0, _helper.circle)(0, 0, this.rangePlotRadius, 'vc-assessment-chart-range-plot').addTo(res);
  res.$line = _('path.vc-assessment-chart-range-line').addTo(res);
  return res;
};
/**
 * @param {Array<Rectangle>} rects
 * @returns {Rectangle}
 */


AssessmentChart.prototype._expectSize = function (rects, r) {
  var cr = new _Rectangle.default(0, 0, 0, 0);
  var rect;

  for (var i = 0; i < rects.length; ++i) {
    var angle = Math.PI * 2 * i / rects.length - Math.PI / 2;
    rect = rects[i];

    if (i == 0) {
      rect.x = rect.width / 2;
      rect.y = -rect.height - r - 7;
    } else if (rects.length % 4 == 0 && i == rects.length >> 2) {
      rect.x = r;
      rect.y = rect.height / 2;
    } else if (rects.length % 4 == 0 && i == (rects.length >> 2) * 3) {
      rect.x = -r - rect.width;
      rect.y = rect.height / 2;
    } else if (rects.length % 2 == 0 && i == rects.length >> 1) {
      rect.x = rect.width / 2;
      rect.y = r + 7;
    } else if (i < rects.length / 4) {
      rect.x = r * Math.cos(angle);
      rect.y = r * Math.sin(angle) - rect.height;
    } else if (i < rects.length / 2) {
      rect.x = r * Math.cos(angle);
      rect.y = r * Math.sin(angle);
    } else if (i < rects.length / 4 * 3) {
      rect.x = r * Math.cos(angle) - rect.width;
      rect.y = r * Math.sin(angle);
    } else {
      rect.x = r * Math.cos(angle) - rect.width;
      rect.y = r * Math.sin(angle) - rect.height;
    }

    cr = cr.merge(rect);
  }

  return cr;
};

AssessmentChart.prototype._computedNetSize = function () {
  var rects = this.computedData.axisNameSize.map(function (box) {
    return new _Rectangle.default(0, 0, box.width, box.height);
  });
  var aWidth = this.$body.box.width;
  var aHeight = this.$body.box.height;
  var maxR = Math.min(aWidth, this.$body.box.height) / 2;
  var minR = 20; //

  while (maxR - minR > 3) {
    var midR = (minR + maxR) / 2;

    var size = this._expectSize(rects, midR);

    if (size.width < aWidth && size.height < aHeight) {
      minR = midR;
    } else {
      maxR = midR;
    }
  }

  this.computedData.expectedSize = this._expectSize(rects, minR);
  this.computedData.expectedRadius = minR;
  this.computedData.axisLength = this.computedData.expectedRadius - 30;
};

AssessmentChart.prototype._updateAxisPosition = function () {
  var axisLength = this.computedData.axisLength;
  this.$axisLines.forEach(function ($axisLine) {
    $axisLine.resize(axisLength + 20);
  }.bind(this));

  if (this.axisWeight && this.axisWeight.forEach) {
    this.axisWeight.forEach(function (value, i) {
      var axisLineElt = this.$axisLines[i];

      if (axisLineElt) {
        if (value >= 0) {
          axisLineElt.addStyle('strokeWidth', value + '');
        } else {
          axisLineElt.remove('strokeWidth');
        }
      }
    }.bind(this));
  }

  this.$axisNames.forEach(function ($axisName, i) {
    var angle = (-90 + i * 360 / this.keys.length) * Math.PI / 180;
    var x = (axisLength + 30) * Math.cos(angle);
    var y = (axisLength + 30) * Math.sin(angle) + 5;

    if (this.keys.length % 2 == 0 && i == this.keys.length >> 1) {
      y += 7;
    } else if (i == 0) {
      y -= 7;
    }

    $axisName.attr({
      x: x,
      y: y
    });
  }.bind(this));
  this.$levels.forEach(function ($level, level) {
    var points = this.keys.reduce(function (ac, value, i) {
      var angle = this.mapAngle(i);
      var x = this.mapRadius(level) * Math.cos(angle);
      var y = this.mapRadius(level) * Math.sin(angle);
      ac.push(x + ' ' + y);
      return ac;
    }.bind(this), []);
    var d = 'M' + points.join('L') + 'Z';
    $level.attr('d', d);
  }.bind(this));
  var levelValueWidth = this.$levelValues.reduce(function (w, $levelValue) {
    return Math.max(w, $levelValue.$text.getBBox().width + 4);
  }, 0);

  if (this.mapRadius(1) - this.mapRadius(0) > 13) {
    this.$levelValues.forEach(function ($levelValue, i) {
      $levelValue.$bound.attr({
        x: -levelValueWidth / 2,
        width: levelValueWidth
      });
      $levelValue.attr('transform', (0, _template.translate)(0, -this.mapRadius(i)));
    }.bind(this));
  } else {
    this.$levelValues.forEach(function ($levelValue, i) {
      $levelValue.addStyle('display', 'none');
    }.bind(this));
  }

  var contentBound = new _Rectangle.default(0, 0, this.$body.box.width, this.$body.box.height);
  var centerBound = contentBound.centerPoint();
  this.$netCtn.box.setPosition(centerBound.x + (-this.computedData.expectedSize.x - this.computedData.expectedSize.width / 2), centerBound.y + (-this.computedData.expectedSize.y - this.computedData.expectedSize.height / 2));
};

AssessmentChart.prototype._updateAreaPosition = function () {
  this.$areas.forEach(function ($area, i) {
    var area = this.areas[i];
    var points = area.values.reduce(function (ac, value, i) {
      var angle = this.mapAngle(i);
      var level = this.mapLevel(value);
      var x = this.mapRadius(level) * Math.cos(angle);
      var y = this.mapRadius(level) * Math.sin(angle);
      ac.push(x + ' ' + y);
      return ac;
    }.bind(this), []);
    var d = 'M' + points.join('L') + 'Z';
    $area.attr('d', d);

    if (typeof area.strokeWidth == "number") {
      $area.addStyle('stroke-width', area.strokeWidth + '');
    }
  }.bind(this));
};

AssessmentChart.prototype._updateRangePosition = function () {
  if (this.ranges && this.ranges.length > 0) {
    this.$ranges.forEach(function ($range, i) {
      var range = this.ranges[i];
      var angle = this.mapAngle(i);
      var levelMax = this.mapLevel(range[1]);
      var xMax = this.mapRadius(levelMax) * Math.cos(angle);
      var yMax = this.mapRadius(levelMax) * Math.sin(angle);
      $range.$max.attr({
        cx: xMax,
        cy: yMax
      });
      var levelMin = this.mapLevel(range[0]);
      var xMin = this.mapRadius(levelMin) * Math.cos(angle);
      var yMin = this.mapRadius(levelMin) * Math.sin(angle);
      $range.$min.attr({
        cx: xMin,
        cy: yMin
      });
      $range.$line.attr('d', 'M' + xMin + ' ' + yMin + 'L' + xMax + ' ' + yMax);
    }.bind(this));
    this.$rangeArea.begin();
    this.$rangeMax.begin();
    this.$rangeMin.begin();
    this.ranges.forEach(function (range, i, arr) {
      var angle = this.mapAngle(i);
      var levelMax = this.mapLevel(range[1]);
      var xMax = this.mapRadius(levelMax) * Math.cos(angle);
      var yMax = this.mapRadius(levelMax) * Math.sin(angle);

      if (i == 0) {
        this.$rangeArea.moveTo(xMax, yMax);
        this.$rangeMax.moveTo(xMax, yMax);
      } else {
        this.$rangeArea.lineTo(xMax, yMax);
        this.$rangeMax.lineTo(xMax, yMax);
      }

      if (i + 1 == arr.length) {
        this.$rangeArea.closePath();
        this.$rangeMax.closePath();
      }
    }.bind(this));
    this.ranges.forEach(function (range, i, arr) {
      var angle = this.mapAngle(i);
      var levelMax = this.mapLevel(range[0]);
      var xMin = this.mapRadius(levelMax) * Math.cos(angle);
      var yMin = this.mapRadius(levelMax) * Math.sin(angle);

      if (i == 0) {
        this.$rangeArea.moveTo(xMin, yMin);
        this.$rangeMin.moveTo(xMin, yMin);
      } else {
        this.$rangeArea.lineTo(xMin, yMin);
        this.$rangeMin.lineTo(xMin, yMin);
      }

      if (i + 1 == arr.length) {
        this.$rangeArea.closePath();
        this.$rangeMin.closePath();
      }
    }.bind(this));
    this.$rangeMax.end();
    this.$rangeMin.end();
    this.$rangeArea.end();
  }
};

AssessmentChart.prototype.updateBodyPosition = function () {
  _BChart.default.prototype.updateBodyPosition.call(this);

  this._computedNetSize();

  this._updateAxisPosition();

  this._updateAreaPosition();

  this._updateRangePosition();
};

AssessmentChart.prototype.updateContent = function () {
  this.prepareData();

  _BChart.default.prototype.updateContent.call(this);
};

AssessmentChart.prototype.prepareData = function () {
  this.levelMappingArray = this.levels.map(function (value) {
    return parseFloat(value + '');
  });
  this.isMappingLevel = this.levelMappingArray.reduce(function (ac, cr) {
    return ac && !isNaN(cr);
  }, true);
};

AssessmentChart.property.simpleMode = {
  set: function (value) {
    if (value) this.addClass('simple-mode');else this.removeClass('simple-mode');
  },
  get: function () {
    return this.containsClass('simple-mode');
  }
};
AssessmentChart.property.rangeSegment = {
  set: function (value) {
    if (value) this.addClass('show-range-segment');else this.removeClass('show-range-segment');
  },
  get: function () {
    return this.containsClass('show-range-segment');
  }
};

_VCore.default.install(AssessmentChart);

var _default = AssessmentChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/ColumnChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/ColumnChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _helper = require("./helper");

var _template = require("./template");
const {numberToString} = require("absol/src/Math/int");

var _AElementNS = _interopRequireDefault(require("absol/src/HTML5/AElementNS"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _VerticalChart = _interopRequireDefault(require("./VerticalChart"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 *
 * @returns {VerticalChart}
 * @constructor
 */

function ColumnChart() {
  _VerticalChart.default.call(this);

  this.values = [];
  this.$columnCtn = _('gcontainer.vc-column-ctn');
  this.$oxySpace.addChild(this.$columnCtn);
  if (!this.numberToString)
    this.numberToString = function (value){
      return numberToString.apply(this, arguments);
    }
}

ColumnChart.property = Object.assign({}, _VerticalChart.default.property);
ColumnChart.eventHandler = Object.assign({}, _VerticalChart.default.eventHandler);

_OOP.default.mixClass(ColumnChart, _VerticalChart.default);

ColumnChart.tag = 'ColumnChart'.toLowerCase();

ColumnChart.render = function () {
  return _VerticalChart.default.render().addClass('vc-column-chart');
};

ColumnChart.prototype.computeMinMax = function () {
  this.computedData.min = this.values.filter(_helper.isNumber).reduce(function (ac, cr) {
    return Math.min(ac, cr);
  }, 1000000000);
  this.computedData.max = this.values.filter(_helper.isNumber).reduce(function (ac, cr) {
    return Math.max(ac, cr);
  }, -1000000000);
};

ColumnChart.prototype.createContent = function () {
  _VerticalChart.default.prototype.createContent.call(this);

  this._createColumns();
};

ColumnChart.prototype._createColumn = function (value, i, color) {
  var res = _('gcontainer.vc-column');

  res.$rect = (0, _helper.rect)(-this.oxColWidth / 2, 0, this.oxColWidth, 10).addTo(res);

  if (value === 0) {
    res.addClass('vc-value-zero');
  }

  res.$value = (0, _helper.text)(this.numberToString(value) + '', 0, 0).attr('text-anchor', 'middle').addTo(res);

  if (color) {
    res.$rect.addStyle('fill', color);
  }

  return res;
};

ColumnChart.prototype._createColumns = function () {
  this.$columnes = this.values.map(function (value, i) {
    return this._createColumn(value, i, this.columnColors && this.columnColors[i]).addTo(this.$columnCtn);
  }.bind(this));
};

ColumnChart.prototype.updateBodyPosition = function () {
  _VerticalChart.default.prototype.updateBodyPosition.call(this);

  this._updateColumnPosition();
};

ColumnChart.prototype._updateColumnPosition = function () {
  this.$columnes.forEach(function ($column, i) {
    if ((0, _helper.isNumber)(this.values[i])) {
      $column.removeStyle('display');
      var height = this.mapOYValue(this.values[i]); // x: (i + 0.5) * this.oxSegmentLength - this.columnWidth / 2

      $column.$rect.attr({
        height: height,
        y: -height
      });
      $column.$value.attr('y', -height - 4);
      $column.attr({
        transform: (0, _template.translate)((i + 0.5) * this.computedData.oxSegmentLength, 0)
      });
    } else {
      $column.addStyle('display', 'none');
    }
  }.bind(this));
};

_VCore.default.creator.columnchart = ColumnChart;
var _default = ColumnChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/ColumnAreaChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/ColumnAreaChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _helper = require("./helper");

var _DualChart = _interopRequireDefault(require("./DualChart"));

var _template = require("./template");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ColumnChart = _interopRequireDefault(require("./ColumnChart"));

var _Core = _interopRequireDefault(require("absol-svg/js/svg/Core"));

var _VerticalChart = _interopRequireDefault(require("./VerticalChart"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends  ColumnChart
 * @constructor
 */

function ColumnAreaChart() {
  _ColumnChart.default.call(this);

  this.$areaCtn = _('gcontainer.vc-area-ctn');
  this.$oxySpace.addChildBefore(this.$areaCtn, this.$columnCtn);
  this.areas = [];
}

_OOP.default.mixClass(ColumnAreaChart, _ColumnChart.default);

ColumnAreaChart.property = Object.assign({}, _ColumnChart.default.property);
ColumnAreaChart.eventHandler = Object.assign({}, _ColumnChart.default.eventHandler);
ColumnAreaChart.tag = 'ColumnAreaChart'.toLowerCase();

ColumnAreaChart.render = function () {
  return _ColumnChart.default.render().addClass('vc-column-area-chart');
};

ColumnAreaChart.prototype.computeMinMax = function () {
  _ColumnChart.default.prototype.computeMinMax.call(this);

  this.computedData.min = this.areas.reduce(function (minValue, area) {
    return area.values.filter(_helper.isNumber).reduce(function (minValue, value) {
      if (!(0, _helper.isNumber)(value)) return minValue;
      return Math.min(minValue, value);
    }, minValue);
  }, this.computedData.min);
  this.computedData.max = this.areas.reduce(function (maxValue, area) {
    return area.values.filter(_helper.isNumber).reduce(function (maxValue, value) {
      if (!(0, _helper.isNumber)(value)) return maxValue;
      return Math.max(maxValue, value);
    }, maxValue);
  }, this.computedData.max);
};

ColumnAreaChart.prototype.computeNotes = function () {
  return this.areas.map(function (area) {
    return {
      text: area.name,
      type: 'rect',
      color: area.color
    };
  });
};

ColumnAreaChart.prototype._createArea = _DualChart.default.prototype._createArea;
ColumnAreaChart.prototype._createAreaNote = _DualChart.default.prototype._createAreaNote;

ColumnAreaChart.prototype._createAreas = function () {
  this.$areas = this.areas.map(function (area, i) {
    return this._createArea(area, area.color).addTo(this.$areaCtn);
  }.bind(this));
};

ColumnAreaChart.prototype.createContent = function () {
  _ColumnChart.default.prototype.createContent.call(this);

  this._createAreas();
};

ColumnAreaChart.prototype._updateAreaPosition = function () {};

ColumnAreaChart.prototype.updateBodyPosition = function () {
  _ColumnChart.default.prototype.updateBodyPosition.call(this);

  this._updateAreaPosition();

  this._updateAreaPosition();
}; //
// ColumnAreaChart.prototype.initComp = function () {
//
//     this.super();
// };
// ColumnAreaChart.prototype.updateComp = function () {
//     this.super();
//     this.updateArea();
// };
//


ColumnAreaChart.prototype._updateAreaPosition = function () {
  var oxSegmentLength = this.computedData.oxSegmentLength;
  this.$areas.map(function ($area, i) {
    var values = this.areas[i].values;
    var subAreas = (0, _helper.getSubNumberArray)(values);
    $area.begin();
    subAreas.forEach(function (subArea) {
      var start = subArea.start;
      var values = subArea.values;

      if (values.length > 1) {
        $area.moveTo(oxSegmentLength * (start + 0.5), -1);

        for (var xi = 0; xi < values.length; ++xi) {
          $area.lineTo(oxSegmentLength * (start + xi + 0.5), -this.mapOYValue(values[xi]));
        }

        $area.lineTo(oxSegmentLength * (start + values.length - 1 + 0.5), -1);
        $area.closePath();
      } else {
        $area.moveTo(oxSegmentLength * (start + 0.25), -1);
        $area.lineTo(oxSegmentLength * (start + 0.25), -this.mapOYValue(values[0]));
        $area.lineTo(oxSegmentLength * (start + 0.75), -this.mapOYValue(values[0]));
        $area.lineTo(oxSegmentLength * (start + 0.75), -1);
        $area.closePath();
      }
    }.bind(this));
    $area.end();
  }.bind(this));
};

_Core.default.install(ColumnAreaChart);

var _default = ColumnAreaChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/RangeGroupChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/RangeGroupChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _helper = require("./helper");

var _template = require("./template");


var _ = _VCore.default._;
var $ = _VCore.default.$;

function RangeGroupChart() {
  var res = _('basechart', true);

  return res;
}

;

RangeGroupChart.prototype._createNote = function () {
  var res = _('g');

  res.$maxLine = (0, _helper.hline)(0, 7, 40, ['range-group-chart-limit-line', 'max']).addTo(res);
  res.$maxText = (0, _helper.text)(this.maxText, 50, 12).addTo(res);
  res.$minLine = (0, _helper.hline)(200, 7, 40, ['range-group-chart-limit-line', 'min']).addTo(res);
  res.$minText = (0, _helper.text)(this.minText, 250, 12).addTo(res);
  return res;
};

RangeGroupChart.prototype._createMember = function (member) {
  var res = _('g');

  res.$plot = (0, _helper.circle)(this.plotRadius, 0, this.plotRadius, 'range-group-chart-plot').addTo(res);
  res.$value = (0, _helper.text)(this.numberToString(member.value), this.plotRadius * 2 + 8, 5).addTo(res);
  res.$nameContainer = _('g').addTo(res).attr('transform', 'rotate(45)');
  res.$name = (0, _helper.text)(member.name, this.plotRadius, 10).addTo(res.$nameContainer);
  return res;
};

RangeGroupChart.prototype._createRange = function (range) {
  var res = _('g');

  res.$lineLeft = (0, _helper.hline)(0, 0, 0, 'range-group-chart-range-line').addTo(res);
  res.$lineRight = (0, _helper.hline)(0, 0, 0, 'range-group-chart-range-line').addTo(res);
  res.$maxLine = (0, _helper.hline)(10, -this.paddingnAxisBottom, this.rangePaddingH * 2, ['range-group-chart-limit-line', 'max']).addTo(res);
  res.$minLine = (0, _helper.hline)(10, -this.paddingnAxisBottom, this.rangePaddingH * 2, ['range-group-chart-limit-line', 'min']).addTo(res);
  res.$max = (0, _helper.text)(this.numberToString(range.max), 0, 0).attr('text-anchor', 'middle').addTo(res);
  res.$min = (0, _helper.text)(this.numberToString(range.min), 0, 0).attr('text-anchor', 'middle').addTo(res);
  res.$members = range.members.map(function (member) {
    return this._createMember(member).addTo(res);
  }.bind(this));
  res.$name = (0, _helper.text)(range.name, 0, 0).attr('text-anchor', 'middle').addTo(res);
  return res;
};

RangeGroupChart.prototype.processMinMax = function () {
  this.super();
  this.maxValue = this.ranges.reduce(function (max, range) {
    return range.members.reduce(function (max, member, i) {
      return Math.max(max, member.value);
    }.bind(this), Math.max(max, range.max, range.normal));
  }.bind(this), -1000000000);
  this.minValue = this.ranges.reduce(function (min, range) {
    return range.members.reduce(function (min, member) {
      return Math.min(min, member.value);
    }.bind(this), Math.min(min, range.min, range.normal));
  }.bind(this), 1000000000);
};

RangeGroupChart.prototype.preInit = function () {
  this.super();
  this.paddingnAxisBottom = 40;
  this.rangePaddingH = 10;
  this.plotRadius = 6;
  this.rangeMarginH = 10;
  this.memberMarginH = 5;
};

RangeGroupChart.prototype.initBackComp = function () {
  this.super();
  this.$note = this._createNote().addTo(this);
};

RangeGroupChart.prototype.updateBackComp = function () {
  var noteBBox = this.$note.getBBox();
  this.$note.attr('transform', (0, _template.translate)(0, this.canvasHeight - noteBBox.height - 5));
  var x = 50 + this.$note.$maxText.getBBox().width + 40;
  (0, _helper.moveHLine)(this.$note.$minLine, x, 7, 40);
  this.$note.$minText.attr('x', x + 50);
  this.oxyBottom = this.canvasHeight - noteBBox.height - 30;
  this.memberNameHeight = this.$ranges.reduce(function (memberHeight, $range) {
    return $range.$members.reduce(function (memberHeight, $member) {
      return Math.max(memberHeight, $member.$nameContainer.getBBox().width / 1.4);
    }, memberHeight);
  }, 0);
  this.oxyBottom -= this.memberNameHeight + 25;
  this.super();
};

RangeGroupChart.prototype.initComp = function () {
  this.$ranges = this.ranges.map(function (range) {
    return this._createRange(range).addTo(this.$content);
  }.bind(this));
};

RangeGroupChart.prototype.updateComp = function () {
  var memberWidth = this.$ranges.reduce(function (memberWidth, $range) {
    return $range.$members.reduce(function (memberWidth, $member) {
      return Math.max(memberWidth, $member.getBBox().width);
    }, memberWidth);
  }, 0);
  this.oxContentLength = this.$ranges.reduce(function (oxContentLength, $range, rangeIndex) {
    oxContentLength += this.rangeMarginH;
    var range = this.ranges[rangeIndex];
    $range.attr('transform', (0, _template.translate)(oxContentLength, 0));
    var rangeWidth = $range.$members.reduce(function (rangeWidth, $member, memberIndex) {
      rangeWidth += this.memberMarginH;
      var member = range.members[memberIndex];
      $member.attr('transform', (0, _template.translate)(rangeWidth, 0));
      $member.$plot.attr('cy', this.mapOYValue(member.value));
      $member.$value.attr('y', this.mapOYValue(member.value) + 5);
      rangeWidth += memberWidth;
      rangeWidth += this.memberMarginH;
      return rangeWidth;
    }.bind(this), this.rangePaddingH) + this.rangePaddingH;
    (0, _helper.moveHLine)($range.$maxLine, 0, this.mapOYValue(range.max), rangeWidth);
    (0, _helper.moveHLine)($range.$minLine, 0, this.mapOYValue(range.min), rangeWidth);
    var rangeHeight = this.mapOYValue(range.max) - this.mapOYValue(range.min);
    (0, _helper.moveVLine)($range.$lineLeft, 0, this.mapOYValue(range.min), rangeHeight);
    (0, _helper.moveVLine)($range.$lineRight, rangeWidth, this.mapOYValue(range.min), rangeHeight);
    $range.$name.attr({
      x: rangeWidth / 2,
      y: this.memberNameHeight + 25
    });
    oxContentLength += rangeWidth;
    $range.$max.attr({
      x: rangeWidth / 2,
      y: this.mapOYValue(range.max) - 5
    });
    $range.$min.attr({
      x: rangeWidth / 2,
      y: this.mapOYValue(range.min) + 15
    });
    oxContentLength += this.rangeMarginH;
    return oxContentLength;
  }.bind(this), 0);
};

_VCore.default.creator.rangegroupchart = RangeGroupChart;
var _default = RangeGroupChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/CurveChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/CurveChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _helper = require("./helper");


function CurveChart() {
  return _VCore.default._('linechart', true);
}

;

CurveChart.prototype.updateComp = function () {
  this.$lines.map(function ($line, i) {
    var line = this.lines[i];
    $line.$plots.forEach(function ($plot, j) {
      var value = line.values[j];
      $plot.attr({
        cx: this.oxSegmentLength * (j + 0.5),
        cy: this.mapOYValue(value)
      });
    }.bind(this));
    var points = line.values.map(function (value, j) {
      var y = this.mapOYValue(value);
      var x = this.oxSegmentLength * (j + 0.5);
      return [x, y];
    }.bind(this));
    var d = (0, _helper.autoCurve)(points, 0.5, 0.000001);
    $line.$path.attr('d', d);
  }.bind(this));
};

_VCore.default.creator.curvechart = CurveChart;
var _default = CurveChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/RankChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/RankChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _template = require("./template");

var _helper = require("./helper");

var _ToolTip = require("./ToolTip");

var _BChart = _interopRequireDefault(require("./BChart"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _VerticalChart = _interopRequireDefault(require("./VerticalChart"));

var _ColumnChart = _interopRequireDefault(require("./ColumnChart"));

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));

require("./style/rankchart.css");


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends BChart
 * @constructor
 */

function RankChart() {
  _BChart.default.call(this);

  _OOP.default.drillProperty(this, this, 'numberToString', 'numberToText');

  this.colors = ['transparent', 'rgb(201, 241, 253)', 'rgb(212, 227, 252)', 'rgb(218, 202, 251)', 'rgb(242, 201, 251)', 'rgb(255, 218, 216)', 'rgb(255, 236, 215)', 'rgb(254, 252, 224)', 'rgb(223, 237, 214)', 'rgb(77, 215, 250)', 'rgb(117, 169, 249)', 'rgb(139, 81, 245)', 'rgb(215, 87, 246)', 'rgb(255, 138, 132)', 'rgb(152, 165, 52)', 'rgb(254, 248, 160)', 'rgb(174, 221, 148)', 'rgb(0, 164, 221)', 'rgb(20, 100, 246)', 'rgb(156, 41, 183)'];
  this.computedData.oyUpdated = false;
  this.computedData.oy = {};
  this.computedData.numberToFixed = 0;
  this.integerOnly = false;
  this.positions = [];
  this.valueName = '';
  this.plotRadius = 9;
  this.zeroOY = true;
  this.extendOY = true;
  this.computedData.paddingAxisBottom = this.plotRadius + 30;
  this.$axisCtn = _({
    tag: _GContainer.default.tag,
    class: 'vc-axis-ctn',
    child: [{
      tag: 'gcontainer',
      class: 'vc-oxy-space',
      child: ['gcontainer.vc-ox-label-ctn', 'gcontainer.vc-rank-list-ctn']
    }, {
      tag: 'path',
      class: 'vc-white-mask',
      attr: {
        fill: 'white',
        stroke: 'white',
        'fill-rule': 'evenodd',
        d: 'M0,0  0,2000 2000,2000 2000,0zM100,0  0,200 200,200 200,0z'
      }
    }, 'axis', {
      tag: 'text',
      class: 'vc-key-name',
      attr: {
        y: 14,
        x: 5
      },
      child: {
        text: ''
      }
    }, 'scrollarrow', 'hscrollbar', {
      tag: 'text',
      class: 'vc-value-name',
      attr: {
        y: 14,
        x: 5
      },
      child: {
        text: ''
      }
    }]
  });
  this.$body.addChild(this.$axisCtn);
  this.$hscrollbar = $('hscrollbar', this.$axisCtn).on('scroll', this.eventHandler.scrollOxySpace);
  this.$hscrollbar.height = 10;
  this.$scrollArrow = $('scrollarrow', this.$axisCtn).on('pressleft', this.eventHandler.scrollArrowsPressLeft).on('pressright', this.eventHandler.scrollArrowsPressRight);
  this.$oxySpace = $('gcontainer.vc-oxy-space', this.$axisCtn);
  this.$whiteMask = $('.vc-white-mask', this.$axisCtn);
  this.$axis = $('axis', this.$axisCtn);
  this.$keyName = $('.vc-key-name', this.$axisCtn);
  this.$valueName = $('.vc-value-name', this.$axisCtn);
  this.$oxLabelCtn = $('gcontainer.vc-ox-label-ctn', this.$axisCtn);
  this.$oxLabels = [];
  this.$oyValueCtn = _('gcontainer.vc-oy-value-ctn').addTo(this.$body);
  this.$oyValues = [];
  this.$postion = [];
  this.$rankListCtn = $('.vc-rank-list-ctn', this.$axisCtn);
}

RankChart.tag = 'RankChart'.toLowerCase();
RankChart.property = Object.assign({}, _VerticalChart.default.property);
RankChart.eventHandler = Object.assign({}, _VerticalChart.default.eventHandler);

_OOP.default.mixClass(RankChart, _VerticalChart.default);

RankChart.render = function () {
  return _BChart.default.render().addClass('vc-rank-chart');
};

RankChart.prototype.updateBodyPosition = function () {
  this._isAutoWidth = this.style.width === 'auto';
  if (this._isAutoWidth) this.addStyle('width', '450px');

  _VerticalChart.default.prototype.updateBodyPosition.call(this);

  this._updateOyDivision();

  this._updatePosListPosition();

  this._updateScrollerPosition();

  if (this._isAutoWidth) {
    this._isAutoWidth = false;
    this.addStyle('width', this.contentPadding * 2 + this.$oyValueCtn.box.x + this.$hscrollbar.innerWidth + this.$keyName.getBBox().width + 10 + 'px');
    this.updateBodyPosition();
  }
};

RankChart.prototype.createContent = function () {
  _BChart.default.prototype.createContent.call(this);

  this._createOxLabel();

  this._createPosList();
};

RankChart.prototype.computeData = _VerticalChart.default.prototype.computeData;

RankChart.prototype.computeMinMax = function () {
  var min = Infinity,
      max = -Infinity;
  this.positions.forEach(function (position) {
    position.ranks.forEach(function (rank) {
      min = Math.min(min, rank);
      max = Math.max(max, rank);
    });
  });
  this.computedData.min = min;
  this.computedData.max = max + 1;
};

RankChart.prototype._createOxLabel = function () {
  this.$keyName.firstChild.data = this.valueName;
  this.$oxLabelCtn.clearChild();
  this.$oxLabels = this.positions.map(function (position) {
    return _({
      tag: 'text',
      class: 'vc-ox-label',
      child: {
        text: position.name
      }
    });
  });
  this.$oxLabelCtn.addChild(this.$oxLabels);
  this.$valueName.firstChild.data = this.valueName || '';
};

RankChart.prototype._updateOxLabelPosition = function () {
  this.$oxLabelCtn.box.y = 20;
};

RankChart.prototype._updateScrollerPosition = function () {
  this.computedData.oxOverFlow = this.computedData.oxScrollWidth > this.computedData.oxLength;
  this.$hscrollbar.outterWidth = this.computedData.oxLength;
  this.$hscrollbar.innerWidth = this.computedData.oxScrollWidth;
  this.$hscrollbar.width = Math.max(0, this.computedData.oxLength); // this.$hscrollbar.scrollLeft = Math.max(0, Math.min(this.$hscrollbar.scrollLeft, this.computedData.oxScrollWidth - this.computedData.oxLength));

  this.$hscrollbar.scrollLeft = 0;

  if (this.computedData.oxOverFlow) {
    this.$scrollArrow.removeStyle('display');
    this.$scrollArrow.box.y = this.computedData.oyLength / 2;
    this.$scrollArrow.width = this.computedData.oxLength - 20;

    this._updateScrollArrowBtb();
  } else {
    this.$scrollArrow.addStyle('display', 'none');
  }

  this.$axis.oyDivision = this.computedData.oySegmentLength;
  this.$axis.updateOyDivision();
};

RankChart.prototype._updateOyDivision = function (value) {
  this.$axis.oyDivision = this.computedData.oySegmentLength;
  this.$axis.oyPadding = this.computedData.paddingAxisBottom;
  this.$axis.updateOyDivision();
};

RankChart.prototype.mapOYValue = function (val) {
  return this.computedData.paddingAxisBottom + (0, _helper.map)(val, this.computedData.oy.minValue, this.computedData.oy.maxValue, 0, this.computedData.oyLength);
};

RankChart.prototype._createRank = function (rank, value) {
  var res = _({
    tag: 'g',
    child: [{
      tag: 'circle',
      class: 'rank-chart-plot',
      attr: {
        cx: this.plotRadius,
        cy: 0,
        r: this.plotRadius
      },
      style: {
        fill: this.colors[rank]
      }
    }, {
      tag: 'text',
      class: 'rank-chart-plot-text',
      attr: {
        x: this.plotRadius,
        y: 5,
        'text-anchor': 'middle'
      },
      props: {
        innerHTML: rank + 1 + ''
      }
    }]
  });

  res.on('mouseenter', function () {
    var currentBound = res.getBoundingClientRect();
    var text = this.numberToString(value);
    (0, _ToolTip.showTooltip)(text, currentBound.right + 3, currentBound.bottom + 7).then(function (token) {
      res.once('mouseleave', function () {
        setTimeout(function () {
          (0, _ToolTip.closeTooltip)(token);
        }, 1000);
      });
    }.bind(this));
  }.bind(this));
  return res;
};

RankChart.prototype.numberToString = function (num) {
  return num.toString();
};

RankChart.prototype._createPosition = function (position) {
  var res = _({
    tag: _GContainer.default.tag
  });

  res.$ranks = position.ranks.map(function (value, rank) {
    return this._createRank(rank, value);
  }.bind(this));
  res.$rect = _({
    tag: 'rect',
    class: 'vc-rank-position-list-rect',
    attr: {
      x: '0',
      y: '0'
    }
  });
  res.addChild(res.$rect).addChild(res.$ranks);
  return res;
};

RankChart.prototype._createPosList = function () {
  this.$positions = this.positions.map(this._createPosition.bind(this));
  this.$rankListCtn.clearChild().addChild(this.$positions);
};

RankChart.prototype._updatePosListPosition = function () {
  var contentLength = this.$positions.reduce(function (contentLength, pe, positionIndex) {
    var position = this.positions[positionIndex];
    contentLength = contentLength + 20;
    var maxDY = pe.$ranks.reduce(function (maxDY, meme, j) {
      var value = position.ranks[j];
      var y = -this.mapOYValue(value);
      meme.attr('transform', (0, _template.translate)(contentLength, y));
      meme._tr_y = y;
      return Math.max(maxDY, -y);
    }.bind(this), 0);
    var valueElements = pe.$ranks.slice();
    valueElements.sort(function (a, b) {
      return a._tr_y - b._tr_y;
    });
    var ninf = -1000000;
    var messure = valueElements.reduce(function (ac, e) {
      var y = e._tr_y;
      var colIndex = 0;

      while (ac[colIndex].minY > y) ++colIndex;

      ac[colIndex].minY = y + 20;
      ac[colIndex].child.push(e);
      ac[colIndex].maxWidth = Math.max(ac[colIndex].maxWidth, e.getBBox().width);
      return ac;
    }, Array(200).fill(null).map(function () {
      return {
        minY: ninf,
        child: [],
        maxWidth: ninf
      };
    }));
    messure.reduce(function (left, col) {
      if (col.child.length == 0) return;
      col.child.forEach(function (vale) {
        vale.attr('transform', (0, _template.translate)(left, vale._tr_y));
      });
      return left + col.maxWidth + 9;
    }, 10);
    pe.$rect.addStyle('display', 'none');
    var innerWidth = pe.getBBox().width;
    pe.$rect.removeStyle('display');
    pe.$rect.attr({
      width: innerWidth + 20,
      y: -maxDY - (this.plotRadius + 10),
      height: maxDY + this.plotRadius + 10
    });
    var columeWidth = Math.max(pe.getBBox().width + 20, this.$oxLabels[positionIndex].getBBox().width + 10);
    this.$oxLabels[positionIndex].attr('x', contentLength + columeWidth / 2);
    pe.box.x = contentLength + columeWidth / 2 - (innerWidth + 20) / 2;
    contentLength += columeWidth;
    return contentLength;
  }.bind(this), 9);
  this.computedData.oxScrollWidth = contentLength;
};

_VCore.default.install(RankChart);

var _default = RankChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/SunburstChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/SunburstChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _BaseChart = _interopRequireDefault(require("./BaseChart"));

var _helper = require("./helper");

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _template = require("./template");

var _BChart = _interopRequireDefault(require("./BChart"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends BChart
 * @constructor
 */

function SunburstChart() {
  _BChart.default.call(this);

  this.$sunbirstCtn = _('gcontainer.vc-sunburst-ctn');
  this.$body.addChild(this.$sunbirstCtn);
  this.root = {};
}

SunburstChart.property = Object.assign({}, _BChart.default.property);
SunburstChart.eventHandler = Object.assign({}, _BChart.default.eventHandler);

_OOP.default.mixClass(SunburstChart, _BChart.default);

SunburstChart.tag = 'SunburstChart'.toLowerCase();

SunburstChart.render = function () {
  return _BChart.default.render().addClass('vc-sunburst-chart');
};

SunburstChart.prototype._normalizeColorData = function () {
  var needAutoColor = [];
  this.acceptNode(this.root, function (node) {
    try {
      if (node.fillColor.rgba) return;

      var c = _Color.default.parse(node.fillColor + '');

      if (!node.fillColor.rgba) node.fillColor = c;
    } catch (error) {
      needAutoColor.push(node);
    }
  });
  var aColors = (0, _helper.generateBackgroundColors)(needAutoColor.length);
  needAutoColor.forEach(function (node, i) {
    node.fillColor = aColors[i];
  });
  this.acceptNode(this.root, function (node) {
    try {
      if (node.textColor.rgba) return;

      var c = _Color.default.parse(node.textColor + '');

      if (!node.textColor.rgba) node.textColor = c;
    } catch (error) {
      node.textColor = node.fillColor.getContrastYIQ();
    }
  });
};

SunburstChart.prototype.computeData = function () {
  this.computedData.depth = this.calDepth(this.root);
};

SunburstChart.prototype._measureFan = function (r, R, as, ae) {
  var dn = 0;

  if (as < 0) {
    dn = Math.ceil(-as / (Math.PI * 2));
  } else if (as >= Math.PI * 2) {
    dn = -Math.floor(as / (Math.PI * 2));
  }

  as += Math.PI * 2 * dn;
  ae += Math.PI * 2 * dn;
  var cosS = Math.cos(as);
  var sinS = Math.sin(as);
  var cosE = Math.cos(ae);
  var sinE = Math.sin(ae);
  var A = new _Rectangle.default(r * cosS, r * sinS, 0, 0);
  var B = new _Rectangle.default(R * cosS, R * sinS, 0, 0);
  var C = new _Rectangle.default(R * cosE, R * sinE, 0, 0);
  var D = new _Rectangle.default(r * cosE, r * sinE, 0, 0);
  var points = [A, B, C, D];
  var e90, cosE90, sinE90;

  for (var k = 0; k < 4; ++k) {
    e90 = k * Math.PI / 2;
    cosE90 = Math.cos(e90);
    sinE90 = Math.sin(e90);

    if (e90 > as && e90 < ae) {
      points.push(new _Rectangle.default(r * cosE90, r * sinE90, 0, 0));
      points.push(new _Rectangle.default(R * cosE90, R * sinE90, 0, 0));
    }
  }

  return points.reduce(function (ac, cr) {
    return ac.merge(cr);
  });
};

SunburstChart.prototype._measureSunburst = function (rFan) {
  var r0 = this.computedData.rootR;
  var rects = [new _Rectangle.default(-r0, -r0, 2 * r0, 2 * r0)];

  function visit($node) {
    var level = $node.level;
    var r = r0 + rFan * (level - 1);
    var R = r + rFan * $node.span;

    var fanRect = this._measureFan(r, R, $node.chartAngle[0], $node.chartAngle[1]);

    rects.push(fanRect);
    if ($node.$child) $node.$child.forEach(visit.bind(this));
  }

  if (this.$root.$child) this.$root.$child.forEach(visit.bind(this));
  return rects.reduce(function (ac, cr) {
    return ac.merge(cr);
  });
};

SunburstChart.prototype._findBestFanRadius = function () {
  var mid;
  var bound;
  var exi = 1;
  var aWidth = this.$body.box.width - 4;
  var aHeight = this.$body.box.height - 4;
  var h = (Math.max(aWidth, aHeight) - this.computedData.rootR - 2) / this.computedData.depth;
  var l = (Math.min(aWidth, aHeight) - this.computedData.rootR - 2) / this.computedData.depth / 2;
  mid = (l + h) / 2;

  while (l + exi < h) {
    bound = this._measureSunburst(mid);

    if (bound.width > aWidth || bound.height > aHeight) {
      h = mid;
    } else {
      l = mid;
    }

    mid = (l + h) / 2;
  }

  this.computedData.fanR = mid;
};

SunburstChart.prototype.normalizeData = function () {
  _BChart.default.prototype.normalizeData.call(this);

  this._normalizeColorData();
}; // SunburstChart.prototype.updateSize = BaseChart.prototype.updateSize;


SunburstChart.prototype.acceptNode = function (node, visitFunction, content) {
  visitFunction(node, content);

  if (node.child) {
    node.child.forEach(function (cNode) {
      this.acceptNode(cNode, visitFunction, content);
    }.bind(this));
  }
};

SunburstChart.prototype._updateNodePosition = function () {
  var rootR = this.computedData.rootR;
  var fanR = this.computedData.fanR;

  function visit($node) {
    var r0 = rootR + ($node.level - 1) * fanR;
    var r1 = r0 + fanR * $node.span;
    var isLeftPath = ($node.chartAngle[1] + $node.chartAngle[0]) / 2 > Math.PI / 2;
    $node.$nameCtn.attr('transform', (0, _template.rotate)(($node.chartAngle[1] + $node.chartAngle[0]) / 2 / Math.PI * 180 + (isLeftPath ? 180 : 0)));
    var textX = (isLeftPath ? -1 : 1) * (r0 + r1) / 2;

    if ((r0 + r1) / 2 * Math.abs($node.chartAngle[1] - $node.chartAngle[0]) < 15) {
      $node.$nameCtn.addStyle('visibility', 'hidden');
    } else {
      //     //todo:
      var nodeText = $node.data.name;
      var textColor = $node.textColor; //

      var words = nodeText.trim().split(/\s+/);
      var updateNodeSession = this.updateNodeSession;

      var tryText = function (nLine) {
        $node.$nameCtn.clearChild();
        var wordPerLine = Math.ceil(words.length / nLine);
        var lines = words.reduce(function (ac, cr) {
          if (ac.top.length == 0) {
            ac.result.push(ac.top);
          }

          ac.top.push(cr);
          if (ac.top.length >= wordPerLine) ac.top = [];
          return ac;
        }, {
          result: [],
          top: []
        }).result;
        lines.reduce(function (y, line) {
          var lineText = line.join(' ');
          $node.$nameCtn.addChild((0, _helper.text)(lineText, textX, y, 'vc-sunburst-node-name').attr('text-anchor', 'middle').addStyle('fill', textColor));
          return y + 20;
        }, 5 - (nLine - 1) * 20 / 2);
        var box = $node.$nameCtn.getBBox();
        var out = box.width + 8 > r1 - r0 || box.height > (r0 + r1) / 2 * Math.abs($node.chartAngle[1] - $node.chartAngle[0]);

        if (nLine < words.length && out) {
          tryText(nLine + 1);
        } else if (out) {
          $node.$nameCtn.addStyle('visibility', 'hidden');
        } else {
          $node.$nameCtn.removeStyle('visibility', 'hidden');
        }
      }.bind(this);

      tryText(1);
    }

    $node.$shape.begin().moveTo(r0 * Math.cos($node.chartAngle[0]), r0 * Math.sin($node.chartAngle[0])).arcTo(r0 * Math.cos($node.chartAngle[1]), r0 * Math.sin($node.chartAngle[1]), r0, r0, $node.chartAngle[1] - $node.chartAngle[0] > Math.PI ? 1 : 0, 1).lineTo(r1 * Math.cos($node.chartAngle[1]), r1 * Math.sin($node.chartAngle[1])).arcTo(r1 * Math.cos($node.chartAngle[0]), r1 * Math.sin($node.chartAngle[0]), r1, r1, $node.chartAngle[1] - $node.chartAngle[0] > Math.PI ? 1 : 0, 0).closePath().end();

    if ($node.$child && $node.$child.length > 0) {
      $node.$child.forEach(visit.bind(this));
    }
  }

  if (this.$root.$child && this.$root.$child.length > 0) {
    this.$root.$child.forEach(visit.bind(this));
  }
};

SunburstChart.prototype._updateSunburstPosition = function () {
  var ctnBox = this.$sunbirstCtn.getBBox();
  var rootBox = this.$root.getBBox();
  var x = this.$body.box.width / 2;
  var y = this.$body.box.height / 2;
  x -= ctnBox.x + ctnBox.width / 2 - (rootBox.x + rootBox.width / 2);
  y -= ctnBox.y + ctnBox.height / 2 - (rootBox.y + rootBox.height / 2);
  this.$sunbirstCtn.box.setPosition(x, y);
};

SunburstChart.prototype.updateBodyPosition = function () {
  _BChart.default.prototype.updateBodyPosition.call(this);

  this._findBestFanRadius();

  this._updateNodePosition();

  this._updateSunburstPosition();
};

SunburstChart.prototype._createRoot = function () {
  var rootWords = this.root.name.trim().split(/\s+/);
  var rectsPerLine = Math.ceil(Math.sqrt(rootWords.length) * Math.log10(7));
  var lines = rootWords.reduce(function (ac, cr) {
    if (ac.top.length === 0) {
      ac.result.push(ac.top);
    }

    ac.top.push(cr);
    if (ac.top.length >= rectsPerLine) ac.top = [];
    return ac;
  }, {
    result: [],
    top: []
  }).result;
  this.$root = _('g.vc-title').addTo(this.$sunbirstCtn);
  this.$root.$circle = (0, _helper.circle)(0, 0, 1).addTo(this.$root);
  this.$root.$circle.addStyle('fill', this.root.fillColor.toString('hex8'));
  this.$root.$lines = lines.map(function (line, i, arr) {
    return (0, _helper.text)(line.join(' '), 0, -(arr.length * 15) / 2 + 12 + 15 * i).attr('text-anchor', 'middle').addTo(this.$root);
  }.bind(this));
  var rootBox = this.$root.getBBox();
  this.computedData.rootR = Math.sqrt(rootBox.width * rootBox.width + rootBox.height * rootBox.height) / 2 + 5;
  this.$root.$circle.attr('r', this.computedData.rootR);
  this.$root.data = this.root;
  this.$root.level = 0;
  this.$root.span = 1;
  this.$root.chartAngle = [-Math.PI / 2, -Math.PI / 2 + Math.PI * 2];
};

SunburstChart.prototype._createChild = function (fromElt) {
  var sum = fromElt.data.value;
  if (!fromElt.data.child || !(fromElt.data.child.length > 0)) return;
  fromElt.$child = fromElt.data.child.map(function (childData) {
    var fillColor = childData.fillColor;

    var res = _({
      tag: 'g',
      class: 'sunburst-chart-node',
      props: {
        data: childData,
        level: fromElt.level + (fromElt.data.span || 1),
        span: childData.span || 1,
        textColor: _Color.default.parse(fillColor).getContrastYIQ().toString('rgb')
      }
    });

    res.$title = _('<title>' + childData.name + ': ' + childData.value + '</title>').addTo(res);
    res.$shape = _({
      tag: 'shape',
      class: 'sunburst-chart-node-shape',
      style: {
        fill: fillColor
      }
    }).addTo(res);
    res.$nameCtn = _('g').addTo(res);
    return res.addTo(this.$sunbirstCtn);
  }.bind(this));
  fromElt.$child.reduce(function (offset, $childNode) {
    $childNode.chartAngle = [(0, _helper.map)(offset, 0, sum, fromElt.chartAngle[0], fromElt.chartAngle[1]), (0, _helper.map)(offset + $childNode.data.value, 0, sum, fromElt.chartAngle[0], fromElt.chartAngle[1])];

    this._createChild($childNode);

    return offset += $childNode.data.value;
  }.bind(this), 0);
};

SunburstChart.prototype._createSunburst = function () {
  this.$sunbirstCtn.clearChild();

  this._createRoot();

  this._createChild(this.$root);
};

SunburstChart.prototype.createContent = function () {
  _BChart.default.prototype.createContent.call(this);

  this._createSunburst();
};

SunburstChart.prototype.calDepth = function (node) {
  if (node.child && node.child.length > 0) {
    return (node.span || 1) + Math.max.apply(Math, node.child.map(this.calDepth.bind(this)));
  } else return node.span || 1;
};

_VCore.default.creator.sunburstchart = SunburstChart;
var _default = SunburstChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/SquareChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/SquareChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _BaseChart = _interopRequireDefault(require("./BaseChart"));

var _helper = require("./helper");


// vchart.creator.correlationchart = function () {
//     var _ = _;
//     var $ = vchart.$;
//     var res = _({
//         tag: 'svg',
//         class: 'base-chart',
//         child: 'axis'
//     }, true);
//     res.$axis = $('axis', res);
//     res.sync = res.afterAttached();
//     return res;
// };
// vchart.creator.correlationchart.prototype.updateSize = vchart.creator.basechart.prototype.updateSize;
// vchart.creator.correlationchart.prototype.update = function () {
//     this.updateSize();
//     this.updateBackComp();
//     this.updateAxis();
//     this.updateComp();
// };
// vchart.creator.correlationchart.prototype.mapOXColumn = function (index) {
//     return this.oxyLeft + (index + 0.5) * this.oxSegmentLength;
// };
// vchart.creator.correlationchart.prototype.mapOYValue = function (value) {
//     return this.oxyBottom - this.oyLength * value;
// };
// vchart.creator.correlationchart.prototype.updateAxis = function () {
//     this.$axis.moveTo(this.oxyLeft, this.oxyBottom);
//     this.$axis.resize(this.canvasWidth - this.oxyLeft - 10, this.oxyBottom - 43);
//     this.$oyName.attr({ x: 3, y: 30 });
//     this.$oxName.attr({ x: this.canvasWidth - 4, y: this.oxyBottom + 20 });
// };
// vchart.creator.correlationchart.prototype.initBackComp = function () {
//     this.$title = text(this.title, 0, 0, 'base-chart-title').attr('text-anchor', 'middle').addTo(this);
//     this.$oyName = text(this.valueName, 0, 0, 'base-chart-oxy-text').addTo(this);
//     this.$oxName = text(this.keyName, 0, 100, 'base-chart-oxy-text').attr('text-anchor', 'end').addTo(this);
//     this.$keyNames = this.keys.map(function (key) {
//         return text(key, 100, 100).attr('text-anchor', 'middle').addTo(this);
//     }.bind(this));
// };
// vchart.creator.correlationchart.prototype.updateBackComp = function () {
//     this.$title.attr({ x: this.canvasWidth / 2, y: 20 });
//     this.oxyLeft = Math.max(20, this.$oyName.getBBox().width);
//     this.oxyBottom = this.canvasHeight - 10;
//     this.oxLength = this.canvasWidth - this.oxyLeft - 12 - this.$oxName.getBBox().width;
//     this.oxSegmentLength = this.oxLength / this.keys.length;
//     var oyNameHeight = this.$keyNames.reduce(function (ac, $keyName) {
//         return Math.max($keyName.getBBox().height);
//     }.bind(this), 0);
//     this.oxyBottom -= oyNameHeight;
//     this.oyLength = this.oxyBottom - 50;
//     this.$keyNames.forEach(function ($keyName, i) {
//         $keyName.attr({ x: this.mapOXColumn(i), y: this.oxyBottom + 20 });
//     }.bind(this), 0);
// };
// vchart.creator.correlationchart.prototype.initComp = function () {
//     this.$staticVLines = this.staticValues.map(function (value, i) {
//         return vline(0, 0, 0, ['correlation-chart-normal-line', 'static']).addTo(this);
//     }.bind(this));
//     this.$staticHLines = this.staticValues.map(function (value, i) {
//         return hline(0, 0, 0, ['correlation-chart-normal-line', 'static']).addTo(this);
//     }.bind(this));
//     this.$dynamicVLines = this.dynamicValues.map(function (value, i) {
//         return vline(0, 0, 0, ['correlation-chart-normal-line', 'dynamic']).addTo(this);
//     }.bind(this));
//     this.$dynamicHLines = this.dynamicValues.map(function (value, i) {
//         return hline(0, 0, 0, ['correlation-chart-normal-line', 'dynamic']).addTo(this);
//     }.bind(this));
//     this.$staticPlots = this.staticValues.map(function (value, i) {
//         return circle(50 + i * 30, 100, this.plotRadius, ['correlation-chart-plot', 'static']).addTo(this);
//     }.bind(this));
//     this.$staticLine = _('path.correlation-chart-line.static').addTo(this);
//     this.$dynamicPlots = this.dynamicValues.map(function (value, i) {
//         return circle(50 + i * 30, 200, this.plotRadius, ['correlation-chart-plot', 'dynamic']).addTo(this);
//     }.bind(this));
//     this.$dynamicLine = _('path.correlation-chart-line.dynamic').addTo(this);
// };
// vchart.creator.correlationchart.prototype.updateComp = function () {
//     this.$staticVLines.forEach(function ($staticVLine, i) {
//        moveVLine($staticVLine, this.mapOXColumn(i), this.oxyBottom, this.mapOYValue(this.staticValues[i]) - this.oxyBottom);
//     }.bind(this));
//     this.$staticHLines.forEach(function ($staticHLine, i) {
//         moveHLine($staticHLine, this.oxyLeft, this.mapOYValue(this.staticValues[i]), this.mapOXColumn(i) - this.oxyLeft);
//     }.bind(this));
//     this.$dynamicVLines.forEach(function ($dynamicVLine, i) {
//        moveVLine($dynamicVLine, this.mapOXColumn(i), this.oxyBottom, this.mapOYValue(this.dynamicValues[i]) - this.oxyBottom);
//     }.bind(this));
//     this.$dynamicHLines.forEach(function ($dynamicHLine, i) {
//         moveHLine($dynamicHLine, this.oxyLeft, this.mapOYValue(this.dynamicValues[i]), this.mapOXColumn(i) - this.oxyLeft);
//     }.bind(this));
//     this.$staticPlots.forEach(function ($plot, i) {
//         $plot.attr({ cx: this.mapOXColumn(i), cy: this.mapOYValue(this.staticValues[i]) });
//     }.bind(this));
//     var staticPoints = this.staticValues.map(function (value, i) {
//         return [this.mapOXColumn(i), this.mapOYValue(value)];
//     }.bind(this));
//     this.$staticLine.attr('d', vchart.autoCurve(staticPoints, 0.7, 0.01));//
//     this.$dynamicPlots.forEach(function ($plot, i) {
//         $plot.attr({ cx: this.mapOXColumn(i), cy: this.mapOYValue(this.dynamicValues[i]) });
//     }.bind(this));
//     var dynamicPoints = this.dynamicValues.map(function (value, i) {
//         return [this.mapOXColumn(i), this.mapOYValue(value)];
//     }.bind(this));
//     this.$dynamicLine.attr('d', vchart.autoCurve(dynamicPoints, 0.7, 0.01));//
// };
// vchart.creator.correlationchart.prototype.preInit = function (props) {
//     this.plotRadius = 6;
// };
// vchart.creator.correlationchart.prototype.init = function (props) {
//     this.super(props);
//     this.preInit();
//     this.initBackComp();
//     this.initComp();
//     this.sync = this.sync.then(this.update.bind(this));
// };
var _ = _VCore.default._;
var $ = _VCore.default.$;

function SquareChart() {
  var res = _({
    tag: 'svg',
    class: 'base-chart',
    child: 'axis'
  }, true);

  res.$axis = $('axis', res);
  res.sync = res.afterAttached();
  return res;
}

;
SquareChart.prototype.updateSize = _BaseChart.default.prototype.updateSize;

SquareChart.prototype.getY = function (k, y0, x) {
  var a = k * k / 64;
  return (0, _helper.map)(a * x * x * x * x + a * x * x + x, 0, 1 + 2 * a, y0, 1);
};

SquareChart.prototype.staticY = function (x) {
  return this.getY(this.static.k, this.static.y0, x);
};

SquareChart.prototype.dynamicY = function (x) {
  return this.getY(this.dynamic.k, this.dynamic.y0, x);
};

SquareChart.prototype.getX = function (index) {
  return index / (this.keys.length - 1);
};

SquareChart.prototype.update = function () {
  this.updateSize();
  this.updateBackComp();
  this.updateAxis();
  this.updateComp();
};

SquareChart.prototype.mapOXColumn = function (index) {
  return this.oxyLeft + (index + 0.5) * this.oxSegmentLength;
};

SquareChart.prototype.mapOYValue = function (value) {
  return this.oxyBottom - this.oyLength * value;
};

SquareChart.prototype.updateAxis = function () {
  this.$axis.moveTo(this.oxyLeft, this.oxyBottom);
  this.$axis.resize(this.canvasWidth - this.oxyLeft - 10, this.oxyBottom - 43);
  this.$oyName.attr({
    x: this.oxyLeft - 5,
    y: 30
  });
  this.$oxName.attr({
    x: this.canvasWidth - 4,
    y: this.oxyBottom + 20
  });
};

SquareChart.prototype.initBackComp = function () {
  this.$title = (0, _helper.text)(this.title || '', 0, 0, 'base-chart-title').attr('text-anchor', 'middle').addTo(this);
  this.$oyName = (0, _helper.text)(this.valueName, 0, 0, 'base-chart-oxy-text').attr('text-anchor', 'end').addTo(this);
  this.$oxName = (0, _helper.text)(this.keyName, 0, 100, 'base-chart-oxy-text').attr('text-anchor', 'end').addTo(this);
  this.$keyNames = this.keys.map(function (key) {
    return (0, _helper.text)(key, 100, 100).attr('text-anchor', 'middle').addTo(this);
  }.bind(this));
  this.$testText = (0, _helper.text)('0'.repeat(10), 0, 18).addStyle('visibility', 'hidden').addTo(this);
};

SquareChart.prototype.updateBackComp = function () {
  // update value text
  if (this.minValueText !== null && this.minValueText !== undefined) this.$minValueText.innerHTML = this.minValueText;else this.$minValueText.innerHTML = '';
  if (this.maxValueText !== null && this.maxValueText !== undefined) this.$maxValueText.innerHTML = this.maxValueText;else this.$maxValueText.innerHTML = '';
  this.$title.attr({
    x: this.canvasWidth / 2,
    y: 20
  });
  this.oxyLeft = Math.max(20, this.$oyName.getBBox().width + 10, this.$maxValueText.getBBox().width + 10, this.$minValueText.getBBox().width + 10, this.$testText.getBBox().width / 10 * this.minValueTextLength + 10);
  this.oxyBottom = this.canvasHeight - 10;
  this.oxLength = this.canvasWidth - this.oxyLeft - 12 - this.$oxName.getBBox().width;
  this.oxSegmentLength = this.oxLength / this.keys.length;
  var oyNameHeight = this.$keyNames.reduce(function (ac, $keyName) {
    return Math.max($keyName.getBBox().height);
  }.bind(this), 0);
  this.oxyBottom -= oyNameHeight;
  this.oyLength = this.oxyBottom - 50;
  this.$keyNames.forEach(function ($keyName, i) {
    $keyName.attr({
      x: this.mapOXColumn(i),
      y: this.oxyBottom + 20
    });
  }.bind(this), 0);
};

SquareChart.prototype.initComp = function () {
  this.$staticVLines = this.keys.map(function (value, i) {
    return (0, _helper.vline)(0, 0, 0, ['correlation-chart-normal-line', 'static']).addTo(this);
  }.bind(this));
  this.$staticHLines = this.keys.map(function (value, i) {
    return (0, _helper.hline)(0, 0, 0, ['correlation-chart-normal-line', 'static']).addTo(this);
  }.bind(this));
  this.$dynamicVLines = this.keys.map(function (value, i) {
    return (0, _helper.vline)(0, 0, 0, ['correlation-chart-normal-line', 'dynamic']).addTo(this);
  }.bind(this));
  this.$dynamicHLines = this.keys.map(function (value, i) {
    return (0, _helper.hline)(0, 0, 0, ['correlation-chart-normal-line', 'dynamic']).addTo(this);
  }.bind(this));
  this.$staticPlots = this.keys.map(function (value, i) {
    return (0, _helper.circle)(50 + i * 30, 100, this.plotRadius, ['correlation-chart-plot', 'static']).addTo(this);
  }.bind(this));
  this.$staticLine = _('path.correlation-chart-line.static').addTo(this);
  this.$dynamicPlots = this.keys.map(function (value, i) {
    return (0, _helper.circle)(50 + i * 30, 200, this.plotRadius, ['correlation-chart-plot', 'dynamic']).addTo(this);
  }.bind(this));
  this.$dynamicLine = _('path.correlation-chart-line.dynamic').addTo(this); // (this.minValueText !== undefined && this.minValueText  === null)

  this.$minValueText = (0, _helper.text)('test', 10, 100).attr('text-anchor', 'end').addTo(this);
  this.$maxValueText = (0, _helper.text)('test 2   ', 100, 100).attr('text-anchor', 'end').addTo(this);
};

SquareChart.prototype.updateComp = function () {
  this.$staticVLines.forEach(function ($staticVLine, i) {
    (0, _helper.moveVLine)($staticVLine, this.mapOXColumn(i), this.oxyBottom, this.mapOYValue(this.staticY(this.getX(i))) - this.oxyBottom);
  }.bind(this));
  this.$staticHLines.forEach(function ($staticHLine, i) {
    (0, _helper.moveHLine)($staticHLine, this.oxyLeft, this.mapOYValue(this.staticY(this.getX(i))), this.mapOXColumn(i) - this.oxyLeft);
  }.bind(this));
  this.$dynamicVLines.forEach(function ($dynamicVLine, i) {
    (0, _helper.moveVLine)($dynamicVLine, this.mapOXColumn(i), this.oxyBottom, this.mapOYValue(this.dynamicY(this.getX(i))) - this.oxyBottom);
  }.bind(this));
  this.$dynamicHLines.forEach(function ($dynamicHLine, i) {
    (0, _helper.moveHLine)($dynamicHLine, this.oxyLeft, this.mapOYValue(this.dynamicY(this.getX(i))), this.mapOXColumn(i) - this.oxyLeft);
  }.bind(this));
  this.$staticPlots.forEach(function ($plot, i) {
    $plot.attr({
      cx: this.mapOXColumn(i),
      cy: this.mapOYValue(this.staticY(this.getX(i)))
    });
  }.bind(this));
  var staticPoints = Array(101).fill(0).map(function (value, i) {
    return [this.mapOXColumn(i * (this.keys.length - 1) / 100), this.mapOYValue(this.staticY(i / 100))];
  }.bind(this));
  this.$staticLine.attr('d', vchart.autoCurve(staticPoints, 0.7, 0.01)); //

  this.$dynamicPlots.forEach(function ($plot, i) {
    $plot.attr({
      cx: this.mapOXColumn(i),
      cy: this.mapOYValue(this.dynamicY(this.getX(i)))
    });
  }.bind(this));
  var dynamicPoints = Array(101).fill(0).map(function (value, i) {
    return [this.mapOXColumn(i * (this.keys.length - 1) / 100), this.mapOYValue(this.dynamicY(i / 100))];
  }.bind(this));
  this.$dynamicLine.attr('d', vchart.autoCurve(dynamicPoints, 0.7, 0.01)); //

  this.$minValueText.attr({
    x: this.oxyLeft - 5,
    y: this.mapOYValue(this.dynamicY(this.getX(0))) + 6
  });
  this.$maxValueText.attr({
    x: this.oxyLeft - 5,
    y: this.mapOYValue(this.dynamicY(this.getX(this.keys.length - 1))) + 6
  });
};

SquareChart.prototype.preInit = function (props) {
  this.plotRadius = 6;
  this.minValueTextLength = 0;
};

SquareChart.prototype.init = function (props) {
  this.preInit();
  this.super(props);
  this.initBackComp();
  this.initComp();
  this.sync = this.sync.then(this.update.bind(this));
};

_VCore.default.creator.squarechart = SquareChart;
var _default = SquareChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/GroupRankChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/GroupRankChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _helper = require("./helper");

var _template = require("./template");


var _ = _VCore.default._;
var $ = _VCore.default.$;

function GroupRankChart() {
  var suffix = (Math.random() + '').replace(/\./g, '');

  var res = _({
    tag: 'svg',
    class: 'grank-chart',
    child: [{
      tag: 'g',
      attr: {
        id: 'contentBox'
      },
      child: 'g#content'
    }, {
      tag: 'path',
      class: 'base-chart-white-mask',
      attr: {
        fill: 'white',
        stroke: 'white',
        'fill-rule': 'evenodd',
        d: 'M0,0  0,2000 2000,2000 2000,0zM100,0  0,200 200,200 200,0z'
      }
    }, 'axis', 'hscrollbar']
  });

  res.sync = res.afterAttached();
  res.$axis = $('axis', res);
  res.$whiteBoxMask = $('.base-chart-white-mask', res);
  res.$content = $('g#content', res);
  res.eventHandler = _OOP.default.bindFunctions(res, GroupRankChart.eventHandler); // res.on('wheel', res.eventHandler.wheel);

  res.$hscrollbar = $('hscrollbar', res).on('scroll', res.eventHandler.scrollbarscroll);
  return res;
}

;
GroupRankChart.eventHandler = {};

GroupRankChart.eventHandler.wheel = function (event) {
  var d = this.scrollBy(event.deltaY);

  if (d != 0) {
    event.preventDefault();
  }
};

GroupRankChart.eventHandler.scrollArrowsPressLeft = function (event) {
  this.scrollBy(-60);
};

GroupRankChart.eventHandler.scrollArrowsPressRight = function (event) {
  this.scrollBy(60);
};

GroupRankChart.eventHandler.scrollbarscroll = function (event) {
  this.scrollLeft = this.$hscrollbar.scrollLeft;
  event.preventDefault();
};

GroupRankChart.prototype.scrollBy = function (dX) {
  var scrollLeft = this.scrollLeft + dX / 5;
  var scrollLeft = Math.max(0, Math.min(this.oxContentLength - this.oxLength, scrollLeft));
  var deltaX = scrollLeft - this.scrollLeft;

  if (deltaX != 0) {
    this.scrollLeft = scrollLeft;
    this.$hscrollbar.scrollLeft = scrollLeft;
  }

  return deltaX;
};

GroupRankChart.prototype.numberToString = function (value) {
  return value.toString();
};

GroupRankChart.prototype._createMember = function (member) {
  var res = _('g');

  res.$plot = (0, _helper.circle)(this.plotRadius, 0, this.plotRadius, 'grank-chart-plot').addTo(res);
  res.$name = (0, _helper.text)(member.name, this.plotRadius * 2 + 9, -3).addTo(res);
  res.$value = (0, _helper.text)('' + this.numberToString(member.value) + '', this.plotRadius * 2 + 9, 16).addTo(res);
  return res;
};

GroupRankChart.prototype._createOyValues = function (minValue, step, segmentCount, extendOY) {
  var child = Array(segmentCount + 1 + (extendOY ? 1 : 0)).fill(0).map(function (u, i) {
    var value;

    if (extendOY) {
      if (i == 0) {
        value = 0;
      } else {
        value = minValue + (i - 1) * step;
      }
    } else {
      value = minValue + i * step;
    }

    return {
      tag: 'text',
      attr: {
        x: '-14',
        y: '0',
        'text-anchor': 'end'
      },
      props: {
        innerHTML: this.numberToString(value)
      }
    };
  }.bind(this));
  return _({
    tag: 'g',
    child: child
  });
};

GroupRankChart.prototype._createOYSegmentLines = function (n) {
  var res = _({
    tag: 'g',
    child: Array(n).fill('path.vchart-segment-line')
  });

  return res;
};

GroupRankChart.prototype._createGroup = function (group) {
  return _({
    tag: 'g',
    child: group.members.map(this._createMember.bind(this))
  });
};

GroupRankChart.prototype._callOYValue = function (val) {
  return -this.paddingnAxisBottom + (this.extendOY ? -this.oySegmentLength : 0) - (0, _helper.map)(val, this.oyMinValue, this.oyMaxValue, 0, this.oyLength - (this.extendOY ? this.oySegmentLength : 0));
};

GroupRankChart.prototype.updateSize = function () {
  this.attr({
    width: this.canvasWidth + '',
    height: this.canvasHeight + '',
    viewBox: [0, 0, this.canvasWidth, this.canvasHeight].join(' ')
  });
  this.$title.attr('x', this.canvasWidth / 2);
};

GroupRankChart.prototype.updateOyValues = function () {
  this.oyLength = this.oxyBottom - 70 - this.paddingnAxisBottom;
  this.oySegmentLength = this.oyLength / (this.oySegmentCount + (this.extendOY ? 1 : 0));
  Array.prototype.forEach.call(this.$oyValues.childNodes, function (e, i) {
    e.attr({
      y: -i * this.oySegmentLength + 5 - this.paddingnAxisBottom,
      x: -10
    });
  }.bind(this));
  var oyValuesBox = this.$oyValues.getBBox();
  this.oxyLeft = Math.max(this.oxyLeft, oyValuesBox.width + 14, this.$oyName.getBBox().width);
  this.oxLength = this.canvasWidth - this.oxyLeft - 24;
  this.$oyValues.attr('transform', 'translate(' + this.oxyLeft + ',' + this.oxyBottom + ')');
};

GroupRankChart.prototype.updateAxis = function () {
  this.$axis.attr('transform', (0, _template.translate)(this.oxyLeft, this.oxyBottom));
  this.$axis.resize(this.canvasWidth - this.oxyLeft - 10, this.oxyBottom - 50);
  this.$oyName.attr({
    x: this.oxyLeft,
    y: 30,
    'text-anchor': 'end'
  });
  this.$whiteBoxMask.attr('d', 'M0,0  0,cvh cvw,cvh cvw,0zMleft,top  left,bottom right,bottom right,topz'.replace(/cvh/g, this.canvasHeight).replace(/cvw/g, this.canvasWidth).replace(/left/g, this.oxyLeft).replace(/top/g, 1).replace(/bottom/g, this.canvasHeight).replace(/right/g, this.canvasWidth - 10));
  this.$content.attr('transform', 'translate(' + this.oxyLeft + ',' + this.oxyBottom + ')');
  this.$oxName.attr({
    x: this.canvasWidth - this.$oxName.getBBox().width - 3,
    y: this.oxyBottom - 9
  });
};

GroupRankChart.prototype.updateOYSegmentLines = function () {
  this.$oySegmentLines.attr('transform', 'translate(' + this.oxyLeft + ',' + this.oxyBottom + ')');
  Array.prototype.forEach.call(this.$oySegmentLines.childNodes, function (e, i) {
    (0, _helper.moveHLine)(e, -2, -i * this.oySegmentLength - this.paddingnAxisBottom, 4);
  }.bind(this));
};

GroupRankChart.prototype.updateGroups = function () {
  this.oxContentLength = this.$groups.reduce(function (contentLength, ge, groupIndex) {
    var group = this.groups[groupIndex];
    contentLength = contentLength + 20;
    var maxDY = Array.prototype.reduce.call(ge.childNodes, function (maxDY, meme, j) {
      var member = group.members[j];

      var y = this._callOYValue(member.value);

      meme.attr('transform', (0, _template.translate)(contentLength, y));
      meme._tr_y = y;
      return Math.max(maxDY, -y);
    }.bind(this), 0); //todo:auto x

    var memberElements = Array.apply(null, ge.childNodes);
    memberElements.sort(function (a, b) {
      return a._tr_y - b._tr_y;
    });
    var ninf = -1000000;
    var messure = memberElements.reduce(function (ac, e) {
      var y = e._tr_y;
      var colIndex = 0;

      while (ac[colIndex].minY > y) ++colIndex;

      ac[colIndex].minY = y + 40;
      ac[colIndex].child.push(e);
      ac[colIndex].maxWidth = Math.max(ac[colIndex].maxWidth, e.getBBox().width);
      return ac;
    }, Array(200).fill(null).map(function () {
      return {
        minY: ninf,
        child: [],
        maxWidth: ninf
      };
    }));
    messure.reduce(function (left, col) {
      if (col.child.length == 0) return;
      col.child.forEach(function (meme) {
        meme.attr('transform', (0, _template.translate)(left, meme._tr_y));
      });
      return left + col.maxWidth + 9;
    }, contentLength);
    var innerWidth = ge.getBBox().width;
    this.$groupBoxes[groupIndex].attr({
      x: contentLength - 10,
      width: innerWidth + 20,
      y: -maxDY - (this.plotRadius + 20),
      height: maxDY + this.plotRadius + 20
    });
    var columeWidth = Math.max(ge.getBBox().width + 20, this.$groupNames[groupIndex].getBBox().width + 10);
    this.$groupNames[groupIndex].attr('x', contentLength + columeWidth / 2);
    contentLength += columeWidth;
    return contentLength;
  }.bind(this), 0);
};

GroupRankChart.prototype.updateScrollArrows = function () {
  this.$scrollArrows.attr('transform', 'translate(' + (this.oxyLeft + 7) + ', ' + (this.oxyBottom - this.oyLength / 2) + ')');
  this.$scrollArrows.$rightArrow.attr('transform', 'translate(' + (this.oxLength - 15) + ', 0)');
  this.scrollLeft = this.scrollLeft; //update

  this.$hscrollbar.resize(this.oxLength, 10);
  this.$hscrollbar.moveTo(this.oxyLeft, this.oxyBottom - 10);
  this.$hscrollbar.outterWidth = this.oxLength;
  this.$hscrollbar.innerWidth = this.oxContentLength;
};

GroupRankChart.prototype.update = function () {
  if (!this.groups || this.groups.length <= 0) return;

  if (typeof this.canvasWidth != 'number') {
    this.canvasWidth = 300;
    this.autoWidth = true;
  }

  this.updateSize();
  this.updateOyValues();
  this.updateAxis();
  this.updateOYSegmentLines();
  this.updateGroups();
  this.updateScrollArrows();
  requestAnimationFrame(function () {
    if (this.autoWidth) {
      var requireWidth = this.canvasWidth + this.overflowOX;
      var proviceWidth = this.parentElement.getBoundingClientRect().width;
      this.canvasWidth = Math.max(Math.min(requireWidth, proviceWidth), 300);
      this.autoWidth = false;
      this.update();
    }
  }.bind(this));
};

GroupRankChart.prototype.initComp = function () {
  this.maxValue = this.groups.reduce(function (ac, group) {
    return group.members.reduce(function (ac, member) {
      return Math.max(ac, member.value);
    }, ac);
  }, -10000000000);
  this.minValue = this.groups.reduce(function (ac, group) {
    return group.members.reduce(function (ac, member) {
      return Math.min(ac, member.value);
    }, ac);
  }, 10000000000);
  if (this.maxValue == this.minValue) this.maxValue += this.maxSegment;
  this.oxyBottom = this.canvasHeight - 40; //fix size, not need update

  this.oxyLeft = 0;
  var btSgmt = (0, _helper.calBeautySegment)(this.maxSegment, this.minValue, this.maxValue);
  this.oySegmentCount = btSgmt.segmentCount;
  this.oyMinValue = btSgmt.minValue;
  this.oyMaxValue = btSgmt.maxValue;
  this.extendOY = !!(this.zeroOY && this.oyMinValue > 0);
  this.oyStep = btSgmt.step;
  this.$oyValues = this._createOyValues(this.oyMinValue, this.oyStep, this.oySegmentCount, this.extendOY).addTo(this);
  this.$oySegmentLines = this._createOYSegmentLines(this.oySegmentCount + 1 + (this.extendOY ? 1 : 0)).addTo(this);
  this.$title = vchart.text(this.title || '', 0, 19, 'base-chart-title').attr('text-anchor', 'middle').addTo(this);
  this.$oyName = vchart.text(this.valueName || '', 0, 0, 'base-chart-oxy-text').addTo(this);
  this.$oxName = vchart.text(this.keyName || '', 0, 0, 'base-chart-oxy-text').addTo(this);
  this.$groups = this.groups.map(function (group) {
    return this._createGroup(group).addTo(this.$content);
  }.bind(this));
  this.$groupNames = this.groups.map(function (group) {
    return vchart.text(group.name, 0, 18).attr('text-anchor', 'middle').addTo(this.$content);
  }.bind(this));
  this.$groupBoxes = this.groups.map(function (group) {
    return vchart.rect(0, 0, 0, 0, 'grank-chart-group-rect').addTo(this.$content);
  }.bind(this));
  this.$scrollArrows = _('scrollarrow').addTo(this).on('pressleft', this.eventHandler.scrollArrowsPressLeft).on('pressright', this.eventHandler.scrollArrowsPressRight);
};

GroupRankChart.prototype.init = function (props) {
  this.plotRadius = 6;
  this.canvasWidth = 400;
  this.canvasHeight = 300;
  this.maxSegment = 9;
  this.paddingnAxisBottom = this.plotRadius + 30;
  this.valueName = '';
  this.super(props);

  if (!this.groups || this.groups.length <= 0) {
    console.log('Empty data!');
    return;
  }

  this.initComp();
  this.sync = this.sync.then(this.update.bind(this));
};

GroupRankChart.property = {};
GroupRankChart.property.scrollLeft = {
  set: function (value) {
    this._scrollLeft = value || 0;
    this.$content.attr('transform', 'translate(' + (this.oxyLeft - this.scrollLeft) + ',' + this.oxyBottom + ')');

    if (this.scrollLeft > 0.001) {
      this.$scrollArrows.$leftArrow.removeStyle('display');
    } else {
      this.$scrollArrows.$leftArrow.addStyle('display', 'none');
    }

    if (this.oxContentLength - this.oxLength > this.scrollLeft + 0.001) {
      this.$scrollArrows.$rightArrow.removeStyle('display');
    } else {
      this.$scrollArrows.$rightArrow.addStyle('display', 'none');
    }
  },
  get: function () {
    return this._scrollLeft || 0;
  }
};
GroupRankChart.property.overflowOX = {
  get: function () {
    return Math.max(0, this.oxContentLength - this.oxLength);
  }
};
_VCore.default.creator.grouprankchart = GroupRankChart;
var _default = GroupRankChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/MappingChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/MappingChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _BaseChart = _interopRequireDefault(require("./BaseChart"));

var _helper = require("./helper");

var _template = require("./template");


var _ = _VCore.default._;
var $ = _VCore.default.$;
var STATE_READY = 0;
var STATE_MODIFY = 1;

function MappingChart() {
  var res = _({
    tag: 'svg',
    attr: {
      tabindex: '1'
    },
    class: 'mapping-chart',
    extendEvent: ['add', 'addmakertop', 'addmarkerbot', 'clicktop', 'clickbot', 'addline', 'removeline', 'editline'],
    child: ['g.background', 'g.middleground', 'g.forceground']
  });

  res.$background = $('g.background', res);
  res.$middleground = $('g.middleground', res);
  res.$forceground = $('g.forceground', res);
  res.sync = res.afterAttached();
  return res;
}

;

MappingChart.prototype.generateValue = function (number) {
  return Math.round(Math.round(number * this.precision) / this.precision);
};

MappingChart.prototype.preInit = function () {
  this.canvasWidth = 300;
  this.canvasHeight = 300;
  this.rangePlotRadius = 6;
  this.axisTop = 70;
  this.hitboxHeight = 20;
  this.tempValue = 0;
  this.markerHitboxWidth = 1;
};

MappingChart.prototype.numberToString = function (number) {
  return number + '';
};

MappingChart.prototype.updateSize = _BaseChart.default.prototype.updateSize;
MappingChart.prototype.numberToString = _BaseChart.default.prototype.numberToString;

MappingChart.prototype.initAxis = function () {
  this.$topMinPlot = _('shape.mapping-chart-range-plot').addTo(this.$background);
  this.$topMaxPlot = _('shape.mapping-chart-range-plot').addTo(this.$background);
  this.$botMinPlot = _('shape.mapping-chart-range-plot').addTo(this.$background);
  this.$botMaxPlot = _('shape.mapping-chart-range-plot').addTo(this.$background);
  this.$topLine = (0, _helper.hline)(50, 50, 500, 'mapping-chart-range-line').addTo(this.$background);
  this.$botLine = (0, _helper.hline)(50, 50, 500, 'mapping-chart-range-line').addTo(this.$background);
  this.$topMinText = (0, _helper.text)(this.numberToString(this.min), 20, 20, 'mapping-chart-range-text').addTo(this.$background);
  this.$topMaxText = (0, _helper.text)(this.numberToString(this.max), 30, 20, 'mapping-chart-range-text').addTo(this.$background);
  this.$botMinText = (0, _helper.text)(this.numberToString(this.min), 20, 50, 'mapping-chart-range-text').addTo(this.$background);
  this.$botMaxText = (0, _helper.text)(this.numberToString(this.max), 30, 50, 'mapping-chart-range-text').addTo(this.$background);
  this.$title = (0, _helper.text)(this.title || '', 0, 25, 'mapping-chart-title').addTo(this.$background).attr('text-anchor', 'middle');
};

MappingChart.prototype.updateAxis = function () {
  this.axisLeft = 10 + this.$topMinText.getBBox().width + 10;
  var maxTextWidth = this.$botMaxText.getBBox().width;
  this.axisRight = this.canvasWidth - 10 - maxTextWidth - 10;
  this.axisBottom = this.canvasHeight - 50;
  this.$topMinText.attr({
    x: '10',
    y: this.axisTop - 4 + ''
  });
  this.$topMaxText.attr({
    x: this.canvasWidth - 10 - maxTextWidth,
    y: this.axisTop - 4 + ''
  });
  this.$botMinText.attr({
    x: '10',
    y: this.axisBottom + 4 + 14
  });
  this.$botMaxText.attr({
    x: this.canvasWidth - 10 - maxTextWidth,
    y: this.axisBottom + 4 + 14
  });
  this.$topMinPlot.begin().moveTo(this.axisLeft, this.axisTop - 5).lineTo(this.axisLeft, this.axisTop + 5).end();
  this.$topMaxPlot.begin().moveTo(this.axisRight, this.axisTop - 5).lineTo(this.axisRight, this.axisTop + 5).end();
  (0, _helper.moveHLine)(this.$topLine, this.axisLeft, this.axisTop, this.axisRight - this.axisLeft);
  this.$botMinPlot.begin().moveTo(this.axisLeft, this.axisBottom - 5).lineTo(this.axisLeft, this.axisBottom + 5).end();
  this.$botMaxPlot.begin().moveTo(this.axisRight, this.axisBottom - 5).lineTo(this.axisRight, this.axisBottom + 5).end();
  (0, _helper.moveHLine)(this.$botLine, this.axisLeft, this.axisBottom, this.axisRight - this.axisLeft);
  this.$title.attr({
    x: this.canvasWidth / 2,
    y: 10 + 20
  });
};

MappingChart.prototype.initHitbox = function () {
  this.$topHitbox = (0, _helper.rect)(20, 20, 300, 20, 'vchart-hitbox').on({
    mouseenter: this.eventEnterHitboxHandler.bind(this),
    mouseleave: this.eventLeaveHitboxHandler.bind(this),
    click: this.eventClickHitboxHandler.bind(this)
  }).addTo(this.$forceground);
  this.$botHitbox = (0, _helper.rect)(20, 80, 300, 20, 'vchart-hitbox').on({
    mouseenter: this.eventEnterHitboxHandler.bind(this),
    mouseleave: this.eventLeaveHitboxHandler.bind(this),
    click: this.eventClickHitboxHandler.bind(this)
  }).addTo(this.$forceground);
};

MappingChart.prototype.updateHitbox = function () {
  this.$topHitbox.attr({
    x: this.axisLeft,
    y: this.axisTop - this.hitboxHeight / 2,
    height: this.hitboxHeight,
    width: this.axisRight - this.axisLeft
  });
  this.$botHitbox.attr({
    x: this.axisLeft,
    y: this.axisBottom - this.hitboxHeight / 2,
    height: this.hitboxHeight,
    width: this.axisRight - this.axisLeft
  });
};

MappingChart.prototype.initTempmarker = function () {
  this.$tempTopMarker = _('mappingchartmarker.top').addTo(this.$forceground);
  this.$tempBotMarker = _('mappingchartmarker.bot').addTo(this.$forceground);
  this.$tempTopMarker.rotate180 = true;
  this.$tempTopMarker.text = this.numberToString(this.min);
  this.$tempBotMarker.text = this.numberToString(this.min);
};

MappingChart.prototype.updateTempMarker = function () {
  //todo
  if ((0, _helper.isNumber)(this.collision)) {
    this.markerHitboxWidth = Math.max(1, (0, _helper.map)(this.collision, 0, this.max - this.min, 0, this.axisRight - this.axisLeft));
  }

  this.$tempTopMarker.moveTo(this.axisLeft, this.axisTop);
  this.$tempBotMarker.moveTo(this.axisLeft, this.axisBottom);
  this.$tempTopMarker.hitboxWidth = this.markerHitboxWidth;
  this.$tempBotMarker.hitboxWidth = this.markerHitboxWidth;
};

MappingChart.prototype.initComp = function () {
  this.initAxis();
  this.initTempmarker();
  this.initHitbox();
};

MappingChart.prototype.updateComp = function () {
  this.updateAxis();
  this.updateHitbox();
  this.updateTempMarker();
};

MappingChart.prototype.update = function () {
  this.updateSize();
  this.updateComp();
};

MappingChart.prototype.addMarkerTop = function (value) {
  var value = this.generateValue(this.tempValue);
  var cLine;

  if (!this._tempLine) {
    this._tempLine = {
      value: 0,
      //default
      $line: _('shape.mapping-chart-map-line').addTo(this.$background),
      $line_hitbox: _('shape.mapping-chart-map-line-hitbox.vchart-hitbox').addTo(this.$middleground),
      $topMarker: _({
        tag: 'mappingchartmarker'
      }).addTo(this.$forceground),
      $topPlot: (0, _helper.circle)(20, 20, 5, 'mapping-chart-line-plot').addTo(this.$forceground)
    };
  }

  this._tempLine.value = value;
  var x0 = (0, _helper.map)(value, this.min, this.max, this.axisLeft, this.axisRight);
  var y0 = this.axisTop;
  this._tempLine.x0 = x0;
  this._tempLine.y0 = y0;

  this._tempLine.$topMarker.moveTo(x0, y0);

  this._tempLine.$topPlot.attr({
    cx: x0,
    cy: y0
  });

  this._tempLine.$topMarker.text = this.numberToString(this.generateValue(value));
  var self = this;
  var lineElt = this._tempLine.$line;

  function mouseMoveHandler(event) {
    lineElt.begin().moveTo(x0, y0).lineTo(self.mouseX, self.mouseY).end();
  }

  this.on('mousemove', mouseMoveHandler);
  this.once('addmarkerbot', function () {
    this.off('mousemove', mouseMoveHandler);
  });
};

MappingChart.prototype.addMarkerBottom = function (mapValue) {
  if (!this._tempLine) return; //must click top first

  var mapValue = this.generateValue(this.tempValue);

  var isCross = this._checkLineIsCross(this._tempLine.value, mapValue);

  if (isCross) return;
  var x1 = (0, _helper.map)(mapValue, this.min, this.max, this.axisLeft, this.axisRight);
  var y1 = this.axisBottom;
  this._tempLine.mapValue = mapValue;
  this._tempLine.$botMarker = _({
    tag: 'mappingchartmarker',
    props: {
      text: this.numberToString(this.generateValue(mapValue)),
      rotate180: true
    }
  }).moveTo(x1, y1).addTo(this.$forceground);
  this._tempLine.x1 = x1;
  this._tempLine.y1 = y1;
  this._tempLine.$botPlot = (0, _helper.circle)(20, 80, 5, 'mapping-chart-line-plot').addTo(this.$forceground);

  this._tempLine.$botPlot.attr({
    cx: x1,
    cy: y1
  });

  this._tempLine.$line.begin().moveTo(this._tempLine.x0, this._tempLine.y0).lineTo(x1, y1).end();

  this._tempLine.$line_hitbox.attr('d', this._tempLine.$line.attr('d'));

  var tempLine = this._tempLine;
  this.settupEvent(tempLine);

  this._lineList.push(this._tempLine);

  this._tempLine = undefined;
  this.emit('addmarkerbot', {
    target: this,
    data: tempLine
  }, this);
  this.emit('addline', this.content, this);
};

MappingChart.prototype._checkLineIsCross = function (value, mapValue) {
  return this._lineList.some(function (element) {
    return (element.value - value) * (element.mapValue - mapValue) < 0;
  });
};

MappingChart.prototype.eventEnterHitboxHandler = function (event) {
  if (this.__removeClassTimeOutTop) {
    clearTimeout(this.__removeClassTimeOutTop);
    self.__removeClassTimeOutTop = false;
  }

  if (this.__removeClassTimeOutBot) {
    clearTimeout(this.__removeClassTimeOutBot);
    self.__removeClassTimeOutBot = false;
  }

  if (event.target == this.$topHitbox) {
    this.addClass('mapping-chart-hover-top');
  } else if (event.target == this.$botHitbox) {
    this.addClass('mapping-chart-hover-bot');
  }
};

MappingChart.prototype.eventLeaveHitboxHandler = function (event) {
  var target = event.target;
  var self = this;

  if (target == self.$topHitbox) {
    if (this.__removeClassTimeOutTop) {
      clearTimeout(this.__removeClassTimeOutTop);
      self.__removeClassTimeOutTop = false;
    }

    this.__removeClassTimeOutTop = setTimeout(function () {
      self.removeClass('mapping-chart-hover-top');
      self.__removeClassTimeOutTop = false;
    }, 100);
  } else if (target == self.$botHitbox) {
    if (this.__removeClassTimeOutBot) {
      clearTimeout(this.__removeClassTimeOutBot);
      self.__removeClassTimeOutBot = false;
    }

    self.__removeClassTimeOutBot = setTimeout(function () {
      self.removeClass('mapping-chart-hover-bot');
      self.__removeClassTimeOutBot = false;
    }, 100);
  }
};

MappingChart.prototype.eventClickHitboxHandler = function (event) {
  var target = event.target;

  if (target == this.$topHitbox) {
    if (this.state == STATE_READY) {
      this.addMarkerTop(this.tempValue);
    }

    this.emit('clicktop', {}, this);
  } else if (target == this.$botHitbox) {
    if (this.state == STATE_READY) {
      this.addMarkerBottom(this.tempValue);
    }

    this.emit('clickbot', {}, this);
  }
};

MappingChart.prototype.eventMoveHandler = function (event) {
  var hitboxBound = this.$botHitbox.getBoundingClientRect();
  var eventX = event.clientX;
  var tempValue = (0, _helper.map)(eventX, hitboxBound.left, hitboxBound.right, this.min, this.max);
  tempValue = Math.round(tempValue);
  this.tempValue = Math.min(this.max, Math.max(this.min, tempValue));
  var newX = (0, _helper.map)(this.tempValue, this.min, this.max, this.axisLeft, this.axisRight);
  this.$tempTopMarker.moveTo(newX, this.axisTop);
  this.$tempBotMarker.moveTo(newX, this.axisBottom);
  var markerText = this.numberToString(this.generateValue(this.tempValue));
  this.$tempTopMarker.text = markerText;
  this.$tempBotMarker.text = markerText;
  var bound = this.getBoundingClientRect();
  this.mouseX = (0, _helper.map)(event.clientX, bound.left, bound.right, 0, this.canvasWidth);
  this.mouseY = (0, _helper.map)(event.clientY, bound.top, bound.bottom, 0, this.canvasHeight);
};

MappingChart.prototype.cancelCMD = function () {
  if (this._tempLine) {
    this.removeElementInObject(this._tempLine);
    this._tempLine = undefined;
  } else {}
};

MappingChart.prototype.deleteCMD = function () {
  if (this._tempLine) {
    this.removeElementInObject(this._tempLine);
    this._tempLine = undefined;
  } else {
    if (this._selectedLine !== undefined) {
      var tempLine = this._selectedLine;
      this.removeElementInObject(tempLine);
      this._lineList = this._lineList.filter(function (elt) {
        return elt.value != tempLine.value && elt.mapValue != tempLine.mapValue;
      });
      this._selectedLine = undefined;
      this.emit('removeline', this.content, this);
    }
  }
};

MappingChart.prototype.eventKeyDownHandler = function (event) {
  if (event.key == "Escape") {
    this.cancelCMD();
    event.preventDefault();
  } else if (event.key == "Delete") {
    this.deleteCMD();
    event.preventDefault();
  }
};

MappingChart.prototype.settupEvent = function (tempLine) {
  var self = this;

  function clickLineHandler(event) {
    if (self._selectedLine !== undefined) {
      self._selectedLine.$line.removeClass('selected-line');

      self._selectedLine = undefined;
    }

    self._selectedLine = tempLine;
    tempLine.$line.addClass('selected-line');

    function unSelectLine() {
      tempLine.$line.removeClass('selected-line');
      if (self._selectedLine !== undefined) if (self._selectedLine.$line == tempLine.$line) self._selectedLine = undefined;
      self.off('click', clickOutHandler);
      self.off('keydown', cancelFocusHandler);
    }

    function clickOutHandler(event) {
      if (event.target != tempLine.$line) {
        unSelectLine();
      }
    }

    function cancelFocusHandler(event) {
      if (event.key == "Escape") {
        unSelectLine();
      }
    }

    setTimeout(function () {
      self.on('click', clickOutHandler);
    }, 1);
    setTimeout(function () {
      self.on('keydown', cancelFocusHandler);
    }, 1);
  }

  var lineElt = tempLine.$line;
  var line_hitboxElt = tempLine.$line_hitbox;

  function clickTopPlotHandler(event) {
    self.state = STATE_MODIFY;
    tempLine.$topMarker.addStyle('visibility', 'hidden');
    tempLine.$topPlot.addStyle('visibility', 'hidden');

    function mouseMoveHandler(event) {
      lineElt.begin().moveTo(self.mouseX, self.mouseY).lineTo(tempLine.x1, tempLine.y1).end();
    }

    function clickTopBarHandler(event, sender) {
      var newValue = self.tempValue;

      if (self._checkLineIsCross(newValue, tempLine.mapValue)) {} else {
        var newX0 = (0, _helper.map)(newValue, this.min, this.max, this.axisLeft, this.axisRight);
        lineElt.begin().moveTo(newX0, tempLine.y0).lineTo(tempLine.x1, tempLine.y1).end();
        line_hitboxElt.attr('d', lineElt.attr('d'));
        tempLine.$topMarker.moveTo(newX0, tempLine.y0);
        tempLine.$topMarker.text = this.numberToString(this.generateValue(newValue));
        tempLine.$topPlot.attr({
          cx: newX0,
          cy: tempLine.y0
        });
        tempLine.x0 = newX0;
        tempLine.value = newValue;
        tempLine.$topMarker.removeStyle('visibility', 'hidden');
        tempLine.$topPlot.removeStyle('visibility', 'hidden');
        self.off('clicktop', clickTopBarHandler);
        self.off('mousemove', mouseMoveHandler);
        self.off('keydown', KeyDownHandler);
        self.state = STATE_READY;
        this.emit('editline', this.content, this);
      }
    }

    function cancel() {
      lineElt.begin().moveTo(tempLine.x0, tempLine.y0).lineTo(tempLine.x1, tempLine.y1).end();
      line_hitboxElt.attr('d', lineElt.attr('d'));
    }

    ;

    function deleteElt() {
      self.removeElementInObject(tempLine);
      self._lineList = self._lineList.filter(function (elt) {
        return elt.value != tempLine.value && elt.mapValue != tempLine.mapValue;
      });
      this.emit('removeline', this.content, this);
    }

    ;

    function KeyDownHandler(event) {
      tempLine.$topMarker.removeStyle('visibility', 'hidden');
      tempLine.$topPlot.removeStyle('visibility', 'hidden');

      if (event.key == "Escape") {
        cancel();
        event.preventDefault();
      } else if (event.key == "Delete") {
        deleteElt();
        event.preventDefault();
      }

      self.off('clicktop', clickTopBarHandler);
      self.off('mousemove', mouseMoveHandler);
      self.off('keydown', KeyDownHandler);
      self.state = STATE_READY;
    }

    ;
    self.on('clicktop', clickTopBarHandler);
    self.on('mousemove', mouseMoveHandler);
    self.on('keydown', KeyDownHandler);
  }

  function clickBotPlotHandler(event) {
    self.state = STATE_MODIFY;
    tempLine.$botMarker.addStyle('visibility', 'hidden');
    tempLine.$botPlot.addStyle('visibility', 'hidden');

    function mouseMoveHandler(event) {
      lineElt.begin().moveTo(tempLine.x0, tempLine.y0).lineTo(self.mouseX, self.mouseY).end();
    }

    function clickBotBarHandler(event, sender) {
      var newValue = self.tempValue;

      if (self._checkLineIsCross(tempLine.value, newValue)) {} else {
        var newX1 = (0, _helper.map)(newValue, this.min, this.max, this.axisLeft, this.axisRight);
        lineElt.begin().moveTo(tempLine.x0, tempLine.y0).lineTo(newX1, tempLine.y1).end();
        line_hitboxElt.attr('d', lineElt.attr('d'));
        tempLine.$botMarker.moveTo(newX1, tempLine.y1);
        tempLine.$botMarker.text = this.numberToString(this.generateValue(newValue));
        tempLine.$botPlot.attr({
          cx: newX1,
          cy: tempLine.y1
        });
        tempLine.x1 = newX1;
        tempLine.mapValue = newValue;
        tempLine.$botMarker.removeStyle('visibility', 'hidden');
        tempLine.$botPlot.removeStyle('visibility', 'hidden');
        self.off('clickbot', clickBotBarHandler);
        self.off('mousemove', mouseMoveHandler);
        self.off('keydown', KeyDownHandler);
        self.state = STATE_READY;
        this.emit('editline', this.content, this);
      }
    }

    function cancel() {
      lineElt.begin().moveTo(tempLine.x0, tempLine.y0).lineTo(tempLine.x1, tempLine.y1).end();
      line_hitboxElt.attr('d', lineElt.attr('d'));
    }

    ;

    function deleteElt() {
      self.removeElementInObject(tempLine);
      self._lineList = self._lineList.filter(function (elt) {
        return elt.value != tempLine.value && elt.mapValue != tempLine.mapValue;
      });
    }

    ;

    function KeyDownHandler(event) {
      tempLine.$botMarker.removeStyle('visibility', 'hidden');
      tempLine.$botPlot.removeStyle('visibility', 'hidden');

      if (event.key == "Escape") {
        cancel();
        event.preventDefault();
      } else if (event.key == "Delete") {
        deleteElt();
        event.preventDefault();
      }

      self.off('clickbot', clickBotBarHandler);
      self.off('mousemove', mouseMoveHandler);
      self.off('keydown', KeyDownHandler);
      self.state = STATE_READY;
    }

    ;
    self.on('clickbot', clickBotBarHandler);
    self.on('mousemove', mouseMoveHandler);
    self.on('keydown', KeyDownHandler);
  }

  tempLine.$line_hitbox.on("click", clickLineHandler);
  tempLine.$topPlot.on("click", clickTopPlotHandler);
  tempLine.$botPlot.on("click", clickBotPlotHandler);
};

MappingChart.prototype.setLineElt = function (value, mapValue) {
  value = this.generateValue(value);
  mapValue = this.generateValue(mapValue);
  var x0 = (0, _helper.map)(value, this.min, this.max, this.axisLeft, this.axisRight);
  var y0 = this.axisTop;
  var x1 = (0, _helper.map)(mapValue, this.min, this.max, this.axisLeft, this.axisRight);
  var y1 = this.axisBottom;
  var tempLine;
  var cLine;
  tempLine = {
    value: value,
    mapValue: mapValue,
    $line: _('shape.mapping-chart-map-line').addTo(this.$background),
    $line_hitbox: _('shape.mapping-chart-map-line-hitbox.vchart-hitbox').addTo(this.$middleground),
    $topMarker: _({
      tag: 'mappingchartmarker'
    }).addTo(this.$forceground),
    $topPlot: (0, _helper.circle)(20, 20, 5, 'mapping-chart-line-plot').addTo(this.$forceground),
    $botMarker: _({
      tag: 'mappingchartmarker',
      props: {
        rotate180: true
      }
    }).addTo(this.$forceground),
    $botPlot: (0, _helper.circle)(20, 20, 5, 'mapping-chart-line-plot').addTo(this.$forceground),
    x0: x0,
    x1: x1,
    y0: y0,
    y1: y1
  };
  tempLine.x0 = x0;
  tempLine.y0 = y0;
  tempLine.x1 = x1;
  tempLine.y1 = y1;
  tempLine.$topMarker.moveTo(x0, y0);
  tempLine.$topPlot.attr({
    cx: x0,
    cy: y0
  });
  tempLine.$botMarker.moveTo(x1, y1);
  tempLine.$botPlot.attr({
    cx: x1,
    cy: y1
  });
  tempLine.$topMarker.text = this.numberToString(value);
  tempLine.$botMarker.text = this.numberToString(mapValue);
  tempLine.$line.begin().moveTo(x0, y0).lineTo(x1, y1).end();
  tempLine.$line_hitbox.attr('d', tempLine.$line.attr('d')); ///todo

  this.settupEvent(tempLine);

  this._lineList.push(tempLine);
};

MappingChart.prototype.removeElementInObject = function (object) {
  Object.keys(object).forEach(function (key) {
    if (typeof object[key].remove == 'function') object[key].remove();
  });
};

MappingChart.property = {};
MappingChart.property.content = {
  set: function (content) {
    this._lineList.forEach(function (lineData) {
      this.removeElementInObject(lineData);
    }.bind(this));

    this._lineList = [];
    this.sync.then(function () {
      for (var i = 0; i < content.length; i++) {
        this.setLineElt(content[i].value, content[i].mapValue);
      }
    }.bind(this)); //
  },
  get: function () {
    var ret = this._lineList.map(function (lineData) {
      return {
        value: lineData.value,
        mapValue: lineData.mapValue
      };
    });

    ret.sort(function (a, b) {
      return a.value - b.value;
    });
    return ret;
  }
};
/**
 * @typedef MapLine
 * @property {Number} value
 * @property {Number} mapValue
 * @property {Path} $line
 * @property {MappingChartMarker} $topMarker
 * @property {MappingChartMarker} $botMarker
 * @property {circle} $botPlot
 * @property {circle} $botPlot
 */

MappingChart.prototype.init = function (props) {
  this.on('mousemove', this.eventMoveHandler.bind(this));
  this.on('keydown', this.eventKeyDownHandler.bind(this));
  this.preInit();
  this._lineList = [];
  this.sync = this.sync.then(this.update.bind(this));
  this.super(props);
  this.state = STATE_READY;
  /**
  * @type {Array<MapLine>}
  */

  this.initComp();
};

function MappingChartMarker() {
  var res = _({
    // tag:'g',
    class: 'mapping-chart-marker',
    attr: {
      transform: (0, _template.translate)(200, 200)
    }
  });

  res.$box = _('shape.mapping-chart-marker-box').addTo(res);
  res.$text = (0, _helper.text)('', 0, -10, 'mapping-chart-marker-text').attr('text-anchor', 'middle').addTo(res);
  res.sync = res.afterAttached();
  return res;
}

MappingChartMarker.prototype.updateBox = function () {
  var textBBox = this.$text.getBBox();

  if (this.rotate180) {
    this.$box.begin().moveTo(0, 0).lineTo(-2, 5).lineTo(-textBBox.width / 2 - 5, 5).lineTo(-textBBox.width / 2 - 5, textBBox.height + 2 + 5).lineTo(textBBox.width / 2 + 5, +textBBox.height + 2 + 5).lineTo(textBBox.width / 2 + 5, 5).lineTo(2, 5).end();
    this.$text.attr('y', 3 + textBBox.height);
  } else {
    this.$box.begin().moveTo(0, 0).lineTo(-2, -5).lineTo(-textBBox.width / 2 - 5, -5).lineTo(-textBBox.width / 2 - 5, -textBBox.height - 2 - 5).lineTo(textBBox.width / 2 + 5, -textBBox.height - 2 - 5).lineTo(textBBox.width / 2 + 5, -5).lineTo(2, -5).end();
    this.$text.attr('y', -10);
  }
};

MappingChartMarker.prototype.moveTo = function (x, y) {
  this.attr('transform', (0, _template.translate)(x, y));
  return this;
};

MappingChartMarker.property = {};
MappingChartMarker.property.text = {
  set: function (value) {
    this._text = value + '';
    this.$text.innerHTML = this._text;
    this.updateBox();
  },
  get: function () {
    return this._text || '';
  }
};
MappingChartMarker.property.rotate180 = {
  set: function (value) {
    this._rotate180 = !!value;
    this.updateBox();
  },
  get: function () {
    return !!this._rotate180;
  }
};
MappingChartMarker.attribute = {};
MappingChartMarker.attribute.rotate180 = {
  set: function (value) {
    this.rotate180 = value == 'true' || value === true;
  },
  get: function () {
    return this.rotate180 ? 'true' : 'false';
  },
  remove: function () {
    this.rotate180 = false;
  }
};
MappingChartMarker.attribute.rotate180 = {
  set: function (value) {
    value = parseFloat(value + '');

    if ((0, _helper.isNumber)(value)) {
      this.hitboxWidth = value;
    }
  },
  get: function () {
    return this.hitboxWidth + '';
  },
  remove: function () {
    this.hitboxWidth = 6;
  }
};

MappingChartMarker.prototype.init = function (props) {
  this.super(props);
  this.sync.then(this.updateBox.bind(this));
};

_VCore.default.creator.mappingchartmarker = MappingChartMarker;
_VCore.default.creator.mappingchart = MappingChart;
var _default = MappingChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/template/salaryimgchart.svg"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/template/salaryimgchart.svg ***/
module.exports = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Created with Inkscape (http://www.inkscape.org/) -->\n<svg width=\"560\" height=\"320\" version=\"1.1\" viewBox=\"0 0 560 320\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n <defs>\n  <marker id=\"Arrow1Send\" overflow=\"visible\" orient=\"auto\">\n   <path transform=\"scale(.2) rotate(180) translate(6)\" d=\"m0 0 5-5-17.5 5 17.5 5-5-5z\" fill-rule=\"evenodd\" stroke=\"#000\" stroke-width=\"1pt\"/>\n  </marker>\n  <marker id=\"Arrow1Sstart\" overflow=\"visible\" orient=\"auto\">\n   <path transform=\"scale(.2) translate(6)\" d=\"m0 0 5-5-17.5 5 17.5 5-5-5z\" fill-rule=\"evenodd\" stroke=\"#000\" stroke-width=\"1pt\"/>\n  </marker>\n  <marker id=\"Arrow2Mend\" overflow=\"visible\" orient=\"auto\">\n   <path transform=\"scale(-.6)\" d=\"m8.7186 4.0337-10.926-4.0177 10.926-4.0177c-1.7455 2.3721-1.7354 5.6175-6e-7 8.0354z\" fill-rule=\"evenodd\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".625\"/>\n  </marker>\n  <marker id=\"Arrow2Mstart\" overflow=\"visible\" orient=\"auto\">\n   <path transform=\"scale(.6)\" d=\"m8.7186 4.0337-10.926-4.0177 10.926-4.0177c-1.7455 2.3721-1.7354 5.6175-6e-7 8.0354z\" fill-rule=\"evenodd\" stroke=\"#000\" stroke-linejoin=\"round\" stroke-width=\".625\"/>\n  </marker>\n  <marker id=\"Arrow1Sstart-8\" overflow=\"visible\" orient=\"auto\">\n   <path transform=\"matrix(.2 0 0 .2 1.2 0)\" d=\"m0 0 5-5-17.5 5 17.5 5z\" fill-rule=\"evenodd\" stroke=\"#000\" stroke-width=\"1pt\"/>\n  </marker>\n  <marker id=\"Arrow1Send-3\" overflow=\"visible\" orient=\"auto\">\n   <path transform=\"matrix(-.2 0 0 -.2 -1.2 0)\" d=\"m0 0 5-5-17.5 5 17.5 5z\" fill-rule=\"evenodd\" stroke=\"#000\" stroke-width=\"1pt\"/>\n  </marker>\n </defs>\n <metadata>\n  <rdf:RDF>\n   <cc:Work rdf:about=\"\">\n    <dc:format>image/svg+xml</dc:format>\n    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n    <dc:title/>\n   </cc:Work>\n  </rdf:RDF>\n </metadata>\n </g>\n</svg>\n";

};

moduleFactories["node_modules/absol-vchart/src/ImagesChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/ImagesChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SalaryImgChart = SalaryImgChart;
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _salaryimgchart = _interopRequireDefault(require("../template/salaryimgchart.svg"));

var _helper = require("./helper");


var _ = _VCore.default._;
var $ = _VCore.default.$;

function SalaryImgChart() {}

SalaryImgChart.tag = 'SalaryImgChart'.toLowerCase();

SalaryImgChart.render = function () {
  return _(_salaryimgchart.default.replace(/(.|[\r\n])+\<svg/, '<svg')).addClass('image-chart').addClass('base-chart');
};

SalaryImgChart.property = {};

SalaryImgChart.prototype.preInit = function () {
  //this is defaul and can not be change
  this.bonus = 20;
  this.distance = 400;
  this.minDistance = 10;
  this.colTexts = ['Bậc 1', 'Bậc n -1', 'Bậc n'];
  this.distText = 'Khoảng cách lương';
  this.minDistText = 'Khoảng cách tối thiểu';
  this.bonusText = 'Hệ số ưu đãi (20%)';
};

SalaryImgChart.prototype.initComp = function () {
  this.$ox = _('shape.image-chart-ox').addTo(this);
  this.$oxDash = _('shape.image-chart-ox[stroke-dasharray="4, 2"]').addTo(this);
  this.$bases = [_('rect.image-chart-base').addTo(this), _('rect.image-chart-base').addTo(this), _('rect.image-chart-base').addTo(this)];
  this.$bonuses = [_('rect.image-chart-bonus').addTo(this), _('rect.image-chart-bonus').addTo(this), _('rect.image-chart-bonus').addTo(this)];
  this.$distRange = _('shape.image-chart-range[marker-end="url(#Arrow2Mend)"][marker-start="url(#Arrow2Mstart)"]').addTo(this);
  this.$minDistRange = _('shape.image-chart-range[marker-end="url(#Arrow1Send)"][marker-start="url(#Arrow1Sstart)"]').addTo(this);
  this.$bonusRange = _('shape.image-chart-range[marker-end="url(#Arrow1Send)"][marker-start="url(#Arrow1Sstart)"]').addTo(this);
  this.$distTop = _('shape.image-chart-range-limit[stroke-dasharray="2, 1"]').addTo(this);
  this.$distBot = _('shape.image-chart-range-limit[stroke-dasharray="2, 1"]').addTo(this);
  this.$minDistBot = _('shape.image-chart-range-limit[stroke-dasharray="2, 1"]').addTo(this);
  this.$bonusTop = _('shape.image-chart-range-limit[stroke-dasharray="2, 1"]').addTo(this);
  this.$bonusBot = _('shape.image-chart-range-limit[stroke-dasharray="2, 1"]').addTo(this);
  this.$distText = (0, _helper.text)('', 0, 0).addTo(this);
  this.$minDistText = (0, _helper.text)('', 0, 0).attr('text-anchor', 'end').addTo(this);
  this.$bonusText = (0, _helper.text)('', 0, 0).addTo(this);
  this.$lvTexts = [null, null, null].map(function () {
    return (0, _helper.text)('', 0, 0).attr('text-anchor', 'middle').addTo(this);
  }.bind(this));
};

SalaryImgChart.prototype.updateComp = function () {
  var width = 560;
  var height = 320;
  var maxColHeight = 288;

  var _this = this;

  this.oxY = height - 20;
  this.colWidth = 40;
  this.oxSeg = [10, 100, 260, 500];
  this.xCols = [37, 272, 373];
  this.heightCols = [maxColHeight / (1 + this.distance / 100), maxColHeight / (1 + this.minDistance / 100), maxColHeight]; //<path d="m2.9298 290.03h21.626m43.891 0h51.013" fill="none" stroke="#4472c4" stroke-width=".26458px"/>

  this.$ox.begin().moveTo(this.oxSeg[0], this.oxY + 1).lineTo(this.oxSeg[1], this.oxY + 1).moveTo(this.oxSeg[2], this.oxY + 1).lineTo(this.oxSeg[3], this.oxY + 1).end(); // <path d="m24.555 290.03h43.891" fill="none" stroke="#4372c4" stroke-dasharray="1.05999993, 0.52999997" stroke-width=".265"/>

  this.$oxDash.begin().moveTo(this.oxSeg[1], this.oxY + 1).lineTo(this.oxSeg[2], this.oxY + 1).end();
  this.heightBase = this.heightCols.map(function (hc) {
    return (0, _helper.map)(100, 0, 100 + _this.bonus, 0, hc);
  });
  this.heightBonus = this.heightCols.map(function (hc) {
    return (0, _helper.map)(_this.bonus, 0, 100 + _this.bonus, 0, hc);
  });
  this.$bases.forEach(function (e, i) {
    var x = _this.xCols[i];
    var height = _this.heightBase[i];
    e.attr({
      x: x,
      y: _this.oxY - height,
      width: _this.colWidth,
      height: height
    });
  });
  this.$bonuses.forEach(function (e, i) {
    var x = _this.xCols[i];
    var height = _this.heightBonus[i];
    e.attr({
      x: x,
      y: _this.oxY - _this.heightCols[i],
      width: _this.colWidth,
      height: height
    });
  });
  this.$distRange.begin().moveTo(this.xCols[0] - 13, this.oxY - this.heightBase[2] + 2).lineTo(this.xCols[0] - 13, this.oxY - this.heightBase[0] - 2).end();
  this.$minDistRange.begin().moveTo(this.xCols[1] - 38, this.oxY - this.heightBase[2] + 1).lineTo(this.xCols[1] - 38, this.oxY - this.heightBase[1] - 1).end();
  this.$bonusRange.begin().moveTo(this.xCols[2] + 13 + this.colWidth, this.oxY - this.heightBase[2] - this.heightBonus[2] + 1).lineTo(this.xCols[2] + 13 + this.colWidth, this.oxY - this.heightBase[2] - 1).end();
  this.$distTop.begin().moveTo(this.xCols[0] - 13, this.oxY - this.heightBase[2]).lineTo(this.xCols[2], this.oxY - this.heightBase[2]).end();
  this.$distBot.begin().moveTo(this.xCols[0] - 13, this.oxY - this.heightBase[0]).lineTo(this.xCols[0], this.oxY - this.heightBase[0]).end();
  this.$minDistBot.begin().moveTo(this.xCols[1] - 38, this.oxY - this.heightBase[1]).lineTo(this.xCols[1], this.oxY - this.heightBase[1]).end();
  this.$bonusBot.begin().moveTo(this.xCols[2] + this.colWidth, this.oxY - this.heightBase[2]).lineTo(this.xCols[2] + 13 + this.colWidth, this.oxY - this.heightBase[2]).end();
  this.$bonusTop.begin().moveTo(this.xCols[2] + this.colWidth, this.oxY - this.heightBase[2] - this.heightBonus[2]).lineTo(this.xCols[2] + 13 + this.colWidth, this.oxY - this.heightBase[2] - this.heightBonus[2]).end();
  this.$distText.innerHTML = this.distText;
  this.$distText.attr({
    x: this.xCols[0] - 7,
    y: this.oxY - (this.heightBase[2] + this.heightBase[0]) / 2 + 5
  });
  this.$minDistText.innerHTML = this.minDistText;
  this.$minDistText.attr({
    x: this.xCols[1] - 38 - 6,
    y: this.oxY - (this.heightBase[2] + this.heightBase[1]) / 2 + 5
  });
  this.$bonusText.innerHTML = this.bonusText;
  this.$bonusText.attr({
    x: this.xCols[2] + 13 + this.colWidth + 6,
    y: this.oxY - this.heightBase[2] - this.heightBonus[2] / 2 + 5
  });
  this.$lvTexts.forEach(function (e, i) {
    e.innerHTML = _this.colTexts[i];
    e.attr({
      x: _this.xCols[i] + _this.colWidth / 2,
      y: _this.oxY + 15
    });
  });
};

SalaryImgChart.prototype.init = function (props) {
  this.preInit();
  this.super(props);
  this.initComp();
  this.updateComp();
};

_VCore.default.install(SalaryImgChart);

var _default = SalaryImgChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/SalaryScaleChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/SalaryScaleChart.js ***/
"use strict";

var _VCore = _interopRequireDefault(require("./VCore"));

var _salaryimgchart = _interopRequireDefault(require("../template/salaryimgchart.svg"));

var _helper = require("./helper");

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));


var _ = _VCore.default._;
var $ = _VCore.default.$;

function SalaryScaleChart() {//this chart is not used
}

SalaryScaleChart.tag = 'SalaryScaleChart'.toLowerCase();

SalaryScaleChart.render = function () {
  return _({
    tag: _GContainer.default.tag,
    elt: _(_salaryimgchart.default.replace(/(.|[\r\n])+<svg/, '<svg')).addClass('image-chart').addClass('vc-image-chart').addClass('vc-chart')
  });
};

SalaryScaleChart.prototype.updateSize = function () {
  this.attr({
    width: this.canvasWidth,
    height: this.canvasHeight,
    viewBox: [0, 0, this.canvasWidth, this.canvasHeight].join(' ')
  });
};

SalaryScaleChart.prototype.initComp = function () {
  this.$colTexts = this.colTexts.map(function () {
    return (0, _helper.text)('', 100, 100).attr('text-anchor', 'middle').addTo(this);
  }.bind(this));
  this.$bases = this.colTexts.map(function () {
    return _('rect.image-chart-base').addTo(this);
  }.bind(this));
  this.$bonuses = this.colTexts.map(function () {
    return _('rect.image-chart-bonus').addTo(this);
  }.bind(this));
  this.$oxLine = _('shape.image-chart-ox').addTo(this);
  this.$oxDash = _('shape.image-chart-ox[stroke-dasharray="4, 2"]').addTo(this);
  this.$sizeTexts = this.sizeTexts.map(function () {
    return (0, _helper.text)('', 100, 100).addTo(this);
  }.bind(this));
  this.$ranges = this.sizeTexts.map(function () {
    return _('shape.image-chart-range[marker-end="url(#Arrow2Mend)"][marker-start="url(#Arrow2Mstart)"]', 100, 100).addTo(this);
  }.bind(this));
  this.$hLine = Array(5).fill(0).map(function () {
    return _('shape.image-chart-range-limit[stroke-dasharray="2, 1"]').addTo(this);
  }.bind(this));
};

SalaryScaleChart.prototype.updateText = function () {
  var self = this;
  this.$colTexts.forEach(function (elt, i) {
    var text = self.colTexts[i];
    elt.innerHTML = text;
    elt.attr('y', self.oy);
  });
  this.oy -= _helper.getMaxHeightBox.apply(null, this.$colTexts);
  this.oy -= this.textMargin;
  this.$sizeTexts.forEach(function (elt, i) {
    var text = self.sizeTexts[i];
    elt.innerHTML = text;
  });
  this.oxLength -= (0, _helper.getMaxWidthBox)(this.$sizeTexts[0], this.$sizeTexts[1]);
  this.oxLength -= this.textMargin;
};

SalaryScaleChart.prototype.updateAxis = function () {
  var self = this;
  var leftCol = this.ox + this.axisPadding;
  var rightCol = this.ox + this.oxLength - this.axisPadding - this.rangeMargin - this.colWidth;
  this.colXs = [leftCol, leftCol / 3 + rightCol * 2 / 3, rightCol];
  this.$oxLine.begin().moveTo(this.ox, this.oy).lineTo(this.ox + this.oxLength / 4, this.oy).moveTo(this.ox + this.oxLength / 2, this.oy).lineTo(this.ox + this.oxLength, this.oy).end();
  this.$oxDash.begin().moveTo(this.ox + this.oxLength / 4, this.oy).lineTo(this.ox + this.oxLength / 2, this.oy).end();
  this.$colTexts.forEach(function (elt, i) {
    elt.attr('x', self.colXs[i] + self.colWidth / 2);
  });
  this.maxColHeight = this.oy - this.paddingContent;
};

SalaryScaleChart.prototype.updateCols = function () {
  var self = this;
  this.heightCols = [this.maxColHeight / (1 + this.distance / 100), this.maxColHeight / (1 + this.minDistance / 100), this.maxColHeight];

  if (this.bonus < 0) {
    this.heightCols = this.heightCols.map(function (x) {
      return x * (100 + self.bonus) / 100;
    });
  }

  this.baseHeight = this.heightCols.map(function (h) {
    return h / (100 + self.bonus) * 100;
  });
  this.bonusHeight = this.heightCols.map(function (h) {
    return h / (100 + self.bonus) * self.bonus;
  });
  this.$bases.forEach(function (e, i) {
    var height = self.baseHeight[i];
    e.attr({
      x: self.colXs[i],
      y: self.oy - height,
      width: self.colWidth,
      height: height
    });
  });

  if (this.bonus >= 0) {
    this.$bonuses.forEach(function (e, i) {
      var height = self.bonusHeight[i];
      e.attr({
        x: self.colXs[i],
        y: self.oy - self.heightCols[i],
        width: self.colWidth,
        height: height
      });
    });
  } else {
    this.$bonuses.forEach(function (e, i) {
      var height = self.bonusHeight[i];
      e.attr({
        x: self.colXs[i],
        y: self.oy - self.heightCols[i] + height,
        width: self.colWidth,
        height: -height
      });
    });
  }
};

SalaryScaleChart.prototype.updateRange = function () {
  var self = this;
  var rangeX = this.colXs.map(function (x) {
    return x + self.colWidth + self.rangeMargin;
  });
  this.$ranges[0].begin().moveTo(rangeX[2], this.oy - this.baseHeight[2] + this.arrowPadding).lineTo(rangeX[2], this.oy - this.baseHeight[0] - this.arrowPadding).end();
  this.$ranges[1].begin().moveTo(rangeX[2], this.oy - this.baseHeight[0] + this.arrowPadding).lineTo(rangeX[2], this.oy - this.arrowPadding).end();
  this.$ranges[2].begin().moveTo(rangeX[1], this.oy - this.baseHeight[2] + this.arrowPadding).lineTo(rangeX[1], this.oy - this.baseHeight[1] - this.arrowPadding).end();
  this.$ranges[3].begin().moveTo(rangeX[1], this.oy - this.baseHeight[1] + this.arrowPadding).lineTo(rangeX[1], this.oy - this.arrowPadding).end();
  this.$ranges[4].begin().moveTo(rangeX[0], this.oy - this.heightCols[0] + this.arrowPadding).lineTo(rangeX[0], this.oy - this.arrowPadding).end();
  this.$hLine[0].begin().moveTo(this.colXs[2] + this.colWidth, this.oy - this.baseHeight[2]).lineTo(rangeX[2], this.oy - this.baseHeight[2]).end();
  this.$hLine[1].begin().moveTo(this.colXs[2], this.oy - this.baseHeight[2]).lineTo(rangeX[1], this.oy - this.baseHeight[2]).end();
  this.$hLine[2].begin().moveTo(this.colXs[1] + this.colWidth, this.oy - this.baseHeight[1]).lineTo(rangeX[1], this.oy - this.baseHeight[1]).end();
  this.$hLine[3].begin().moveTo(this.colXs[0] + this.colWidth, this.oy - this.heightCols[0]).lineTo(rangeX[0], this.oy - this.heightCols[0]).end();
  this.$hLine[4].begin().moveTo(this.colXs[0] + this.colWidth, this.oy - this.baseHeight[0]).lineTo(rangeX[2], this.oy - this.baseHeight[0]).end(); //a

  this.$sizeTexts[0].attr({
    x: rangeX[2] + this.textMargin,
    y: this.oy - (this.baseHeight[2] + this.baseHeight[0]) / 2 + 4
  }); //b

  this.$sizeTexts[1].attr({
    x: rangeX[2] + this.textMargin,
    y: this.oy - this.baseHeight[0] / 2 + 4
  }); //c

  this.$sizeTexts[2].attr({
    x: rangeX[1] + this.textMargin,
    y: this.oy - (this.baseHeight[2] + this.baseHeight[1]) / 2 + 4
  }); //d

  this.$sizeTexts[3].attr({
    x: rangeX[1] + this.textMargin,
    y: this.oy - this.baseHeight[1] / 2 + 4
  }); //e

  this.$sizeTexts[4].attr({
    x: rangeX[0] + this.textMargin,
    y: this.oy - this.heightCols[0] / 2 + 4
  });
};

SalaryScaleChart.prototype.update = function () {
  this.updateSize();
  this.oy = this.canvasHeight - this.paddingContent;
  this.oxLength = this.canvasWidth - 2 * this.paddingContent;
  this.ox = this.paddingContent;
  this.updateText();
  this.updateAxis();
  this.updateCols();
  this.updateRange();
};

SalaryScaleChart.prototype.preInit = function () {
  this.sync = this.afterAttached();
  this.canvasWidth = 560;
  this.canvasHeight = 320;
  this.paddingContent = 10;
  this.colTexts = ['Bậc 1', 'Bậc n -1', 'Bậc n'];
  this.sizeTexts = ['a', 'b', 'c', 'd', 'e'];
  this.bonus = 20;
  this.distance = 80;
  this.minDistance = 10; // this.sizeTexts = ['Lương tối đa', 'b', 'c', 'd', 'e'];

  this.colWidth = 40;
  this.textMargin = 5;
  this.axisPadding = 30;
  this.rangeMargin = 20;
  this.arrowPadding = 2.5;
};

SalaryScaleChart.prototype.init = function (props) {
  this.preInit();
  this.super(props);
  this.initComp();
  this.sync.then(this.update.bind(this));
};

_VCore.default.install('SalaryScaleChart'.toLowerCase(), SalaryScaleChart);
};

moduleFactories["node_modules/absol-vchart/src/HorizontalBarChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/HorizontalBarChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _helper = require("./helper");

var _template = require("./template");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var _ = _VCore.default._;
var $ = _VCore.default.$;

function HorizontalBarChart() {
  var self = this;
  this._bars = [];
  this._vLines = [];
  this._title = '';
  this._ranges = [];
  this._includeValues = [];
  this._dataUpdateTimeout = -1;
  this._padding = 5;
  this._ox = 0;
  this._oy = 0;
  this._oxLength = 0;
  this._oyLength = 0;
  this._oyTop = 25;
  this._oxRight = this._padding;
  this._barWidth = 35;
  this._rangeWidth = 15;
  this._minValue = 0;
  this._maxValue = 10;
  this._keys = [];
  this._keyColors = [];
  this._barMargin = 5;
  this._zeroOY = true;
  this._maxSegment = 10;
  this._minRangeText = "Min";
  this._maxRangeText = "Max";
  /**
   * @type {import('./Axis').default}
   */

  this.$axis = $('axis', this);
  this.$title = $('text.vc-horizontal-bar-title', this);
  this.$whiteBoxMask = $('.base-chart-white-mask', this);
  this.$content = $('.vc-horizontal-bar-chart-content', this);
  this.$noteContainer = $('g.vc-horizontal-bar-note-container', this);
  this.$noteBox = $('.vc-horizontal-bar-vline-note-box', this);
  this.$oneBarNoteContainer = $('g.vc-horizontal-bar-one-bar-note-container', this); // this.$keysNoteContainer = $('g.vc-horizontal-bar-keys-note-container', this);

  this.$vLinesNoteContainer = $('g.vc-horizontal-bar-vline-note-container', this);
  this.$segmentTextContainer = $('g.vc-horizontal-bar-segment-text-container', this);
  this.$vLineContainer = $('g.vc-horizontal-bar-vline-container', this);
  this.$valueLineContainer = $('.vc-horizontal-bar-chart-value-line-container', this);
  this.$keys = [];
  this.$segmentTexts = [];
  this.$valueLines = [];
  this.$bars = [];
  this.$ranges = [];
  this.$vLines = [];
  this.$attachhook = $("sattachhook", this).on('error', function (error) {
    this.updateSize = this.updateSize || self.updatePosition.bind(self);

    _Dom.default.addToResizeSystem(this);
  });
  this.sync = new Promise(function (rs) {
    self.$attachhook.on('error', rs);
  });
  this.sync.then(this.notifyDataChange.bind(this));
}

HorizontalBarChart.tag = 'HorizontalBarChart'.toLowerCase();

HorizontalBarChart.prototype._createKeyNote = function (color, keyName) {
  return _({
    class: 'vc-horizontal-bar-key-note',
    child: [(0, _helper.rect)(0, 0, 14, 14).addStyle('fill', color), (0, _helper.text)(keyName, 17, 12)]
  });
};

HorizontalBarChart.prototype._createVLineNote = function (color, keyName) {
  return _({
    class: 'vc-horizontal-bar-vline-note',
    child: [(0, _helper.hline)(0, 7, 20).addStyle('stroke', color), (0, _helper.text)(keyName, 25, 12)]
  });
};

HorizontalBarChart.prototype.processData = function () {
  this._minValue = this._bars.concat(this._includeValues).reduce(function (ac, cr) {
    return Math.min(ac, cr);
  }, 10000000);
  this._minValue = this._ranges.reduce(function (ac, cr) {
    return Math.min(ac, cr[0], cr[1]);
  }, this._minValue);
  this._maxValue = this._bars.concat(this._includeValues).reduce(function (ac, cr) {
    return Math.max(ac, cr);
  }, -10000000);
  this._maxValue = this._ranges.reduce(function (ac, cr) {
    return Math.max(ac, cr[1], cr[0]);
  }, this._maxValue);
  if (this._zeroOY) this._minValue = Math.min(0, this._minValue);
  this._beautiSegment = (0, _helper.calBeautySegment)(this._maxSegment, this._minValue, this._maxValue);
};

HorizontalBarChart.prototype.initBarNote = function () {
  this.$oneBarNoteContainer.$minText = (0, _helper.text)(this._minRangeText, 0, 14).addTo(this.$oneBarNoteContainer);
  this.$oneBarNoteContainer.$maxText = (0, _helper.text)(this._maxRangeText, 0, 14 + 10 + this._barWidth + 10 + 14).addTo(this.$oneBarNoteContainer);
  this.$oneBarNoteContainer.$bar = this.$oneBarNoteContainer.$bar || (0, _helper.rect)(0.5, 14 + 10 + 0.5, 100, this._barWidth - 1, 'vc-horizontal-bar-chart-bar').addTo(this.$oneBarNoteContainer);
  this.$oneBarNoteContainer.$range = this.$oneBarNoteContainer.$range || (0, _helper.rect)(80.5, 14 + 10 + Math.floor((this._barWidth - this._rangeWidth) / 2) + 0.5, 30, this._rangeWidth - 1, 'vc-horizontal-bar-chart-range').addTo(this.$oneBarNoteContainer);
  this.$oneBarNoteContainer.$minLine = (0, _helper.vline)(80.5, 14 + 10 + Math.floor((this._barWidth - this._rangeWidth) / 3), -Math.floor((this._barWidth - this._rangeWidth) / 3) - 5, 'vc-horizontal-bar-chart-range-min-line').addTo(this.$oneBarNoteContainer);
  this.$oneBarNoteContainer.$maxLine = (0, _helper.vline)(80.5 + 30, 14 + 10 + this._barWidth - Math.floor((this._barWidth - this._rangeWidth) / 2), Math.floor((this._barWidth - this._rangeWidth) / 2) + 8, 'vc-horizontal-bar-chart-range-max-line').addTo(this.$oneBarNoteContainer);
};

HorizontalBarChart.prototype.updateOneBarNotePosition = function () {
  var minTextBox = this.$oneBarNoteContainer.$minText.getBBox();
  var maxTextBox = this.$oneBarNoteContainer.$maxText.getBBox();
  var maxTextLength = Math.max(minTextBox.width, maxTextBox.width);

  if (minTextBox.width / 2 > 80.5) {
    this.$oneBarNoteContainer.$bar.attr('x', Math.floor(maxTextLength / 2 - 80.5) + 0.5 + '');
    this.$oneBarNoteContainer.$range.attr('x', Math.floor(maxTextLength / 2 - 80.5) + 0.5 + 80 + '');
    (0, _helper.moveVLine)(this.$oneBarNoteContainer.$minLine, Math.floor(minTextBox.width / 2 - 80.5) + 0.5 + 80, 14 + 10 + Math.floor((this._barWidth - this._rangeWidth) / 3), -Math.floor((this._barWidth - this._rangeWidth) / 3) - 5);
    (0, _helper.moveVLine)(this.$oneBarNoteContainer.$maxLine, Math.floor(minTextBox.width / 2 - 80.5) + 0.5 + 80 + 30, 14 + 10 + this._barWidth - Math.floor((this._barWidth - this._rangeWidth) / 2), Math.floor((this._barWidth - this._rangeWidth) / 2) + 8);
  } else {
    this.$oneBarNoteContainer.$minText.attr('x', 80.5 - minTextBox.width / 2);
    this.$oneBarNoteContainer.$maxText.attr('x', 80.5 + 30 - maxTextBox.width / 2);
  }
};

HorizontalBarChart.prototype.generateColor = function () {
  var colorLength = Math.max(this._keys.length, this._bars.length) + this._vLines.length;

  if (this._keyColors.length < colorLength) {
    this._keyColors = (0, _helper.generateBackgroundColors)(colorLength).map(function (c) {
      return (0, _helper.fresherColor)(c);
    });
  }
};

HorizontalBarChart.prototype.initKeysNote = function () {
  var self = this;
  this.$keysNoteContainer.clearChild();
  this.$keyNotes = this._keys.map(function (text, i) {
    var color = self._keyColors[i];
    return self._createKeyNote(color, text).addTo(self.$keysNoteContainer);
  });
};

HorizontalBarChart.prototype.initVLinesNote = function () {
  var self = this;
  this.$vLinesNoteContainer.clearChild();
  this.$vLineNotes = this._vLines.map(function (vline, i) {
    return self._createVLineNote(vline.color || (0, _helper.lighterColor)(self._keyColors[self._keys.length + i], -0.2), vline.name + '').addTo(self.$vLinesNoteContainer).attr('transform', (0, _template.translate)(0, i * 20));
  });
};

HorizontalBarChart.prototype.initNote = function () {
  this.initVLinesNote();
  this.initBarNote();
};

HorizontalBarChart.prototype.updateNotePosition = function () {
  this.updateOneBarNotePosition();
  var y = this._padding;
  var x = this._padding;
  this.$vLinesNoteContainer.attr('transform', (0, _template.translate)(x, y));
  y += this.$vLinesNoteContainer.getBBox().height + 5 + this._padding;
  this.$oneBarNoteContainer.attr('transform', (0, _template.translate)(this._padding, y));
  this.$noteBox.attr({
    width: '1',
    height: '1'
  }); //align right

  var box = this.$noteContainer.getBBox();
  this.$noteBox.attr({
    width: box.width + this._padding - 1 + '',
    height: box.height + this._padding - 1 + ''
  });
  this.$noteContainer.attr('transform', (0, _template.translate)(this._canvasWidth - this._padding - box.width - this._padding, this._canvasHeight / 3 - (box.height + this._padding) / 2));
  this._oxRight = this._canvasWidth - box.width - this._padding * 2;
};

HorizontalBarChart.prototype.initAxisText = function () {
  while (this.$keys.length < this._keys.length) {
    this.$keys.push((0, _helper.text)('', 0, 0, 'vc-horizontal-bar-chart-key').addTo(this.$content));
  }

  while (this.$keys.length > this._keys.length) {
    this.$keys.pop().remove();
  }

  for (var i = 0; i < this._keys.length; ++i) {
    this.$keys[i].innerHTML = this._keys[i];
  }

  while (this.$segmentTexts.length > this._beautiSegment.segmentCount + 1) {
    this.$segmentTexts.pop().remove();
  }

  while (this.$segmentTexts.length < this._beautiSegment.segmentCount + 1) {
    this.$segmentTexts.push((0, _helper.text)('', 0, 0, 'vc-horizontal-bar-chart-segment-text').addTo(this.$segmentTextContainer));
  }

  for (var i = 0; i < this.$segmentTexts.length; ++i) {
    this.$segmentTexts[i].innerHTML = this._beautiSegment.minValue + this._beautiSegment.step * i + '';
  }

  this.$valueLineContainer.clearChild();
  this.$valueLines = Array(this.$segmentTexts.length - 1).fill(0).map(function () {
    return (0, _helper.vline)(0, 0, 0, 'vc-horizontal-bar-chart-value-line').addTo(this.$valueLineContainer);
  }.bind(this));
};

HorizontalBarChart.prototype.initBars = function () {
  while (this.$bars.length < this._bars.length) {
    this.$bars.push((0, _helper.rect)(0, 0, 0, this._barWidth, 'vc-horizontal-bar-chart-bar').addTo(this.$content));
  }

  while (this.$bars.length > this._bars.length) {
    this.$bars.pop().remove();
  }

  for (var i = 0; i < this.$bars.length; ++i) {
    this.$bars[i].addStyle('fill', this._keyColors[i]);
  }
};

HorizontalBarChart.prototype.initRanges = function () {
  while (this.$ranges.length < this._ranges.length) {
    this.$ranges.push((0, _helper.rect)(0, 0, 0, this._rangeWidth, 'vc-horizontal-bar-chart-range').addTo(this.$content));
  }

  while (this.$ranges.length > this._ranges.length) {
    this.$ranges.pop().remove();
  }

  for (var i = 0; i < this.$ranges.length; ++i) {
    this.$ranges[i].addStyle('fill', (0, _helper.lighterColor)(this._keyColors[i], 0.3));
  }
};

HorizontalBarChart.prototype.initVLines = function () {
  var self = this;
  this.$vLineContainer.clearChild();
  this.$vLines = this._vLines.map(function (vLineData, i) {
    return (0, _helper.vline)(0, 0, 0, 'vc-horizontal-bar-vline').addStyle('stroke', vLineData.color || (0, _helper.lighterColor)(self._keyColors[self._keys.length + i], -0.2)).addTo(self.$vLineContainer);
  });
};

HorizontalBarChart.prototype.notifyDataChange = function () {
  if (this._dataUpdateTimeout >= 0) return;
  var self = this;
  this._dataUpdateTimeout = setTimeout(function () {
    self.update();
    self._dataUpdateTimeout = -1;
  });
};

HorizontalBarChart.prototype.updateCanvasSize = function () {
  var bound = this.getBoundingClientRect();
  this._canvasHeight = this.__canvasHeight;
  this._canvasWidth = this.__canvasWidth;

  if (!(this._canvasWidth > 0)) {
    this._canvasWidth = bound.width;
  }

  if (!(this._canvasHeight > 0)) {
    this._canvasHeight = bound.height;
  }

  this.attr('width', this._canvasWidth + '');
  this.attr('height', this._canvasHeight + '');
  this._oyTop = 25 + this.$title.getBBox().height * 1.5;
  this._ox = this._padding;
  this._oy = this._canvasHeight - this._padding;
  this._oxLength = this._oxRight - this._padding - this._ox;
  this._oyLength = this._oy - this._padding - this._oyTop;
};

HorizontalBarChart.prototype.updateAxisPosition = function () {
  this.$axis.moveTo(this._ox - 0.5, this._oy - 0.5);
  this.$axis.resize(this._oxLength + 15, this._oyLength + 10);
  this.$whiteBoxMask.attr('d', 'M0,0  0,cvh cvw,cvh cvw,0zMleft,top  left,bottom right,bottom right,topz'.replace(/cvh/g, this._canvasHeight).replace(/cvw/g, this._canvasWidth).replace(/left/g, this._padding).replace(/top/g, 10).replace(/bottom/g, this._oy).replace(/right/g, this._canvasWidth - 10));
  this.$title.attr('x', (this._oxRight + this._ox) / 2 + '');
};

HorizontalBarChart.prototype.updateAxisTextPosition = function () {
  var maxWidthKey = _helper.getMaxWidthBox.apply(null, this.$keys);

  this._ox = Math.ceil(maxWidthKey) + 0.5 + this._padding + 5;
  this._oxLength = this._oxRight - this._padding - this._ox;
  this._oy -= 21;
  this._oyLength = this._oy - this._padding - this._oyTop;
  var barMargin = Math.max(this._barMargin, (this._oyLength / this._keys.length - this._barWidth) / 2);
  var i;

  for (i = 0; i < this.$keys.length; ++i) {
    this.$keys[i].attr({
      x: -5,
      y: -(i + 0.5) * (barMargin * 2 + this._barWidth) + 7
    });
    this.$bars[i].attr('y', -i * (barMargin * 2 + this._barWidth) - barMargin - this._barWidth);
    this.$ranges[i].attr('y', -i * (barMargin * 2 + this._barWidth) - barMargin - this._barWidth + Math.floor((this._barWidth - this._rangeWidth) / 2));
  }

  this._segmentLength = this._oxLength / this._beautiSegment.segmentCount;

  for (i = 0; i < this.$segmentTexts.length; ++i) {
    this.$segmentTexts[i].attr({
      x: this._ox + this._segmentLength * i,
      y: this._oy + 18
    });
  }

  for (i = 0; i < this.$valueLines.length; ++i) {
    (0, _helper.moveVLine)(this.$valueLines[i], this._ox + this._segmentLength * (i + 1), this._oy - this._oyLength, this._oyLength);
  }

  this.$content.attr('transform', (0, _template.translate)(this._ox, this._oy));
};

HorizontalBarChart.prototype.updateBarsPosition = function () {
  for (var i = 0; i < this.$bars.length; ++i) {
    this.$bars[i].attr('width', (0, _helper.map)(this._bars[i], this._beautiSegment.minValue, this._beautiSegment.maxValue, 0, this._oxLength));
  }
};

HorizontalBarChart.prototype.updateRangesPosition = function () {
  var left, right, range;

  for (var i = 0; i < this.$bars.length; ++i) {
    range = this._ranges[i];
    left = (0, _helper.map)(range[0], this._beautiSegment.minValue, this._beautiSegment.maxValue, 0, this._oxLength);
    right = (0, _helper.map)(range[1], this._beautiSegment.minValue, this._beautiSegment.maxValue, 0, this._oxLength);
    this.$ranges[i].attr({
      width: right - left + '',
      x: left + ''
    });
  }
};

HorizontalBarChart.prototype.updateVLinesPosition = function () {
  for (var i = 0; i < this.$vLines.length; ++i) {
    (0, _helper.moveVLine)(this.$vLines[i], this._ox + (0, _helper.map)(this._vLines[i].value, this._beautiSegment.minValue, this._beautiSegment.maxValue, 0, this._oxLength), this._oy - this._oyLength, this._oyLength);
  }
};

HorizontalBarChart.prototype.updatePosition = function () {
  this.updateCanvasSize();
  this.updateNotePosition();
  this.updateAxisTextPosition();
  this.updateBarsPosition();
  this.updateRangesPosition();
  this.updateVLinesPosition();
  this.updateAxisPosition();
};

HorizontalBarChart.prototype.update = function () {
  this.generateColor();
  this.processData();
  this.initNote();
  this.initAxisText();
  this.initBars();
  this.initRanges();
  this.initVLines();
  this.updatePosition();
};

HorizontalBarChart.property = {};
HorizontalBarChart.property.canvasWidth = {
  set: function (value) {
    if (value >= 0) {
      this.attr('width', undefined);
      this.__canvasWidth = value;
    } else {
      this._canvasWidth = -1;
    }

    this.notifyDataChange();
  },
  get: function () {
    return this.__canvasWidth;
  }
};
HorizontalBarChart.property.canvasHeight = {
  set: function (value) {
    if (value >= 0) {
      this.attr('height', undefined);
      this.__canvasHeight = value;
    } else {
      this.__canvasHeight = -1;
    }

    this.notifyDataChange();
  },
  get: function () {
    return this.__canvasHeight;
  }
};
HorizontalBarChart.property.keys = {
  set: function (value) {
    this._keys = value || [];
    this.notifyDataChange();
  },
  get: function () {
    return this._keys;
  }
};
HorizontalBarChart.property.bars = {
  set: function (value) {
    this._bars = value || [];
    this.notifyDataChange();
  },
  get: function () {
    return this._bars;
  }
};
HorizontalBarChart.property.ranges = {
  set: function (value) {
    this._ranges = value || [];
    this.notifyDataChange();
  },
  get: function () {
    return this._ranges;
  }
};
HorizontalBarChart.property.vLines = {
  set: function (value) {
    this._vLines = value || [];
    this.notifyDataChange();
  },
  get: function () {
    return this._vLines;
  }
};
HorizontalBarChart.property.includeValues = {
  set: function (value) {
    this._includeValues = value || [];
    this.notifyDataChange();
  },
  get: function () {
    return this._includeValues;
  }
};
HorizontalBarChart.property.maxSegment = {
  set: function (value) {
    this._maxSegment = value || 10;
  },
  get: function () {
    return this._maxSegment;
  }
};
HorizontalBarChart.property.title = {
  set: function (value) {
    this._title = value || '';
    this.$title.innerHTML = this._title;
    this.notifyDataChange();
  },
  get: function () {
    return this._title;
  }
};
HorizontalBarChart.property.minRangeText = {
  set: function (value) {
    this._minRangeText = value || '';
    this.notifyDataChange();
  },
  get: function () {
    return this._minRangeText;
  }
};
HorizontalBarChart.property.maxRangeText = {
  set: function (value) {
    this._maxRangeText = value || '';
    this.notifyDataChange();
  },
  get: function () {
    return this._maxRangeText;
  }
};
HorizontalBarChart.property.title = {
  set: function (value) {
    this._title = value || '';
    this.$title.innerHTML = this._title;
    this.notifyDataChange();
  },
  get: function () {
    return this._title;
  }
};

HorizontalBarChart.render = function () {
  return _({
    tag: 'svg',
    class: ['vc-horizontal-bar-chart', 'base-chart'],
    child: ['.vc-horizontal-bar-chart-value-line-container', '.vc-horizontal-bar-chart-content', {
      tag: 'path',
      class: 'base-chart-white-mask',
      attr: {
        fill: 'white',
        stroke: 'white',
        'fill-rule': 'evenodd',
        d: 'M0,0  0,2000 2000,2000 2000,0zM100,100  100,200 200,200 200,100z'
      }
    }, 'axis', 'g.vc-horizontal-bar-segment-text-container', 'g.vc-horizontal-bar-vline-container', {
      class: 'vc-horizontal-bar-note-container',
      child: [(0, _helper.rect)(0.5, 0.5, 1, 1, 'vc-horizontal-bar-vline-note-box'), 'g.vc-horizontal-bar-vline-note-container', 'g.vc-horizontal-bar-one-bar-note-container']
    }, 'text.vc-horizontal-bar-title[y="20"]', 'sattachhook']
  });
};

_VCore.default.install('HorizontalBarChart'.toLowerCase(), HorizontalBarChart);

var _default = HorizontalBarChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/NoteGrid.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/NoteGrid.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _template = require("./template");


var _ = _VCore.default._;
var $ = _VCore.default.$;

function NoteGrid() {
  this._width = NaN;
  this._height = NaN;
  this._itemMargin = 0;
  this._padding = 0;
  this.$content = $('.vchart-node-grid-content', this);
  this.$box = $('rect.vchart-node-grid-box', this);
  this.boxWidth = 0;
  this.boxHeight = 0;
}

NoteGrid.tag = 'NoteGrid'.toLowerCase();

NoteGrid.prototype.updateSize = function () {
  // this.
  var children = Array.prototype.slice.call(this.$content.children);
  var bBoxes = children.map(function (e) {
    return e.getBBox();
  });
  var maxWidth = bBoxes.reduce(function (ac, cr) {
    return Math.max(ac, cr.width);
  }, 0);
  var maxHeight = bBoxes.reduce(function (ac, cr) {
    return Math.max(ac, cr.height);
  }, 0);
  var availableWidth;
  if (this._width > 0) availableWidth = this._width;else availableWidth = this._padding * 2 + (children.length - 1) * this._itemMargin + children.length * maxWidth;
  var itemPerRow = Math.floor((availableWidth - this._padding * 2 + this._itemMargin + 0.1) / (maxWidth + this._itemMargin));
  var marginRight = (availableWidth - this._padding * 2 - itemPerRow * maxWidth) / (itemPerRow - 1); //in view

  var availableHeight;
  var itemPerCol = Math.ceil(children.length / itemPerRow);
  if (this._height > 0) availableHeight = this._height;else availableHeight = this._padding * 2 + (itemPerCol - 1) * this._itemMargin + itemPerCol * maxHeight;
  var marginBottom = (availableHeight - this._padding * 2 - itemPerCol * maxHeight) / (itemPerCol - 1); //in view

  this.boxWidth = availableWidth;
  this.boxHeight = availableHeight;
  this.$box.attr({
    x: 0,
    y: 0,
    width: availableWidth,
    height: availableHeight
  });
  var i = 0;
  var x, y;
  if (isNaN(marginBottom)) marginBottom = 0;
  if (isNaN(marginRight)) marginRight = 0;

  for (var rIndex = 0; rIndex < itemPerCol && i < children.length; ++rIndex) for (var cIndex = 0; cIndex < itemPerRow && i < children.length; ++cIndex) {
    x = this._padding + cIndex * (maxWidth + marginRight);
    y = this._padding + rIndex * (maxHeight + marginBottom);
    children[i].attr('transform', (0, _template.translate)(x, y));
    ++i;
  }
};

['addChild', 'clearChild', 'removeChild', 'addChildBefore', 'findChildBefore', 'findChildAfter'].forEach(function (name) {
  NoteGrid.prototype[name] = function () {
    return this.$content[name].apply(this.$content, arguments);
  };
});

NoteGrid.render = function () {
  return _({
    class: 'vchart-node-grid',
    child: ['rect.vchart-node-grid-box', '.vchart-node-grid-content']
  });
};

NoteGrid.attribute = {};
NoteGrid.attribute.width = {
  set: function (value) {
    value = parseFloat(value);
    this._width = value;
  },
  get: function () {
    return this._width;
  },
  remove: function () {
    this._width = NaN;
  }
};
NoteGrid.attribute.height = {
  set: function (value) {
    value = parseFloat(value);
    this._height = value;
  },
  get: function () {
    return this._height;
  },
  remove: function () {
    this._height = NaN;
  }
};
NoteGrid.attribute.itemMargin = {
  set: function (value) {
    value = parseFloat(value);
    this._itemMargin = value;
  },
  get: function () {
    return this._itemMargin;
  },
  remove: function () {
    this._itemMargin = NaN;
  }
};
NoteGrid.attribute.padding = {
  set: function (value) {
    value = parseFloat(value);
    this._padding = value;
  },
  get: function () {
    return this._padding;
  },
  remove: function () {
    this._padding = NaN;
  }
};

_VCore.default.install('NoteGrid'.toLowerCase(), NoteGrid);

var _default = NoteGrid;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/SpiderChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/SpiderChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

require("./style/spiderchart.css");

var _template = require("./template");

var _helper = require("./helper");

require("./StrokeNote");

require("./RectNote");

require("./NoteGrid");


var _ = _VCore.default._;
var $ = _VCore.default.$;

function SpiderChart() {
  this.$attachhook = _('attachhook').addTo(this).on('error', this.eventHandler.attached);
  this.$background = $('.vchart-spider-chart-background', this);
  this.$axisCtn = $('.vchart-spider-chart-axis-ctn', this.$background);
  this.$forceground = $('.vchart-spider-chart-forceground', this);
  this.$title = $('.base-chart-title', this.$forceground);
  this.$noteCtn = $('.vchart-spider-chart-note-ctn', this);
  this._canvasWidth = 'auto';
  this._canvasHeight = 'auto';
  this._viewCanvasHeight = 0;
  this._viewCanvasWidth = 0;
  this._resizeCallback = [];
  this._drew = false;
  this.ctitle = {
    text: 'This is title',
    $elt: this.$title
  };
  this._viewExpected = {};
  this._viewOption = {// noteLineLength: 15,
    // noteBoxHight: 14
  };
  this.$noteGrid = $('notegrid', this);
}

SpiderChart.tag = 'SpiderChart'.toLowerCase();

SpiderChart.render = function () {
  return _({
    tag: 'svg',
    class: 'vchart-base',
    child: [{
      class: 'vchart-spider-chart-background',
      child: ['.vchart-spider-chart-axis-ctn']
    }, {
      class: 'vchart-spider-chart-content'
    }, {
      class: 'vchart-spider-chart-forceground',
      child: ['text.base-chart-title', '.vchart-spider-chart-note-ctn']
    }, {
      tag: 'notegrid',
      attr: {
        itemMargin: 20,
        padding: 5
      },
      child: [{
        tag: 'strokenote',
        attr: {
          transform: (0, _template.translate)(10, 20)
        },
        props: {
          text: 'Long long text',
          color: 'red'
        }
      }, {
        tag: 'rectnote',
        attr: {
          transform: (0, _template.translate)(10, 40)
        },
        props: {
          text: 'Long long text',
          color: 'red'
        }
      }]
    }]
  });
};
/**
 * @param {Array<Rectangle>} rects
 * @returns {Rectangle}
 */


SpiderChart.prototype._expectSize = function (rects, r) {
  var cr = new Rectangle(0, 0, 0, 0);
  var rect;

  for (var i = 0; i < rects.length; ++i) {
    var angle = Math.PI * 2 * i / rects.length - Math.PI / 2;
    rect = rects[i];

    if (i == 0) {
      rect.x = rect.width / 2;
      rect.y = -rect.height - r;
    } else if (rects.length % 4 == 0 && i == rects.length >> 2) {
      rect.x = r;
      rect.y = rect.height / 2;
    } else if (rects.length % 4 == 0 && i == (rects.length >> 2) * 3) {
      rect.x = -r - rect.width;
      rect.y = rect.height / 2;
    } else if (rects.length % 2 == 0 && i == rects.length >> 1) {
      rect.x = rect.width / 2;
      rect.y = r;
    } else if (i < rects.length / 4) {
      rect.x = r * Math.cos(angle);
      rect.y = r * Math.sin(angle) - rect.height;
    } else if (i < rects.length / 2) {
      rect.x = r * Math.cos(angle);
      rect.y = r * Math.sin(angle);
    } else if (i < rects.length / 4 * 3) {
      rect.x = r * Math.cos(angle) - rect.width;
      rect.y = r * Math.sin(angle);
    } else {
      rect.x = r * Math.cos(angle) - rect.width;
      rect.y = r * Math.sin(angle) - rect.height;
    }

    cr = cr.merge(rect);
  }

  return cr;
};

SpiderChart.prototype.estimateSize = function () {
  var axisNameBBoxs = this.$axisNames.map(function (elt) {
    return elt.getBBox();
  });
  var rects = axisNameBBoxs.map(function (box) {
    return new Rectangle(box.x, box.y, box.width, box.height);
  });
  var titleBox = this.$title.getBBox();
  var noteGroupBox = this.$noteGroup.getBBox();
  var maxR = Math.min(this.canvasWidth, this.canvasHeight) / 2;
  var minR = 20; //

  var aWidth = this.canvasWidth - this.paddingContent * 2;
  var aHeight = this.canvasHeight - this.paddingContent * 2 - titleBox.height * 3 + noteGroupBox.height * 1.5;

  while (maxR - minR > 3) {
    var midR = (minR + maxR) / 2;

    var size = this._expectSize(rects, midR);

    if (size.width < aWidth && size.height < aHeight) {
      minR = midR;
    } else {
      maxR = midR;
    }
  }

  return {
    expectedSize: this._expectSize(rects, minR, true),
    expectedRadius: minR,
    axisLenth: minR - 30
  };
};

SpiderChart.prototype.updateCanvasSize = function () {
  var bound = this.getBoundingClientRect();
  var newHeight = this._canvasHeight;
  var newWidth = this._canvasWidth;
  if (!(newHeight > 0)) newHeight = bound.height;
  if (!(newWidth > 0)) newWidth = bound.witdh;
  if (newHeight == this._viewCanvasHeight && newWidth == this._viewCanvasWidth) return false;
  this.attr({
    width: newWidth + '',
    height: newWidth + ''
  });
  return true;
};

SpiderChart.prototype.recreate = function () {
  this._resizeCallback = [];
  this.recreateTitle();
  this.recreateAxis();
  this.recreateNotes();

  this._resizeCallback.sort(function (a, b) {
    return a.order - b.order;
  });
};

SpiderChart.prototype.recreateAxis = function () {
  var thisChart = this;
  var oyAxisElts = this.axis.oyAxises.map(function (oyAxis, i, arr) {
    var lineArrowElt = _('hlinearrow');

    lineArrowElt.resize(200);
    lineArrowElt.attr('transform', (0, _template.rotate)(-90 + i * 360 / arr.length));
    lineArrowElt.addTo(thisChart.$axisCtn);
    oyAxis.lineArrowElt = lineArrowElt;
    return lineArrowElt;
  });
  this.$oyAxises = oyAxisElts;
};

SpiderChart.prototype._createLineNote = function (obj) {
  var res = _('g.vchart-spinder-chart-note');

  res.$line = (0, _helper.hline)(0, 9, 15, 'vc-assessment-chart-area').addStyle('stroke', obj.stroke).addTo(res);
  res.$name = (0, _helper.text)(obj.name, 15 + 5, 14).addTo(res);
  return res;
};

SpiderChart.prototype._createBoxNote = function (obj) {
  var res = _('g.vchart-spinder-chart-note');

  res.$line = (0, _helper.hline)(0, 9, 15, 'vc-assessment-chart-area').addStyle('stroke', obj.stroke).addTo(res);
  res.$name = (0, _helper.text)(obj.name, 15 + 5, 14).addTo(res);
  return res;
}; //todo more


SpiderChart.prototype.recreateNotes = function () {
  var thisChart = this;
  this.$noteCtn.clearChild();
  this.$notes = this.objects.map(function (obj) {
    var noteElt = thisChart._createLineNote(obj);

    noteElt.addTo(thisChart.$noteCtn);
  });
};

SpiderChart.prototype.recreateTitle = function () {
  this.ctitle.elt = this.$title;
  this.$title.clearChild().addChild(_({
    text: this.ctitle.text || ''
  }));
};

SpiderChart.prototype.updateSize = function (force) {
  if (!force && !this.updateCanvasSize()) return; // nothing change

  this.$noteGrid.updateSize();
};

SpiderChart.prototype.redraw = function () {
  this.recreate();
  this.updateSize(true);
};
/**
 * @type {SpiderChart}
 */


SpiderChart.eventHandler = {};

SpiderChart.eventHandler.attached = function () {
  if (!this._drew) {
    this._drew = true;
    this.redraw();
  } else {
    this.updateSize();
  }
};

SpiderChart.property = {};

_VCore.default.install('spiderchart', SpiderChart);

var _default = SpiderChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/FunnelChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/FunnelChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./style/base.css");

require("./style/funnelchart.css");

var _VCore = _interopRequireDefault(require("./VCore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _template = require("./template");

var _helper = require("./helper");

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _BChart = _interopRequireDefault(require("./BChart"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function FunnelChart() {
  this.$attachhook = $('sattachhook.av-hook', this);
  this.$attachhook.on('attached', this.eventHandler.attached);
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.domSignal = new _DomSignal.default($('sattachhook.av-signal', this)).on('_createContent', this.createContent.bind(this)).on('_alignContent', this._alignContent.bind(this)).on('_updateContent', this._updateContent.bind(this));
  this.$content = $('.av-funnel-content', this);
  this.$funnelCtn = $('.av-funnel-ctn', this);
  this.$noteCtn = $('.av-funnel-note-ctn', this);
  this.$notes = [];
  this._contentMargin = 5;
  this._contentWidth = 0;
  this._contentHeight = 0;
  this.$title = $('.vc-title', this);
  this.$blocks = [];
  this.blocks = [];
  this._cavasWidth = 0;
  this._canvasHeight = 0;
  this.domSignal.emit('_updateContent');
  this.on('click', this.eventHandler.click2Resize.bind(this));
}

FunnelChart.tag = 'FunnelChart'.toLowerCase();

FunnelChart.render = function () {
  return _({
    tag: 'svg',
    class: ['vc-chart', 'av-funnel-chart'],
    child: [{
      tag: 'text',
      class: 'vc-title',
      child: {
        text: ''
      }
    }, {
      class: 'av-funnel-content',
      child: [{
        class: 'av-funnel-ctn',
        child: {
          class: 'av-funnel'
        }
      }, {
        class: 'av-funnel-note-ctn',
        child: []
      }]
    }, 'sattachhook.av-hook', 'sattachhook.av-signal']
  });
};

FunnelChart.prototype._updateCanvasSize = function () {
  var bound = this.getBoundingClientRect();
  var width = bound.width;
  var height = bound.height;
  this._canvasHeight = height;
  this._cavasWidth = width;
  this.attr('width', width + '');
  this.attr('height', height + '');
  this.attr('viewBox', [0.5, 0.5, width, height].join(' '));
};

FunnelChart.prototype.updateSize = function () {
  this._updateCanvasSize();

  this._alignContent();
};

FunnelChart.prototype.normalizeData = function () {
  var blockColor = (0, _helper.generateBackgroundColors)(this.blocks.length);
  var sum = this.blocks.reduce(function (ac, cr) {
    return ac + cr.value;
  }, 0);
  this.blocks.forEach(function (block, i) {
    block.color = block.color || blockColor[i];
    block.percent = block.value * 100 / sum;
  });
};

FunnelChart.prototype.createContent = function () {
  this.normalizeData();
  this.$title.firstChild.data = this.title + '';
  this.$funnelCtn.clearChild();

  this._createNote();

  this._createFunnel();
};

FunnelChart.prototype._createNote = function () {
  var thisC = this;
  this.$noteCtn.clearChild();
  this.$notes = this.blocks.map(function (block) {
    var noteElt = thisC._makeNote(block);

    thisC.$noteCtn.addChild(noteElt);
    return noteElt;
  });
};

FunnelChart.prototype._createFunnel = function () {
  var thisC = this;
  this.$blocks = this.blocks.map(function (block) {
    var blockElt = thisC._makeBlock(block);

    thisC.$funnelCtn.addChild(blockElt);
    return blockElt;
  });
};

FunnelChart.prototype._makeNote = function (block) {
  var $note = _({
    class: 'av-funnel-note',
    child: [{
      tag: 'text',
      style: {
        fill: block.color
      },
      attr: {
        y: 30
      },
      class: 'av-funnel-note-name',
      child: {
        text: block.name
      }
    }, {
      class: 'av-funnel-note-desc'
    }]
  });

  $note.$name = $('av-funnel-note-name', $note);
  return $note;
};

FunnelChart.prototype._makeBlock = function (block) {
  var valueColor = _Color.default.parse(block.color + '').getContrastYIQ();

  var percenColor = valueColor.clone();
  percenColor.rgba[0] = (percenColor.rgba[0] + Math.sqrt(0.5)) / 2;
  percenColor.rgba[1] = (percenColor.rgba[1] + Math.sqrt(0.5)) / 2;
  percenColor.rgba[2] = (percenColor.rgba[2] + Math.sqrt(0.5)) / 2;

  var $block = _({
    class: 'av-funnel-block',
    child: [{
      tag: 'shape',
      class: 'av-funnel-block-shape',
      style: {
        fill: block.color + ''
      }
    }, {
      tag: 'text',
      class: 'av-funnel-block-value',
      attr: {
        y: 25
      },
      style: {
        fill: valueColor + ''
      },
      child: {
        text: block.value
      }
    }, {
      tag: 'text',
      class: 'av-funnel-block-percent',
      attr: {
        y: 55
      },
      style: {
        fill: percenColor + ''
      },
      child: {
        text: block.percent.toFixed(1) + '%'
      }
    }]
  });

  $block.$shape = $('shape', $block);
  $block.$value = $('.av-funnel-block-value', $block);
  return $block;
};

FunnelChart.prototype._alignNote = function () {
  var dy = this._contentHeight / this.blocks.length;
  this._stackHeight = dy;
  this.$notes.forEach(function (noteElt, i) {
    noteElt.attr({
      transform: (0, _template.translate)(0, dy * i)
    });
  });
  var noteWidth = this.$noteCtn.getBBox().width;
  this._noteCtnX = this._contentWidth - noteWidth;
  this.$noteCtn.attr({
    transform: (0, _template.translate)(this._noteCtnX, 0)
  });
};

FunnelChart.prototype._alignFunnel = function () {
  var thisC = this;
  this._funnelWidth = this._noteCtnX - 20;
  var maxValue = this.blocks.reduce(function (ac, block) {
    return Math.max(ac, block.value);
  }, 0);
  this.$funnelCtn.attr('transform', (0, _template.translate)(this._funnelWidth / 2, 0));
  this.$blocks.forEach(function (blockElt, i) {
    var block = thisC.blocks[i];
    var nextBlock = thisC.blocks[i + 1] || block;
    var y = i * thisC._stackHeight;
    blockElt.$shape.begin().moveTo(-thisC._funnelWidth / 2 * block.value / maxValue, 0).lineTo(thisC._funnelWidth / 2 * block.value / maxValue, 0).lineTo(thisC._funnelWidth / 2 * nextBlock.value / maxValue, thisC._stackHeight).lineTo(-thisC._funnelWidth / 2 * nextBlock.value / maxValue, thisC._stackHeight).closePath().end();
    blockElt.attr('transform', (0, _template.translate)(0, y));
  });
};

FunnelChart.prototype._alignContent = function () {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('_alignContent');
    return;
  }

  this.$title.attr({
    x: this._cavasWidth / 2,
    y: 14 + this._contentMargin
  });
  this.$content.attr('transform', (0, _template.translate)(this._contentMargin, this._contentMargin + 50));
  this._contentWidth = this._cavasWidth - this._contentMargin * 2;
  this._contentHeight = this._canvasHeight - this._contentMargin * 2 - 50;

  this._alignNote();

  this._alignFunnel();
};

FunnelChart.prototype._updateContent = function () {
  this.createContent();

  this._alignContent();
};
/***
 *
 * @type {FunnelChart}
 */


FunnelChart.eventHandler = {};

FunnelChart.eventHandler.attached = function () {
  _ResizeSystem.default.add(this.$attachhook);

  this.updateSize();
};

FunnelChart.eventHandler.click2Resize = _BChart.default.eventHandler.click2Resize;
FunnelChart.eventHandler.click2CancelResize = _BChart.default.eventHandler.click2CancelResize;

_VCore.default.install(FunnelChart);

var _default = FunnelChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/BarStackChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/BarStackChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./style/barstackchart.css");

var _VCore = _interopRequireDefault(require("./VCore"));

var _GContainer = _interopRequireDefault(require("absol-svg/js/svg/GContainer"));

var _SvgCanvas = _interopRequireDefault(require("absol-svg/js/svg/SvgCanvas"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _helper = require("./helper");

var _FunnelChart = _interopRequireDefault(require("./FunnelChart"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends SvgCanvas
 * @constructor
 */

function BarStackChart() {
  this._contentMargin = 5;
  /***
   *
   * @type {GContainer}
   */

  this.$content = $('.vc-bar-stack-content', this);
  this.$content.box.setPosition(40, 5);
  /***
   *
   * @type {GContainer}
   */

  this.$noteCtn = $('.vc-bar-stack-note-ctn', this);
  /***
   *
   * @type {GContainer}
   */

  this.$stack = $('.vc-bar-stack', this);
  this.domSignal = new _DomSignal.default($('sattachhook.vc-dom-signal', this));
  this.domSignal.on('_updateContentPosition', this.updateContentPosition.bind(this)).on('updateContent', this.updateContent.bind(this));
  this.blocks = [];
  this.$blocks = [];
  this.$notes = [];
  this.domSignal.emit('updateContent');
}

BarStackChart.tag = 'BarStackChart'.toLowerCase();

BarStackChart.render = function () {
  return _({
    tag: 'svgcanvas',
    class: ['vc-bar-stack-chart', 'base-chart'],
    child: [{
      tag: 'gcontainer',
      class: 'vc-bar-stack-content',
      child: [{
        tag: 'gcontainer',
        class: 'vc-bar-stack-note-ctn'
      }, {
        tag: 'gcontainer',
        class: 'vc-bar-stack'
      }]
    }, 'sattachhook.vc-dom-signal']
  });
};

BarStackChart.prototype.normalizeData = function () {
  var blockColor = (0, _helper.generateBackgroundColors)(this.blocks.length);
  var sum = this.blocks.reduce(function (ac, cr) {
    return ac + cr.value;
  }, 0);
  this.blocks.forEach(function (block, i) {
    block.color = block.color || blockColor[i];
    block.percent = block.percent || block.value * 100 / sum;
  });
};

BarStackChart.prototype.updateSize = function () {
  _SvgCanvas.default.prototype.updateSize.call(this);

  this.updateContentPosition();
};
/***
 *
 * @param block
 * @returns {GContainer}
 * @private
 */


BarStackChart.prototype._makeNote = function (block) {
  var noteElt = _({
    tag: 'gcontainer',
    class: 'vc-bar-stack-note',
    child: [{
      tag: 'text',
      class: 'vc-bar-stack-note-name',
      style: {
        fill: block.color + ''
      },
      attr: {
        y: 15,
        x: 0
      },
      child: {
        text: block.name
      }
    }, {
      tag: 'text',
      class: 'vc-bar-stack-note-desc'
    }]
  });

  noteElt.$name = $('.vc-bar-stack-note-name', this);
  noteElt.$desc = $('.vc-bar-stack-note-desc', this);
  return noteElt;
};
/***
 *
 * @param block
 * @returns {GContainer}
 * @private
 */


BarStackChart.prototype._makeBlock = function (block) {
  var valueColor = _Color.default.parse(block.color + '').getContrastYIQ();

  var percenColor = valueColor.clone();
  percenColor.rgba[0] = (percenColor.rgba[0] + Math.sqrt(0.5)) / 2;
  percenColor.rgba[1] = (percenColor.rgba[1] + Math.sqrt(0.5)) / 2;
  percenColor.rgba[2] = (percenColor.rgba[2] + Math.sqrt(0.5)) / 2;

  var blockElt = _({
    tag: 'gcontainer',
    class: 'vc-bar-stack-block',
    child: [{
      tag: 'rect',
      class: 'vc-bar-stack-block-rect',
      style: {
        fill: block.color
      },
      attr: {
        x: -250,
        y: 0,
        width: 500,
        height: 10
      }
    }, {
      tag: 'text',
      class: 'vc-bar-stack-block-value',
      attr: {
        y: 25
      },
      style: {
        fill: valueColor + ''
      },
      child: {
        text: block.value
      }
    }, {
      tag: 'text',
      class: 'vc-bar-stack-block-percent',
      attr: {
        y: 55
      },
      style: {
        fill: percenColor + ''
      },
      child: {
        text: block.percent.toFixed(1) + '%'
      }
    }]
  });

  blockElt.$rect = $('.vc-bar-stack-block-rect', blockElt);
  return blockElt;
};

BarStackChart.prototype._createNote = function () {
  var thisC = this;
  this.$noteCtn.clearChild();
  this.$notes = this.blocks.map(function (block) {
    var noteElt = thisC._makeNote(block);

    thisC.$noteCtn.addChild(noteElt);
    return noteElt;
  });
};

BarStackChart.prototype._createStack = function () {
  var thisC = this;
  this.$stack.clearChild();
  this.$blocks = this.blocks.map(function (block) {
    var blockElt = thisC._makeBlock(block);

    thisC.$stack.addChild(blockElt);
    return blockElt;
  });
};

BarStackChart.prototype.createContent = function () {
  this.normalizeData();

  this._createNote();

  this._createStack();
};

BarStackChart.prototype.updateContentPosition = function () {
  if (!this.isDescendantOf(document.body)) {
    this.emit('_updateContentPosition');
    return;
  }

  this.$content.box.setPosition(this._contentMargin, 40);
  this.$content.box.setSize(this.box.width - 2 * this._contentMargin, this.box.height - this._contentMargin - 40);

  this._updateNotePosition();

  this._updateStackPosition();
};

BarStackChart.prototype._updateNotePosition = function () {
  var thisC = this;
  var noteCtnBox = this.$noteCtn.getBBox();
  this.$noteCtn.box.setSize(noteCtnBox.width, this.$content.box.height);
  this.$noteCtn.box.setPosition(this.$content.box.width - noteCtnBox.width, 0);
  var dy = this.$noteCtn.box.height / this.blocks.length;
  this.$notes.forEach(function (noteElt, i) {
    noteElt.box.y = dy * i + dy / 2 - 7;
  });
};

BarStackChart.prototype._updateStackPosition = function () {
  var thisC = this;
  this.$stack.box.setSize(this.$content.box.width - this.$noteCtn.box.width - 20, this.$content.box.height);
  this.$stack.box.x = this.$stack.box.width / 2; //to center

  var dy = this.$noteCtn.box.height / this.blocks.length;
  var width = this.$stack.box.width;
  var maxValue = this.blocks.reduce(function (ac, cr) {
    return Math.max(ac, cr.value);
  }, 0);
  this.$blocks.forEach(function (blockElt, i) {
    var block = thisC.blocks[i];
    blockElt.box.y = dy * i;
    blockElt.$rect.attr({
      height: dy,
      width: block.value / maxValue * width,
      x: -block.value / maxValue * width / 2
    });
  });
};

BarStackChart.prototype.updateContent = function () {
  this.createContent();
  this.updateContentPosition();
};

_VCore.default.install(BarStackChart);

var _default = BarStackChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/PieChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/PieChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _SvgCanvas = _interopRequireDefault(require("absol-svg/js/svg/SvgCanvas"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _helper = require("./helper");

require("./style/piechart.css");

var _BChart = _interopRequireDefault(require("./BChart"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @typedef VCPiece
 * @property {string} name
 * @property {number} value
 * @property {string} valueText
 * @property {string} fillColor
 * @property {boolean} separated
 */

/***
 * @extends BChart
 * @constructor
 */

function PieChart() {
  _BChart.default.call(this);

  this.$pieCtn = this.$body;
  this.$pie = _('gcontainer');
  this.$pieCtn.addChild(this.$pie);
  /***
   *
   * @type {VCPiece[]}
   */

  this.pieces = [];
}

_OOP.default.mixClass(PieChart, _BChart.default);

PieChart.property = Object.assign({}, _BChart.default.property);
PieChart.eventHandler = Object.assign({}, _BChart.default.eventHandler);
PieChart.tag = 'PieChart'.toLowerCase();

PieChart.render = function () {
  return _BChart.default.render().addClass('vc-piece-chart');
};

PieChart.prototype._createPie = function () {
  this.$pie.clearChild();
  var thisC = this;
  this.$pieces = this.pieces.map(function (piece) {
    var pieceElt = _({
      tag: 'shape',
      class: 'vc-piece',
      style: {
        fill: piece.fillColor + ''
      }
    });

    thisC.$pie.addChild(pieceElt);
    return pieceElt;
  });
  this.$pieceValues = this.pieces.map(function (piece) {
    var valueElt = _({
      tag: 'text',
      class: 'vc-piece-value',
      style: {
        fill: _Color.default.parse(piece.fillColor + '').getContrastYIQ()
      },
      child: {
        text: piece.valueText || piece.value
      }
    });

    thisC.$pie.addChild(valueElt);
    return valueElt;
  });
};

PieChart.prototype.computeNotes = function () {
  return this.pieces.map(function (piece) {
    return {
      color: piece.fillColor,
      text: piece.name,
      type: 'rect'
    };
  });
};

PieChart.prototype.createContent = function () {
  _BChart.default.prototype.createContent.call(this);

  this._createPie();
};

PieChart.prototype._updatePiePosition = function () {
  var piece, pieceElt;
  var sum = this.pieces.reduce(function (ac, cr) {
    return ac + cr.value;
  }, 0);
  this.$pieCenter = _({
    tag: 'circle',
    attr: {
      cx: 0,
      cy: 0,
      r: 1
    },
    style: {
      fill: 'transparent'
    }
  });
  this.$pie.addChild(this.$pieCenter);
  var pieCenterBound = this.$pieCenter.getBBox();

  for (var k = 0; k < 50; ++k) {
    var startAngle = -Math.PI / 2;
    var endAngle = 0;
    var valueElt;
    var valueBound;
    var x0, y0;
    var r = Math.min(this.$pieCtn.box.width - 5, this.$pieCtn.box.height - 5) / 2 * (1 - k / 150);
    var sr = Math.max(3, r / 15);

    for (var i = 0; i < this.pieces.length; ++i) {
      piece = this.pieces[i];
      pieceElt = this.$pieces[i];
      valueElt = this.$pieceValues[i];

      if (piece.value === 0) {
        pieceElt.addStyle('display', 'none');
        valueElt.addStyle('display', 'none');
      } else {
        pieceElt.removeStyle('display');
        valueElt.removeStyle('display');
      }

      endAngle = startAngle + Math.PI * 2 * piece.value / sum;
      x0 = 0;
      y0 = 0;

      if (piece.separated) {
        x0 += sr * Math.cos((startAngle + endAngle) / 2);
        y0 += sr * Math.sin((startAngle + endAngle) / 2);
      }

      pieceElt.begin();

      if (piece.value < sum) {
        pieceElt.moveTo(x0, y0);
        pieceElt.lineTo(x0 + r * Math.cos(startAngle), y0 + r * Math.sin(startAngle));
      } else {
        pieceElt.moveTo(x0 + r * Math.cos(startAngle), y0 + r * Math.sin(startAngle));
      }

      pieceElt.arcTo(x0 + r * Math.cos((startAngle + endAngle) / 2), y0 + r * Math.sin((startAngle + endAngle) / 2), r, r, 0, 1, 0).arcTo(x0 + r * Math.cos(endAngle), y0 + r * Math.sin(endAngle), r, r, 0, 1, 0).closePath().end();
      valueBound = valueElt.getBBox();

      if (piece.value === sum) {
        valueElt.attr({
          x: 0,
          y: 7
        });
      } else {
        valueElt.attr({
          x: x0 + (r - 20 - valueBound.width / 2) * Math.cos((startAngle + endAngle) / 2),
          y: y0 + (r - 20 - valueBound.height / 2) * Math.sin((startAngle + endAngle) / 2) + 7
        });
      }

      startAngle = endAngle;
    }

    var piePound = this.$pie.getBBox();

    if (piePound.width < this.$pieCtn.box.width && piePound.height < this.$pieCtn.box.height) {
      this.$pie.box.setPosition(this.$pieCtn.box.width / 2 - (piePound.width / 2 - (pieCenterBound.x + 1 - piePound.x)), this.$pieCtn.box.height / 2 - (piePound.height / 2 - (pieCenterBound.y + 1 - piePound.y)));
      break;
    }
  }
};

PieChart.prototype.updateBodyPosition = function () {
  _BChart.default.prototype.updateBodyPosition.call(this);

  this._updatePiePosition();
};

PieChart.prototype.normalizeData = function () {
  var blockColors = (0, _helper.generateBackgroundColors)(this.pieces.length);
  this.pieces.forEach(function (piece, i) {
    piece.fillColor = piece.fillColor || blockColors[i];
  });
};

_VCore.default.install(PieChart);

var _default = PieChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/HCollumnChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/HCollumnChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

var _SvgCanvas = _interopRequireDefault(require("absol-svg/js/svg/SvgCanvas"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));


var _ = _VCore.default._;
var $ = _VCore.default.$;
/***
 * @extends SvgCanvas
 * @constructor
 */

function HColumnChart() {
  this.$title = $('.vc-title', this);
  console.log($('sattachhook.vc-dom-signal', this));
  this.domSignal = new _DomSignal.default($('sattachhook.vc-dom-signal', this)); // this.domSignal.on({
  //     updateContent: this.updateContent.bind(this)
  // });
  // this.emit('updateContent');
}

HColumnChart.tag = "HColumnChart".toLowerCase();

HColumnChart.render = function () {
  return _({
    tag: _SvgCanvas.default.tag,
    class: 'vc-h-column-chart',
    child: [{
      tag: 'text',
      class: 'vc-title',
      child: {
        text: ''
      },
      attr: {
        y: 20
      }
    }, {
      class: 'vc-h-column-root',
      child: [{
        class: 'vc-h-column-ox-key-ctn'
      }, {
        class: 'vc-h-column-oy-key-ctn'
      }, {
        tag: 'hlinearrow'
      }]
    }, 'sattachhook.vc-dom-signal']
  });
};

HColumnChart.prototype.updateSize = function () {
  _SvgCanvas.default.prototype.updateSize.call(this);

  this.updateContentPosition();
};

HColumnChart.prototype.updateContent = function () {
  if (!this.isDescendantOf(document.body)) {
    this.domSignal.emit('updateContent');
    return;
  }

  this.normalizeData();
  this.createContent();
  this.updateContentPosition();
};

HColumnChart.prototype.normalizeData = function () {};

HColumnChart.prototype._createTitle = function () {
  this.$title.firstChild.data = this.title;
};

HColumnChart.prototype.createContent = function () {
  this._createTitle();
};

HColumnChart.prototype._alignTitle = function () {
  this.$title.attr('x', this.box.width / 2);
};

HColumnChart.prototype.updateContentPosition = function () {
  this._alignTitle();
};

_VCore.default.install(HColumnChart);

var _default = HColumnChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/TinyCircleChart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/TinyCircleChart.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SvgCanvas = _interopRequireDefault(require("absol-svg/js/svg/SvgCanvas"));

var _VCore = _interopRequireWildcard(require("./VCore"));

var _BChart = _interopRequireDefault(require("./BChart"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _Turtle = _interopRequireDefault(require("absol-svg/js/controller/Turtle"));

require("./style/tinycirclechart.css");

var _utils = require("absol-acomp/js/utils");

var _Dom = require("absol/src/HTML5/Dom");




/***
 * @extends SvgCanvas
 * @constructor
 */
function TinyCircleChart() {
  this.contentPadding = 5;
  this._arcs = [];
  this.computedData = {
    notes: []
  };
  this.total = NaN;
  this.$notes = [];
  this.$noteCtn = (0, _VCore.$)('.vc-note-ctn', this);
  this.$arcs = [];
  this.$content = (0, _VCore.$)('.vc-content', this);
  this.$circleBlank = (0, _VCore.$)('.vc-tiny-circle-blank', this);
  this.$title = (0, _VCore.$)('.vc-title', this);
}

TinyCircleChart.tag = 'TinyCircleChart'.toLowerCase();

TinyCircleChart.render = function () {
  return (0, _VCore._)({
    tag: _SvgCanvas.default.tag,
    class: ['vc-chart', 'vc-tiny-circle-chart'],
    child: [{
      tag: 'gcontainer',
      class: 'vc-content',
      child: [{
        tag: 'path',
        class: 'vc-tiny-circle-blank'
      }, {
        tag: 'text',
        class: 'vc-title',
        attr: {
          y: '7'
        },
        child: {
          text: ''
        }
      }]
    }, {
      tag: 'gcontainer',
      class: 'vc-note-ctn'
    }]
  });
};

TinyCircleChart.prototype._computeNote = function () {
  this.computedData.notes = (this._arcs || []).map(function (arc, i, array) {
    var note = {};
    note.color = arc.color || _Color.default.fromHSL(1 / array.length * i, 0.5, 0.5);
    note.text = arc.name.replace(/[^\s]+/g, function (all) {
      if (all === '$value') {
        return arc.value + '';
      }

      return all;
    });
    note.type = 'rect';
    return note;
  });
  this.computedData.estimateNoteWidth = this.computedData.notes.reduce((ac, node) => {
    return Math.max((0, _utils.measureText)(node.text, '14px arial').width, ac);
  }, 0) + 28;
  this.computedData.estimateNoteHeight = this.computedData.notes.length * 20;
  var screenSize = (0, _Dom.getScreenSize)();
  var fontSize = (0, _VCore.$)(document.body).getFontSize();
  this.computedData.estimateWidth = Math.max(this.computedData.estimateNoteWidth + this.computedData.estimateNoteHeight, 250);

  if (this.computedData.estimateWidth * fontSize / 14 > screenSize.width - 20) {
    this.computedData.estimateWidth = this.computedData.estimateNoteWidth;
    this.computedData.estimateHeight = Math.max(this.computedData.estimateNoteHeight + this.computedData.estimateNoteWidth, 100);
  } else {
    this.computedData.estimateHeight = Math.max(this.computedData.estimateNoteHeight + 10, 100);
  }

  this.addStyle({
    'min-width': this.computedData.estimateWidth / 14 + 'rem',
    'min-height': this.computedData.estimateHeight / 14 + 'rem'
  });
};

TinyCircleChart.prototype._createNote = _BChart.default.prototype._createNote;

TinyCircleChart.prototype._updateNotesPosition = function () {
  var t = (0, _VCore.$)(document.body).getFontSize();
  this.$notes.forEach(function (noteElt, i) {
    noteElt.box.y = Math.ceil(t * 1.428) * i;
  });
};

TinyCircleChart.prototype._createArcs = function () {
  this.$arcs.forEach(function (arc) {
    arc.remove();
  });
  this.$arcs = (this._arcs || []).map(function (arc, i, array) {
    var arcElt = (0, _VCore._)('path.vc-arc');
    arcElt.addStyle('fill', this.computedData.notes[i].color);
    this.$content.addChild(arcElt);
    return arcElt;
  }.bind(this));
};

TinyCircleChart.prototype._updateArcsPosition = function () {
  var noteBBox = this.$noteCtn.getBBox();
  var R = 0;

  if (this.box.width - noteBBox.width >= this.box.height - noteBBox.height) {
    R = Math.min(this.box.width - noteBBox.width - 2 * this.contentPadding - 10, this.box.height - this.contentPadding) / 2;
    this.$noteCtn.box.position = {
      x: 2 * R + 10 + this.contentPadding,
      y: this.box.height / 2 - noteBBox.height / 2
    };
    this.$content.box.position = {
      x: R + this.contentPadding,
      y: this.box.height / 2
    };
  } else {
    R = Math.min(this.box.height - noteBBox.height - 2 * this.contentPadding - 10, this.box.width - this.contentPadding) / 2;
    this.$noteCtn.box.position = {
      y: 2 * R + 10 + this.contentPadding,
      x: this.box.width / 2 - noteBBox.width / 2
    };
    this.$content.box.position = {
      y: R + this.contentPadding,
      x: this.box.width / 2
    };
  }

  var r = Math.min(R - 12, R - R / 10);
  this.$circleBlank.attr('d', new _Turtle.default().moveTo(0, -R).arcBy(R, R, 0, 0, 1, R, R).arcBy(R, R, 0, 0, 1, -R, R).arcBy(R, R, 0, 0, 1, -R, -R).arcBy(R, R, 0, 0, 1, R, -R).moveTo(0, -r).arcBy(r, r, 0, 0, 1, r, r).arcBy(r, r, 0, 0, 1, -r, r).arcBy(r, r, 0, 0, 1, -r, -r).arcBy(r, r, 0, 0, 1, r, -r).closePath().getPath());
  var total = this.total;

  if (!(total > 0 && total < Infinity && typeof total === "number")) {
    total = (this._arcs || []).reduce(function (ac, cr) {
      return ac + cr.value;
    }, 0);
  }

  var angle0,
      angle1 = -Math.PI / 2;
  var total2 = Math.max(total, 1);
  var angleCenter;

  for (var i = 0; i < this.$arcs.length; ++i) {
    angle0 = angle1;
    angle1 = angle1 + Math.PI * 2 * this._arcs[i].value / total2;
    angleCenter = (angle0 + angle1) / 2;
    this.$arcs[i].attr('d', new _Turtle.default().moveTo(R * Math.cos(angle0), R * Math.sin(angle0)).arcTo(R, R, 0, this._arcs[i].value > total2 ? 1 : 0, 1, R * Math.cos(angleCenter), R * Math.sin(angleCenter)).arcTo(R, R, 0, this._arcs[i].value > total2 ? 1 : 0, 1, R * Math.cos(angle1), R * Math.sin(angle1)).lineTo(r * Math.cos(angle1), r * Math.sin(angle1)).arcTo(r, r, 0, this._arcs[i].value > total2 ? 1 : 0, 0, r * Math.cos(angleCenter), r * Math.sin(angleCenter)).arcTo(r, r, 0, this._arcs[i].value > total2 ? 1 : 0, 0, r * Math.cos(angle0), r * Math.sin(angle0)).closePath().getPath());
  }

  this.$title.firstChild.data = total + '';
};

TinyCircleChart.prototype.updateSize = function () {
  _SvgCanvas.default.prototype.updateSize.call(this);

  this._updateArcsPosition();
};

TinyCircleChart.property = {};
TinyCircleChart.property.arcs = {
  set: function (value) {
    this._arcs = value;

    this._computeNote();

    this._createNote();

    this._updateNotesPosition();

    this._createArcs();
  },
  get: function () {
    return this._arcs;
  }
};

_VCore.default.install(TinyCircleChart);

var _default = TinyCircleChart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = install;
exports.VChartCreators = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _BChart = _interopRequireDefault(require("./BChart"));

var _VerticalChart = _interopRequireDefault(require("./VerticalChart"));

var _PieChart = _interopRequireDefault(require("./PieChart"));

var _AssessmentChart = _interopRequireDefault(require("./AssessmentChart"));

var _ColumnChart = _interopRequireDefault(require("./ColumnChart"));

var _ColumnAreaChart = _interopRequireDefault(require("./ColumnAreaChart"));

var _TinyCircleChart = _interopRequireDefault(require("./TinyCircleChart"));


var VChartCreators = [_BChart.default, _VerticalChart.default, _PieChart.default, _AssessmentChart.default, _ColumnChart.default, _ColumnAreaChart.default, _TinyCircleChart.default];
/***
 *
 * @param {Dom} core
 */

exports.VChartCreators = VChartCreators;

function install(core) {
  core.install(VChartCreators);
}
};

moduleFactories["node_modules/absol-vchart/src/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _VCore = _interopRequireDefault(require("./VCore"));

require("./style/vchartStyle");

require("./Axis");

require("./ScrollArrow");

require("./BaseChart");

var _ToolTip = require("./ToolTip");

require("./HLineArrow");

require("./HScrollBar");

require("./LineChart");

require("./DualChart");

require("./RangeChart");

require("./AssessmentChart");

require("./ColumnChart");

require("./ColumnAreaChart");

require("./RangeGroupChart");

require("./CurveChart");

require("./RankChart");

require("./SunburstChart");

require("./SquareChart");

require("./GroupRankChart");

require("./MappingChart");

require("./ImagesChart");

require("./SalaryScaleChart");

require("./HorizontalBarChart");

require("./SpiderChart");

require("./FunnelChart");

require("./BarStackChart");

require("./PieChart");

require("./HCollumnChart");

var _helper = require("./helper");

var _install = _interopRequireDefault(require("./install"));


(0, _install.default)(_VCore.default);
var vchart = {
  core: _VCore.default,
  creator: _VCore.default.creator,
  _: _VCore.default._,
  $: _VCore.default.$,
  buildSvg: _VCore.default._,
  lambda: {
    isNumber: _helper.isNumber,
    toLocalString: _helper.toLocalString
  },
  text: _helper.text,
  circle: _helper.circle,
  rect: _helper.rect,
  vline: _helper.vline,
  hline: _helper.hline,
  moveVLine: _helper.moveVLine,
  moveHLine: _helper.moveHLine,
  autoCurve: _helper.autoCurve,
  showTooltip: _ToolTip.showTooltip,
  closeTooltip: _ToolTip.closeTooltip,
  addDevContextMenu: _helper.addDevContextMenu
};
var _default = vchart;
exports.default = _default;
};

moduleFactories["node_modules/absol-vchart/src/vchart.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-vchart/src/vchart.js ***/
"use strict";

var _ = _interopRequireDefault(require("."));

var helper = _interopRequireWildcard(require("./helper"));

var tl = _interopRequireWildcard(require("./template"));

var _install = _interopRequireDefault(require("./install"));




Object.assign(_.default, helper);
_.default.tl = tl;

if ('absol' in window) {
  if (absol.coreDom) {
    absol.coreDom.install(Object.keys(_.default.creator).filter(function (e) {
      return !!e.match(/.+chart/);
    }).reduce(function (ac, cr) {
      ac[cr] = _.default.creator[cr];
      return ac;
    }, {}));
    (0, _install.default)(absol.coreDom);
  } else {
    console.error("coreDom not found");
  }
}

window.vchart = _.default;
};

moduleFactories["node_modules/absol-colorpicker/components/CPCore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/components/CPCore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _install = _interopRequireDefault(require("absol-acomp/js/dom/install"));


var CPCore = new _Dom.default();
(0, _install.default)(CPCore);
var _default = CPCore;
exports.default = _default;
};

moduleFactories["node_modules/absol-colorpicker/style/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/style/index.js ***/
"use strict";

require("./colorpicker.css");

require("./colorpickerbutton.css");

require("./swatchestable.css");

require("./spectrumcolor.css");

require("./solidcolorpicker.css");
};

moduleFactories["node_modules/absol-colorpicker/components/ColorPicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/components/ColorPicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _CPCore = _interopRequireDefault(require("./CPCore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));


var _ = _CPCore.default._;
var $ = _CPCore.default.$;

function ColorPicker() {
  var res = _(['<div class="absol-color-picker">', '    <div class="absol-color-picker-color">', '        <div class="absol-color-picker-sat">', '            <div class="absol-color-picker-val">', '                <div class="absol-color-dragger"></div>', '            </div>', '        </div>', '    </div>', '    <div class="absol-color-picker-hue-range">', '        <div class="absol-color-picker-hue">', '            <div class="absol-color-dragger"></div>', '        </div>', '    </div>', '    <div class="absol-color-picker-alpha-range">', '        <div class="absol-color-picker-alpha">', '            <div class="absol-color-dragger"></div>', '        </div>', '    </div>', '    <div class="absol-color-picker-input">', ` <div class="absol-color-picker-text-container">
            <span class="f-mode">hsba(</span>
            <span class="absol-editabe-text num0">0</span><span class="separator0">deg, </span>
            <span class="absol-editabe-text num1">0</span><span class="separator1">%, </span>
            <span class="absol-editabe-text num2">0</span><span class="separator2">%, </span>
            <span class="absol-editabe-text num3">0</span><span>)</span>
        </div>`, '    </div>', '    <button class="absol-color-picker-mode">HSB</button>', '</div>'].join(''));

  res.$fMode = $('.f-mode', res);
  res.$sep0 = $('.separator0', res);
  res.$sep1 = $('.separator1', res);
  res.$sep2 = $('.separator2', res);
  res.$num0 = _('editabletext.num0');
  res.$num1 = _('editabletext.num1');
  res.$num2 = _('editabletext.num2');
  res.$num3 = _('editabletext.num3');
  ColorPicker.defaultNumberInputHandle(res.$num0);
  ColorPicker.defaultNumberInputHandle(res.$num1);
  ColorPicker.defaultNumberInputHandle(res.$num2);
  ColorPicker.defaultNumberInputHandle(res.$num3);
  res._num0LimitOption = ColorPicker.numberInputHandleLimit(res.$num0, 0, 360);
  res._num1LimitOption = ColorPicker.numberInputHandleLimit(res.$num1, 0, 100, 0);
  res._num2LimitOption = ColorPicker.numberInputHandleLimit(res.$num2, 0, 100, 0);
  res._num3LimitOption = ColorPicker.numberInputHandleLimit(res.$num3, 0, 1, 3);
  $(".absol-editabe-text.num0", res).selfReplace(res.$num0);
  $(".absol-editabe-text.num1", res).selfReplace(res.$num1);
  $(".absol-editabe-text.num2", res).selfReplace(res.$num2);
  $(".absol-editabe-text.num3", res).selfReplace(res.$num3);
  res.$num0.text = '0';
  res.$num1.text = '0';
  res.$num2.text = '0';
  res.$num3.text = '0';
  res.switchMode = {
    RGBA: 'HSBA',
    HSBA: 'HSLA',
    HSLA: 'RGBA',
    RGB: 'HSB',
    HSB: 'HSL',
    HSL: 'RGB'
  };
  res.toggleAlpha = {
    RGBA: 'RGB',
    HSBA: 'HSB',
    HSLA: 'HSL',
    RGB: 'RGBA',
    HSB: 'HSBA',
    HSL: 'HSLA'
  };
  res.defineEvent(['change']);
  res._saturation = 0;
  res._brightness = 0;
  res._hue = 0;
  res._alpha = 1;
  res.$color = $('.absol-color-picker-color', res);
  res.$colorVal = $('.absol-color-picker-val', res);
  res.$draggerVal = $('.absol-color-dragger', res.$colorVal);
  res.eventHandler = _OOP.default.bindFunctions(res, ColorPicker.eventHandler);
  res.$colorVal.on('pointerdown', res.eventHandler.colorPointerDown, true);
  res.$hue = $('.absol-color-picker-hue', res);
  res.$draggerHue = $('.absol-color-dragger', res.$hue);
  res.$hue.on('pointerdown', res.eventHandler.huePointerDown);
  res.$alpha = $('.absol-color-picker-alpha', res);
  res.$alpha.on('pointerdown', res.eventHandler.alphaPointerDown);
  res.$draggerAlpha = $('.absol-color-dragger', res.$alpha);
  res.$textContainer = $('.absol-color-picker-text-container', res);
  res.$mode = $('.absol-color-picker-mode', res);
  res.$mode.on('click', res.eventHandler.modeClick); //todo

  res.$num0.on('blur', res.eventHandler.inputBlur);
  res.$num1.on('blur', res.eventHandler.inputBlur);
  res.$num2.on('blur', res.eventHandler.inputBlur);
  res.$num3.on('blur', res.eventHandler.inputBlur);
  return res;
}

ColorPicker.defaultNumberInputHandle = function (element) {
  element.on('keydown', function (event) {
    if (!event.key.match(/^[0-9\.]$/) && event.key.length == 1) {
      event.preventDefault();
    }

    if (event.key == 'Tab') {
      event.preventDefault();
    }

    if (event.key == 'Enter') {
      this.edit(false);
    }

    if (event.key == '.' && this.text.indexOf('.') >= 0) {
      event.preventDefault();
    }

    if (this.text.length >= 6 && event.key.length == 1) event.preventDefault();
  }).on('click', function (event) {
    element.edit(true, true);
  }).on('keydown', function (event) {
    if (event.key == 'Tab') {
      var parent = element.parentNode;
      var firstFriend;
      var found = false;
      var nextFriend = $('editabletext', parent, function (elt) {
        if (elt.getComputedStyleValue('display') == "none") return;

        if (!firstFriend) {
          firstFriend = elt;
        }

        if (elt == element) {
          found = true;
        } else if (found) {
          return true;
        }
      });
      nextFriend = nextFriend || firstFriend;

      if (nextFriend) {
        nextFriend.edit(true, true);
      }
    }
  });
};

ColorPicker.numberInputHandleLimit = function (element, min, max, fixed) {
  var option = {
    min: min,
    max: max,
    fixed: fixed || 0,
    enable: true
  };
  element.on('blur', function (event) {
    if (!option.enable) return;
    var number = parseFloat(element.text);

    if (isNaN(number)) {
      number = min;
    }

    if (option.fixed == 0) {
      number = Math.round(number);
    }

    number = Math.max(min, Math.min(option.max, number));
    element.text = number.toFixed(option.fixed) + '';
  });
  return option;
};

ColorPicker.property = {};
ColorPicker.property.withAlpha = {
  set: function (value) {
    if (value) {
      this.addClass('with-alpha');
    } else {
      this.removeClass('with-alpha');
    }
  },
  get: function () {
    return this.containClass('with-alpha');
  }
};
ColorPicker.property.saturation = {
  set: function (value) {
    value = value || 0;
    value = Math.max(0, Math.min(1, value));
    this._saturation = value;
    this.$draggerVal.addStyle('left', value * 100 + '%');

    this._update();
  },
  get: function () {
    return this._saturation;
  }
};
ColorPicker.property.brightness = {
  set: function (value) {
    value = value || 0;
    value = Math.max(0, Math.min(1, value));
    this._brightness = value;
    this.$draggerVal.addStyle('bottom', value * 100 + '%');

    this._update();
  },
  get: function () {
    return this._brightness;
  }
};
ColorPicker.property.mode = {
  set: function (value) {
    value = (value + '').toUpperCase();

    if (value.indexOf('A') >= 0) {
      this.addClass('with-alpha');
    } else {
      this.removeClass('with-alpha');
      this.alpha = 1;
    }

    if (value.match(/^H/)) {
      this._num0LimitOption.max = 360;
      this._num1LimitOption.max = 100;
      this._num2LimitOption.max = 100;
    } else if (value.match(/^RGB/)) {
      this._num0LimitOption.max = 255;
      this._num1LimitOption.max = 255;
      this._num2LimitOption.max = 255;
    }

    if (value.match(/^(HSB|HSL|RGB|RGBA|HSBA|HSLA)$/)) {
      this.$mode.innerHTML = value;

      this._updateColorText();
    }
  },
  get: function () {
    return this.$mode.innerHTML;
  }
};
ColorPicker.property.hue = {
  set: function (value) {
    value = value || 0;
    value = Math.max(0, Math.min(1, value));
    this._hue = value;
    this.$draggerHue.addStyle('top', value * 100 + '%');

    this._update();
  },
  get: function () {
    return this._hue;
  }
};
ColorPicker.property.alpha = {
  set: function (value) {
    value = value || 0;
    value = Math.max(0, Math.min(1, value));
    this._alpha = value;
    this.$draggerAlpha.addStyle('top', (1 - value) * 100 + '%');

    this._update();
  },
  get: function () {
    return this._alpha;
  }
};
ColorPicker.property.value = {
  set: function (value) {
    if (typeof value == 'string') {
      value = _Color.default.parse(value);
    }

    if (!value || !value.toHSBA) throw new Error('Invalid color type');
    var hsba = value.toHSBA();
    this.hue = hsba[0];
    this.saturation = hsba[1];
    this.brightness = hsba[2];
    this.alpha = hsba[3];
  },
  get: function () {
    return _Color.default.fromHSBA(this.hue, this.saturation, this.brightness, this.alpha);
  }
};
ColorPicker.property.RGBA = {
  set: function (value) {
    var hsba = _Color.default.rgbaToHSBA(value || [0, 0, 0, 0]);

    this.hue = hsba[0];
    this.saturation = hsba[1];
    this.brightness = hsba[2];
    this.alpha = hsba[3];
  },
  get: function () {
    var rgba = _Color.default.hsbaToRGBA([this.hue, this.saturation, this.brightness, this.alpha]);

    return rgba;
  }
};

ColorPicker.prototype._getSVOfEvent = function (event) {
  var valBound = this.$colorVal.getBoundingClientRect();
  var dx = event.clientX - valBound.left;
  var dy = event.clientY - valBound.top;
  var s = Math.max(0, Math.min(1, dx / valBound.width));
  var b = Math.max(0, Math.min(1, 1 - dy / valBound.height));
  return {
    s,
    b
  };
};

ColorPicker.prototype._getHOfEvent = function (event) {
  var hueBound = this.$hue.getBoundingClientRect();
  var h = event.clientY - hueBound.top;
  h = h / hueBound.height;
  h = Math.max(0, Math.min(1, h));
  return h;
};

ColorPicker.prototype._getAOfEvent = function (event) {
  var alphaBound = this.$alpha.getBoundingClientRect();
  var a = alphaBound.bottom - event.clientY;
  a = a / alphaBound.height;
  a = Math.max(0, Math.min(1, a));
  return a;
};

ColorPicker.prototype._getTextColorCode = function () {
  var h = this.hue + 0.5;
  if (h > 1) h -= 1;
  var s = this.saturation > 0.5 ? 0 : 1;
  var b = this.brightness > 0.5 ? 0 : 1;

  var rgba = _Color.default.hsbaToRGBA([h, s, b, 1]);

  return 'rgba(' + rgba.map((x, i) => i < 3 ? x * 255 : x).join(',') + ')';
};

ColorPicker.prototype.init = function (props) {
  this.RGBA = [1, 1, 1, 1];
  this.super(props);
};

ColorPicker.prototype._update = function () {
  //update vs
  var rgba = _Color.default.hsbaToRGBA([this.hue, 1, 1, 1]);

  this.$color.addStyle('background', 'rgba(' + rgba.map((x, i) => i < 3 ? x * 255 : x).join(',') + ')');
  rgba = _Color.default.hsbaToRGBA([this.hue, this.saturation, this.brightness, this.alpha]);
  this.$textContainer.addStyle('background', 'rgba(' + rgba.map((x, i) => i < 3 ? x * 255 : x).join(',') + ')');
  this.$textContainer.addStyle('color', this._getTextColorCode());

  this._updateColorText();
};

ColorPicker.prototype._updateColorText = function () {
  var hsba = [this.hue, this.saturation, this.brightness, this.alpha];
  var mode = this.mode;
  this.$fMode.innerHTML = mode.toLocaleLowerCase() + '(';

  if (mode.match(/^H/)) {
    this.$sep0.innerHTML = 'deg, ';
    this.$sep1.innerHTML = '%, ';

    if (mode.match(/A$/)) {
      this.$sep2.innerHTML = "%, ";
      this.$num3.removeStyle('display');
    } else {
      this.$sep2.innerHTML = "%";
      this.$num3.addStyle('display', 'none');
    }
  } else {
    this.$sep0.innerHTML = ', ';
    this.$sep1.innerHTML = ', ';

    if (mode.match(/A$/)) {
      this.$sep2.innerHTML = ", ";
      this.$num3.removeStyle('display');
    } else {
      this.$num3.addStyle('display', 'none');
      this.$sep2.innerHTML = "";
    }
  }

  if (mode.match(/HSB/)) {
    this.$num0.text = '' + Math.round(hsba[0] * 360);
    this.$num1.text = '' + Math.round(hsba[1] * 100);
    this.$num2.text = '' + Math.round(hsba[2] * 100);
    this.$num3.text = hsba[3].toFixed(3);
  } else {
    var cBytes = _Color.default['hsbaTo' + (mode.match(/A$/) ? mode : mode + 'A')](hsba);

    if (mode.match(/^H/)) {
      this.$num0.text = '' + Math.round(cBytes[0] * 360);
      this.$num1.text = '' + Math.round(cBytes[1] * 100);
      this.$num2.text = '' + Math.round(cBytes[2] * 100);
      this.$num3.text = hsba[3].toFixed(3);
    } else {
      this.$num0.text = '' + Math.round(cBytes[0] * 255);
      this.$num1.text = '' + Math.round(cBytes[1] * 255);
      this.$num2.text = '' + Math.round(cBytes[2] * 255);
      this.$num3.text = hsba[3].toFixed(3);
    } // var tempMode = mode.indexOf('A') < 0 ? mode + 'A' : mode;
    // var tempColor = Color['hsbaTo' + tempMode](hsba);
    // this.$textContainer.value = Color[mode.toLocaleLowerCase() + 'ToText'](tempColor);

  }
};

ColorPicker.eventHandler = {};

ColorPicker.eventHandler.colorPointerDown = function (event) {
  var newSV = this._getSVOfEvent(event);

  this.saturation = newSV.s;
  this.brightness = newSV.b;
  absol.$(document.body).on('pointermove', this.eventHandler.colorPointerMove).on('pointerup', this.eventHandler.colorPointerFinish).on('pointerleave', this.eventHandler.colorPointerFinish);
  this.emit('change', {
    target: this,
    originEvent: event,
    value: this.value
  });
};

ColorPicker.eventHandler.colorPointerFinish = function (event) {
  absol.$(document.body).off('pointermove', this.eventHandler.colorPointerMove).off('pointerup', this.eventHandler.colorPointerFinish).off('pointerleave', this.eventHandler.colorPointerFinish);
};

ColorPicker.eventHandler.colorPointerMove = function (event) {
  var newSV = this._getSVOfEvent(event);

  this.saturation = newSV.s;
  this.brightness = newSV.b;
  event.preventDefault();
  this.emit('change', {
    target: this,
    originEvent: event,
    value: this.value
  });
};

ColorPicker.eventHandler.huePointerDown = function (event) {
  var newH = this._getHOfEvent(event);

  this.hue = newH;
  event.preventDefault();
  absol.$(document.body).on('pointermove', this.eventHandler.huePointerMove).on('pointerup', this.eventHandler.huePointerFinish).on('pointerleave', this.eventHandler.huePointerFinish);
  this.emit('change', {
    target: this,
    originEvent: event,
    value: this.value
  });
};

ColorPicker.eventHandler.huePointerFinish = function (event) {
  absol.$(document.body).off('pointermove', this.eventHandler.huePointerMove).off('pointerup', this.eventHandler.huePointerFinish).off('pointerleave', this.eventHandler.huePointerFinish);
  event.preventDefault();
};

ColorPicker.eventHandler.huePointerMove = function (event) {
  var newH = this._getHOfEvent(event);

  this.hue = newH;
  event.preventDefault();
  this.emit('change', {
    target: this,
    originEvent: event,
    value: this.value
  });
};

ColorPicker.eventHandler.alphaPointerDown = function (event) {
  var newA = this._getAOfEvent(event);

  this.alpha = newA;
  absol.$(document.body).on('pointermove', this.eventHandler.alphaPointerMove).on('pointerup', this.eventHandler.alphaPointerFinish).on('pointerleave', this.eventHandler.alphaPointerFinish);
  event.preventDefault();
  this.emit('change', {
    target: this,
    originEvent: event,
    value: this.value
  });
};

ColorPicker.eventHandler.alphaPointerFinish = function (event) {
  absol.$(document.body).off('pointermove', this.eventHandler.alphaPointerMove).off('pointerup', this.eventHandler.alphaPointerFinish).off('pointerleave', this.eventHandler.alphaPointerFinish);
  event.preventDefault();
};

ColorPicker.eventHandler.alphaPointerMove = function (event) {
  var newA = this._getAOfEvent(event);

  this.alpha = newA;
  event.preventDefault();
  this.emit('change', {
    target: this,
    originEvent: event,
    value: this.value
  });
};

ColorPicker.eventHandler.modeClick = function (event) {
  this.mode = this.switchMode[this.mode];
  event.preventDefault();
};

ColorPicker.eventHandler.inputBlur = function () {
  var mode = this.mode;
  var alpha = 1;

  if (mode.match(/A$/)) {
    alpha = parseFloat(this.$num3.text);
  }

  var bytes;

  if (mode.match(/^H/)) {
    bytes = [parseFloat(this.$num0.text) / 360, parseFloat(this.$num1.text) / 100, parseFloat(this.$num2.text) / 100, alpha];
  } else if (mode.match(/^RGB/)) {
    bytes = [parseFloat(this.$num0.text) / 255, parseFloat(this.$num1.text) / 255, parseFloat(this.$num2.text) / 255, alpha];
  }

  var hsba = mode.match(/^HSB/) ? bytes : _Color.default[(mode.match(/A$/) ? mode.toLocaleLowerCase() : mode.toLocaleLowerCase() + 'a') + 'ToHSBA'](bytes);
  this.hue = hsba[0];
  this.saturation = hsba[1];
  this.brightness = hsba[2];
  this.alpha = hsba[3];
};

_CPCore.default.creator.colorpicker = ColorPicker;
var _default = ColorPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-colorpicker/components/ColorPickerButton.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/components/ColorPickerButton.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./ColorPicker");

var _CPCore = _interopRequireDefault(require("./CPCore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));


var _ = _CPCore.default._;
var $ = _CPCore.default.$;
var isMobile = _BrowserDetector.default.isMobile;
/***
 * @extends AElement
 * @constructor
 */

function ColorPickerButton() {
  this.mode = 'OBJECT';
  this.$innerValue = $('.as-color-picker-button-inner-value', this);
  this.prepare();
  this.on('click', this.eventHandler.click);
  /***
   * @name value
   * @type {string|Color}
   * @memberOf ColorPickerButton#
   */

  /***
   * @name hasOpacity
   * @type {boolean}
   * @memberOf ColorPickerButton#
   */
}

ColorPickerButton.tag = 'ColorPickerButton'.toLowerCase();

ColorPickerButton.prototype._isClickMenu = function (event) {
  var c = event.target;

  while (c) {
    if (c.classList.contains('as-solid-color-picker-swatches-name-menu')) return true;
    c = c.parentElement;
  }

  return false;
};

ColorPickerButton.prototype.supportedModes = ['OBJECT', 'RGBA', 'RGB', 'HEX8', 'HEX6', 'HEX4', 'HEX3'];
ColorPickerButton.prototype.hasOpacityModes = ['OBJECT', 'RGBA', 'HEX8', 'HEX4'];
ColorPickerButton.eventHandler = {};

ColorPickerButton.eventHandler.click = function (event) {
  this.togglePicker();
};

ColorPickerButton.eventHandler.changeColor = function (event) {
  this.$innerValue.addStyle("background-color", event.value.toString());
  this._value = event.value;
  this.emit('change', event, this);
};

ColorPickerButton.eventHandler.clickBody = function (event) {
  if (_EventEmitter.default.hitElement(this, event) || _EventEmitter.default.hitElement(this.$ColorPicker, event) || this._isClickMenu(event)) return;
  this.closePicker();
};

ColorPickerButton.eventHandler.submit = function (event) {
  this.closePicker();
};

ColorPickerButton.prototype.togglePicker = function () {
  if (this.containsClass('as-color-picker-selecting')) {
    this.closePicker();
  } else {
    this.openPicker();
  }
};

ColorPickerButton.prototype.openPicker = function () {
  if (this.containsClass('as-color-picker-selecting')) return;

  if (ColorPickerButton.lastOpen) {
    ColorPickerButton.lastOpen.closePicker();
  }

  ColorPickerButton.lastOpen = this;
  var thisBt = this;
  this.addClass('as-color-picker-selecting');
  this.$ColorPicker.on('change', this.eventHandler.changeColor).on('submit', this.eventHandler.submit);
  this.$ColorPicker.reloadSetting();
  this.$follower.addStyle('visibility', 'hidden');
  this.$follower.addTo(document.body);
  this.$follower.followTarget = this;
  setTimeout(function () {
    document.addEventListener('click', this.eventHandler.clickBody);
  }.bind(this), 100);
  this._lastValue = this.value;
  this.$ColorPicker.hasOpacity = this.hasOpacity;
  ColorPickerButton.$ColorPicker.value = this.value;
  setTimeout(function () {
    thisBt.$follower.removeStyle('visibility');
  }, 1); //10p
};

ColorPickerButton.prototype.closePicker = function () {
  if (!this.containsClass('as-color-picker-selecting')) return;
  this.removeClass('as-color-picker-selecting');

  if (ColorPickerButton.lastOpen === this) {
    ColorPickerButton.lastOpen = null;
    this.$follower.remove();
  }

  this.$ColorPicker.off('change', this.eventHandler.changeColor).off('submit', this.eventHandler.submit);
  document.removeEventListener('click', this.eventHandler.clickBody);

  if (this.value !== this._lastValue) {
    this.emit('stopchange', {
      target: this,
      value: this.value
    }, this);
  }
};

ColorPickerButton.prototype.prepare = function () {
  if (!ColorPickerButton.$ColorPicker) {
    if (isMobile) {
      ColorPickerButton.$follower = _('modal').on('click', function (event) {
        if (event.tagert === this) {
          if (ColorPickerButton.lastOpen) ColorPickerButton.lastOpen.closePicker();
        }
      });
    } else {
      ColorPickerButton.$follower = _('follower.as-color-picker-button-follower');
    }

    ColorPickerButton.$ColorPicker = _({
      tag: 'solidcolorpicker'
    }).addTo(ColorPickerButton.$follower);
    ColorPickerButton.lastOpen = null;
  }

  this.$follower = ColorPickerButton.$follower;
  this.$ColorPicker = ColorPickerButton.$ColorPicker;
};

ColorPickerButton.render = function () {
  return _({
    tag: 'button',
    extendEvent: ['change', 'stopchange'],
    class: 'as-color-picker-button',
    child: [{
      tag: "div",
      class: "as-color-picker-button-inner",
      child: '.as-color-picker-button-inner-value'
    }]
  });
};

ColorPickerButton.property = {};
ColorPickerButton.property.value = {
  set: function (value) {
    this._value = value;

    if (this._value) {
      this.$innerValue.addStyle("background-color", value);
    } else {
      this.$innerValue.addStyle("background-color", 'transparent');
    }
  },
  get: function () {
    if (!this._value) return this._value;
    if (this.mode.match(/HEX4|HEX6|HEX8|RGB|RGBA/)) return this._value.toString(this.mode);
    return this._value;
  }
};
ColorPickerButton.property.mode = {
  set: function (value) {
    value = value || 'OBJECT';
    value = value.toUpperCase();
    if (this.supportedModes.indexOf(value) < 0) value = 'OBJECT';
    this._mode = value;
  },
  get: function () {
    return this._mode;
  }
};
ColorPickerButton.property.hasOpacity = {
  get: function () {
    return this.hasOpacityModes.indexOf(this._mode) >= 0;
  }
};

_CPCore.default.install('colorpickerbutton', ColorPickerButton);

var _default = ColorPickerButton;
exports.default = _default;
};

moduleFactories["node_modules/absol-colorpicker/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _CPCore = _interopRequireDefault(require("./components/CPCore"));

require("./style");

require("./components/ColorPickerButton");

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));


var ColorPicker = {
  core: _CPCore.default,
  _: _CPCore.default._,
  $: _CPCore.default.$,
  creator: _CPCore.default.creator,
  Color: _Color.default
};
var _default = ColorPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-colorpicker/components/SwatchesTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/components/SwatchesTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.iOsSwatches = exports.BootstrapSwatches = exports.MaterialSwatches = exports.MoqupsClassicSwathes = void 0;

var _CPCore = _interopRequireDefault(require("./CPCore"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));


var _ = _CPCore.default._;
var $ = _CPCore.default.$;

function SwatchesTable() {
  this._data = [];
  this._poolCells = [];
  this._poolRows = [];
  this._dict = {};
}

SwatchesTable.tag = 'SwatchesTable'.toLowerCase();

SwatchesTable.render = function () {
  return _({
    extendEvent: 'presscell',
    class: 'as-swatches-table'
  });
};

SwatchesTable.prototype.getCell = function () {
  if (arguments.length == 1) {
    var key = arguments[0];

    if (key.toHex8) {
      key = key.toHex8();
    } else if (typeof key == 'string') {
      key = _Color.default.parse(key);
      if (key) key = key.toHex8();
    }

    key = key + '';
    return this._dict[key];
  } else if (arguments.length == 2) {
    return this.childNodes[arguments[0]] && this.childNodes[arguments[0]].childNodes[arguments[1]];
  }
};

SwatchesTable.eventHandler = {};

SwatchesTable.eventHandler.clickCell = function (cell, event) {
  this.emit('presscell', {
    target: this,
    cellElt: cell,
    value: cell.__swatchescell_value,
    rowIdx: cell.__swatchescell_row_idx,
    colIdx: cell.__swatchescell_col_idx
  });
};

SwatchesTable.property = {};
SwatchesTable.property.data = {
  set: function (value) {
    this._dict = {};
    value = value || [[null]];

    if (typeof value == 'string') {
      value = {
        classic: MoqupsClassicSwathes,
        material: MaterialSwatches,
        bootstrap: BootstrapSwatches,
        ios: iOsSwatches,
        moqupsclassic: MoqupsClassicSwathes
      }[value] || [[null]];
    }

    this._data = value;
    var child;

    while (this.childNodes.length > value.length) {
      child = this.firstChild;

      this._poolRows.push(child);

      this.removeChild(child);
    }

    while (this.childNodes.length < value.length) {
      if (this._poolRows.length > 0) child = this._poolRows.pop();else child = _('.as-swatches-table-row');
      this.addChild(child);
    }

    var rowElt;
    var row;

    for (var i = 0; i < value.length; ++i) {
      rowElt = this.childNodes[i];
      row = value[i];

      while (rowElt.childNodes.length > row.length) {
        child = rowElt.firstChild;

        this._poolCells.push(child);

        rowElt.removeChild(child);
      }

      while (rowElt.childNodes.length < row.length) {
        if (this._poolCells.length > 0) child = this._poolCells.pop();else {
          child = _({
            class: 'as-swatches-table-cell',
            child: '.as-swatches-table-cell-color'
          });
          child.on('click', this.eventHandler.clickCell.bind(this, child));
        }
        rowElt.addChild(child);
      }

      for (var j = 0; j < row.length; ++j) {
        rowElt.childNodes[j].__swatchescell_row_idx = i;
        rowElt.childNodes[j].__swatchescell_col_idx = j;

        if (!row[j]) {
          rowElt.childNodes[j].attr('title', null);
          rowElt.childNodes[j].firstChild.removeStyle('background-color');
          rowElt.childNodes[j].__swatchescell_value = row[j];
          this._dict['null'] = rowElt.childNodes[j];
        } else if (row[j].toHex8) {
          rowElt.childNodes[j].firstChild.addStyle('background-color', row[j].toString());
          rowElt.childNodes[j].attr('title', null);
          rowElt.childNodes[j].__swatchescell_value = row[j];
          this._dict[row[j].toHex8()] = rowElt.childNodes[j];
        } else if (typeof row[j] == 'object') {
          if (row[j].value) {
            rowElt.childNodes[j].firstChild.addStyle('background-color', row[j].value);
            rowElt.childNodes[j].__swatchescell_value = row[j].value;
            this._dict[_Color.default.parse(row[j].value + '').toHex8()] = rowElt.childNodes[j];
          } else {
            rowElt.childNodes[j].firstChild.removeStyle('background-color');
            this._dict[_Color.default.parse('transparent').toHex8()] = rowElt.childNodes[j];
          }

          rowElt.childNodes[j].attr('title', row[j].name || null);
        } else if (typeof row[j] == 'string') {
          rowElt.childNodes[j].firstChild.addStyle('background-color', row[j]);
          rowElt.childNodes[j].attr('title', null);
          rowElt.childNodes[j].__swatchescell_value = row[j];
          this._dict[_Color.default.parse(row[j]).toHex8()] = rowElt.childNodes[j];
        }
      }
    }
  },
  get: function () {
    return this._data;
  }
};
var MoqupsClassicSwathes = [[{
  "name": "White",
  "value": "#ffffff"
}, {
  "name": "± Wild Sand",
  "value": "#f7f6f6"
}, {
  "name": "± Gallery",
  "value": "#ebebeb"
}, {
  "name": "± Alto",
  "value": "#d6d6d6"
}, {
  "name": "Silver",
  "value": "#c0c0c0"
}, {
  "name": "± Silver Chalice",
  "value": "#aaaaaa"
}, {
  "name": "± Gray",
  "value": "#929292"
}, {
  "name": "Boulder",
  "value": "#7a7a7a"
}, {
  "name": "± Scorpion",
  "value": "#606060"
}, {
  "name": "± Tundora",
  "value": "#444444"
}, {
  "name": "± Mine Shaft",
  "value": "#232323"
}, {
  "name": "Black",
  "value": "#000000"
}], [{
  "name": "± Prussian Blue",
  "value": "#003748"
}, {
  "name": "± Green Vogue",
  "value": "#021f54"
}, {
  "name": "± Black Rock",
  "value": "#120639"
}, {
  "name": "± Violet",
  "value": "#2f073b"
}, {
  "name": "± Bulgarian Rose",
  "value": "#3d051b"
}, {
  "name": "± Lonestar",
  "value": "#5e0202"
}, {
  "name": "± Brown Bramble",
  "value": "#5b1a04"
}, {
  "name": "± Cioccolato",
  "value": "#58330a"
}, {
  "name": "± Bronze Olive",
  "value": "#553d0d"
}, {
  "name": "± Himalaya",
  "value": "#656119"
}, {
  "name": "± West Coast",
  "value": "#4e5516"
}, {
  "name": "± Seaweed",
  "value": "#243e16"
}], [{
  "name": "± Astronaut Blue",
  "value": "#004e63"
}, {
  "name": "± Catalina Blue",
  "value": "#033076"
}, {
  "name": "± Violet",
  "value": "#1c0c4f"
}, {
  "name": "± Jagger",
  "value": "#460e56"
}, {
  "name": "± Maroon Oak",
  "value": "#570e28"
}, {
  "name": "± Dark Burgundy",
  "value": "#840705"
}, {
  "name": "± Kenyan Copper",
  "value": "#7d2709"
}, {
  "name": "± Raw Umber",
  "value": "#7b4812"
}, {
  "name": "± Raw Umber",
  "value": "#785616"
}, {
  "name": "± Wasabi",
  "value": "#8c8525"
}, {
  "name": "± Fern Frond",
  "value": "#6e7623"
}, {
  "name": "± Woodland",
  "value": "#355723"
}], [{
  "name": "± Blue Lagoon",
  "value": "#006e8c"
}, {
  "name": "± Cobalt",
  "value": "#0844a4"
}, {
  "name": "± Persian Indigo",
  "value": "#2e1572"
}, {
  "name": "± Honey Flower",
  "value": "#631878"
}, {
  "name": "± Claret",
  "value": "#7a163c"
}, {
  "name": "± Milano Red",
  "value": "#b70f0a"
}, {
  "name": "± Rust",
  "value": "#af3a11"
}, {
  "name": "± Desert",
  "value": "#aa671d"
}, {
  "name": "± Reef Gold",
  "value": "#a77a23"
}, {
  "name": "± Earls Green",
  "value": "#c3bb38"
}, {
  "name": "± Sushi",
  "value": "#99a534"
}, {
  "name": "± Fern Green",
  "value": "#4c7a34"
}], [{
  "name": "± Bondi Blue",
  "value": "#008db1"
}, {
  "name": "± Denim",
  "value": "#0c59cf"
}, {
  "name": "± Daisy Bush",
  "value": "#3b1d8f"
}, {
  "name": "± Seance",
  "value": "#7e2199"
}, {
  "name": "± Disco",
  "value": "#9c1f4d"
}, {
  "name": "± Crimson",
  "value": "#e61610"
}, {
  "name": "± Orange Roughy",
  "value": "#dc4c18"
}, {
  "name": "± Brandy Punch",
  "value": "#d68227"
}, {
  "name": "± Hokey Pokey",
  "value": "#d39c2f"
}, {
  "name": "± Starship",
  "value": "#f4eb49"
}, {
  "name": "± Turmeric",
  "value": "#c1d045"
}, {
  "name": "± Apple",
  "value": "#629c44"
}], [{
  "name": "± Cerulean",
  "value": "#00a4d3"
}, {
  "name": "± Blue Ribbon",
  "value": "#1464f6"
}, {
  "name": "± Daisy Bush",
  "value": "#5125ad"
}, {
  "name": "± Purple Heart",
  "value": "#9c29b7"
}, {
  "name": "± Maroon Flush",
  "value": "#bb285c"
}, {
  "name": "± Red Orange",
  "value": "#ff3823"
}, {
  "name": "± Orange",
  "value": "#ff6624"
}, {
  "name": "± Sunshade",
  "value": "#ffa834"
}, {
  "name": "± Bright Sun",
  "value": "#fec63d"
}, {
  "name": "± Laser Lemon",
  "value": "#fefb64"
}, {
  "name": "± Confetti",
  "value": "#d7eb5a"
}, {
  "name": "± Mantis",
  "value": "#72bb53"
}], [{
  "name": "± Bright Turquoise",
  "value": "#00c8f8"
}, {
  "name": "± Dodger Blue",
  "value": "#3d8af7"
}, {
  "name": "± Purple Heart",
  "value": "#6334e3"
}, {
  "name": "± Electric Violet",
  "value": "#c238eb"
}, {
  "name": "± Cerise Red",
  "value": "#e93578"
}, {
  "name": "± Persimmon",
  "value": "#ff5d55"
}, {
  "name": "± Coral",
  "value": "#ff8351"
}, {
  "name": "± Texas Rose",
  "value": "#ffb253"
}, {
  "name": "± Golden Tainoi",
  "value": "#ffc957"
}, {
  "name": "± Dolly",
  "value": "#fef67f"
}, {
  "name": "± Manz",
  "value": "#e2ee79"
}, {
  "name": "± Feijoa",
  "value": "#92d36e"
}], [{
  "name": "± Malibu",
  "value": "#4dd7fa"
}, {
  "name": "± Malibu",
  "value": "#75a9f9"
}, {
  "name": "± Cornflower Blue",
  "value": "#8b51f5"
}, {
  "name": "± Heliotrope",
  "value": "#d757f6"
}, {
  "name": "± Froly",
  "value": "#f06e9c"
}, {
  "name": "± Vivid Tangerine",
  "value": "#ff8a84"
}, {
  "name": "± Hit Pink",
  "value": "#ffa382"
}, {
  "name": "± Macaroni and Cheese",
  "value": "#ffc581"
}, {
  "name": "± Grandis",
  "value": "#ffd783"
}, {
  "name": "± Picasso",
  "value": "#fef8a0"
}, {
  "name": "± Khaki",
  "value": "#e9f29b"
}, {
  "name": "± Feijoa",
  "value": "#aedd94"
}], [{
  "name": "± Anakiwa",
  "value": "#91e4fb"
}, {
  "name": "± Sail",
  "value": "#a8c6fa"
}, {
  "name": "± Perfume",
  "value": "#b38df7"
}, {
  "name": "± Heliotrope",
  "value": "#e692f8"
}, {
  "name": "± Illusion",
  "value": "#f6a2bf"
}, {
  "name": "± Sundown",
  "value": "#ffb4b0"
}, {
  "name": "± Wax Flower",
  "value": "#ffc3ae"
}, {
  "name": "± Caramel",
  "value": "#ffd8ad"
}, {
  "name": "± Navajo White",
  "value": "#ffe3ae"
}, {
  "name": "± Pale Prim",
  "value": "#fefac0"
}, {
  "name": "± Corn Field",
  "value": "#f1f6be"
}, {
  "name": "± Tea Green",
  "value": "#cbe8ba"
}], [{
  "name": "± French Pass",
  "value": "#c9f1fd"
}, {
  "name": "± Hawkes Blue",
  "value": "#d4e3fc"
}, {
  "name": "± Perfume",
  "value": "#dacafb"
}, {
  "name": "± Perfume",
  "value": "#f2c9fb"
}, {
  "name": "± Chantilly",
  "value": "#fad2e0"
}, {
  "name": "± Cosmos",
  "value": "#ffdad8"
}, {
  "name": "± Peach Schnapps",
  "value": "#ffe2d8"
}, {
  "name": "± Derby",
  "value": "#ffecd7"
}, {
  "name": "± Pink Lady",
  "value": "#fff1d7"
}, {
  "name": "± Off Yellow",
  "value": "#fefce0"
}, {
  "name": "± Citrine White",
  "value": "#f7fade"
}, {
  "name": "± Zanah",
  "value": "#dfedd6"
}]];
exports.MoqupsClassicSwathes = MoqupsClassicSwathes;
var MaterialSwatches = [[{
  "name": "Red 50",
  "value": "#ffebee"
}, {
  "name": "Red 100",
  "value": "#ffcdd2"
}, {
  "name": "Red 200",
  "value": "#ef9a9a"
}, {
  "name": "Red 300",
  "value": "#e57373"
}, {
  "name": "Red 400",
  "value": "#ef5350"
}, {
  "name": "Red 500",
  "value": "#f44336"
}, {
  "name": "Red 600",
  "value": "#e53935"
}, {
  "name": "Red 700",
  "value": "#d32f2f"
}, {
  "name": "Red 800",
  "value": "#c62828"
}, {
  "name": "Red 900",
  "value": "#b71c1c"
}], [{
  "name": "Pink 50",
  "value": "#fce4ec"
}, {
  "name": "Pink 100",
  "value": "#f8bbd0"
}, {
  "name": "Pink 200",
  "value": "#f48fb1"
}, {
  "name": "Pink 300",
  "value": "#f06292"
}, {
  "name": "Pink 400",
  "value": "#ec407a"
}, {
  "name": "Pink 500",
  "value": "#e91e63"
}, {
  "name": "Pink 600",
  "value": "#d81b60"
}, {
  "name": "Pink 700",
  "value": "#c2185b"
}, {
  "name": "Pink 800",
  "value": "#ad1457"
}, {
  "name": "Pink 900",
  "value": "#880e4f"
}], [{
  "name": "Purple 50",
  "value": "#f3e5f5"
}, {
  "name": "Purple 100",
  "value": "#e1bee7"
}, {
  "name": "Purple 200",
  "value": "#ce93d8"
}, {
  "name": "Purple 300",
  "value": "#ba68c8"
}, {
  "name": "Purple 400",
  "value": "#ab47bc"
}, {
  "name": "Purple 500",
  "value": "#9c27b0"
}, {
  "name": "Purple 600",
  "value": "#8e24aa"
}, {
  "name": "Purple 700",
  "value": "#7b1fa2"
}, {
  "name": "Purple 800",
  "value": "#6a1b9a"
}, {
  "name": "Purple 900",
  "value": "#4a148c"
}], [{
  "name": "Deep Purple 50",
  "value": "#ede7f6"
}, {
  "name": "Deep Purple 100",
  "value": "#d1c4e9"
}, {
  "name": "Deep Purple 200",
  "value": "#b39ddb"
}, {
  "name": "Deep Purple 300",
  "value": "#9575cd"
}, {
  "name": "Deep Purple 400",
  "value": "#7e57c2"
}, {
  "name": "Deep Purple 500",
  "value": "#673ab7"
}, {
  "name": "Deep Purple 600",
  "value": "#5e35b1"
}, {
  "name": "Deep Purple 700",
  "value": "#512da8"
}, {
  "name": "Deep Purple 800",
  "value": "#4527a0"
}, {
  "name": "Deep Purple 900",
  "value": "#311b92"
}], [{
  "name": "Indigo 50",
  "value": "#e8eaf6"
}, {
  "name": "Indigo 100",
  "value": "#c5cae9"
}, {
  "name": "Indigo 200",
  "value": "#9fa8da"
}, {
  "name": "Indigo 300",
  "value": "#7986cb"
}, {
  "name": "Indigo 400",
  "value": "#5c6bc0"
}, {
  "name": "Indigo 500",
  "value": "#3f51b5"
}, {
  "name": "Indigo 600",
  "value": "#3949ab"
}, {
  "name": "Indigo 700",
  "value": "#303f9f"
}, {
  "name": "Indigo 800",
  "value": "#283593"
}, {
  "name": "Indigo 900",
  "value": "#1a237e"
}], [{
  "name": "Blue 50",
  "value": "#e3f2fd"
}, {
  "name": "Blue 100",
  "value": "#bbdefb"
}, {
  "name": "Blue 200",
  "value": "#90caf9"
}, {
  "name": "Blue 300",
  "value": "#64b5f6"
}, {
  "name": "Blue 400",
  "value": "#42a5f5"
}, {
  "name": "Blue 500",
  "value": "#2196f3"
}, {
  "name": "Blue 600",
  "value": "#1e88e5"
}, {
  "name": "Blue 700",
  "value": "#1976d2"
}, {
  "name": "Blue 800",
  "value": "#1565c0"
}, {
  "name": "Blue 900",
  "value": "#0d47a1"
}], [{
  "name": "Light Blue 50",
  "value": "#e1f5fe"
}, {
  "name": "Light Blue 100",
  "value": "#b3e5fc"
}, {
  "name": "Light Blue 200",
  "value": "#81d4fa"
}, {
  "name": "Light Blue 300",
  "value": "#4fc3f7"
}, {
  "name": "Light Blue 400",
  "value": "#29b6f6"
}, {
  "name": "Light Blue 500",
  "value": "#03a9f4"
}, {
  "name": "Light Blue 600",
  "value": "#039be5"
}, {
  "name": "Light Blue 700",
  "value": "#0288d1"
}, {
  "name": "Light Blue 800",
  "value": "#0277bd"
}, {
  "name": "Light Blue 900",
  "value": "#01579b"
}], [{
  "name": "Cyan 50",
  "value": "#e0f7fa"
}, {
  "name": "Cyan 100",
  "value": "#b2ebf2"
}, {
  "name": "Cyan 200",
  "value": "#80deea"
}, {
  "name": "Cyan 300",
  "value": "#4dd0e1"
}, {
  "name": "Cyan 400",
  "value": "#26c6da"
}, {
  "name": "Cyan 500",
  "value": "#00bcd4"
}, {
  "name": "Cyan 600",
  "value": "#00acc1"
}, {
  "name": "Cyan 700",
  "value": "#0097a7"
}, {
  "name": "Cyan 800",
  "value": "#00838f"
}, {
  "name": "Cyan 900",
  "value": "#006064"
}], [{
  "name": "Teal 50",
  "value": "#e0f2f1"
}, {
  "name": "Teal 100",
  "value": "#b2dfdb"
}, {
  "name": "Teal 200",
  "value": "#80cbc4"
}, {
  "name": "Teal 300",
  "value": "#4db6ac"
}, {
  "name": "Teal 400",
  "value": "#26a69a"
}, {
  "name": "Teal 500",
  "value": "#009688"
}, {
  "name": "Teal 600",
  "value": "#00897b"
}, {
  "name": "Teal 700",
  "value": "#00796b"
}, {
  "name": "Teal 800",
  "value": "#00695c"
}, {
  "name": "Teal 900",
  "value": "#004d40"
}], [{
  "name": "Green 50",
  "value": "#e8f5e9"
}, {
  "name": "Green 100",
  "value": "#c8e6c9"
}, {
  "name": "Green 200",
  "value": "#a5d6a7"
}, {
  "name": "Green 300",
  "value": "#81c784"
}, {
  "name": "Green 400",
  "value": "#66bb6a"
}, {
  "name": "Green 500",
  "value": "#4caf50"
}, {
  "name": "Green 600",
  "value": "#43a047"
}, {
  "name": "Green 700",
  "value": "#388e3c"
}, {
  "name": "Green 800",
  "value": "#2e7d32"
}, {
  "name": "Green 900",
  "value": "#1b5e20"
}], [{
  "name": "Light Green 50",
  "value": "#f1f8e9"
}, {
  "name": "Light Green 100",
  "value": "#dcedc8"
}, {
  "name": "Light Green 200",
  "value": "#c5e1a5"
}, {
  "name": "Light Green 300",
  "value": "#aed581"
}, {
  "name": "Light Green 400",
  "value": "#9ccc65"
}, {
  "name": "Light Green 500",
  "value": "#8bc34a"
}, {
  "name": "Light Green 600",
  "value": "#7cb342"
}, {
  "name": "Light Green 700",
  "value": "#689f38"
}, {
  "name": "Light Green 800",
  "value": "#558b2f"
}, {
  "name": "Light Green 900",
  "value": "#33691e"
}], [{
  "name": "Lime 50",
  "value": "#f9fbe7"
}, {
  "name": "Lime 100",
  "value": "#f0f4c3"
}, {
  "name": "Lime 200",
  "value": "#e6ee9c"
}, {
  "name": "Lime 300",
  "value": "#dce775"
}, {
  "name": "Lime 400",
  "value": "#d4e157"
}, {
  "name": "Lime 500",
  "value": "#cddc39"
}, {
  "name": "Lime 600",
  "value": "#c0ca33"
}, {
  "name": "Lime 700",
  "value": "#afb42b"
}, {
  "name": "Lime 800",
  "value": "#9e9d24"
}, {
  "name": "Lime 900",
  "value": "#827717"
}], [{
  "name": "Yellow 50",
  "value": "#fffde7"
}, {
  "name": "Yellow 100",
  "value": "#fff9c4"
}, {
  "name": "Yellow 200",
  "value": "#fff59d"
}, {
  "name": "Yellow 300",
  "value": "#fff176"
}, {
  "name": "Yellow 400",
  "value": "#ffee58"
}, {
  "name": "Yellow 500",
  "value": "#ffeb3b"
}, {
  "name": "Yellow 600",
  "value": "#fdd835"
}, {
  "name": "Yellow 700",
  "value": "#fbc02d"
}, {
  "name": "Yellow 800",
  "value": "#f9a825"
}, {
  "name": "Yellow 900",
  "value": "#f57f17"
}], [{
  "name": "Amber 50",
  "value": "#fff8e1"
}, {
  "name": "Amber 100",
  "value": "#ffecb3"
}, {
  "name": "Amber 200",
  "value": "#ffe082"
}, {
  "name": "Amber 300",
  "value": "#ffd54f"
}, {
  "name": "Amber 400",
  "value": "#ffca28"
}, {
  "name": "Amber 500",
  "value": "#ffc107"
}, {
  "name": "Amber 600",
  "value": "#ffb300"
}, {
  "name": "Amber 700",
  "value": "#ffa000"
}, {
  "name": "Amber 800",
  "value": "#ff8f00"
}, {
  "name": "Amber 900",
  "value": "#ff6f00"
}], [{
  "name": "Orange 50",
  "value": "#fff3e0"
}, {
  "name": "Orange 100",
  "value": "#ffe0b2"
}, {
  "name": "Orange 200",
  "value": "#ffcc80"
}, {
  "name": "Orange 300",
  "value": "#ffb74d"
}, {
  "name": "Orange 400",
  "value": "#ffa726"
}, {
  "name": "Orange 500",
  "value": "#ff9800"
}, {
  "name": "Orange 600",
  "value": "#fb8c00"
}, {
  "name": "Orange 700",
  "value": "#f57c00"
}, {
  "name": "Orange 800",
  "value": "#ef6c00"
}, {
  "name": "Orange 900",
  "value": "#e65100"
}], [{
  "name": "Deep Orange 50",
  "value": "#fbe9e7"
}, {
  "name": "Deep Orange 100",
  "value": "#ffccbc"
}, {
  "name": "Deep Orange 200",
  "value": "#ffab91"
}, {
  "name": "Deep Orange 300",
  "value": "#ff8a65"
}, {
  "name": "Deep Orange 400",
  "value": "#ff7043"
}, {
  "name": "Deep Orange 500",
  "value": "#ff5722"
}, {
  "name": "Deep Orange 600",
  "value": "#f4511e"
}, {
  "name": "Deep Orange 700",
  "value": "#e64a19"
}, {
  "name": "Deep Orange 800",
  "value": "#d84315"
}, {
  "name": "Deep Orange 900",
  "value": "#bf360c"
}], [{
  "name": "Brown 50",
  "value": "#efebe9"
}, {
  "name": "Brown 100",
  "value": "#d7ccc8"
}, {
  "name": "Brown 200",
  "value": "#bcaaa4"
}, {
  "name": "Brown 300",
  "value": "#a1887f"
}, {
  "name": "Brown 400",
  "value": "#8d6e63"
}, {
  "name": "Brown 500",
  "value": "#795548"
}, {
  "name": "Brown 600",
  "value": "#6d4c41"
}, {
  "name": "Brown 700",
  "value": "#5d4037"
}, {
  "name": "Brown 800",
  "value": "#4e342e"
}, {
  "name": "Brown 900",
  "value": "#3e2723"
}], [{
  "name": "Grey 50",
  "value": "#fafafa"
}, {
  "name": "Grey 100",
  "value": "#f5f5f5"
}, {
  "name": "Grey 200",
  "value": "#eeeeee"
}, {
  "name": "Grey 300",
  "value": "#e0e0e0"
}, {
  "name": "Grey 400",
  "value": "#bdbdbd"
}, {
  "name": "Grey 500",
  "value": "#9e9e9e"
}, {
  "name": "Grey 600",
  "value": "#757575"
}, {
  "name": "Grey 700",
  "value": "#616161"
}, {
  "name": "Grey 800",
  "value": "#424242"
}, {
  "name": "Grey 900",
  "value": "#212121"
}], [{
  "name": "Blue Grey 50",
  "value": "#eceff1"
}, {
  "name": "Blue Grey 100",
  "value": "#cfd8dc"
}, {
  "name": "Blue Grey 200",
  "value": "#b0bec5"
}, {
  "name": "Blue Grey 300",
  "value": "#90a4ae"
}, {
  "name": "Blue Grey 400",
  "value": "#78909c"
}, {
  "name": "Blue Grey 500",
  "value": "#607d8b"
}, {
  "name": "Blue Grey 600",
  "value": "#546e7a"
}, {
  "name": "Blue Grey 700",
  "value": "#455a64"
}, {
  "name": "Blue Grey 800",
  "value": "#37474f"
}, {
  "name": "Blue Grey 900",
  "value": "#263238"
}], [{
  "name": "Black",
  "value": "#000000"
}, {
  "name": "White",
  "value": "#ffffff"
}]];
exports.MaterialSwatches = MaterialSwatches;
var BootstrapSwatches = [[{
  "name": "Gray Light",
  "value": "#777777"
}, {
  "name": "Base",
  "value": "#000000"
}, {
  "name": "Highlight Blue",
  "value": "#0055cc"
}, {
  "name": "Dark Blue",
  "value": "#005580"
}, {
  "name": "Success Text Green",
  "value": "#468847"
}, {
  "name": "Orange",
  "value": "#f89406"
}, {
  "name": "Red",
  "value": "#9d261d"
}, {
  "name": "Purple",
  "value": "#7a43b6"
}], [{
  "name": "Border Gray",
  "value": "#cccccc"
}, {
  "name": "Gray Darker",
  "value": "#222222"
}, {
  "name": "Primary Blue",
  "value": "#337ab7"
}, {
  "name": "Info Blue",
  "value": "#2f96b4"
}, {
  "name": "Green",
  "value": "#46a546"
}, {
  "name": "Light Orange",
  "value": "#fbb450"
}, {
  "name": "Danger Button Red",
  "value": "#bd362f"
}, {
  "name": "Pink",
  "value": "#c3325f"
}], [{
  "name": "Gray Lighter",
  "value": "#eeeeee"
}, {
  "name": "Gray Dark",
  "value": "#333333"
}, {
  "name": "Link Blue",
  "value": "#0088cc"
}, {
  "name": "Info Light Blue",
  "value": "#5bc0de"
}, {
  "name": "Success Button Green",
  "value": "#62c462"
}, {
  "name": "Yellow",
  "value": "#ffc40d"
}, {
  "name": "Error Text Red",
  "value": "#b94a48"
}, {
  "name": "Danger Highlight Red",
  "value": "#ee5f5b"
}], [{
  "name": "White",
  "value": "#ffffff"
}, {
  "name": "Gray",
  "value": "#555555"
}, {
  "name": "Accent Blue",
  "value": "#049cdb"
}, {
  "name": "Info Lighter Blue",
  "value": "#d9edf7"
}, {
  "name": "Success Background Green",
  "value": "#dff0d8"
}, {
  "name": "Warning Background Brown",
  "value": "#f3edd2"
}, {
  "name": "Warning Text Brown",
  "value": "#c09853"
}, {
  "name": "Danger Background Red",
  "value": "#f2dede"
}]];
exports.BootstrapSwatches = BootstrapSwatches;
var iOsSwatches = [[{
  "name": "Red",
  "value": "#ff3b30"
}, {
  "name": "Orange",
  "value": "#ff9500"
}, {
  "name": "Yellow",
  "value": "#ffcc00"
}, {
  "name": "Green",
  "value": "#4cd964"
}, {
  "name": "Teal Blue",
  "value": "#5ac8fa"
}, {
  "name": "Blue",
  "value": "#007aff"
}, {
  "name": "Purple",
  "value": "#5856d6"
}, {
  "name": "Pink",
  "value": "#ff2d55"
}], [{
  "name": "White",
  "value": "#ffffff"
}, {
  "name": "Custom Gray",
  "value": "#efeff4"
}, {
  "name": "Light Gray",
  "value": "#e5e5ea"
}, {
  "name": "Light Gray 2",
  "value": "#d1d1d6"
}, {
  "name": "Mid Gray",
  "value": "#c7c7cc"
}, {
  "name": "Gray",
  "value": "#8e8e93"
}, {
  "name": "Black",
  "value": "#000000"
}]];
exports.iOsSwatches = iOsSwatches;

_CPCore.default.install('swatchestable', SwatchesTable);

var _default = SwatchesTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-colorpicker/components/SpectrumColor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/components/SpectrumColor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _CPCore = _interopRequireDefault(require("./CPCore"));


var _ = _CPCore.default._;
var $ = _CPCore.default.$;

function SpectrumColor() {}

SpectrumColor.tag = 'SpectrumColor'.toLowerCase();

SpectrumColor.render = function () {
  return _({
    class: 'as-spectrum-color',
    child: {
      class: 'as-spectrum-color-sat',
      child: '.as-spectrum-color-val'
    }
  });
};

_CPCore.default.install('spectrumcolor', SpectrumColor);

var _default = SpectrumColor;
exports.default = _default;
};

moduleFactories["node_modules/absol-colorpicker/components/SolidColorPicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/components/SolidColorPicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _CPCore = _interopRequireDefault(require("./CPCore"));

var _SwatchesTable = require("./SwatchesTable");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));


var _ = _CPCore.default._;
var $ = _CPCore.default.$;

function SolidColorPicker() {
  this.on('keydown', this.eventHandler.keydown);
  this.$swatchesName = $('.as-solid-color-picker-swatches-name', this);
  var thisSP = this;
  this._lastEmitHex8 = '';
  this._rgb = 'ff0000';
  this._opatictyPercent = 100;
  this._value = new _Color.default([1, 0, 0, 1]);
  this._hue = 0;
  this._sat = 1;
  this._brightness = 1;
  this._swatchesNames = ['Material Design', 'Moqups Classic', 'Bootstrap', 'iOS'];
  this._swatchesShortName = ['material', 'moqups', 'bootstrap', 'ios'];
  this._swatchesIcons = ['span.mdi.mdi-palette', 'span.mdi.mdi-material-design', 'span.mdi.mdi-bootstrap', 'span.mdi.mdi-apple-ios'];
  this._swatchesData = [_SwatchesTable.MaterialSwatches, _SwatchesTable.MoqupsClassicSwathes, _SwatchesTable.BootstrapSwatches, _SwatchesTable.iOsSwatches];
  this._mode = 'swatches';
  this.$mode = $('.as-solid-color-picker-mode', this).on('change', this.eventHandler.modeChange);
  /**
   * @type {import('absol-acomp/js/BScroller').default}
   */

  this.$swatchesTableCtn = $('.as-solid-color-picker-swatches-ctn', this);
  /**
   * @type {import('./SwatchesTable').default}
   */

  this.$swatchesTable = $('.as-solid-color-picker-swatches-ctn swatchestable', this).on('presscell', this.eventHandler.swatchesPressCell);
  this.$recentSwatchesTable = $('.as-solid-color-picker-recent-swatches-ctn swatchestable', this).on('presscell', this.eventHandler.swatchesPressCell);
  this.$selectedDot = _('.as-solid-color-picker-selected-dot');

  _QuickMenu.default.toggleWhenClick(this.$swatchesName, {
    anchor: [1, 6],
    getMenuProps: function () {
      return {
        extendClasses: 'as-solid-color-picker-swatches-name-menu',
        extendStyle: {
          'font-size': thisSP.getComputedStyleValue('font-size')
        },
        items: thisSP._swatchesNames.map(function (name, i) {
          return {
            text: name,
            value: thisSP._swatchesShortName[i],
            icon: thisSP._swatchesIcons[i]
          };
        })
      };
    },
    onSelect: function (item) {
      thisSP.swatches = item.value;
    }
  });

  this.$attachhook = _('attachhook').on('error', this.eventHandler.attached);
  this.$hex = $('.as-solid-color-picker-color-hex', this).on('keyup', this.eventHandler.hexKeyup).on('change', this.eventHandler.hexChange);
  this.$opacity = $('.as-solid-color-picker-color-opacity', this).on('change', this.eventHandler.opacityChange).on('keyup', this.eventHandler.opacityKeyUp);
  this.$selected = $('.as-solid-color-picker-selected', this);
  this.$spectrum = _({
    tag: 'hanger',
    elt: $('.as-solid-color-picker-spectrum', this)
  }).on('predrag', this.eventHandler.spectrumDrag).on('drag', this.eventHandler.spectrumDrag);
  this.$spectrumDot = $('.as-solid-color-picker-spectrum-dot', this);
  this.$alpha = _({
    tag: 'hanger',
    elt: $('.as-solid-color-picker-alpha', this)
  }).on('predrag', this.eventHandler.alphaDrag).on('drag', this.eventHandler.alphaDrag);
  this.$alphaDot = $('.as-solid-color-picker-alpha-dot', this);
  this.$hue = _({
    tag: 'hanger',
    elt: $('.as-solid-color-picker-hue', this)
  }).on('predrag', this.eventHandler.hueDrag).on('drag', this.eventHandler.hueDrag);
  this.$hueDot = $('.as-solid-color-picker-hue-dot', this);
  this.$near = $('.as-solid-color-picker-near', this).on('presscell', this.eventHandler.nearPressCell);
  this.$submitBtn = $('.as-solid-color-picker-submit-btn', this).on('click', this.notifySubmit.bind(this));

  this._updateNear();
}

SolidColorPicker.tag = 'SolidColorPicker'.toLowerCase();

SolidColorPicker.render = function () {
  return _({
    attr: {
      tabindex: '1'
    },
    extendEvent: ['change', 'sizechange', 'submit'],
    class: ['as-solid-color-picker', 'as-solid-color-picker-mode-swatches', 'as-has-opacity'],
    child: [{
      class: 'as-solid-color-picker-header',
      child: [{
        class: 'as-solid-color-picker-mode-ctn',
        child: {
          tag: 'buttonarray',
          class: 'as-solid-color-picker-mode',
          props: {
            items: [{
              text: 'SWATCHES',
              value: 'swatches'
            }, {
              text: 'PICKER',
              value: 'picker'
            }]
          }
        }
      }]
    }, {
      class: 'as-solid-color-picker-body',
      child: [{
        class: ['as-solid-color-picker-swatches-select-ctn'],
        child: [{
          tag: 'span',
          child: {
            text: 'Color Scheme: '
          }
        }, {
          class: 'as-solid-color-picker-swatches-name',
          tag: 'a',
          child: {
            text: 'Material Design'
          }
        }, 'span.mdi.mdi-menu-down']
      }, {
        tag: 'bscroller',
        class: ['as-solid-color-picker-swatches-ctn'],
        child: {
          tag: 'swatchestable',
          props: {
            data: _SwatchesTable.MaterialSwatches
          }
        }
      }, {
        tag: 'spectrumcolor',
        class: 'as-solid-color-picker-spectrum',
        child: '.as-solid-color-picker-spectrum-dot'
      }, {
        class: 'as-solid-color-picker-hue',
        child: '.as-solid-color-picker-hue-dot'
      }, {
        class: 'as-solid-color-picker-alpha',
        child: ['.as-solid-color-picker-alpha-color', '.as-solid-color-picker-alpha-dot']
      }, {
        tag: 'swatchestable',
        class: 'as-solid-color-picker-near'
      }, {
        class: 'as-solid-color-picker-recent-title',
        child: {
          text: 'RECENT COLOR'
        }
      }, {
        class: ['as-solid-color-picker-recent-swatches-ctn'],
        child: {
          tag: 'swatchestable',
          props: {
            data: _SwatchesTable.MoqupsClassicSwathes.slice(0, 2)
          }
        }
      }]
    }, {
      class: 'as-solid-color-picker-footer',
      child: [{
        class: 'as-solid-color-picker-selected-ctn',
        child: {
          class: 'as-solid-color-picker-selected',
          style: {
            'background-color': '#ffffffff'
          }
        }
      }, {
        tag: 'flexiconinput',
        class: 'as-solid-color-picker-color-hex',
        props: {
          value: 'ffffff',
          icon: '<svg viewBox="0 0 64 64" id="mq-icon-hex"><path d="M60 24v-6H46V4h-6v14H24V4h-6v14H4v6h14v16H4v6h14v14h6V46h16v14h6V46h14v-6H46V24h14zM40 40H24V24h16v16z"></path></svg>'
        }
      }, {
        tag: 'flexiconinput',
        class: 'as-solid-color-picker-color-opacity',
        props: {
          icon: 'span.mdi.mdi-opacity',
          unit: '%',
          value: 100
        }
      }, {
        tag: 'flexiconbutton',
        class: 'as-solid-color-picker-submit-btn',
        props: {
          icon: 'span.mdi.mdi-check-bold'
        }
      }]
    }]
  });
};

SolidColorPicker._settingKey = "absol_solid_color_setting"; //only Hex6

SolidColorPicker.setting = {
  recentColors: ['#ffffff', '#00ffff', '#0000ff', '#ffffff', '#000000']
};

SolidColorPicker._loadSetting = function () {
  var setting = localStorage.getItem(SolidColorPicker._settingKey);

  try {
    setting = JSON.parse(setting);
  } catch (e) {
    setting = {};
  }

  if (setting) {
    Object.assign(SolidColorPicker.setting, setting);
  }
};

SolidColorPicker._loadSetting();

SolidColorPicker._writeSetting = function () {
  localStorage.setItem(SolidColorPicker._settingKey, JSON.stringify(SolidColorPicker.setting));
  SolidColorPicker.updateInstancesSetting();
};

SolidColorPicker.pushInstances = function (elt) {
  var instances = SolidColorPicker.$instances;
  var aliveInstance = [];
  var instance;
  var found = false;

  while (instances.length > 0) {
    instance = instances.pop();

    if (instance.isDescendantOf(document.body)) {
      aliveInstance.push(instance);
    }

    ;
    if (instance == elt) found = true;
  }

  while (aliveInstance.length > 0) {
    instances.push(aliveInstance.pop());
  }

  if (!found) {
    instances.push(elt);
  }
};

SolidColorPicker.updateInstancesSetting = function () {
  var instances = SolidColorPicker.$instances;
  var aliveInstance = [];
  var instance;

  while (instances.length > 0) {
    instance = instances.pop();

    if (instance.isDescendantOf(document.body)) {
      aliveInstance.push(instance);
    }

    ;
  }

  while (aliveInstance.length > 0) {
    instance = aliveInstance.pop();
    instances.push(instance);
    instance.reloadSetting();
  }
};

SolidColorPicker.$instances = [];
/**
 * @param {Color} color
 */

SolidColorPicker.pushColorHistory = function (color) {
  var hex6Color = color.toString('hex6');
  var recentColors = SolidColorPicker.setting.recentColors;
  var index = recentColors.indexOf(hex6Color);

  if (index >= 0) {
    recentColors.splice(index, 1);
  }

  recentColors.unshift(hex6Color);

  while (recentColors.length > 24) recentColors.pop();

  setTimeout(SolidColorPicker._writeSetting.bind(SolidColorPicker), 1);
};

SolidColorPicker.prototype.reloadSetting = function () {
  var recentColors = SolidColorPicker.setting.recentColors.slice();
  var swatches = [];

  while (recentColors.length > 0) {
    swatches.push(recentColors.splice(0, 12));
  }

  this.$recentSwatchesTable.data = swatches;

  this._autoAdDotToCell();
};

SolidColorPicker.prototype._addDotToCell = function (cell, cellColor) {
  var shadowColor = cellColor.getContrastYIQ();
  shadowColor.rgba[3] = 0.7;
  this.$selectedDot.addStyle('box-shadow', 'inset 0px 0px 0.3em 0.125em ' + shadowColor.toString());
  cell.addChild(this.$selectedDot);
};

SolidColorPicker.prototype._autoAdDotToCell = function () {
  this.$selectedDot.remove();
  var cell;

  if (this._mode == 'swatches') {
    cell = this.$swatchesTable.getCell('#' + this._rgb);
  }

  if (cell) {
    this._addDotToCell(cell, this._value);

    this.$swatchesTableCtn.scrollInto(cell);
  } else {
    cell = this.$recentSwatchesTable.getCell('#' + this._rgb);

    if (cell) {
      this._addDotToCell(cell, this._value);

      this.$swatchesTableCtn.scrollInto(cell);
    }
  }
};
/**
 * Need to call first
 * @param {Color} color
 */


SolidColorPicker.prototype._setValue = function (color) {
  this._value = color;
  this.$selected.addStyle('background-color', color.toString());

  this._updateNear();
};

SolidColorPicker.prototype._setRGB = function (rgb) {
  this._rgb = rgb;
  this.$hex.value = this._rgb;
  this.$selectedDot.remove();

  this._autoAdDotToCell();
};

SolidColorPicker.prototype._setOpacityPercent = function (opacity) {
  this._opatictyPercent = opacity;
  this.$opacity.value = opacity;

  this._updateOpacityPercent();
};

SolidColorPicker.prototype._updateOpacityPercent = function () {
  this.$alphaDot.addStyle('left', 'calc(' + this._opatictyPercent + '% - 0.5em)');
};

SolidColorPicker.prototype._setHue = function (hue) {
  this._hue = hue;

  var spectrumColor = _Color.default.fromHSB(hue / 360, 1, 1);

  var hueDotColor = spectrumColor.getContrastYIQ();
  hueDotColor.rgba[3] = 0.7;
  this.$hueDot.addStyle({
    'box-shadow': 'inset 0px 0px 0.3em 0.125em ' + hueDotColor.toString(),
    left: 'calc(' + hue / 3.6 + '% - 0.5em)'
  });
  this.$spectrum.addStyle('background-color', spectrumColor.toString());

  this._updateSpectrumDot();
};

SolidColorPicker.prototype._setSatBrightness = function (sat, brightness) {
  this._sat = sat;
  this._brightness = brightness;

  this._updateSpectrumDot();
};

SolidColorPicker.prototype._updateSpectrumDot = function () {
  var dotColor = this._value.getContrastYIQ();

  dotColor.rgba[3] = 0.7;
  this.$spectrumDot.addStyle({
    bottom: 'calc(' + this._brightness + '% - 0.5em)',
    left: 'calc(' + this._sat + '% - 0.5em)',
    'box-shadow': 'inset 0px 0px 0.3em 0.125em ' + dotColor.toString()
  });
};

SolidColorPicker.prototype._updateNear = function () {
  var hsba = _Color.default.rgbaToHSBA(this._value.rgba);

  var sat = hsba[1];
  var hue = hsba[0];
  var brightness = hsba[2];
  var whiterColors = Array(7).fill(null).map(function (u, i) {
    return _Color.default.fromHSB(hue, sat * (7 - i) / 8, brightness);
  });
  var darkerColors = Array(7).fill(null).map(function (u, i) {
    return _Color.default.fromHSB(hue, sat, brightness * (7 - i) / 8);
  });
  var hueNearColors = [-5, -3, -2, 1, 2, 3, 5].map(function (u) {
    var nHue = hue + u / 40;
    if (nHue > 1) nHue -= 1;else if (nHue < 0) nHue += 1;
    return _Color.default.fromHSB(nHue, sat, brightness);
  });
  this.$near.data = [whiterColors, darkerColors, hueNearColors];
};

SolidColorPicker.prototype.notifyCanBeChanged = function () {
  var cHex8 = this._value.toHex8();

  if (cHex8 != this._lastEmitHex8) {
    this._lastEmitHex8 = cHex8;
    this.notifyChange();
  }
};

SolidColorPicker.prototype.notifyChange = function () {
  this.emit('change', {
    target: this,
    value: this.value,
    type: 'change'
  }, this);
};

SolidColorPicker.prototype.notifySizeCanBeChanged = function () {
  var bound = this.getBoundingClientRect();

  if (!this._lastSize || this._lastSize.width != bound.width || this._lastSize.height != bound.height) {
    this._lastSize = {
      width: bound.width,
      height: bound.height
    };
    this.notifySizeChange();
  }
};

SolidColorPicker.prototype.notifySizeChange = function () {
  this.emit('sizechange', {
    target: this,
    size: this._lastSize,
    type: 'sizechange'
  }, this);
};

SolidColorPicker.prototype.notifySubmit = function () {
  SolidColorPicker.pushColorHistory(this._value);
  this.emit('submit', {
    target: this,
    value: this._value,
    type: 'submit'
  }, this);
};

SolidColorPicker.property = {};
/**
 * @type {SolidColorPicker}
 */

SolidColorPicker.property.value = {
  /**
   *
   * @param {Color} value
   */
  set: function (value) {
    value = value || 'transparent';

    if (!value.toHex8) {
      try {
        value = _Color.default.parse(value + '');
      } catch (e) {
        value = new _Color.default([0, 0, 0, 0]);
      }
    }

    this._lastEmitHex8 = value.toHex8();

    this._setValue(value);

    this._setRGB(value.toHex6());

    this._setOpacityPercent(Math.round(value.rgba[3] * 100));

    var hsba = _Color.default.rgbaToHSBA(value.rgba);

    this._setHue(hsba[0] * 360);

    this._setSatBrightness(hsba[1] * 100, hsba[2] * 100);

    this._updateNear();
  },
  get: function () {
    return this._value;
  }
};
/**
 * @type {SolidColorPicker}
 */

SolidColorPicker.property.swatches = {
  set: function (value) {
    var index = this._swatchesShortName.indexOf(value);

    index = Math.max(index, 0);
    value = this._swatchesShortName[index];

    if (this._swatches != value) {
      this._swatches = value;
      this.$swatchesTable.data = this._swatchesData[index];
      this.$swatchesName.childNodes[0].data = this._swatchesNames[index];
    }

    this._autoAdDotToCell();
  },
  get: function () {
    return this._swatches;
  }
};
SolidColorPicker.property.mode = {
  set: function (value) {
    if (value === this._mode) return;
    this.removeClass('as-solid-color-picker-mode-' + this._mode);
    this._mode = value + '';
    this.addClass('as-solid-color-picker-mode-' + this._mode);
    this.$mode.value = this._mode;
    this.notifySizeCanBeChanged();
  },
  get: function () {
    return this._mode;
  }
};
SolidColorPicker.property.hasOpacity = {
  set: function (value) {
    if (value) {
      this.addClass('as-has-opacity');
    } else {
      this.removeClass('as-has-opacity');
    }
  },
  get: function () {
    return this.hasClass('as-has-opacity');
  }
};
/**
 * @type {SolidColorPicker}
 */

SolidColorPicker.eventHandler = {};

SolidColorPicker.eventHandler.attached = function () {
  SolidColorPicker.pushInstances(this);
  this.reloadSetting();
};

SolidColorPicker.eventHandler.modeChange = function () {
  var value = this.$mode.value;
  if (value == this._mode) return;
  this.removeClass('as-solid-color-picker-mode-' + this._mode);
  this._mode = value + '';
  this.addClass('as-solid-color-picker-mode-' + this._mode);
  this.$mode.value = this._mode;
  this.notifySizeCanBeChanged();
};

SolidColorPicker.eventHandler.swatchesPressCell = function (event) {
  try {
    var value = _Color.default.parse(event.value + '');

    value.rgba[3] = this._opatictyPercent / 100;

    this._setValue(value);

    this._addDotToCell(event.cellElt, value);

    this._rgb = value.toHex6();
    this.$hex.value = this._rgb;

    var hsba = _Color.default.rgbaToHSBA(value.rgba);

    this._setHue(hsba[0] * 360);

    this._setSatBrightness(hsba[1] * 100, hsba[2] * 100);
  } catch (e) {
    this.$selectedDot.removeStyle('box-shadow');
    this.$hex.value = 'ffffff';
  }

  this.notifyCanBeChanged();
};

SolidColorPicker.eventHandler.nearPressCell = function (event) {
  try {
    var value = _Color.default.parse(event.value + '');

    value.rgba[3] = this._opatictyPercent / 100;

    this._setValue(value);

    this._setRGB(value.toHex6());

    var hsba = _Color.default.rgbaToHSBA(value.rgba);

    this._setHue(hsba[0] * 360);

    this._setSatBrightness(hsba[1] * 100, hsba[2] * 100);
  } catch (e) {
    this.$selectedDot.removeStyle('box-shadow');
    this.$hex.value = 'ffffff';
  }

  this.notifyCanBeChanged();
};

SolidColorPicker.eventHandler.hexKeyup = function () {
  try {
    var value = _Color.default.parse('#' + this.$hex.value.trim());

    if (value.rgba[3] == 1) {
      value.rgba[3] = this._opatictyPercent / 100;

      this._setValue(value);

      this._rgb = value.toHex6();

      this._autoAdDotToCell();

      var hsba = _Color.default.rgbaToHSBA(value.rgba);

      this._setHue(hsba[0] * 360);

      this._setSatBrightness(hsba[1] * 100, hsba[2] * 100);

      this.notifyCanBeChanged();
    }
  } catch (e) {}
};

SolidColorPicker.eventHandler.hexChange = function () {
  if (this.$hex.value != this._rgb) this.$hex.value = this._rgb;
};

SolidColorPicker.eventHandler.opacityKeyUp = function () {
  var opacity = parseFloat(this.$opacity.value);

  if (!isNaN(opacity)) {
    opacity = Math.round(Math.max(0, Math.min(opacity, 100)));
    this._opatictyPercent = opacity;

    var color = _Color.default.parse('#' + this._rgb);

    color.rgba[3] = opacity / 100;

    this._setValue(color);

    this._updateOpacityPercent();

    this.notifyCanBeChanged();
  }
};

SolidColorPicker.eventHandler.opacityChange = function () {
  var opacity = this._opatictyPercent;

  if (this.$opacity.value != opacity) {
    this.$opacity.value = opacity + '';
  }
};

SolidColorPicker.eventHandler.alphaDrag = function (event) {
  var aBound = this.$alpha.getBoundingClientRect();
  var opacity = (event.clientX - aBound.left) * 100 / aBound.width;
  opacity = Math.max(0, Math.min(100, Math.round(opacity)));

  var color = _Color.default.parse('#' + this._rgb);

  color.rgba[3] = opacity / 100;

  this._setValue(color);

  this._setOpacityPercent(opacity);

  this.notifyCanBeChanged();
};

SolidColorPicker.eventHandler.hueDrag = function (event) {
  var hBound = this.$hue.getBoundingClientRect();
  var hue = (event.clientX - hBound.left) * 360 / hBound.width;
  hue = Math.max(0, Math.min(360, Math.round(hue)));

  var value = _Color.default.fromHSBA(hue / 360, this._sat / 100, this._brightness / 100, this._opatictyPercent / 100);

  this._setValue(value);

  this._setHue(hue);

  this._setRGB(value.toHex6());

  this.notifyCanBeChanged();
};

SolidColorPicker.eventHandler.spectrumDrag = function (event) {
  var sBound = this.$spectrum.getBoundingClientRect();
  var brightness = (sBound.bottom - event.clientY) * 100 / sBound.height;
  brightness = Math.max(0, Math.min(100, Math.round(brightness)));
  var sat = (event.clientX - sBound.left) * 100 / sBound.width;
  sat = Math.max(0, Math.min(100, Math.round(sat)));

  var value = _Color.default.fromHSBA(this._hue / 360, sat / 100, brightness / 100, this._opatictyPercent / 100);

  this._setValue(value);

  this._setSatBrightness(sat, brightness);

  this._setRGB(value.toHex6());

  this.notifyCanBeChanged();
};

SolidColorPicker.eventHandler.keydown = function (event) {
  if (event.key == 'Enter') {
    event.preventDefault();
    event.target.blur();
    this.notifySubmit();
  }
};

_CPCore.default.install('solidcolorpicker', SolidColorPicker);

var _default = SolidColorPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-colorpicker/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-colorpicker/dev.js ***/
"use strict";

require("absol/src/absol");

require("absol-acomp/dev");

require(".");

var _ColorPicker = _interopRequireDefault(require("./components/ColorPicker"));

var _ColorPickerButton = _interopRequireDefault(require("./components/ColorPickerButton"));

var _SwatchesTable = _interopRequireDefault(require("./components/SwatchesTable"));

var _SpectrumColor = _interopRequireDefault(require("./components/SpectrumColor"));

var _SolidColorPicker = _interopRequireDefault(require("./components/SolidColorPicker"));


window.absol.coreDom.install({
  colorpicker: _ColorPicker.default,
  colorpickerbutton: _ColorPickerButton.default,
  solidcolorpicker: _SolidColorPicker.default
});
};

moduleFactories["node_modules/absol-svg/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireDefault(require("./js/svg/Core"));

var _install = _interopRequireDefault(require("./js/svg/install"));

var _Turtle = _interopRequireDefault(require("./js/controller/Turtle"));


var ASvg = {
  core: _Core.default,
  _: _Core.default._,
  $: _Core.default.$,
  Turtle: _Turtle.default,
  install: _install.default
};
var _default = ASvg;
exports.default = _default;
};

moduleFactories["node_modules/absol-svg/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-svg/dev.js ***/
"use strict";

var _ = _interopRequireDefault(require("."));

var _absol = _interopRequireDefault(require("absol"));

var _install = _interopRequireDefault(require("./js/svg/install"));


window.absol = window.absol || _absol.default;
(0, _install.default)(_absol.default.coreSvg);
(0, _install.default)(_absol.default.coreDom);
_absol.default.ASvg = _.default;
window.ASvg = _.default;
};

moduleFactories["node_modules/absol-form/js/core/FCore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/FCore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$$ = exports.$ = exports._ = void 0;

var _absolAcomp = _interopRequireDefault(require("absol-acomp"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _absolColorpicker = _interopRequireDefault(require("absol-colorpicker"));

var _install = _interopRequireDefault(require("absol-acomp/js/dom/install"));

var _install2 = _interopRequireDefault(require("absol-mobile/js/dom/install"));

var _ColorPickerButton = _interopRequireDefault(require("absol-colorpicker/components/ColorPickerButton"));


var FCore = new _Dom.default();
(0, _install.default)(FCore);
var _ = FCore._;
exports._ = _;
var $ = FCore.$;
exports.$ = $;
var $$ = FCore.$$;
exports.$$ = $$;
(0, _install2.default)(FCore);
FCore.install(_absolColorpicker.default.core);
FCore.install(_ColorPickerButton.default);
var _default = FCore;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/FAttributes.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/FAttributes.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Ref = _interopRequireDefault(require("absol/src/AppPattern/Ref"));


/***
 *
 * @param {Object} node
 * @constructor
 */
function FAttributes(node) {
  Object.defineProperty(this, '$$node', {
    enumerable: false,
    configurable: true,
    writable: false,
    value: node
  });
  Object.defineProperty(this, '_definedProperties', {
    enumerable: false,
    writable: false,
    value: {}
  });
  Object.defineProperty(this, '_definedComputedHandlers', {
    enumerable: false,
    writable: false,
    value: {}
  });
}

Object.defineProperty(FAttributes.prototype, 'loadAttributeHandlers', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (newHandlers) {
    var self = this;
    var definedHandlers = this._definedProperties;
    var definedComputedHandlers = this._definedComputedHandlers;
    Object.keys(this._definedProperties).forEach(function (key) {
      if (!newHandlers[key]) {
        delete definedHandlers[key];
        delete definedComputedHandlers[key];
        delete self[key];
      }
    });
    Object.keys(newHandlers).forEach(function (key) {
      if (definedHandlers[key] !== newHandlers[key]) {
        self.defineProperty(key, newHandlers[key]);
      }
    });
  }
});
Object.defineProperty(FAttributes.prototype, 'defineProperty', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (name, handler) {
    var self = this;
    this._definedProperties[name] = handler;
    var hadValue = !!(name in this);
    var privateValueRef = new _Ref.default(this[name]);
    var objectDescriptor = {
      enumerable: true,
      configurable: true,
      set: function (value) {
        if (handler.set) privateValueRef.set(handler.set.apply(self.$$node, Array.prototype.slice.call(arguments).concat([privateValueRef])));else privateValueRef.set(value);
      },
      get: function () {
        if (handler.get) return handler.get.apply(self.$$node, Array.prototype.slice.call(arguments).concat([privateValueRef]));else return privateValueRef.get();
      }
    };
    Object.defineProperty(this, name, objectDescriptor);
    this._definedComputedHandlers[name] = objectDescriptor;
    objectDescriptor.ref = privateValueRef;
    if (hadValue) this[name] = privateValueRef.get();
  }
});
Object.defineProperty(FAttributes.prototype, 'getProperty', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (name) {
    var args = Array.prototype.slice.call(arguments, 1);
    var handler = this._definedComputedHandlers[name];

    if (handler) {
      return handler.get.apply(this, args);
    } else return this[name];
  }
});
Object.defineProperty(FAttributes.prototype, 'setProperty', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (name, value) {
    var args = Array.prototype.slice.call(arguments, 1);
    var handler = this._definedComputedHandlers[name];

    if (handler) {
      return handler.set.apply(this, args);
    } else this[name] = value;
  }
});
Object.defineProperty(FAttributes.prototype, 'export', {
  enumerable: false,
  configurable: true,
  value: function () {
    var self = this;
    return Object.keys(this).reduce(function (ac, key) {
      var value;
      var handler = self._definedProperties[key];
      var computedHandler = self._definedComputedHandlers[key];
      var exporter = handler && handler.export;

      if (exporter) {
        value = exporter.call(self.$$node, computedHandler.ref);
      } else {
        value = self[key];
      }

      if (value !== undefined) ac[key] = value;
      return ac;
    }, {});
  }
});
Object.defineProperty(FAttributes.prototype, 'getPropertyDescriptor', {
  enumerable: false,
  configurable: true,
  writable: false,
  value: function (name) {
    var handler = this._definedProperties[name];
    if (handler && typeof handler.descriptor === 'function') return handler.descriptor.call(this.$$node);
    var value = this[name];
    return handler && handler.descriptor || {
      type: typeof value
    };
  }
});
var _default = FAttributes;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/IndexedPropertyNames.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/IndexedPropertyNames.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.PropertyNames = void 0;
var PropertyNames = ['id', 'name', 'permissions', 'text', 'textDecode', 'offset', 'items', 'value', 'list', 'treeList', 'strictValue', 'placeHolder', 'disabled', 'tooltip', 'disembark',
/********************/
'hAlign', 'left', 'right', 'vAlign', 'top', 'bottom', 'width', 'height', 'overflowY', 'itemSpacing'];
exports.PropertyNames = PropertyNames;
var IndexedPropertyNames = PropertyNames.reduce(function (ac, cr, i) {
  ac[cr] = i;
  return ac;
}, {});
var _default = IndexedPropertyNames;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/FViewable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/FViewable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FAttributes = _interopRequireDefault(require("./FAttributes"));

var _IndexedPropertyNames = _interopRequireDefault(require("./IndexedPropertyNames"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


function FViewable() {
  var defaultStyle = this.style;
  var style = new _FAttributes.default(this);
  Object.defineProperty(this, 'style', {
    enumerable: true,
    set: function (value) {
      Object.assign(style, value);
    },
    get: function () {
      return style;
    }
  });
  Object.assign(this.style, defaultStyle);
}
/***
 *
 * @type {{}|FAttributes}
 */


FViewable.prototype.style = {};
/**
 * @returns {Array<String>}
 */

FViewable.prototype.getAcceptsStyleNames = function () {
  var dict = Object.assign({}, this.styleHandlers);
  var names = Object.keys(dict);
  var indexed = _IndexedPropertyNames.default;
  names.sort(function (a, b) {
    return indexed[a] - indexed[b];
  });
  return names;
};
/***
 * @returns {AElement}
 */


FViewable.prototype.render = function () {
  throw new Error('Not Implement');
};

FViewable.prototype.onDomCreated = _noop.default;
/**
 * @param {String} name
 * @returns {}
 */

FViewable.prototype.getStyleDescriptor = function (name) {
  var functionName = 'getStyle' + name.substr(0, 1).toUpperCase() + name.substr(1) + 'Descriptor';
  return this[functionName] && this[functionName].apply(this, Array.prototype.slice.call(arguments, 1)) || this.style.getPropertyDescriptor(name);
};
/**
 * @returns {}
 */


FViewable.prototype.getStyleDescriptors = function () {
  var result = {};
  var names = this.getAcceptsStyleNames();
  var key;

  for (var i = 0; i < names.length; ++i) {
    key = names[i];
    result[key] = this.getStyleDescriptor(key);
  }

  return result;
};
/**
 * @param {String} name
 * @param {*} value
 * @returns {*} value which is set
 */


FViewable.prototype.setStyle = function (name, value) {
  return this.style.setProperty.apply(this.style, arguments);
};
/**
 * @param {String} name
 * @returns {Object} value which is set
 */


FViewable.prototype.getStyle = function (name) {
  return this.style.getProperty.apply(this.style, arguments);
};

FViewable.prototype.getStyles = function () {
  var self = this;
  var styleKeys = Object.keys(this.style).filter(function (key) {
    return self.style[key] !== undefined || self.style[key] !== null;
  });

  if (styleKeys.length > 0) {
    return styleKeys.reduce(function (ac, key) {
      ac[key] = self.style[key];
      return ac;
    }, {});
  }

  return null;
};

FViewable.prototype.setStyles = function (styles) {
  var self = this;
  Object.keys(styles).forEach(function (key) {
    self.setStyle(key, styles[key]);
  });
};

FViewable.prototype.styleHandlers = {};
var _default = FViewable;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/inheritComponentClass.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/inheritComponentClass.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = inheritComponentClass;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


function inheritComponentClass(constructor) {
  _OOP.default.mixClass.apply(_OOP.default, arguments);

  var cClass;
  var attributeHandlers = undefined;
  var styleHandlers = undefined;
  var compStyleHandlers = undefined;
  var pinHandlers = undefined;
  var style = undefined;
  var attributes = undefined;

  for (var i = 1; i < arguments.length; ++i) {
    cClass = arguments[i];

    if (cClass.prototype.attributeHandlers) {
      attributeHandlers = attributeHandlers || {};
      Object.assign(attributeHandlers, cClass.prototype.attributeHandlers || {});
    }

    if (cClass.prototype.styleHandlers) {
      styleHandlers = styleHandlers || {};
      Object.assign(styleHandlers, cClass.prototype.styleHandlers || {});
    }

    if (cClass.prototype.compStyleHandlers) {
      compStyleHandlers = compStyleHandlers || {};
      Object.assign(compStyleHandlers, cClass.prototype.compStyleHandlers || {});
    }

    if (cClass.prototype.pinHandlers) {
      pinHandlers = pinHandlers || {};
      Object.assign(pinHandlers, cClass.prototype.pinHandlers || {});
    }

    if (cClass.prototype.style) {
      style = style || {};
      Object.assign(style, cClass.prototype.style);
    }

    if (cClass.prototype.attributes) {
      attributes = attributes || {};
      Object.assign(attributes, cClass.prototype.attributes);
    }
  }

  if (attributeHandlers) constructor.prototype.attributeHandlers = attributeHandlers;
  if (styleHandlers) constructor.prototype.styleHandlers = styleHandlers;
  if (compStyleHandlers) constructor.prototype.compStyleHandlers = compStyleHandlers;
  if (pinHandlers) constructor.prototype.pinHandlers = pinHandlers;

  if (style) {
    constructor.prototype.style = style;
  }

  if (attributes) {
    constructor.prototype.attributes = attributes;
  }
}
};

moduleFactories["node_modules/absol-form/js/anchors/makeMapStyleHandler.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/anchors/makeMapStyleHandler.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = makeMapStyleHandler;

/**
 * map from component to anchor
 * @param {string} name
 * @returns {{descriptor: function, set: set, get: (function(): *)}}
 */
function makeMapStyleHandler(name) {
  return {
    set: function (value) {
      this.childNode.style[name] = value;
    },
    get: function () {
      return this.childNode.style[name];
    },
    descriptor: function () {
      this.childNode.style.getPropertyDescriptor(name);
    }
  };
}
};

moduleFactories["node_modules/absol-form/js/core/utils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/utils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.randomUniqueIdent = randomUniqueIdent;
exports.parseMeasureValue = parseMeasureValue;
exports.nextIdString = nextIdString;

var _stringGenerate = require("absol/src/String/stringGenerate");

var _utils = require("absol-acomp/js/utils");

var randomSeed = new Date().getTime();

function randomUniqueIdent() {
  var s = '';
  var l = _stringGenerate.identCharacters.length;
  var x = ++randomSeed;

  while (x > 0) {
    s = _stringGenerate.identCharacters[x % l] + s;
    x = Math.floor(x / l);
  }

  while (s.length < 16) {
    s += _stringGenerate.identCharacters[Math.floor(Math.random() * l)];
  }

  return s;
}

function parseMeasureValue(mValue) {
  if (mValue === 'auto') return {
    unit: null,
    value: 'auto'
  };
  if (mValue === 'match_parent') return {
    unit: null,
    value: 'match_parent'
  };
  var value = NaN;
  var unit = null;
  var matched;

  if (typeof mValue === "number") {
    value = mValue;
    unit = 'px';
  } else if (typeof mValue === "string") {
    matched = mValue.match(/([+-]?([0-9]*[.])?[0-9]+([eE][+-]?[0-9]+)?)(px|%|vw|vh)?/i);

    if (matched) {
      value = parseFloat(matched[1]);
      unit = matched[4];
    }
  }

  if (isNaN(value)) return null;
  unit = unit || 'px';
  return {
    value: value,
    unit: unit
  };
}
/***
 *
 * @param {string} id
 */


function nextIdString(id) {
  var lfm = id.match(/\d+$/g);
  var idx = 0;
  var lf = '';

  if (lfm) {
    lf = lfm[0];
    idx = parseInt(lf, 10);
  }

  idx++;
  return id.substring(0, id.length - lf.length) + (0, _utils.zeroPadding)(idx, lf.length);
}
};

moduleFactories["node_modules/absol-form/js/anchors/RelativeAnchor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/anchors/RelativeAnchor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _FViewable = _interopRequireDefault(require("../core/FViewable"));

require("../../css/relativeanchor.css");

require("../../css/alignbox.css");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _makeMapStyleHandler = _interopRequireDefault(require("./makeMapStyleHandler"));

var _utils = require("../core/utils");


var _ = _FCore.default._;
var $ = _FCore.default.$;
/**
 * AnchorBox only has on child node
 * @extends FViewable
 * @constructor
 */

function RelativeAnchor() {
  _FViewable.default.call(this);

  this.childNode = null;
  this.$container = null; //for quick binding render

  this.viewBinding = {};
  this.onCreate();
  this.domElt = this.render();
  this.onCreated();
}

(0, _inheritComponentClass.default)(RelativeAnchor, _FViewable.default);

RelativeAnchor.prototype.onCreate = function () {
  /* NOOP */
};

RelativeAnchor.prototype.onCreated = function () {
  for (var key in this.viewBinding) {
    this[key] = $(this.viewBinding[key], this.domElt);
  }
};

RelativeAnchor.prototype.VALIGN_VALUE = ['top', 'bottom', 'center', 'fixed'];
RelativeAnchor.prototype.HALIGN_VALUE = ['left', 'right', 'center', 'fixed'];
RelativeAnchor.prototype.HALIGN_CLASS_NAMES = {
  left: 'as-halign-left',
  right: 'as-halign-right',
  center: 'as-halign-center',
  fixed: 'as-halign-fixed'
};
RelativeAnchor.prototype.VALIGN_CLASS_NAMES = {
  top: 'as-valign-top',
  bottom: 'as-valign-bottom',
  center: 'as-valign-center',
  fixed: 'as-valign-fixed'
};
RelativeAnchor.prototype.compStyleHandlers = {};
RelativeAnchor.prototype.compStyleHandlers.hAlign = {
  set: function (value) {
    var anchor = this.anchor;
    var ref = arguments[arguments.length - 1];
    var currentValue = ref.get();
    if (!anchor.HALIGN_VALUE.includes(value)) value = anchor.HALIGN_VALUE[0];
    anchor.domElt.removeClass(anchor.HALIGN_CLASS_NAMES[currentValue]);
    anchor.domElt.addClass(anchor.HALIGN_CLASS_NAMES[value]);
    ref.set(value);
    this.style['left'] = this.style.left;
    this.style['right'] = this.style.right;
    this.style['width'] = this.style.width;
    return value;
  },
  descriptor: {
    type: 'enum',
    values: ['left', 'right', 'center', 'fixed'],
    disabled: false,
    sign: 'RelativeAnchor_HAlign'
  }
};
RelativeAnchor.prototype.compStyleHandlers.vAlign = {
  set: function (value) {
    var anchor = this.anchor;
    var ref = arguments[arguments.length - 1];
    var currentValue = ref.get();
    if (!anchor.VALIGN_VALUE.includes(value)) value = anchor.VALIGN_VALUE[0];
    anchor.domElt.removeClass(anchor.VALIGN_CLASS_NAMES[currentValue]);
    anchor.domElt.addClass(anchor.VALIGN_CLASS_NAMES[value]);
    ref.set(value);
    this.style['top'] = this.style.top;
    this.style['bottom'] = this.style.bottom;
    this.style['height'] = this.style.height;
    return value;
  },
  descriptor: {
    type: 'enum',
    values: ['top', 'bottom', 'center', 'fixed'],
    disabled: false,
    sign: 'RelativeAnchor_VAlign'
  }
};
RelativeAnchor.prototype.compStyleHandlers.left = {
  /***
   * @this BaseComponent
   * @param value
   * @returns {*}
   */
  set: function (value) {
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var ref = arguments[arguments.length - 1];
    var currentValue = ref.get();
    var currentMS = (0, _utils.parseMeasureValue)(currentValue) || {
      value: "auto",
      unit: null
    };
    value = this.implicitMeasureSizeValue(value, unit, "width", currentMS.unit);
    var styleValue = value >= 0 ? value + 'px' : value;

    if (this.style.hAlign !== 'center' && this.style.hAlign !== 'right') {
      this.anchor.domElt.addStyle('left', styleValue);
    } else this.anchor.domElt.removeStyle('left');

    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var disabled = this.style.hAlign === 'center' || this.style.hAlign === 'right';
    var bound;
    var parentBound;

    if (unit === 'px') {
      if (typeof value != 'number' || disabled) {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return bound.left - parentBound.left;
      } else {
        return value;
      }
    } else if (unit === '%') {
      if (typeof value == 'string' && !value.match(/%$/) || typeof value != 'string' || disabled) {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return (bound.left - parentBound.left) * 100 / parentBound.width;
      } else {
        return parseFloat(value.replace('%', ''));
      }
    } else return value;
  },
  descriptor: function () {
    return {
      type: 'measurePosition',
      min: -Infinity,
      max: Infinity,
      disabled: this.style.hAlign === 'center' || this.style.hAlign === 'right',
      livePreview: true,
      dependency: ['hAlign', 'right', 'width']
    };
  }
};
RelativeAnchor.prototype.compStyleHandlers.right = {
  set: function (value) {
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var ref = arguments[arguments.length - 1];
    var currentValue = ref.get();
    var currentMS = (0, _utils.parseMeasureValue)(currentValue) || {
      value: "auto",
      unit: null
    };
    value = this.implicitMeasureSizeValue(value, unit, "width", currentMS.unit);
    var styleValue = value >= 0 ? value + 'px' : value;

    if (this.style.hAlign !== 'center' && this.style.hAlign !== 'left') {
      this.anchor.domElt.addStyle('right', styleValue);
    } else this.anchor.domElt.removeStyle('right');

    ref.set(value);
    this.onSizeChange();
    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var disabled = this.style.hAlign === 'center' || this.style.hAlign === 'left';
    var bound, parentBound;

    if (unit === 'px') {
      if (typeof value != 'number' || disabled) {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return parentBound.right - bound.right;
      } else {
        return value;
      }
    } else if (unit === '%') {
      if (typeof value == 'string' && !value.match(/%$/) || typeof value != 'string' || disabled) {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return (parentBound.right - bound.right) * 100 / parentBound.width;
      } else {
        return parseFloat(value.replace('%', ''));
      }
    } else return value;
  },
  descriptor: function () {
    return {
      type: 'measurePosition',
      min: -Infinity,
      max: Infinity,
      disabled: this.style.hAlign === 'center' || this.style.hAlign === 'left',
      livePreview: true,
      dependency: ['hAlign', 'right', 'width']
    };
  }
};
RelativeAnchor.prototype.compStyleHandlers.top = {
  set: function (value) {
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var ref = arguments[arguments.length - 1];
    var currentValue = ref.get();
    var currentMS = (0, _utils.parseMeasureValue)(currentValue) || {
      value: "auto",
      unit: null
    };
    value = this.implicitMeasureSizeValue(value, unit, "height", currentMS.unit);
    var styleValue = value >= 0 ? value + 'px' : value;

    if (this.style.vAlign !== 'center' && this.style.vAlign !== 'bottom') {
      this.anchor.domElt.addStyle('top', styleValue);
    } else this.anchor.domElt.removeStyle('top');

    ref.set(value);
    this.onSizeChange();
    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var disabled = this.style.vAlign === 'center' || this.style.vAlign === 'bottom';
    var bound, parentBound;

    if (unit === 'px') {
      if (typeof value != 'number' || disabled) {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return bound.top - parentBound.top;
      } else {
        return value;
      }
    } else if (unit === '%') {
      if (typeof value == 'string' && !value.match(/%$/) || typeof value != 'string' || disabled) {
        {
          bound = this.domElt.getBoundingClientRect();
          parentBound = this.parent.domElt.getBoundingClientRect();
          return (bound.top - parentBound.top) * 100 / parentBound.height;
        }
      } else {
        return parseFloat(value.replace('%', ''));
      }
    } else return value;
  },
  descriptor: function () {
    return {
      type: 'measurePosition',
      min: -Infinity,
      max: Infinity,
      disabled: this.style.vAlign === 'center' || this.style.vAlign === 'bottom',
      livePreview: true,
      dependency: ['vAlign', 'bottom', 'height']
    };
  }
};
RelativeAnchor.prototype.compStyleHandlers.bottom = {
  set: function (value) {
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var ref = arguments[arguments.length - 1];
    var currentValue = ref.get();
    var currentMS = (0, _utils.parseMeasureValue)(currentValue) || {
      value: "auto",
      unit: null
    };
    value = this.implicitMeasureSizeValue(value, unit, "height", currentMS.unit);
    var styleValue = value >= 0 ? value + 'px' : value;

    if (this.style.vAlign !== 'center' && this.style.vAlign !== 'top') {
      this.anchor.domElt.addStyle('bottom', styleValue);
    } else this.anchor.domElt.removeStyle('bottom');

    ref.set(value);
    this.onSizeChange();
    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var disabled = this.style.vAlign === 'center' || this.style.vAlign === 'top';
    var bound, parentBound;

    if (unit === 'px') {
      if (typeof value != 'number' || disabled) {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return parentBound.bottom - bound.bottom;
      } else {
        return value;
      }
    } else if (unit === '%') {
      if (typeof value == 'string' && !value.match(/%$/) || typeof value != 'string' || disabled) {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return (parentBound.bottom - bound.bottom) * 100 / parentBound.height;
      } else {
        return parseFloat(value.replace('%', ''));
      }
    } else return value;
  },
  descriptor: function () {
    return {
      type: 'measurePosition',
      min: -Infinity,
      max: Infinity,
      disabled: this.style.vAlign === 'center' || this.style.vAlign === 'top',
      livePreview: true,
      dependency: ['vAlign', 'bottom', 'height']
    };
  }
};
RelativeAnchor.prototype.compStyleHandlers.width = {
  set: function (value) {
    if (value === null || value === undefined || value === '') value = 'auto';
    var ref = arguments[arguments.length - 1];
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var currentValue = ref.get();
    var currentMS = (0, _utils.parseMeasureValue)(currentValue) || {
      value: "auto",
      unit: null
    };
    value = this.implicitMeasureSizeValue(value, unit, "width", currentMS.unit);
    var styleValue = value >= 0 ? value + 'px' : value;
    if (styleValue === 'match_parent') styleValue = '100%';
    var vAlign = this.style.vAlign;
    var hAlign = this.style.hAlign;

    if (vAlign === 'center') {
      if (hAlign === 'center') {
        this.anchor.domElt.removeStyle('width');
        this.domElt.addStyle('width', styleValue);
      } else if (hAlign === 'fixed') {
        this.anchor.domElt.removeStyle('width');
        this.domElt.removeStyle('width');
      } else {
        this.anchor.domElt.addStyle('width', styleValue);
        this.domElt.removeStyle('width');
      }
    } else {
      if (hAlign === 'center') {
        this.domElt.addStyle('width', styleValue);
        this.anchor.domElt.removeStyle('width');
      } else {
        this.domElt.removeStyle('width');

        if (hAlign === 'fixed') {
          this.anchor.domElt.removeStyle('width');
        } else {
          this.anchor.domElt.addStyle('width', styleValue);
        }
      }
    }

    ref.set(value);
    this.onSizeChange();
    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var hAlign = this.style.hAlign;
    var disabled = this.style.hAlign === 'fixed';
    var bound, parentBound;

    if (unit === 'px') {
      if (disabled || typeof value != 'number') {
        bound = this.domElt.getBoundingClientRect();
        return bound.width;
      } else {
        return value;
      }
    } else if (unit === '%') {
      if (hAlign === 'match_parent') return 100;else if (disabled || typeof value === 'string' && !value.match(/%$/) || typeof value != 'string') {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return bound.width * 100 / parentBound.width;
      } else {
        return parseFloat(value.replace('%', ''));
      }
    } else return value;
  },
  descriptor: function () {
    return {
      type: 'measureSize',
      disabled: this.style.hAlign === 'fixed',
      dependency: ['hAlign', 'left', 'right']
    };
  }
};
RelativeAnchor.prototype.compStyleHandlers.height = {
  set: function (value) {
    if (value === null || value === undefined || value === '') value = 'auto';
    if (value && value.startsWith && value.startsWith('auto')) value = 'auto';
    var ref = arguments[arguments.length - 1];
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var currentValue = ref.get();
    var vAlign = this.style.vAlign;
    var currentMS = (0, _utils.parseMeasureValue)(currentValue) || {
      value: "auto",
      unit: null
    };
    value = this.implicitMeasureSizeValue(value, unit, "height", currentMS.unit);
    var styleValue = value >= 0 ? value + 'px' : value;
    if (styleValue === 'match_parent') styleValue = '100%';

    if (vAlign === 'center') {
      this.anchor.domElt.removeStyle('height');
      this.domElt.addStyle('height', styleValue);
    } else {
      this.domElt.removeStyle('height');

      if (vAlign === 'fixed') {
        this.anchor.domElt.removeStyle('height', styleValue);
      } else {
        this.anchor.domElt.addStyle('height', styleValue);
      }
    }

    ref.set(value);
    this.onSizeChange();
    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var disabled = this.style.vAlign === 'fixed';
    var parentBound, bound;
    var currentValue = ref.get();
    var vAlign = this.style.vAlign;

    if (unit === 'px') {
      if (disabled || typeof currentValue != 'number') {
        bound = this.domElt.getBoundingClientRect();
        return bound.height;
      } else {
        return currentValue;
      }
    } else if (unit === '%') {
      if (vAlign === 'match_parent') return 100;else if (disabled || typeof currentValue === 'string' && !currentValue.match(/%$/) || typeof currentValue != 'string') {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return bound.height * 100 / parentBound.height;
      } else {
        return parseFloat(currentValue.replace('%', ''));
      }
    } else return currentValue;
  },
  descriptor: function () {
    return {
      type: 'measureSize',
      disabled: this.style.vAlign === 'fixed',
      dependency: ['vAlign', 'top', 'bottom']
    };
  }
};
RelativeAnchor.prototype.compStyleHandlers.hidden = {
  set: function (value) {
    value = !!value;
    if (value) this.anchor.domElt.addClass('as-display-hidden');else this.anchor.domElt.removeClass('as-display-hidden');
    this.domElt.removeClass('as-display-hidden');
    return value;
  },
  descriptor: {
    type: 'bool'
  }
};
['hAlign', 'vAlign', 'left', 'right', 'top', 'bottom', 'width', 'height', 'hidden'].forEach(function (name) {
  RelativeAnchor.prototype.styleHandlers[name] = (0, _makeMapStyleHandler.default)(name);
});
RelativeAnchor.prototype.TOP_CLASS_NAME = 'as-relative-anchor-box';

RelativeAnchor.prototype.render = function () {
  var layout = {
    class: ['as-anchor-box', this.TOP_CLASS_NAME]
  };
  this.viewBinding.$containter = '.' + this.TOP_CLASS_NAME;
  return _(layout);
};
/**
 * @param {BaseComponent} child
 */


RelativeAnchor.prototype.attachChild = function (child) {
  if (this.childNode) {
    this.childNode.domElt.remove();
    this.childNode = null;
    this.childNode.anchor = null;
  }

  if (child.anchor) throw new Error("Detach anchorBox first"); //preinit

  this.childNode = child;
  child.anchor = this;
  this.childNode.style.left = this.childNode.style.left || 0;
  this.childNode.style.right = this.childNode.style.right || 0;
  this.childNode.style.top = this.childNode.style.top || 0;
  this.childNode.style.bottom = this.childNode.style.bottom || 0;
  this.childNode.style.vAlign = this.childNode.style.vAlign || 'top';
  this.childNode.style.hAlign = this.childNode.style.hAlign || 'left';
  this.style.left = this.childNode.style.left;
  this.style.right = this.childNode.style.right;
  this.style.top = this.childNode.style.top;
  this.style.bottom = this.childNode.style.bottom;
  this.style.vAlign = this.childNode.style.vAlign;
  this.style.hAlign = this.childNode.style.hAlign;
  this.$containter.addChild(child.domElt);
  this.$containter.attr('data-anchor-of', child.tag);
  this.style.loadAttributeHandlers(this.styleHandlers);
  child.style.loadAttributeHandlers(Object.assign({}, child.styleHandlers, this.compStyleHandlers));
  child.onAnchorAttached();
};

RelativeAnchor.prototype.detachChild = function () {
  if (this.childNode) {
    this.childNode.domElt.remove();
    this.childNode.onAnchorDetached();
    this.childNode.anchor = null;
    this.childNode = null;
  } else throw new Error("Nothing to detach");
};

RelativeAnchor.prototype.HALIGN_ACCEPT_STYLE = {
  left: {
    left: true,
    right: false
  },
  right: {
    left: false,
    right: true
  },
  center: {
    left: false,
    right: false
  },
  // component need set width
  fixed: {
    left: true,
    right: true
  }
};
RelativeAnchor.prototype.VALIGN_ACCEPT_STYLE = {
  top: {
    top: true,
    bottom: false
  },
  bottom: {
    top: false,
    bottom: true
  },
  center: {
    top: false,
    bottom: false
  },
  // component need set height
  fixed: {
    top: true,
    bottom: true
  }
};

RelativeAnchor.prototype.updateVAlignStyle = function () {
  for (var key in this.VALIGN_ACCEPT_STYLE[this.childNode.style.vAlign]) {
    if (this.VALIGN_ACCEPT_STYLE[this.childNode.style.vAlign][key]) {
      this.domElt.addStyle(key, this.childNode.style[key] + 'px');
    } else {
      this.domElt.removeStyle(key);
    }
  }

  this.setStyle('width', this.childNode.style.width);
  this.setStyle('height', this.childNode.style.height);
};

RelativeAnchor.prototype.updateHAlignStyle = function () {
  for (var key in this.HALIGN_ACCEPT_STYLE[this.childNode.style.hAlign]) {
    if (this.HALIGN_ACCEPT_STYLE[this.childNode.style.hAlign][key]) {
      this.childNode.style[key] = key;
    } else {
      this.domElt.removeStyle(key);
    }
  }

  this.setStyle('width', this.childNode.style.width);
  this.setStyle('height', this.childNode.style.height);
};

Object.defineProperty(RelativeAnchor.prototype, 'view', {
  get: function () {
    return this.domElt;
  }
});
var _default = RelativeAnchor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/FNode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/FNode.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.traversal = traversal;
exports.default = void 0;

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/****
 * @extends Context
 * @constructor
 */
function FNode() {
  _Context.default.apply(this, arguments);
  /**
   * @type {Array<FNode>}
   */


  this.children = [];
  /**
   * @type {FNode}
   * @name parent
   * @memberOf FNode#
   */
}

_OOP.default.mixClass(FNode, _Context.default);

FNode.prototype.start = function (standBy) {
  if (this.state.match(/DIE/)) {
    console.error(this, 'DIED!');
    return;
  }

  if (this.state.match(/RUNNING/)) return;

  if (this.state.match(/STOP|CREATE/)) {
    this.state = "STANDBY";
    this.onStart && this.onStart();
    this.children.forEach(child => child.start(true));
  }

  if (!standBy && this.state.match(/STANDBY|PAUSE/)) {
    this.resume();
  }
};

FNode.prototype.resume = function () {
  _Context.default.prototype.resume.apply(this, arguments);

  this.children.forEach(child => child.resume());
};

FNode.prototype.pause = function () {
  this.children.forEach(child => child.pause());

  _Context.default.prototype.pause.apply(this, arguments);
};

FNode.prototype.stop = function () {
  if (this.state.match(/STOP|DIE|CREATE/)) return;
  if (this.state.match(/RUNNING/)) this.pause();
  this.children.forEach(child => child.stop());
  this.state = "STOP";
  this.onStop && this.onStop();
};

FNode.prototype.destroy = function () {
  this.children.forEach(child => child.destroy());

  _Context.default.prototype.destroy.apply(this, arguments);
};
/**
 * do something when remove
 * @param {FNode} child
 * @param {Number} index
 */


FNode.prototype.onRemoveChild = function (child, index) {};
/**
 * do something when add child
 * @param {FNode} child
 * @param {Number} index
 */


FNode.prototype.onAddChild = function (child, index) {};
/***
 * do something when attach
 */


FNode.prototype.onAttach = function (parent) {};
/***
 * do something when attach
 */


FNode.prototype.onDetach = function () {};
/**
 * @return {FNode}
 */


FNode.prototype.remove = function () {
  if (this.parent) this.parent.removeChild(this);
};

FNode.prototype._updateDownState = function (child) {
  if (this.state === 'DIE' || child.state === 'DIE') {
    console.error("Violation: Node destroyed", this, child);
  } else if (this.state === 'CREATE' || this.state === 'STOP') {} else if (this.state === "STANDBY" || this.state === 'PAUSE') {
    child.start(true);
  } else if (this.state === 'RUNNING') {
    child.start();
  }
};
/**
 * @param {FNode} child
 * @return {FNode}
 */


FNode.prototype.addChild = function (child) {
  child.remove();
  this.children.push(child);
  child.parent = this; //data ready

  child.onAttach(this);
  this.onAddChild(child, -1); //negative index for appending child

  child.onAttached();

  this._updateDownState(child);
};
/**
 * @param {FNode} child
 * @return {Boolean}
 */


FNode.prototype.removeChild = function (child) {
  var childIndex = this.children.indexOf(child);
  if (childIndex < 0) return false;
  child.stop();
  child.onDetach();
  this.onRemoveChild(child, childIndex);
  this.children.splice(childIndex, 1);
  child.parent = undefined;
  child.onDetached();
  return true;
};
/**
 * @param {FNode} child
 * @param {FNode=} at
 * @return {FNode}
 */


FNode.prototype.addChildBefore = function (child, at) {
  var atIndex;

  if (at) {
    atIndex = this.children.indexOf(at);

    if (atIndex >= 0) {
      child.remove();
      this.children.splice(atIndex, 0, child);
      child.parent = this;
      this.onAttach();
      this.onAddChild(child, atIndex);
      child.onAttached();
    } else {
      throw new Error('Element does not contain [at]');
    }
  } else {
    child.remove();
    this.children.push(child);
    child.parent = this;
    this.onAttach();
    this.onAddChild(child, this.children.length - 1);
    child.onAttached();
  }

  this._updateDownState(child);

  return this;
};
/**
 * @param {FNode} child
 * @param {FNode=} at
 * @return {FNode}
 */


FNode.prototype.addChildAfter = function (child, at) {
  child.remove();
  var atIndex;

  if (at) {
    atIndex = this.children.indexOf(at);

    if (atIndex >= 0) {
      this.children.splice(atIndex + 1, 0, child);
      child.parent = this;
      this.onAttach();
      this.onAddChild(child, atIndex + 1);
      child.onAttached();
    } else {
      throw new Error('Element does not contain [at]');
    }
  } else {
    this.children.unshift(child);
    child.parent = this;
    this.onAttach();
    this.onAddChild(child, 0);
    child.onAttached();
  }

  this._updateDownState(child);

  return this;
};
/**
 * @param {FNode} child
 * @return {FNode}
 */


FNode.prototype.findChildBefore = function (child) {
  var index = this.children.indexOf(child);
  if (index > 0) return this.children[index - 1];
};
/**
 * @param {FNode} child
 * @return {FNode}
 */


FNode.prototype.findChildAfter = function (child) {
  var index = this.children.indexOf(child);
  if (index < this.children.length - 1) return this.children[index + 1] || null;
};
/**
 * @param {FNode} child
 * @return {Number}
 */


FNode.prototype.indexOfChild = function (child) {
  return this.children.indexOf(child);
};

var _default = FNode;
/***
 *
 *
 * @param  {FNode} root
 * @param cb
 */

exports.default = _default;

function traversal(root, cb) {
  var ac = {
    path: [],
    node: null,
    isStopped: false,
    stop: function () {
      this.isStopped = true;
    },
    isSkipChildren: false,
    skipChildren: function () {
      this.isSkipChildren = true;
    }
  };

  function visit(node) {
    ac.path.push(node);
    ac.node = node;
    ac.isSkipChildren = false;
    ac.isStopped = false;
    cb(ac);

    if (!ac.isSkipChildren) {
      if (node.children) for (var i = 0; i < node.children.length && !ac.isStopped; ++i) {
        visit(node.children[i]);
      }
    }

    ac.node = ac.path.pop();
  }

  visit(root);
}
};

moduleFactories["node_modules/absol-form/js/core/FModel.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/FModel.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FAttributes = _interopRequireDefault(require("./FAttributes"));

var _IndexedPropertyNames = _interopRequireDefault(require("./IndexedPropertyNames"));


function FModel() {
  var defaultAttribute = this.attributes;
  var attributes = new _FAttributes.default(this);
  Object.defineProperty(this, 'attributes', {
    enumerable: true,
    set: function (value) {
      Object.assign(attributes, value);
    },
    get: function () {
      return attributes;
    }
  });
  Object.assign(this.attributes, defaultAttribute);
}

FModel.prototype.attributes = {};
/**
 * @returns {Array<String>}
 */

FModel.prototype.getAcceptsAttributeNames = function () {
  var dict = Object.assign({}, this.attributeHandlers);
  var names = Object.keys(dict);
  var indexed = _IndexedPropertyNames.default;
  names.sort(function (a, b) {
    return indexed[a] - indexed[b];
  });
  return names;
};
/**
 * @param {String} name
 * @returns {}
 */


FModel.prototype.getAttributeDescriptor = function (name) {
  return this.attributes.getPropertyDescriptor(name);
};
/**
 * @returns {}
 */


FModel.prototype.getAttributeDescriptors = function () {
  var result = {};
  var names = this.getAcceptsAttributeNames();
  var key;

  for (var i = 0; i < names.length; ++i) {
    key = names[i];
    result[key] = this.getAttributeDescriptor(key);
  }

  return result;
};
/**
 * @param {String} name
 * @param {} value
 * @returns {} value which is set
 */


FModel.prototype.setAttribute = function (name, value) {
  this.attributes[name] = value;
};
/**
 * @param {String} name
 * @returns {} value which is set
 */


FModel.prototype.getAttribute = function (name) {
  return this.attributes[name];
};

FModel.prototype.getAttributes = function () {
  var res = Object.assign({}, this.attributes.export());
};

FModel.prototype.setAttributes = function (attributes) {
  Object.assign(this.attributes, attributes);
};

FModel.prototype.attributeHandlers = {};

FModel.prototype.getAttributeHandlers = function () {
  return this.attributeHandlers;
};

var _default = FModel;
exports.default = _default;
};

moduleFactories["node_modules/absol/src/AppPattern/PluginManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/AppPattern/PluginManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function PluginManager() {
  this.runnerChains = {};
}

PluginManager.prototype.push = function (key, runner) {
  this.runnerChains[key] = this.runnerChains[key] || [];
  this.runnerChains[key].push(runner);
};

PluginManager.prototype.pop = function (key) {
  this.runnerChains[key] = this.runnerChains[key] || [];
  return this.runnerChains[key].pop();
};

PluginManager.prototype.remove = function (key, runner) {
  var runnerChain = this.runnerChains[key];

  if (runnerChain) {
    var index = runnerChain.indexOf(runner);

    if (index >= 0) {
      runnerChain.splice(index, 1);
      return true;
    }
  }

  return false;
};

PluginManager.prototype.contains = function (key, runner) {
  var runnerChain = this.runnerChains[key];

  if (runnerChain) {
    var index = runnerChain.indexOf(runner);
    if (index >= 0) return true;
  }

  return false;
};

PluginManager.prototype.exec = function (_this, key) {
  var args = Array.prototype.slice.call(arguments, 2);
  var runnerChain = this.runnerChains[key];
  if (runnerChain) for (var i = 0; i < runnerChain.length; ++i) {
    runnerChain[i].apply(_this, args);
  }
};

var _default = PluginManager;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/PluginManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/PluginManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PluginManager = _interopRequireDefault(require("absol/src/AppPattern/PluginManager"));


var _default = new _PluginManager.default();

exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/FormEditorPreconfig.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/FormEditorPreconfig.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var FormEditorPreconfig = window.FormEditorPreconfig || {
  description: "This object must be create in global before FMLauncher's modules is loaded, it mean if you see that line, default config will be applied",
  extendAttributes: {}
};
var _default = FormEditorPreconfig;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/BaseBlock.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/BaseBlock.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _FModel = _interopRequireDefault(require("./FModel"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _utils = require("./utils");

var _CCBlock = _interopRequireDefault(require("absol/src/AppPattern/circuit/CCBlock"));

var _inheritComponentClass = _interopRequireDefault(require("./inheritComponentClass"));


/***
 * @constructor
 * @augments EventEmitter
 * @augments FViewable
 * @augments FNode
 * @augments FModel
 */
function BaseBlock() {
  _EventEmitter.default.call(this);

  _FModel.default.call(this);

  _CCBlock.default.call(this, {
    id: (0, _utils.randomUniqueIdent)()
  });
  /***
   *
   * @type {null|FmFragment}
   */


  this.fragment = null;
  this.attributes.loadAttributeHandlers(this.attributeHandlers);
  this.onCreated();
}

(0, _inheritComponentClass.default)(BaseBlock, _EventEmitter.default, _FModel.default, _CCBlock.default);
BaseBlock.prototype.type = "BLOCK";
BaseBlock.prototype.tag = "BaseBlock";
BaseBlock.prototype.menuIcon = 'span.mdi.mdi-cube-outline';
BaseBlock.prototype.attributeHandlers.tag = {
  get: function () {
    return this.tag;
  },
  descriptor: function () {
    return {
      type: 'const',
      value: this.tag
    };
  },
  export: function () {
    return undefined;
  }
};
BaseBlock.prototype.attributeHandlers.id = {
  set: function (value) {
    if (!value) value = (0, _stringGenerate.randomIdent)(16);
    this.id = value + '';
  },
  get: function () {
    return this.id;
  },
  descriptor: function () {
    return {
      type: 'const',
      value: this.id
    };
  }
};
BaseBlock.prototype.attributeHandlers.displayName = {
  set: function (value) {
    value = value || '';
    value += '';
    return value;
  },
  descriptor: {
    type: 'text',
    displayName: "Name"
  },
  export: function (ref) {
    return ref.get() || undefined;
  }
};
BaseBlock.prototype.attributeHandlers.permissions = {
  descriptor: function () {
    return {
      type: 'Permission',
      hidden: !window['FORM_DEV_MODE']
    };
  },
  export: function (ref) {
    var per = ref.get() || undefined;
    if (per && Object.keys(per).length > 0) return per;
    return undefined;
  }
};

BaseBlock.prototype.onCreate = function () {
  this.constructor.count = this.constructor.count || 0;
  this.attributes.displayName = '';
  this.attributes.name = this.tag + "_" + this.constructor.count++;
};

BaseBlock.prototype.onCreated = _noop.default;
BaseBlock.prototype.onAttached = _noop.default;

BaseBlock.prototype.getData = function () {
  var data = {
    tag: this.tag
  };
  var key;
  var attributes = this.attributes.export();

  for (key in attributes) {
    data.attributes = attributes;
    break;
  }

  return data;
};

BaseBlock.prototype.setAttributes = function (attributes) {
  Object.assign(this.attributes, attributes);
};

BaseBlock.prototype.pinOutCountOf = function (pinName) {
  if (!this.__cc_listener__[pinName]) return 0;
  return this.__cc_listener__[pinName].length;
};

var _default = BaseBlock;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/BaseComponent.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/BaseComponent.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _FViewable = _interopRequireDefault(require("./FViewable"));

var _FNode = _interopRequireWildcard(require("./FNode"));

var _FModel = _interopRequireDefault(require("./FModel"));

var _PluginManager = _interopRequireDefault(require("./PluginManager"));

var _FormEditorPreconfig = _interopRequireDefault(require("../FormEditorPreconfig"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _utils = require("./utils");

var _CCBlock = _interopRequireDefault(require("absol/src/AppPattern/circuit/CCBlock"));

var _inheritComponentClass = _interopRequireDefault(require("./inheritComponentClass"));

var _BaseBlock = _interopRequireDefault(require("./BaseBlock"));

var _FAttributes = _interopRequireDefault(require("./FAttributes"));

var _IndexedPropertyNames = _interopRequireDefault(require("./IndexedPropertyNames"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




var extendAttributeNames = Object.keys(_FormEditorPreconfig.default.extendAttributes);
/***
 * @constructor
 * @augments EventEmitter
 * @augments FViewable
 * @augments FNode
 * @augments BaseBlock
 */

function BaseComponent() {
  _EventEmitter.default.call(this);

  _FViewable.default.call(this);

  _FNode.default.call(this);

  _FModel.default.call(this);

  _CCBlock.default.call(this, {
    id: (0, _utils.randomUniqueIdent)()
  });
  /***
   *
   * @type {FmFragment}
   */


  this.fragment = null;
  this.onCreate();
  /***
   * @type {AElement}
   */

  this.domElt = this.render();
  this.domElt.fmComponent = this;
  this.view.classList.add(this.BASE_COMPONENT_CLASS_NAME);
  this.onDomCreated();
  this.attributes.loadAttributeHandlers(this.attributeHandlers);
  this.style.loadAttributeHandlers(this.styleHandlers);
  this.events = new _FAttributes.default(this);
  this.dataBindingDescriptor = this.createDataBindingDescriptor();
  this.compiledEvents = {};
  this.onCreated();
}

(0, _inheritComponentClass.default)(BaseComponent, _FViewable.default, _FNode.default, _BaseBlock.default);
extendAttributeNames.forEach(function (name) {
  var prototypeConfig = _FormEditorPreconfig.default.extendAttributes[name];
  if (prototypeConfig.setValue) BaseComponent.prototype['setAttribute' + name.substr(0, 1).toUpperCase() + name.substr(1)] = prototypeConfig.setValue;
  if (prototypeConfig.getValue) BaseComponent.prototype['getAttribute' + name.substr(0, 1).toUpperCase() + name.substr(1)] = prototypeConfig.getValue;
  if (prototypeConfig.getDescriptor) BaseComponent.prototype['getAttribute' + name.substr(0, 1).toUpperCase() + name.substr(1) + 'Descriptor'] = prototypeConfig.getDescriptor;else console.console.error('FormEditorPreconfig.extendAttributes["' + name + '"] must contains getDescriptor function');
});
BaseComponent.prototype.type = "COMPONENT";
BaseComponent.prototype.tag = "BaseComponent";
BaseComponent.prototype.menuIcon = "span.mdi.mdi-package-variant-closed";
BaseComponent.prototype.BASE_COMPONENT_CLASS_NAME = 'as-base-component';
BaseComponent.prototype.anchor = null;
BaseComponent.prototype.isLayout = false;
BaseComponent.prototype.attributeHandlers.id = {
  set: function (value) {
    if (!value) value = (0, _stringGenerate.randomIdent)(16);
    this.id = value + '';
  },
  get: function () {
    return this.id;
  },
  descriptor: function () {
    return {
      type: 'const',
      value: this.id,
      hidden: true
    };
  }
};
BaseComponent.prototype.attributeHandlers.permissions = _BaseBlock.default.prototype.attributeHandlers.permissions;
BaseComponent.prototype.attributeHandlers.name = {
  set: function (value) {
    var ref = arguments[arguments.length - 1];
    var prev = ref.get();
    value = value || (0, _utils.randomUniqueIdent)();
    value = value + '';
    this.domElt.attr('data-fm-name', value);
    if (value) this.domElt.attr('data-tutor-id', value);
    if (value !== prev) this.unbindDataInFragment();
    ref.set(value);
    this.bindDataToFragment();
    return value;
  },
  descriptor: function () {
    var root = this;

    while (root.parent && !root.formType) {
      root = root.parent;
    }

    var names = {};
    var self = this;

    function visit(node) {
      if (node !== self) {
        names[node.attributes.name] = node;
      }

      node.children.forEach(visit);
    }

    visit(root);
    return {
      type: 'uniqueText',
      others: names,
      regex: /^[a-zA-Z_0-9]$/,
      displayName: "ID"
    };
  }
};
BaseComponent.prototype.attributeHandlers.tooltip = {
  set: function (value) {
    if (!value) this.domElt.attr('title', undefined);else this.domElt.title = value;
  },
  get: function () {
    return this.domElt.title;
  },
  descriptor: {
    type: 'text',
    long: true
  },
  export: function () {
    return this.domElt.title || undefined;
  }
};
BaseComponent.prototype.attributeHandlers.disembark = {
  set: function (value, ref) {
    var prev = ref.get();
    if (value !== false || value === 'false') value = true;else value = false;
    ref.set(value);
    this.updateEmbark();

    if (prev !== value) {
      this.notifyChange();
    }

    return value;
  },
  export: function (ref) {
    var value = ref.get();
    if (!value) return undefined;
    return !!value;
  },
  descriptor: {
    type: 'bool'
  }
};
BaseComponent.prototype.attributeHandlers.dataBinding = {
  set: function (value) {
    var ref = arguments[arguments.length - 1];
    value = !!value;
    ref.set(value);

    if (value) {
      this.bindDataToFragment();
    } else {
      this.unbindDataInFragment();
    }

    return value;
  },
  descriptor: {
    type: 'bool'
  }
};
BaseComponent.prototype.pinHandlers.attributes = {
  receives: function (value) {
    if (typeof value === "object") {
      Object.assign(this.attributes, value);
    }
  },
  descriptor: {
    type: 'object'
  }
};
BaseComponent.prototype.pinHandlers.style = {
  receives: function (value) {
    if (typeof value === "object") {
      Object.assign(this.style, value);
    }
  },
  descriptor: {
    type: 'object'
  }
};
BaseComponent.prototype.pinHandlers.disembark = {
  receives: function (value) {
    this.attributes.disembark = !!value;
  },
  descriptor: {
    type: 'bool'
  }
};
BaseComponent.prototype.pinHandlers.embark = {
  receives: function (value) {
    this.attributes.disembark = !value;
  },
  descriptor: {
    type: 'bool'
  }
};
BaseComponent.prototype.pinHandlers.display = {
  receives: function (value) {
    this.style.hidden = !value;
  },
  descriptor: {
    type: 'bool'
  }
};
BaseComponent.prototype.pinHandlers.hidden = {
  receives: function (value) {
    this.style.hidden = !!value;
  },
  descriptor: {
    type: 'bool'
  }
};

BaseComponent.prototype.onCreate = function () {
  this.constructor.count = this.constructor.count || 0;
  this.attributes.displayName = '';
  this.attributes.name = this.tag + "_" + this.constructor.count++;
  this.attributes.disembark = false;
  this.attributes.dataBinding = true;
  var self = this;
  extendAttributeNames.forEach(function (name) {
    var func = _FormEditorPreconfig.default.extendAttributes[name].getDefault;
    if (func) self.attributes[name] = func.call(self);
  });
};

BaseComponent.prototype.onCreated = _noop.default;
BaseComponent.prototype.onAnchorAttached = _noop.default;
BaseComponent.prototype.onAnchorDetached = _noop.default;
BaseComponent.prototype.onAttached = _noop.default;
BaseComponent.prototype.onFragmentAttached = _noop.default;

BaseComponent.prototype.onStart = function () {
  if (this.pinHandlers.value) this.pinFire('value');
};

BaseComponent.prototype.getData = function () {
  var self = this;
  var data = {
    tag: this.tag
  };
  var key;
  var attributes = this.attributes.export();

  for (key in attributes) {
    data.attributes = attributes;
    break;
  }

  var style = this.style.export();

  for (key in attributes) {
    data.style = style;
    break;
  }

  var eventsKeys = Object.keys(this.events).filter(function (key) {
    return self.events[key] !== undefined || self.events[key] !== null;
  });

  if (eventsKeys.length > 0) {
    data.events = eventsKeys.reduce(function (ac, key) {
      ac[key] = self.events[key];
      return ac;
    }, {});
  }

  if (this.children.length > 0) {
    data.children = this.children.map(function (child) {
      if (child.isFragmentView) {
        var childStyle = child.style.export();
        var childAttributes = child.attributes.export();
        var childData = {
          class: child.fragment.tag
        };

        for (key in childStyle) {
          childData.style = childStyle;
          break;
        }

        for (key in childAttributes) {
          childData.attributes = childAttributes;
          break;
        }

        return childData;
      } else {
        return child.getData();
      }
    });
  }

  return data;
};

BaseComponent.prototype.fire = function (name) {
  _EventEmitter.default.prototype.fire.apply(this, arguments);

  if (this.events[name]) {
    _PluginManager.default.exec(this, 'EXEC_SCRIPT', this.events[name], Array.prototype.slice.call(arguments, 1));
  }

  return this;
};

BaseComponent.prototype.setEvents = function (events) {
  for (var name in events) {
    this.setEvent(name, events[name]);
  }
};

BaseComponent.prototype.setAttributes = function (attributes) {
  Object.assign(this.attributes, attributes);
};

BaseComponent.prototype.setStyles = function (styles) {
  Object.assign(this.style, styles);
};

BaseComponent.prototype.setEvent = function (key, value) {
  if (value === undefined) {
    delete this.events[key];
  } else this.events[key] = value;

  return value;
};

BaseComponent.prototype.getAcceptsStyleNames = function () {
  var dict = Object.assign({}, this.styleHandlers);
  if (this.anchor) Object.assign(dict, this.anchor.styleHandlers);
  var names = Object.keys(dict);
  var indexed = _IndexedPropertyNames.default;
  names.sort(function (a, b) {
    return indexed[a] - indexed[b];
  });
  return names;
};

BaseComponent.prototype.measureMinSize = function () {
  return {
    width: 0,
    height: 0
  };
};
/**
 * @param {String} name
 * @returns {}
 */


BaseComponent.prototype.getEventDescriptor = function (name) {
  return {
    type: 'function'
  };
};

BaseComponent.prototype.getAttributeDataBindingDescriptor = function () {
  return {
    type: 'bool',
    value: !!this.attributes.dataBinding,
    default: true
  };
};
/****
 *
 * @param value
 * @param {"%"|"px"|null}unit
 * @param {"width"|"height"} by
 * @param {string=} targetUnit
 */


BaseComponent.prototype.implicitMeasureSizeValue = function (value, unit, by, targetUnit) {
  var parentElement = this.parent ? this.parent.domElt : this.domElt.parentElement;
  var byMS = (0, _utils.parseMeasureValue)(this.style[by]) || {
    value: 'auto',
    unit: null
  };
  if (targetUnit === undefined) targetUnit = byMS.unit;
  var newValue;
  var parsedNew;

  if (value === 'match_parent') {
    newValue = 'match_parent';
  } else if (value === 'auto') {
    newValue = 'auto';
  } else if (unit) {
    //need convert
    value = parseFloat(value) || 0;

    if (targetUnit === '%') {
      if (unit === 'px') {
        newValue = value * 100 / parentElement.getBoundingClientRect()[by] + '%';
      } else if (unit === '%') {
        newValue = value + '%';
      }
    } else if (targetUnit === 'px') {
      if (unit === '%') {
        newValue = value / 100 * parentElement.getBoundingClientRect()[by];
      } else if (unit === 'px') {
        newValue = value;
      }
    } else {
      newValue = 'auto';
    }
  } else {
    parsedNew = (0, _utils.parseMeasureValue)(value) || {
      value: "auto",
      unit: null
    };
    newValue = parsedNew.unit === 'px' ? parsedNew.value || 0 : parsedNew.value + (parsedNew.unit || '');
  }

  return newValue;
};
/****
 *
 * @param value
 * @param {"%"|"px"|null}unit
 * @param {"width"|"height"} by
 * @returns {string|*|number|number}
 */


BaseComponent.prototype.explicitMeasureSizeValue = function (value, unit, by) {
  var parentElement = this.parent ? this.parent.domElt : this.domElt.parentElement;
  var current = (0, _utils.parseMeasureValue)(value) || {
    value: 'auto',
    unit: null
  };

  if (unit) {
    if (unit === 'px') {
      if (current.unit === 'px') {
        return current.value || 0;
      } else if (current.unit === '%') {
        return parentElement.getBoundingClientRect()[by] * (current.value || 0) / 100;
      } else {
        return parentElement.getBoundingClientRect()[by];
      }
    } else if (unit === '%') {
      if (current.unit === '%') {
        return current.value || 0;
      } else {
        return this.domElt.getBoundingClientRect()[by] * 100 / parentElement.getBoundingClientRect()[by];
      }
    }
  }

  return value;
};

BaseComponent.prototype.styleHandlers.width = {
  set: function (value) {
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var ref = arguments[arguments.length - 1];
    var newValue = this.implicitMeasureSizeValue(value, unit, 'width');
    var styleValue = newValue;
    if (newValue === 'match_parent') styleValue = '100%';
    if (typeof newValue == "number") this.domElt.addStyle('width', styleValue + 'px');else this.domElt.addStyle('width', styleValue);
    ref.set(newValue);
    this.onSizeChange();
    return newValue;
  },
  get: function () {
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var ref = arguments[arguments.length - 1];
    return this.explicitMeasureSizeValue(ref.get(), unit, 'width');
  },
  descriptor: {
    type: 'measureSize'
  }
};
BaseComponent.prototype.styleHandlers.height = {
  set: function (value) {
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var ref = arguments[arguments.length - 1];
    var newValue = this.implicitMeasureSizeValue(value, unit, 'height');
    var styleValue = newValue;
    if (newValue === 'match_parent') styleValue = '100%';
    if (typeof newValue == "number") this.domElt.addStyle('height', styleValue + 'px');else this.domElt.addStyle('height', styleValue);
    ref.set(newValue);
    this.onSizeChange();
    return newValue;
  },
  get: function () {
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var ref = arguments[arguments.length - 1];
    return this.explicitMeasureSizeValue(ref.get(), unit, 'height');
  },
  descriptor: {
    type: 'measureSize'
  }
};
BaseComponent.prototype.onSizeChange = _noop.default;
BaseComponent.prototype.styleHandlers.hidden = {
  set: function (value) {
    value = !!value;
    if (value) this.domElt.addClass('as-display-hidden');else this.domElt.removeClass('as-display-hidden');
    return value;
  },
  descriptor: {
    type: 'boolean'
  }
};

BaseComponent.prototype.updateEmbarkStyle = function () {
  var disembark = this.attributes.disembark;

  if (disembark) {
    if (this.anchor) {
      this.anchor.domElt.addClass('as-disembark');
      this.domElt.removeClass('as-disembark');
    } else {
      this.domElt.addClass('as-disembark');
    }
  } else {
    this.domElt.removeClass('as-disembark');
    if (this.anchor) this.anchor.domElt.removeClass('as-disembark');
  }
};

BaseComponent.prototype.updateEmbark = function () {
  var disembark = this.attributes.disembark;
  this.updateEmbarkStyle();
  if (!this.fragment || !this.fragment.view) return;
  var parent = this.parent;

  while (parent && !parent.isFragmentView) {
    if (parent.attributes.disembark) break;
    parent = parent.parent;
  }

  if (parent && !parent.isFragmentView) return;
  var fragment = this.fragment;
  (0, _FNode.traversal)(this, function (path) {
    var node = path.node;
    var pDE = path.path.some(function (node) {
      return node.attributes.disembark;
    });
    node.updateEmbarkStyle();
    node.bindDataToFragment(disembark || pDE, true);

    if (node.fragment !== fragment) {
      path.skipChildren();
    }
  });

  _ResizeSystem.default.requestUpdateSignal();
};

BaseComponent.prototype.createDataBindingDescriptor = function () {};
/***
 *
 * @param {boolean=} parentDisembark
 * @param {boolean=} reset
 */


BaseComponent.prototype.bindDataToFragment = function (parentDisembark, reset) {
  if (!this.fragment) return;
  var name = this.attributes.name;
  if (!name) return;
  var boundProp = this.fragment.boundProps[name];
  if (boundProp === this && !reset) return;
  var descriptor = this.dataBindingDescriptor;
  if (!descriptor) return;
  if (!this.attributes.dataBinding) return;
  var obj = this.fragment._props;
  Object.assign(descriptor, {
    enumerable: !this.attributes.disembark && !parentDisembark,
    configurable: true
  });
  Object.defineProperty(obj, name, descriptor);
  this.fragment.boundProps[name] = this;
};

BaseComponent.prototype.unbindDataInFragment = function () {
  if (!this.fragment) return;
  var name = this.attributes.name;
  if (!name) return;
  var boundProp = this.fragment.boundProps[name];
  if (boundProp !== this) return;
  var obj = this.fragment._props;
  delete obj[name];
  delete this.fragment.boundProps[name];
};
/***
 * @param {*=} data
 */


BaseComponent.prototype.notifyChange = function (data) {
  this.emit('change', Object.assign({
    type: 'change'
  }, data || {}), this);
  var bounded;

  if (this.attributes.dataBinding && this.fragment) {
    bounded = this.fragment.boundProps[this.attributes.name];

    if (bounded) {
      if (bounded === this || bounded.indexOf && bounded.indexOf(this) >= 0) {
        this.fragment.notifyPropsChange({
          name: this.attributes.name
        });
      }
    }
  }
};

Object.defineProperty(BaseComponent.prototype, 'view', {
  get: function () {
    return this.domElt;
  }
});
Object.defineProperty(BaseComponent.prototype, 'isFragmentView', {
  get: function () {
    return this.fragment && this.fragment.view === this;
  }
});
var _default = BaseComponent;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/ScalableComponent.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/ScalableComponent.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseComponent = _interopRequireDefault(require("../core/BaseComponent"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _inheritComponentClass = _interopRequireDefault(require("./inheritComponentClass"));


var _ = _FCore.default._;
/***
 * @extends BaseComponent
 * @constructor
 */

function ScalableComponent() {
  _BaseComponent.default.call(this);
}

(0, _inheritComponentClass.default)(ScalableComponent, _BaseComponent.default);
ScalableComponent.prototype.tag = "ScalableComponent";
ScalableComponent.prototype.SUPPORT_STYLE_NAMES = ['width', 'height', 'top', 'left', 'right', 'top', 'bottom'];

ScalableComponent.prototype.onCreate = function () {
  _BaseComponent.default.prototype.onCreate.call(this);

  var minSize = this.measureMinSize();
  this.style.height = this.style.height || minSize && minSize.height || 30;
  this.style.width = this.style.width || minSize && minSize.width || 69;
};

var _default = ScalableComponent;
exports.default = _default;
};

moduleFactories["node_modules/showdown/dist/showdown.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/showdown/dist/showdown.js ***/
"use strict";

;
/*! showdown v 1.9.1 - 02-11-2019 */

(function () {
  /**
   * Created by Tivie on 13-07-2015.
   */
  function getDefaultOpts(simple) {
    'use strict';

    var defaultOptions = {
      omitExtraWLInCodeBlocks: {
        defaultValue: false,
        describe: 'Omit the default extra whiteline added to code blocks',
        type: 'boolean'
      },
      noHeaderId: {
        defaultValue: false,
        describe: 'Turn on/off generated header id',
        type: 'boolean'
      },
      prefixHeaderId: {
        defaultValue: false,
        describe: 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \'section-\' prefix',
        type: 'string'
      },
      rawPrefixHeaderId: {
        defaultValue: false,
        describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',
        type: 'boolean'
      },
      ghCompatibleHeaderId: {
        defaultValue: false,
        describe: 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)',
        type: 'boolean'
      },
      rawHeaderId: {
        defaultValue: false,
        describe: 'Remove only spaces, \' and " from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids',
        type: 'boolean'
      },
      headerLevelStart: {
        defaultValue: false,
        describe: 'The header blocks level start',
        type: 'integer'
      },
      parseImgDimensions: {
        defaultValue: false,
        describe: 'Turn on/off image dimension parsing',
        type: 'boolean'
      },
      simplifiedAutoLink: {
        defaultValue: false,
        describe: 'Turn on/off GFM autolink style',
        type: 'boolean'
      },
      excludeTrailingPunctuationFromURLs: {
        defaultValue: false,
        describe: 'Excludes trailing punctuation from links generated with autoLinking',
        type: 'boolean'
      },
      literalMidWordUnderscores: {
        defaultValue: false,
        describe: 'Parse midword underscores as literal underscores',
        type: 'boolean'
      },
      literalMidWordAsterisks: {
        defaultValue: false,
        describe: 'Parse midword asterisks as literal asterisks',
        type: 'boolean'
      },
      strikethrough: {
        defaultValue: false,
        describe: 'Turn on/off strikethrough support',
        type: 'boolean'
      },
      tables: {
        defaultValue: false,
        describe: 'Turn on/off tables support',
        type: 'boolean'
      },
      tablesHeaderId: {
        defaultValue: false,
        describe: 'Add an id to table headers',
        type: 'boolean'
      },
      ghCodeBlocks: {
        defaultValue: true,
        describe: 'Turn on/off GFM fenced code blocks support',
        type: 'boolean'
      },
      tasklists: {
        defaultValue: false,
        describe: 'Turn on/off GFM tasklist support',
        type: 'boolean'
      },
      smoothLivePreview: {
        defaultValue: false,
        describe: 'Prevents weird effects in live previews due to incomplete input',
        type: 'boolean'
      },
      smartIndentationFix: {
        defaultValue: false,
        description: 'Tries to smartly fix indentation in es6 strings',
        type: 'boolean'
      },
      disableForced4SpacesIndentedSublists: {
        defaultValue: false,
        description: 'Disables the requirement of indenting nested sublists by 4 spaces',
        type: 'boolean'
      },
      simpleLineBreaks: {
        defaultValue: false,
        description: 'Parses simple line breaks as <br> (GFM Style)',
        type: 'boolean'
      },
      requireSpaceBeforeHeadingText: {
        defaultValue: false,
        description: 'Makes adding a space between `#` and the header text mandatory (GFM Style)',
        type: 'boolean'
      },
      ghMentions: {
        defaultValue: false,
        description: 'Enables github @mentions',
        type: 'boolean'
      },
      ghMentionsLink: {
        defaultValue: 'https://github.com/{u}',
        description: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.',
        type: 'string'
      },
      encodeEmails: {
        defaultValue: true,
        description: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities',
        type: 'boolean'
      },
      openLinksInNewWindow: {
        defaultValue: false,
        description: 'Open all links in new windows',
        type: 'boolean'
      },
      backslashEscapesHTMLTags: {
        defaultValue: false,
        description: 'Support for HTML Tag escaping. ex: \<div>foo\</div>',
        type: 'boolean'
      },
      emoji: {
        defaultValue: false,
        description: 'Enable emoji support. Ex: `this is a :smile: emoji`',
        type: 'boolean'
      },
      underline: {
        defaultValue: false,
        description: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `<em>` and `<strong>`',
        type: 'boolean'
      },
      completeHTMLDocument: {
        defaultValue: false,
        description: 'Outputs a complete html document, including `<html>`, `<head>` and `<body>` tags',
        type: 'boolean'
      },
      metadata: {
        defaultValue: false,
        description: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).',
        type: 'boolean'
      },
      splitAdjacentBlockquotes: {
        defaultValue: false,
        description: 'Split adjacent blockquote blocks',
        type: 'boolean'
      }
    };

    if (simple === false) {
      return JSON.parse(JSON.stringify(defaultOptions));
    }

    var ret = {};

    for (var opt in defaultOptions) {
      if (defaultOptions.hasOwnProperty(opt)) {
        ret[opt] = defaultOptions[opt].defaultValue;
      }
    }

    return ret;
  }

  function allOptionsOn() {
    'use strict';

    var options = getDefaultOpts(true),
        ret = {};

    for (var opt in options) {
      if (options.hasOwnProperty(opt)) {
        ret[opt] = true;
      }
    }

    return ret;
  }
  /**
   * Created by Tivie on 06-01-2015.
   */
  // Private properties


  var showdown = {},
      parsers = {},
      extensions = {},
      globalOptions = getDefaultOpts(true),
      setFlavor = 'vanilla',
      flavor = {
    github: {
      omitExtraWLInCodeBlocks: true,
      simplifiedAutoLink: true,
      excludeTrailingPunctuationFromURLs: true,
      literalMidWordUnderscores: true,
      strikethrough: true,
      tables: true,
      tablesHeaderId: true,
      ghCodeBlocks: true,
      tasklists: true,
      disableForced4SpacesIndentedSublists: true,
      simpleLineBreaks: true,
      requireSpaceBeforeHeadingText: true,
      ghCompatibleHeaderId: true,
      ghMentions: true,
      backslashEscapesHTMLTags: true,
      emoji: true,
      splitAdjacentBlockquotes: true
    },
    original: {
      noHeaderId: true,
      ghCodeBlocks: false
    },
    ghost: {
      omitExtraWLInCodeBlocks: true,
      parseImgDimensions: true,
      simplifiedAutoLink: true,
      excludeTrailingPunctuationFromURLs: true,
      literalMidWordUnderscores: true,
      strikethrough: true,
      tables: true,
      tablesHeaderId: true,
      ghCodeBlocks: true,
      tasklists: true,
      smoothLivePreview: true,
      simpleLineBreaks: true,
      requireSpaceBeforeHeadingText: true,
      ghMentions: false,
      encodeEmails: true
    },
    vanilla: getDefaultOpts(true),
    allOn: allOptionsOn()
  };
  /**
   * helper namespace
   * @type {{}}
   */

  showdown.helper = {};
  /**
   * TODO LEGACY SUPPORT CODE
   * @type {{}}
   */

  showdown.extensions = {};
  /**
   * Set a global option
   * @static
   * @param {string} key
   * @param {*} value
   * @returns {showdown}
   */

  showdown.setOption = function (key, value) {
    'use strict';

    globalOptions[key] = value;
    return this;
  };
  /**
   * Get a global option
   * @static
   * @param {string} key
   * @returns {*}
   */


  showdown.getOption = function (key) {
    'use strict';

    return globalOptions[key];
  };
  /**
   * Get the global options
   * @static
   * @returns {{}}
   */


  showdown.getOptions = function () {
    'use strict';

    return globalOptions;
  };
  /**
   * Reset global options to the default values
   * @static
   */


  showdown.resetOptions = function () {
    'use strict';

    globalOptions = getDefaultOpts(true);
  };
  /**
   * Set the flavor showdown should use as default
   * @param {string} name
   */


  showdown.setFlavor = function (name) {
    'use strict';

    if (!flavor.hasOwnProperty(name)) {
      throw Error(name + ' flavor was not found');
    }

    showdown.resetOptions();
    var preset = flavor[name];
    setFlavor = name;

    for (var option in preset) {
      if (preset.hasOwnProperty(option)) {
        globalOptions[option] = preset[option];
      }
    }
  };
  /**
   * Get the currently set flavor
   * @returns {string}
   */


  showdown.getFlavor = function () {
    'use strict';

    return setFlavor;
  };
  /**
   * Get the options of a specified flavor. Returns undefined if the flavor was not found
   * @param {string} name Name of the flavor
   * @returns {{}|undefined}
   */


  showdown.getFlavorOptions = function (name) {
    'use strict';

    if (flavor.hasOwnProperty(name)) {
      return flavor[name];
    }
  };
  /**
   * Get the default options
   * @static
   * @param {boolean} [simple=true]
   * @returns {{}}
   */


  showdown.getDefaultOptions = function (simple) {
    'use strict';

    return getDefaultOpts(simple);
  };
  /**
   * Get or set a subParser
   *
   * subParser(name)       - Get a registered subParser
   * subParser(name, func) - Register a subParser
   * @static
   * @param {string} name
   * @param {function} [func]
   * @returns {*}
   */


  showdown.subParser = function (name, func) {
    'use strict';

    if (showdown.helper.isString(name)) {
      if (typeof func !== 'undefined') {
        parsers[name] = func;
      } else {
        if (parsers.hasOwnProperty(name)) {
          return parsers[name];
        } else {
          throw Error('SubParser named ' + name + ' not registered!');
        }
      }
    }
  };
  /**
   * Gets or registers an extension
   * @static
   * @param {string} name
   * @param {object|function=} ext
   * @returns {*}
   */


  showdown.extension = function (name, ext) {
    'use strict';

    if (!showdown.helper.isString(name)) {
      throw Error('Extension \'name\' must be a string');
    }

    name = showdown.helper.stdExtName(name); // Getter

    if (showdown.helper.isUndefined(ext)) {
      if (!extensions.hasOwnProperty(name)) {
        throw Error('Extension named ' + name + ' is not registered!');
      }

      return extensions[name]; // Setter
    } else {
      // Expand extension if it's wrapped in a function
      if (typeof ext === 'function') {
        ext = ext();
      } // Ensure extension is an array


      if (!showdown.helper.isArray(ext)) {
        ext = [ext];
      }

      var validExtension = validate(ext, name);

      if (validExtension.valid) {
        extensions[name] = ext;
      } else {
        throw Error(validExtension.error);
      }
    }
  };
  /**
   * Gets all extensions registered
   * @returns {{}}
   */


  showdown.getAllExtensions = function () {
    'use strict';

    return extensions;
  };
  /**
   * Remove an extension
   * @param {string} name
   */


  showdown.removeExtension = function (name) {
    'use strict';

    delete extensions[name];
  };
  /**
   * Removes all extensions
   */


  showdown.resetExtensions = function () {
    'use strict';

    extensions = {};
  };
  /**
   * Validate extension
   * @param {array} extension
   * @param {string} name
   * @returns {{valid: boolean, error: string}}
   */


  function validate(extension, name) {
    'use strict';

    var errMsg = name ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',
        ret = {
      valid: true,
      error: ''
    };

    if (!showdown.helper.isArray(extension)) {
      extension = [extension];
    }

    for (var i = 0; i < extension.length; ++i) {
      var baseMsg = errMsg + ' sub-extension ' + i + ': ',
          ext = extension[i];

      if (typeof ext !== 'object') {
        ret.valid = false;
        ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';
        return ret;
      }

      if (!showdown.helper.isString(ext.type)) {
        ret.valid = false;
        ret.error = baseMsg + 'property "type" must be a string, but ' + typeof ext.type + ' given';
        return ret;
      }

      var type = ext.type = ext.type.toLowerCase(); // normalize extension type

      if (type === 'language') {
        type = ext.type = 'lang';
      }

      if (type === 'html') {
        type = ext.type = 'output';
      }

      if (type !== 'lang' && type !== 'output' && type !== 'listener') {
        ret.valid = false;
        ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: "lang/language", "output/html" or "listener"';
        return ret;
      }

      if (type === 'listener') {
        if (showdown.helper.isUndefined(ext.listeners)) {
          ret.valid = false;
          ret.error = baseMsg + '. Extensions of type "listener" must have a property called "listeners"';
          return ret;
        }
      } else {
        if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {
          ret.valid = false;
          ret.error = baseMsg + type + ' extensions must define either a "regex" property or a "filter" method';
          return ret;
        }
      }

      if (ext.listeners) {
        if (typeof ext.listeners !== 'object') {
          ret.valid = false;
          ret.error = baseMsg + '"listeners" property must be an object but ' + typeof ext.listeners + ' given';
          return ret;
        }

        for (var ln in ext.listeners) {
          if (ext.listeners.hasOwnProperty(ln)) {
            if (typeof ext.listeners[ln] !== 'function') {
              ret.valid = false;
              ret.error = baseMsg + '"listeners" property must be an hash of [event name]: [callback]. listeners.' + ln + ' must be a function but ' + typeof ext.listeners[ln] + ' given';
              return ret;
            }
          }
        }
      }

      if (ext.filter) {
        if (typeof ext.filter !== 'function') {
          ret.valid = false;
          ret.error = baseMsg + '"filter" must be a function, but ' + typeof ext.filter + ' given';
          return ret;
        }
      } else if (ext.regex) {
        if (showdown.helper.isString(ext.regex)) {
          ext.regex = new RegExp(ext.regex, 'g');
        }

        if (!(ext.regex instanceof RegExp)) {
          ret.valid = false;
          ret.error = baseMsg + '"regex" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';
          return ret;
        }

        if (showdown.helper.isUndefined(ext.replace)) {
          ret.valid = false;
          ret.error = baseMsg + '"regex" extensions must implement a replace string or function';
          return ret;
        }
      }
    }

    return ret;
  }
  /**
   * Validate extension
   * @param {object} ext
   * @returns {boolean}
   */


  showdown.validateExtension = function (ext) {
    'use strict';

    var validateExtension = validate(ext, null);

    if (!validateExtension.valid) {
      console.warn(validateExtension.error);
      return false;
    }

    return true;
  };
  /**
   * showdownjs helper functions
   */


  if (!showdown.hasOwnProperty('helper')) {
    showdown.helper = {};
  }
  /**
   * Check if var is string
   * @static
   * @param {string} a
   * @returns {boolean}
   */


  showdown.helper.isString = function (a) {
    'use strict';

    return typeof a === 'string' || a instanceof String;
  };
  /**
   * Check if var is a function
   * @static
   * @param {*} a
   * @returns {boolean}
   */


  showdown.helper.isFunction = function (a) {
    'use strict';

    var getType = {};
    return a && getType.toString.call(a) === '[object Function]';
  };
  /**
   * isArray helper function
   * @static
   * @param {*} a
   * @returns {boolean}
   */


  showdown.helper.isArray = function (a) {
    'use strict';

    return Array.isArray(a);
  };
  /**
   * Check if value is undefined
   * @static
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
   */


  showdown.helper.isUndefined = function (value) {
    'use strict';

    return typeof value === 'undefined';
  };
  /**
   * ForEach helper function
   * Iterates over Arrays and Objects (own properties only)
   * @static
   * @param {*} obj
   * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object
   */


  showdown.helper.forEach = function (obj, callback) {
    'use strict'; // check if obj is defined

    if (showdown.helper.isUndefined(obj)) {
      throw new Error('obj param is required');
    }

    if (showdown.helper.isUndefined(callback)) {
      throw new Error('callback param is required');
    }

    if (!showdown.helper.isFunction(callback)) {
      throw new Error('callback param must be a function/closure');
    }

    if (typeof obj.forEach === 'function') {
      obj.forEach(callback);
    } else if (showdown.helper.isArray(obj)) {
      for (var i = 0; i < obj.length; i++) {
        callback(obj[i], i, obj);
      }
    } else if (typeof obj === 'object') {
      for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
          callback(obj[prop], prop, obj);
        }
      }
    } else {
      throw new Error('obj does not seem to be an array or an iterable object');
    }
  };
  /**
   * Standardidize extension name
   * @static
   * @param {string} s extension name
   * @returns {string}
   */


  showdown.helper.stdExtName = function (s) {
    'use strict';

    return s.replace(/[_?*+\/\\.^-]/g, '').replace(/\s/g, '').toLowerCase();
  };

  function escapeCharactersCallback(wholeMatch, m1) {
    'use strict';

    var charCodeToEscape = m1.charCodeAt(0);
    return '¨E' + charCodeToEscape + 'E';
  }
  /**
   * Callback used to escape characters when passing through String.replace
   * @static
   * @param {string} wholeMatch
   * @param {string} m1
   * @returns {string}
   */


  showdown.helper.escapeCharactersCallback = escapeCharactersCallback;
  /**
   * Escape characters in a string
   * @static
   * @param {string} text
   * @param {string} charsToEscape
   * @param {boolean} afterBackslash
   * @returns {XML|string|void|*}
   */

  showdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) {
    'use strict'; // First we have to escape the escape characters so that
    // we can build a character class out of them

    var regexString = '([' + charsToEscape.replace(/([\[\]\\])/g, '\\$1') + '])';

    if (afterBackslash) {
      regexString = '\\\\' + regexString;
    }

    var regex = new RegExp(regexString, 'g');
    text = text.replace(regex, escapeCharactersCallback);
    return text;
  };
  /**
   * Unescape HTML entities
   * @param txt
   * @returns {string}
   */


  showdown.helper.unescapeHTMLEntities = function (txt) {
    'use strict';

    return txt.replace(/&quot;/g, '"').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&');
  };

  var rgxFindMatchPos = function (str, left, right, flags) {
    'use strict';

    var f = flags || '',
        g = f.indexOf('g') > -1,
        x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),
        l = new RegExp(left, f.replace(/g/g, '')),
        pos = [],
        t,
        s,
        m,
        start,
        end;

    do {
      t = 0;

      while (m = x.exec(str)) {
        if (l.test(m[0])) {
          if (!t++) {
            s = x.lastIndex;
            start = s - m[0].length;
          }
        } else if (t) {
          if (! --t) {
            end = m.index + m[0].length;
            var obj = {
              left: {
                start: start,
                end: s
              },
              match: {
                start: s,
                end: m.index
              },
              right: {
                start: m.index,
                end: end
              },
              wholeMatch: {
                start: start,
                end: end
              }
            };
            pos.push(obj);

            if (!g) {
              return pos;
            }
          }
        }
      }
    } while (t && (x.lastIndex = s));

    return pos;
  };
  /**
   * matchRecursiveRegExp
   *
   * (c) 2007 Steven Levithan <stevenlevithan.com>
   * MIT License
   *
   * Accepts a string to search, a left and right format delimiter
   * as regex patterns, and optional regex flags. Returns an array
   * of matches, allowing nested instances of left/right delimiters.
   * Use the "g" flag to return all matches, otherwise only the
   * first is returned. Be careful to ensure that the left and
   * right format delimiters produce mutually exclusive matches.
   * Backreferences are not supported within the right delimiter
   * due to how it is internally combined with the left delimiter.
   * When matching strings whose format delimiters are unbalanced
   * to the left or right, the output is intentionally as a
   * conventional regex library with recursion support would
   * produce, e.g. "<<x>" and "<x>>" both produce ["x"] when using
   * "<" and ">" as the delimiters (both strings contain a single,
   * balanced instance of "<x>").
   *
   * examples:
   * matchRecursiveRegExp("test", "\\(", "\\)")
   * returns: []
   * matchRecursiveRegExp("<t<<e>><s>>t<>", "<", ">", "g")
   * returns: ["t<<e>><s>", ""]
   * matchRecursiveRegExp("<div id=\"x\">test</div>", "<div\\b[^>]*>", "</div>", "gi")
   * returns: ["test"]
   */


  showdown.helper.matchRecursiveRegExp = function (str, left, right, flags) {
    'use strict';

    var matchPos = rgxFindMatchPos(str, left, right, flags),
        results = [];

    for (var i = 0; i < matchPos.length; ++i) {
      results.push([str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), str.slice(matchPos[i].match.start, matchPos[i].match.end), str.slice(matchPos[i].left.start, matchPos[i].left.end), str.slice(matchPos[i].right.start, matchPos[i].right.end)]);
    }

    return results;
  };
  /**
   *
   * @param {string} str
   * @param {string|function} replacement
   * @param {string} left
   * @param {string} right
   * @param {string} flags
   * @returns {string}
   */


  showdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) {
    'use strict';

    if (!showdown.helper.isFunction(replacement)) {
      var repStr = replacement;

      replacement = function () {
        return repStr;
      };
    }

    var matchPos = rgxFindMatchPos(str, left, right, flags),
        finalStr = str,
        lng = matchPos.length;

    if (lng > 0) {
      var bits = [];

      if (matchPos[0].wholeMatch.start !== 0) {
        bits.push(str.slice(0, matchPos[0].wholeMatch.start));
      }

      for (var i = 0; i < lng; ++i) {
        bits.push(replacement(str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end), str.slice(matchPos[i].match.start, matchPos[i].match.end), str.slice(matchPos[i].left.start, matchPos[i].left.end), str.slice(matchPos[i].right.start, matchPos[i].right.end)));

        if (i < lng - 1) {
          bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start));
        }
      }

      if (matchPos[lng - 1].wholeMatch.end < str.length) {
        bits.push(str.slice(matchPos[lng - 1].wholeMatch.end));
      }

      finalStr = bits.join('');
    }

    return finalStr;
  };
  /**
   * Returns the index within the passed String object of the first occurrence of the specified regex,
   * starting the search at fromIndex. Returns -1 if the value is not found.
   *
   * @param {string} str string to search
   * @param {RegExp} regex Regular expression to search
   * @param {int} [fromIndex = 0] Index to start the search
   * @returns {Number}
   * @throws InvalidArgumentError
   */


  showdown.helper.regexIndexOf = function (str, regex, fromIndex) {
    'use strict';

    if (!showdown.helper.isString(str)) {
      throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';
    }

    if (regex instanceof RegExp === false) {
      throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp';
    }

    var indexOf = str.substring(fromIndex || 0).search(regex);
    return indexOf >= 0 ? indexOf + (fromIndex || 0) : indexOf;
  };
  /**
   * Splits the passed string object at the defined index, and returns an array composed of the two substrings
   * @param {string} str string to split
   * @param {int} index index to split string at
   * @returns {[string,string]}
   * @throws InvalidArgumentError
   */


  showdown.helper.splitAtIndex = function (str, index) {
    'use strict';

    if (!showdown.helper.isString(str)) {
      throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';
    }

    return [str.substring(0, index), str.substring(index)];
  };
  /**
   * Obfuscate an e-mail address through the use of Character Entities,
   * transforming ASCII characters into their equivalent decimal or hex entities.
   *
   * Since it has a random component, subsequent calls to this function produce different results
   *
   * @param {string} mail
   * @returns {string}
   */


  showdown.helper.encodeEmailAddress = function (mail) {
    'use strict';

    var encode = [function (ch) {
      return '&#' + ch.charCodeAt(0) + ';';
    }, function (ch) {
      return '&#x' + ch.charCodeAt(0).toString(16) + ';';
    }, function (ch) {
      return ch;
    }];
    mail = mail.replace(/./g, function (ch) {
      if (ch === '@') {
        // this *must* be encoded. I insist.
        ch = encode[Math.floor(Math.random() * 2)](ch);
      } else {
        var r = Math.random(); // roughly 10% raw, 45% hex, 45% dec

        ch = r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch);
      }

      return ch;
    });
    return mail;
  };
  /**
   *
   * @param str
   * @param targetLength
   * @param padString
   * @returns {string}
   */


  showdown.helper.padEnd = function padEnd(str, targetLength, padString) {
    'use strict';
    /*jshint bitwise: false*/
    // eslint-disable-next-line space-infix-ops

    targetLength = targetLength >> 0; //floor if number or convert non-number to 0;

    /*jshint bitwise: true*/

    padString = String(padString || ' ');

    if (str.length > targetLength) {
      return String(str);
    } else {
      targetLength = targetLength - str.length;

      if (targetLength > padString.length) {
        padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed
      }

      return String(str) + padString.slice(0, targetLength);
    }
  };
  /**
   * POLYFILLS
   */
  // use this instead of builtin is undefined for IE8 compatibility


  if (typeof console === 'undefined') {
    console = {
      warn: function (msg) {
        'use strict';

        alert(msg);
      },
      log: function (msg) {
        'use strict';

        alert(msg);
      },
      error: function (msg) {
        'use strict';

        throw msg;
      }
    };
  }
  /**
   * Common regexes.
   * We declare some common regexes to improve performance
   */


  showdown.helper.regexes = {
    asteriskDashAndColon: /([*_:~])/g
  };
  /**
   * EMOJIS LIST
   */

  showdown.helper.emojis = {
    '+1': '\ud83d\udc4d',
    '-1': '\ud83d\udc4e',
    '100': '\ud83d\udcaf',
    '1234': '\ud83d\udd22',
    '1st_place_medal': '\ud83e\udd47',
    '2nd_place_medal': '\ud83e\udd48',
    '3rd_place_medal': '\ud83e\udd49',
    '8ball': '\ud83c\udfb1',
    'a': '\ud83c\udd70\ufe0f',
    'ab': '\ud83c\udd8e',
    'abc': '\ud83d\udd24',
    'abcd': '\ud83d\udd21',
    'accept': '\ud83c\ude51',
    'aerial_tramway': '\ud83d\udea1',
    'airplane': '\u2708\ufe0f',
    'alarm_clock': '\u23f0',
    'alembic': '\u2697\ufe0f',
    'alien': '\ud83d\udc7d',
    'ambulance': '\ud83d\ude91',
    'amphora': '\ud83c\udffa',
    'anchor': '\u2693\ufe0f',
    'angel': '\ud83d\udc7c',
    'anger': '\ud83d\udca2',
    'angry': '\ud83d\ude20',
    'anguished': '\ud83d\ude27',
    'ant': '\ud83d\udc1c',
    'apple': '\ud83c\udf4e',
    'aquarius': '\u2652\ufe0f',
    'aries': '\u2648\ufe0f',
    'arrow_backward': '\u25c0\ufe0f',
    'arrow_double_down': '\u23ec',
    'arrow_double_up': '\u23eb',
    'arrow_down': '\u2b07\ufe0f',
    'arrow_down_small': '\ud83d\udd3d',
    'arrow_forward': '\u25b6\ufe0f',
    'arrow_heading_down': '\u2935\ufe0f',
    'arrow_heading_up': '\u2934\ufe0f',
    'arrow_left': '\u2b05\ufe0f',
    'arrow_lower_left': '\u2199\ufe0f',
    'arrow_lower_right': '\u2198\ufe0f',
    'arrow_right': '\u27a1\ufe0f',
    'arrow_right_hook': '\u21aa\ufe0f',
    'arrow_up': '\u2b06\ufe0f',
    'arrow_up_down': '\u2195\ufe0f',
    'arrow_up_small': '\ud83d\udd3c',
    'arrow_upper_left': '\u2196\ufe0f',
    'arrow_upper_right': '\u2197\ufe0f',
    'arrows_clockwise': '\ud83d\udd03',
    'arrows_counterclockwise': '\ud83d\udd04',
    'art': '\ud83c\udfa8',
    'articulated_lorry': '\ud83d\ude9b',
    'artificial_satellite': '\ud83d\udef0',
    'astonished': '\ud83d\ude32',
    'athletic_shoe': '\ud83d\udc5f',
    'atm': '\ud83c\udfe7',
    'atom_symbol': '\u269b\ufe0f',
    'avocado': '\ud83e\udd51',
    'b': '\ud83c\udd71\ufe0f',
    'baby': '\ud83d\udc76',
    'baby_bottle': '\ud83c\udf7c',
    'baby_chick': '\ud83d\udc24',
    'baby_symbol': '\ud83d\udebc',
    'back': '\ud83d\udd19',
    'bacon': '\ud83e\udd53',
    'badminton': '\ud83c\udff8',
    'baggage_claim': '\ud83d\udec4',
    'baguette_bread': '\ud83e\udd56',
    'balance_scale': '\u2696\ufe0f',
    'balloon': '\ud83c\udf88',
    'ballot_box': '\ud83d\uddf3',
    'ballot_box_with_check': '\u2611\ufe0f',
    'bamboo': '\ud83c\udf8d',
    'banana': '\ud83c\udf4c',
    'bangbang': '\u203c\ufe0f',
    'bank': '\ud83c\udfe6',
    'bar_chart': '\ud83d\udcca',
    'barber': '\ud83d\udc88',
    'baseball': '\u26be\ufe0f',
    'basketball': '\ud83c\udfc0',
    'basketball_man': '\u26f9\ufe0f',
    'basketball_woman': '\u26f9\ufe0f&zwj;\u2640\ufe0f',
    'bat': '\ud83e\udd87',
    'bath': '\ud83d\udec0',
    'bathtub': '\ud83d\udec1',
    'battery': '\ud83d\udd0b',
    'beach_umbrella': '\ud83c\udfd6',
    'bear': '\ud83d\udc3b',
    'bed': '\ud83d\udecf',
    'bee': '\ud83d\udc1d',
    'beer': '\ud83c\udf7a',
    'beers': '\ud83c\udf7b',
    'beetle': '\ud83d\udc1e',
    'beginner': '\ud83d\udd30',
    'bell': '\ud83d\udd14',
    'bellhop_bell': '\ud83d\udece',
    'bento': '\ud83c\udf71',
    'biking_man': '\ud83d\udeb4',
    'bike': '\ud83d\udeb2',
    'biking_woman': '\ud83d\udeb4&zwj;\u2640\ufe0f',
    'bikini': '\ud83d\udc59',
    'biohazard': '\u2623\ufe0f',
    'bird': '\ud83d\udc26',
    'birthday': '\ud83c\udf82',
    'black_circle': '\u26ab\ufe0f',
    'black_flag': '\ud83c\udff4',
    'black_heart': '\ud83d\udda4',
    'black_joker': '\ud83c\udccf',
    'black_large_square': '\u2b1b\ufe0f',
    'black_medium_small_square': '\u25fe\ufe0f',
    'black_medium_square': '\u25fc\ufe0f',
    'black_nib': '\u2712\ufe0f',
    'black_small_square': '\u25aa\ufe0f',
    'black_square_button': '\ud83d\udd32',
    'blonde_man': '\ud83d\udc71',
    'blonde_woman': '\ud83d\udc71&zwj;\u2640\ufe0f',
    'blossom': '\ud83c\udf3c',
    'blowfish': '\ud83d\udc21',
    'blue_book': '\ud83d\udcd8',
    'blue_car': '\ud83d\ude99',
    'blue_heart': '\ud83d\udc99',
    'blush': '\ud83d\ude0a',
    'boar': '\ud83d\udc17',
    'boat': '\u26f5\ufe0f',
    'bomb': '\ud83d\udca3',
    'book': '\ud83d\udcd6',
    'bookmark': '\ud83d\udd16',
    'bookmark_tabs': '\ud83d\udcd1',
    'books': '\ud83d\udcda',
    'boom': '\ud83d\udca5',
    'boot': '\ud83d\udc62',
    'bouquet': '\ud83d\udc90',
    'bowing_man': '\ud83d\ude47',
    'bow_and_arrow': '\ud83c\udff9',
    'bowing_woman': '\ud83d\ude47&zwj;\u2640\ufe0f',
    'bowling': '\ud83c\udfb3',
    'boxing_glove': '\ud83e\udd4a',
    'boy': '\ud83d\udc66',
    'bread': '\ud83c\udf5e',
    'bride_with_veil': '\ud83d\udc70',
    'bridge_at_night': '\ud83c\udf09',
    'briefcase': '\ud83d\udcbc',
    'broken_heart': '\ud83d\udc94',
    'bug': '\ud83d\udc1b',
    'building_construction': '\ud83c\udfd7',
    'bulb': '\ud83d\udca1',
    'bullettrain_front': '\ud83d\ude85',
    'bullettrain_side': '\ud83d\ude84',
    'burrito': '\ud83c\udf2f',
    'bus': '\ud83d\ude8c',
    'business_suit_levitating': '\ud83d\udd74',
    'busstop': '\ud83d\ude8f',
    'bust_in_silhouette': '\ud83d\udc64',
    'busts_in_silhouette': '\ud83d\udc65',
    'butterfly': '\ud83e\udd8b',
    'cactus': '\ud83c\udf35',
    'cake': '\ud83c\udf70',
    'calendar': '\ud83d\udcc6',
    'call_me_hand': '\ud83e\udd19',
    'calling': '\ud83d\udcf2',
    'camel': '\ud83d\udc2b',
    'camera': '\ud83d\udcf7',
    'camera_flash': '\ud83d\udcf8',
    'camping': '\ud83c\udfd5',
    'cancer': '\u264b\ufe0f',
    'candle': '\ud83d\udd6f',
    'candy': '\ud83c\udf6c',
    'canoe': '\ud83d\udef6',
    'capital_abcd': '\ud83d\udd20',
    'capricorn': '\u2651\ufe0f',
    'car': '\ud83d\ude97',
    'card_file_box': '\ud83d\uddc3',
    'card_index': '\ud83d\udcc7',
    'card_index_dividers': '\ud83d\uddc2',
    'carousel_horse': '\ud83c\udfa0',
    'carrot': '\ud83e\udd55',
    'cat': '\ud83d\udc31',
    'cat2': '\ud83d\udc08',
    'cd': '\ud83d\udcbf',
    'chains': '\u26d3',
    'champagne': '\ud83c\udf7e',
    'chart': '\ud83d\udcb9',
    'chart_with_downwards_trend': '\ud83d\udcc9',
    'chart_with_upwards_trend': '\ud83d\udcc8',
    'checkered_flag': '\ud83c\udfc1',
    'cheese': '\ud83e\uddc0',
    'cherries': '\ud83c\udf52',
    'cherry_blossom': '\ud83c\udf38',
    'chestnut': '\ud83c\udf30',
    'chicken': '\ud83d\udc14',
    'children_crossing': '\ud83d\udeb8',
    'chipmunk': '\ud83d\udc3f',
    'chocolate_bar': '\ud83c\udf6b',
    'christmas_tree': '\ud83c\udf84',
    'church': '\u26ea\ufe0f',
    'cinema': '\ud83c\udfa6',
    'circus_tent': '\ud83c\udfaa',
    'city_sunrise': '\ud83c\udf07',
    'city_sunset': '\ud83c\udf06',
    'cityscape': '\ud83c\udfd9',
    'cl': '\ud83c\udd91',
    'clamp': '\ud83d\udddc',
    'clap': '\ud83d\udc4f',
    'clapper': '\ud83c\udfac',
    'classical_building': '\ud83c\udfdb',
    'clinking_glasses': '\ud83e\udd42',
    'clipboard': '\ud83d\udccb',
    'clock1': '\ud83d\udd50',
    'clock10': '\ud83d\udd59',
    'clock1030': '\ud83d\udd65',
    'clock11': '\ud83d\udd5a',
    'clock1130': '\ud83d\udd66',
    'clock12': '\ud83d\udd5b',
    'clock1230': '\ud83d\udd67',
    'clock130': '\ud83d\udd5c',
    'clock2': '\ud83d\udd51',
    'clock230': '\ud83d\udd5d',
    'clock3': '\ud83d\udd52',
    'clock330': '\ud83d\udd5e',
    'clock4': '\ud83d\udd53',
    'clock430': '\ud83d\udd5f',
    'clock5': '\ud83d\udd54',
    'clock530': '\ud83d\udd60',
    'clock6': '\ud83d\udd55',
    'clock630': '\ud83d\udd61',
    'clock7': '\ud83d\udd56',
    'clock730': '\ud83d\udd62',
    'clock8': '\ud83d\udd57',
    'clock830': '\ud83d\udd63',
    'clock9': '\ud83d\udd58',
    'clock930': '\ud83d\udd64',
    'closed_book': '\ud83d\udcd5',
    'closed_lock_with_key': '\ud83d\udd10',
    'closed_umbrella': '\ud83c\udf02',
    'cloud': '\u2601\ufe0f',
    'cloud_with_lightning': '\ud83c\udf29',
    'cloud_with_lightning_and_rain': '\u26c8',
    'cloud_with_rain': '\ud83c\udf27',
    'cloud_with_snow': '\ud83c\udf28',
    'clown_face': '\ud83e\udd21',
    'clubs': '\u2663\ufe0f',
    'cocktail': '\ud83c\udf78',
    'coffee': '\u2615\ufe0f',
    'coffin': '\u26b0\ufe0f',
    'cold_sweat': '\ud83d\ude30',
    'comet': '\u2604\ufe0f',
    'computer': '\ud83d\udcbb',
    'computer_mouse': '\ud83d\uddb1',
    'confetti_ball': '\ud83c\udf8a',
    'confounded': '\ud83d\ude16',
    'confused': '\ud83d\ude15',
    'congratulations': '\u3297\ufe0f',
    'construction': '\ud83d\udea7',
    'construction_worker_man': '\ud83d\udc77',
    'construction_worker_woman': '\ud83d\udc77&zwj;\u2640\ufe0f',
    'control_knobs': '\ud83c\udf9b',
    'convenience_store': '\ud83c\udfea',
    'cookie': '\ud83c\udf6a',
    'cool': '\ud83c\udd92',
    'policeman': '\ud83d\udc6e',
    'copyright': '\u00a9\ufe0f',
    'corn': '\ud83c\udf3d',
    'couch_and_lamp': '\ud83d\udecb',
    'couple': '\ud83d\udc6b',
    'couple_with_heart_woman_man': '\ud83d\udc91',
    'couple_with_heart_man_man': '\ud83d\udc68&zwj;\u2764\ufe0f&zwj;\ud83d\udc68',
    'couple_with_heart_woman_woman': '\ud83d\udc69&zwj;\u2764\ufe0f&zwj;\ud83d\udc69',
    'couplekiss_man_man': '\ud83d\udc68&zwj;\u2764\ufe0f&zwj;\ud83d\udc8b&zwj;\ud83d\udc68',
    'couplekiss_man_woman': '\ud83d\udc8f',
    'couplekiss_woman_woman': '\ud83d\udc69&zwj;\u2764\ufe0f&zwj;\ud83d\udc8b&zwj;\ud83d\udc69',
    'cow': '\ud83d\udc2e',
    'cow2': '\ud83d\udc04',
    'cowboy_hat_face': '\ud83e\udd20',
    'crab': '\ud83e\udd80',
    'crayon': '\ud83d\udd8d',
    'credit_card': '\ud83d\udcb3',
    'crescent_moon': '\ud83c\udf19',
    'cricket': '\ud83c\udfcf',
    'crocodile': '\ud83d\udc0a',
    'croissant': '\ud83e\udd50',
    'crossed_fingers': '\ud83e\udd1e',
    'crossed_flags': '\ud83c\udf8c',
    'crossed_swords': '\u2694\ufe0f',
    'crown': '\ud83d\udc51',
    'cry': '\ud83d\ude22',
    'crying_cat_face': '\ud83d\ude3f',
    'crystal_ball': '\ud83d\udd2e',
    'cucumber': '\ud83e\udd52',
    'cupid': '\ud83d\udc98',
    'curly_loop': '\u27b0',
    'currency_exchange': '\ud83d\udcb1',
    'curry': '\ud83c\udf5b',
    'custard': '\ud83c\udf6e',
    'customs': '\ud83d\udec3',
    'cyclone': '\ud83c\udf00',
    'dagger': '\ud83d\udde1',
    'dancer': '\ud83d\udc83',
    'dancing_women': '\ud83d\udc6f',
    'dancing_men': '\ud83d\udc6f&zwj;\u2642\ufe0f',
    'dango': '\ud83c\udf61',
    'dark_sunglasses': '\ud83d\udd76',
    'dart': '\ud83c\udfaf',
    'dash': '\ud83d\udca8',
    'date': '\ud83d\udcc5',
    'deciduous_tree': '\ud83c\udf33',
    'deer': '\ud83e\udd8c',
    'department_store': '\ud83c\udfec',
    'derelict_house': '\ud83c\udfda',
    'desert': '\ud83c\udfdc',
    'desert_island': '\ud83c\udfdd',
    'desktop_computer': '\ud83d\udda5',
    'male_detective': '\ud83d\udd75\ufe0f',
    'diamond_shape_with_a_dot_inside': '\ud83d\udca0',
    'diamonds': '\u2666\ufe0f',
    'disappointed': '\ud83d\ude1e',
    'disappointed_relieved': '\ud83d\ude25',
    'dizzy': '\ud83d\udcab',
    'dizzy_face': '\ud83d\ude35',
    'do_not_litter': '\ud83d\udeaf',
    'dog': '\ud83d\udc36',
    'dog2': '\ud83d\udc15',
    'dollar': '\ud83d\udcb5',
    'dolls': '\ud83c\udf8e',
    'dolphin': '\ud83d\udc2c',
    'door': '\ud83d\udeaa',
    'doughnut': '\ud83c\udf69',
    'dove': '\ud83d\udd4a',
    'dragon': '\ud83d\udc09',
    'dragon_face': '\ud83d\udc32',
    'dress': '\ud83d\udc57',
    'dromedary_camel': '\ud83d\udc2a',
    'drooling_face': '\ud83e\udd24',
    'droplet': '\ud83d\udca7',
    'drum': '\ud83e\udd41',
    'duck': '\ud83e\udd86',
    'dvd': '\ud83d\udcc0',
    'e-mail': '\ud83d\udce7',
    'eagle': '\ud83e\udd85',
    'ear': '\ud83d\udc42',
    'ear_of_rice': '\ud83c\udf3e',
    'earth_africa': '\ud83c\udf0d',
    'earth_americas': '\ud83c\udf0e',
    'earth_asia': '\ud83c\udf0f',
    'egg': '\ud83e\udd5a',
    'eggplant': '\ud83c\udf46',
    'eight_pointed_black_star': '\u2734\ufe0f',
    'eight_spoked_asterisk': '\u2733\ufe0f',
    'electric_plug': '\ud83d\udd0c',
    'elephant': '\ud83d\udc18',
    'email': '\u2709\ufe0f',
    'end': '\ud83d\udd1a',
    'envelope_with_arrow': '\ud83d\udce9',
    'euro': '\ud83d\udcb6',
    'european_castle': '\ud83c\udff0',
    'european_post_office': '\ud83c\udfe4',
    'evergreen_tree': '\ud83c\udf32',
    'exclamation': '\u2757\ufe0f',
    'expressionless': '\ud83d\ude11',
    'eye': '\ud83d\udc41',
    'eye_speech_bubble': '\ud83d\udc41&zwj;\ud83d\udde8',
    'eyeglasses': '\ud83d\udc53',
    'eyes': '\ud83d\udc40',
    'face_with_head_bandage': '\ud83e\udd15',
    'face_with_thermometer': '\ud83e\udd12',
    'fist_oncoming': '\ud83d\udc4a',
    'factory': '\ud83c\udfed',
    'fallen_leaf': '\ud83c\udf42',
    'family_man_woman_boy': '\ud83d\udc6a',
    'family_man_boy': '\ud83d\udc68&zwj;\ud83d\udc66',
    'family_man_boy_boy': '\ud83d\udc68&zwj;\ud83d\udc66&zwj;\ud83d\udc66',
    'family_man_girl': '\ud83d\udc68&zwj;\ud83d\udc67',
    'family_man_girl_boy': '\ud83d\udc68&zwj;\ud83d\udc67&zwj;\ud83d\udc66',
    'family_man_girl_girl': '\ud83d\udc68&zwj;\ud83d\udc67&zwj;\ud83d\udc67',
    'family_man_man_boy': '\ud83d\udc68&zwj;\ud83d\udc68&zwj;\ud83d\udc66',
    'family_man_man_boy_boy': '\ud83d\udc68&zwj;\ud83d\udc68&zwj;\ud83d\udc66&zwj;\ud83d\udc66',
    'family_man_man_girl': '\ud83d\udc68&zwj;\ud83d\udc68&zwj;\ud83d\udc67',
    'family_man_man_girl_boy': '\ud83d\udc68&zwj;\ud83d\udc68&zwj;\ud83d\udc67&zwj;\ud83d\udc66',
    'family_man_man_girl_girl': '\ud83d\udc68&zwj;\ud83d\udc68&zwj;\ud83d\udc67&zwj;\ud83d\udc67',
    'family_man_woman_boy_boy': '\ud83d\udc68&zwj;\ud83d\udc69&zwj;\ud83d\udc66&zwj;\ud83d\udc66',
    'family_man_woman_girl': '\ud83d\udc68&zwj;\ud83d\udc69&zwj;\ud83d\udc67',
    'family_man_woman_girl_boy': '\ud83d\udc68&zwj;\ud83d\udc69&zwj;\ud83d\udc67&zwj;\ud83d\udc66',
    'family_man_woman_girl_girl': '\ud83d\udc68&zwj;\ud83d\udc69&zwj;\ud83d\udc67&zwj;\ud83d\udc67',
    'family_woman_boy': '\ud83d\udc69&zwj;\ud83d\udc66',
    'family_woman_boy_boy': '\ud83d\udc69&zwj;\ud83d\udc66&zwj;\ud83d\udc66',
    'family_woman_girl': '\ud83d\udc69&zwj;\ud83d\udc67',
    'family_woman_girl_boy': '\ud83d\udc69&zwj;\ud83d\udc67&zwj;\ud83d\udc66',
    'family_woman_girl_girl': '\ud83d\udc69&zwj;\ud83d\udc67&zwj;\ud83d\udc67',
    'family_woman_woman_boy': '\ud83d\udc69&zwj;\ud83d\udc69&zwj;\ud83d\udc66',
    'family_woman_woman_boy_boy': '\ud83d\udc69&zwj;\ud83d\udc69&zwj;\ud83d\udc66&zwj;\ud83d\udc66',
    'family_woman_woman_girl': '\ud83d\udc69&zwj;\ud83d\udc69&zwj;\ud83d\udc67',
    'family_woman_woman_girl_boy': '\ud83d\udc69&zwj;\ud83d\udc69&zwj;\ud83d\udc67&zwj;\ud83d\udc66',
    'family_woman_woman_girl_girl': '\ud83d\udc69&zwj;\ud83d\udc69&zwj;\ud83d\udc67&zwj;\ud83d\udc67',
    'fast_forward': '\u23e9',
    'fax': '\ud83d\udce0',
    'fearful': '\ud83d\ude28',
    'feet': '\ud83d\udc3e',
    'female_detective': '\ud83d\udd75\ufe0f&zwj;\u2640\ufe0f',
    'ferris_wheel': '\ud83c\udfa1',
    'ferry': '\u26f4',
    'field_hockey': '\ud83c\udfd1',
    'file_cabinet': '\ud83d\uddc4',
    'file_folder': '\ud83d\udcc1',
    'film_projector': '\ud83d\udcfd',
    'film_strip': '\ud83c\udf9e',
    'fire': '\ud83d\udd25',
    'fire_engine': '\ud83d\ude92',
    'fireworks': '\ud83c\udf86',
    'first_quarter_moon': '\ud83c\udf13',
    'first_quarter_moon_with_face': '\ud83c\udf1b',
    'fish': '\ud83d\udc1f',
    'fish_cake': '\ud83c\udf65',
    'fishing_pole_and_fish': '\ud83c\udfa3',
    'fist_raised': '\u270a',
    'fist_left': '\ud83e\udd1b',
    'fist_right': '\ud83e\udd1c',
    'flags': '\ud83c\udf8f',
    'flashlight': '\ud83d\udd26',
    'fleur_de_lis': '\u269c\ufe0f',
    'flight_arrival': '\ud83d\udeec',
    'flight_departure': '\ud83d\udeeb',
    'floppy_disk': '\ud83d\udcbe',
    'flower_playing_cards': '\ud83c\udfb4',
    'flushed': '\ud83d\ude33',
    'fog': '\ud83c\udf2b',
    'foggy': '\ud83c\udf01',
    'football': '\ud83c\udfc8',
    'footprints': '\ud83d\udc63',
    'fork_and_knife': '\ud83c\udf74',
    'fountain': '\u26f2\ufe0f',
    'fountain_pen': '\ud83d\udd8b',
    'four_leaf_clover': '\ud83c\udf40',
    'fox_face': '\ud83e\udd8a',
    'framed_picture': '\ud83d\uddbc',
    'free': '\ud83c\udd93',
    'fried_egg': '\ud83c\udf73',
    'fried_shrimp': '\ud83c\udf64',
    'fries': '\ud83c\udf5f',
    'frog': '\ud83d\udc38',
    'frowning': '\ud83d\ude26',
    'frowning_face': '\u2639\ufe0f',
    'frowning_man': '\ud83d\ude4d&zwj;\u2642\ufe0f',
    'frowning_woman': '\ud83d\ude4d',
    'middle_finger': '\ud83d\udd95',
    'fuelpump': '\u26fd\ufe0f',
    'full_moon': '\ud83c\udf15',
    'full_moon_with_face': '\ud83c\udf1d',
    'funeral_urn': '\u26b1\ufe0f',
    'game_die': '\ud83c\udfb2',
    'gear': '\u2699\ufe0f',
    'gem': '\ud83d\udc8e',
    'gemini': '\u264a\ufe0f',
    'ghost': '\ud83d\udc7b',
    'gift': '\ud83c\udf81',
    'gift_heart': '\ud83d\udc9d',
    'girl': '\ud83d\udc67',
    'globe_with_meridians': '\ud83c\udf10',
    'goal_net': '\ud83e\udd45',
    'goat': '\ud83d\udc10',
    'golf': '\u26f3\ufe0f',
    'golfing_man': '\ud83c\udfcc\ufe0f',
    'golfing_woman': '\ud83c\udfcc\ufe0f&zwj;\u2640\ufe0f',
    'gorilla': '\ud83e\udd8d',
    'grapes': '\ud83c\udf47',
    'green_apple': '\ud83c\udf4f',
    'green_book': '\ud83d\udcd7',
    'green_heart': '\ud83d\udc9a',
    'green_salad': '\ud83e\udd57',
    'grey_exclamation': '\u2755',
    'grey_question': '\u2754',
    'grimacing': '\ud83d\ude2c',
    'grin': '\ud83d\ude01',
    'grinning': '\ud83d\ude00',
    'guardsman': '\ud83d\udc82',
    'guardswoman': '\ud83d\udc82&zwj;\u2640\ufe0f',
    'guitar': '\ud83c\udfb8',
    'gun': '\ud83d\udd2b',
    'haircut_woman': '\ud83d\udc87',
    'haircut_man': '\ud83d\udc87&zwj;\u2642\ufe0f',
    'hamburger': '\ud83c\udf54',
    'hammer': '\ud83d\udd28',
    'hammer_and_pick': '\u2692',
    'hammer_and_wrench': '\ud83d\udee0',
    'hamster': '\ud83d\udc39',
    'hand': '\u270b',
    'handbag': '\ud83d\udc5c',
    'handshake': '\ud83e\udd1d',
    'hankey': '\ud83d\udca9',
    'hatched_chick': '\ud83d\udc25',
    'hatching_chick': '\ud83d\udc23',
    'headphones': '\ud83c\udfa7',
    'hear_no_evil': '\ud83d\ude49',
    'heart': '\u2764\ufe0f',
    'heart_decoration': '\ud83d\udc9f',
    'heart_eyes': '\ud83d\ude0d',
    'heart_eyes_cat': '\ud83d\ude3b',
    'heartbeat': '\ud83d\udc93',
    'heartpulse': '\ud83d\udc97',
    'hearts': '\u2665\ufe0f',
    'heavy_check_mark': '\u2714\ufe0f',
    'heavy_division_sign': '\u2797',
    'heavy_dollar_sign': '\ud83d\udcb2',
    'heavy_heart_exclamation': '\u2763\ufe0f',
    'heavy_minus_sign': '\u2796',
    'heavy_multiplication_x': '\u2716\ufe0f',
    'heavy_plus_sign': '\u2795',
    'helicopter': '\ud83d\ude81',
    'herb': '\ud83c\udf3f',
    'hibiscus': '\ud83c\udf3a',
    'high_brightness': '\ud83d\udd06',
    'high_heel': '\ud83d\udc60',
    'hocho': '\ud83d\udd2a',
    'hole': '\ud83d\udd73',
    'honey_pot': '\ud83c\udf6f',
    'horse': '\ud83d\udc34',
    'horse_racing': '\ud83c\udfc7',
    'hospital': '\ud83c\udfe5',
    'hot_pepper': '\ud83c\udf36',
    'hotdog': '\ud83c\udf2d',
    'hotel': '\ud83c\udfe8',
    'hotsprings': '\u2668\ufe0f',
    'hourglass': '\u231b\ufe0f',
    'hourglass_flowing_sand': '\u23f3',
    'house': '\ud83c\udfe0',
    'house_with_garden': '\ud83c\udfe1',
    'houses': '\ud83c\udfd8',
    'hugs': '\ud83e\udd17',
    'hushed': '\ud83d\ude2f',
    'ice_cream': '\ud83c\udf68',
    'ice_hockey': '\ud83c\udfd2',
    'ice_skate': '\u26f8',
    'icecream': '\ud83c\udf66',
    'id': '\ud83c\udd94',
    'ideograph_advantage': '\ud83c\ude50',
    'imp': '\ud83d\udc7f',
    'inbox_tray': '\ud83d\udce5',
    'incoming_envelope': '\ud83d\udce8',
    'tipping_hand_woman': '\ud83d\udc81',
    'information_source': '\u2139\ufe0f',
    'innocent': '\ud83d\ude07',
    'interrobang': '\u2049\ufe0f',
    'iphone': '\ud83d\udcf1',
    'izakaya_lantern': '\ud83c\udfee',
    'jack_o_lantern': '\ud83c\udf83',
    'japan': '\ud83d\uddfe',
    'japanese_castle': '\ud83c\udfef',
    'japanese_goblin': '\ud83d\udc7a',
    'japanese_ogre': '\ud83d\udc79',
    'jeans': '\ud83d\udc56',
    'joy': '\ud83d\ude02',
    'joy_cat': '\ud83d\ude39',
    'joystick': '\ud83d\udd79',
    'kaaba': '\ud83d\udd4b',
    'key': '\ud83d\udd11',
    'keyboard': '\u2328\ufe0f',
    'keycap_ten': '\ud83d\udd1f',
    'kick_scooter': '\ud83d\udef4',
    'kimono': '\ud83d\udc58',
    'kiss': '\ud83d\udc8b',
    'kissing': '\ud83d\ude17',
    'kissing_cat': '\ud83d\ude3d',
    'kissing_closed_eyes': '\ud83d\ude1a',
    'kissing_heart': '\ud83d\ude18',
    'kissing_smiling_eyes': '\ud83d\ude19',
    'kiwi_fruit': '\ud83e\udd5d',
    'koala': '\ud83d\udc28',
    'koko': '\ud83c\ude01',
    'label': '\ud83c\udff7',
    'large_blue_circle': '\ud83d\udd35',
    'large_blue_diamond': '\ud83d\udd37',
    'large_orange_diamond': '\ud83d\udd36',
    'last_quarter_moon': '\ud83c\udf17',
    'last_quarter_moon_with_face': '\ud83c\udf1c',
    'latin_cross': '\u271d\ufe0f',
    'laughing': '\ud83d\ude06',
    'leaves': '\ud83c\udf43',
    'ledger': '\ud83d\udcd2',
    'left_luggage': '\ud83d\udec5',
    'left_right_arrow': '\u2194\ufe0f',
    'leftwards_arrow_with_hook': '\u21a9\ufe0f',
    'lemon': '\ud83c\udf4b',
    'leo': '\u264c\ufe0f',
    'leopard': '\ud83d\udc06',
    'level_slider': '\ud83c\udf9a',
    'libra': '\u264e\ufe0f',
    'light_rail': '\ud83d\ude88',
    'link': '\ud83d\udd17',
    'lion': '\ud83e\udd81',
    'lips': '\ud83d\udc44',
    'lipstick': '\ud83d\udc84',
    'lizard': '\ud83e\udd8e',
    'lock': '\ud83d\udd12',
    'lock_with_ink_pen': '\ud83d\udd0f',
    'lollipop': '\ud83c\udf6d',
    'loop': '\u27bf',
    'loud_sound': '\ud83d\udd0a',
    'loudspeaker': '\ud83d\udce2',
    'love_hotel': '\ud83c\udfe9',
    'love_letter': '\ud83d\udc8c',
    'low_brightness': '\ud83d\udd05',
    'lying_face': '\ud83e\udd25',
    'm': '\u24c2\ufe0f',
    'mag': '\ud83d\udd0d',
    'mag_right': '\ud83d\udd0e',
    'mahjong': '\ud83c\udc04\ufe0f',
    'mailbox': '\ud83d\udceb',
    'mailbox_closed': '\ud83d\udcea',
    'mailbox_with_mail': '\ud83d\udcec',
    'mailbox_with_no_mail': '\ud83d\udced',
    'man': '\ud83d\udc68',
    'man_artist': '\ud83d\udc68&zwj;\ud83c\udfa8',
    'man_astronaut': '\ud83d\udc68&zwj;\ud83d\ude80',
    'man_cartwheeling': '\ud83e\udd38&zwj;\u2642\ufe0f',
    'man_cook': '\ud83d\udc68&zwj;\ud83c\udf73',
    'man_dancing': '\ud83d\udd7a',
    'man_facepalming': '\ud83e\udd26&zwj;\u2642\ufe0f',
    'man_factory_worker': '\ud83d\udc68&zwj;\ud83c\udfed',
    'man_farmer': '\ud83d\udc68&zwj;\ud83c\udf3e',
    'man_firefighter': '\ud83d\udc68&zwj;\ud83d\ude92',
    'man_health_worker': '\ud83d\udc68&zwj;\u2695\ufe0f',
    'man_in_tuxedo': '\ud83e\udd35',
    'man_judge': '\ud83d\udc68&zwj;\u2696\ufe0f',
    'man_juggling': '\ud83e\udd39&zwj;\u2642\ufe0f',
    'man_mechanic': '\ud83d\udc68&zwj;\ud83d\udd27',
    'man_office_worker': '\ud83d\udc68&zwj;\ud83d\udcbc',
    'man_pilot': '\ud83d\udc68&zwj;\u2708\ufe0f',
    'man_playing_handball': '\ud83e\udd3e&zwj;\u2642\ufe0f',
    'man_playing_water_polo': '\ud83e\udd3d&zwj;\u2642\ufe0f',
    'man_scientist': '\ud83d\udc68&zwj;\ud83d\udd2c',
    'man_shrugging': '\ud83e\udd37&zwj;\u2642\ufe0f',
    'man_singer': '\ud83d\udc68&zwj;\ud83c\udfa4',
    'man_student': '\ud83d\udc68&zwj;\ud83c\udf93',
    'man_teacher': '\ud83d\udc68&zwj;\ud83c\udfeb',
    'man_technologist': '\ud83d\udc68&zwj;\ud83d\udcbb',
    'man_with_gua_pi_mao': '\ud83d\udc72',
    'man_with_turban': '\ud83d\udc73',
    'tangerine': '\ud83c\udf4a',
    'mans_shoe': '\ud83d\udc5e',
    'mantelpiece_clock': '\ud83d\udd70',
    'maple_leaf': '\ud83c\udf41',
    'martial_arts_uniform': '\ud83e\udd4b',
    'mask': '\ud83d\ude37',
    'massage_woman': '\ud83d\udc86',
    'massage_man': '\ud83d\udc86&zwj;\u2642\ufe0f',
    'meat_on_bone': '\ud83c\udf56',
    'medal_military': '\ud83c\udf96',
    'medal_sports': '\ud83c\udfc5',
    'mega': '\ud83d\udce3',
    'melon': '\ud83c\udf48',
    'memo': '\ud83d\udcdd',
    'men_wrestling': '\ud83e\udd3c&zwj;\u2642\ufe0f',
    'menorah': '\ud83d\udd4e',
    'mens': '\ud83d\udeb9',
    'metal': '\ud83e\udd18',
    'metro': '\ud83d\ude87',
    'microphone': '\ud83c\udfa4',
    'microscope': '\ud83d\udd2c',
    'milk_glass': '\ud83e\udd5b',
    'milky_way': '\ud83c\udf0c',
    'minibus': '\ud83d\ude90',
    'minidisc': '\ud83d\udcbd',
    'mobile_phone_off': '\ud83d\udcf4',
    'money_mouth_face': '\ud83e\udd11',
    'money_with_wings': '\ud83d\udcb8',
    'moneybag': '\ud83d\udcb0',
    'monkey': '\ud83d\udc12',
    'monkey_face': '\ud83d\udc35',
    'monorail': '\ud83d\ude9d',
    'moon': '\ud83c\udf14',
    'mortar_board': '\ud83c\udf93',
    'mosque': '\ud83d\udd4c',
    'motor_boat': '\ud83d\udee5',
    'motor_scooter': '\ud83d\udef5',
    'motorcycle': '\ud83c\udfcd',
    'motorway': '\ud83d\udee3',
    'mount_fuji': '\ud83d\uddfb',
    'mountain': '\u26f0',
    'mountain_biking_man': '\ud83d\udeb5',
    'mountain_biking_woman': '\ud83d\udeb5&zwj;\u2640\ufe0f',
    'mountain_cableway': '\ud83d\udea0',
    'mountain_railway': '\ud83d\ude9e',
    'mountain_snow': '\ud83c\udfd4',
    'mouse': '\ud83d\udc2d',
    'mouse2': '\ud83d\udc01',
    'movie_camera': '\ud83c\udfa5',
    'moyai': '\ud83d\uddff',
    'mrs_claus': '\ud83e\udd36',
    'muscle': '\ud83d\udcaa',
    'mushroom': '\ud83c\udf44',
    'musical_keyboard': '\ud83c\udfb9',
    'musical_note': '\ud83c\udfb5',
    'musical_score': '\ud83c\udfbc',
    'mute': '\ud83d\udd07',
    'nail_care': '\ud83d\udc85',
    'name_badge': '\ud83d\udcdb',
    'national_park': '\ud83c\udfde',
    'nauseated_face': '\ud83e\udd22',
    'necktie': '\ud83d\udc54',
    'negative_squared_cross_mark': '\u274e',
    'nerd_face': '\ud83e\udd13',
    'neutral_face': '\ud83d\ude10',
    'new': '\ud83c\udd95',
    'new_moon': '\ud83c\udf11',
    'new_moon_with_face': '\ud83c\udf1a',
    'newspaper': '\ud83d\udcf0',
    'newspaper_roll': '\ud83d\uddde',
    'next_track_button': '\u23ed',
    'ng': '\ud83c\udd96',
    'no_good_man': '\ud83d\ude45&zwj;\u2642\ufe0f',
    'no_good_woman': '\ud83d\ude45',
    'night_with_stars': '\ud83c\udf03',
    'no_bell': '\ud83d\udd15',
    'no_bicycles': '\ud83d\udeb3',
    'no_entry': '\u26d4\ufe0f',
    'no_entry_sign': '\ud83d\udeab',
    'no_mobile_phones': '\ud83d\udcf5',
    'no_mouth': '\ud83d\ude36',
    'no_pedestrians': '\ud83d\udeb7',
    'no_smoking': '\ud83d\udead',
    'non-potable_water': '\ud83d\udeb1',
    'nose': '\ud83d\udc43',
    'notebook': '\ud83d\udcd3',
    'notebook_with_decorative_cover': '\ud83d\udcd4',
    'notes': '\ud83c\udfb6',
    'nut_and_bolt': '\ud83d\udd29',
    'o': '\u2b55\ufe0f',
    'o2': '\ud83c\udd7e\ufe0f',
    'ocean': '\ud83c\udf0a',
    'octopus': '\ud83d\udc19',
    'oden': '\ud83c\udf62',
    'office': '\ud83c\udfe2',
    'oil_drum': '\ud83d\udee2',
    'ok': '\ud83c\udd97',
    'ok_hand': '\ud83d\udc4c',
    'ok_man': '\ud83d\ude46&zwj;\u2642\ufe0f',
    'ok_woman': '\ud83d\ude46',
    'old_key': '\ud83d\udddd',
    'older_man': '\ud83d\udc74',
    'older_woman': '\ud83d\udc75',
    'om': '\ud83d\udd49',
    'on': '\ud83d\udd1b',
    'oncoming_automobile': '\ud83d\ude98',
    'oncoming_bus': '\ud83d\ude8d',
    'oncoming_police_car': '\ud83d\ude94',
    'oncoming_taxi': '\ud83d\ude96',
    'open_file_folder': '\ud83d\udcc2',
    'open_hands': '\ud83d\udc50',
    'open_mouth': '\ud83d\ude2e',
    'open_umbrella': '\u2602\ufe0f',
    'ophiuchus': '\u26ce',
    'orange_book': '\ud83d\udcd9',
    'orthodox_cross': '\u2626\ufe0f',
    'outbox_tray': '\ud83d\udce4',
    'owl': '\ud83e\udd89',
    'ox': '\ud83d\udc02',
    'package': '\ud83d\udce6',
    'page_facing_up': '\ud83d\udcc4',
    'page_with_curl': '\ud83d\udcc3',
    'pager': '\ud83d\udcdf',
    'paintbrush': '\ud83d\udd8c',
    'palm_tree': '\ud83c\udf34',
    'pancakes': '\ud83e\udd5e',
    'panda_face': '\ud83d\udc3c',
    'paperclip': '\ud83d\udcce',
    'paperclips': '\ud83d\udd87',
    'parasol_on_ground': '\u26f1',
    'parking': '\ud83c\udd7f\ufe0f',
    'part_alternation_mark': '\u303d\ufe0f',
    'partly_sunny': '\u26c5\ufe0f',
    'passenger_ship': '\ud83d\udef3',
    'passport_control': '\ud83d\udec2',
    'pause_button': '\u23f8',
    'peace_symbol': '\u262e\ufe0f',
    'peach': '\ud83c\udf51',
    'peanuts': '\ud83e\udd5c',
    'pear': '\ud83c\udf50',
    'pen': '\ud83d\udd8a',
    'pencil2': '\u270f\ufe0f',
    'penguin': '\ud83d\udc27',
    'pensive': '\ud83d\ude14',
    'performing_arts': '\ud83c\udfad',
    'persevere': '\ud83d\ude23',
    'person_fencing': '\ud83e\udd3a',
    'pouting_woman': '\ud83d\ude4e',
    'phone': '\u260e\ufe0f',
    'pick': '\u26cf',
    'pig': '\ud83d\udc37',
    'pig2': '\ud83d\udc16',
    'pig_nose': '\ud83d\udc3d',
    'pill': '\ud83d\udc8a',
    'pineapple': '\ud83c\udf4d',
    'ping_pong': '\ud83c\udfd3',
    'pisces': '\u2653\ufe0f',
    'pizza': '\ud83c\udf55',
    'place_of_worship': '\ud83d\uded0',
    'plate_with_cutlery': '\ud83c\udf7d',
    'play_or_pause_button': '\u23ef',
    'point_down': '\ud83d\udc47',
    'point_left': '\ud83d\udc48',
    'point_right': '\ud83d\udc49',
    'point_up': '\u261d\ufe0f',
    'point_up_2': '\ud83d\udc46',
    'police_car': '\ud83d\ude93',
    'policewoman': '\ud83d\udc6e&zwj;\u2640\ufe0f',
    'poodle': '\ud83d\udc29',
    'popcorn': '\ud83c\udf7f',
    'post_office': '\ud83c\udfe3',
    'postal_horn': '\ud83d\udcef',
    'postbox': '\ud83d\udcee',
    'potable_water': '\ud83d\udeb0',
    'potato': '\ud83e\udd54',
    'pouch': '\ud83d\udc5d',
    'poultry_leg': '\ud83c\udf57',
    'pound': '\ud83d\udcb7',
    'rage': '\ud83d\ude21',
    'pouting_cat': '\ud83d\ude3e',
    'pouting_man': '\ud83d\ude4e&zwj;\u2642\ufe0f',
    'pray': '\ud83d\ude4f',
    'prayer_beads': '\ud83d\udcff',
    'pregnant_woman': '\ud83e\udd30',
    'previous_track_button': '\u23ee',
    'prince': '\ud83e\udd34',
    'princess': '\ud83d\udc78',
    'printer': '\ud83d\udda8',
    'purple_heart': '\ud83d\udc9c',
    'purse': '\ud83d\udc5b',
    'pushpin': '\ud83d\udccc',
    'put_litter_in_its_place': '\ud83d\udeae',
    'question': '\u2753',
    'rabbit': '\ud83d\udc30',
    'rabbit2': '\ud83d\udc07',
    'racehorse': '\ud83d\udc0e',
    'racing_car': '\ud83c\udfce',
    'radio': '\ud83d\udcfb',
    'radio_button': '\ud83d\udd18',
    'radioactive': '\u2622\ufe0f',
    'railway_car': '\ud83d\ude83',
    'railway_track': '\ud83d\udee4',
    'rainbow': '\ud83c\udf08',
    'rainbow_flag': '\ud83c\udff3\ufe0f&zwj;\ud83c\udf08',
    'raised_back_of_hand': '\ud83e\udd1a',
    'raised_hand_with_fingers_splayed': '\ud83d\udd90',
    'raised_hands': '\ud83d\ude4c',
    'raising_hand_woman': '\ud83d\ude4b',
    'raising_hand_man': '\ud83d\ude4b&zwj;\u2642\ufe0f',
    'ram': '\ud83d\udc0f',
    'ramen': '\ud83c\udf5c',
    'rat': '\ud83d\udc00',
    'record_button': '\u23fa',
    'recycle': '\u267b\ufe0f',
    'red_circle': '\ud83d\udd34',
    'registered': '\u00ae\ufe0f',
    'relaxed': '\u263a\ufe0f',
    'relieved': '\ud83d\ude0c',
    'reminder_ribbon': '\ud83c\udf97',
    'repeat': '\ud83d\udd01',
    'repeat_one': '\ud83d\udd02',
    'rescue_worker_helmet': '\u26d1',
    'restroom': '\ud83d\udebb',
    'revolving_hearts': '\ud83d\udc9e',
    'rewind': '\u23ea',
    'rhinoceros': '\ud83e\udd8f',
    'ribbon': '\ud83c\udf80',
    'rice': '\ud83c\udf5a',
    'rice_ball': '\ud83c\udf59',
    'rice_cracker': '\ud83c\udf58',
    'rice_scene': '\ud83c\udf91',
    'right_anger_bubble': '\ud83d\uddef',
    'ring': '\ud83d\udc8d',
    'robot': '\ud83e\udd16',
    'rocket': '\ud83d\ude80',
    'rofl': '\ud83e\udd23',
    'roll_eyes': '\ud83d\ude44',
    'roller_coaster': '\ud83c\udfa2',
    'rooster': '\ud83d\udc13',
    'rose': '\ud83c\udf39',
    'rosette': '\ud83c\udff5',
    'rotating_light': '\ud83d\udea8',
    'round_pushpin': '\ud83d\udccd',
    'rowing_man': '\ud83d\udea3',
    'rowing_woman': '\ud83d\udea3&zwj;\u2640\ufe0f',
    'rugby_football': '\ud83c\udfc9',
    'running_man': '\ud83c\udfc3',
    'running_shirt_with_sash': '\ud83c\udfbd',
    'running_woman': '\ud83c\udfc3&zwj;\u2640\ufe0f',
    'sa': '\ud83c\ude02\ufe0f',
    'sagittarius': '\u2650\ufe0f',
    'sake': '\ud83c\udf76',
    'sandal': '\ud83d\udc61',
    'santa': '\ud83c\udf85',
    'satellite': '\ud83d\udce1',
    'saxophone': '\ud83c\udfb7',
    'school': '\ud83c\udfeb',
    'school_satchel': '\ud83c\udf92',
    'scissors': '\u2702\ufe0f',
    'scorpion': '\ud83e\udd82',
    'scorpius': '\u264f\ufe0f',
    'scream': '\ud83d\ude31',
    'scream_cat': '\ud83d\ude40',
    'scroll': '\ud83d\udcdc',
    'seat': '\ud83d\udcba',
    'secret': '\u3299\ufe0f',
    'see_no_evil': '\ud83d\ude48',
    'seedling': '\ud83c\udf31',
    'selfie': '\ud83e\udd33',
    'shallow_pan_of_food': '\ud83e\udd58',
    'shamrock': '\u2618\ufe0f',
    'shark': '\ud83e\udd88',
    'shaved_ice': '\ud83c\udf67',
    'sheep': '\ud83d\udc11',
    'shell': '\ud83d\udc1a',
    'shield': '\ud83d\udee1',
    'shinto_shrine': '\u26e9',
    'ship': '\ud83d\udea2',
    'shirt': '\ud83d\udc55',
    'shopping': '\ud83d\udecd',
    'shopping_cart': '\ud83d\uded2',
    'shower': '\ud83d\udebf',
    'shrimp': '\ud83e\udd90',
    'signal_strength': '\ud83d\udcf6',
    'six_pointed_star': '\ud83d\udd2f',
    'ski': '\ud83c\udfbf',
    'skier': '\u26f7',
    'skull': '\ud83d\udc80',
    'skull_and_crossbones': '\u2620\ufe0f',
    'sleeping': '\ud83d\ude34',
    'sleeping_bed': '\ud83d\udecc',
    'sleepy': '\ud83d\ude2a',
    'slightly_frowning_face': '\ud83d\ude41',
    'slightly_smiling_face': '\ud83d\ude42',
    'slot_machine': '\ud83c\udfb0',
    'small_airplane': '\ud83d\udee9',
    'small_blue_diamond': '\ud83d\udd39',
    'small_orange_diamond': '\ud83d\udd38',
    'small_red_triangle': '\ud83d\udd3a',
    'small_red_triangle_down': '\ud83d\udd3b',
    'smile': '\ud83d\ude04',
    'smile_cat': '\ud83d\ude38',
    'smiley': '\ud83d\ude03',
    'smiley_cat': '\ud83d\ude3a',
    'smiling_imp': '\ud83d\ude08',
    'smirk': '\ud83d\ude0f',
    'smirk_cat': '\ud83d\ude3c',
    'smoking': '\ud83d\udeac',
    'snail': '\ud83d\udc0c',
    'snake': '\ud83d\udc0d',
    'sneezing_face': '\ud83e\udd27',
    'snowboarder': '\ud83c\udfc2',
    'snowflake': '\u2744\ufe0f',
    'snowman': '\u26c4\ufe0f',
    'snowman_with_snow': '\u2603\ufe0f',
    'sob': '\ud83d\ude2d',
    'soccer': '\u26bd\ufe0f',
    'soon': '\ud83d\udd1c',
    'sos': '\ud83c\udd98',
    'sound': '\ud83d\udd09',
    'space_invader': '\ud83d\udc7e',
    'spades': '\u2660\ufe0f',
    'spaghetti': '\ud83c\udf5d',
    'sparkle': '\u2747\ufe0f',
    'sparkler': '\ud83c\udf87',
    'sparkles': '\u2728',
    'sparkling_heart': '\ud83d\udc96',
    'speak_no_evil': '\ud83d\ude4a',
    'speaker': '\ud83d\udd08',
    'speaking_head': '\ud83d\udde3',
    'speech_balloon': '\ud83d\udcac',
    'speedboat': '\ud83d\udea4',
    'spider': '\ud83d\udd77',
    'spider_web': '\ud83d\udd78',
    'spiral_calendar': '\ud83d\uddd3',
    'spiral_notepad': '\ud83d\uddd2',
    'spoon': '\ud83e\udd44',
    'squid': '\ud83e\udd91',
    'stadium': '\ud83c\udfdf',
    'star': '\u2b50\ufe0f',
    'star2': '\ud83c\udf1f',
    'star_and_crescent': '\u262a\ufe0f',
    'star_of_david': '\u2721\ufe0f',
    'stars': '\ud83c\udf20',
    'station': '\ud83d\ude89',
    'statue_of_liberty': '\ud83d\uddfd',
    'steam_locomotive': '\ud83d\ude82',
    'stew': '\ud83c\udf72',
    'stop_button': '\u23f9',
    'stop_sign': '\ud83d\uded1',
    'stopwatch': '\u23f1',
    'straight_ruler': '\ud83d\udccf',
    'strawberry': '\ud83c\udf53',
    'stuck_out_tongue': '\ud83d\ude1b',
    'stuck_out_tongue_closed_eyes': '\ud83d\ude1d',
    'stuck_out_tongue_winking_eye': '\ud83d\ude1c',
    'studio_microphone': '\ud83c\udf99',
    'stuffed_flatbread': '\ud83e\udd59',
    'sun_behind_large_cloud': '\ud83c\udf25',
    'sun_behind_rain_cloud': '\ud83c\udf26',
    'sun_behind_small_cloud': '\ud83c\udf24',
    'sun_with_face': '\ud83c\udf1e',
    'sunflower': '\ud83c\udf3b',
    'sunglasses': '\ud83d\ude0e',
    'sunny': '\u2600\ufe0f',
    'sunrise': '\ud83c\udf05',
    'sunrise_over_mountains': '\ud83c\udf04',
    'surfing_man': '\ud83c\udfc4',
    'surfing_woman': '\ud83c\udfc4&zwj;\u2640\ufe0f',
    'sushi': '\ud83c\udf63',
    'suspension_railway': '\ud83d\ude9f',
    'sweat': '\ud83d\ude13',
    'sweat_drops': '\ud83d\udca6',
    'sweat_smile': '\ud83d\ude05',
    'sweet_potato': '\ud83c\udf60',
    'swimming_man': '\ud83c\udfca',
    'swimming_woman': '\ud83c\udfca&zwj;\u2640\ufe0f',
    'symbols': '\ud83d\udd23',
    'synagogue': '\ud83d\udd4d',
    'syringe': '\ud83d\udc89',
    'taco': '\ud83c\udf2e',
    'tada': '\ud83c\udf89',
    'tanabata_tree': '\ud83c\udf8b',
    'taurus': '\u2649\ufe0f',
    'taxi': '\ud83d\ude95',
    'tea': '\ud83c\udf75',
    'telephone_receiver': '\ud83d\udcde',
    'telescope': '\ud83d\udd2d',
    'tennis': '\ud83c\udfbe',
    'tent': '\u26fa\ufe0f',
    'thermometer': '\ud83c\udf21',
    'thinking': '\ud83e\udd14',
    'thought_balloon': '\ud83d\udcad',
    'ticket': '\ud83c\udfab',
    'tickets': '\ud83c\udf9f',
    'tiger': '\ud83d\udc2f',
    'tiger2': '\ud83d\udc05',
    'timer_clock': '\u23f2',
    'tipping_hand_man': '\ud83d\udc81&zwj;\u2642\ufe0f',
    'tired_face': '\ud83d\ude2b',
    'tm': '\u2122\ufe0f',
    'toilet': '\ud83d\udebd',
    'tokyo_tower': '\ud83d\uddfc',
    'tomato': '\ud83c\udf45',
    'tongue': '\ud83d\udc45',
    'top': '\ud83d\udd1d',
    'tophat': '\ud83c\udfa9',
    'tornado': '\ud83c\udf2a',
    'trackball': '\ud83d\uddb2',
    'tractor': '\ud83d\ude9c',
    'traffic_light': '\ud83d\udea5',
    'train': '\ud83d\ude8b',
    'train2': '\ud83d\ude86',
    'tram': '\ud83d\ude8a',
    'triangular_flag_on_post': '\ud83d\udea9',
    'triangular_ruler': '\ud83d\udcd0',
    'trident': '\ud83d\udd31',
    'triumph': '\ud83d\ude24',
    'trolleybus': '\ud83d\ude8e',
    'trophy': '\ud83c\udfc6',
    'tropical_drink': '\ud83c\udf79',
    'tropical_fish': '\ud83d\udc20',
    'truck': '\ud83d\ude9a',
    'trumpet': '\ud83c\udfba',
    'tulip': '\ud83c\udf37',
    'tumbler_glass': '\ud83e\udd43',
    'turkey': '\ud83e\udd83',
    'turtle': '\ud83d\udc22',
    'tv': '\ud83d\udcfa',
    'twisted_rightwards_arrows': '\ud83d\udd00',
    'two_hearts': '\ud83d\udc95',
    'two_men_holding_hands': '\ud83d\udc6c',
    'two_women_holding_hands': '\ud83d\udc6d',
    'u5272': '\ud83c\ude39',
    'u5408': '\ud83c\ude34',
    'u55b6': '\ud83c\ude3a',
    'u6307': '\ud83c\ude2f\ufe0f',
    'u6708': '\ud83c\ude37\ufe0f',
    'u6709': '\ud83c\ude36',
    'u6e80': '\ud83c\ude35',
    'u7121': '\ud83c\ude1a\ufe0f',
    'u7533': '\ud83c\ude38',
    'u7981': '\ud83c\ude32',
    'u7a7a': '\ud83c\ude33',
    'umbrella': '\u2614\ufe0f',
    'unamused': '\ud83d\ude12',
    'underage': '\ud83d\udd1e',
    'unicorn': '\ud83e\udd84',
    'unlock': '\ud83d\udd13',
    'up': '\ud83c\udd99',
    'upside_down_face': '\ud83d\ude43',
    'v': '\u270c\ufe0f',
    'vertical_traffic_light': '\ud83d\udea6',
    'vhs': '\ud83d\udcfc',
    'vibration_mode': '\ud83d\udcf3',
    'video_camera': '\ud83d\udcf9',
    'video_game': '\ud83c\udfae',
    'violin': '\ud83c\udfbb',
    'virgo': '\u264d\ufe0f',
    'volcano': '\ud83c\udf0b',
    'volleyball': '\ud83c\udfd0',
    'vs': '\ud83c\udd9a',
    'vulcan_salute': '\ud83d\udd96',
    'walking_man': '\ud83d\udeb6',
    'walking_woman': '\ud83d\udeb6&zwj;\u2640\ufe0f',
    'waning_crescent_moon': '\ud83c\udf18',
    'waning_gibbous_moon': '\ud83c\udf16',
    'warning': '\u26a0\ufe0f',
    'wastebasket': '\ud83d\uddd1',
    'watch': '\u231a\ufe0f',
    'water_buffalo': '\ud83d\udc03',
    'watermelon': '\ud83c\udf49',
    'wave': '\ud83d\udc4b',
    'wavy_dash': '\u3030\ufe0f',
    'waxing_crescent_moon': '\ud83c\udf12',
    'wc': '\ud83d\udebe',
    'weary': '\ud83d\ude29',
    'wedding': '\ud83d\udc92',
    'weight_lifting_man': '\ud83c\udfcb\ufe0f',
    'weight_lifting_woman': '\ud83c\udfcb\ufe0f&zwj;\u2640\ufe0f',
    'whale': '\ud83d\udc33',
    'whale2': '\ud83d\udc0b',
    'wheel_of_dharma': '\u2638\ufe0f',
    'wheelchair': '\u267f\ufe0f',
    'white_check_mark': '\u2705',
    'white_circle': '\u26aa\ufe0f',
    'white_flag': '\ud83c\udff3\ufe0f',
    'white_flower': '\ud83d\udcae',
    'white_large_square': '\u2b1c\ufe0f',
    'white_medium_small_square': '\u25fd\ufe0f',
    'white_medium_square': '\u25fb\ufe0f',
    'white_small_square': '\u25ab\ufe0f',
    'white_square_button': '\ud83d\udd33',
    'wilted_flower': '\ud83e\udd40',
    'wind_chime': '\ud83c\udf90',
    'wind_face': '\ud83c\udf2c',
    'wine_glass': '\ud83c\udf77',
    'wink': '\ud83d\ude09',
    'wolf': '\ud83d\udc3a',
    'woman': '\ud83d\udc69',
    'woman_artist': '\ud83d\udc69&zwj;\ud83c\udfa8',
    'woman_astronaut': '\ud83d\udc69&zwj;\ud83d\ude80',
    'woman_cartwheeling': '\ud83e\udd38&zwj;\u2640\ufe0f',
    'woman_cook': '\ud83d\udc69&zwj;\ud83c\udf73',
    'woman_facepalming': '\ud83e\udd26&zwj;\u2640\ufe0f',
    'woman_factory_worker': '\ud83d\udc69&zwj;\ud83c\udfed',
    'woman_farmer': '\ud83d\udc69&zwj;\ud83c\udf3e',
    'woman_firefighter': '\ud83d\udc69&zwj;\ud83d\ude92',
    'woman_health_worker': '\ud83d\udc69&zwj;\u2695\ufe0f',
    'woman_judge': '\ud83d\udc69&zwj;\u2696\ufe0f',
    'woman_juggling': '\ud83e\udd39&zwj;\u2640\ufe0f',
    'woman_mechanic': '\ud83d\udc69&zwj;\ud83d\udd27',
    'woman_office_worker': '\ud83d\udc69&zwj;\ud83d\udcbc',
    'woman_pilot': '\ud83d\udc69&zwj;\u2708\ufe0f',
    'woman_playing_handball': '\ud83e\udd3e&zwj;\u2640\ufe0f',
    'woman_playing_water_polo': '\ud83e\udd3d&zwj;\u2640\ufe0f',
    'woman_scientist': '\ud83d\udc69&zwj;\ud83d\udd2c',
    'woman_shrugging': '\ud83e\udd37&zwj;\u2640\ufe0f',
    'woman_singer': '\ud83d\udc69&zwj;\ud83c\udfa4',
    'woman_student': '\ud83d\udc69&zwj;\ud83c\udf93',
    'woman_teacher': '\ud83d\udc69&zwj;\ud83c\udfeb',
    'woman_technologist': '\ud83d\udc69&zwj;\ud83d\udcbb',
    'woman_with_turban': '\ud83d\udc73&zwj;\u2640\ufe0f',
    'womans_clothes': '\ud83d\udc5a',
    'womans_hat': '\ud83d\udc52',
    'women_wrestling': '\ud83e\udd3c&zwj;\u2640\ufe0f',
    'womens': '\ud83d\udeba',
    'world_map': '\ud83d\uddfa',
    'worried': '\ud83d\ude1f',
    'wrench': '\ud83d\udd27',
    'writing_hand': '\u270d\ufe0f',
    'x': '\u274c',
    'yellow_heart': '\ud83d\udc9b',
    'yen': '\ud83d\udcb4',
    'yin_yang': '\u262f\ufe0f',
    'yum': '\ud83d\ude0b',
    'zap': '\u26a1\ufe0f',
    'zipper_mouth_face': '\ud83e\udd10',
    'zzz': '\ud83d\udca4',

    /* special emojis :P */
    'octocat': '<img alt=":octocat:" height="20" width="20" align="absmiddle" src="https://assets-cdn.github.com/images/icons/emoji/octocat.png">',
    'showdown': '<span style="font-family: \'Anonymous Pro\', monospace; text-decoration: underline; text-decoration-style: dashed; text-decoration-color: #3e8b8a;text-underline-position: under;">S</span>'
  };
  /**
   * Created by Estevao on 31-05-2015.
   */

  /**
   * Showdown Converter class
   * @class
   * @param {object} [converterOptions]
   * @returns {Converter}
   */

  showdown.Converter = function (converterOptions) {
    'use strict';

    var
    /**
     * Options used by this converter
     * @private
     * @type {{}}
     */
    options = {},

    /**
     * Language extensions used by this converter
     * @private
     * @type {Array}
     */
    langExtensions = [],

    /**
     * Output modifiers extensions used by this converter
     * @private
     * @type {Array}
     */
    outputModifiers = [],

    /**
     * Event listeners
     * @private
     * @type {{}}
     */
    listeners = {},

    /**
     * The flavor set in this converter
     */
    setConvFlavor = setFlavor,

    /**
     * Metadata of the document
     * @type {{parsed: {}, raw: string, format: string}}
     */
    metadata = {
      parsed: {},
      raw: '',
      format: ''
    };

    _constructor();
    /**
     * Converter constructor
     * @private
     */


    function _constructor() {
      converterOptions = converterOptions || {};

      for (var gOpt in globalOptions) {
        if (globalOptions.hasOwnProperty(gOpt)) {
          options[gOpt] = globalOptions[gOpt];
        }
      } // Merge options


      if (typeof converterOptions === 'object') {
        for (var opt in converterOptions) {
          if (converterOptions.hasOwnProperty(opt)) {
            options[opt] = converterOptions[opt];
          }
        }
      } else {
        throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions + ' was passed instead.');
      }

      if (options.extensions) {
        showdown.helper.forEach(options.extensions, _parseExtension);
      }
    }
    /**
     * Parse extension
     * @param {*} ext
     * @param {string} [name='']
     * @private
     */


    function _parseExtension(ext, name) {
      name = name || null; // If it's a string, the extension was previously loaded

      if (showdown.helper.isString(ext)) {
        ext = showdown.helper.stdExtName(ext);
        name = ext; // LEGACY_SUPPORT CODE

        if (showdown.extensions[ext]) {
          console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' + 'Please inform the developer that the extension should be updated!');
          legacyExtensionLoading(showdown.extensions[ext], ext);
          return; // END LEGACY SUPPORT CODE
        } else if (!showdown.helper.isUndefined(extensions[ext])) {
          ext = extensions[ext];
        } else {
          throw Error('Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.');
        }
      }

      if (typeof ext === 'function') {
        ext = ext();
      }

      if (!showdown.helper.isArray(ext)) {
        ext = [ext];
      }

      var validExt = validate(ext, name);

      if (!validExt.valid) {
        throw Error(validExt.error);
      }

      for (var i = 0; i < ext.length; ++i) {
        switch (ext[i].type) {
          case 'lang':
            langExtensions.push(ext[i]);
            break;

          case 'output':
            outputModifiers.push(ext[i]);
            break;
        }

        if (ext[i].hasOwnProperty('listeners')) {
          for (var ln in ext[i].listeners) {
            if (ext[i].listeners.hasOwnProperty(ln)) {
              listen(ln, ext[i].listeners[ln]);
            }
          }
        }
      }
    }
    /**
     * LEGACY_SUPPORT
     * @param {*} ext
     * @param {string} name
     */


    function legacyExtensionLoading(ext, name) {
      if (typeof ext === 'function') {
        ext = ext(new showdown.Converter());
      }

      if (!showdown.helper.isArray(ext)) {
        ext = [ext];
      }

      var valid = validate(ext, name);

      if (!valid.valid) {
        throw Error(valid.error);
      }

      for (var i = 0; i < ext.length; ++i) {
        switch (ext[i].type) {
          case 'lang':
            langExtensions.push(ext[i]);
            break;

          case 'output':
            outputModifiers.push(ext[i]);
            break;

          default:
            // should never reach here
            throw Error('Extension loader error: Type unrecognized!!!');
        }
      }
    }
    /**
     * Listen to an event
     * @param {string} name
     * @param {function} callback
     */


    function listen(name, callback) {
      if (!showdown.helper.isString(name)) {
        throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');
      }

      if (typeof callback !== 'function') {
        throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');
      }

      if (!listeners.hasOwnProperty(name)) {
        listeners[name] = [];
      }

      listeners[name].push(callback);
    }

    function rTrimInputText(text) {
      var rsp = text.match(/^\s*/)[0].length,
          rgx = new RegExp('^\\s{0,' + rsp + '}', 'gm');
      return text.replace(rgx, '');
    }
    /**
     * Dispatch an event
     * @private
     * @param {string} evtName Event name
     * @param {string} text Text
     * @param {{}} options Converter Options
     * @param {{}} globals
     * @returns {string}
     */


    this._dispatch = function dispatch(evtName, text, options, globals) {
      if (listeners.hasOwnProperty(evtName)) {
        for (var ei = 0; ei < listeners[evtName].length; ++ei) {
          var nText = listeners[evtName][ei](evtName, text, this, options, globals);

          if (nText && typeof nText !== 'undefined') {
            text = nText;
          }
        }
      }

      return text;
    };
    /**
     * Listen to an event
     * @param {string} name
     * @param {function} callback
     * @returns {showdown.Converter}
     */


    this.listen = function (name, callback) {
      listen(name, callback);
      return this;
    };
    /**
     * Converts a markdown string into HTML
     * @param {string} text
     * @returns {*}
     */


    this.makeHtml = function (text) {
      //check if text is not falsy
      if (!text) {
        return text;
      }

      var globals = {
        gHtmlBlocks: [],
        gHtmlMdBlocks: [],
        gHtmlSpans: [],
        gUrls: {},
        gTitles: {},
        gDimensions: {},
        gListLevel: 0,
        hashLinkCounts: {},
        langExtensions: langExtensions,
        outputModifiers: outputModifiers,
        converter: this,
        ghCodeBlocks: [],
        metadata: {
          parsed: {},
          raw: '',
          format: ''
        }
      }; // This lets us use ¨ trema as an escape char to avoid md5 hashes
      // The choice of character is arbitrary; anything that isn't
      // magic in Markdown will work.

      text = text.replace(/¨/g, '¨T'); // Replace $ with ¨D
      // RegExp interprets $ as a special character
      // when it's in a replacement string

      text = text.replace(/\$/g, '¨D'); // Standardize line endings

      text = text.replace(/\r\n/g, '\n'); // DOS to Unix

      text = text.replace(/\r/g, '\n'); // Mac to Unix
      // Stardardize line spaces

      text = text.replace(/\u00A0/g, '&nbsp;');

      if (options.smartIndentationFix) {
        text = rTrimInputText(text);
      } // Make sure text begins and ends with a couple of newlines:


      text = '\n\n' + text + '\n\n'; // detab

      text = showdown.subParser('detab')(text, options, globals);
      /**
       * Strip any lines consisting only of spaces and tabs.
       * This makes subsequent regexs easier to write, because we can
       * match consecutive blank lines with /\n+/ instead of something
       * contorted like /[ \t]*\n+/
       */

      text = text.replace(/^[ \t]+$/mg, ''); //run languageExtensions

      showdown.helper.forEach(langExtensions, function (ext) {
        text = showdown.subParser('runExtension')(ext, text, options, globals);
      }); // run the sub parsers

      text = showdown.subParser('metadata')(text, options, globals);
      text = showdown.subParser('hashPreCodeTags')(text, options, globals);
      text = showdown.subParser('githubCodeBlocks')(text, options, globals);
      text = showdown.subParser('hashHTMLBlocks')(text, options, globals);
      text = showdown.subParser('hashCodeTags')(text, options, globals);
      text = showdown.subParser('stripLinkDefinitions')(text, options, globals);
      text = showdown.subParser('blockGamut')(text, options, globals);
      text = showdown.subParser('unhashHTMLSpans')(text, options, globals);
      text = showdown.subParser('unescapeSpecialChars')(text, options, globals); // attacklab: Restore dollar signs

      text = text.replace(/¨D/g, '$$'); // attacklab: Restore tremas

      text = text.replace(/¨T/g, '¨'); // render a complete html document instead of a partial if the option is enabled

      text = showdown.subParser('completeHTMLDocument')(text, options, globals); // Run output modifiers

      showdown.helper.forEach(outputModifiers, function (ext) {
        text = showdown.subParser('runExtension')(ext, text, options, globals);
      }); // update metadata

      metadata = globals.metadata;
      return text;
    };
    /**
     * Converts an HTML string into a markdown string
     * @param src
     * @param [HTMLParser] A WHATWG DOM and HTML parser, such as JSDOM. If none is supplied, window.document will be used.
     * @returns {string}
     */


    this.makeMarkdown = this.makeMd = function (src, HTMLParser) {
      // replace \r\n with \n
      src = src.replace(/\r\n/g, '\n');
      src = src.replace(/\r/g, '\n'); // old macs
      // due to an edge case, we need to find this: > <
      // to prevent removing of non silent white spaces
      // ex: <em>this is</em> <strong>sparta</strong>

      src = src.replace(/>[ \t]+</, '>¨NBSP;<');

      if (!HTMLParser) {
        if (window && window.document) {
          HTMLParser = window.document;
        } else {
          throw new Error('HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM');
        }
      }

      var doc = HTMLParser.createElement('div');
      doc.innerHTML = src;
      var globals = {
        preList: substitutePreCodeTags(doc)
      }; // remove all newlines and collapse spaces

      clean(doc); // some stuff, like accidental reference links must now be escaped
      // TODO
      // doc.innerHTML = doc.innerHTML.replace(/\[[\S\t ]]/);

      var nodes = doc.childNodes,
          mdDoc = '';

      for (var i = 0; i < nodes.length; i++) {
        mdDoc += showdown.subParser('makeMarkdown.node')(nodes[i], globals);
      }

      function clean(node) {
        for (var n = 0; n < node.childNodes.length; ++n) {
          var child = node.childNodes[n];

          if (child.nodeType === 3) {
            if (!/\S/.test(child.nodeValue)) {
              node.removeChild(child);
              --n;
            } else {
              child.nodeValue = child.nodeValue.split('\n').join(' ');
              child.nodeValue = child.nodeValue.replace(/(\s)+/g, '$1');
            }
          } else if (child.nodeType === 1) {
            clean(child);
          }
        }
      } // find all pre tags and replace contents with placeholder
      // we need this so that we can remove all indentation from html
      // to ease up parsing


      function substitutePreCodeTags(doc) {
        var pres = doc.querySelectorAll('pre'),
            presPH = [];

        for (var i = 0; i < pres.length; ++i) {
          if (pres[i].childElementCount === 1 && pres[i].firstChild.tagName.toLowerCase() === 'code') {
            var content = pres[i].firstChild.innerHTML.trim(),
                language = pres[i].firstChild.getAttribute('data-language') || ''; // if data-language attribute is not defined, then we look for class language-*

            if (language === '') {
              var classes = pres[i].firstChild.className.split(' ');

              for (var c = 0; c < classes.length; ++c) {
                var matches = classes[c].match(/^language-(.+)$/);

                if (matches !== null) {
                  language = matches[1];
                  break;
                }
              }
            } // unescape html entities in content


            content = showdown.helper.unescapeHTMLEntities(content);
            presPH.push(content);
            pres[i].outerHTML = '<precode language="' + language + '" precodenum="' + i.toString() + '"></precode>';
          } else {
            presPH.push(pres[i].innerHTML);
            pres[i].innerHTML = '';
            pres[i].setAttribute('prenum', i.toString());
          }
        }

        return presPH;
      }

      return mdDoc;
    };
    /**
     * Set an option of this Converter instance
     * @param {string} key
     * @param {*} value
     */


    this.setOption = function (key, value) {
      options[key] = value;
    };
    /**
     * Get the option of this Converter instance
     * @param {string} key
     * @returns {*}
     */


    this.getOption = function (key) {
      return options[key];
    };
    /**
     * Get the options of this Converter instance
     * @returns {{}}
     */


    this.getOptions = function () {
      return options;
    };
    /**
     * Add extension to THIS converter
     * @param {{}} extension
     * @param {string} [name=null]
     */


    this.addExtension = function (extension, name) {
      name = name || null;

      _parseExtension(extension, name);
    };
    /**
     * Use a global registered extension with THIS converter
     * @param {string} extensionName Name of the previously registered extension
     */


    this.useExtension = function (extensionName) {
      _parseExtension(extensionName);
    };
    /**
     * Set the flavor THIS converter should use
     * @param {string} name
     */


    this.setFlavor = function (name) {
      if (!flavor.hasOwnProperty(name)) {
        throw Error(name + ' flavor was not found');
      }

      var preset = flavor[name];
      setConvFlavor = name;

      for (var option in preset) {
        if (preset.hasOwnProperty(option)) {
          options[option] = preset[option];
        }
      }
    };
    /**
     * Get the currently set flavor of this converter
     * @returns {string}
     */


    this.getFlavor = function () {
      return setConvFlavor;
    };
    /**
     * Remove an extension from THIS converter.
     * Note: This is a costly operation. It's better to initialize a new converter
     * and specify the extensions you wish to use
     * @param {Array} extension
     */


    this.removeExtension = function (extension) {
      if (!showdown.helper.isArray(extension)) {
        extension = [extension];
      }

      for (var a = 0; a < extension.length; ++a) {
        var ext = extension[a];

        for (var i = 0; i < langExtensions.length; ++i) {
          if (langExtensions[i] === ext) {
            langExtensions[i].splice(i, 1);
          }
        }

        for (var ii = 0; ii < outputModifiers.length; ++i) {
          if (outputModifiers[ii] === ext) {
            outputModifiers[ii].splice(i, 1);
          }
        }
      }
    };
    /**
     * Get all extension of THIS converter
     * @returns {{language: Array, output: Array}}
     */


    this.getAllExtensions = function () {
      return {
        language: langExtensions,
        output: outputModifiers
      };
    };
    /**
     * Get the metadata of the previously parsed document
     * @param raw
     * @returns {string|{}}
     */


    this.getMetadata = function (raw) {
      if (raw) {
        return metadata.raw;
      } else {
        return metadata.parsed;
      }
    };
    /**
     * Get the metadata format of the previously parsed document
     * @returns {string}
     */


    this.getMetadataFormat = function () {
      return metadata.format;
    };
    /**
     * Private: set a single key, value metadata pair
     * @param {string} key
     * @param {string} value
     */


    this._setMetadataPair = function (key, value) {
      metadata.parsed[key] = value;
    };
    /**
     * Private: set metadata format
     * @param {string} format
     */


    this._setMetadataFormat = function (format) {
      metadata.format = format;
    };
    /**
     * Private: set metadata raw text
     * @param {string} raw
     */


    this._setMetadataRaw = function (raw) {
      metadata.raw = raw;
    };
  };
  /**
   * Turn Markdown link shortcuts into XHTML <a> tags.
   */


  showdown.subParser('anchors', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('anchors.before', text, options, globals);

    var writeAnchorTag = function (wholeMatch, linkText, linkId, url, m5, m6, title) {
      if (showdown.helper.isUndefined(title)) {
        title = '';
      }

      linkId = linkId.toLowerCase(); // Special case for explicit empty url

      if (wholeMatch.search(/\(<?\s*>? ?(['"].*['"])?\)$/m) > -1) {
        url = '';
      } else if (!url) {
        if (!linkId) {
          // lower-case and turn embedded newlines into spaces
          linkId = linkText.toLowerCase().replace(/ ?\n/g, ' ');
        }

        url = '#' + linkId;

        if (!showdown.helper.isUndefined(globals.gUrls[linkId])) {
          url = globals.gUrls[linkId];

          if (!showdown.helper.isUndefined(globals.gTitles[linkId])) {
            title = globals.gTitles[linkId];
          }
        } else {
          return wholeMatch;
        }
      } //url = showdown.helper.escapeCharacters(url, '*_', false); // replaced line to improve performance


      url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);
      var result = '<a href="' + url + '"';

      if (title !== '' && title !== null) {
        title = title.replace(/"/g, '&quot;'); //title = showdown.helper.escapeCharacters(title, '*_', false); // replaced line to improve performance

        title = title.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);
        result += ' title="' + title + '"';
      } // optionLinksInNewWindow only applies
      // to external links. Hash links (#) open in same page


      if (options.openLinksInNewWindow && !/^#/.test(url)) {
        // escaped _
        result += ' rel="noopener noreferrer" target="¨E95Eblank"';
      }

      result += '>' + linkText + '</a>';
      return result;
    }; // First, handle reference-style links: [link text] [id]


    text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g, writeAnchorTag); // Next, inline-style links: [link text](url "optional title")
    // cases with crazy urls like ./image/cat1).png

    text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g, writeAnchorTag); // normal cases

    text = text.replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<?([\S]+?(?:\([\S]*?\)[\S]*?)?)>?(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g, writeAnchorTag); // handle reference-style shortcuts: [link text]
    // These must come last in case you've also got [link test][1]
    // or [link test](/foo)

    text = text.replace(/\[([^\[\]]+)]()()()()()/g, writeAnchorTag); // Lastly handle GithubMentions if option is enabled

    if (options.ghMentions) {
      text = text.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gmi, function (wm, st, escape, mentions, username) {
        if (escape === '\\') {
          return st + mentions;
        } //check if options.ghMentionsLink is a string


        if (!showdown.helper.isString(options.ghMentionsLink)) {
          throw new Error('ghMentionsLink option must be a string');
        }

        var lnk = options.ghMentionsLink.replace(/\{u}/g, username),
            target = '';

        if (options.openLinksInNewWindow) {
          target = ' rel="noopener noreferrer" target="¨E95Eblank"';
        }

        return st + '<a href="' + lnk + '"' + target + '>' + mentions + '</a>';
      });
    }

    text = globals.converter._dispatch('anchors.after', text, options, globals);
    return text;
  }); // url allowed chars [a-z\d_.~:/?#[]@!$&'()*+,;=-]

  var simpleURLRegex = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi,
      simpleURLRegex2 = /([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi,
      delimUrlRegex = /()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi,
      simpleMailRegex = /(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gmi,
      delimMailRegex = /<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
      replaceLink = function (options) {
    'use strict';

    return function (wm, leadingMagicChars, link, m2, m3, trailingPunctuation, trailingMagicChars) {
      link = link.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);
      var lnkTxt = link,
          append = '',
          target = '',
          lmc = leadingMagicChars || '',
          tmc = trailingMagicChars || '';

      if (/^www\./i.test(link)) {
        link = link.replace(/^www\./i, 'http://www.');
      }

      if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) {
        append = trailingPunctuation;
      }

      if (options.openLinksInNewWindow) {
        target = ' rel="noopener noreferrer" target="¨E95Eblank"';
      }

      return lmc + '<a href="' + link + '"' + target + '>' + lnkTxt + '</a>' + append + tmc;
    };
  },
      replaceMail = function (options, globals) {
    'use strict';

    return function (wholeMatch, b, mail) {
      var href = 'mailto:';
      b = b || '';
      mail = showdown.subParser('unescapeSpecialChars')(mail, options, globals);

      if (options.encodeEmails) {
        href = showdown.helper.encodeEmailAddress(href + mail);
        mail = showdown.helper.encodeEmailAddress(mail);
      } else {
        href = href + mail;
      }

      return b + '<a href="' + href + '">' + mail + '</a>';
    };
  };

  showdown.subParser('autoLinks', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('autoLinks.before', text, options, globals);
    text = text.replace(delimUrlRegex, replaceLink(options));
    text = text.replace(delimMailRegex, replaceMail(options, globals));
    text = globals.converter._dispatch('autoLinks.after', text, options, globals);
    return text;
  });
  showdown.subParser('simplifiedAutoLinks', function (text, options, globals) {
    'use strict';

    if (!options.simplifiedAutoLink) {
      return text;
    }

    text = globals.converter._dispatch('simplifiedAutoLinks.before', text, options, globals);

    if (options.excludeTrailingPunctuationFromURLs) {
      text = text.replace(simpleURLRegex2, replaceLink(options));
    } else {
      text = text.replace(simpleURLRegex, replaceLink(options));
    }

    text = text.replace(simpleMailRegex, replaceMail(options, globals));
    text = globals.converter._dispatch('simplifiedAutoLinks.after', text, options, globals);
    return text;
  });
  /**
   * These are all the transformations that form block-level
   * tags like paragraphs, headers, and list items.
   */

  showdown.subParser('blockGamut', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('blockGamut.before', text, options, globals); // we parse blockquotes first so that we can have headings and hrs
    // inside blockquotes

    text = showdown.subParser('blockQuotes')(text, options, globals);
    text = showdown.subParser('headers')(text, options, globals); // Do Horizontal Rules:

    text = showdown.subParser('horizontalRule')(text, options, globals);
    text = showdown.subParser('lists')(text, options, globals);
    text = showdown.subParser('codeBlocks')(text, options, globals);
    text = showdown.subParser('tables')(text, options, globals); // We already ran _HashHTMLBlocks() before, in Markdown(), but that
    // was to escape raw HTML in the original Markdown source. This time,
    // we're escaping the markup we've just created, so that we don't wrap
    // <p> tags around block-level tags.

    text = showdown.subParser('hashHTMLBlocks')(text, options, globals);
    text = showdown.subParser('paragraphs')(text, options, globals);
    text = globals.converter._dispatch('blockGamut.after', text, options, globals);
    return text;
  });
  showdown.subParser('blockQuotes', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('blockQuotes.before', text, options, globals); // add a couple extra lines after the text and endtext mark

    text = text + '\n\n';
    var rgx = /(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;

    if (options.splitAdjacentBlockquotes) {
      rgx = /^ {0,3}>[\s\S]*?(?:\n\n)/gm;
    }

    text = text.replace(rgx, function (bq) {
      // attacklab: hack around Konqueror 3.5.4 bug:
      // "----------bug".replace(/^-/g,"") == "bug"
      bq = bq.replace(/^[ \t]*>[ \t]?/gm, ''); // trim one level of quoting
      // attacklab: clean up hack

      bq = bq.replace(/¨0/g, '');
      bq = bq.replace(/^[ \t]+$/gm, ''); // trim whitespace-only lines

      bq = showdown.subParser('githubCodeBlocks')(bq, options, globals);
      bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse

      bq = bq.replace(/(^|\n)/g, '$1  '); // These leading spaces screw with <pre> content, so we need to fix that:

      bq = bq.replace(/(\s*<pre>[^\r]+?<\/pre>)/gm, function (wholeMatch, m1) {
        var pre = m1; // attacklab: hack around Konqueror 3.5.4 bug:

        pre = pre.replace(/^  /mg, '¨0');
        pre = pre.replace(/¨0/g, '');
        return pre;
      });
      return showdown.subParser('hashBlock')('<blockquote>\n' + bq + '\n</blockquote>', options, globals);
    });
    text = globals.converter._dispatch('blockQuotes.after', text, options, globals);
    return text;
  });
  /**
   * Process Markdown `<pre><code>` blocks.
   */

  showdown.subParser('codeBlocks', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('codeBlocks.before', text, options, globals); // sentinel workarounds for lack of \A and \Z, safari\khtml bug

    text += '¨0';
    var pattern = /(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g;
    text = text.replace(pattern, function (wholeMatch, m1, m2) {
      var codeblock = m1,
          nextChar = m2,
          end = '\n';
      codeblock = showdown.subParser('outdent')(codeblock, options, globals);
      codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);
      codeblock = showdown.subParser('detab')(codeblock, options, globals);
      codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines

      codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing newlines

      if (options.omitExtraWLInCodeBlocks) {
        end = '';
      }

      codeblock = '<pre><code>' + codeblock + end + '</code></pre>';
      return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar;
    }); // strip sentinel

    text = text.replace(/¨0/, '');
    text = globals.converter._dispatch('codeBlocks.after', text, options, globals);
    return text;
  });
  /**
   *
   *   *  Backtick quotes are used for <code></code> spans.
   *
   *   *  You can use multiple backticks as the delimiters if you want to
   *     include literal backticks in the code span. So, this input:
   *
   *         Just type ``foo `bar` baz`` at the prompt.
   *
   *       Will translate to:
   *
   *         <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
   *
   *    There's no arbitrary limit to the number of backticks you
   *    can use as delimters. If you need three consecutive backticks
   *    in your code, use four for delimiters, etc.
   *
   *  *  You can use spaces to get literal backticks at the edges:
   *
   *         ... type `` `bar` `` ...
   *
   *       Turns to:
   *
   *         ... type <code>`bar`</code> ...
   */

  showdown.subParser('codeSpans', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('codeSpans.before', text, options, globals);

    if (typeof text === 'undefined') {
      text = '';
    }

    text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, function (wholeMatch, m1, m2, m3) {
      var c = m3;
      c = c.replace(/^([ \t]*)/g, ''); // leading whitespace

      c = c.replace(/[ \t]*$/g, ''); // trailing whitespace

      c = showdown.subParser('encodeCode')(c, options, globals);
      c = m1 + '<code>' + c + '</code>';
      c = showdown.subParser('hashHTMLSpans')(c, options, globals);
      return c;
    });
    text = globals.converter._dispatch('codeSpans.after', text, options, globals);
    return text;
  });
  /**
   * Create a full HTML document from the processed markdown
   */

  showdown.subParser('completeHTMLDocument', function (text, options, globals) {
    'use strict';

    if (!options.completeHTMLDocument) {
      return text;
    }

    text = globals.converter._dispatch('completeHTMLDocument.before', text, options, globals);
    var doctype = 'html',
        doctypeParsed = '<!DOCTYPE HTML>\n',
        title = '',
        charset = '<meta charset="utf-8">\n',
        lang = '',
        metadata = '';

    if (typeof globals.metadata.parsed.doctype !== 'undefined') {
      doctypeParsed = '<!DOCTYPE ' + globals.metadata.parsed.doctype + '>\n';
      doctype = globals.metadata.parsed.doctype.toString().toLowerCase();

      if (doctype === 'html' || doctype === 'html5') {
        charset = '<meta charset="utf-8">';
      }
    }

    for (var meta in globals.metadata.parsed) {
      if (globals.metadata.parsed.hasOwnProperty(meta)) {
        switch (meta.toLowerCase()) {
          case 'doctype':
            break;

          case 'title':
            title = '<title>' + globals.metadata.parsed.title + '</title>\n';
            break;

          case 'charset':
            if (doctype === 'html' || doctype === 'html5') {
              charset = '<meta charset="' + globals.metadata.parsed.charset + '">\n';
            } else {
              charset = '<meta name="charset" content="' + globals.metadata.parsed.charset + '">\n';
            }

            break;

          case 'language':
          case 'lang':
            lang = ' lang="' + globals.metadata.parsed[meta] + '"';
            metadata += '<meta name="' + meta + '" content="' + globals.metadata.parsed[meta] + '">\n';
            break;

          default:
            metadata += '<meta name="' + meta + '" content="' + globals.metadata.parsed[meta] + '">\n';
        }
      }
    }

    text = doctypeParsed + '<html' + lang + '>\n<head>\n' + title + charset + metadata + '</head>\n<body>\n' + text.trim() + '\n</body>\n</html>';
    text = globals.converter._dispatch('completeHTMLDocument.after', text, options, globals);
    return text;
  });
  /**
   * Convert all tabs to spaces
   */

  showdown.subParser('detab', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('detab.before', text, options, globals); // expand first n-1 tabs

    text = text.replace(/\t(?=\t)/g, '    '); // g_tab_width
    // replace the nth with two sentinels

    text = text.replace(/\t/g, '¨A¨B'); // use the sentinel to anchor our regex so it doesn't explode

    text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) {
      var leadingText = m1,
          numSpaces = 4 - leadingText.length % 4; // g_tab_width
      // there *must* be a better way to do this:

      for (var i = 0; i < numSpaces; i++) {
        leadingText += ' ';
      }

      return leadingText;
    }); // clean up sentinels

    text = text.replace(/¨A/g, '    '); // g_tab_width

    text = text.replace(/¨B/g, '');
    text = globals.converter._dispatch('detab.after', text, options, globals);
    return text;
  });
  showdown.subParser('ellipsis', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('ellipsis.before', text, options, globals);
    text = text.replace(/\.\.\./g, '…');
    text = globals.converter._dispatch('ellipsis.after', text, options, globals);
    return text;
  });
  /**
   * Turn emoji codes into emojis
   *
   * List of supported emojis: https://github.com/showdownjs/showdown/wiki/Emojis
   */

  showdown.subParser('emoji', function (text, options, globals) {
    'use strict';

    if (!options.emoji) {
      return text;
    }

    text = globals.converter._dispatch('emoji.before', text, options, globals);
    var emojiRgx = /:([\S]+?):/g;
    text = text.replace(emojiRgx, function (wm, emojiCode) {
      if (showdown.helper.emojis.hasOwnProperty(emojiCode)) {
        return showdown.helper.emojis[emojiCode];
      }

      return wm;
    });
    text = globals.converter._dispatch('emoji.after', text, options, globals);
    return text;
  });
  /**
   * Smart processing for ampersands and angle brackets that need to be encoded.
   */

  showdown.subParser('encodeAmpsAndAngles', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('encodeAmpsAndAngles.before', text, options, globals); // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
    // http://bumppo.net/projects/amputator/

    text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, '&amp;'); // Encode naked <'s

    text = text.replace(/<(?![a-z\/?$!])/gi, '&lt;'); // Encode <

    text = text.replace(/</g, '&lt;'); // Encode >

    text = text.replace(/>/g, '&gt;');
    text = globals.converter._dispatch('encodeAmpsAndAngles.after', text, options, globals);
    return text;
  });
  /**
   * Returns the string, with after processing the following backslash escape sequences.
   *
   * attacklab: The polite way to do this is with the new escapeCharacters() function:
   *
   *    text = escapeCharacters(text,"\\",true);
   *    text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
   *
   * ...but we're sidestepping its use of the (slow) RegExp constructor
   * as an optimization for Firefox.  This function gets called a LOT.
   */

  showdown.subParser('encodeBackslashEscapes', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('encodeBackslashEscapes.before', text, options, globals);
    text = text.replace(/\\(\\)/g, showdown.helper.escapeCharactersCallback);
    text = text.replace(/\\([`*_{}\[\]()>#+.!~=|-])/g, showdown.helper.escapeCharactersCallback);
    text = globals.converter._dispatch('encodeBackslashEscapes.after', text, options, globals);
    return text;
  });
  /**
   * Encode/escape certain characters inside Markdown code runs.
   * The point is that in code, these characters are literals,
   * and lose their special Markdown meanings.
   */

  showdown.subParser('encodeCode', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('encodeCode.before', text, options, globals); // Encode all ampersands; HTML entities are not
    // entities within a Markdown code span.

    text = text.replace(/&/g, '&amp;') // Do the angle bracket song and dance:
    .replace(/</g, '&lt;').replace(/>/g, '&gt;') // Now, escape characters that are magic in Markdown:
    .replace(/([*_{}\[\]\\=~-])/g, showdown.helper.escapeCharactersCallback);
    text = globals.converter._dispatch('encodeCode.after', text, options, globals);
    return text;
  });
  /**
   * Within tags -- meaning between < and > -- encode [\ ` * _ ~ =] so they
   * don't conflict with their use in Markdown for code, italics and strong.
   */

  showdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.before', text, options, globals); // Build a regex to find HTML tags.

    var tags = /<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,
        comments = /<!(--(?:(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--)>/gi;
    text = text.replace(tags, function (wholeMatch) {
      return wholeMatch.replace(/(.)<\/?code>(?=.)/g, '$1`').replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);
    });
    text = text.replace(comments, function (wholeMatch) {
      return wholeMatch.replace(/([\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);
    });
    text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.after', text, options, globals);
    return text;
  });
  /**
   * Handle github codeblocks prior to running HashHTML so that
   * HTML contained within the codeblock gets escaped properly
   * Example:
   * ```ruby
   *     def hello_world(x)
   *       puts "Hello, #{x}"
   *     end
   * ```
   */

  showdown.subParser('githubCodeBlocks', function (text, options, globals) {
    'use strict'; // early exit if option is not enabled

    if (!options.ghCodeBlocks) {
      return text;
    }

    text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals);
    text += '¨0';
    text = text.replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g, function (wholeMatch, delim, language, codeblock) {
      var end = options.omitExtraWLInCodeBlocks ? '' : '\n'; // First parse the github code block

      codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);
      codeblock = showdown.subParser('detab')(codeblock, options, globals);
      codeblock = codeblock.replace(/^\n+/g, ''); // trim leading newlines

      codeblock = codeblock.replace(/\n+$/g, ''); // trim trailing whitespace

      codeblock = '<pre><code' + (language ? ' class="' + language + ' language-' + language + '"' : '') + '>' + codeblock + end + '</code></pre>';
      codeblock = showdown.subParser('hashBlock')(codeblock, options, globals); // Since GHCodeblocks can be false positives, we need to
      // store the primitive text and the parsed text in a global var,
      // and then return a token

      return '\n\n¨G' + (globals.ghCodeBlocks.push({
        text: wholeMatch,
        codeblock: codeblock
      }) - 1) + 'G\n\n';
    }); // attacklab: strip sentinel

    text = text.replace(/¨0/, '');
    return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals);
  });
  showdown.subParser('hashBlock', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('hashBlock.before', text, options, globals);
    text = text.replace(/(^\n+|\n+$)/g, '');
    text = '\n\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\n\n';
    text = globals.converter._dispatch('hashBlock.after', text, options, globals);
    return text;
  });
  /**
   * Hash and escape <code> elements that should not be parsed as markdown
   */

  showdown.subParser('hashCodeTags', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('hashCodeTags.before', text, options, globals);

    var repFunc = function (wholeMatch, match, left, right) {
      var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;
      return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C';
    }; // Hash naked <code>


    text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '<code\\b[^>]*>', '</code>', 'gim');
    text = globals.converter._dispatch('hashCodeTags.after', text, options, globals);
    return text;
  });
  showdown.subParser('hashElement', function (text, options, globals) {
    'use strict';

    return function (wholeMatch, m1) {
      var blockText = m1; // Undo double lines

      blockText = blockText.replace(/\n\n/g, '\n');
      blockText = blockText.replace(/^\n/, ''); // strip trailing blank lines

      blockText = blockText.replace(/\n+$/g, ''); // Replace the element text with a marker ("¨KxK" where x is its key)

      blockText = '\n\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\n\n';
      return blockText;
    };
  });
  showdown.subParser('hashHTMLBlocks', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('hashHTMLBlocks.before', text, options, globals);

    var blockTags = ['pre', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'table', 'dl', 'ol', 'ul', 'script', 'noscript', 'form', 'fieldset', 'iframe', 'math', 'style', 'section', 'header', 'footer', 'nav', 'article', 'aside', 'address', 'audio', 'canvas', 'figure', 'hgroup', 'output', 'video', 'p'],
        repFunc = function (wholeMatch, match, left, right) {
      var txt = wholeMatch; // check if this html element is marked as markdown
      // if so, it's contents should be parsed as markdown

      if (left.search(/\bmarkdown\b/) !== -1) {
        txt = left + globals.converter.makeHtml(match) + right;
      }

      return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n';
    };

    if (options.backslashEscapesHTMLTags) {
      // encode backslash escaped HTML tags
      text = text.replace(/\\<(\/?[^>]+?)>/g, function (wm, inside) {
        return '&lt;' + inside + '&gt;';
      });
    } // hash HTML Blocks


    for (var i = 0; i < blockTags.length; ++i) {
      var opTagPos,
          rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\b[^>]*>)', 'im'),
          patLeft = '<' + blockTags[i] + '\\b[^>]*>',
          patRight = '</' + blockTags[i] + '>'; // 1. Look for the first position of the first opening HTML tag in the text

      while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {
        // if the HTML tag is \ escaped, we need to escape it and break
        //2. Split the text in that position
        var subTexts = showdown.helper.splitAtIndex(text, opTagPos),
            //3. Match recursively
        newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im'); // prevent an infinite loop

        if (newSubText1 === subTexts[1]) {
          break;
        }

        text = subTexts[0].concat(newSubText1);
      }
    } // HR SPECIAL CASE


    text = text.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, showdown.subParser('hashElement')(text, options, globals)); // Special case for standalone HTML comments

    text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {
      return '\n\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\n\n';
    }, '^ {0,3}<!--', '-->', 'gm'); // PHP and ASP-style processor instructions (<?...?> and <%...%>)

    text = text.replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, showdown.subParser('hashElement')(text, options, globals));
    text = globals.converter._dispatch('hashHTMLBlocks.after', text, options, globals);
    return text;
  });
  /**
   * Hash span elements that should not be parsed as markdown
   */

  showdown.subParser('hashHTMLSpans', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('hashHTMLSpans.before', text, options, globals);

    function hashHTMLSpan(html) {
      return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C';
    } // Hash Self Closing tags


    text = text.replace(/<[^>]+?\/>/gi, function (wm) {
      return hashHTMLSpan(wm);
    }); // Hash tags without properties

    text = text.replace(/<([^>]+?)>[\s\S]*?<\/\1>/g, function (wm) {
      return hashHTMLSpan(wm);
    }); // Hash tags with properties

    text = text.replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g, function (wm) {
      return hashHTMLSpan(wm);
    }); // Hash self closing tags without />

    text = text.replace(/<[^>]+?>/gi, function (wm) {
      return hashHTMLSpan(wm);
    });
    /*showdown.helper.matchRecursiveRegExp(text, '<code\\b[^>]*>', '</code>', 'gi');*/

    text = globals.converter._dispatch('hashHTMLSpans.after', text, options, globals);
    return text;
  });
  /**
   * Unhash HTML spans
   */

  showdown.subParser('unhashHTMLSpans', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('unhashHTMLSpans.before', text, options, globals);

    for (var i = 0; i < globals.gHtmlSpans.length; ++i) {
      var repText = globals.gHtmlSpans[i],
          // limiter to prevent infinite loop (assume 10 as limit for recurse)
      limit = 0;

      while (/¨C(\d+)C/.test(repText)) {
        var num = RegExp.$1;
        repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]);

        if (limit === 10) {
          console.error('maximum nesting of 10 spans reached!!!');
          break;
        }

        ++limit;
      }

      text = text.replace('¨C' + i + 'C', repText);
    }

    text = globals.converter._dispatch('unhashHTMLSpans.after', text, options, globals);
    return text;
  });
  /**
   * Hash and escape <pre><code> elements that should not be parsed as markdown
   */

  showdown.subParser('hashPreCodeTags', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('hashPreCodeTags.before', text, options, globals);

    var repFunc = function (wholeMatch, match, left, right) {
      // encode html entities
      var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;
      return '\n\n¨G' + (globals.ghCodeBlocks.push({
        text: wholeMatch,
        codeblock: codeblock
      }) - 1) + 'G\n\n';
    }; // Hash <pre><code>


    text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}<pre\\b[^>]*>\\s*<code\\b[^>]*>', '^ {0,3}</code>\\s*</pre>', 'gim');
    text = globals.converter._dispatch('hashPreCodeTags.after', text, options, globals);
    return text;
  });
  showdown.subParser('headers', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('headers.before', text, options, globals);
    var headerLevelStart = isNaN(parseInt(options.headerLevelStart)) ? 1 : parseInt(options.headerLevelStart),
        // Set text-style headers:
    //	Header 1
    //	========
    //
    //	Header 2
    //	--------
    //
    setextRegexH1 = options.smoothLivePreview ? /^(.+)[ \t]*\n={2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n=+[ \t]*\n+/gm,
        setextRegexH2 = options.smoothLivePreview ? /^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm : /^(.+)[ \t]*\n-+[ \t]*\n+/gm;
    text = text.replace(setextRegexH1, function (wholeMatch, m1) {
      var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
          hID = options.noHeaderId ? '' : ' id="' + headerId(m1) + '"',
          hLevel = headerLevelStart,
          hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';
      return showdown.subParser('hashBlock')(hashBlock, options, globals);
    });
    text = text.replace(setextRegexH2, function (matchFound, m1) {
      var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),
          hID = options.noHeaderId ? '' : ' id="' + headerId(m1) + '"',
          hLevel = headerLevelStart + 1,
          hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';
      return showdown.subParser('hashBlock')(hashBlock, options, globals);
    }); // atx-style headers:
    //  # Header 1
    //  ## Header 2
    //  ## Header 2 with closing hashes ##
    //  ...
    //  ###### Header 6
    //

    var atxStyle = options.requireSpaceBeforeHeadingText ? /^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm : /^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm;
    text = text.replace(atxStyle, function (wholeMatch, m1, m2) {
      var hText = m2;

      if (options.customizedHeaderId) {
        hText = m2.replace(/\s?\{([^{]+?)}\s*$/, '');
      }

      var span = showdown.subParser('spanGamut')(hText, options, globals),
          hID = options.noHeaderId ? '' : ' id="' + headerId(m2) + '"',
          hLevel = headerLevelStart - 1 + m1.length,
          header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>';
      return showdown.subParser('hashBlock')(header, options, globals);
    });

    function headerId(m) {
      var title, prefix; // It is separate from other options to allow combining prefix and customized

      if (options.customizedHeaderId) {
        var match = m.match(/\{([^{]+?)}\s*$/);

        if (match && match[1]) {
          m = match[1];
        }
      }

      title = m; // Prefix id to prevent causing inadvertent pre-existing style matches.

      if (showdown.helper.isString(options.prefixHeaderId)) {
        prefix = options.prefixHeaderId;
      } else if (options.prefixHeaderId === true) {
        prefix = 'section-';
      } else {
        prefix = '';
      }

      if (!options.rawPrefixHeaderId) {
        title = prefix + title;
      }

      if (options.ghCompatibleHeaderId) {
        title = title.replace(/ /g, '-') // replace previously escaped chars (&, ¨ and $)
        .replace(/&amp;/g, '').replace(/¨T/g, '').replace(/¨D/g, '') // replace rest of the chars (&~$ are repeated as they might have been escaped)
        // borrowed from github's redcarpet (some they should produce similar results)
        .replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g, '').toLowerCase();
      } else if (options.rawHeaderId) {
        title = title.replace(/ /g, '-') // replace previously escaped chars (&, ¨ and $)
        .replace(/&amp;/g, '&').replace(/¨T/g, '¨').replace(/¨D/g, '$') // replace " and '
        .replace(/["']/g, '-').toLowerCase();
      } else {
        title = title.replace(/[^\w]/g, '').toLowerCase();
      }

      if (options.rawPrefixHeaderId) {
        title = prefix + title;
      }

      if (globals.hashLinkCounts[title]) {
        title = title + '-' + globals.hashLinkCounts[title]++;
      } else {
        globals.hashLinkCounts[title] = 1;
      }

      return title;
    }

    text = globals.converter._dispatch('headers.after', text, options, globals);
    return text;
  });
  /**
   * Turn Markdown link shortcuts into XHTML <a> tags.
   */

  showdown.subParser('horizontalRule', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('horizontalRule.before', text, options, globals);
    var key = showdown.subParser('hashBlock')('<hr />', options, globals);
    text = text.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm, key);
    text = text.replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm, key);
    text = text.replace(/^ {0,2}( ?_){3,}[ \t]*$/gm, key);
    text = globals.converter._dispatch('horizontalRule.after', text, options, globals);
    return text;
  });
  /**
   * Turn Markdown image shortcuts into <img> tags.
   */

  showdown.subParser('images', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('images.before', text, options, globals);
    var inlineRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<?([\S]+?(?:\([\S]*?\)[\S]*?)?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,
        crazyRegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,
        base64RegExp = /!\[([^\]]*?)][ \t]*()\([ \t]?<?(data:.+?\/.+?;base64,[A-Za-z0-9+/=\n]+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,
        referenceRegExp = /!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,
        refShortcutRegExp = /!\[([^\[\]]+)]()()()()()/g;

    function writeImageTagBase64(wholeMatch, altText, linkId, url, width, height, m5, title) {
      url = url.replace(/\s/g, '');
      return writeImageTag(wholeMatch, altText, linkId, url, width, height, m5, title);
    }

    function writeImageTag(wholeMatch, altText, linkId, url, width, height, m5, title) {
      var gUrls = globals.gUrls,
          gTitles = globals.gTitles,
          gDims = globals.gDimensions;
      linkId = linkId.toLowerCase();

      if (!title) {
        title = '';
      } // Special case for explicit empty url


      if (wholeMatch.search(/\(<?\s*>? ?(['"].*['"])?\)$/m) > -1) {
        url = '';
      } else if (url === '' || url === null) {
        if (linkId === '' || linkId === null) {
          // lower-case and turn embedded newlines into spaces
          linkId = altText.toLowerCase().replace(/ ?\n/g, ' ');
        }

        url = '#' + linkId;

        if (!showdown.helper.isUndefined(gUrls[linkId])) {
          url = gUrls[linkId];

          if (!showdown.helper.isUndefined(gTitles[linkId])) {
            title = gTitles[linkId];
          }

          if (!showdown.helper.isUndefined(gDims[linkId])) {
            width = gDims[linkId].width;
            height = gDims[linkId].height;
          }
        } else {
          return wholeMatch;
        }
      }

      altText = altText.replace(/"/g, '&quot;') //altText = showdown.helper.escapeCharacters(altText, '*_', false);
      .replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback); //url = showdown.helper.escapeCharacters(url, '*_', false);

      url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);
      var result = '<img src="' + url + '" alt="' + altText + '"';

      if (title && showdown.helper.isString(title)) {
        title = title.replace(/"/g, '&quot;') //title = showdown.helper.escapeCharacters(title, '*_', false);
        .replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);
        result += ' title="' + title + '"';
      }

      if (width && height) {
        width = width === '*' ? 'auto' : width;
        height = height === '*' ? 'auto' : height;
        result += ' width="' + width + '"';
        result += ' height="' + height + '"';
      }

      result += ' />';
      return result;
    } // First, handle reference-style labeled images: ![alt text][id]


    text = text.replace(referenceRegExp, writeImageTag); // Next, handle inline images:  ![alt text](url =<width>x<height> "optional title")
    // base64 encoded images

    text = text.replace(base64RegExp, writeImageTagBase64); // cases with crazy urls like ./image/cat1).png

    text = text.replace(crazyRegExp, writeImageTag); // normal cases

    text = text.replace(inlineRegExp, writeImageTag); // handle reference-style shortcuts: ![img text]

    text = text.replace(refShortcutRegExp, writeImageTag);
    text = globals.converter._dispatch('images.after', text, options, globals);
    return text;
  });
  showdown.subParser('italicsAndBold', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('italicsAndBold.before', text, options, globals); // it's faster to have 3 separate regexes for each case than have just one
    // because of backtracing, in some cases, it could lead to an exponential effect
    // called "catastrophic backtrace". Ominous!

    function parseInside(txt, left, right) {
      /*
      if (options.simplifiedAutoLink) {
        txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);
      }
      */
      return left + txt + right;
    } // Parse underscores


    if (options.literalMidWordUnderscores) {
      text = text.replace(/\b___(\S[\s\S]*?)___\b/g, function (wm, txt) {
        return parseInside(txt, '<strong><em>', '</em></strong>');
      });
      text = text.replace(/\b__(\S[\s\S]*?)__\b/g, function (wm, txt) {
        return parseInside(txt, '<strong>', '</strong>');
      });
      text = text.replace(/\b_(\S[\s\S]*?)_\b/g, function (wm, txt) {
        return parseInside(txt, '<em>', '</em>');
      });
    } else {
      text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) {
        return /\S$/.test(m) ? parseInside(m, '<strong><em>', '</em></strong>') : wm;
      });
      text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) {
        return /\S$/.test(m) ? parseInside(m, '<strong>', '</strong>') : wm;
      });
      text = text.replace(/_([^\s_][\s\S]*?)_/g, function (wm, m) {
        // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)
        return /\S$/.test(m) ? parseInside(m, '<em>', '</em>') : wm;
      });
    } // Now parse asterisks


    if (options.literalMidWordAsterisks) {
      text = text.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g, function (wm, lead, txt) {
        return parseInside(txt, lead + '<strong><em>', '</em></strong>');
      });
      text = text.replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g, function (wm, lead, txt) {
        return parseInside(txt, lead + '<strong>', '</strong>');
      });
      text = text.replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g, function (wm, lead, txt) {
        return parseInside(txt, lead + '<em>', '</em>');
      });
    } else {
      text = text.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g, function (wm, m) {
        return /\S$/.test(m) ? parseInside(m, '<strong><em>', '</em></strong>') : wm;
      });
      text = text.replace(/\*\*(\S[\s\S]*?)\*\*/g, function (wm, m) {
        return /\S$/.test(m) ? parseInside(m, '<strong>', '</strong>') : wm;
      });
      text = text.replace(/\*([^\s*][\s\S]*?)\*/g, function (wm, m) {
        // !/^\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)
        return /\S$/.test(m) ? parseInside(m, '<em>', '</em>') : wm;
      });
    }

    text = globals.converter._dispatch('italicsAndBold.after', text, options, globals);
    return text;
  });
  /**
   * Form HTML ordered (numbered) and unordered (bulleted) lists.
   */

  showdown.subParser('lists', function (text, options, globals) {
    'use strict';
    /**
     * Process the contents of a single ordered or unordered list, splitting it
     * into individual list items.
     * @param {string} listStr
     * @param {boolean} trimTrailing
     * @returns {string}
     */

    function processListItems(listStr, trimTrailing) {
      // The $g_list_level global keeps track of when we're inside a list.
      // Each time we enter a list, we increment it; when we leave a list,
      // we decrement. If it's zero, we're not in a list anymore.
      //
      // We do this because when we're not inside a list, we want to treat
      // something like this:
      //
      //    I recommend upgrading to version
      //    8. Oops, now this line is treated
      //    as a sub-list.
      //
      // As a single paragraph, despite the fact that the second line starts
      // with a digit-period-space sequence.
      //
      // Whereas when we're inside a list (or sub-list), that line will be
      // treated as the start of a sub-list. What a kludge, huh? This is
      // an aspect of Markdown's syntax that's hard to parse perfectly
      // without resorting to mind-reading. Perhaps the solution is to
      // change the syntax rules such that sub-lists must start with a
      // starting cardinal number; e.g. "1." or "a.".
      globals.gListLevel++; // trim trailing blank lines:

      listStr = listStr.replace(/\n{2,}$/, '\n'); // attacklab: add sentinel to emulate \z

      listStr += '¨0';
      var rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,
          isParagraphed = /\n[ \t]*\n(?!¨0)/.test(listStr); // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,
      // which is a syntax breaking change
      // activating this option reverts to old behavior

      if (options.disableForced4SpacesIndentedSublists) {
        rgx = /(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm;
      }

      listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {
        checked = checked && checked.trim() !== '';
        var item = showdown.subParser('outdent')(m4, options, globals),
            bulletStyle = ''; // Support for github tasklists

        if (taskbtn && options.tasklists) {
          bulletStyle = ' class="task-list-item" style="list-style-type: none;"';
          item = item.replace(/^[ \t]*\[(x|X| )?]/m, function () {
            var otp = '<input type="checkbox" disabled style="margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;"';

            if (checked) {
              otp += ' checked';
            }

            otp += '>';
            return otp;
          });
        } // ISSUE #312
        // This input: - - - a
        // causes trouble to the parser, since it interprets it as:
        // <ul><li><li><li>a</li></li></li></ul>
        // instead of:
        // <ul><li>- - a</li></ul>
        // So, to prevent it, we will put a marker (¨A)in the beginning of the line
        // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser


        item = item.replace(/^([-*+]|\d\.)[ \t]+[\S\n ]*/g, function (wm2) {
          return '¨A' + wm2;
        }); // m1 - Leading line or
        // Has a double return (multi paragraph) or
        // Has sublist

        if (m1 || item.search(/\n{2,}/) > -1) {
          item = showdown.subParser('githubCodeBlocks')(item, options, globals);
          item = showdown.subParser('blockGamut')(item, options, globals);
        } else {
          // Recursion for sub-lists:
          item = showdown.subParser('lists')(item, options, globals);
          item = item.replace(/\n$/, ''); // chomp(item)

          item = showdown.subParser('hashHTMLBlocks')(item, options, globals); // Colapse double linebreaks

          item = item.replace(/\n\n+/g, '\n\n');

          if (isParagraphed) {
            item = showdown.subParser('paragraphs')(item, options, globals);
          } else {
            item = showdown.subParser('spanGamut')(item, options, globals);
          }
        } // now we need to remove the marker (¨A)


        item = item.replace('¨A', ''); // we can finally wrap the line in list item tags

        item = '<li' + bulletStyle + '>' + item + '</li>\n';
        return item;
      }); // attacklab: strip sentinel

      listStr = listStr.replace(/¨0/g, '');
      globals.gListLevel--;

      if (trimTrailing) {
        listStr = listStr.replace(/\s+$/, '');
      }

      return listStr;
    }

    function styleStartNumber(list, listType) {
      // check if ol and starts by a number different than 1
      if (listType === 'ol') {
        var res = list.match(/^ *(\d+)\./);

        if (res && res[1] !== '1') {
          return ' start="' + res[1] + '"';
        }
      }

      return '';
    }
    /**
     * Check and parse consecutive lists (better fix for issue #142)
     * @param {string} list
     * @param {string} listType
     * @param {boolean} trimTrailing
     * @returns {string}
     */


    function parseConsecutiveLists(list, listType, trimTrailing) {
      // check if we caught 2 or more consecutive lists by mistake
      // we use the counterRgx, meaning if listType is UL we look for OL and vice versa
      var olRgx = options.disableForced4SpacesIndentedSublists ? /^ ?\d+\.[ \t]/gm : /^ {0,3}\d+\.[ \t]/gm,
          ulRgx = options.disableForced4SpacesIndentedSublists ? /^ ?[*+-][ \t]/gm : /^ {0,3}[*+-][ \t]/gm,
          counterRxg = listType === 'ul' ? olRgx : ulRgx,
          result = '';

      if (list.search(counterRxg) !== -1) {
        (function parseCL(txt) {
          var pos = txt.search(counterRxg),
              style = styleStartNumber(list, listType);

          if (pos !== -1) {
            // slice
            result += '\n\n<' + listType + style + '>\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '</' + listType + '>\n'; // invert counterType and listType

            listType = listType === 'ul' ? 'ol' : 'ul';
            counterRxg = listType === 'ul' ? olRgx : ulRgx; //recurse

            parseCL(txt.slice(pos));
          } else {
            result += '\n\n<' + listType + style + '>\n' + processListItems(txt, !!trimTrailing) + '</' + listType + '>\n';
          }
        })(list);
      } else {
        var style = styleStartNumber(list, listType);
        result = '\n\n<' + listType + style + '>\n' + processListItems(list, !!trimTrailing) + '</' + listType + '>\n';
      }

      return result;
    }
    /** Start of list parsing **/


    text = globals.converter._dispatch('lists.before', text, options, globals); // add sentinel to hack around khtml/safari bug:
    // http://bugs.webkit.org/show_bug.cgi?id=11231

    text += '¨0';

    if (globals.gListLevel) {
      text = text.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, function (wholeMatch, list, m2) {
        var listType = m2.search(/[*+-]/g) > -1 ? 'ul' : 'ol';
        return parseConsecutiveLists(list, listType, true);
      });
    } else {
      text = text.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm, function (wholeMatch, m1, list, m3) {
        var listType = m3.search(/[*+-]/g) > -1 ? 'ul' : 'ol';
        return parseConsecutiveLists(list, listType, false);
      });
    } // strip sentinel


    text = text.replace(/¨0/, '');
    text = globals.converter._dispatch('lists.after', text, options, globals);
    return text;
  });
  /**
   * Parse metadata at the top of the document
   */

  showdown.subParser('metadata', function (text, options, globals) {
    'use strict';

    if (!options.metadata) {
      return text;
    }

    text = globals.converter._dispatch('metadata.before', text, options, globals);

    function parseMetadataContents(content) {
      // raw is raw so it's not changed in any way
      globals.metadata.raw = content; // escape chars forbidden in html attributes
      // double quotes

      content = content // ampersand first
      .replace(/&/g, '&amp;') // double quotes
      .replace(/"/g, '&quot;');
      content = content.replace(/\n {4}/g, ' ');
      content.replace(/^([\S ]+): +([\s\S]+?)$/gm, function (wm, key, value) {
        globals.metadata.parsed[key] = value;
        return '';
      });
    }

    text = text.replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/, function (wholematch, format, content) {
      parseMetadataContents(content);
      return '¨M';
    });
    text = text.replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/, function (wholematch, format, content) {
      if (format) {
        globals.metadata.format = format;
      }

      parseMetadataContents(content);
      return '¨M';
    });
    text = text.replace(/¨M/g, '');
    text = globals.converter._dispatch('metadata.after', text, options, globals);
    return text;
  });
  /**
   * Remove one level of line-leading tabs or spaces
   */

  showdown.subParser('outdent', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('outdent.before', text, options, globals); // attacklab: hack around Konqueror 3.5.4 bug:
    // "----------bug".replace(/^-/g,"") == "bug"

    text = text.replace(/^(\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width
    // attacklab: clean up hack

    text = text.replace(/¨0/g, '');
    text = globals.converter._dispatch('outdent.after', text, options, globals);
    return text;
  });
  /**
   *
   */

  showdown.subParser('paragraphs', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('paragraphs.before', text, options, globals); // Strip leading and trailing lines:

    text = text.replace(/^\n+/g, '');
    text = text.replace(/\n+$/g, '');
    var grafs = text.split(/\n{2,}/g),
        grafsOut = [],
        end = grafs.length; // Wrap <p> tags

    for (var i = 0; i < end; i++) {
      var str = grafs[i]; // if this is an HTML marker, copy it

      if (str.search(/¨(K|G)(\d+)\1/g) >= 0) {
        grafsOut.push(str); // test for presence of characters to prevent empty lines being parsed
        // as paragraphs (resulting in undesired extra empty paragraphs)
      } else if (str.search(/\S/) >= 0) {
        str = showdown.subParser('spanGamut')(str, options, globals);
        str = str.replace(/^([ \t]*)/g, '<p>');
        str += '</p>';
        grafsOut.push(str);
      }
    }
    /** Unhashify HTML blocks */


    end = grafsOut.length;

    for (i = 0; i < end; i++) {
      var blockText = '',
          grafsOutIt = grafsOut[i],
          codeFlag = false; // if this is a marker for an html block...
      // use RegExp.test instead of string.search because of QML bug

      while (/¨(K|G)(\d+)\1/.test(grafsOutIt)) {
        var delim = RegExp.$1,
            num = RegExp.$2;

        if (delim === 'K') {
          blockText = globals.gHtmlBlocks[num];
        } else {
          // we need to check if ghBlock is a false positive
          if (codeFlag) {
            // use encoded version of all text
            blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text, options, globals);
          } else {
            blockText = globals.ghCodeBlocks[num].codeblock;
          }
        }

        blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs

        grafsOutIt = grafsOutIt.replace(/(\n\n)?¨(K|G)\d+\2(\n\n)?/, blockText); // Check if grafsOutIt is a pre->code

        if (/^<pre\b[^>]*>\s*<code\b[^>]*>/.test(grafsOutIt)) {
          codeFlag = true;
        }
      }

      grafsOut[i] = grafsOutIt;
    }

    text = grafsOut.join('\n'); // Strip leading and trailing lines:

    text = text.replace(/^\n+/g, '');
    text = text.replace(/\n+$/g, '');
    return globals.converter._dispatch('paragraphs.after', text, options, globals);
  });
  /**
   * Run extension
   */

  showdown.subParser('runExtension', function (ext, text, options, globals) {
    'use strict';

    if (ext.filter) {
      text = ext.filter(text, globals.converter, options);
    } else if (ext.regex) {
      // TODO remove this when old extension loading mechanism is deprecated
      var re = ext.regex;

      if (!(re instanceof RegExp)) {
        re = new RegExp(re, 'g');
      }

      text = text.replace(re, ext.replace);
    }

    return text;
  });
  /**
   * These are all the transformations that occur *within* block-level
   * tags like paragraphs, headers, and list items.
   */

  showdown.subParser('spanGamut', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('spanGamut.before', text, options, globals);
    text = showdown.subParser('codeSpans')(text, options, globals);
    text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals);
    text = showdown.subParser('encodeBackslashEscapes')(text, options, globals); // Process anchor and image tags. Images must come first,
    // because ![foo][f] looks like an anchor.

    text = showdown.subParser('images')(text, options, globals);
    text = showdown.subParser('anchors')(text, options, globals); // Make links out of things like `<http://example.com/>`
    // Must come after anchors, because you can use < and >
    // delimiters in inline links like [this](<url>).

    text = showdown.subParser('autoLinks')(text, options, globals);
    text = showdown.subParser('simplifiedAutoLinks')(text, options, globals);
    text = showdown.subParser('emoji')(text, options, globals);
    text = showdown.subParser('underline')(text, options, globals);
    text = showdown.subParser('italicsAndBold')(text, options, globals);
    text = showdown.subParser('strikethrough')(text, options, globals);
    text = showdown.subParser('ellipsis')(text, options, globals); // we need to hash HTML tags inside spans

    text = showdown.subParser('hashHTMLSpans')(text, options, globals); // now we encode amps and angles

    text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals); // Do hard breaks

    if (options.simpleLineBreaks) {
      // GFM style hard breaks
      // only add line breaks if the text does not contain a block (special case for lists)
      if (!/\n\n¨K/.test(text)) {
        text = text.replace(/\n+/g, '<br />\n');
      }
    } else {
      // Vanilla hard breaks
      text = text.replace(/  +\n/g, '<br />\n');
    }

    text = globals.converter._dispatch('spanGamut.after', text, options, globals);
    return text;
  });
  showdown.subParser('strikethrough', function (text, options, globals) {
    'use strict';

    function parseInside(txt) {
      if (options.simplifiedAutoLink) {
        txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);
      }

      return '<del>' + txt + '</del>';
    }

    if (options.strikethrough) {
      text = globals.converter._dispatch('strikethrough.before', text, options, globals);
      text = text.replace(/(?:~){2}([\s\S]+?)(?:~){2}/g, function (wm, txt) {
        return parseInside(txt);
      });
      text = globals.converter._dispatch('strikethrough.after', text, options, globals);
    }

    return text;
  });
  /**
   * Strips link definitions from text, stores the URLs and titles in
   * hash references.
   * Link defs are in the form: ^[id]: url "optional title"
   */

  showdown.subParser('stripLinkDefinitions', function (text, options, globals) {
    'use strict';

    var regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*<?([^>\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,
        base64Regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*<?(data:.+?\/.+?;base64,[A-Za-z0-9+/=\n]+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm; // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug

    text += '¨0';

    var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) {
      linkId = linkId.toLowerCase();

      if (url.match(/^data:.+?\/.+?;base64,/)) {
        // remove newlines
        globals.gUrls[linkId] = url.replace(/\s/g, '');
      } else {
        globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive
      }

      if (blankLines) {
        // Oops, found blank lines, so it's not a title.
        // Put back the parenthetical statement we stole.
        return blankLines + title;
      } else {
        if (title) {
          globals.gTitles[linkId] = title.replace(/"|'/g, '&quot;');
        }

        if (options.parseImgDimensions && width && height) {
          globals.gDimensions[linkId] = {
            width: width,
            height: height
          };
        }
      } // Completely remove the definition from the text


      return '';
    }; // first we try to find base64 link references


    text = text.replace(base64Regex, replaceFunc);
    text = text.replace(regex, replaceFunc); // attacklab: strip sentinel

    text = text.replace(/¨0/, '');
    return text;
  });
  showdown.subParser('tables', function (text, options, globals) {
    'use strict';

    if (!options.tables) {
      return text;
    }

    var tableRgx = /^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,
        //singeColTblRgx = /^ {0,3}\|.+\|\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n(?: {0,3}\|.+\|\n)+(?:\n\n|¨0)/gm;
    singeColTblRgx = /^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm;

    function parseStyles(sLine) {
      if (/^:[ \t]*--*$/.test(sLine)) {
        return ' style="text-align:left;"';
      } else if (/^--*[ \t]*:[ \t]*$/.test(sLine)) {
        return ' style="text-align:right;"';
      } else if (/^:[ \t]*--*[ \t]*:$/.test(sLine)) {
        return ' style="text-align:center;"';
      } else {
        return '';
      }
    }

    function parseHeaders(header, style) {
      var id = '';
      header = header.trim(); // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility

      if (options.tablesHeaderId || options.tableHeaderId) {
        id = ' id="' + header.replace(/ /g, '_').toLowerCase() + '"';
      }

      header = showdown.subParser('spanGamut')(header, options, globals);
      return '<th' + id + style + '>' + header + '</th>\n';
    }

    function parseCells(cell, style) {
      var subText = showdown.subParser('spanGamut')(cell, options, globals);
      return '<td' + style + '>' + subText + '</td>\n';
    }

    function buildTable(headers, cells) {
      var tb = '<table>\n<thead>\n<tr>\n',
          tblLgn = headers.length;

      for (var i = 0; i < tblLgn; ++i) {
        tb += headers[i];
      }

      tb += '</tr>\n</thead>\n<tbody>\n';

      for (i = 0; i < cells.length; ++i) {
        tb += '<tr>\n';

        for (var ii = 0; ii < tblLgn; ++ii) {
          tb += cells[i][ii];
        }

        tb += '</tr>\n';
      }

      tb += '</tbody>\n</table>\n';
      return tb;
    }

    function parseTable(rawTable) {
      var i,
          tableLines = rawTable.split('\n');

      for (i = 0; i < tableLines.length; ++i) {
        // strip wrong first and last column if wrapped tables are used
        if (/^ {0,3}\|/.test(tableLines[i])) {
          tableLines[i] = tableLines[i].replace(/^ {0,3}\|/, '');
        }

        if (/\|[ \t]*$/.test(tableLines[i])) {
          tableLines[i] = tableLines[i].replace(/\|[ \t]*$/, '');
        } // parse code spans first, but we only support one line code spans


        tableLines[i] = showdown.subParser('codeSpans')(tableLines[i], options, globals);
      }

      var rawHeaders = tableLines[0].split('|').map(function (s) {
        return s.trim();
      }),
          rawStyles = tableLines[1].split('|').map(function (s) {
        return s.trim();
      }),
          rawCells = [],
          headers = [],
          styles = [],
          cells = [];
      tableLines.shift();
      tableLines.shift();

      for (i = 0; i < tableLines.length; ++i) {
        if (tableLines[i].trim() === '') {
          continue;
        }

        rawCells.push(tableLines[i].split('|').map(function (s) {
          return s.trim();
        }));
      }

      if (rawHeaders.length < rawStyles.length) {
        return rawTable;
      }

      for (i = 0; i < rawStyles.length; ++i) {
        styles.push(parseStyles(rawStyles[i]));
      }

      for (i = 0; i < rawHeaders.length; ++i) {
        if (showdown.helper.isUndefined(styles[i])) {
          styles[i] = '';
        }

        headers.push(parseHeaders(rawHeaders[i], styles[i]));
      }

      for (i = 0; i < rawCells.length; ++i) {
        var row = [];

        for (var ii = 0; ii < headers.length; ++ii) {
          if (showdown.helper.isUndefined(rawCells[i][ii])) {}

          row.push(parseCells(rawCells[i][ii], styles[ii]));
        }

        cells.push(row);
      }

      return buildTable(headers, cells);
    }

    text = globals.converter._dispatch('tables.before', text, options, globals); // find escaped pipe characters

    text = text.replace(/\\(\|)/g, showdown.helper.escapeCharactersCallback); // parse multi column tables

    text = text.replace(tableRgx, parseTable); // parse one column tables

    text = text.replace(singeColTblRgx, parseTable);
    text = globals.converter._dispatch('tables.after', text, options, globals);
    return text;
  });
  showdown.subParser('underline', function (text, options, globals) {
    'use strict';

    if (!options.underline) {
      return text;
    }

    text = globals.converter._dispatch('underline.before', text, options, globals);

    if (options.literalMidWordUnderscores) {
      text = text.replace(/\b___(\S[\s\S]*?)___\b/g, function (wm, txt) {
        return '<u>' + txt + '</u>';
      });
      text = text.replace(/\b__(\S[\s\S]*?)__\b/g, function (wm, txt) {
        return '<u>' + txt + '</u>';
      });
    } else {
      text = text.replace(/___(\S[\s\S]*?)___/g, function (wm, m) {
        return /\S$/.test(m) ? '<u>' + m + '</u>' : wm;
      });
      text = text.replace(/__(\S[\s\S]*?)__/g, function (wm, m) {
        return /\S$/.test(m) ? '<u>' + m + '</u>' : wm;
      });
    } // escape remaining underscores to prevent them being parsed by italic and bold


    text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback);
    text = globals.converter._dispatch('underline.after', text, options, globals);
    return text;
  });
  /**
   * Swap back in all the special characters we've hidden.
   */

  showdown.subParser('unescapeSpecialChars', function (text, options, globals) {
    'use strict';

    text = globals.converter._dispatch('unescapeSpecialChars.before', text, options, globals);
    text = text.replace(/¨E(\d+)E/g, function (wholeMatch, m1) {
      var charCodeToReplace = parseInt(m1);
      return String.fromCharCode(charCodeToReplace);
    });
    text = globals.converter._dispatch('unescapeSpecialChars.after', text, options, globals);
    return text;
  });
  showdown.subParser('makeMarkdown.blockquote', function (node, globals) {
    'use strict';

    var txt = '';

    if (node.hasChildNodes()) {
      var children = node.childNodes,
          childrenLength = children.length;

      for (var i = 0; i < childrenLength; ++i) {
        var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], globals);

        if (innerTxt === '') {
          continue;
        }

        txt += innerTxt;
      }
    } // cleanup


    txt = txt.trim();
    txt = '> ' + txt.split('\n').join('\n> ');
    return txt;
  });
  showdown.subParser('makeMarkdown.codeBlock', function (node, globals) {
    'use strict';

    var lang = node.getAttribute('language'),
        num = node.getAttribute('precodenum');
    return '```' + lang + '\n' + globals.preList[num] + '\n```';
  });
  showdown.subParser('makeMarkdown.codeSpan', function (node) {
    'use strict';

    return '`' + node.innerHTML + '`';
  });
  showdown.subParser('makeMarkdown.emphasis', function (node, globals) {
    'use strict';

    var txt = '';

    if (node.hasChildNodes()) {
      txt += '*';
      var children = node.childNodes,
          childrenLength = children.length;

      for (var i = 0; i < childrenLength; ++i) {
        txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
      }

      txt += '*';
    }

    return txt;
  });
  showdown.subParser('makeMarkdown.header', function (node, globals, headerLevel) {
    'use strict';

    var headerMark = new Array(headerLevel + 1).join('#'),
        txt = '';

    if (node.hasChildNodes()) {
      txt = headerMark + ' ';
      var children = node.childNodes,
          childrenLength = children.length;

      for (var i = 0; i < childrenLength; ++i) {
        txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
      }
    }

    return txt;
  });
  showdown.subParser('makeMarkdown.hr', function () {
    'use strict';

    return '---';
  });
  showdown.subParser('makeMarkdown.image', function (node) {
    'use strict';

    var txt = '';

    if (node.hasAttribute('src')) {
      txt += '![' + node.getAttribute('alt') + '](';
      txt += '<' + node.getAttribute('src') + '>';

      if (node.hasAttribute('width') && node.hasAttribute('height')) {
        txt += ' =' + node.getAttribute('width') + 'x' + node.getAttribute('height');
      }

      if (node.hasAttribute('title')) {
        txt += ' "' + node.getAttribute('title') + '"';
      }

      txt += ')';
    }

    return txt;
  });
  showdown.subParser('makeMarkdown.links', function (node, globals) {
    'use strict';

    var txt = '';

    if (node.hasChildNodes() && node.hasAttribute('href')) {
      var children = node.childNodes,
          childrenLength = children.length;
      txt = '[';

      for (var i = 0; i < childrenLength; ++i) {
        txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
      }

      txt += '](';
      txt += '<' + node.getAttribute('href') + '>';

      if (node.hasAttribute('title')) {
        txt += ' "' + node.getAttribute('title') + '"';
      }

      txt += ')';
    }

    return txt;
  });
  showdown.subParser('makeMarkdown.list', function (node, globals, type) {
    'use strict';

    var txt = '';

    if (!node.hasChildNodes()) {
      return '';
    }

    var listItems = node.childNodes,
        listItemsLenght = listItems.length,
        listNum = node.getAttribute('start') || 1;

    for (var i = 0; i < listItemsLenght; ++i) {
      if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') {
        continue;
      } // define the bullet to use in list


      var bullet = '';

      if (type === 'ol') {
        bullet = listNum.toString() + '. ';
      } else {
        bullet = '- ';
      } // parse list item


      txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], globals);
      ++listNum;
    } // add comment at the end to prevent consecutive lists to be parsed as one


    txt += '\n<!-- -->\n';
    return txt.trim();
  });
  showdown.subParser('makeMarkdown.listItem', function (node, globals) {
    'use strict';

    var listItemTxt = '';
    var children = node.childNodes,
        childrenLenght = children.length;

    for (var i = 0; i < childrenLenght; ++i) {
      listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], globals);
    } // if it's only one liner, we need to add a newline at the end


    if (!/\n$/.test(listItemTxt)) {
      listItemTxt += '\n';
    } else {
      // it's multiparagraph, so we need to indent
      listItemTxt = listItemTxt.split('\n').join('\n    ').replace(/^ {4}$/gm, '').replace(/\n\n+/g, '\n\n');
    }

    return listItemTxt;
  });
  showdown.subParser('makeMarkdown.node', function (node, globals, spansOnly) {
    'use strict';

    spansOnly = spansOnly || false;
    var txt = ''; // edge case of text without wrapper paragraph

    if (node.nodeType === 3) {
      return showdown.subParser('makeMarkdown.txt')(node, globals);
    } // HTML comment


    if (node.nodeType === 8) {
      return '<!--' + node.data + '-->\n\n';
    } // process only node elements


    if (node.nodeType !== 1) {
      return '';
    }

    var tagName = node.tagName.toLowerCase();

    switch (tagName) {
      //
      // BLOCKS
      //
      case 'h1':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.header')(node, globals, 1) + '\n\n';
        }

        break;

      case 'h2':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.header')(node, globals, 2) + '\n\n';
        }

        break;

      case 'h3':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.header')(node, globals, 3) + '\n\n';
        }

        break;

      case 'h4':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.header')(node, globals, 4) + '\n\n';
        }

        break;

      case 'h5':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.header')(node, globals, 5) + '\n\n';
        }

        break;

      case 'h6':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.header')(node, globals, 6) + '\n\n';
        }

        break;

      case 'p':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.paragraph')(node, globals) + '\n\n';
        }

        break;

      case 'blockquote':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.blockquote')(node, globals) + '\n\n';
        }

        break;

      case 'hr':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.hr')(node, globals) + '\n\n';
        }

        break;

      case 'ol':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ol') + '\n\n';
        }

        break;

      case 'ul':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ul') + '\n\n';
        }

        break;

      case 'precode':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.codeBlock')(node, globals) + '\n\n';
        }

        break;

      case 'pre':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.pre')(node, globals) + '\n\n';
        }

        break;

      case 'table':
        if (!spansOnly) {
          txt = showdown.subParser('makeMarkdown.table')(node, globals) + '\n\n';
        }

        break;
      //
      // SPANS
      //

      case 'code':
        txt = showdown.subParser('makeMarkdown.codeSpan')(node, globals);
        break;

      case 'em':
      case 'i':
        txt = showdown.subParser('makeMarkdown.emphasis')(node, globals);
        break;

      case 'strong':
      case 'b':
        txt = showdown.subParser('makeMarkdown.strong')(node, globals);
        break;

      case 'del':
        txt = showdown.subParser('makeMarkdown.strikethrough')(node, globals);
        break;

      case 'a':
        txt = showdown.subParser('makeMarkdown.links')(node, globals);
        break;

      case 'img':
        txt = showdown.subParser('makeMarkdown.image')(node, globals);
        break;

      default:
        txt = node.outerHTML + '\n\n';
    } // common normalization
    // TODO eventually


    return txt;
  });
  showdown.subParser('makeMarkdown.paragraph', function (node, globals) {
    'use strict';

    var txt = '';

    if (node.hasChildNodes()) {
      var children = node.childNodes,
          childrenLength = children.length;

      for (var i = 0; i < childrenLength; ++i) {
        txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
      }
    } // some text normalization


    txt = txt.trim();
    return txt;
  });
  showdown.subParser('makeMarkdown.pre', function (node, globals) {
    'use strict';

    var num = node.getAttribute('prenum');
    return '<pre>' + globals.preList[num] + '</pre>';
  });
  showdown.subParser('makeMarkdown.strikethrough', function (node, globals) {
    'use strict';

    var txt = '';

    if (node.hasChildNodes()) {
      txt += '~~';
      var children = node.childNodes,
          childrenLength = children.length;

      for (var i = 0; i < childrenLength; ++i) {
        txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
      }

      txt += '~~';
    }

    return txt;
  });
  showdown.subParser('makeMarkdown.strong', function (node, globals) {
    'use strict';

    var txt = '';

    if (node.hasChildNodes()) {
      txt += '**';
      var children = node.childNodes,
          childrenLength = children.length;

      for (var i = 0; i < childrenLength; ++i) {
        txt += showdown.subParser('makeMarkdown.node')(children[i], globals);
      }

      txt += '**';
    }

    return txt;
  });
  showdown.subParser('makeMarkdown.table', function (node, globals) {
    'use strict';

    var txt = '',
        tableArray = [[], []],
        headings = node.querySelectorAll('thead>tr>th'),
        rows = node.querySelectorAll('tbody>tr'),
        i,
        ii;

    for (i = 0; i < headings.length; ++i) {
      var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals),
          allign = '---';

      if (headings[i].hasAttribute('style')) {
        var style = headings[i].getAttribute('style').toLowerCase().replace(/\s/g, '');

        switch (style) {
          case 'text-align:left;':
            allign = ':---';
            break;

          case 'text-align:right;':
            allign = '---:';
            break;

          case 'text-align:center;':
            allign = ':---:';
            break;
        }
      }

      tableArray[0][i] = headContent.trim();
      tableArray[1][i] = allign;
    }

    for (i = 0; i < rows.length; ++i) {
      var r = tableArray.push([]) - 1,
          cols = rows[i].getElementsByTagName('td');

      for (ii = 0; ii < headings.length; ++ii) {
        var cellContent = ' ';

        if (typeof cols[ii] !== 'undefined') {
          cellContent = showdown.subParser('makeMarkdown.tableCell')(cols[ii], globals);
        }

        tableArray[r].push(cellContent);
      }
    }

    var cellSpacesCount = 3;

    for (i = 0; i < tableArray.length; ++i) {
      for (ii = 0; ii < tableArray[i].length; ++ii) {
        var strLen = tableArray[i][ii].length;

        if (strLen > cellSpacesCount) {
          cellSpacesCount = strLen;
        }
      }
    }

    for (i = 0; i < tableArray.length; ++i) {
      for (ii = 0; ii < tableArray[i].length; ++ii) {
        if (i === 1) {
          if (tableArray[i][ii].slice(-1) === ':') {
            tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(-1), cellSpacesCount - 1, '-') + ':';
          } else {
            tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-');
          }
        } else {
          tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount);
        }
      }

      txt += '| ' + tableArray[i].join(' | ') + ' |\n';
    }

    return txt.trim();
  });
  showdown.subParser('makeMarkdown.tableCell', function (node, globals) {
    'use strict';

    var txt = '';

    if (!node.hasChildNodes()) {
      return '';
    }

    var children = node.childNodes,
        childrenLength = children.length;

    for (var i = 0; i < childrenLength; ++i) {
      txt += showdown.subParser('makeMarkdown.node')(children[i], globals, true);
    }

    return txt.trim();
  });
  showdown.subParser('makeMarkdown.txt', function (node) {
    'use strict';

    var txt = node.nodeValue; // multiple spaces are collapsed

    txt = txt.replace(/ +/g, ' '); // replace the custom ¨NBSP; with a space

    txt = txt.replace(/¨NBSP;/g, ' '); // ", <, > and & should replace escaped html entities

    txt = showdown.helper.unescapeHTMLEntities(txt); // escape markdown magic characters
    // emphasis, strong and strikethrough - can appear everywhere
    // we also escape pipe (|) because of tables
    // and escape ` because of code blocks and spans

    txt = txt.replace(/([*_~|`])/g, '\\$1'); // escape > because of blockquotes

    txt = txt.replace(/^(\s*)>/g, '\\$1>'); // hash character, only troublesome at the beginning of a line because of headers

    txt = txt.replace(/^#/gm, '\\#'); // horizontal rules

    txt = txt.replace(/^(\s*)([-=]{3,})(\s*)$/, '$1\\$2$3'); // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer

    txt = txt.replace(/^( {0,3}\d+)\./gm, '$1\\.'); // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped)

    txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\$2'); // images and links, ] followed by ( is problematic, so we escape it

    txt = txt.replace(/]([\s]*)\(/g, '\\]$1\\('); // reference URIs must also be escaped

    txt = txt.replace(/^ {0,3}\[([\S \t]*?)]:/gm, '\\[$1]:');
    return txt;
  });
  var root = this; // AMD Loader

  if (typeof define === 'function' && define.amd) {
    define(function () {
      'use strict';

      return showdown;
    }); // CommonJS/nodeJS Loader
  } else if (typeof module !== 'undefined' && module.exports) {
    module.exports = showdown; // Regular Browser loader
  } else {
    root.showdown = showdown;
  }
}).call(void 0);
};

moduleFactories["node_modules/absol-form/js/components/handlers/TextStyleHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/handlers/TextStyleHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.fontStyle2DomStyle = void 0;

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));


var TextStyleHandlers = {};
TextStyleHandlers.textColor = {
  set: function (value) {
    var vColor;

    try {
      if (value instanceof _Color.default) vColor = value;else if (typeof value === 'string') {
        vColor = _Color.default.parse(value);
      } else vColor = new _Color.default([0, 0, 0, 0]);
    } catch (err) {
      (0, _safeThrow.default)(err);
      vColor = new _Color.default([0, 0, 0, 0]);
    }

    value = vColor.toString('HEX8');
    this.domElt.addStyle('color', value);
    return value;
  },
  descriptor: {
    type: "color",
    sign: "TextColor"
  }
};
TextStyleHandlers.textSize = {
  set: function (value) {
    if (value > 0) {
      this.domElt.addStyle('font-size', value + 'px');
    } else {
      this.domElt.removeStyle('font-size');
      value = undefined;
    }

    return value;
  },
  descriptor: {
    type: "number",
    nullable: true,
    defaultValue: 14,
    sign: "FontSize"
  },
  export: function (ref) {
    return ref.get() || undefined;
  }
};
TextStyleHandlers.font = {
  set: function (value) {
    if (value && value !== 'None' && value !== 'unset') this.domElt.addStyle('font-family', value);else this.domElt.removeStyle('font-family');
    return value;
  },
  descriptor: {
    type: "font",
    sign: 'TextFont'
  }
};
TextStyleHandlers.fontStyle = {
  set: function (value) {
    if (!fontStyle2DomStyle[value]) value = 'Regular';
    this.domElt.addStyle(fontStyle2DomStyle[value] || fontStyle2DomStyle.Regular);
    return value;
  },
  descriptor: {
    type: "enum",
    values: ['Regular', 'Italic', 'Bold', 'Bold italic'],
    sign: 'FontStyle'
  },
  export: function () {
    var value = arguments[arguments.length - 1].get();
    if (value === 'Regular') return undefined;
    return value;
  }
};
var fontStyle2DomStyle = {
  Regular: {
    fontWeight: 'normal',
    fontStyle: 'normal'
  },
  Bold: {
    fontWeight: 'bold',
    fontStyle: 'normal'
  },
  'Bold italic': {
    fontWeight: 'bold',
    fontStyle: 'italic'
  },
  Italic: {
    fontWeight: 'normal',
    fontStyle: 'italic'
  }
};
exports.fontStyle2DomStyle = fontStyle2DomStyle;
TextStyleHandlers.textAlign = {
  set: function (value) {
    if (['left', 'center', 'right'.indexOf(value) >= 0]) this.domElt.addStyle('text-align', value);else this.domElt.addStyle('text-align', 'left');
    return value;
  },
  descriptor: {
    type: "textAlign",
    sign: "TextAlign"
  }
};
var _default = TextStyleHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/FmFragment.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/FmFragment.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.makeFmFragmentClass = makeFmFragmentClass;
exports.default = void 0;

var _GrandContext = _interopRequireDefault(require("absol/src/AppPattern/GrandContext"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _FNode = _interopRequireWildcard(require("./FNode"));

var _FModel = _interopRequireDefault(require("./FModel"));

var _Assembler = require("./Assembler");

var _FCore = require("./FCore");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _CCBlock = _interopRequireDefault(require("absol/src/AppPattern/circuit/CCBlock"));

var _inheritComponentClass = _interopRequireDefault(require("./inheritComponentClass"));

var _utils = require("./utils");

var _BaseBlock = _interopRequireDefault(require("./BaseBlock"));

var _utils2 = require("absol-acomp/js/utils");

var _ContextManager = _interopRequireDefault(require("absol/src/AppPattern/ContextManager"));




/****
 * life cycle
 * on_start: CONFIG => VIEW => AUTO_START_BLOCK => LOADED
 */

/***
 * @constructor
 * @augments FNode
 * @augments BaseBlock
 */
function FmFragment() {
  _FNode.default.call(this);

  this.ctxMng = new _ContextManager.default(); //like GrandContext

  _EventEmitter.default.call(this);

  _FModel.default.call(this);

  _CCBlock.default.call(this, {
    id: (0, _utils.randomUniqueIdent)()
  });

  this.emittor = this;
  this._componentNameList = [];
  this.boundConfig = {};
  this._config = {};
  Object.defineProperty(this, 'config', {
    set: function (value) {
      Object.assign(this._config, value);
    },
    get: function () {
      return this._config;
    }
  });
  this.boundProps = {};
  this._props = {};
  this.view = null;
  this.blocks = [];
  this.lines = [];
  this.entries = [];
  this.propsGates = [];
  this.domSignal = null;
  this.entryCompletedBlocks = [];
  this.entryCompleted = false;
  this.entryTasks = [];
  this.onCreate();
  this.buildContentView();

  this._bindView();

  this.onCreated();
  this.domSignal.on('request_fragment_auto_start', function () {
    if (!this.parent) this.start();
    this.onReady();
    this.emit('ready', {
      target: this,
      type: 'ready'
    }, this);
  }.bind(this));
  this.domSignal.emit('request_fragment_auto_start');
  this.domSignal.on('check_entry_completed', this._checkEntryCompleted.bind(this));
}

(0, _inheritComponentClass.default)(FmFragment, _FNode.default, _BaseBlock.default);
FmFragment.prototype.type = 'FRAGMENT';
FmFragment.prototype.tag = 'FmFragment';
FmFragment.prototype.menuIcon = 'span.mdi.mdi-terraform';
FmFragment.prototype.primaryName = '$value$';

FmFragment.prototype.buildContentView = function () {
  var contentViewData = this.contentViewData;

  if (contentViewData.attributes && contentViewData.attributes.primaryName) {
    this.primaryName = contentViewData.attributes.primaryName;
  }

  var blocks;
  var layout;
  var lines;
  var i;
  var block;
  var line;
  var blockDict = {};

  if (contentViewData.tag) {
    layout = contentViewData;
  } else {
    layout = contentViewData.layout;
    blocks = contentViewData.circuit && contentViewData.circuit.blocks;
    lines = contentViewData.circuit && contentViewData.circuit.lines;
  }

  if (layout) {
    this.view = _Assembler.AssemblerInstance.buildComponent(layout, this);
    this.view.domElt.addClass('as-fm-fragment');
    (0, _FNode.traversal)(this.view, path => {
      if (path.node.fragment === this) {
        blockDict[path.node.attributes.id] = path.node;
        blockDict[path.node.attributes.name] = path.node;
      } else {
        blockDict[path.node.attributes.id] = path.node.fragment;
        blockDict[path.node.attributes.name] = path.node.fragment;
        path.skipChildren();
      }
    });
    /*this.view.pinHandlers = Object.assign({}, this.view.pinHandlers);
    this.view.pinHandlers.props = {
        receives: function (value) {
            self.props = value;
        },
        get: function () {
            return self.props;
        },
        descriptor: {
            type: 'object'
        }
    }*/
  } else {
    throw new Error("Invalid Fragment class: layout must not be null!");
  }

  if (blocks) {
    for (i = 0; i < blocks.length; ++i) {
      block = _Assembler.AssemblerInstance.buildBlock(blocks[i], this);
      blockDict[block.attributes.id] = block;
      if (block.attributes.name) blockDict[block.attributes.name] = block;
      this.blocks.push(block);

      if (block.autoStart) {
        this.entries.push(block);
      }

      if (block.tag === 'CBPropsGate') {
        this.propsGates.push(block);
      }

      if (block.tag === 'CBEntryCompleted') {
        this.entryCompletedBlocks.push(block);
      }
    }
  }

  if (lines) {
    for (i = 0; i < lines.length; ++i) {
      line = _Assembler.AssemblerInstance.buildLine(lines[i], blockDict);
      if (line) this.lines.push(line);
    }
  }

  if (!this.view.domElt.domSignal) {
    this.view.domElt.$domSignal = (0, _FCore._)('attachhook');
    this.view.domElt.appendChild(this.view.domElt.$domSignal);
    this.view.domElt.domSignal = new _DomSignal.default(this.view.domElt.$domSignal);
  }

  this.domSignal = this.view.domElt.domSignal;
  this.domSignal.on('fire_props_pin', this.pinFirePropsChange.bind(this));
  (0, _FNode.traversal)(this.view, path => {
    path.node.onFragmentAttached();

    if (path.node.fragment !== this) {
      path.skipChildren();
    }
  });
  this.blocks.forEach(block => {
    if (block.onAttached) block.onAttached();

    if (block.bindDataToFragment) {
      block.bindDataToFragment();
    }
  });
  this.view.updateEmbark();
};

FmFragment.prototype.execEntry = function () {
  for (var i = 0; i < this.entries.length; ++i) {
    this.entries[i].exec();
  }
};

FmFragment.prototype.execEntryCompleted = function () {
  for (var i = 0; i < this.entryCompletedBlocks.length; ++i) {
    this.entryCompletedBlocks[i].exec();
  }
};

FmFragment.prototype.execTrigger = function (name) {
  var path;

  if (name instanceof Array) {
    path = name;
  } else {
    path = name.split('.');
  }

  var frag = this;
  var view;

  while (path.length > 1) {
    view = frag.findViewByName(frag.primaryName);
    if (!view) view = frag.findViewByName(path.shift());

    if (!view) {
      console.error('Not found:', name);
      return;
    }

    frag = view.fragment;
  }

  name = path.pop();
  var block = frag.blocks.find(block => block.attributes.name === name);

  if (block) {
    if (block.exec) block.exec();
  } else {
    console.error('Not found:', name);
  }
};

FmFragment.prototype.onReady = _noop.default; //reassign this property in constructor or onCreate to change default layout,
// this data will be use for assembler

FmFragment.prototype.contentViewData = {
  tag: 'LinearLayout'
};
FmFragment.prototype.onCreate = _noop.default;
/**
 * call by assembly
 */

FmFragment.prototype.onCreated = _noop.default;

FmFragment.prototype.start = function (standBy) {
  if (this.state.match(/DIE/)) {
    console.error(this, 'DIED!');
    return;
  }

  if (this.state.match(/RUNNING/)) return;

  if (this.state.match(/STOP|CREATE/)) {
    this.state = "STANDBY";
    this.onStart && this.onStart();
    this.view.start(true);
    this.children.forEach(child => child.start(true));
    this.emit('start', {
      type: 'start',
      target: this
    }, this);
    this.execEntry();

    this._waitEntryCompleted();
  }

  if (!standBy && this.state.match(/STANDBY|PAUSE/)) {
    this.resume();
  }
};

FmFragment.prototype.resume = function () {
  var state = this.state;
  this.view.start();

  _FNode.default.prototype.resume.apply(this, arguments);

  if (state !== this.state) this.emit('resume', {
    type: 'resume',
    target: this
  }, this);
  this.children.forEach(child => child.resume());
};

FmFragment.prototype.pause = function () {
  var state = this.state;
  this.view.pause();
  this.children.forEach(child => child.pause());

  _FNode.default.prototype.pause.apply(this, arguments);

  if (state !== this.state) this.emit('pause', {
    type: 'pause',
    target: this
  }, this);
};

FmFragment.prototype.stop = function () {
  this.children.forEach(child => child.stop());
  if (this.state.match(/STOP|DIE|CREATE/)) return;
  if (this.state.match(/RUNNING/)) this.pause();
  this.children.forEach(child => child.stop());
  this.view.stop();
  this.state = "STOP";
  this.onStop && this.onStop();
  this.emit('stop', {
    type: 'stop',
    target: this
  }, this);
};

FmFragment.prototype.destroy = function () {
  this.children.forEach(child => child.destroy());
  if (this.state.match(/DIE/)) return;
  if (this.state.match(/RUNNING|PAUSE/)) this.stop();
  this.view.destroy();
  this.state = "DIE";
  this.onDestroy && this.onDestroy();
  this.emit('destroy', {
    type: 'destroy',
    target: this
  }, this);
};
/***
 *
 * @param {String} id
 */


FmFragment.prototype.findViewByName = function (id) {
  return this['$' + id];
};

FmFragment.prototype._bindView = function () {
  while (this._componentNameList.length > 0) {
    delete this['$' + this._componentNameList.pop()];
  }

  if (!this.view) return;
  var thisFm = this;
  /***
   *
   * @param {BaseComponent} root
   */

  function visit(root) {
    var id = root.getAttribute('name');

    if (id) {
      thisFm['$' + id] = root;

      thisFm._componentNameList.push(id);

      if (root.fragment && root.fragment !== thisFm) return; //hold by other fragment

      root.children.forEach(visit);
    }
  }

  visit(this.view);
};

FmFragment.prototype.notifyPropsChange = function (info) {
  if (this.domSignal) {
    this._propsChangeInfo = this._propsChangeInfo || {};
    this._propsChangeInfo.names = this._propsChangeInfo.names || [];
    if (this._propsChangeInfo.names.indexOf(info.name) < 0) this._propsChangeInfo.names.push(info.name);
    this._propsChangeInfo.path = [];
    this.domSignal.emit('fire_props_pin', this._propsChangeInfo);
  }
};

FmFragment.prototype.pinFirePropsChange = function (info) {
  this._propsChangeInfo = info;
  var frag = this;
  var parent = frag.parent;
  this.propsGates.forEach(function (block) {
    block.pinFire('props');
    if (info) block.pinFire('props_change_info', info);
  });
  this.pinFire('props');

  if (parent && this.view.attributes.dataBinding) {
    parent.pinFirePropsChange(info && {
      names: info.names,
      path: [frag.view.attributes.name].concat(info.path)
    });
  }

  this._propsChangeInfo = null;
};

FmFragment.prototype.newTask = function () {
  var self = this;
  var id = (0, _stringGenerate.randomIdent)(10);

  function finish() {
    var idx = self.entryTasks.indexOf(id);

    if (idx >= 0) {
      self.entryTasks.splice(idx, 1);
      if (self.entryTasks.length === 0) self.domSignal.emit('check_entry_completed');
    }
  }

  this.entryTasks.push(id);
  return {
    fragment: this,
    id: id,
    finish: finish
  };
};

FmFragment.prototype._checkEntryCompleted = function () {
  if (!this.entryCompleted && this.entryTasks.length === 0) {
    this.entryCompleted = true;
    this.emit("entry_completed");
    window.ABSOL_DEBUG && console.log("entryCompleted", this);
    this.execEntryCompleted();
  }
};

FmFragment.prototype._waitEntryCompleted = function () {
  this.children.forEach(function (fc) {
    var loadingTask = this.newTask();
    fc.start();
    fc.afterEntryCompleted().then(loadingTask.finish.bind(loadingTask));
  }.bind(this));

  this._checkEntryCompleted();
};

FmFragment.prototype.afterEntryCompleted = function () {
  if (this.entryCompleted) return Promise.resolve();
  return new Promise(function (resolve) {
    this.once('entry_completed', resolve);
  }.bind(this));
};
/***
 * @typedef FmVerifyInfo
 * @property {boolean} completed
 * @property {BaseComponent} [comp] - null when ok=true
 */

/**
 * @return {FmVerifyInfo}
 */


FmFragment.prototype.verify = function () {
  var result = {
    completed: true
  };
  (0, _FNode.traversal)(this.view, path => {
    if (!result.completed) return;
    var node = path.node;
    var cResult;

    if (node.attributes.disembark) {
      path.skipChildren();
    } else if (node.fragment === this) {
      if (node.verify) {
        cResult = node.verify();
      }

      if (cResult && cResult.completed === false) {
        result = cResult;
        path.stop();
      }
    } else {
      cResult = node.fragment.verify();
      path.skipChildren();

      if (cResult && cResult.completed === false) {
        result = cResult;
        path.stop();
      }
    }
  });
  return result;
};

Object.defineProperty(FmFragment.prototype, 'domElt', {
  get: function () {
    return this.view && this.view.view;
  }
});
Object.defineProperty(FmFragment.prototype, 'props', {
  get: function () {
    if (this.primaryName in this._props) return this._props[this.primaryName];
    return this._props;
  },
  set: function (props) {
    var prevKey = (0, _utils2.keyStringOf)(this.props);

    if (this.primaryName in this._props) {
      this._props[this.primaryName] = props;
    } else {
      Object.assign(this._props, props);
    }

    var newKey = (0, _utils2.keyStringOf)(this.props);

    if (newKey !== prevKey) {
      this.pinFire('props');
    }
  },
  enumerable: true
});
Object.defineProperty(FmFragment.prototype, 'parentFragment', {
  get: function () {
    var pE = this.domElt.parentElement;

    while (pE) {
      if (pE.fragment) return pE.fragment;
      pE = pE.parentElement;
    }

    return null;
  }
});
FmFragment.prototype.pinHandlers.props = {
  receives: function (value) {
    this.props = value;
  },
  get: function () {
    return this.props;
  }
};
var _default = FmFragment;
/***
 *
 * @param {{tag: string ,contentViewData?:Object, prototype?: Object}} opt
 * @return {Function}
 */

exports.default = _default;

function makeFmFragmentClass(opt) {
  function CustomFmFragment() {
    FmFragment.apply(this, arguments);
  }

  (0, _inheritComponentClass.default)(CustomFmFragment, FmFragment);
  CustomFmFragment.prototype.tag = opt.tag || 'CustomFmFragment_' + (0, _stringGenerate.randomIdent)(10);
  if (opt.contentViewData) CustomFmFragment.prototype.contentViewData = opt.contentViewData;

  if (opt.prototype) {
    Object.defineProperties(CustomFmFragment.prototype, Object.getOwnPropertyDescriptors(opt.prototype));
  }

  return CustomFmFragment;
}
};

moduleFactories["node_modules/absol-form/js/core/NotFoundForm.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/NotFoundForm.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FmFragment = _interopRequireDefault(require("./FmFragment"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _inheritComponentClass = _interopRequireDefault(require("./inheritComponentClass"));


/***
 * @extends FmFragment
 * @constructor
 */
function NotFoundForm() {
  _FmFragment.default.apply(this, arguments);
}

_OOP.default.mixClass(NotFoundForm, _FmFragment.default);

NotFoundForm.prototype.contentViewData = {
  "app": "ABSOL_FORM_EDITOR",
  "version": "1.0.0",
  "layout": {
    "tag": "ChainLayout",
    "attributes": {
      "name": "Linear1",
      "dataBinding": true,
      "id": "Q_fhEZHA63qZw2sb"
    },
    "style": {
      "paddingLeft": 10,
      "paddingRight": 10,
      "paddingTop": 10,
      "paddingBottom": 10,
      "height": "auto",
      "width": "auto"
    },
    "children": [{
      "tag": "Text",
      "attributes": {
        "name": "Text_0",
        "dataBinding": true,
        "text": "<span  class=\"mdi mdi-alert-decagram\"> Lỗi không tìm thấy form ",
        "textDecode": "html",
        "id": "Q_fhEZLR9P8Y9WDC"
      },
      "style": {
        "height": "auto",
        "width": "auto",
        "font": "unset",
        "textAlign": "left",
        "textColor": "#bf360cff",
        "hidden": false,
        "vAlign": "top",
        "hAlign": "left"
      }
    }, {
      "tag": "Text",
      "attributes": {
        "name": "tag",
        "dataBinding": true,
        "target": "",
        "text": " ",
        "id": "Q_fWM5LoCeYUPK4G"
      },
      "style": {
        "height": "auto",
        "width": "auto",
        "font": "unset",
        "fontStyle": "Bold",
        "textAlign": "left",
        "textColor": "#e64a19ff",
        "hidden": false,
        "vAlign": "top"
      }
    }]
  },
  "circuit": {
    "blocks": [{
      "attributes": {
        "id": "Q_fWM5Jq3rReI1Uo",
        "name": "onStart"
      },
      "tag": "CBEntry"
    }, {
      "attributes": {
        "id": "Q_fWM5KanxCitlte",
        "name": "getTag",
        "args": [],
        "body": "return this.fragment.tag;"
      },
      "tag": "function"
    }],
    "lines": [{
      "u": "onStart",
      "v": "getTag",
      "uPin": "signal",
      "vPin": "exec",
      "id": "Q_fWM5B8gpdgiWAO"
    }, {
      "u": "getTag",
      "v": "tag",
      "uPin": "result",
      "vPin": "text",
      "id": "Q_fWM5Mp9FgxLv4z"
    }]
  }
};
var _default = NotFoundForm;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/Assembler.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/Assembler.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.findComponentByName = findComponentByName;
exports.findComponentById = findComponentById;
exports.findComponent = findComponent;
exports.AssemblerInstance = exports.default = void 0;

var _FNode = require("./FNode");

var _BaseComponent = _interopRequireDefault(require("./BaseComponent"));

var _FmFragment = _interopRequireDefault(require("./FmFragment"));

var _CCLine = _interopRequireDefault(require("absol/src/AppPattern/circuit/CCLine"));

var _NotFoundForm = _interopRequireDefault(require("./NotFoundForm"));


function Assembler() {}

Assembler.prototype.classes = {};
Assembler.prototype.componentConstructors = {};
Assembler.prototype.fragmentConstructors = {}; //share data

Assembler.prototype.addClass = function () {
  var type;
  var tag;
  var clazz;

  if (arguments.length === 1) {
    clazz = arguments[0];
    if (typeof clazz !== 'function') return this;
    tag = clazz.prototype.tag;
  } else if (arguments.length === 2) {
    clazz = arguments[1];
    if (typeof clazz !== 'function') return this;
    tag = arguments[0];
  }

  if (!clazz) return this;
  type = clazz.prototype.type;
  this.classes[type] = this.classes[type] || {};
  this.classes[type][tag] = clazz;
};
/***
 *
 * @param data
 * @param {FmFragment=} frag
 * @return {BaseComponent|FmFragment}
 */


Assembler.prototype.build = function (data, frag) {
  if (data.class) {
    return this.buildFragment(data);
  } else if (data.tag) {
    return this.buildComponent(data, frag);
  } else throw new Error("Can not detect data type!");
};

Assembler.prototype.buildFragment = function (data) {
  var constructor;

  if (typeof data.class === 'string') {
    constructor = this.classes[_FmFragment.default.prototype.type] && this.classes[_FmFragment.default.prototype.type][data.class] || data.class.split('.').reduce(function (ac, cr) {
      if (ac) {
        ac = ac[cr];
      }

      return ac;
    }, window);
  } else if (typeof data.class === "function" && data.class.prototype.type === "FRAGMENT") {
    constructor = data.class;
  }

  if (!constructor) {
    console.error(data);
    constructor = _NotFoundForm.default; // throw  new Error("Invalid FmFragment class!");
  }

  var frag = new constructor();

  if (constructor === _NotFoundForm.default && typeof data.class === 'string') {
    frag.tag = data.class;
  }

  if (data.style) frag.view.setStyles(data.style);
  if (data.attributes) frag.view.setAttributes(data.attributes);

  if (typeof data.onCreated === "function") {
    data.onCreated.apply(frag, frag.view);
  } else if (typeof data.onCreated === "string") {
    new Function('fragment', data.onCreated).call(frag, frag.view);
  }

  return frag;
};
/***
 *
 * @param data
 * @param {FmFragment=} frag
 * @return {BaseComponent}
 */


Assembler.prototype.buildComponent = function (data, frag) {
  var construction;
  if (typeof data.tag === "function") construction = data.tag;else construction = this.classes[_BaseComponent.default.prototype.type][data.tag];
  if (!construction) throw new Error("Invalid tag " + data.tag);
  var result = new construction();
  result.fragment = frag;
  var style = data.style;
  if (typeof style == 'object') Object.assign(result.style, style);
  var attributes = data.attributes;
  if (typeof attributes == 'object') Object.assign(result.attributes, attributes);
  var events = data.events;
  if (typeof events == 'object') for (var eventName in events) {
    result.setEvent(eventName, events[eventName]);
  }

  if (typeof data.onCreated === "function") {
    data.onCreated.apply(result, []);
  } else if (typeof data.onCreated === "string") {
    new Function(data.onCreated).call(result);
  }

  var children = data.children;

  if (children && children.length > 0) {
    for (var i = 0; i < children.length; ++i) {
      var child = this.build(children[i], frag);

      if (child.type === "FRAGMENT") {
        result.addChild(child.view);
        if (frag) frag.addChild(child);
      } else result.addChild(child);
    }
  }

  return result;
};

Assembler.prototype.buildBlock = function (data, frag) {
  var clazz;

  if (typeof data.tag === 'function') {
    clazz = data.tag;
  } else if (typeof data.tag === 'string') {
    clazz = this.classes['BLOCK'][data.tag];
  }

  if (!clazz) throw new Error('Invalid block tag ' + data.tag);
  var result = new clazz();
  result.fragment = frag;

  if (typeof data.attributes === "object") {
    Object.assign(result.attributes, data.attributes);
  }

  if (typeof data.onCreated === "function") {
    data.onCreated.apply(result, []);
  } else if (typeof data.onCreated === "string") {
    new Function(data.onCreated).call(result);
  }

  return result;
};

Assembler.prototype.buildLine = function (data, blocks) {
  var u = blocks[data.u];
  var v = blocks[data.v];

  if (u && v) {
    return new _CCLine.default(u, data.uPin, v, data.vPin, !!data.twoWay);
  }
};
/***
 * @deprecated
 * @returns {Assembler}
 */


Assembler.prototype.addConstructor = function () {
  return this.addClass.apply(this, arguments);
};
/***
 * @deprecated
 * @param arg0
 * @param arg1
 */


Assembler.prototype.removeConstructor = function (arg0, arg1) {
  if (typeof arg0 == 'function') {
    var name = arg0.prototype.tag || arg0.name;

    switch (arg0.prototype.type) {
      case "FRAGMENT":
        delete this.fragmentConstructors[name];
        break;

      case "COMPONENT":
        delete this.componentConstructors[name];
        break;
    }
  } else if (typeof arg0 == 'string' && (this.componentConstructors[arg0] === arg1 || arg1 == undefined)) {
    delete this.componentConstructors[arg0];
    delete this.fragmentConstructors[arg0];
  }
};

Assembler.prototype.addComponent = function (name, construction) {
  this.addConstructor(name, construction);
};

Assembler.prototype.removeComponent = function (name, construction) {
  this.removeConstructor(name, construction);
};

var _default = Assembler;
exports.default = _default;
var AssemblerInstance = new Assembler();
exports.AssemblerInstance = AssemblerInstance;

function findComponentByName(root, name) {
  var res = null;
  (0, _FNode.traversal)(root, function (ac) {
    if (ac.node.getAttribute('name') === name) {
      ac.stop();
      res = ac.node;
    }
  });
  return res;
}

function findComponentById(root, id) {
  var res = null;
  (0, _FNode.traversal)(root, function (ac) {
    if (ac.node.attributes.id === id) {
      ac.stop();
      res = ac.node;
    }
  });
  return res;
}

function findComponent(root, opt) {
  var res = null;
  opt = opt || {};

  if (typeof opt === 'string') {
    opt = {
      name: opt
    };
  }

  function isMatch(comp) {
    if (opt.name && opt.name === comp.getAttribute('name')) return true;
    return false;
  }

  (0, _FNode.traversal)(root, function (ac) {
    if (ac.node !== root && !opt.depth && ac.node.isFragmentView) {
      ac.skipChildren();
      return;
    }

    if (isMatch(ac.node)) {
      ac.stop();
      res = ac.node;
    }
  });
  return res;
}
};

moduleFactories["node_modules/absol-form/js/components/Text.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/Text.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _showdown = _interopRequireDefault(require("showdown"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _TextStyleHandlers = _interopRequireDefault(require("./handlers/TextStyleHandlers"));

var _Assembler = require("../core/Assembler");

var _datetime = require("absol/src/Time/datetime");


var _ = _FCore.default._;
var showDownConverter = new _showdown.default.Converter();
/***
 * @extends ScalableComponent
 * @constructor
 */

function Text() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(Text, _ScalableComponent.default);
Text.prototype.tag = "Text";
Text.prototype.menuIcon = "span.mdi.mdi-format-color-text";
Text.prototype.attributeHandlers.text = {
  set: function (value) {
    var ref = arguments[arguments.length - 1];
    var prev = ref.get();

    switch (this.attributes.textDecode) {
      case 'html':
        this.domElt.innerHTML = (value || '') + '';
        break;

      case 'markdown':
        this.domElt.innerHTML = showDownConverter.makeHtml((value || '') + '').trim().replace(/(^<p>)|(<\/p>$)/, '');
        break;

      case 'dd/MM/yyyy':
      case 'date':
        if (value instanceof Date) {
          this.domElt.clearChild().addChild(_({
            text: (0, _datetime.formatDateTime)(value, 'dd/MM/yyyy')
          }));
        } else {
          this.domElt.clearChild().addChild(_({
            text: (value || '') + ''
          }));
        }

        break;

      case 'dd/MM/yyyy hh:mm a':
      case 'date_time':
        if (value instanceof Date) {
          this.domElt.clearChild().addChild(_({
            text: (0, _datetime.formatDateTime)(value, 'dd/MM/yyyy hh:mm a')
          }));
        } else {
          this.domElt.clearChild().addChild(_({
            text: (value || '') + ''
          }));
        }

        break;

      default:
        if (typeof value === "number") value = value + '';else if (typeof value === "boolean") value = value + '';else if (value instanceof Array) {
          value = JSON.stringify(value);
        } else if (typeof value !== "string") {
          value = value + '';
        }
        this.domElt.clearChild().addChild(_({
          text: (value || '') + ''
        }));
    }

    ref.set(value);

    if (prev !== value) {
      this.pinFire('text');
      this.pinFire('value');
      this.notifyChange();
    }

    return value;
  },
  descriptor: {
    type: "text",
    long: true,
    sign: "HyperText"
  }
};
Text.prototype.attributeHandlers.textDecode = {
  set: function (value) {
    // if (['none', 'markdown', 'html'].indexOf(value) < 0) value = 'none';
    var ref = arguments[arguments.length - 1];
    var currentValue = ref.get();

    if (currentValue !== value) {
      this.domElt.removeClass('as-decode-' + currentValue);
      this.domElt.addClass('as-decode-' + value);
      ref.set(value);
      this.attributes['text'] = this.attributes.text;
    }

    return value;
  },
  export: function (ref) {
    var value = ref.get() || 'none';
    if (value === 'none') return undefined;
    return value;
  },
  descriptor: {
    type: "enum",
    values: ['none', 'markdown', 'html', 'date', 'date_time'],
    sign: 'TextDecode'
  }
};
Object.assign(Text.prototype.styleHandlers, _TextStyleHandlers.default);
Text.prototype.pinHandlers.text = {
  receives: function (value) {
    this.attributes.text = value;
  },
  get: function () {
    return this.attributes.text;
  },
  descriptor: {
    type: 'text'
  }
};
Text.prototype.pinHandlers.value = Text.prototype.pinHandlers.text;
Text.prototype.attributes.textDecode = 'none';
Text.prototype.style.textAlign = 'left';
Text.prototype.style.textColor = 'black';
Text.prototype.style.font = 'unset';

Text.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.text = this.attributes.name;
};

Text.prototype.render = function () {
  return _('div.absol-bscroller.as-text.cke_contents_ltr');
};

Text.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    set: function (value) {
      thisC.setAttribute('text', value);
    },
    get: function () {
      return thisC.getAttribute('text');
    }
  };
};

_Assembler.AssemblerInstance.addClass(Text);

var _default = Text;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/handlers/InputAttributeHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/handlers/InputAttributeHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.InputAttributeNames = exports.default = void 0;
var InputAttributeHandlers = {};
InputAttributeHandlers.disabled = {
  set: function (value) {
    if (this.$content) {
      this.$content.disabled = !!value;
    } else {
      this.domElt.disabled = !!value;
    }
  },
  get: function () {
    if (this.$content) {
      return this.$content.disabled;
    } else {
      return this.domElt.disabled;
    }
  },
  descriptor: {
    type: 'bool'
  },
  export: function () {
    return this.attributes.disabled || undefined;
  }
};
InputAttributeHandlers.readOnly = {
  set: function (value) {
    if (this.$content) {
      this.$content.readOnly = value;
    } else {
      this.domElt.readOnly = !!value;
    }
  },
  get: function () {
    if (this.$content) {
      return this.$content.readOnly;
    } else {
      return this.domElt.readOnly;
    }
  },
  descriptor: {
    type: 'bool'
  },
  export: function () {
    return this.attributes.readOnly || undefined;
  }
};
InputAttributeHandlers.required = {
  set: function (value) {
    return !!value;
  },
  get: function (ref) {
    return ref.get() || false;
  },
  descriptor: {
    type: 'bool'
  },
  export: function () {
    return this.attributes.required || undefined;
  }
};
var _default = InputAttributeHandlers;
exports.default = _default;
var InputAttributeNames = ['disabled'];
exports.InputAttributeNames = InputAttributeNames;
};

moduleFactories["node_modules/absol-form/js/components/handlers/InputStyleHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/handlers/InputStyleHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var InputStyleHandlers = {};
InputStyleHandlers.border = {
  set: function (value) {
    if (value === 'none') {
      if (this.$content) {
        this.$content.addClass('as-border-none');
      } else {
        this.domElt.addClass('as-border-none');
      }
    } else {
      if (this.$content) {
        this.$content.removeClass('as-border-none');
      } else {
        this.domElt.removeClass('as-border-none');
      }
    }

    return value || undefined;
  },
  export: function (ref) {
    var value = ref.get();
    if (value === 'default') value = undefined;
    return value;
  },
  descriptor: {
    type: 'enum',
    values: ['default', 'none']
  }
};
var _default = InputStyleHandlers;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TextInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TextInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

require("../../css/component.css");

var _Text = _interopRequireDefault(require("./Text"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function TextInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(TextInput, _ScalableComponent.default, _Text.default);
delete TextInput.prototype.attributeHandlers.text;
delete TextInput.prototype.attributeHandlers.textDecode;
TextInput.prototype.tag = "TextInput";
TextInput.prototype.menuIcon = "span.mdi.mdi-form-textbox";
TextInput.prototype.SUPPORT_ATTRIBUTE_NAMES = ['value'];
TextInput.prototype.SUPPORT_EVENT_NAMES = ['change'];
Object.assign(TextInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(TextInput.prototype.styleHandlers, _InputStyleHandlers.default);
TextInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    this.domElt.value = value;

    if (prev !== this.domElt.value) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: "text",
    sign: "SimpleText"
  }
};
TextInput.prototype.attributeHandlers.placeHolder = {
  set: function (value) {
    this.domElt.placeholder = value;
  },
  get: function () {
    return this.domElt.placeholder;
  },
  descriptor: {
    type: "text",
    sign: "TextPlaceHolder"
  },
  export: function () {
    var value = this.domElt.placeholder;
    return value || undefined;
  }
};
TextInput.prototype.attributeHandlers.textType = {
  set: function (value) {
    if (['normal', 'password'].indexOf(value) < 0) value = 'normal';
    this.domElt.attr('type', {
      normal: 'text',
      password: 'password'
    }[value]);
    if (value === 'password') this.domElt.attr('autocomplete', 'new-password');else this.domElt.attr('autocomplete', undefined);
    return value;
  },
  descriptor: {
    type: "enum",
    values: ['normal', 'password'],
    sign: 'InputTextType'
  },
  export: function () {
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    return value === 'normal' ? undefined : value;
  }
};
TextInput.prototype.pinHandlers.value = {
  get: function () {
    return this.attributes.value;
  },
  receives: function (value) {
    this.attributes.value = value;
  }
};
TextInput.prototype.pinHandlers.blur = {
  get: function () {
    return true;
  }
};
TextInput.prototype.pinHandlers.userModified = {
  get: function () {
    return true;
  }
};

TextInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  var self = this;
  var lastValue;
  this.domElt.on('focus', function () {
    lastValue = this.value;
  }).on('keyup', function (event) {
    if (this.value !== lastValue) {
      self.pinFire('userModified');
      self.pinFire('value');
      self.notifyChange();
      lastValue = this.value;
    }
  }).on('blur', function () {
    if (this.value !== lastValue) {
      self.pinFire('value');
      self.notifyChange();
      lastValue = this.value;
    }

    self.pinFire('blur');
  });
};

TextInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.style.textAlign = 'left';
  this.attributes.value = '';
  this.attributes.placeHolder = '';
  this.style.textType = 'normal';
  this.style.textColor = 'black';
  this.style.textSize = 0;
  this.style.textAlign = 'left';
  this.style.font = 'unset';
};

TextInput.prototype.render = function () {
  return _('input[type="text"][autocomplete="off"].as-text-input');
};

TextInput.prototype.getAcceptsStyleNames = function () {
  return _Text.default.prototype.getAcceptsStyleNames.call(this);
};

TextInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

TextInput.prototype.verify = function () {
  if (this.attributes.required) {
    if (this.attributes.value.trim().length > 0) {
      return {
        completed: true
      };
    } else {
      return {
        completed: false,
        comp: this
      };
    }
  } else {
    return {
      completed: true
    };
  }
};

_Assembler.AssemblerInstance.addClass(TextInput);

var _default = TextInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/BaseLayout.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/BaseLayout.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("./ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("./inheritComponentClass"));


function BaseLayout() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(BaseLayout, _ScalableComponent.default);
BaseLayout.prototype.isLayout = true;
BaseLayout.prototype.styleHandlers.backgroundImage = {
  set: function (value) {
    if (value && value.length > 0) {
      this.domElt.addStyle('backgroundImage', 'url(' + value + ')');
      this.domElt.addStyle('backgroundSize', '100% 100%');
    } else {
      this.domElt.removeStyle('backgroundImage');
      this.domElt.removeStyle('backgroundSize');
    }

    return value;
  },
  export: function (ref) {
    return ref.get() || undefined;
  },
  descriptor: {
    type: 'text',
    long: true,
    sign: 'BackgroundImageSrc',
    independence: true
  }
};
BaseLayout.prototype.styleHandlers.backgroundColor = {
  set: function (value) {
    if (value) {
      this.domElt.addStyle('backgroundColor', value);
    } else {
      this.domElt.removeStyle('backgroundColor');
    }

    return value;
  },
  descriptor: {
    type: 'color',
    sign: 'BackgroundColor',
    independence: true
  }
};

BaseLayout.prototype.create = function () {
  _ScalableComponent.default.prototype.create.call(this);

  this.style.vAlign = 'fixed';
  this.style.hAlign = 'fixed';
  this.style.backgroundColor = 'rgba(0, 0, 0, 0)';
  this.style.backgroundImage = '';
};

BaseLayout.prototype.addChildByPosition = function (child, posX, posY) {
  throw new Error("Not implement!");
};

BaseLayout.prototype.getAcceptsStyleNames = function () {
  return _ScalableComponent.default.prototype.getAcceptsStyleNames.call(this).concat(['backgroundColor', 'backgroundImage']);
};

BaseLayout.prototype.bindDataToFragment = function (parentDisembark, reset) {
  if (!this.fragment) return;
  if (!this.fragment.parent) return;
  /***
   *
   * @type {FmFragment}
   */

  var parentFragment = this.fragment.parent;
  var fragment = this.fragment;
  var name = this.attributes.name;
  if (!name) return;
  var boundProp = parentFragment.boundProps[name];
  if (!reset && boundProp === this) return;
  var descriptor = {
    set: function (obj) {
      fragment.props = obj;
    },
    get: function () {
      return fragment.props;
    }
  };
  if (!this.attributes.dataBinding) return;
  var obj = parentFragment.props;
  Object.assign(descriptor, {
    enumerable: !this.attributes.disembark && !parentDisembark,
    configurable: true
  });
  Object.defineProperty(obj, name, descriptor);
  this.fragment.boundProps[name] = this;
};

BaseLayout.prototype.unbindDataInFragment = function () {
  if (!this.fragment) return;
  if (!this.fragment.parent) return;
  var name = this.attributes.name;
  if (!name) return;
  /***
   *
   * @type {FmFragment}
   */

  var parentFragment = this.fragment.parent;
  var boundProp = parentFragment.boundProps[name];
  if (boundProp !== this) return;
  var obj = parentFragment.props;
  delete obj[name];
  delete parentFragment.boundProps[name];
};

var _default = BaseLayout;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/Icons.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/Icons.js ***/
"use strict";

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ACore = _interopRequireDefault(require("absol-acomp/ACore"));


var _ = _FCore.default._;

_FCore.default.install('mdi-align-horizontal-left', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
            <path fill="#000000" d = "M22 13V19H6V13H22M6 5V11H16V5H6M2 2V22H4V2H2" />\
        </svg>');
});

_FCore.default.install('mdi-align-horizontal-center', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
             <path fill="#000000" d="M20 19H13V22H11V19H4V13H11V11H7V5H11V2H13V5H17V11H13V13H20V19Z" />\
        </svg>');
});

_FCore.default.install('mdi-align-horizontal-right', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
             <path fill="#000000" d="M18 13V19H2V13H18M8 5V11H18V5H8M20 2V22H22V2H20Z" />\
        </svg>');
});

_FCore.default.install('mdi-align-vertical-bottom', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
             <path fill="#000000" d="M11 18H5V2H11V18M19 8H13V18H19V8M22 20H2V22H22V20Z" />\
        </svg>');
});

_FCore.default.install('mdi-align-vertical-center', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
             <path fill="#000000" d="M5 20V13H2V11H5V4H11V11H13V7H19V11H22V13H19V17H13V13H11V20H5Z" />\
        </svg>');
});

_FCore.default.install('mdi-align-vertical-top', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
           <path fill="#000000" d="M11 22H5V6H11V22M19 6H13V16H19V6M22 2H2V4H22V2Z" />\
        </svg>');
});

_FCore.default.install('frame-ico', function () {
  return _('<svg width="25.03mm" height="26.1mm" version="1.1" viewBox="0 0 25.03 26.1" xmlns="http://www.w3.org/2000/svg">' + '    <g transform="translate(0,-270.9)">' + '        <path d="m12.662 270.91-7.0158 3.7418v4.0759l6.9156-4.0424 7.0492 3.9756-0.13363-3.9422z" style="fill:gray" />' + '        <path d="m12.628 276.89-6.7486 3.6416 6.6817 4.0424 6.7151-3.842z" style="fill:rgb(240, 122, 0)" />' + '        <path d="m5.2452 282.4-0.03341 7.3165 6.3811 3.8754 0.03341-7.4167z" style="fill:rgb( 122, 240, 0)" />' + '        <path d="m19.745 282.37-6.3811 3.842v7.3499l6.4145-3.7084z" style="fill:rgb(0, 122, 240)" />' + '        <path d="m21.816 283.07-0.13364 7.8176-6.7486 4.1093 3.2406 2.0045 6.7152-3.9088 0.13363-8.1517z" style="fill:gray" />' + '        <path d="m3.1738 283.04-3.1738 2.0045v7.7842l6.7151 4.1093 3.3409-1.8709-6.7151-3.9756z" style="fill:gray" />' + '    </g>' + '</svg>');
});

_FCore.default.install('mdi-shape', function () {
  return _('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"  width="24" height="24" viewBox="0 0 24 24">\n' + '    <path fill="green" d="M11,13.5V21.5H3V13.5H11Z" />\n' + '    <path fill="red" d="M12,2L17.5,11H6.5L12,2Z" />\n' + '    <path fill="cyan" d="M17.5,13C20,13 22,15 22,17.5C22,20 20,22 17.5,22C15,22 13,20 13,17.5C13,15 15,13 17.5,13Z" />\n' + '</svg>');
});

_FCore.default.install('mdi-package-variant-closed-plus', function () {
  return _('<svg  viewBox="0 0 24 24">\n' + '    <path fill="currentColor" d="M13 19.3V12.6L19 9.2V13C19.7 13 20.4 13.1 21 13.4V7.5C21 7.1 20.8 6.8 20.5 6.6L12.6 2.2C12.4 2.1 12.2 2 12 2S11.6 2.1 11.4 2.2L3.5 6.6C3.2 6.8 3 7.1 3 7.5V16.5C3 16.9 3.2 17.2 3.5 17.4L11.4 21.8C11.6 21.9 11.8 22 12 22S12.4 21.9 12.6 21.8L13.5 21.3C13.2 20.7 13.1 20 13 19.3M12 4.2L18 7.5L16 8.6L10.1 5.2L12 4.2M11 19.3L5 15.9V9.2L11 12.6V19.3M12 10.8L6 7.5L8 6.3L14 9.8L12 10.8M20 15V18H23V20H20V23H18V20H15V18H18V15H20Z" />\n' + '</svg>');
});

_FCore.default.install('mdi-package-variant-closed-minus', function () {
  return _('<svg  viewBox="0 0 24 24">\n' + '    <path fill="currentColor" d="M13 12.6L19 9.2V13C19.7 13 20.4 13.1 21 13.4V7.5C21 7.1 20.8 6.8 20.5 6.6L12.6 2.2C12.4 2.1 12.2 2 12 2S11.6 2.1 11.4 2.2L3.5 6.6C3.2 6.8 3 7.1 3 7.5V16.5C3 16.9 3.2 17.2 3.5 17.4L11.4 21.8C11.6 21.9 11.8 22 12 22S12.4 21.9 12.6 21.8L13.5 21.3C13.2 20.7 13.1 20 13 19.3M12 4.2L18 7.5L16 8.6L10.1 5.2L12 4.2M11 19.3L5 15.9V9.2L11 12.6V19.3M12 10.8L6 7.5L8 6.3L14 9.8L12 10.8M23 18V20H15V18H23Z" />\n' + '</svg>');
});

_FCore.default.install('mdi-package-variant', function () {
  return _('<svg viewBox="0 0 24 24">\n' + '    <path fill="currentColor" d="M2,10.96C1.5,10.68 1.35,10.07 1.63,9.59L3.13,7C3.24,6.8 3.41,6.66 3.6,6.58L11.43,2.18C11.59,2.06 11.79,2 12,2C12.21,2 12.41,2.06 12.57,2.18L20.47,6.62C20.66,6.72 20.82,6.88 20.91,7.08L22.36,9.6C22.64,10.08 22.47,10.69 22,10.96L21,11.54V16.5C21,16.88 20.79,17.21 20.47,17.38L12.57,21.82C12.41,21.94 12.21,22 12,22C11.79,22 11.59,21.94 11.43,21.82L3.53,17.38C3.21,17.21 3,16.88 3,16.5V10.96C2.7,11.13 2.32,11.14 2,10.96M12,4.15V4.15L12,10.85V10.85L17.96,7.5L12,4.15M5,15.91L11,19.29V12.58L5,9.21V15.91M19,15.91V12.69L14,15.59C13.67,15.77 13.3,15.76 13,15.6V19.29L19,15.91M13.85,13.36L20.13,9.73L19.55,8.72L13.27,12.35L13.85,13.36Z" />\n' + '</svg>');
});

_FCore.default.install('history-ico', function () {
  return _('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"  width="24" height="24" viewBox="0 0 24 24">\n' + ' <path\n' + '     d="m 8.5714285,16.428572 v 5.142857 H 3.4285714 v -5.142857 h 5.1428571 z"\n' + '     style="fill:currentColor;stroke:currentColor;stroke-width:0.85714287000000000;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1" />\n' + '  <path\n' + '     d="M 8.5714285,9.4285715 V 14.571429 H 3.4285714 V 9.4285715 h 5.1428571 z"\n' + '     style="fill:none;stroke:currentColor;stroke-width:0.85714287000000000;stroke-miterlimit:4;" />\n' + '  <path\n' + '     d="M 8.5714285,2.4285715 V 7.5714286 H 3.4285714 V 2.4285715 h 5.1428571 z"\n' + '     style="fill:none;stroke:currentColor;stroke-width:0.85714287000000000;stroke-miterlimit:4;" />\n' + '  <path\n' + '     style="fill:currentColor;stroke:none"\n' + '     d="m 12.339568,4.5767936 -0.15625,6.1875004 2.15625,-2.0000004 c 0.879856,0.7652568 2.363959,2.1299684 2.71875,2.9687504 0.492648,1.164699 0.489398,2.646431 0,3.8125 -0.804992,1.918024 -4.46875,4.375 -4.46875,4.375 0,0 4.702305,-1.849124 5.875,-3.875 0.869421,-1.501959 0.796593,-3.552189 0.3125,-5.21875 -0.320362,-1.1028937 -2.001577,-2.813619 -2.78125,-3.5625004 l 2.875,-2.625 -6.53125,-0.0625 z"\n' + '   />' + '</svg>');
});

_FCore.default.install('properties-ico', function () {
  return _('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"  width="24" height="24" viewBox="0 0 24 24">\n' + ' <path\n' + '     d="M 21.088366,8.5817384 V 12.59352 H 17.076583 V 8.5817384 h 4.011783 z"\n' + '     style="fill:currentColor;stroke:currentColor;stroke-width:0.66863036;stroke-miterlimit:4;" />\n' + '  <path\n' + '     d="M 21.088366,2.5301916 V 6.5419728 H 17.076583 V 2.5301916 h 4.011783 z"\n' + '     style="fill:currentColor;stroke:currentColor;stroke-width:0.66863036;stroke-miterlimit:4;" />\n' + '  <path\n' + '     style="fill:currentColor;stroke:none"\n' + '     d="m 3.518875,16.506 2.5e-4,4.781 17.925,0 -2.5e-4,-4.781 z m 13.137375,1.46275 3.5625,0 -1.78125,1.9375 z"\n/>' + '  <path\n' + '     style="fill:none;stroke:currentColor;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;"\n' + '     d="m 8.763,13.691 5.051433,-2.804402 0,-6.103093 M 8.8247425,7.4639175 8.763,13.691 3.7113405,10.886598 3.711,4.784 8.7628865,7.5051544 13.814433,4.783505 8.7835052,2.5979381 3.711,4.784"\n' + '   />' + '</svg>');
});

_FCore.default.install('depth-select-ico', function () {
  return _('<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">\n' + ' <path transform="scale(.264583)" d="m1 1v22h22v-22h-22" fill="none" stroke="#000" stroke-dasharray="3.99999993,3.99999993"/>\n' + ' <path transform="matrix(.198438 0 0 .272852 .79375 -.322461)" d="m12 7-8 4 8 4 8-4zm-6 7-2 1 8 4 8-4-2-1-6 3z"/>\n' + '</svg>');
});

_ACore.default.install('depth-select-ico', function () {
  return _('<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">\n' + ' <path transform="scale(.264583)" d="m1 1v22h22v-22h-22" fill="none" stroke="#000" stroke-dasharray="3.99999993,3.99999993"/>\n' + ' <path transform="matrix(.198438 0 0 .272852 .79375 -.322461)" d="m12 7-8 4 8 4 8-4zm-6 7-2 1 8 4 8-4-2-1-6 3z"/>\n' + '</svg>');
});

_FCore.default.install('transform-light-ico', function () {
  return _('<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n' + ' <path transform="matrix(.04898654 0 0 .04898654 -.8429306 .17263626)" d="m44.5 389.15193-0.489142-150.65193 132.489142-56.20932 132.51235 56.20932-0.51235 150.7291-132.31345 58.69987zm123.5-85.70762-105.679954-45.44431-0.320046 119.73619 105.25 47.22098zm122.5 74.62154 0.16737-121.06585-104.41737 46.32669 0.5 121.24531zm-15.29463-133.89991-99.45728-42.37533-99.038659 42.19063 99.495559 43.96131zm59.54463 64.09075-7.75-0.34082 1.1e-4 -8.70793 1.1e-4 -8.70794 35.24989-0.0286c36.99453-0.03 46.60413-0.79133 70.24989-5.56552 16.92621-3.41749 37.5-11.03944 37.5-13.89259 0-0.45297-17.80989-33.60377-39.57754-73.66844-21.76764-40.06467-45.95514-84.64365-53.75-99.064399-7.79485-14.420736-14.39746-26.228838-14.67246-26.240217-0.275-0.01138-17.32963 30.977726-37.89919 68.864676l-37.39918 68.88536-7.60082-3.2435c-4.18044-1.78393-7.60081-3.73517-7.60081-4.33609s20.25-38.43924 45-84.08516c38.01389-70.10822 45.19115-82.744319 46.23128-81.393521 0.6772 0.879475 29.1397 52.984843 63.25 115.789711 45.12619 83.08765 62.01872 115.05781 62.01872 117.37431 0 1.75101-0.86741 4.88393-1.92758 6.96203-11.26366 22.0786-72.81879 34.85098-151.32242 31.39864zm34.41698-175.17571 16.35549-5.88634 50.46521 130.61427-15.57179 6.98347zm-236.57186 40.16902c2.216-30.15029 18.14118-54.63743 43.96045-67.59522 14.15639-7.1046 18.8079-7.904962 48.83893-8.403492l26.8945-0.446462-46.31016-46.341631 12.55348-12.441897 67.95657 67.978622-67.9543 67.00008-6.76739-5.73038-5.7908-5.73037 46.50764-46.53925h-24.53192c-27.46851 0-31.48625 0.60544-43.74836 6.59251-12.86808 6.28294-25.23116 19.84659-30.2036 33.13662-2.53611 6.61703-2.95365 13.0428-4.3001 19.89373l-7.83795 3.18857c-4.31086 1.75371-8.28764 3.18857-8.83727 3.18857-0.62881 0-0.78814-2.87345-0.42972-7.75z"/>\n' + '</svg>\n');
});

_FCore.default.install('transform-ico', function () {
  return _('<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n' + ' <path transform="matrix(.02592263 0 0 .02592263 -2.5007162 -2.5036093)" d="m207.44439 493.6263c-5.91296-2.75339-11.64003-8.99821-13.28383-14.48474-1.66176-5.54644-1.66176-263.73668 0-269.28312 1.6438-5.48653 7.37087-11.73135 13.28383-14.48474 5.05561-2.35416 5.05561-2.35416 136.43959-2.36393 96.84015-7e-3 132.40244 0.29537 135.25758 1.15079 5.48653 1.6438 11.73135 7.37087 14.48474 13.28383 2.35416 5.05561 2.35416 5.05561 2.34197 137.05561-0.0121 130.64631-0.0331 132.04615-2.04918 136.5-2.7355 6.04311-6.40969 9.77576-12.41909 12.61671-5 2.36375-5 2.36375-137 2.36375s-132 0-137.05561-2.35416zm-52.32029 56.95419c-8.17116-3.80493-16.08543-12.43469-18.35701-20.01656-2.2964-7.66466-2.2964-364.45942 0-372.12408 2.27158-7.58187 10.18585-16.21163 18.35701-20.01656 6.98638-3.25323 6.98638-3.25323 188.54675-3.26673 133.82403-0.01 182.96779 0.40818 186.91333 1.59029 7.58187 2.27157 16.21163 10.18585 20.01655 18.35701 3.25323 6.98638 3.25323 6.98638 3.23639 189.39803-0.0167 180.54098-0.0457 182.47543-2.83178 188.63023-3.7802 8.35102-8.85759 13.50919-17.16202 17.43512-6.90953 3.26648-6.90953 3.26648-189.32119 3.26648-182.41165 0-182.41165 0-189.39803-3.25323zm646.11812-34.399c-3.58909-1.08898-15.7781-12.33759-47.25479-43.60903-47.2957-46.98731-49.11417-49.40912-47.66228-63.47657 2.39426-23.19808 25.70648-35.23337 47.03691-24.28353 2.39255 1.2282 9.48044 7.2293 15.75084 13.33576 11.40072 11.10267 11.40072 11.10267 11.40072-29.84382 0-40.94648 0-40.94648-63.22222-41.35684-61.74233-0.40075-63.3516-0.48017-68.74984-3.39309-13.62168-7.35032-20.19976-20.7746-17.14942-34.99787 2.06799-9.64268 8.23025-17.49941 16.8863-21.52961 7.17265-3.33953 7.17265-3.33953 89.39608-3.32268 76.90538 0.0158 82.58594 0.1815 87.82819 2.56261 6.90045 3.13427 14.83196 12.15616 16.97483 19.30842 1.10877 3.70076 1.60378 23.61312 1.60378 64.51425 0 59.1613 0 59.1613 11.40073 48.05863 12.28744-11.96619 16.68666-14.8037 26.28694-16.95516 18.80127-4.21346 38.29329 12.84029 36.66031 32.07442-0.33806 3.98166-1.67298 9.45319-2.96651 12.15898-1.31475 2.75013-21.07642 23.5617-44.81264 47.19338-35.43589 35.27985-43.37526 42.52377-47.98838 43.78489-6.71058 1.83449-14.91978 1.74898-21.41955-0.22314zm-48.07374 408.45848c-59.17584-8.50731-107.947-51.16421-124.72968-109.09281-8.16826-28.19427-7.22343-62.60589 2.48358-90.45471 15.4401-44.2967 49.90695-78.76356 94.20366-94.20365 27.84881-9.70701 62.26043-10.65184 90.45471-2.48359 48.7905 14.13526 86.88759 50.49408 102.56593 97.88612 6.67429 20.17489 9.24307 44.93923 6.80547 65.60806-7.22122 61.2297-51.67926 112.92924-110.68026 128.70832-17.79404 4.75879-44.01412 6.48908-61.10341 4.03226zm-8.10594 57.42997c-81.78365-11.75747-149.18757-70.71122-172.38198-150.77111-11.28889-38.96575-9.9831-86.52413 3.43241-125.01245 21.33891-61.22001 68.97364-108.85474 130.19366-130.19365 38.48831-13.41552 86.0467-14.72131 125.01244-3.43242 67.43066 19.53556 120.08254 69.78506 141.75069 135.28298 9.22417 27.88259 12.77434 62.10802 9.40546 90.67326-9.98004 84.62217-71.42303 156.07324-152.96506 177.88062-24.59215 6.57687-60.82947 8.9682-84.44762 5.57277zm-432.32425-115.77695c-10.29493-1.82797-18.2615-7.91261-23.68013-18.08619-2.37055-4.45076-2.63122-9.77359-3.26705-66.71159-0.69095-61.87493-0.69095-61.87493-11.74621-50.68141-14.09605 14.27234-19.30837 17.13241-31.09289 17.0611-5.57201-0.0337-10.63191-0.91962-13.32694-2.33332-6.09936-3.19949-12.95363-10.385-15.39308-16.13698-3.05974-7.21452-2.57255-19.11255 1.08141-26.41044 2.00054-3.99562 16.73875-19.85283 42.64059-45.87808 41.72138-41.92022 47.61267-46.5972 58.69553-46.5972 13.3893 0 14.05236 0.50589 58.73077 44.80839 23.36604 23.16945 43.2177 44.00684 44.86084 47.08839 4.06409 7.62179 4.07534 21.35999 0.0238 29.02004-7.41759 14.02393-22.76628 20.17455-37.84597 15.16588-5.83361-1.93761-9.98486-4.99506-20.20128-14.87851-12.85884-12.43976-12.85884-12.43976-12.85884 29.91147 0 42.35125 0 42.35125 57.69459 42.3816 52.8871 0.0278 58.15776 0.24074 63.25289 2.55531 23.77884 10.80196 24.94545 43.55885 1.99957 56.14536-7.55786 4.14572-7.55786 4.14572-80.79891 4.35171-40.28257 0.11332-75.72847-0.2357-78.76866-0.77553z" fill-rule="evenodd"/>\n' + '</svg>\n');
});

_FCore.default.install('clipboard-view-ico', function () {
  return _('<svg viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">' + '<path\n' + '     transform="translate(0.22253123,11.759387)"\n' + '     d="m 16,6 c 0.56,0 1,0.44 1,1 0,0.56 -0.44,1 -1,1 -0.56,0 -1,-0.44 -1,-1 0,-0.56 0.44,-1 1,-1 m 0,-3 c 2.73,0 5.06,1.66 6,4 -0.94,2.34 -3.27,4 -6,4 -2.73,0 -5.06,-1.66 -6,-4 0.94,-2.34 3.27,-4 6,-4 m 0,1.5 A 2.5,2.5 0 0 0 13.5,7 2.5,2.5 0 0 0 16,9.5 2.5,2.5 0 0 0 18.5,7 2.5,2.5 0 0 0 16,4.5 m -4.222531,-16.259387 c -1.3,0 -2.4003127,0.84 -2.8203127,2 H 4.7774688 a 2,2 0 0 0 -2,2 v 16 a 2,2 0 0 0 2,2 h 3.3457031 v -2 H 4.7774688 v -16 h 2 v 3 H 16.777469 v -3 h 2 v 8.617188 h 2 v -8.617188 a 2,2 0 0 0 -2,-2 h -4.179688 c -0.419999,-1.16 -1.520312,-2 -2.820312,-2 z m 0,2 a 1,1 0 0 1 1,1 1,1 0 0 1 -1,1 1,1 0 0 1 -1,-1 1,1 0 0 1 1,-1 z" />\n' + '</svg>');
});
};

moduleFactories["node_modules/absol-form/js/core/BaseAnchorEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/BaseAnchorEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _CMDRunner = _interopRequireDefault(require("absol/src/AppPattern/CMDRunner"));

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/**
 *
 * @param {LayoutEditor} layoutEditor
 */
function BaseAnchorEditor(layoutEditor) {
  _EventEmitter.default.call(this);

  this._bindEvent();

  this.layoutEditor = layoutEditor;
  /***
   *
   * @type {null| BaseComponent}
   */

  this.component = null;
  this.cmdRunner = new _CMDRunner.default(this);
}

_OOP.default.mixClass(BaseAnchorEditor, _EventEmitter.default);

BaseAnchorEditor.prototype._bindEvent = function () {
  for (var key in this) {
    if (key.startsWith('ev_')) this[key] = this[key].bind(this);
  }
};

BaseAnchorEditor.prototype.focus = function () {//not implement
};

BaseAnchorEditor.prototype.blur = function () {//not implement
};

BaseAnchorEditor.prototype.edit = function (component) {
  this.component = component;
  if (!this.component) this.blur();
  this.update();
};

BaseAnchorEditor.prototype.update = function () {};

BaseAnchorEditor.prototype.getCmdNames = function () {
  var res = [];

  if (this.component.isLayout && !this.component.formType) {
    res.push('layoutEdit');
  }

  res.push('delete');
  return res;
};

BaseAnchorEditor.prototype.getCmdDescriptor = function (name) {};

BaseAnchorEditor.prototype.ev_dblClick = function () {
  if (!this.component) return;

  if (this.component.isFragmentView) {
    var message = _Toast.default.make({
      props: {
        title: "TODO",
        message: "Edit Form"
      }
    }, 'auto');

    setTimeout(message.disappear.bind(message), 2000);
  } else if (this.component.isLayout) {
    this.layoutEditor.editLayout(this.component);
  } else {
    this.layoutEditor.editComponent(this.component);
  }
};

var _default = BaseAnchorEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/anchoreditors/BaseAnchorEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/anchoreditors/BaseAnchorEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.BaseAnchorEditorCmdDescriptors = void 0;
var BaseAnchorEditorCmdDescriptors = {};
exports.BaseAnchorEditorCmdDescriptors = BaseAnchorEditorCmdDescriptors;
var BaseAnchorEditorCmd = {};

BaseAnchorEditorCmd.layoutEdit = function () {
  if (this.component.isLayout && !this.component.isFragmentView) {
    this.layoutEditor.editLayout(this.component);
  }
};

var _default = BaseAnchorEditorCmd;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/anchoreditors/RelativeAnchorEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/anchoreditors/RelativeAnchorEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.RelativeAnchorEditorCmdDescriptors = exports.RelativeAnchorEditorCmdTree = void 0;

var _BaseAnchorEditorCmd = _interopRequireDefault(require("./BaseAnchorEditorCmd"));


/**
 * @type {RelativeAnchorEditor}
 */
var RelativeAnchorEditorCmd = Object.assign({}, _BaseAnchorEditorCmd.default);

RelativeAnchorEditorCmd.distributeHorizontalLeft = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var i;
  var editorHolders = editors.map(function (e) {
    return {
      left: e.component.getStyle('left', 'px'),
      editor: e
    };
  });
  editorHolders.sort(function (a, b) {
    return a.left - b.left;
  });
  var minX = editorHolders[0].left;
  var maxX = editorHolders[editors.length - 1].left;
  if (minX == maxX) return;

  for (i = 1; i < editors.length - 1; ++i) {
    editor = editorHolders[i].editor;
    editor.alignLeftDedge(minX + (maxX - minX) / (editors.length - 1) * i, true);
  }

  this.layoutEditor.commitHistory('move', 'Distribute Horizontal Left');
};

RelativeAnchorEditorCmd.distributeHorizontalCenter = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var i;
  var editorHolders = editors.map(function (e) {
    return {
      left: e.component.getStyle('left', 'px'),
      width: e.component.getStyle('width', 'px'),
      editor: e
    };
  });
  editorHolders.sort(function (a, b) {
    return a.left + a.width / 2 - (b.left + b.width / 2);
  });
  var minX = editorHolders[0].left + editorHolders[0].width / 2;
  var maxX = editorHolders[editors.length - 1].left + editorHolders[editors.length - 1].width / 2;
  if (minX == maxX) return;
  var eHolder;

  for (i = 1; i < editors.length - 1; ++i) {
    eHolder = editorHolders[i];
    editor = eHolder.editor;
    editor.alignLeftDedge(minX + (maxX - minX) / (editors.length - 1) * i - eHolder.width / 2, true);
  }

  this.layoutEditor.commitHistory('move', 'Distribute Horizontal Center');
};

RelativeAnchorEditorCmd.distributeHorizontalRight = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var i;
  var editorHolders = editors.map(function (e) {
    return {
      right: e.component.getStyle('right', 'px'),
      editor: e
    };
  });
  editorHolders.sort(function (a, b) {
    return a.right - b.right;
  });
  var minX = editorHolders[0].right;
  var maxX = editorHolders[editorHolders.length - 1].right;
  if (minX == maxX) return;

  for (i = 1; i < editors.length - 1; ++i) {
    editor = editorHolders[i].editor;
    editor.alignRightDedge(minX + (maxX - minX) / (editorHolders.length - 1) * i, true);
  }

  this.layoutEditor.commitHistory('move', 'Distribute Horizontal Right');
};

RelativeAnchorEditorCmd.distributeHorizontalDistance = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var i;
  var editorHolders = editors.map(function (e) {
    return {
      left: e.component.getStyle('left', 'px'),
      width: e.component.getStyle('width', 'px'),
      right: e.component.getStyle('right', 'px'),
      editor: e
    };
  });
  editorHolders.sort(function (a, b) {
    return a.left + a.width / 2 - (b.left + b.width / 2);
  });
  var sumDistance = editorHolders[editorHolders.length - 1].left - (editorHolders[0].left + editorHolders[0].width);
  var eHolder;

  for (i = 1; i < editors.length - 1; ++i) {
    eHolder = editorHolders[i];
    sumDistance -= eHolder.width;
  }

  var distance = sumDistance / (editors.length - 1);
  var curentLeft = editorHolders[0].left + editorHolders[0].width + distance;

  for (i = 1; i < editorHolders.length - 1; ++i) {
    eHolder = editorHolders[i];
    editor = eHolder.editor;
    editor.alignLeftDedge(curentLeft, true);
    curentLeft += eHolder.width + distance;
  }

  this.layoutEditor.commitHistory('move', 'Distribute Horizontal Distance');
};

RelativeAnchorEditorCmd.distributeVerticalTop = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var i;
  var editorHolders = editors.map(function (e) {
    return {
      top: e.component.getStyle('top', 'px'),
      editor: e
    };
  });
  editorHolders.sort(function (a, b) {
    return a.top - b.top;
  });
  var minX = editorHolders[0].top;
  var maxX = editorHolders[editorHolders.length - 1].top;
  if (minX == maxX) return;

  for (i = 1; i < editorHolders.length - 1; ++i) {
    editor = editorHolders[i].editor;
    editor.alignTopDedge(minX + (maxX - minX) / (editors.length - 1) * i);
  }

  this.layoutEditor.commitHistory('move', 'Distribute Vertical Top');
};

RelativeAnchorEditorCmd.distributeVerticalCenter = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var i;
  var editorHolders = editors.map(function (e) {
    return {
      top: e.component.getStyle('top', 'px'),
      height: e.component.getStyle('height', 'px'),
      editor: e
    };
  });
  editorHolders.sort(function (a, b) {
    return a.top + a.height / 2 - (b.top + b.height / 2);
  });
  var minX = editorHolders[0].top + editorHolders[0].height / 2;
  var maxX = editorHolders[editorHolders.length - 1].top + editorHolders[editorHolders.length - 1].height / 2;
  if (minX == maxX) return;
  var eHolder;

  for (i = 1; i < editorHolders.length - 1; ++i) {
    eHolder = editorHolders[i];
    editor = eHolder.editor;
    editor.alignTopDedge(minX + (maxX - minX) / (editors.length - 1) * i - eHolder.height / 2);
  }

  this.layoutEditor.commitHistory('move', 'Distribute Vertical Center');
};

RelativeAnchorEditorCmd.distributeVerticalBottom = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var i;
  var editorHolders = editors.map(function (e) {
    return {
      bottom: e.component.getStyle('bottom', 'px'),
      editor: e
    };
  });
  editorHolders.sort(function (a, b) {
    return a.bottom - b.bottom;
  });
  var minX = editorHolders[0].bottom;
  var maxX = editorHolders[editorHolders.length - 1].bottom;
  if (minX == maxX) return;

  for (i = 1; i < editorHolders.length - 1; ++i) {
    editor = editorHolders[i].editor;
    editor.alignBottomDedge(minX + (maxX - minX) / (editors.length - 1) * i);
  }

  this.layoutEditor.commitHistory('move', 'Distribute Vertical Bottom');
};

RelativeAnchorEditorCmd.distributeVerticalDistance = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var i;
  var editorHolders = editors.map(function (e) {
    return {
      top: e.component.getStyle('top', 'px'),
      height: e.component.getStyle('height', 'px'),
      editor: e
    };
  });
  editorHolders.sort(function (a, b) {
    return a.top + a.height / 2 - (b.top + b.height / 2);
  });
  var eHolder;
  var sumDistance = editorHolders[editorHolders.length - 1].top - (editorHolders[0].top + editorHolders[0].height);

  for (i = 1; i < editorHolders.length - 1; ++i) {
    eHolder = editorHolders[i];
    sumDistance -= eHolder.height;
  }

  var distance = sumDistance / (editorHolders.length - 1);
  var curentTop = editorHolders[0].top + editorHolders[0].height + distance;

  for (i = 1; i < editorHolders.length - 1; ++i) {
    eHolder = editorHolders[i];
    editor = eHolder.editor;
    editor.alignTopDedge(curentTop);
    curentTop += eHolder.height + distance;
  }

  this.layoutEditor.commitHistory('move', 'Distribute Vertical Distance');
};

RelativeAnchorEditorCmd.alignLeftDedge = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var leftValue = this.component.getStyle('left', 'px');

  for (var i = 0; i < editors.length; ++i) {
    editor = editors[i];
    if (editor == this) continue;
    editor.alignLeftDedge(leftValue);
  }

  this.layoutEditor.commitHistory('move', 'Align Left Dedge');
};

RelativeAnchorEditorCmd.alignRightDedge = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var rightValue = this.component.getStyle('right', 'px');

  for (var i = 0; i < editors.length; ++i) {
    editor = editors[i];
    if (editor == this) continue;
    editor.alignRightDedge(rightValue);
  }

  this.layoutEditor.commitHistory('move', 'Align Right Dedge');
};

RelativeAnchorEditorCmd.alignHorizontalCenter = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var centerValue = this.component.getStyle('right', 'px') - this.component.getStyle('left', 'px');
  ;

  for (var i = 0; i < editors.length; ++i) {
    editor = editors[i];
    if (editor == this) continue;
    editor.alignHorizontalCenter(centerValue);
  }

  this.layoutEditor.commitHistory('move', 'Align Horizontal Center');
};

RelativeAnchorEditorCmd.equaliseWidth = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var widthValue = this.component.getStyle('width', 'px');

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    if (editor == this) continue;
    editor.equaliseWidth(widthValue);
  }

  this.layoutEditor.commitHistory('move', 'Equalise Width');
};

RelativeAnchorEditorCmd.alignTopDedge = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var topValue = this.component.getStyle('top', 'px');

  for (var i = 0; i < editors.length; ++i) {
    editor = editors[i];
    if (editor == this) continue;
    editor.alignTopDedge(topValue);
  }

  this.layoutEditor.commitHistory('move', 'Align Top Dedge');
};

RelativeAnchorEditorCmd.alignBottomDedge = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var bottomValue = this.component.getStyle('bottom', 'px');

  for (var i = 0; i < editors.length; ++i) {
    editor = editors[i];
    if (editor == this) continue;
    editor.alignBottomDedge(bottomValue);
  }

  this.layoutEditor.commitHistory('move', 'Align Bottom Dedge');
};

RelativeAnchorEditorCmd.alignVerticalCenter = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var centerValue = this.component.getStyle('bottom', 'px') - this.component.getStyle('top', 'px');

  for (var i = 0; i < editors.length; ++i) {
    editor = editors[i];
    if (editor == this) continue;
    editor.alignVerticalCenter(centerValue);
  }

  this.layoutEditor.commitHistory('move', 'Align Verlical Center');
};

RelativeAnchorEditorCmd.equaliseHeight = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var heightValue = this.component.getStyle('height', 'px');

  for (var i = 0; i < editors.length; ++i) {
    editor = editors[i];
    if (editor == this) continue;
    editor.equaliseHeight(heightValue);
  }

  this.layoutEditor.commitHistory('move', 'Equalise Height');
};

var RelativeAnchorEditorCmdTree = [['alignLeftDedge', 'alignHorizontalCenter', 'alignRightDedge', 'equaliseWidth'], ['alignTopDedge', 'alignVerticalCenter', 'alignBottomDedge', 'equaliseHeight'], ['distributeHorizontalLeft', 'distributeHorizontalCenter', 'distributeHorizontalRight', 'distributeHorizontalDistance'], ['distributeVerticalTop', 'distributeVerticalCenter', 'distributeVerticalBottom', 'distributeVerticalDistance']];
exports.RelativeAnchorEditorCmdTree = RelativeAnchorEditorCmdTree;
var RelativeAnchorEditorCmdDescriptors = {
  distributeVerticalDistance: {
    type: 'trigger',
    desc: "Distribute Verlical Distance",
    icon: '<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\
                    <path d="m7 3h10v5h5v2h-20v-2h5v-5"/>\
                    <path d="m2 16v-2h20v2h-3v5h-14v-5z"/>\
                </svg>'
  },
  distributeVerticalBottom: {
    type: 'trigger',
    desc: "Distribute Vertical Bottom",
    icon: 'span.mdi.mdi-distribute-vertical-bottom'
  },
  distributeVerticalCenter: {
    type: 'trigger',
    desc: "Distribute Vertical Center",
    icon: 'span.mdi.mdi-distribute-vertical-center'
  },
  distributeVerticalTop: {
    type: 'trigger',
    desc: "Distribute Vertical Top",
    icon: 'span.mdi.mdi-distribute-vertical-top'
  },
  distributeHorizontalDistance: {
    icon: '<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\
                    <path d="m21 7v10h-5v5h-2v-20h2v5h5"/>\
                    <path d="m8 2h2v20h-2v-3h-5v-14h5z"/>\
                </svg>',
    type: 'trigger',
    desc: "Distribute Horizontal Distance"
  },
  distributeHorizontalRight: {
    type: 'trigger',
    desc: "Distribute Horizontal Right",
    icon: 'span.mdi.mdi-distribute-horizontal-right'
  },
  distributeHorizontalCenter: {
    icon: 'span.mdi.mdi-distribute-horizontal-center',
    type: 'trigger',
    desc: "Distribute Horizontal Center"
  },
  distributeHorizontalLeft: {
    icon: 'span.mdi.mdi-distribute-horizontal-left',
    type: 'trigger',
    desc: "Distribute Horizontal Left"
  },
  equaliseHeight: {
    type: 'trigger',
    icon: 'span.mdi.mdi-arrow-expand-vertical',
    desc: 'Equalise Height'
  },
  alignVerticalCenter: {
    type: 'trigger',
    icon: 'span.mdi.mdi-align-vertical-center',
    desc: 'Align Vertical Center'
  },
  alignBottomDedge: {
    type: 'trigger',
    icon: 'span.mdi.mdi-align-vertical-bottom',
    desc: 'Align Bottom Edges'
  },
  alignTopDedge: {
    type: 'trigger',
    icon: 'span.mdi.mdi-align-vertical-top',
    desc: 'Align Top Edges'
  },
  equaliseWidth: {
    type: 'trigger',
    icon: 'span.mdi.mdi-arrow-expand-horizontal',
    desc: 'Equalise Width'
  },
  alignHorizontalCenter: {
    type: 'trigger',
    icon: 'span.mdi.mdi-align-horizontal-center',
    desc: 'Align Horizontal Center'
  },
  alignRightDedge: {
    type: 'trigger',
    icon: 'span.mdi.mdi-align-horizontal-right',
    desc: 'Align Right Edges'
  },
  alignLeftDedge: {
    type: 'trigger',
    icon: 'span.mdi.mdi-align-horizontal-left',
    desc: 'Align Left Edges'
  },
  sendBackward: {
    type: 'trigger',
    desc: 'Send Backward',
    icon: 'span.mdi.mdi-arrange-send-backward'
  }
};
exports.RelativeAnchorEditorCmdDescriptors = RelativeAnchorEditorCmdDescriptors;
var _default = RelativeAnchorEditorCmd;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/anchoreditors/RelativeAnchorEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/anchoreditors/RelativeAnchorEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../../core/FCore"));

require("../../../css/anchoreditor.css");

require("../../dom/Icons");

var _BaseAnchorEditor = _interopRequireDefault(require("../../core/BaseAnchorEditor"));

var _RelativeAnchorEditorCmd = _interopRequireWildcard(require("./RelativeAnchorEditorCmd"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




var _ = _FCore.default._;
var $ = _FCore.default.$;
/**
 * @extends BaseAnchorEditor
 * @param {LayoutEditor} layoutEditor
 */

function RelativeAnchorEditor(layoutEditor) {
  _BaseAnchorEditor.default.call(this, layoutEditor);

  this.cmdRunner.assign(_RelativeAnchorEditorCmd.default);
  var self = this;
  this.$modal = _({
    style: {
      zIndex: '10000000',
      left: '1px',
      right: '1px',
      top: '1px',
      bottom: '1px',
      position: 'fixed'
    }
  });
  this.$resizeBox = _('resizebox').on('mousedown', this.focus.bind(this)).on('beginmove', this.ev_beginMove.bind(this, true)).on('moving', this.ev_moving.bind(this, true)).on('endmove', this.ev_endMove.bind(this, true)).on('click', function (ev) {
    self.emit('click', ev, true);
  }).on('dblclick', this.ev_dblClick);
  this.$resizeBox.defineEvent('contextmenu');
  this.$resizeBox.on('contextmenu', this.ev_contextMenu.bind(this));
  this.$topAlignLine = _('vline');
  this.$bottomAlignLine = _('vline');
  this.$leftAlignLine = _('hline');
  this.$rightAlignLine = _('hline');
  this.movingData = null;
  this.isFocus = false;
  this.snapDistance = 2;
}

_OOP.default.mixClass(RelativeAnchorEditor, _BaseAnchorEditor.default);

RelativeAnchorEditor.prototype.ev_contextMenu = function (event) {
  var self = this;
  var items = [];

  function makeItem(name) {
    if (name === null) return '=====';
    var cmdDescriptor = _RelativeAnchorEditorCmd.RelativeAnchorEditorCmdDescriptors[name];
    var res = {
      icon: cmdDescriptor.icon,
      text: cmdDescriptor.desc,
      cmd: name
    };

    if (cmdDescriptor.bindKey && cmdDescriptor.bindKey.win) {
      res.key = cmdDescriptor.bindKey.win;
    }

    return res;
  }

  if (this.layoutEditor.anchorEditors.length > 1) {
    items.push.apply(items, ['alignLeftDedge', 'alignHorizontalCenter', 'alignRightDedge', 'equaliseWidth', null, 'alignTopDedge', 'alignVerticalCenter', 'alignBottomDedge', 'equaliseHeight', null].map(makeItem));
  }

  if (this.layoutEditor.anchorEditors.length > 2) {
    items.push.apply(items, ['distributeHorizontalLeft', 'distributeHorizontalCenter', 'distributeHorizontalRight', 'distributeHorizontalDistance', null, 'distributeVerticalTop', 'distributeVerticalCenter', 'distributeVerticalBottom', 'distributeVerticalDistance', null].map(makeItem));
  }

  if (this.layoutEditor.anchorEditors.length === 1 && this.layoutEditor.anchorEditors[0].component.isLayout) {
    items.push({
      icon: 'span.mdi.mdi-square-edit-outline[style="color:blue"]',
      text: 'Edit Layout',
      cmd: this.execCmd.bind(this, 'layoutEdit')
    });
  }

  items.push({
    icon: 'span.mdi.mdi-delete-variant[style="color:red"]',
    text: 'Delete',
    cmd: 'delete'
  });
  event.showContextMenu({
    items: items,
    extendStyle: {
      fontSize: '12px'
    }
  }, function (event) {
    var cmd = event.menuItem.cmd;

    if (typeof cmd == 'function') {
      cmd();
      self.layoutEditor.notifyDataChange();
    } else if (typeof cmd == 'string') {
      self.layoutEditor.execCmd(cmd);
    }

    self.layoutEditor.getView().focus();
  });
  event.stopPropagation();
};

RelativeAnchorEditor.prototype.focus = function () {
  if (!this.component) return;
  if (this.isFocus) return;
  this.isFocus = true;
  this.$resizeBox.addClass('as-focus');
  var editor;

  for (var i = 0; i < this.layoutEditor.anchorEditors.length; ++i) {
    editor = this.layoutEditor.anchorEditors[i];
    if (editor == this) continue;
    editor.blur();
  }

  this.emit('focus', {
    type: 'focus',
    target: this
  }, this);
};

RelativeAnchorEditor.prototype.blur = function () {
  if (!this.isFocus) return;
  this.isFocus = false;
  this.$resizeBox.removeClass('as-focus');
  this.emit('blur', {
    type: 'blur',
    target: this
  }, this);
};

RelativeAnchorEditor.prototype.update = function () {
  if (this.component) {
    this.$resizeBox.addTo(this.layoutEditor.$foreground);
    var styleDescriptors = this.component.getStyleDescriptors();
    this.$resizeBox.canMove = !!(styleDescriptors.top || styleDescriptors.bottom || styleDescriptors.left || styleDescriptors.right);
    this.$resizeBox.canResize = !!(styleDescriptors.width || styleDescriptors.height);

    if (!styleDescriptors.top || styleDescriptors.top.disabled) {
      this.$topAlignLine.remove();
    } else {
      this.$topAlignLine.addTo(this.layoutEditor.$foreground);
    }

    if (!styleDescriptors.bottom || styleDescriptors.bottom.disabled) {
      this.$bottomAlignLine.remove();
    } else {
      this.$bottomAlignLine.addTo(this.layoutEditor.$foreground);
    }

    if (!styleDescriptors.left || styleDescriptors.left.disabled) {
      this.$leftAlignLine.remove();
    } else {
      this.$leftAlignLine.addTo(this.layoutEditor.$foreground);
    }

    if (!styleDescriptors.right || styleDescriptors.right.disabled) {
      this.$rightAlignLine.remove();
    } else {
      this.$rightAlignLine.addTo(this.layoutEditor.$foreground);
    }

    this.updatePosition();
  } else {
    this.$resizeBox.remove();
    this.$leftAlignLine.remove();
    this.$rightAlignLine.remove();
    this.$topAlignLine.remove();
    this.$bottomAlignLine.remove();
  }
};

RelativeAnchorEditor.prototype.updatePosition = function () {
  if (this.component) {
    var bound = this.layoutEditor.$foreground.getBoundingClientRect();
    var compBound = this.component.view.getBoundingClientRect();
    var styleLeft = this.component.getStyle('left', 'px');
    var styleTop = this.component.getStyle('top', 'px');
    var styleRight = this.component.getStyle('right', 'px');
    var styleBottom = this.component.getStyle('bottom', 'px');
    this.$resizeBox.addStyle({
      left: (compBound.left - bound.left) / this.layoutEditor._softScale + 'px',
      top: (compBound.top - bound.top) / this.layoutEditor._softScale + 'px',
      width: compBound.width / this.layoutEditor._softScale + 'px',
      height: compBound.height / this.layoutEditor._softScale + 'px'
    });
    if (this.$leftAlignLine.parentNode) this.$leftAlignLine.addStyle({
      left: (compBound.left - bound.left) / this.layoutEditor._softScale - styleLeft + 'px',
      width: styleLeft + 'px',
      top: (compBound.top - bound.top + compBound.height / 2) / this.layoutEditor._softScale + 'px'
    });
    if (this.$rightAlignLine.parentNode) this.$rightAlignLine.addStyle({
      left: (compBound.right - bound.left) / this.layoutEditor._softScale + 'px',
      width: styleRight + 'px',
      top: (compBound.top - bound.top + compBound.height / 2) / this.layoutEditor._softScale + 'px'
    });
    if (this.$topAlignLine.parentNode) this.$topAlignLine.addStyle({
      top: (compBound.top - bound.top) / this.layoutEditor._softScale - styleTop + 'px',
      height: styleTop + 'px',
      left: (compBound.left - bound.left + compBound.width / 2) / this.layoutEditor._softScale + 'px'
    });
    if (this.$bottomAlignLine.parentNode) this.$bottomAlignLine.addStyle({
      top: (compBound.bottom - bound.top) / this.layoutEditor._softScale + 'px',
      height: styleBottom + 'px',
      left: (compBound.left - bound.left + compBound.width / 2) / this.layoutEditor._softScale + 'px'
    });
    this.layoutEditor.boundViewCtrl.update();
  }
};

RelativeAnchorEditor.prototype.ev_beginMove = function (userAction, event) {
  var bound = this.layoutEditor.$foreground.getBoundingClientRect();
  var snapLines = this.getSnapLines();
  this.movingData = {
    userAction: userAction,
    x0: (event.clientX - bound.left) / this.layoutEditor._softScale,
    y0: (event.clientY - bound.top) / this.layoutEditor._softScale,
    dx: 0,
    dy: 0,
    option: event.option,
    styleDescriptors: this.component.getStyleDescriptors(),
    style0: Object.assign({}, this.component.style, {
      left: this.component.getStyle('left', 'px'),
      right: this.component.getStyle('right', 'px'),
      top: this.component.getStyle('top', 'px'),
      bottom: this.component.getStyle('bottom', 'px'),
      width: this.component.getStyle('width', 'px'),
      height: this.component.getStyle('height', 'px')
    }),
    comp: this.component,
    isChange: false,
    snapLines: snapLines,
    $snapXLines: [],
    $snapYLines: [],
    nearestYVal: 10000000,
    nearestY: [],
    nearestXVal: 10000000,
    nearestX: []
  };

  if (userAction) {
    this.emit('beginmove', {
      type: 'beginmove',
      target: this,
      originEvent: event.originEvent || event,
      repeatEvent: event
    }, this);
    this.$modal.addTo(document.body);

    this._updateSnapLines();

    this.layoutEditor.rulerCtrl.viewMouseDrag(this.movingData.dx, this.movingData.dy);
    this.layoutEditor.selectCtrl.calcSelectBoundStyle();
  }
};

RelativeAnchorEditor.prototype.ev_moving = function (userAction, event) {
  var movingData = this.movingData;
  var bound = this.layoutEditor.$foreground.getBoundingClientRect();
  var x = (event.clientX - bound.left) / this.layoutEditor._softScale;
  var y = (event.clientY - bound.top) / this.layoutEditor._softScale;
  movingData.dx = x - movingData.x0;
  movingData.dy = y - movingData.y0;

  if (event.originEvent.ctrlKey) {
    var newW, newH, dH, dW;

    if (movingData.option.body) {
      if (Math.abs(movingData.dx) < Math.abs(movingData.dy)) {
        movingData.dx = 0;
      } else {
        movingData.dy = 0;
      }
    } else {
      if (movingData.option.right) {
        if (!!movingData.styleDescriptors.left.disabled && !!movingData.styleDescriptors.right.disabled) {
          newW = Math.max(0, movingData.style0.width + movingData.dx * 2);
        } else {
          newW = Math.max(0, movingData.style0.width + movingData.dx);
        }

        newH = movingData.style0.height * newW / Math.max(1, movingData.style0.width);
      } else if (movingData.option.left) {
        if (!!movingData.styleDescriptors.left.disabled && !!movingData.styleDescriptors.right.disabled) {
          newW = Math.max(0, movingData.style0.width - movingData.dx * 2);
        } else {
          newW = Math.max(0, movingData.style0.width - movingData.dx);
        }

        newH = movingData.style0.height * newW / Math.max(1, movingData.style0.width);
      }
    }

    if (movingData.option.bottom) {
      movingData.dy = newH - movingData.style0.height;

      if (!!movingData.styleDescriptors.top.disabled && !!movingData.styleDescriptors.bottom.disabled) {
        movingData.dy /= 2;
      }
    } else if (movingData.option.top) {
      movingData.dy = -(newH - movingData.style0.height);

      if (!!movingData.styleDescriptors.top.disabled && !!movingData.styleDescriptors.bottom.disabled) {
        movingData.dy /= 2;
      }
    }
  }

  var positionIsChange = false;

  if (movingData.styleDescriptors.left && !movingData.styleDescriptors.left.disabled && (movingData.option.left || movingData.option.body)) {
    movingData.comp.setStyle('left', Math.max(0, movingData.style0.left + movingData.dx), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.right && !movingData.styleDescriptors.right.disabled && (movingData.option.right || movingData.option.body)) {
    movingData.comp.setStyle('right', Math.max(0, movingData.style0.right - movingData.dx), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.width && !movingData.styleDescriptors.width.disabled) {
    if (movingData.option.left) {
      if (!!movingData.styleDescriptors.left.disabled && !!movingData.styleDescriptors.right.disabled) {
        movingData.comp.setStyle('width', Math.max(movingData.comp.measureMinSize().width, movingData.style0.width - movingData.dx * 2), 'px');
      } else {
        movingData.comp.setStyle('width', Math.max(movingData.style0.width - movingData.dx), 'px');
      }

      positionIsChange = true;
    }

    if (movingData.option.right) {
      if (movingData.styleDescriptors.left && !!movingData.styleDescriptors.left.disabled && !!movingData.styleDescriptors.right.disabled) {
        movingData.comp.setStyle('width', Math.max(movingData.comp.measureMinSize().width, movingData.style0.width + movingData.dx * 2), 'px'); //center align
      } else {
        movingData.comp.setStyle('width', Math.max(movingData.comp.measureMinSize().width, movingData.style0.width + movingData.dx), 'px');
      }

      positionIsChange = true;
    }
  }

  if (movingData.styleDescriptors.top && !movingData.styleDescriptors.top.disabled && (movingData.option.top || movingData.option.body)) {
    movingData.comp.setStyle('top', Math.max(0, movingData.style0.top + movingData.dy), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.bottom && !movingData.styleDescriptors.bottom.disabled && (movingData.option.bottom || movingData.option.body)) {
    movingData.comp.setStyle('bottom', Math.max(0, movingData.style0.bottom - movingData.dy), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.height && !movingData.styleDescriptors.height.disabled) {
    if (movingData.option.top) {
      if (movingData.styleDescriptors.top && !!movingData.styleDescriptors.top.disabled && !!movingData.styleDescriptors.bottom.disabled) {
        movingData.comp.setStyle('height', Math.max(movingData.comp.measureMinSize().height, movingData.style0.height - movingData.dy * 2), 'px');
      } else {
        movingData.comp.setStyle('height', Math.max(movingData.comp.measureMinSize().height, movingData.style0.height - movingData.dy), 'px');
      }

      positionIsChange = true;
    }

    if (movingData.option.bottom) {
      if (movingData.styleDescriptors.top && !!movingData.styleDescriptors.top.disabled && !!movingData.styleDescriptors.bottom.disabled) {
        movingData.comp.setStyle('height', Math.max(movingData.comp.measureMinSize().height, movingData.style0.height + movingData.dy * 2), 'px');
      } else {
        movingData.comp.setStyle('height', Math.max(movingData.comp.measureMinSize().height, movingData.style0.height + movingData.dy), 'px');
      }

      positionIsChange = true;
    }
  }

  this.updatePosition();

  if (positionIsChange) {
    this.emit("reposition", {
      type: 'reposition',
      component: movingData.comp,
      movingData: movingData,
      originEvent: event.originEvent || event,
      repeatEvent: event
    }, this);
    movingData.isChange = true;

    _ResizeSystem.default.updateDown(movingData.comp.view);
  }

  if (userAction) {
    this.emit('moving', {
      taget: this,
      type: 'moving',
      originEvent: event.originEvent || event,
      target: this,
      repeatEvent: event
    }, this);

    this._updateSnapLines();

    this.layoutEditor.rulerCtrl.viewMouseDrag(this.movingData.dx, this.movingData.dy);
    this.layoutEditor.selectCtrl.calcSelectBoundStyle();
  }
};

RelativeAnchorEditor.prototype.ev_endMove = function (userAction, event) {
  if (this.movingData.isChange) {
    this.emit('change', {
      type: 'change',
      target: this,
      component: this.movingData.comp,
      originEvent: event.originEvent || event,
      repeatEvent: event
    }, this);
  }

  if (userAction) {
    this.emit('endmove', {
      taget: this,
      type: 'moving',
      originEvent: event.originEvent || event,
      target: this,
      repeatEvent: event
    }, this);
    this.$modal.remove();
    this.layoutEditor.rulerCtrl.viewMouseDrag(null);
    this.movingData.$snapYLines.forEach(function (e) {
      e.remove();
    });
    this.movingData.$snapXLines.forEach(function (e) {
      e.remove();
    });

    if (this.movingData.nearestXVal <= this.snapDistance) {
      var firsLineX = this.movingData.nearestX[0];

      if (firsLineX.flat & 1) {
        this.alignLeftDedge(firsLineX.value, this.movingData.body);
      } else if (firsLineX.flat & 2) {
        this.alignHorizontalCenter(this.layoutEditor.rootLayout.style.width - 2 * firsLineX.value);
      } else if (firsLineX.flat & 4) {
        this.alignRightDedge(this.layoutEditor.rootLayout.style.width - firsLineX.value, this.movingData.body);
      }
    }

    if (this.movingData.nearestYVal <= this.snapDistance) {
      var firsLineY = this.movingData.nearestY[0];

      if (firsLineY.flat & 1) {
        this.alignTopDedge(firsLineY.value, this.movingData.body);
      } else if (firsLineY.flat & 2) {
        this.alignVerticalCenter(this.layoutEditor.rootLayout.style.height - 2 * firsLineY.value);
      } else if (firsLineY.flat & 4) {
        this.alignBottomDedge(this.layoutEditor.rootLayout.style.height - firsLineY.value, this.movingData.body);
      }
    }
  }

  ;
  this.movingData = undefined;
};

RelativeAnchorEditor.prototype._updateSnapLines = function () {
  return; //todo
  // as-align-horizontal-lin

  var nearestYVal = 10000;
  var nearestY = [];
  var top = this.component.style.top;
  var middleY = this.component.style.top + this.component.style.height / 2;
  var bottom = this.component.style.top + this.component.style.height;
  var yLines = this.movingData.snapLines.y;
  var line;
  var dist;
  var yIsSmaller;
  var option = this.movingData.option;

  for (var i = 0; i < yLines.length; ++i) {
    line = yLines[i];

    if (line.flat & 1 && (option.body || option.top)) {
      dist = Math.abs(line.value - top);

      if (dist < nearestYVal) {
        nearestY = [line];
        nearestYVal = dist;
        yIsSmaller = line.value < top;
      } else if (dist == nearestYVal && line.value < top == yIsSmaller) {
        nearestY.push(line);
      }
    } else if (line.flat & 2 && option.body) {
      dist = Math.abs(line.value - middleY);

      if (dist < nearestYVal) {
        nearestY = [line];
        nearestYVal = dist;
        yIsSmaller = line.value < middleY;
      } else if (dist == nearestYVal && line.value < middleY == yIsSmaller) {
        nearestY.push(line);
      }
    } else if (line.flat & 4 && (option.body || option.bottom)) {
      dist = Math.abs(line.value - bottom);

      if (dist < nearestYVal) {
        nearestY = [line];
        nearestYVal = dist;
        yIsSmaller = line.value < bottom;
      } else if (dist == nearestYVal && line.value < bottom == yIsSmaller) {
        nearestY.push(line);
      }
    } // if 

  }

  var layoutBound = this.layoutEditor.rootLayout.domElt.getBoundingClientRect();
  var foregroundBound = this.layoutEditor.$foreground.getBoundingClientRect();

  while (this.movingData.$snapYLines.length < nearestY.length) {
    this.movingData.$snapYLines.push(_({
      class: 'as-align-horizontal-line',
      style: {
        left: layoutBound.left - foregroundBound.left + 'px',
        width: layoutBound.width + 'px'
      }
    }).addTo(this.layoutEditor.$foreground));
  }

  while (this.movingData.$snapYLines.length > nearestY.length) {
    this.movingData.$snapYLines.pop().remove();
  }

  for (var i = 0; i < nearestY.length; ++i) {
    this.movingData.$snapYLines[i].addStyle('top', layoutBound.left - foregroundBound.left + nearestY[i].value + 'px');

    if (nearestYVal <= this.snapDistance) {
      this.movingData.$snapYLines[i].addClass('as-active');
    } else {
      this.movingData.$snapYLines[i].removeClass('as-active');
    }
  }

  this.movingData.nearestY = nearestY;
  this.movingData.nearestYVal = nearestYVal;
  var nearestXVal = 10000;
  var nearestX = [];
  var left = this.component.style.left;
  var middleX = this.component.style.left + this.component.style.width / 2;
  var right = this.component.style.left + this.component.style.width;
  var xLines = this.movingData.snapLines.x;
  var line;
  var dist;
  var xIsSmaller;

  for (var i = 0; i < xLines.length; ++i) {
    line = xLines[i];

    if (line.flat & 1 && (option.body || option.left)) {
      dist = Math.abs(line.value - left);

      if (dist < nearestXVal) {
        nearestX = [line];
        nearestXVal = dist;
        xIsSmaller = line.value < left;
      } else if (dist == nearestXVal && line.value < left == xIsSmaller) {
        nearestX.push(line);
      }
    } else if (line.flat & 2 && option.body) {
      dist = Math.abs(line.value - middleX);

      if (dist < nearestXVal) {
        nearestX = [line];
        nearestXVal = dist;
        xIsSmaller = line.value < middleX;
      } else if (dist == nearestXVal && line.value < middleX == xIsSmaller) {
        nearestX.push(line);
      }
    } else if (line.flat & 4 && (option.body || option.right)) {
      dist = Math.abs(line.value - right);

      if (dist < nearestXVal) {
        nearestX = [line];
        nearestXVal = dist;
        xIsSmaller = line.value < right;
      } else if (dist == nearestXVal && line.value < right == xIsSmaller) {
        nearestX.push(line);
      }
    } // if 

  }

  var layoutBound = this.layoutEditor.rootLayout.domElt.getBoundingClientRect();
  var foregroundBound = this.layoutEditor.$foreground.getBoundingClientRect();

  while (this.movingData.$snapXLines.length < nearestX.length) {
    this.movingData.$snapXLines.push(_({
      class: 'as-align-vertical-line',
      style: {
        top: layoutBound.top - foregroundBound.top + 'px',
        height: layoutBound.height + 'px'
      }
    }).addTo(this.layoutEditor.$foreground));
  }

  while (this.movingData.$snapXLines.length > nearestX.length) {
    this.movingData.$snapXLines.pop().remove();
  }

  for (var i = 0; i < nearestX.length; ++i) {
    this.movingData.$snapXLines[i].addStyle('left', layoutBound.left - foregroundBound.left + nearestX[i].value + 'px');

    if (nearestXVal <= this.snapDistance) {
      this.movingData.$snapXLines[i].addClass('as-active');
    } else {
      this.movingData.$snapXLines[i].removeClass('as-active');
    }
  }

  this.movingData.nearestX = nearestX;
  this.movingData.nearestXVal = nearestXVal;
};

RelativeAnchorEditor.prototype.alignLeftDedge = function (leftValue, keepSize) {
  if (!this.component) return;
  var lLeft = this.component.getStyle('left', 'px');
  var lRight = this.component.getStyle('right', 'px');
  var currentHAlign = this.component.getStyle('hAlign');

  switch (currentHAlign) {
    case 'left':
      this.component.setStyle('left', leftValue, 'px');
      break;

    case 'fixed':
      this.component.setStyle('left', leftValue, 'px');

      if (keepSize) {
        this.component.setStyle('right', lRight - (leftValue - lLeft), 'px');
      }

      break;

    case 'right':
      this.component.setStyle('right', this.component.getStyle('right') + (leftValue - this.component.getStyle('left')), 'px');
      break;

    case 'center':
      var center = this.component.getStyle('left', 'px') + this.component.getStyle('width', 'px') / 2;

      if (center - this.component.measureMinSize().width / 2 >= leftValue) {
        this.component.setStyle('width', (center - leftValue) * 2, 'px');
      }

      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

RelativeAnchorEditor.prototype.alignRightDedge = function (rightValue, keepSize) {
  if (!this.component) return;
  var currentHAlign = this.component.getStyle('hAlign');
  var lLeft = this.component.getStyle('left', 'px');
  var lRight = this.component.getStyle('right', 'px');
  var dX = lRight - rightValue;

  switch (currentHAlign) {
    case 'right':
      this.component.setStyle('right', rightValue, 'px');
      break;

    case 'fixed':
      this.component.setStyle('right', rightValue, 'px');

      if (keepSize) {
        this.component.setStyle('left', lLeft - dX, 'px');
      }

      break;

    case 'left':
      this.component.setStyle('left', lLeft + dX, 'px');
      break;

    case 'center':
      if (!keepSize) {
        var center = this.component.getStyle('right', 'px') - this.component.getStyle('width', 'px') / 2;

        if (center + this.component.measureMinSize().width / 2 <= rightValue) {
          this.component.setStyle('width', (rightValue - center) * 2, 'px');
        }
      }

      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

RelativeAnchorEditor.prototype.alignHorizontalCenter = function (centerValue) {
  // right - left
  if (!this.component) return;
  var currentHAlign = this.component.getStyle('hAlign', 'px');
  var cRight = this.component.getStyle('right', 'px');
  var cLeft = this.component.getStyle('left', 'px');
  var newLeft = (cRight + cLeft - centerValue) / 2;
  var newRight = (cRight + cLeft + centerValue) / 2;

  switch (currentHAlign) {
    case 'right':
      this.component.setStyle('right', newRight, 'px');
      break;

    case 'fixed':
      this.component.setStyle('left', newLeft, 'px');
      this.component.setStyle('right', newRight, 'px');
      break;

    case 'left':
      this.component.setStyle('left', newLeft, 'px');
      break;

    case 'center':
      //noway to align center
      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

RelativeAnchorEditor.prototype.equaliseWidth = function (widthValue) {
  if (!this.component) return;
  var currentHAlign = this.component.getStyle('hAlign');
  var cRight = this.component.getStyle('right', 'px');
  var cLeft = this.component.getStyle('left', 'px');
  var cWidth = this.component.getStyle('width', 'px');
  var dw = widthValue - cWidth;

  switch (currentHAlign) {
    case 'right':
      if (cLeft < dw) this.component.setStyle('right', cRight - (dw - cLeft), 'px');
      this.component.setStyle('width', widthValue, 'px');
      break;

    case 'left':
      if (cRight < dw) this.component.setStyle('left', cLeft - (dw - cWidth), 'px');
      this.component.setStyle('width', widthValue, 'px');
      break;

    case 'fixed':
      if (dw > cRight) {
        this.component.setStyle('right', 0, 'px');
        this.component.setStyle('left', cLeft - (dw - cWidth), 'px');
      } else {
        this.component.setStyle('right', cRight - dw, 'px');
      }

      break;

    case 'center':
      this.component.setStyle('width', widthValue, 'px');
      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

RelativeAnchorEditor.prototype.alignTopDedge = function (topValue, keepSize) {
  if (!this.component) return;
  var currentVAlign = this.component.getStyle('vAlign');
  var lTop = this.component.style.top;
  var lBottom = this.component.style.bottom;

  switch (currentVAlign) {
    case 'top':
      this.component.setStyle('top', topValue, 'px');
      break;

    case 'fixed':
      this.component.setStyle('top', topValue, 'px');

      if (keepSize) {
        this.component.setStyle('bottom', lBottom - (topValue - lTop), 'px');
      }

      break;

    case 'bottom':
      this.component.setStyle('bottom', this.component.getStyle('bottom', 'px') + (topValue - this.component.getStyle('top')), 'px');
      break;

    case 'center':
      var center = this.component.getStyle('top', 'px') + this.component.getStyle('height', 'px') / 2;

      if (center - this.component.measureMinSize().height / 2 >= topValue) {
        this.component.setStyle('height', (center - topValue) * 2, 'px');
      }

      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

RelativeAnchorEditor.prototype.alignBottomDedge = function (bottomValue, keepSize) {
  if (!this.component) return;
  var currentVAlign = this.component.getStyle('vAlign');
  var lBottom = this.component.getStyle('bottom', 'px');
  var lTop = this.component.getStyle('top', 'px');

  switch (currentVAlign) {
    case 'bottom':
      this.component.setStyle('bottom', bottomValue, 'px');
      break;

    case 'fixed':
      this.component.setStyle('bottom', bottomValue, 'px');

      if (keepSize) {
        this.component.setStyle('top', lTop - (bottomValue - lBottom), 'px');
      }

      break;

    case 'top':
      var dY = lBottom - bottomValue;
      this.component.setStyle('top', lTop + dY, 'px');
      break;

    case 'center':
      var center = this.component.getStyle('bottom', 'px') - this.component.getStyle('height', 'px') / 2;

      if (center + this.component.measureMinSize().height / 2 <= bottomValue) {
        this.component.setStyle('height', (bottomValue - center) * 2, 'px');
      }

      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

RelativeAnchorEditor.prototype.alignVerticalCenter = function (centerValue) {
  // bottom - top
  if (!this.component) return;
  var currentVAlign = this.component.getStyle('vAlign');
  var cBottom = this.component.getStyle('bottom', 'px');
  var cTop = this.component.getStyle('top', 'px');
  var newTop = (cBottom + cTop - centerValue) / 2;
  var newBottom = (cBottom + cTop + centerValue) / 2;

  switch (currentVAlign) {
    case 'bottom':
      this.component.setStyle('bottom', newBottom, 'px');
      break;

    case 'fixed':
      this.component.setStyle('top', newTop, 'px');
      this.component.setStyle('bottom', newBottom, 'px');
      break;

    case 'top':
      this.component.setStyle('top', newTop, 'px');
      break;

    case 'center':
      //noway to align center
      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

RelativeAnchorEditor.prototype.equaliseHeight = function (heightValue) {
  if (!this.component) return;
  var currentVAlign = this.component.getStyle('vAlign');
  var cBottom = this.component.getStyle('bottom', 'px');
  var cTop = this.component.getStyle('top', 'px');
  var cHeight = this.component.getStyle('height', 'px');
  var dh = heightValue - cHeight;

  switch (currentVAlign) {
    case 'bottom':
      if (cTop < dh) this.component.setStyle('bottom', cBottom - (dh - cTop), 'px');
      this.component.setStyle('height', heightValue, 'px');
      break;

    case 'top':
      if (cBottom < dh) this.component.setStyle('top', cTop - (dh - cHeight), 'px');
      this.component.setStyle('height', heightValue, 'px');
      break;

    case 'fixed':
      if (dh > cBottom) {
        this.component.setStyle('bottom', 0, 'px');
        this.component.setStyle('top', cTop - (dh - cHeight), 'px');
      } else {
        this.component.setStyle('bottom', cBottom - dh, 'px');
      }

      break;

    case 'center':
      this.component.setStyle('height', heightValue, 'px');
      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};
/**
 * @returns {{x:Array<{components:Array, value:Number}>, y:Array<{components:Array, value:Number}, flat:Number>}}
 */


RelativeAnchorEditor.prototype.getSnapLines = function () {
  if (!this.component.parent) return {
    x: [],
    y: []
  };
  var children = this.component.parent.children;
  var xComp = [];
  var yComp = [];
  var comp;

  for (var i = 0; i < children.length; ++i) {
    comp = children[i];
    if (this.component == comp) continue;
    xComp.push({
      component: comp,
      value: comp.style.left,
      flat: 1
    });
    xComp.push({
      component: comp,
      value: comp.style.left + comp.style.width / 2,
      flat: 2
    });
    xComp.push({
      component: comp,
      value: comp.style.left + comp.style.width,
      flat: 4
    });
    yComp.push({
      component: comp,
      value: comp.style.top,
      flat: 1
    });
    yComp.push({
      component: comp,
      value: comp.style.top + comp.style.height / 2,
      flat: 2
    });
    yComp.push({
      component: comp,
      value: comp.style.top + comp.style.height,
      flat: 4
    });
  }

  var cmp = function (a, b) {
    return a.value - b.value;
  };

  xComp.sort(cmp);
  yComp.sort(cmp);

  var reducer = function (ac, cr) {
    if (ac.last.value != cr.value) {
      ac.last = {
        components: [cr.component],
        value: cr.value,
        flat: 0
      };
      ac.result.push(ac.last);
    } else {
      if (ac.last.components.indexOf(cr.component) < 0) ac.last.components.push(cr.component);
    }

    ac.last.flat = ac.last.flat | cr.flat;
    return ac;
  };

  return {
    x: xComp.reduce(reducer, {
      result: [],
      last: {
        value: -1000000,
        components: [],
        flat: 0
      }
    }).result,
    y: yComp.reduce(reducer, {
      result: [],
      last: {
        value: -1000000,
        components: [],
        flat: 0
      }
    }).result
  };
};

RelativeAnchorEditor.prototype.getCmdGroupTree = function () {
  return _RelativeAnchorEditorCmd.RelativeAnchorEditorCmdTree;
};

RelativeAnchorEditor.prototype.getCmdDescriptor = function (name) {
  return _RelativeAnchorEditorCmd.RelativeAnchorEditorCmdDescriptors[name];
};

RelativeAnchorEditor.prototype.execCmd = function () {
  return this.cmdRunner.invoke.apply(this.cmdRunner, arguments);
};

var _default = RelativeAnchorEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouts/RelativeLayout.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouts/RelativeLayout.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _RelativeAnchor = _interopRequireDefault(require("../anchors/RelativeAnchor"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _BaseLayout = _interopRequireDefault(require("../core/BaseLayout"));

var _RelativeAnchorEditor = _interopRequireDefault(require("../layouteditor/anchoreditors/RelativeAnchorEditor"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Assembler = require("../core/Assembler");


var _ = _FCore.default._;

function RelativeLayout() {
  _BaseLayout.default.call(this);
}

_OOP.default.mixClass(RelativeLayout, _BaseLayout.default);

RelativeLayout.prototype.tag = 'RelativeLayout';
RelativeLayout.prototype.menuIcon = 'span.mdi.mdi-relative-scale';
RelativeLayout.prototype.TOP_CLASS_NAME = 'as-relative-layout';
RelativeLayout.prototype.SUPPORT_STYLE_NAMES = ['width', 'height']; //, 'left', 'right', 'top', 'bottom'];

RelativeLayout.prototype.AnchorClass = _RelativeAnchor.default;
RelativeLayout.prototype.AnchorEditorClass = _RelativeAnchorEditor.default;

RelativeLayout.prototype.render = function () {
  return _({
    class: this.TOP_CLASS_NAME
  });
};

RelativeLayout.prototype.onAddChild = function (child, index) {
  var anchor = new _RelativeAnchor.default();
  anchor.attachChild(child);

  if (index == -1 || !this.view.childNodes[index]) {
    this.view.addChild(anchor.view);
  } else {
    this.view.addChildBefore(anchor.view, this.view.childNodes[index]);
  }
};

RelativeLayout.prototype.onRemoveChild = function (child, index) {
  var anchor = child.anchor;
  anchor.detachChild();
  anchor.view.remove();
};
/**
 * @param {BaseComponent} child,
 * @param {Number} posX
 * @param {Number} posY
 */


RelativeLayout.prototype.addChildByPosition = function (child, posX, posY) {
  this.addChild(child);
  var width = this.style.getProperty('width', 'px');
  var height = this.style.getProperty('height', 'px');
  var cWidth = child.style.getProperty('width', 'px');
  var cHeight = child.style.getProperty('height', 'px');
  posX = Math.max(0, Math.min(width - cWidth, posX));
  posY = Math.max(0, Math.min(height - cHeight, posY));
  child.setStyle('left', posX);
  child.setStyle('top', posY);
};

_Assembler.AssemblerInstance.addClass(RelativeLayout);

var _default = RelativeLayout;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/DateInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/DateInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _datetime = require("absol/src/Time/datetime");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _DateInput = _interopRequireDefault(require("absol-acomp/js/DateInput2"));




var _ = _FCore.default._;

var dateKeyOf = date => {
  if (!date) return 'NULL';
  if (date.getTime) return (0, _datetime.beginOfDay)(date).toString();
  return date + '';
};
/***
 * @extends ScalableComponent
 * @constructor
 */


function DateInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(DateInput, _ScalableComponent.default);
DateInput.prototype.tag = "DateInput";
DateInput.prototype.menuIcon = "span.mdi.mdi-calendar-edit";
DateInput.prototype.SUPPORT_EVENT_NAMES = ['change'];
Object.assign(DateInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(DateInput.prototype.styleHandlers, _InputStyleHandlers.default);
DateInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prevKey = dateKeyOf(this.domElt.value);
    value = (0, _datetime.implicitDate)(value);
    if (value) value = (0, _datetime.beginOfDay)(value);
    this.domElt.value = value;
    var cur = dateKeyOf(this.domElt.value);

    if (prevKey !== cur) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.view.value;
  },
  descriptor: {
    type: 'date',
    nullable: true,
    // defaultValue: beginOfDay(new Date()),//??
    sign: 'SimpleDate'
  },
  export: function () {
    if (this.domElt.notNull && !this.domElt._value) return undefined; //this is auto, not assign

    var value = this.domElt.value;
    if (!value) return undefined;
    return value;
  }
};
DateInput.prototype.attributeHandlers.min = {
  set: function (value) {
    value = (0, _datetime.implicitDate)(value);
    this.domElt.min = value;
  },
  get: function () {
    return this.domElt.min;
  },
  descriptor: {
    type: 'date',
    nullable: true,
    sign: 'date_min'
  },
  export: function () {
    var value = this.domElt.min;
    if (!value) return undefined;
    if ((0, _datetime.compareDate)(value, new Date(1890, 0, 1, 0, 0, 0, 0)) === 0) return undefined;
    return value;
  }
};
DateInput.prototype.attributeHandlers.max = {
  set: function (value) {
    value = (0, _datetime.implicitDate)(value);
    this.domElt.max = value;
  },
  get: function () {
    return this.domElt.max;
  },
  descriptor: {
    type: 'date',
    nullable: true,
    sign: 'date_min'
  },
  export: function () {
    var value = this.domElt.max;
    if (!value) return undefined;
    if ((0, _datetime.compareDate)(value, new Date(2090, 0, 1, 0, 0, 0, 0)) === 0) return undefined;
    if (_DateInput.default) return value;
  }
};
DateInput.prototype.attributeHandlers.format = {
  set: function (value) {
    this.domElt.format = value || 'dd/MM/yyyy';
  },
  get: function () {
    return this.domElt.format;
  },
  descriptor: {
    type: 'enum',
    values: ['dd/MM/yyyy', 'MM/dd/yyyy', 'yyyy/MM/dd', 'dd-MM-yyyy', 'MM-dd-yyyy', 'MM/yyyy', 'MM-yyyy', 'yyyy']
  }
};
DateInput.prototype.attributeHandlers.notNull = {
  set: function (value) {
    this.domElt.notNull = !!value;
  },
  get: function () {
    return this.domElt.notNull;
  },
  export: function () {
    return this.domElt.notNull || undefined;
  },
  descriptor: {
    type: 'bool',
    sign: 'value_not_null'
  }
};
DateInput.prototype.pinHandlers.min = {
  receives: function (value) {
    this.domElt.min = (0, _datetime.implicitDate)(value);
  },
  descriptor: {
    type: "Date"
  }
};
DateInput.prototype.pinHandlers.max = {
  receives: function (value) {
    value = (0, _datetime.implicitDate)(value);
    this.domElt.max = value;
  },
  descriptor: {
    type: "Date"
  }
};
DateInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: "Date"
  }
};
DateInput.prototype.style.width = 'auto';
DateInput.prototype.style.height = 30;
DateInput.prototype.attributes.value = null;

DateInput.prototype.render = function () {
  return _('dateinput');
};

DateInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('change', this.ev_inputChange.bind(this));
};

DateInput.prototype.measureMinSize = function () {
  return {
    width: 75,
    height: 16
  };
};

DateInput.prototype.verify = function () {
  if (!this.attributes.required) return {
    completed: true
  };
  var value = this.attributes.value;

  if (value === null) {
    return {
      completed: false,
      comp: this
    };
  }
};

DateInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

DateInput.prototype.ev_inputChange = function () {
  this.pinFire('value');
  this.notifyChange();
};

_Assembler.AssemblerInstance.addClass(DateInput);

var _default = DateInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/HLine.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/HLine.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/hline.css");


var $ = _FCore.default.$;
var _ = _FCore.default._;

function HLine() {}

HLine.render = function () {
  return _({
    class: 'as-hline',
    child: {
      class: 'as-hline-body',
      child: ['.as-hline-dot.left', '.as-hline-dot.right']
    }
  });
};

_FCore.default.install('hline', HLine);

var _default = HLine;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/VLine.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/VLine.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/vline.css");


var $ = _FCore.default.$;
var _ = _FCore.default._;

function VLine() {}

VLine.render = function () {
  return _({
    class: 'as-vline',
    child: {
      class: 'as-vline-body',
      child: ['.as-vline-dot.top', '.as-vline-dot.bottom']
    }
  });
};

_FCore.default.install('vline', VLine);

var _default = VLine;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/R.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/R.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var R = {
  NOTIFICATION_CENTER: 'NOTIFICATION_CENTER',
  TASK: 'TASK',
  CLASSES: 'CLASSES',
  LAYOUT_EDITOR: 'LAYOUT_EDITOR',
  BLOCK_EDITOR: 'BLOCK_EDITOR',
  DIAGRAM_EDITOR: 'DIAGRAM_EDITOR',
  FLEX_FORM_EDITOR: 'FLEX_FORM_EDITOR',
  FLEX_FORM_OUTLINE: 'FLEX_FORM_OUTLINE',
  FLEX_FORM_COMPONENT_TOOL: 'FLEX_FORM_COMPONENT_TOOL',
  ATTRIBUTE_EDITOR: 'ATTRIBUTE_EDITOR',
  EVENT_EDITOR: 'EVENT_EDITOR',
  STYLE_EDITOR: 'STYLE_EDITOR',
  ALL_PROPERTY_EDITOR: 'ALL_PROPERTY_EDITOR',
  COMPONENT_PROPERTIES_EDITOR: 'COMPONENT_PROPERTIES_EDITOR',
  COMPONENT_OUTLINE: 'COMPONENT_OUTLINE',
  COMPONENT_PICKER: 'COMPONENT_PICKER',
  CMD_TOOL: 'CMD_TOOL',
  UNDO_HISTORY: 'UNDO_HISTORY',
  FORM_EDITOR: 'FORM_EDITOR',
  LAUNCHER: 'LAUNCHER',
  HAS_CMD_EDITOR: "HAS_CMD_EDITOR",
  PROJECT_EXPLORER: 'PROJECT_EXPLORER',
  PLUGINS: {
    COMPILE_FUNCTION: 'COMPILE_FUNCTION',
    COMPONENT_PICKER_VIEW: 'COMPONENT_PICKER_VIEW',
    BUILD_COMPONENT: 'BUILD_COMPONENT',
    PROJECT_EXPLORER: 'PROJECT_EXPLORER',
    LOAD_CONTENT_DATA: 'LOAD_CONTENT_DATA',
    SAVE_CONTENT_DATA: 'SAVE_CONTENT_DATA',
    SAVE_AS_CONTENT_DATA: 'SAVE_AS_CONTENT_DATA',
    SAVE_AS_SYSTEM: 'SAVE_AS_SYSTEM'
  },
  CLIPBOARD: {
    COMPONENTS: 'COMPONENTS'
  },
  APP: 'ABSOL_FORM_EDITOR',
  VERSION: '1.0.0',
  STATUS_BAR_ELT: 'STATUS_BAR_ELT',
  DATA_MODEL: 'DATABASE'
};
var _default = R;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/BaseEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/BaseEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _CMDRunner = _interopRequireDefault(require("absol/src/AppPattern/CMDRunner"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _generator = require("absol/src/JSMaker/generator");


/***
 *
 * @constructor
 * @augments Fragment
 * @augments EventEmitter
 */
function BaseEditor() {
  _EventEmitter.default.call(this);

  _Fragment.default.call(this);

  this.cmdRunner = new _CMDRunner.default(this);
  this.cmdBindKeys = {};
  this.loadConfig();
}

_OOP.default.mixClass(BaseEditor, _EventEmitter.default, _Fragment.default);

BaseEditor.prototype.CONFIG_STORE_KEY = "AS_BaseEditor_config";
BaseEditor.prototype.config = {}; //share width differentInstance

BaseEditor.prototype.loadConfig = function () {
  var raw = localStorage.getItem(this.CONFIG_STORE_KEY);

  if (raw) {
    try {
      Object.assign(this.config, (0, _generator.replaceDateStringJSVariable)(JSON.parse(raw)));
    } catch (error) {
      (0, _safeThrow.default)(error);
      console.error("Config fail:", error);
    }
  }
};
/***
 *
 * @param {boolean=} immediately
 */


BaseEditor.prototype.saveConfig = function (immediately) {
  if (this._saveConfigTimeOut > 0) {
    clearTimeout(this._saveConfigTimeOut);
    this._saveConfigTimeOut = -1;
  }

  var self = this;

  var save = () => {
    var raw = JSON.stringify(self.config);
    localStorage.setItem(self.CONFIG_STORE_KEY, raw);
  };

  if (immediately) {
    save();
  } else {
    this._saveConfigTimeOut = setTimeout(save, 2000);
  }
};

BaseEditor.prototype.setupCmd = function (commands, descriptors) {
  if (commands) this.cmdRunner.assign(commands);
  if (descriptors) Object.keys(descriptors).forEach(function (cmd) {
    if (descriptors[cmd].bindKey) this.bindKeyToCmd(descriptors[cmd].bindKey.win, cmd);
  }.bind(this));
};

BaseEditor.prototype.setData = function (data) {
  throw new Error('Not implement!');
};

BaseEditor.prototype.getData = function () {
  throw new Error('Not implement!');
};

BaseEditor.prototype.getComponentTool = function () {
  return undefined;
};

BaseEditor.prototype.getOutlineTool = function () {
  return undefined;
};

BaseEditor.prototype.notifyDataChange = function () {
  this.emit('datachange', {
    type: 'datachange',
    target: this
  }, this);
};

BaseEditor.prototype.execCmd = function () {
  return this.cmdRunner.invoke.apply(this.cmdRunner, arguments);
};

BaseEditor.prototype.getCmdNames = function () {
  return [];
};

BaseEditor.prototype.getCmdDescriptors = function () {
  var self = this;
  return this.getCmdNames().reduce(function (ac, name) {
    ac[name] = self.getCmdDescriptor(name);
    return ac;
  }, {});
};

BaseEditor.prototype.getCmdDescriptor = function (name) {
  return {
    type: 'trigger',
    args: [],
    desc: '',
    bindKey: undefined
  };
};

BaseEditor.prototype.notifyCmdDescriptorsChange = function () {
  this.emit('cmddescriptorschange', {
    type: 'cmddescriptorschange'
  }, this);
};

BaseEditor.prototype.notifyCmdChange = function () {
  this.emit('cmdchange', {
    type: 'cmdchange'
  }, this);
};

BaseEditor.prototype.getCmdGroupTree = function () {
  return [];
};

BaseEditor.prototype.bindKeyToCmd = function (key, cmd) {
  this.cmdBindKeys[key] = cmd;
};

BaseEditor.prototype._isInputSupportedKey = function (target, key) {
  var isTextInput = !!(target.tagName && target.tagName.toLowerCase().match(/input|textarea/));
  isTextInput = isTextInput || target.contentEditable === 'true' || target.contentEditable === true || target.getAttribute('contenteditable') !== null;
  var cur = target.parentElement;

  while (cur && !!isTextInput) {
    isTextInput = isTextInput || cur.contentEditable === 'true' || cur.contentEditable === true || cur.getAttribute('contenteditable') !== null;
    cur = cur.parentElement;
  }

  return isTextInput && ['Ctrl-A', 'Ctrl-C', 'Ctrl-X', 'Ctrl-V', 'Ctrl-Z', 'Ctrl-Y', 'Delete', 'Backspace', 'Esc', 'Enter', 'Alt-Enter', 'Ctrl-Enter'].indexOf(key) >= 0;
};
/**
 * @param {KeyboardEvent}event
 */


BaseEditor.prototype.ev_cmdKeyDown = function (event) {
  var specKeys = [];
  if (event.ctrlKey) specKeys.push('Ctrl');
  if (event.shiftKey) specKeys.push('Shift');
  if (event.altKey) specKeys.push('Alt');
  var key = event.key;
  if (key.length == 1) key = key.toUpperCase();
  var key1 = specKeys.concat([key]).join('-');
  var key2 = specKeys.concat([event.keyCode]).join('-');
  var cmd = this.cmdBindKeys[key1] || this.cmdBindKeys[key2];

  if (cmd && !this._isInputSupportedKey(event.target, key1)) {
    this.execCmd(cmd, event);
    event.preventDefault();
  }
};

var _default = BaseEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/WindowManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/WindowManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function WindowManager() {
  this.windowHolders = [];
  this.zIndex = 100;
}

WindowManager.prototype.ev_mouseDownWindow = function (holder, event) {
  holder.delta = 1000;
  this.reIndex();
};

WindowManager.prototype.remove = function (elt) {
  var holder = this.getHolder(elt);
  if (!holder) return;
  elt.off('mousedown', holder.onmousedown);
  elt.remove();
  holder.delta -= 100000000;
  this.reIndex();
};

WindowManager.prototype.getHolder = function (elt) {
  for (var i = 0; i < this.windowHolders.length; ++i) {
    if (this.windowHolders[i].elt == elt) return this.windowHolders[i];
  }
};

WindowManager.prototype.add = function (elt) {
  var holder = this.getHolder(elt);
  if (holder) return holder;
  var holder = {
    elt: elt,
    zIndex: 100,
    delta: 1000
  };
  holder.onmousedown = this.ev_mouseDownWindow.bind(this, holder);
  this.windowHolders.push(holder);
  elt.on('mousedown', holder.onmousedown);
  elt.addTo(document.body);
  this.reIndex();
  return holder;
};

WindowManager.prototype.reIndex = function () {
  this.windowHolders.sort(function (a, b) {
    return a.zIndex + a.delta - b.zIndex - b.delta;
  });

  while (this.windowHolders.length > 0 && this.windowHolders[0].delta < 0) this.windowHolders.shift();

  var holder;

  for (var i = 0; i < this.windowHolders.length; ++i) {
    holder = this.windowHolders[i];
    holder.delta = 0;

    if (holder.zIndex != this.zIndex + i) {
      holder.zIndex = this.zIndex + i;
      holder.elt.addStyle('zIndex', holder.zIndex + '');
    }
  }
};

var _default = new WindowManager();

exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/UndoHistory.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/UndoHistory.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.UndoHistoryItem = UndoHistoryItem;
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

require("../../css/undohistory.css");

var _R = _interopRequireDefault(require("../R"));

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _WindowManager = _interopRequireDefault(require("../dom/WindowManager"));


var _ = _FCore.default._;
var $ = _FCore.default.$;

function UndoHistory() {
  _BaseEditor.default.call(this);

  this._lastPosition = undefined;
  this.items = [];
  this.lastItemIndex = this.items.length - 1;
}

Object.defineProperties(UndoHistory.prototype, Object.getOwnPropertyDescriptors(_BaseEditor.default.prototype));
UndoHistory.prototype.constructor = UndoHistory;
UndoHistory.prototype.CONFIG_STORE_KEY = "AS_UndoHistory_config";
UndoHistory.prototype.config = {
  windowStyle: {
    left: '57px',
    top: _Dom.default.getScreenSize().height - 230 + 'px'
  }
};

UndoHistory.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = _({
    attr: {
      tabIndex: '1'
    },
    class: ['as-undo-history'],
    child: [{
      class: 'as-undo-history-header-name',
      child: {
        tag: 'span',
        child: {
          text: 'History'
        }
      }
    }, {
      class: 'as-undo-history-active-buttons',
      child: [{
        tag: 'button',
        class: 'as-undo-history-active-undo',
        attr: {
          title: 'Undo'
        },
        props: {
          disabled: true
        },
        child: 'span.mdi.mdi-undo'
      }, {
        tag: 'button',
        class: 'as-undo-history-active-redo',
        attr: {
          title: 'Redo'
        },
        props: {
          disabled: true
        },
        child: 'span.mdi.mdi-redo'
      }, {
        class: 'as-undo-history-active-buttons-right-container',
        child: {
          tag: 'button',
          attr: {
            title: 'Clear'
          },
          class: 'as-undo-history-active-clear',
          child: 'span.mdi.mdi-delete'
        }
      }]
    }, {
      tag: 'bscroller',
      class: ['as-undo-history-item-list'],
      child: this.items.map(function (item) {
        return item.getView();
      })
    }],
    on: {
      keydown: this.ev_cmdKeyDown.bind(this)
    }
  });
  this.$list = $('.as-undo-history-item-list', this.$view);
  this.$undoBtn = $('button.as-undo-history-active-undo', this.$view).on('click', this.undo.bind(this));
  this.$redoBtn = $('button.as-undo-history-active-redo', this.$view).on('click', this.redo.bind(this));
  this.$clear = $('button.as-undo-history-active-clear', this.$view).on('click', this.clear.bind(this));
  return this.$view;
};

UndoHistory.prototype.checkout = function (item, viewOnly) {
  var cItem;
  var found = false;

  for (var i = this.items.length - 1; i >= 0; --i) {
    cItem = this.items[i];

    if (cItem == item) {
      cItem.setActive(true);
      found = true;
      this.lastItemIndex = i;
    } else {
      cItem.setActive(false);
    }

    cItem.setDisabled(!found);
  }

  this.$list.scrollInto(item.getView());
  this.$undoBtn.disabled = this.lastItemIndex <= 0;
  this.$redoBtn.disabled = this.lastItemIndex >= this.items.length - 1;
  if (!viewOnly) this.emit('checkout', {
    type: 'checkout',
    target: this,
    item: item
  }, this);
};

UndoHistory.prototype.undo = function () {
  if (this.lastItemIndex > 0) {
    this.checkout(this.items[this.lastItemIndex - 1]);
  }
};

UndoHistory.prototype.redo = function () {
  if (this.lastItemIndex < this.items.length - 1) {
    this.checkout(this.items[this.lastItemIndex + 1]);
  }
};
/**
 * @param {String} type
 * @param {*} data
 * @param {String} description
 * @param {Date} timestamp
 */


UndoHistory.prototype.commit = function (type, data, description, timestamp) {
  var item;

  while (this.items.length > this.lastItemIndex + 1) {
    item = this.items.pop();
    item.getView().remove();
  }

  var res = new UndoHistoryItem(this, type, data, description, timestamp);
  this.items.push(res);
  this.$list.addChild(res.getView());
  this.checkout(res, true);
  return res;
};

UndoHistory.prototype.clear = function () {
  if (this.items.length < 2) return;
  var lastItem = this.items.pop();
  var lastData = lastItem.data;
  lastItem.getView().remove();

  while (this.items.length > 0) {
    lastItem = this.items.pop();
    lastItem.getView().remove();
  }

  this.commit('clear', lastData, 'Clear History');
};

UndoHistory.prototype.renew = function () {
  var lastItem;

  while (this.items.length > 0) {
    lastItem = this.items.pop();
    lastItem.getView().remove();
  }
};

UndoHistory.prototype.ev_cmdKeyDown = function (event) {
  this.editor && this.editor.ev_cmdKeyDown(event);
};
/**
 * @param {UndoHistory}parent
 * @param {String} type
 * @param {*} data
 * @param {String} description
 * @param {Date} timestamp
 */


function UndoHistoryItem(parent, type, data, description, timestamp) {
  this.parent = parent;
  this.type = type || 'edit';
  this.data = data;
  this.description = description || 'Change';
  this.timestamp = timestamp || new Date();
  this._active = false;
  this._disabled = false;
}

UndoHistoryItem.prototype.typeIcon = {
  move: 'span.mdi.mdi-move-resize',
  remove: 'span.mdi.mdi-delete-variant[style="color: rgb(255,59,59)"]',
  'edit-attribute': 'span.mdi.mdi-circle-edit-outline',
  edit: 'span.mdi.mdi-circle-edit-outline',
  add: 'span.mdi.mdi-pen-plus',
  'set-data': 'span.mdi.mdi-open-in-app',
  'move-resize': 'span.mdi.mdi-move-resize',
  'move-order': 'span.mdi.mdi-arrow-up-down-bold',
  'clear': 'span.mdi.mdi-check-outline',
  'cut': 'span.mdi.mdi-content-cut'
};

UndoHistoryItem.prototype.setActive = function (bool) {
  this._active = !!bool;

  if (this.$view) {
    if (bool) {
      this.$view.addClass('as-undo-history-item-active');
    } else {
      this.$view.removeClass('as-undo-history-item-active');
    }
  }
};

UndoHistoryItem.prototype.setDisabled = function (bool) {
  this._disabled = !!bool;

  if (this.$view) {
    if (bool) {
      this.$view.addClass('as-undo-history-item-disabled');
    } else {
      this.$view.removeClass('as-undo-history-item-disabled');
    }
  }
};

UndoHistoryItem.prototype.getActive = function () {
  return this._active;
};

UndoHistoryItem.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = _({
    class: ['as-undo-history-item'].concat(this._active ? ['as-undo-history-item-active'] : []).concat(this._disabled ? ['as-undo-history-item-disabled'] : []),
    attr: {
      title: this.timestamp.toLocaleTimeString()
    },
    child: [{
      class: 'as-undo-history-item-icon-container',
      child: this.typeIcon[this.type]
    }, {
      text: this.description
    }],
    on: {
      click: this.ev_click.bind(this)
    }
  });
  return this.$view;
};

UndoHistoryItem.prototype.ev_click = function (event) {
  this.parent.checkout(this);
};

var _default = UndoHistory;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/font/GoogleFont.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/font/GoogleFont.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.queryURL = queryURL;
exports.FONT_FACES_BY_NAME = exports.FONT_ITEMS = exports.FONT_FACES = exports.FONT_NAMES = void 0;

function queryURL(fontNames) {
  return 'https://fonts.googleapis.com/css?family=' + fontNames.join('_') + '&display=swap';
}

var FONT_NAMES = ["Alegreya", "Alegreya+SC", "Alegreya+Sans", "Alegreya+Sans+SC", "Alfa+Slab+One", "Amatic+SC", "Andika", "Anton", "Archivo", "Archivo+Narrow", "Arima+Madurai", "Arimo", "Arsenal", "Asap", "Asap+Condensed", "Athiti", "Bahianita", "Bai+Jamjuree", "Baloo", "Baloo+Bhai", "Baloo+Bhaijaan", "Baloo+Bhaina", "Baloo+Chettan", "Baloo+Da", "Baloo+Paaji", "Baloo+Tamma", "Baloo+Tammudu", "Baloo+Thambi", "Bangers", "Barlow", "Barlow+Condensed", "Barlow+Semi+Condensed", "Barriecito", "Be+Vietnam", "Bevan", "Big+Shoulders+Display", "Big+Shoulders+Text", "Bungee", "Bungee+Hairline", "Bungee+Inline", "Bungee+Outline", "Bungee+Shade", "Cabin", "Cabin+Condensed", "Chakra+Petch", "Charm", "Charmonman", "Chonburi", "Coiny", "Comfortaa", "Cormorant", "Cormorant+Garamond", "Cormorant+Infant", "Cormorant+SC", "Cormorant+Unicase", "Cormorant+Upright", "Cousine", "Crimson+Pro", "Cuprum", "Dancing+Script", "Darker+Grotesque", "David+Libre", "Dosis", "EB+Garamond", "Encode+Sans", "Encode+Sans+Condensed", "Encode+Sans+Expanded", "Encode+Sans+Semi+Condensed", "Encode+Sans+Semi+Expanded", "Exo", "Exo+2", "Fahkwang", "Farsan", "Faustina", "Fira+Sans", "Fira+Sans+Condensed", "Fira+Sans+Extra+Condensed", "Francois+One", "Grenze", "Hepta+Slab", "IBM+Plex+Mono", "IBM+Plex+Sans", "IBM+Plex+Sans+Condensed", "IBM+Plex+Serif", "Inconsolata", "Itim", "Josefin+Sans", "Judson", "Jura", "K2D", "Kanit", "KoHo", "Kodchasan", "Krub", "Lalezar", "Lemonada", "Lexend+Deca", "Lexend+Exa", "Lexend+Giga", "Lexend+Mega", "Lexend+Peta", "Lexend+Tera", "Lexend+Zetta", "Literata", "Livvic", "Lobster", "Lora", "M+PLUS+1p", "M+PLUS+Rounded+1c", "Maitree", "Major+Mono+Display", "Mali", "Manuale", "Markazi+Text", "Maven+Pro", "Merriweather", "Metrophobic", "Mitr", "Montserrat", "Montserrat+Alternates", "Muli", "Niramit", "Noticia+Text", "Noto+Sans", "Noto+Sans+SC", "Noto+Serif", "Noto+Serif+SC", "Noto+Serif+TC", "Nunito", "Nunito+Sans", "Old+Standard+TT", "Open+Sans", "Open+Sans+Condensed:300", "Oswald", "Pacifico", "Pangolin", "Patrick+Hand", "Patrick+Hand+SC", "Pattaya", "Paytone+One", "Philosopher", "Play", "Playfair+Display", "Playfair+Display+SC", "Podkova", "Prata", "Pridi", "Prompt", "Quicksand", "Roboto", "Roboto+Condensed", "Roboto+Mono", "Roboto+Slab", "Rokkitt", "Rosario", "Saira", "Saira+Condensed", "Saira+Extra+Condensed", "Saira+Semi+Condensed", "Saira+Stencil+One", "Sarabun", "Sawarabi+Gothic", "Sedgwick+Ave", "Sedgwick+Ave+Display", "Sigmar+One", "Source+Code+Pro", "Source+Sans+Pro", "Space+Mono", "Spectral", "Spectral+SC", "Sriracha", "Srisakdi", "Taviraj", "Thasadith", "Tinos", "Trirong", "VT323", "Varela+Round", "Vollkorn", "Vollkorn+SC", "Yanone+Kaffeesatz", "Yeseva+One"];
exports.FONT_NAMES = FONT_NAMES;
var FONT_FACES = ["'Open Sans', sans-serif", "'Roboto', sans-serif", "'Big Shoulders Text', cursive", "'Montserrat', sans-serif", "'Oswald', sans-serif", "'Source Sans Pro', sans-serif", "'Roboto Condensed', sans-serif", "'Literata', serif", "'Roboto Mono', monospace", "'Roboto Slab', serif", "'Merriweather', serif", "'Noto Sans', sans-serif", "'Lora', serif", "'Muli', sans-serif", "'Open Sans Condensed', sans-serif", "'Playfair Display', serif", "'Nunito', sans-serif", "'Noto Serif', serif", "'Fira Sans', sans-serif", "'Inconsolata', monospace", "'Dosis', sans-serif", "'Nunito Sans', sans-serif", "'Arimo', sans-serif", "'Quicksand', sans-serif", "'Cabin', sans-serif", "'Josefin Sans', sans-serif", "'Varela Round', sans-serif", "'Anton', sans-serif", "'Lobster', cursive", "'Yanone Kaffeesatz', sans-serif", "'Source Code Pro', monospace", "'Baloo Bhai', cursive", "'Barlow', sans-serif", "'Dancing Script', cursive", "'Pacifico', cursive", "'Exo 2', sans-serif", "'Barlow Semi Condensed', sans-serif", "'EB Garamond', serif", "'Archivo Narrow', sans-serif", "'Asap', sans-serif", "'Comfortaa', cursive", "'Barlow Condensed', sans-serif", "'IBM Plex Sans', sans-serif", "'Maven Pro', sans-serif", "'Play', sans-serif", "'Exo', sans-serif", "'Amatic SC', cursive", "'Kanit', sans-serif", "'Fira Sans Condensed', sans-serif", "'Noto Sans SC', sans-serif", "'Vollkorn', serif", "'Prompt', sans-serif", "'Rokkitt', serif", "'Cuprum', sans-serif", "'Alegreya Sans', sans-serif", "'Francois One', sans-serif", "'Cormorant Garamond', serif", "'Alegreya', serif", "'Alfa Slab One', cursive", "'Noticia Text', serif", "'Saira Extra Condensed', sans-serif", "'Old Standard TT', serif", "'Tinos', serif", "'Fira Sans Extra Condensed', sans-serif", "'IBM Plex Serif', serif", "'Patrick Hand', cursive", "'M PLUS 1p', sans-serif", "'Prata', serif", "'Philosopher', sans-serif", "'Saira Semi Condensed', sans-serif", "'Archivo', sans-serif", "'Big Shoulders Display', cursive", "'Bangers', cursive", "'Playfair Display SC', serif", "'Cabin Condensed', sans-serif", "'Paytone One', sans-serif", "'Montserrat Alternates', sans-serif", "'Taviraj', serif", "'Spectral', serif", "'Lalezar', cursive", "'Asap Condensed', sans-serif", "'M PLUS Rounded 1c', sans-serif", "'Sigmar One', cursive", "'Saira', sans-serif", "'Pridi', serif", "'Mitr', sans-serif", "'Baloo', cursive", "'Cormorant', serif", "'Sarabun', sans-serif", "'Saira Condensed', sans-serif", "'Be Vietnam', sans-serif", "'Yeseva One', cursive", "'Lexend Peta', sans-serif", "'Alegreya Sans SC', sans-serif", "'IBM Plex Mono', monospace", "'Jura', sans-serif", "'Bevan', cursive", "'Lexend Exa', sans-serif", "'Sawarabi Gothic', sans-serif", "'Cousine', monospace", "'Markazi Text', serif", "'VT323', monospace", "'Baloo Bhaina', cursive", "'Space Mono', monospace", "'Encode Sans', sans-serif", "'Encode Sans Semi Expanded', sans-serif", "'Arima Madurai', cursive", "'Lexend Deca', sans-serif", "'Lexend Tera', sans-serif", "'Lexend Giga', sans-serif", "'Lexend Zetta', sans-serif", "'Lexend Mega', sans-serif", "'Arsenal', sans-serif", "'Itim', cursive", "'Noto Serif SC', serif", "'Pangolin', cursive", "'Lemonada', cursive", "'Encode Sans Condensed', sans-serif", "'Bai Jamjuree', sans-serif", "'Alegreya SC', serif", "'Noto Serif TC', serif", "'Judson', serif", "'Livvic', sans-serif", "'Krub', sans-serif", "'Trirong', serif", "'Niramit', sans-serif", "'Bungee Inline', cursive", "'Mali', cursive", "'Pattaya', sans-serif", "'Rosario', sans-serif", "'Bungee', cursive", "'Sriracha', cursive", "'Metrophobic', sans-serif", "'Faustina', serif", "'Darker Grotesque', sans-serif", "'Encode Sans Expanded', sans-serif", "'Chakra Petch', sans-serif", "'IBM Plex Sans Condensed', sans-serif", "'Maitree', serif", "'Baloo Bhaijaan', cursive", "'Cormorant Infant', serif", "'Saira Stencil One', cursive", "'Chonburi', cursive", "'Barriecito', cursive", "'Bahianita', cursive", "'Athiti', sans-serif", "'Sedgwick Ave', cursive", "'Patrick Hand SC', cursive", "'Srisakdi', cursive", "'Cormorant SC', serif", "'Andika', sans-serif", "'Podkova', serif", "'Bungee Shade', cursive", "'Baloo Da', cursive", "'Spectral SC', serif", "'Baloo Thambi', cursive", "'Baloo Chettan', cursive", "'Cormorant Upright', serif", "'Encode Sans Semi Condensed', sans-serif", "'Charm', cursive", "'Baloo Paaji', cursive", "'K2D', sans-serif", "'Farsan', cursive", "'David Libre', serif", "'Coiny', cursive", "'Baloo Tamma', cursive", "'Manuale', serif", "'Thasadith', sans-serif", "'Vollkorn SC', serif", "'Bungee Hairline', cursive", "'Kodchasan', sans-serif", "'Hepta Slab', serif", "'Cormorant Unicase', serif", "'Crimson Pro', serif", "'Grenze', serif", "'Charmonman', cursive", "'Baloo Tammudu', cursive", "'KoHo', sans-serif", "'Major Mono Display', monospace", "'Fahkwang', sans-serif", "'Bungee Outline', cursive", "'Sedgwick Ave Display', cursive"];
exports.FONT_FACES = FONT_FACES;
var FONT_ITEMS = FONT_FACES.map(function (fontFamily) {
  var fontName = fontFamily.match(/\'([^\']+)\'/)[1];
  return {
    text: fontName,
    value: fontFamily,
    extendStyle: {
      fontFamily: fontFamily
    }
  };
}, {});
exports.FONT_ITEMS = FONT_ITEMS;
var FONT_FACES_BY_NAME = FONT_ITEMS.reduce(function (ac, cr) {
  ac[cr.text] = cr.value;
  return ac;
}, {});
exports.FONT_FACES_BY_NAME = FONT_FACES_BY_NAME;
};

moduleFactories["node_modules/absol-sheet/js/dom/SCore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/dom/SCore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.$ = exports._ = exports.default = void 0;

var _absolAcomp = _interopRequireDefault(require("absol-acomp"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var SCore = new _Dom.default();
SCore.install(_absolAcomp.default.core);
var _default = SCore;
exports.default = _default;
var _ = SCore._;
exports._ = _;
var $ = SCore.$;
exports.$ = $;
};

moduleFactories["node_modules/absol-sheet/js/dom/SComp.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/dom/SComp.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SCore = _interopRequireDefault(require("./SCore"));


//import creator
var _default = {
  _: _SCore.default._,
  $: _SCore.default.$,
  core: _SCore.default
};
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDBase.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDBase.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SCore = require("../../dom/SCore");

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _utils = require("absol-acomp/js/utils");


/***
 *
 * @param {TDRecord} row
 * @param {string} pName
 * @constructor
 */
function TDBase(row, pName) {
  this.elt = (0, _SCore._)('td');
  this.row = row;
  this.pName = pName;
  this.sync = this.renewDescriptor();

  if (this.sync) {
    this.sync = this.sync.then(function () {
      this.attachView();
      this.loadDescriptor();
      this.loadValue();
    }.bind(this));
  } else {
    this.attachView();
    this.loadDescriptor();
    this.loadValue();
  }
}

TDBase.prototype.renewDescriptor = function () {
  var self = this;
  var originDescriptor = this.row.table.propertyDescriptors && this.row.table.propertyDescriptors[this.pName];
  var descriptor = Object.assign({}, originDescriptor || {
    type: 'text'
  });
  var fx = originDescriptor && originDescriptor.__fx__;
  var syncs = [];

  if (fx) {
    Object.keys(fx).reduce(function (ac, key) {
      if (key === 'onchange') {
        ac.onchange = originDescriptor.__fx__.onchange;
      } else if (key === 'switch') {
        Object.assign(descriptor, fx[key].getCase(self.record));
      } else {
        ac[key] = fx[key].invoke(self, self.record);

        if (ac[key] && ac[key].then) {
          ac[key] = ac[key].then(function (result) {
            ac[key] = result;
          });
          syncs.push(ac[key]);
        }
      }

      return ac;
    }, descriptor);
  }

  this.descriptor = descriptor;

  if ('calc' in descriptor) {
    this.elt.addClass('asht-calc');
  } else {
    this.elt.removeClass('asht-calc');
  }

  if (syncs.length > 0) return Promise.all(syncs);
};

TDBase.prototype.implicit = function (value) {
  return value;
};

TDBase.prototype.isEmpty = function () {
  var value = this.value;
  return value === null || value === undefined;
};

TDBase.prototype.makeDefaultValue = function () {
  var descriptor = this.descriptor;
  if ('calc' in descriptor) return;

  if ('defaultValue' in descriptor && (this.value === undefined || this.value === null)) {
    this.value = descriptor.defaultValue;
  }
};
/**
 * @name record
 * @memberOf TDBase
 * @type Object
 */


Object.defineProperty(TDBase.prototype, 'record', {
  get: function () {
    return this.row.record;
  }
});
/**
 * @name table
 * @memberOf TDBase
 * @type TableData
 */

Object.defineProperty(TDBase.prototype, 'table', {
  get: function () {
    return this.row.table;
  }
});
/***
 * @name fragment
 * @memberOf TDBase
 * @type FmFragment|null
 */

Object.defineProperty(TDBase.prototype, 'fragment', {
  get: function () {
    return this.row.table.fragment;
  }
});
/***
 * @name value
 * @memberOf TDBase
 * @type any
 */

Object.defineProperty(TDBase.prototype, 'value', {
  get: function () {
    if ('calc' in this.descriptor) {
      return this.descriptor.calc;
    }

    return this.row.record[this.pName];
  },
  set: function (value) {
    value = this.implicit(value);
    if ((value === undefined || value === null) && (this.row.record[this.pName] === null || this.row.record[this.pName] === undefined)) return;

    if (!this.isEqual(value, this.row.record[this.pName])) {
      this.row.record[this.pName] = value;
      this.loadValue();
      this.execOnChange();
      this.notifyChange();
    }
  }
});

TDBase.prototype.attachView = function () {
  this.$text = (0, _SCore._)({
    text: '?[' + JSON.stringify(this.value) + ']'
  });
  this.elt.addChild(this.$text);
};

TDBase.prototype.execOnChange = function () {
  var record = this.record;
  var newRecord = Object.assign({}, this.record);
  var sync;

  if (this.descriptor.onchange) {
    sync = this.descriptor.onchange.invoke(this, newRecord);
  }

  function update() {
    var needUpdateSize = (0, _utils.keyStringOf)(newRecord, record);
    if (needUpdateSize) _ResizeSystem.default.update();
  }

  if (sync && sync.then) {
    sync.then(update);
  } else update();
};

TDBase.prototype.notifyChange = function () {
  this.row.notifyPropertyChange(this.pName);
};

TDBase.prototype.reload = function () {
  var sync = this.renewDescriptor();

  var update = function () {
    this.loadDescriptor();

    if ('calc' in this.descriptor) {
      var value = this.implicit(this.descriptor.calc);

      if (!this.isEqual(value, this.record[this.pName])) {
        this.execOnChange();
        this.notifyChange();
      }
    }

    this.loadValue();
  }.bind(this);

  if (sync) {
    sync.then(update);
  } else {
    update();
  }

  return sync;
};

TDBase.prototype.isEqual = function (a, b) {
  return (0, _utils.keyStringOf)(a) === (0, _utils.keyStringOf)(b);
};

TDBase.prototype.loadDescriptor = _noop.default;
TDBase.prototype.loadValue = _noop.default;
TDBase.typeClasses = {
  notSupport: TDBase
};
var _default = TDBase;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SCore = require("../../dom/SCore");


/***
 * @extends TDBase
 * @constructor
 */
function TDText() {
  _TDBase.default.apply(this, arguments);
}

_OOP.default.mixClass(TDText, _TDBase.default);

TDText.prototype.implicit = function (value) {
  if (value === undefined || value === null) return null;
  if (typeof value === "object") return JSON.stringify(value);
  if (typeof value !== "string") return '';
  return value + '';
};

TDText.prototype.loadValue = function () {
  this.elt.clearChild();
  var value = this.implicit(this.value) || '';
  this.$lines = value.split(/\r?\n/).reduce(function (ac, line) {
    line = line.replace(/\s\s/g, ' \u00A0');
    ac.push((0, _SCore._)({
      tag: 'span',
      child: {
        text: line
      }
    }));
    ac.push((0, _SCore._)('br'));
    return ac;
  }, []);
  this.elt.addChild(this.$lines);
};

TDText.prototype.isEmpty = function () {
  var value = this.value;
  return !value || value.length === 0;
};

_TDBase.default.typeClasses.text = TDText;
var _default = TDText;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDNumber.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDNumber.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SCore = require("../../dom/SCore");


/***
 * @extends TDBase
 * @constructor
 */
function TDNumber() {
  _TDBase.default.apply(this, arguments);

  this.elt.addClass('asht-type-number');
}

_OOP.default.mixClass(TDNumber, _TDBase.default);

TDNumber.prototype.attachView = function () {
  this.elt.clearChild();
  this.$number = (0, _SCore._)({
    tag: 'span',
    child: {
      text: ''
    }
  });
  this.elt.addChild(this.$number);
};

TDNumber.prototype.loadValue = function () {
  var value = this.implicit(this.value);
  var text = value === null || value === undefined ? '' : value + '';
  var copyFormat, locales;
  var format = this.descriptor.format || {};

  if (!this.descriptor.formater) {
    copyFormat = Object.assign({
      locales: 'vi-VN',
      maximumFractionDigits: 20,
      minimumFractionDigits: 0
    }, format);
    locales = copyFormat.locales;
    delete copyFormat.locales;

    if (!locales) {
      if (copyFormat.currency === 'VND') locales = 'vi-VN';
    }

    this.descriptor.formater = new Intl.NumberFormat(locales, copyFormat);
  }

  if (typeof value === "number" && this.descriptor.formater) text = this.descriptor.formater.format(value);
  this.$number.firstChild.data = text;
};

TDNumber.prototype.implicit = function (value) {
  if (typeof value === 'string') value = parseFloat(value);
  if (typeof value !== 'number') value = undefined;
  if (isNaN(value)) value = undefined;
  return value;
};

TDNumber.prototype.isEmpty = function () {
  var value = this.value;
  return typeof value !== "number" || value === this.descriptor.emptyValue;
};

_TDBase.default.typeClasses.number = TDNumber;
var _default = TDNumber;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDBoolean.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDBoolean.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SCore = require("../../dom/SCore");


/***
 * @extends TDBase
 * @constructor
 */
function TDBoolean() {
  _TDBase.default.apply(this, arguments);

  this.elt.addClass('asht-type-boolean');
}

_OOP.default.mixClass(TDBoolean, _TDBase.default);

TDBoolean.prototype.implicit = function (value) {
  if (['false', '0', 'no'].indexOf(value) >= 0) return false;
  return !!value;
};

TDBoolean.prototype.attachView = function () {
  this.elt.clearChild();
  this.$check = (0, _SCore._)('span.mdi.mdi-check');
  this.elt.addChild(this.$check);
};

TDBoolean.prototype.loadValue = function () {
  var value = this.implicit(this.value);
  if (value) this.$check.removeStyle('display');else this.$check.addStyle('display', 'none');
};

TDBoolean.prototype.isEmpty = function () {
  var value;
  return typeof value !== 'boolean';
};

_TDBase.default.typeClasses.bool = TDBoolean;
_TDBase.default.typeClasses.boolean = TDBoolean;
var _default = TDBoolean;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/util.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/util.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isNone = isNone;
exports.isDifferent = isDifferent;
exports.duplicateData = duplicateData;

var _generator = require("absol/src/JSMaker/generator");

function isNone(o) {
  return o === null || o === undefined;
}

function isDifferent(a, b) {
  return a !== b && (!isNone(a) || !isNone(b));
}

function duplicateData(o) {
  return (0, _generator.replaceDateStringJSVariable)(o);
}
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDEnum.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDEnum.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SCore = require("../../dom/SCore");

var _SelectList = require("absol-acomp/js/SelectList");

var _util = require("../../util");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


/***
 * @extends TDBase
 * @constructor
 */
function TDEnum() {
  _TDBase.default.apply(this, arguments);

  this.elt.addClass('asht-type-enum');
}

_OOP.default.mixClass(TDEnum, _TDBase.default);

TDEnum.prototype.attachView = function () {
  this.elt.clearChild();
  this.$text = (0, _SCore._)({
    tag: 'span',
    child: {
      text: ''
    }
  });
  this.elt.addChild(this.$text);
};

TDEnum.prototype.loadDescriptor = function () {
  var descriptor = this.descriptor;
  descriptor.items = descriptor.items || [];

  if (!descriptor.items.__val2Item__) {
    Object.defineProperty(descriptor.items, '__val2Item__', {
      configurable: true,
      enumerable: false,
      value: descriptor.items.reduce(function (ac, item) {
        ac[item.value] = item;
        return ac;
      }, {})
    });
    var listSize = (0, _SelectList.measureListSize)(descriptor.items);
    Object.defineProperty(descriptor.items, '__width14__', {
      configurable: true,
      enumerable: false,
      value: listSize.width
    });
  }

  this.elt.addStyle('min-width', (descriptor.items.__width14__ + 50) / 14 + 'em');
  var value = this.record[this.pName];
  this.record[this.pName] = this.implicit(value);

  if ((0, _util.isDifferent)(value, this.record[this.pName])) {
    setTimeout(function () {
      if ((0, _util.isDifferent)(value, this.record[this.pName])) {
        this.notifyChange();
      }
    }.bind(this), 0);
  }

  _ResizeSystem.default.update();
};

TDEnum.prototype.implicit = function (value) {
  if (this.row.busy) return value;
  var descriptor = this.descriptor;
  descriptor.items = descriptor.items || [];

  if (value !== null && value !== undefined && !descriptor.items.__val2Item__[value]) {
    return descriptor.items.length > 0 ? descriptor.items[0].value : null;
  } else if (descriptor.items.__val2Item__[value]) return value;

  return null;
};

TDEnum.prototype.isEmpty = function () {
  var value = this.value;
  return value === null || value === undefined || value === this.descriptor.emptyValue;
};

TDEnum.prototype.loadValue = function () {
  var descriptor = this.descriptor;
  var value = this.value;

  if (value !== null && value !== undefined && descriptor.items.__val2Item__[value]) {
    this.$text.firstChild.data = descriptor.items.__val2Item__[value].text;
  } else {
    this.$text.firstChild.data = '';
  }
};

_TDBase.default.typeClasses.enum = TDEnum;
var _default = TDEnum;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDTreeEnum.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDTreeEnum.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SCore = require("../../dom/SCore");

var _SelectList = require("absol-acomp/js/SelectList");

var _treeListToList = _interopRequireDefault(require("absol-acomp/js/list/treeListToList"));

var _TDEnum = _interopRequireDefault(require("./TDEnum"));

var _util = require("../../util");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


/***
 * @extends TDBase
 * @constructor
 */
function TDTreeEnum() {
  _TDBase.default.apply(this, arguments);

  this.elt.addClass('asht-type-tree-enum');
}

_OOP.default.mixClass(TDTreeEnum, _TDBase.default);

TDTreeEnum.prototype.attachView = function () {
  this.elt.clearChild();
  this.$text = (0, _SCore._)({
    tag: 'span',
    child: {
      text: ''
    }
  });
  this.elt.addChild(this.$text);
};

TDTreeEnum.prototype.loadDescriptor = function () {
  var descriptor = this.descriptor;
  descriptor.items = descriptor.items || [];

  if (!descriptor.items.__val2Item__) {
    Object.defineProperty(descriptor.items, '__val2Item__', {
      configurable: true,
      enumerable: false,
      value: descriptor.items.reduce(function visitor(ac, item) {
        ac[item.value] = item;
        if (item.items && item.items.length > 0) item.items.reduce(visitor, ac);
        return ac;
      }, {})
    });
    var listSize = (0, _SelectList.measureListSize)((0, _treeListToList.default)(descriptor.items || []));
    Object.defineProperty(descriptor.items, '__width14__', {
      configurable: true,
      enumerable: false,
      value: listSize.width
    });
  }

  this.elt.addStyle('min-width', (descriptor.items.__width14__ + 50) / 14 + 'em');
  var value = this.record[this.pName];
  this.record[this.pName] = this.implicit(value);

  if ((0, _util.isDifferent)(value, this.record[this.pName])) {
    setTimeout(function () {
      if ((0, _util.isDifferent)(value, this.record[this.pName])) {
        this.notifyChange();
      }
    }.bind(this), 0);
  }

  _ResizeSystem.default.update();
};

TDTreeEnum.prototype.implicit = _TDEnum.default.prototype.implicit;
TDTreeEnum.prototype.isEmpty = _TDEnum.default.prototype.isEmpty;

TDTreeEnum.prototype.loadValue = function () {
  var descriptor = this.descriptor;
  var value = this.value;

  if (value !== null && value !== undefined && descriptor.items.__val2Item__[value]) {
    this.$text.firstChild.data = descriptor.items.__val2Item__[value].text;
  } else {
    this.$text.firstChild.data = '';
  }
};

_TDBase.default.typeClasses.treeenum = TDTreeEnum;
_TDBase.default.typeClasses.TreeEnum = TDTreeEnum;
var _default = TDTreeEnum;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDArrayOfText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDArrayOfText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SCore = require("../../dom/SCore");


/***
 * @extends TDBase
 * @constructor
 */
function TDArrayOfText() {
  _TDBase.default.apply(this, arguments);
}

_OOP.default.mixClass(TDArrayOfText, _TDBase.default);

TDArrayOfText.prototype.attachView = function () {
  this.elt.clearChild();
  this.$number = (0, _SCore._)({
    tag: 'span',
    child: {
      text: ''
    }
  });
  this.elt.addChild(this.$number);
};

TDArrayOfText.prototype.reload = function () {
  var value = this.value;
  value = value === null || value === undefined ? '' : value + '';
  this.$number.firstChild.data = value;
};

_TDBase.default.typeClasses.ArrayOfText = TDArrayOfText;
_TDBase.default.typeClasses['text[]'] = TDArrayOfText;
var _default = TDArrayOfText;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDEnumSet.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDEnumSet.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SCore = require("../../dom/SCore");


/***
 * @extends TDBase
 * @constructor
 */
function TDEnumSet() {
  _TDBase.default.apply(this, arguments);
}

_OOP.default.mixClass(TDEnumSet, _TDBase.default);

TDEnumSet.prototype.attachView = function () {
  this.elt.clearChild();
  this.$text = (0, _SCore._)({
    tag: 'span',
    child: {
      text: ''
    }
  });
  this.elt.addChild(this.$text);
};

TDEnumSet.prototype.loadDescriptor = function () {
  var descriptor = this.descriptor;
  descriptor.items = descriptor.items || [];

  if (!descriptor.items.__val2Item__) {
    Object.defineProperty(descriptor.items, '__val2Item__', {
      configurable: true,
      enumerable: false,
      value: (descriptor.items || []).reduce(function (ac, item) {
        ac[item.value] = item;
        return ac;
      }, {})
    });
  }

  this.record[this.pName] = this.implicit(this.record[this.pName]);
};

TDEnumSet.prototype.implicit = function (value) {
  if (typeof value === 'string') {
    value = value.split(/\s*,\s*/);
  }

  if (!(value instanceof Array)) {
    value = [];
  }

  var descriptor = this.descriptor;
  var items = descriptor.items;
  value = value.filter(function (value) {
    return items.__val2Item__ === undefined || items.__val2Item__[value];
  });
  return value;
};

TDEnumSet.prototype.isEmpty = function () {
  var value = this.value;
  return !value || value.length === 0;
};

TDEnumSet.prototype.loadValue = function () {
  var descriptor = this.descriptor;
  var value = this.implicit(this.value || []);
  var text = value.map(function (iVal) {
    var item = descriptor.items.__val2Item__[iVal];
    if (item) return item.text;
    return '?[' + JSON.stringify(iVal) + ']';
  }).join(', ');
  this.$text.firstChild.data = text;
};

_TDBase.default.typeClasses.EnumSet = TDEnumSet;
_TDBase.default.typeClasses['{enum}'] = TDEnumSet;
var _default = TDEnumSet;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDDate.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDDate.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _datetime = require("absol/src/Time/datetime");

var _SCore = require("../../dom/SCore");


/***
 * @extends TDBase
 * @constructor
 */
function TDDate() {
  _TDBase.default.apply(this, arguments);

  this.elt.addClass('asht-type-date');
}

_OOP.default.mixClass(TDDate, _TDBase.default);

TDDate.prototype.attachView = function () {
  this.elt.clearChild();
  this.$date = (0, _SCore._)({
    tag: 'span',
    child: {
      text: ''
    }
  });
  this.elt.addChild(this.$date);
};

TDDate.prototype.implicit = function (value) {
  var vType = typeof value;
  var dateValue;

  if (vType === "string") {
    dateValue = this._dateFromString(value);
  } else if (vType === 'number') {
    dateValue = new Date(value);
  } else if (value && value.getTime) {
    dateValue = value;
  }

  if (dateValue && isNaN(dateValue.getTime())) dateValue = null;
  return dateValue;
};

TDDate.prototype.loadValue = function () {
  var value = this.value;
  var vType = typeof value;
  var text = '';
  var dateValue = this.implicit(value);

  if (value) {
    if (!dateValue) {
      text = "?[" + JSON.stringify(value) + ']';
    } else if (dateValue) {
      text = (0, _datetime.formatDateTime)(dateValue, (this.descriptor.format || "dd/mm/yyyy").replace(/m/g, 'M'));
    }
  } else {
    text = '';
  }

  this.$date.firstChild.data = text;
};

TDDate.prototype._dateFromString = function (dateString) {
  var format = this.descriptor.format || _datetime.LOCAL_DATE_FORMAT;
  var value;

  try {
    value = (0, _datetime.parseDateString)(dateString, format);
  } catch (error) {
    value = new Date(dateString);
  }

  if (isNaN(value.getTime())) return null;
  return value;
};

TDDate.prototype.isEmpty = function () {
  var value = this.implicit(this.value);
  return !(value instanceof Date);
};

Object.defineProperty(TDDate.prototype, 'dateValue', {
  get: function () {
    var value = this.value;
    var vType = typeof value;
    var dateValue;

    if (vType === 'string') {
      dateValue = this._dateFromString(value);
    } else if (vType === 'number') {
      dateValue = new Date(value);
    }

    if (dateValue && dateValue.getTime() > 0) return dateValue;
    return undefined;
  }
});
_TDBase.default.typeClasses.date = TDDate;
_TDBase.default.typeClasses.Date = TDDate;
var _default = TDDate;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDDateTime.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDDateTime.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _datetime = require("absol/src/Time/datetime");

var _SCore = require("../../dom/SCore");

var _TDDate = _interopRequireDefault(require("./TDDate"));


/***
 * @extends TDBase
 * @constructor
 */
function TDDateTime() {
  _TDBase.default.apply(this, arguments);

  this.elt.addClass('asht-type-date-time');
}

_OOP.default.mixClass(TDDateTime, _TDBase.default);

TDDateTime.prototype.attachView = function () {
  this.elt.clearChild();
  this.$date = (0, _SCore._)({
    tag: 'span',
    child: {
      text: ''
    }
  });
  this.elt.addChild(this.$date);
};

TDDateTime.prototype.implicit = _TDDate.default.prototype.implicit;
TDDateTime.prototype.isEmpty = _TDDate.default.prototype.isEmpty;

TDDateTime.prototype.loadValue = function () {
  var value = this.value;
  var text = '';
  var dateValue = this.implicit(value);

  if (value) {
    if (!dateValue) {
      text = "?[" + JSON.stringify(value) + ']';
    } else if (dateValue) {
      text = (0, _datetime.formatDateTime)(dateValue, this.descriptor.format || 'dd/MM/yyyy hh:mm a');
    }
  } else {
    text = '';
  }

  this.$date.firstChild.data = text;
};

TDDateTime.prototype._dateFromString = function (dateString) {
  var format = this.descriptor.format || _datetime.LOCAL_DATE_FORMAT + 'hh:mm a';

  try {
    return (0, _datetime.parseDateTime)(dateString, format);
  } catch (e) {
    return new Date(dateString);
  }
};

Object.defineProperty(TDDateTime.prototype, 'dateValue', {
  get: function () {
    var value = this.value;
    var vType = typeof value;
    var dateValue;

    if (vType === 'string') {
      dateValue = this._dateFromString(value);
    } else if (vType === 'number') {
      dateValue = new Date(value);
    }

    if (dateValue && dateValue.getTime() > 0) return dateValue;
    return undefined;
  }
});
_TDBase.default.typeClasses.datetime = TDDateTime;
_TDBase.default.typeClasses.DateTime = TDDateTime;
var _default = TDDateTime;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDUniqueString.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDUniqueString.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDNumber = _interopRequireDefault(require("./TDNumber"));

var _SCore = require("../../dom/SCore");

var _TDText = _interopRequireDefault(require("./TDText"));


/***
 * @extends TDNumber
 * @constructor
 */
function TDUniqueString() {
  _TDText.default.apply(this, arguments);

  this.elt.addClass('asht-unique');
}

_OOP.default.mixClass(TDUniqueString, _TDText.default);

TDUniqueString.prototype.implicit = function (value) {
  if (value === undefined || value === null) return null;
  if (typeof value === "object") return JSON.stringify(value);
  if (typeof value !== "string") return '';
  return (value + '').replace(/[\s\r\n]/, '');
};

TDUniqueString.prototype.loadValue = function () {
  this.elt.clearChild();
  var value = this.implicit(this.value) || '';
  this.$lines = [(0, _SCore._)({
    tag: 'span',
    child: {
      text: value
    }
  })];
  this.elt.addChild(this.$lines);
  var isDuplicated = false;
  var records = this.table.records;
  var record;

  if (typeof value === "string") {
    for (var i = 0; i < records.length && !isDuplicated; ++i) {
      record = records[i];
      if (this.record !== record) if (value === record[this.pName]) isDuplicated = true;
    }
  }

  if (isDuplicated) {
    this.elt.addClass('asht-duplicated');
  } else {
    this.elt.removeClass('asht-duplicated');
  }
};

_TDBase.default.typeClasses.UniqueString = TDUniqueString;
_TDBase.default.typeClasses.unique_string = TDUniqueString;
_TDBase.default.typeClasses['unique<string>'] = TDUniqueString;
var _default = TDUniqueString;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDUniqueNumber.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDUniqueNumber.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDNumber = _interopRequireDefault(require("./TDNumber"));


/***
 * @extends TDNumber
 * @constructor
 */
function TDUniqueNumber() {
  _TDNumber.default.apply(this, arguments);

  this.elt.addClass('asht-unique');
}

_OOP.default.mixClass(TDUniqueNumber, _TDNumber.default);

TDUniqueNumber.prototype.loadValue = function () {
  var value = this.implicit(this.value);
  value = value === null || value === undefined ? '' : value + '';
  this.$number.firstChild.data = value;
  var isDuplicated = false;
  var records = this.table.records;
  var record;

  if (typeof value === "number") {
    for (var i = 0; i < records.length && !isDuplicated; ++i) {
      record = records[i];
      if (value === record[this.pName]) isDuplicated = true;
    }
  }

  if (isDuplicated) {
    this.elt.addClass('asht-duplicated');
  } else {
    this.elt.removeClass('asht-duplicated');
  }
};

_TDBase.default.typeClasses.UniqueNumber = TDUniqueNumber;
_TDBase.default.typeClasses.unique_number = TDUniqueNumber;
_TDBase.default.typeClasses['unique<number>'] = TDUniqueNumber;
var _default = TDUniqueNumber;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/types/TDTime.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/types/TDTime.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./TDBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _datetime = require("absol/src/Time/datetime");

var _SCore = require("../../dom/SCore");


/***
 * @extends TDBase
 * @constructor
 */
function TDTime() {
  _TDBase.default.apply(this, arguments);

  this.elt.addClass('asht-type-time');
}

_OOP.default.mixClass(TDTime, _TDBase.default);

TDTime.prototype.attachView = function () {
  this.$text = (0, _SCore._)({
    tag: 'span',
    child: {
      text: ''
    }
  });
  this.elt.addChild(this.$text);
};

TDTime.prototype.loadValue = function () {
  var value = this.implicit(this.value);

  if (typeof value === "number") {
    this.$text.firstChild.data = (0, _datetime.formatDateTime)(new Date((0, _datetime.beginOfDay)(new Date()).getTime() + value), 'hh:mm a');
  } else {
    this.$text.firstChild.data = '';
  }
};

TDTime.prototype.implicit = function (value) {
  if (typeof value === "string") {
    value = new Date(value);
  }

  if (value instanceof Date) {
    value = value.getTime() - (0, _datetime.beginOfDay)(value).getTime();
  }

  if (typeof value === "number") {
    value = Math.floor(value) % _datetime.MILLIS_PER_DAY;
    if (value < 0) value += _datetime.MILLIS_PER_DAY;
  }

  if (isNaN(value)) value = null;
  return value;
};

_TDBase.default.typeClasses.time = TDTime;
var _default = TDTime;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/TDRecord.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/TDRecord.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.TDRecord = TDRecord;
exports.default = void 0;

var _TDBase = _interopRequireDefault(require("./types/TDBase"));

require("./types/TDText");

require("./types/TDNumber");

require("./types/TDBoolean");

require("./types/TDEnum");

require("./types/TDTreeEnum");

require("./types/TDArrayOfText");

require("./types/TDEnumSet");

require("./types/TDDate");

require("./types/TDDateTime");

require("./types/TDUniqueString");

require("./types/TDUniqueNumber");

require("./types/TDTime");

var _SCore = require("../dom/SCore");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


/***
 *
 * @param {TableData} table
 * @param {Object} record
 * @param {number} idx
 * @constructor
 */

/***
 * @extends EventEmitter
 * @param {TableData} table
 * @param {Object} record
 * @param {number|"*"} idx
 * @constructor
 */
function TDRecord(table, record, idx) {
  _EventEmitter.default.call(this);

  this.busy = false;
  this.id = (0, _stringGenerate.randomIdent)(24);
  this.changedPNames = [];
  this.table = table;
  this.elt = (0, _SCore._)('tr');
  this.$idx = (0, _SCore._)('td');
  this.elt.addChild(this.$idx);
  this.table.domSignal.on(this.id + '_property_change', this.ev_propertyChange.bind(this));
  /***
   *
   * @type {TDBase[]}
   */

  this.properties = [];
  this.propertyByName = {};
  this.idx = idx;
  this.record = record;
}

_OOP.default.mixClass(TDRecord, _EventEmitter.default);

Object.defineProperty(TDRecord.prototype, 'record', {
  set: function (value) {
    this.busy = true;
    this._record = value;
    this.loadCells();
    this.busy = false;
  },
  get: function () {
    return this._record;
  }
});
Object.defineProperty(TDRecord.prototype, 'computedRecord', {
  get: function () {
    var descriptors = this.propertyDescriptors;
    var pNames = this.propertyNames;
    var self = this;
    return pNames.reduce((ac, pName) => {
      var descriptor = descriptors[pName];
      Object.defineProperty(ac, pName, {
        enumerable: true,
        configurable: true,
        get: function () {
          if (descriptor.__fx__ && descriptor.__fx__.calc) {}
        },
        set: function () {}
      });
      return ac;
    }, {});
  }
});
Object.defineProperty(TDRecord.prototype, 'fragment', {
  get: function () {
    return this.table.fragment;
  }
});
Object.defineProperty(TDRecord.prototype, 'propertyNames', {
  get: function () {
    return this.table.propertyNames;
  }
});
Object.defineProperty(TDRecord.prototype, 'propertyDescriptors', {
  get: function () {
    return this.table.propertyDescriptors;
  }
});
Object.defineProperty(TDRecord.prototype, 'idx', {
  set: function (value) {
    this._idx = value;

    if (value === "*") {
      this.$idx.clearChild().addChild((0, _SCore._)({
        text: '*'
      }));
      this.elt.addClass('asht-new-row');
    } else {
      this.$idx.clearChild().addChild((0, _SCore._)({
        text: value + 1 + ''
      }));
      this.elt.removeClass('asht-new-row');
    }
  },
  get: function () {
    return this._idx;
  }
}); //for name mapping

Object.defineProperty(TDRecord.prototype, 'cells', {
  get: function () {
    return this.properties;
  }
});

TDRecord.prototype.loadCells = function () {
  var tdRow = this;
  var propertyNames = this.propertyNames;
  var propertyDescriptors = this.propertyDescriptors;
  this.properties.forEach(function (cell) {
    cell.elt.remove();
  });
  this.propertyByName = {};
  this.properties = propertyNames.map(function (pName) {
    var descriptor = propertyDescriptors[pName] || {
      type: 'notSupport'
    };
    var td = new (_TDBase.default.typeClasses[descriptor.type] || _TDBase.default.typeClasses.notSupport)(tdRow, pName);
    tdRow.propertyByName[pName] = td;
    return td;
  });
  var cellEltList = this.properties.map(function (cell) {
    return cell.elt;
  });
  this.elt.addChild(cellEltList);
};

TDRecord.prototype.notifyPropertyChange = function (pName) {
  if (this.changedPNames.indexOf(pName) < 0) {
    this.changedPNames.push(pName);
    this.table.domSignal.emit(this.id + '_property_change');
    this.emit('property_change', {
      target: this,
      record: this.record,
      pName: pName
    }, this);
  }
};

TDRecord.prototype.getIncompleteCells = function () {
  return this.properties.filter(function (cell) {
    return !!(cell.descriptor && (cell.descriptor.required || cell.descriptor.require) && cell.isEmpty());
  });
};

TDRecord.prototype.makeDefaultValues = function () {
  this.properties.forEach(p => p.makeDefaultValue());
};

TDRecord.prototype.ev_propertyChange = function () {
  var changedPNames = this.changedPNames.splice(0, this.changedPNames.length);
  var self = this;
  var needUpdatePNames = this.propertyNames.filter(function (name) {
    if (changedPNames.indexOf(name) >= 0) return true;
    var dp = self.table.propertyDescriptors[name].__dependencies__;
    return changedPNames.some(function (cN) {
      return !!dp[cN];
    });
  });
  var sync = needUpdatePNames.map(function (name) {
    return self.propertyByName[name].reload();
  }).filter(function (p) {
    return !!p && p.then;
  });

  if (sync.length > 0) {
    Promise.all(sync).then(_ResizeSystem.default.update.bind(_ResizeSystem.default));
  } else {
    _ResizeSystem.default.update();
  }
};

var _default = TDRecord;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fx/ExcelFx.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fx/ExcelFx.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.DATE = DATE;
exports.YEAR = YEAR;
exports.MONTH = MONTH;
exports.DAY = DAY;
exports.DAYS = DAYS;
exports.TODAY = TODAY;
exports.NOW = NOW;
exports.DATEDIF = DATEDIF;
exports.MAX = MAX;
exports.MIN = MIN;
exports.SUM = SUM;
exports.IF = IF;
exports.MATCH = MATCH;
exports.CHOOSE = CHOOSE;
exports.CTAN = exports.TAN = exports.COS = exports.SIN = void 0;

var _datetime = require("absol/src/Time/datetime");

function DATE(year, month, day) {
  var tYear = typeof year;
  var tMonth = typeof month;
  var tDay = typeof day;
  if (tYear !== "number" && tMonth !== 'number' && tDay !== "number") return undefined;
  if (tYear !== 'number') tYear = new Date().getFullYear();
  if (typeof month !== 'number') month = 1;
  if (typeof day !== 'number') day = 1;
  month = Math.max(1, Math.min(12, month << 0));
  var dim = (0, _datetime.daysInMonth)(year, month - 1);
  day = Math.max(1, Math.min(dim, day << 0));
  return new Date(year, month - 1, day);
}

function YEAR(date) {
  if (typeof date === "number" || typeof date === "string") date = new Date(date);
  if (date && date.getFullYear) return date.getFullYear();
  return undefined;
}

function MONTH(date) {
  if (typeof date === "number" || typeof date === "string") date = new Date(date);
  if (date && date.getMonth) return date.getMonth() + 1;
  return undefined;
}

function DAY(date) {
  if (typeof date === "number" || typeof date === "string") date = new Date(date);
  if (date && date.getDate) return date.getDate();
  return undefined;
}

function DAYS(end_date, start_date) {//todo
}

function TODAY() {
  return (0, _datetime.beginOfDay)(new Date());
}

function NOW() {
  return new Date();
}

function DATEDIF(d1, d2, df) {
  if (!d1 || !d2) {
    return undefined;
  }

  if (typeof d1 === "number" || typeof d1 === "string") d1 = new Date(d1);
  if (typeof d2 === "number" || typeof d2 === "string") d2 = new Date(d2);
  if (!d1.getFullYear || isNaN(d1.getFullYear())) return undefined;
  if (!d2.getFullYear || isNaN(d2.getFullYear())) return undefined;
  df = df || 'D';

  switch (df) {
    case 'D':
      return (0, _datetime.compareDate)(d2, d1);

    case 'M':
      return (0, _datetime.compareMonth)(d2, d1);

    case 'Y':
      return d2.getFullYear() - d1.getFullYear();

    default:
      return undefined;
  }
}

function MAX(args) {
  var res;

  if (arguments.length === 0) {
    res = undefined;
  } else if (arguments.length === 1) {
    if (typeof args === "number") {
      res = args;
    } else if (args instanceof Array) {
      res = args.reduce((ac, x) => Math.max(ac, x), -Infinity);
      res = res === -Infinity ? undefined : res;
    }
  }

  return res;
}

function MIN(args) {
  var res;

  if (arguments.length === 0) {
    res = undefined;
  } else if (arguments.length === 1) {
    if (typeof args === "number") {
      res = args;
    } else if (args instanceof Array) {
      res = args.reduce((ac, x) => Math.min(ac, x), Infinity);
      res = res === Infinity ? undefined : res;
    }
  }

  return res;
}

var SIN = Math.sin.bind(Math);
exports.SIN = SIN;
var COS = Math.cos.bind(Math);
exports.COS = COS;
var TAN = Math.tan.bind(Math);
exports.TAN = TAN;

var CTAN = function (x) {
  return 1 / TAN(x);
};

exports.CTAN = CTAN;

function SUM(args) {
  var res;

  if (arguments.length === 0) {
    res = 0;
  } else if (arguments.length === 1) {
    if (typeof args === "number") {
      res = args;
    } else if (args instanceof Array) {
      res = args.reduce((ac, x) => {
        return ac + x;
      }, 0);
    }
  } else {
    res = Array.prototype.reduce.call(arguments, (ac, x) => SUM(x), 0);
  }

  if (isNaN(res)) res = undefined;
  return res;
}

function IF(condition, ifTrue, ifFalse) {
  return condition ? ifTrue : ifFalse;
}

function MATCH(lookup_value, lookup_array, match_type) {
  if (!(lookup_array instanceof Array)) return undefined; //todo
}

function CHOOSE(index_num, args) {
  if (arguments.length < 2) return undefined;

  if (arguments.length === 2) {
    if (args instanceof Array) {
      return args[index_num - 1];
    } else return arguments[index_num];
  }

  return arguments[index_num];
}
};

moduleFactories["node_modules/absol-sheet/js/fx/TSFunction.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fx/TSFunction.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var ExcelFx = _interopRequireWildcard(require("./ExcelFx"));



var types = babel.types;

function TSFunction(propertyNames, body) {
  this.propertyNames = propertyNames;
  this.body = body;
  this.dependents = [];
  this.ast = null;
  this.func = null;

  this._compile();
}

TSFunction.prototype.localConstants = {};
Object.assign(TSFunction.prototype.localConstants, ExcelFx);

TSFunction.prototype._isAsync = function (jsCode) {
  if (!window.babel) return false;
  var scriptCode = 'async function fx(){\n' + jsCode + '\n}';
  var result = false;
  var ast = babel.parseSync(scriptCode, {});
  babel.traverse(ast, {
    AwaitExpression: function () {
      result = true;
    }
  });
  return result;
};

TSFunction.prototype._makeConstCode = function (localConstants) {
  return Object.keys(localConstants).map(function (key) {
    return 'const ' + key + ' = localConstants[' + JSON.stringify(key) + '];';
  }).join('\n') + '\n';
};

TSFunction.prototype._compile = function () {
  var scriptCode;

  if (this.body.startsWith('=')) {
    scriptCode = 'RET' + this.body;
  } else scriptCode = this.body;

  if (!window.babel) return;
  var variableDict = this.propertyNames.reduce(function (ac, cr) {
    ac[cr] = true;
    return ac;
  }, {});

  try {
    var isAsync = this._isAsync(scriptCode);

    scriptCode = (isAsync ? 'async ' : '') + 'function fx(RC){\n' + 'var RET;\n' + scriptCode + '\nreturn RET;' + '\n}';
    this.ast = babel.parseSync(scriptCode, {});
    var variables = {};
    babel.traverse(this.ast, {
      Program: function (path) {},
      Identifier: function (path) {
        var node = path.node;
        var name = node.name;
        if (path.container.type === "MemberExpression" && path.container.object !== node) return;
        var newNode;

        if (variableDict[name]) {
          variables[name] = true;
          newNode = types.memberExpression(types.identifier('RC'), types.identifier(name));
          newNode.ignore = true;
          path.replaceWith(newNode);
        }
      },
      MemberExpression: function (path) {
        if (path.node.ignore) path.skip();
      }
    });
    this.dependents = Object.keys(variables);
    this.jsCode = 'module.exports = ' + babel.generate(this.ast).code;
    var options = {
      presets: [babel.presetEnv]
    };
    this.transformedCode = babel.transform(this.jsCode, options).code;
    var mdl = {};
    new Function('module', 'regeneratorRuntime', 'localConstants', this._makeConstCode(this.localConstants) + this.transformedCode)(mdl, babel.regeneratorRuntime, this.localConstants);
    this.func = mdl.exports;
  } catch (err) {
    setTimeout(function () {
      throw err;
    }, 0);
  }
};

TSFunction.prototype.invoke = function (_this, record) {
  try {
    return this.func.call(_this, record);
  } catch (err) {
    setTimeout(function () {
      if (window['ABSOL_DEBUG']) throw err;
    }, 0);
    return undefined;
  }
};

var _default = TSFunction;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fx/TSSwitch.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fx/TSSwitch.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function TSSwitch(cases) {
  this.cases = cases;
  this.defaultCase = this._findDefaultCase(cases);
  this.dependents = Object.keys(this.cases.reduce(function (ac, cr) {
    if (typeof cr.case === 'object') {
      Object.assign(ac, cr);
    }

    return ac;
  }, {}));
}

TSSwitch.prototype._findDefaultCase = function (cases) {
  for (var i = 0; i < cases.length; ++i) {
    if (this.cases[i].case === 'DEFAULT') return this.cases[i];
  }

  return null;
};

TSSwitch.prototype.getCase = function (caseObj) {
  var cCase;
  var cases = this.cases;

  for (var i = 0; i < cases.length; ++i) {
    cCase = cases[i];
    if (this._test(cCase, caseObj)) return cCase;
  }

  return this.defaultCase;
};

TSSwitch.prototype._test = function (caseRq, case2Test) {
  if (case2Test === 'DEFAULT') return false;
  return Object.keys(caseRq).every(function (key) {
    return caseRq[key] === case2Test[key];
  });
};

var _default = TSSwitch;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/viewer/TableData.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/viewer/TableData.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SComp = _interopRequireDefault(require("../dom/SComp"));

var _TDRecord = _interopRequireDefault(require("./TDRecord"));

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

require("../../css/tabledata.css");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _TSFunction = _interopRequireDefault(require("../fx/TSFunction"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _TSSwitch = _interopRequireDefault(require("../fx/TSSwitch"));


var _ = _SComp.default._;
var $ = _SComp.default.$;
/***
 * /**
 * @extends EventEmitter
 * @param {TableEditor} editor
 * @param {object=} opt
 * @constructor
 */

function TableData(editor, opt) {
  this.editor = editor;
  this.opt = opt || {};

  _EventEmitter.default.call(this);

  this.propertyNames = [];
  this.propertyDescriptors = {};
  this.records = [];
  this.bodyRow = [];
  this.headCells = [];
  this.newRow = null;
  /***
   *
   * @type {Attributes}
   */

  this.config = new _Attributes.default(this);
  this.config.loadAttributeHandlers(this.configHandlers);

  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }
}

_OOP.default.mixClass(TableData, _EventEmitter.default);

TableData.prototype.defaultConfig = {
  rowHeight: 21
};
TableData.prototype.configHandlers = {};
TableData.prototype.configHandlers.rowHeight = {
  set: function (value) {
    if (!(value > 0 && value < 1024)) {
      value = this.defaultConfig.rowHeight;
    }

    this.$view.addStyle('--row-height', value + 'px');
    return value;
  }
};

TableData.prototype.export = function () {
  return {
    propertyNames: this.propertyNames,
    propertyDescriptors: this.propertyDescriptors,
    records: this.records,
    config: this.config.export()
  };
};

TableData.prototype.import = function (data) {
  this.propertyDescriptors = data.propertyDescriptors;
  this.propertyNames = data.propertyNames;
  this.records = data.records;
  Object.assign(this.config, this.defaultConfig, data.config || {});

  this._computeData();

  this.reload();
  this.emitResizeEvent();
};

TableData.prototype._computeData = function () {
  var descriptors = this.propertyDescriptors;
  var descriptor;
  var self = this;
  var propertyNames = this.propertyNames;
  propertyNames.forEach(name => {
    descriptor = descriptors[name];
    if (!descriptor) return;

    self._computeDescriptor(descriptor, propertyNames);

    var dependencies = {};
    var fx = descriptor.__fx__;
    Object.keys(fx).reduce(function (ac, key) {
      if (fx[key].dependents) {
        fx[key].dependents.reduce(function (ac1, pName) {
          ac1[pName] = true;
          return ac1;
        }, ac);
      } // ac[];


      return ac;
    }, dependencies);
    delete dependencies[name];
    Object.defineProperty(descriptor, '__dependencies__', {
      configurable: true,
      enumerable: false,
      value: dependencies
    });
  });
};

TableData.prototype._computeDescriptor = function (descriptor, propertyNames) {
  Object.defineProperty(descriptor, '__fx__', {
    configurable: true,
    enumerable: false,
    value: {}
  });
  Object.keys(descriptor).reduce(function (ac, key) {
    var val = descriptor[key];

    if (typeof val === 'string') {
      if (val.startsWith('=')) {
        descriptor.__fx__[key] = new _TSFunction.default(propertyNames, val);
      } else if (val.startsWith('{{') && val.endsWith('}}')) {
        descriptor.__fx__[key] = new _TSFunction.default(propertyNames, val.substring(2, val.length - 2));
      } else if (key === 'onchange') {
        descriptor.__fx__[key] = new _TSFunction.default(propertyNames, val);
      }
    } else if (key === 'switch') {
      descriptor.__fx__['switch'] = new _TSSwitch.default(descriptor['switch']);
    }

    return ac;
  }, descriptor.__fx__);
};

TableData.prototype.reload = function () {
  this.loadHeader();
  this.loadBody();
};

TableData.prototype.loadHeader = function () {
  var thisTable = this;
  this.$headRow.clearChild();
  this.$headRow.addChild(this.$rootCell);
  this.colIndexOfProperty = this.propertyNames.reduce(function (ac, name, i) {
    ac[name] = i + 1;
    return ac;
  }, {});
  this.headCells = this.propertyNames.map(function (name, i) {
    var cell = _({
      tag: 'td',
      child: {
        tag: 'span',
        child: {
          text: thisTable.propertyDescriptors && thisTable.propertyDescriptors[name] && thisTable.propertyDescriptors[name].text || name
        }
      }
    });

    thisTable.$headRow.addChild(cell);
    return {
      elt: cell,
      index: i,
      name: name,
      descriptor: thisTable.propertyDescriptors && thisTable.propertyDescriptors[name] || {
        type: 'text'
      }
    };
  });
};

TableData.prototype.loadBody = function () {
  var thisTable = this;
  this.$tbody.clearChild();
  this.bodyRow = this.records.map(function (record, idx) {
    return new _TDRecord.default(thisTable, record, idx);
  });
  var rowEltList = this.bodyRow.map(function (row) {
    return row.elt;
  });
  this.$tbody.addChild(rowEltList);
  this.newRow = new _TDRecord.default(this, {}, '*');
  this.newRow.once('property_change', this.ev_newRowPropertyChange);
  this.$tbody.addChild(this.newRow.elt);
};

TableData.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = _({
    tag: 'table',
    class: 'asht-table-data',
    child: [{
      tag: 'thead',
      child: 'tr'
    }, {
      tag: 'tbody',
      child: [{}]
    }]
  });
  this.$thead = $('thead', this.$view);
  this.$headRow = $('tr', this.$thead);
  this.$tbody = $('tbody', this.$view);
  this.$rootCell = _('td.asht-table-data-root-cell');
  this.$domSignal = _('attachhook').addTo(this.$rootCell);
  this.domSignal = new _DomSignal.default(this.$domSignal).on('requestEmitResizeEvent', function () {
    window.dispatchEvent(new Event('resize'));
  });
  return this.$view;
};

TableData.prototype.emitResizeEvent = function () {
  window.dispatchEvent(new Event('resize'));
  this.domSignal.emit('requestEmitResizeEvent');
};
/***
 *
 * @param {Object=} newRecord
 */


TableData.prototype.flushNewRow = function (newRecord) {
  this.newRow.idx = this.records.length;
  this.records.push(this.newRow.record);
  this.bodyRow.push(this.newRow);
  this.newRow.makeDefaultValues();
  this.newRow = new _TDRecord.default(this, newRecord || {}, "*");
  this.newRow.once('property_change', this.ev_newRowPropertyChange);
  this.$tbody.addChild(this.newRow.elt);
  this.emitResizeEvent();
};
/**
 * @param {Number} y
 */


TableData.prototype.findRowByClientY = function (y) {
  var length = this.bodyRow.length + 1;
  var start = 0;
  var mid;
  var row;
  var rowY;
  var position;

  while (length > 0) {
    mid = start + (length >> 1);
    row = this.bodyRow[mid] || this.newRow;
    position = row.elt.getBoundingClientRect();
    rowY = position.top;

    if (y < rowY) {
      length = mid - start;
    } else if (y > rowY + position.height) {
      length = start + length - mid - 1;
      start = mid + 1;
    } else {
      return row;
    }
  }

  return null;
};

TableData.prototype.findFirsIncompleteCell = function () {
  var cells;

  for (var i = 0; i < this.bodyRow.length; ++i) {
    cells = this.bodyRow[i].getIncompleteCells();

    if (cells.length > 0) {
      return cells[0];
    }
  }
};
/**
 * @param {Number} x
 */


TableData.prototype.findColByClientX = function (x) {
  var length = this.headCells.length;
  var start = 0;
  var mid;
  var cell;
  var rowX;
  var position;

  while (length > 0) {
    mid = start + (length >> 1);
    cell = this.headCells[mid];
    position = cell.elt.getBoundingClientRect();
    rowX = position.left;

    if (x < rowX) {
      length = mid - start;
    } else if (x > rowX + position.width) {
      length = start + length - mid - 1;
      start = mid + 1;
    } else {
      return cell;
    }
  }

  return null;
};

TableData.prototype.findColByIndex = function (index) {
  return this.headCells[index] || null;
};

TableData.prototype.findColByName = function (name) {
  return this.headCells[this.propertyNames.indexOf(name)] || null;
};

TableData.prototype.findRowByIndex = function (index) {
  if (index === '*') return this.newRow;
  return this.bodyRow[index] || null;
};

TableData.prototype.findIndexOfCol = function (col) {
  return this.headCells.indexOf(col);
};

TableData.prototype.ev_newRowPropertyChange = function (event) {
  this.emit('new_row_property_change', Object.assign({}, event, {
    type: 'new_row_property_change',
    target: this,
    tdRecord: event.target
  }), this);
};

Object.defineProperty(TableData.prototype, 'fragment', {
  get: function () {
    return this.editor && this.editor.fragment || this.opt.fragment || null;
  }
});
var _default = TableData;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDEBase.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDEBase.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SCore = require("../../dom/SCore");

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


var STATE_STANDBY = 0;
var STATE_RUNNING = 1;
var STATE_STOP = 2;
var STATE_DESTROYED = 3;
/***
 * @extends EventEmitter
 * @param {TableEditor} tableEditor
 * @param {TDBase} cell
 * @constructor
 */

function TDEBase(tableEditor, cell) {
  _EventEmitter.default.call(this);

  this.state = STATE_STANDBY;
  this.tableEditor = tableEditor;
  this.cell = cell;
  this.col = cell.table.findColByName(cell.pName);
  this.$editingbox = tableEditor.$editingbox;

  this._bindEvent();

  this.$input = null;
  this.prepareInput();
  this.reload();
}

_OOP.default.mixClass(TDEBase, _EventEmitter.default);

TDEBase.prototype.onStart = _noop.default;
TDEBase.prototype.onStop = _noop.default;
TDEBase.prototype.onDestroy = _noop.default;

TDEBase.prototype.start = function () {
  if (this.state === STATE_STANDBY) {
    this.state = STATE_RUNNING;
    this.onStart();
  } else if (this.state === STATE_DESTROYED) {
    console.error(this, "Editor destroyed!");
  }
};

TDEBase.prototype.stop = function () {
  if (this.state === STATE_RUNNING) {
    this.state = STATE_STOP;
    this.onStop();
  }
};

TDEBase.prototype.destroy = function () {
  if (this.state === STATE_RUNNING) {
    this.stop();
  }

  if (this.state !== STATE_DESTROYED) {
    this.onDestroy();
    this.state = STATE_DESTROYED;
  }
};
/***
 *
 * @protected
 */


TDEBase.prototype.prepareInput = function () {};

TDEBase.prototype.reload = function () {};

TDEBase.prototype.startEditing = function () {
  this.state = "EDITING";
};
/**
 *
 * @protected
 */


TDEBase.prototype._bindEvent = function () {
  for (var fName in this) {
    if (typeof this[fName] === "function" && fName.startsWith('ev_')) {
      this[fName] = this[fName].bind(this);
    }
  }
};

TDEBase.prototype.editCellAbove = function () {
  var rowIdx = this.cell.row.idx;
  var prevRow = this.cell.table.findRowByIndex(rowIdx - 1);

  if (prevRow) {
    this.tableEditor.editCell(prevRow, this.col);
  }
};

TDEBase.prototype.editCellBellow = function () {
  var rowIdx = this.cell.row.idx;
  var nextRow = this.cell.table.findRowByIndex(rowIdx + 1);

  if (nextRow) {
    this.finish();
    this.tableEditor.editCell(nextRow, this.col);
  }
};

TDEBase.prototype.editCellLeft = function () {
  var colIdx = this.cell.table.findIndexOfCol(this.col);
  var prevCol = this.cell.table.findColByIndex(colIdx - 1);

  if (prevCol) {
    this.finish();
    this.tableEditor.editCell(this.row, prevCol);
  }
};

TDEBase.prototype.editCellRight = function () {
  var colIdx = this.cell.table.findIndexOfCol(this.col);
  var nextCol = this.cell.table.findColByIndex(colIdx + 1);

  if (nextCol) {
    this.finish();
    this.tableEditor.editCell(this.row, nextCol);
  }
};

TDEBase.prototype.editCellNext = function () {
  var colIdx = this.cell.table.findIndexOfCol(this.col);
  var nextCol = this.cell.table.findColByIndex(colIdx + 1);

  if (nextCol) {
    this.finish();
    this.tableEditor.editCell(this.row, nextCol);
  } else {
    var rowIdx = this.cell.row.idx;
    var nextRow = this.cell.table.findRowByIndex(rowIdx + 1);
    var firstCol = this.cell.table.findColByIndex(0);

    if (nextRow && firstCol) {
      this.finish();
      this.tableEditor.editCell(nextRow, firstCol);
    }
  }
};

TDEBase.prototype.finish = function () {
  if (this.state !== "FINISHED") {
    this.state = "FINISHED";
    this.emit('finish', {
      type: 'finish',
      target: this
    });
  }
};

TDEBase.prototype.flushValue = function (value) {
  var prev = this.cell.value;

  if (value !== prev) {
    this.cell.value = value;
    this.tableEditor.emit('change', {
      target: this.tableEditor,
      cell: this.cell,
      cellEditor: this
    }, this.tableEditor);
  }
};

Object.defineProperty(TDEBase.prototype, 'row', {
  get: function () {
    return this.cell.row;
  }
});
TDEBase.typeClasses = {};
var _default = TDEBase;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDEText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDEText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _SCore = require("../../dom/SCore");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


/***
 * @extends TDEBase
 * @param {TableEditor} tableEditor
 * @param {TDEBase} cell
 * @constructor
 */
function TDEText(tableEditor, cell) {
  _TDEBase.default.call(this, tableEditor, cell);
}

_OOP.default.mixClass(TDEText, _TDEBase.default);

TDEText.prototype.prepareInput = function () {
  /***
   * @type {PreInput}
   */
  this.$input = (0, _SCore._)({
    tag: _PreInput.default.tag,
    class: 'asht-cell-editor-input',
    on: {
      change: this.ev_inputChange,
      keydown: this.ev_keydown
    }
  });
  this.$editingbox.clearChild().addChild(this.$input);

  this._loadCellStyle();

  this.$input.addStyle(this._cellStyle);
};

TDEText.prototype._loadCellStyle = function () {
  var cellElt = this.cell.elt;
  this._cellStyle = {
    'font-size': cellElt.getComputedStyleValue('font-size'),
    'font-family': cellElt.getComputedStyleValue('font-family'),
    'font-style': cellElt.getComputedStyleValue('font-style'),
    'line-height': '20px',
    'padding-left': cellElt.getComputedStyleValue('padding-left'),
    'padding-right': cellElt.getComputedStyleValue('padding-right'),
    'padding-top': cellElt.getComputedStyleValue('padding-top'),
    'padding-bottom': cellElt.getComputedStyleValue('padding-bottom'),
    'text-align': cellElt.getComputedStyleValue('text-align')
  };
};

TDEText.prototype.onStart = function () {// console.log('start');
};

TDEText.prototype.reload = function () {
  var descriptor = this.cell.descriptor;
  this.$input.value = this.cell.value;
  this.$input.disabled = descriptor.readOnly || 'calc' in descriptor;
};

TDEText.prototype.onStart = function () {
  setTimeout(function () {
    this.$input.focus();
    var text = this.$input.value;
    this.$input.applyData(text, {
      start: text.length,
      end: text.length
    });
  }.bind(this), 5);
};
/***
 *
 * @param {KeyboardEvent} event
 */


TDEText.prototype.ev_keydown = function (event) {
  if (event.key === "Enter" || event.key === "Tab") {
    var text = this.$input.value;

    if (event.altKey && event.key === "Enter") {
      var pos = this.$input.getSelectPosition();
      var newText = text.substr(0, pos.start) + '\n' + text.substr(pos.end);
      this.$input.applyData(newText, pos.start + 1);
      this.$input.waitToCommit(newText, pos.start + 1);
    } else {
      this.flushValue(text);
      this.tableEditor.updateFixedTableEltPosition();
      this.editCellNext();
    }

    event.preventDefault();
  }
};

TDEText.prototype.ev_inputChange = function () {
  this.flushValue(this.$input.value);

  _ResizeSystem.default.update();
};

_TDEBase.default.typeClasses.string = TDEText;
_TDEBase.default.typeClasses.text = TDEText;
_TDEBase.default.typeClasses.unique_string = TDEText;
_TDEBase.default.typeClasses.UniqueString = TDEText;
_TDEBase.default.typeClasses['unique<string>'] = TDEText;
var _default = TDEText;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDENumber.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDENumber.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _TDEText = _interopRequireDefault(require("./TDEText"));

var _SCore = require("../../dom/SCore");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


/***
 * @extends TDEText
 * @param {TableEditor} tableEditor
 * @param {TDEBase} cell
 * @constructor
 */
function TDENumber(tableEditor, cell) {
  _TDEText.default.call(this, tableEditor, cell);
}

_OOP.default.mixClass(TDENumber, _TDEText.default);

TDENumber.prototype.prepareInput = function () {
  /***
   * @type {PreInput}
   */
  this.$input = (0, _SCore._)({
    tag: 'numberinput',
    class: 'asht-cell-editor-input',
    on: {
      change: this.ev_inputChange,
      keydown: this.ev_keydown
    }
  });
  this.$editingbox.clearChild().addChild(this.$input);

  this._loadCellStyle();

  this.$input.addStyle(this._cellStyle);
};

TDENumber.prototype._loadCellStyle = function () {
  var cellElt = this.cell.elt;
  this._cellStyle = {
    'font-size': cellElt.getComputedStyleValue('font-size'),
    'font-family': cellElt.getComputedStyleValue('font-family'),
    'font-style': cellElt.getComputedStyleValue('font-style'),
    'line-height': cellElt.getComputedStyleValue('line-height'),
    'padding-left': cellElt.getComputedStyleValue('padding-left'),
    'padding-right': cellElt.getComputedStyleValue('padding-right'),
    'padding-top': cellElt.getComputedStyleValue('padding-top'),
    'padding-bottom': cellElt.getComputedStyleValue('padding-bottom'),
    'text-align': cellElt.getComputedStyleValue('text-align')
  };
};

TDENumber.prototype.reload = function () {
  var descriptor = this.cell.descriptor;
  if (descriptor.step) this.$input.step = descriptor.step;
  var min = -Infinity;
  var max = Infinity;

  if (!isNaN(descriptor.min) && isFinite(descriptor.min)) {
    min = descriptor.min;
  }

  if (!isNaN(descriptor.max) && isFinite(descriptor.max)) {
    max = descriptor.max;
  }

  var value = this.cell.value;
  if (typeof value !== "number" || isNaN(value)) value = '';
  this.$input.value = value;
  this.$input.min = min;
  this.$input.max = max;
  this.$input.disabled = descriptor.readOnly || 'calc' in descriptor;
};

TDENumber.prototype.onStart = function () {
  setTimeout(function () {
    this.$input.$input.focus();
    var value = this.cell.value;
    if (typeof value !== "number" || isNaN(value)) value = '';
    this.$input.value = value;
  }.bind(this), 5);
};

TDENumber.prototype.ev_keydown = function (event) {
  if (event.key === "Enter" || event.key === "Tab") {
    var text = this.$input.value;
    var min = -Infinity;
    var max = Infinity;
    var descriptor = this.cell.descriptor;

    if (!isNaN(descriptor.min) && isFinite(descriptor.min)) {
      min = descriptor.min;
    }

    if (!isNaN(descriptor.max) && isFinite(descriptor.max)) {
      max = descriptor.max;
    }

    var value = parseFloat(text);

    if (!isNaN(value)) {
      value = Math.max(min, Math.min(max, value));
      this.flushValue(value);
    }

    this.tableEditor.updateFixedTableEltPosition();
    event.preventDefault();
    this.editCellNext();
  }
};

TDENumber.prototype.ev_inputChange = function () {
  var text = this.$input.value;
  var min = -Infinity;
  var max = Infinity;
  var descriptor = this.cell.descriptor;

  if (!isNaN(descriptor.min) && isFinite(descriptor.min)) {
    min = descriptor.min;
  }

  if (!isNaN(descriptor.max) && isFinite(descriptor.max)) {
    max = descriptor.max;
  }

  var value = parseFloat(text);

  if (!isNaN(value)) {
    value = Math.max(min, Math.min(max, value));
    this.flushValue(value);
  }

  _ResizeSystem.default.update();
};

_TDEBase.default.typeClasses.number = TDENumber;
_TDEBase.default.typeClasses.Number = TDENumber;
_TDEBase.default.typeClasses.UniqueNumber = TDENumber;
_TDEBase.default.typeClasses.unique_number = TDENumber;
_TDEBase.default.typeClasses['unique<number>'] = TDENumber;
var _default = TDENumber;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDEDate.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDEDate.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _SCore = require("../../dom/SCore");

var _TDEText = _interopRequireDefault(require("./TDEText"));

var _datetime = require("absol/src/Time/datetime");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


/***
 * @extends TDEBase
 * @param {TableEditor} tableEditor
 * @param {TDBase} cell
 * @constructor
 */
function TDEDate(tableEditor, cell) {
  _TDEBase.default.call(this, tableEditor, cell);
}

_OOP.default.mixClass(TDEDate, _TDEBase.default);

TDEDate.prototype.prepareInput = function () {
  this.$input = (0, _SCore._)({
    tag: 'dateinput',
    class: 'asht-date-cell-editor-input',
    on: {
      change: this.ev_inputChange
    }
  });
  this.$editingbox.clearChild().addChild(this.$input);

  this._loadCellStyle();

  this.$input.addStyle(this._cellStyle);
};

TDEDate.prototype.reload = function () {
  var value = this.cell.value;
  var descriptor = this.cell.descriptor;
  var dateValue = this.cell.implicit(value);

  if (typeof value === "string") {
    dateValue = new Date(value);

    if (isNaN(dateValue.getTime())) {
      dateValue = (0, _datetime.parseDateString)(value, descriptor.format || 'dd/mm/yyyy');
    }

    if (isNaN(dateValue.getTime())) {
      dateValue = null;
    }
  }

  this.$input.format = descriptor.format || "dd/mm/yyyy";
  this.$input.value = dateValue;
  this.$input.min = descriptor.min || new Date(1890, 0, 1);
  this.$input.max = descriptor.max || new Date(2090, 0, 1);
  this.$input.disabled = descriptor.readOnly || 'calc' in descriptor;
};

TDEDate.prototype._loadCellStyle = function () {
  var cellElt = this.cell.elt;
  this._cellStyle = {
    'font-size': cellElt.getComputedStyleValue('font-size'),
    'font-family': cellElt.getComputedStyleValue('font-family'),
    'font-style': cellElt.getComputedStyleValue('font-style')
  };
};

TDEDate.prototype.ev_inputChange = function () {
  this.flushValue(this.$input.value);

  if (document.activeElement && _AElement.default.prototype.isDescendantOf.call(document.activeElement, this.tableEditor.$view)) {
    this.$input.$input.focus();
    this.$input.$input.select();
  }
};

TDEDate.prototype.ev_focus = _TDEText.default.prototype.ev_focus;
_TDEBase.default.typeClasses.date = TDEDate;
_TDEBase.default.typeClasses.Date = TDEDate;
var _default = TDEDate;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDEDateTime.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDEDateTime.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _SCore = require("../../dom/SCore");

var _TDEDate = _interopRequireDefault(require("./TDEDate"));

var _datetime = require("absol/src/Time/datetime");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


/***
 * @extends TDEDate
 * @constructor
 */
function TDEDateTime() {
  _TDEDate.default.apply(this, arguments);
}

_OOP.default.mixClass(TDEDateTime, _TDEDate.default);

TDEDateTime.prototype.prepareInput = function () {
  this.$input = (0, _SCore._)({
    tag: 'datetimeinput',
    class: ["asht-cell-editor-input", 'asht-date-time-cell-editor-input'],
    on: {
      change: this.ev_inputChange
    }
  });
  this.$editingbox.clearChild().addChild(this.$input);

  this._loadCellStyle();

  this.$input.addStyle(this._cellStyle);
};

TDEDateTime.prototype.reload = function () {
  var value = this.cell.value;
  var descriptor = this.cell.descriptor;
  var dateValue;

  if (typeof value === "string") {
    dateValue = new Date(value);

    if (isNaN(dateValue.getTime())) {
      try {
        dateValue = (0, _datetime.parseDateTime)(value, descriptor.format || 'dd/mm/yyyy hh:mm a');
      } catch (e) {
        dateValue = null;
      }
    }
  } else if (value instanceof Date) {
    dateValue = value;
  }

  this.$input.value = dateValue;
  this.$input.disabled = descriptor.readOnly;
  this.$input.min = descriptor.min || new Date(1890, 0, 1);
  this.$input.max = descriptor.max || new Date(2090, 0, 1);
  this.$input.disabled = descriptor.readOnly || 'calc' in descriptor;
};

TDEDateTime.prototype.ev_inputChange = function () {
  this.flushValue(this.$input.value);

  if (document.activeElement && _AElement.default.prototype.isDescendantOf.call(document.activeElement, this.tableEditor.$view)) {
    this.$input.$input.focus();
    this.$input.$input.select();
  }
};

_TDEBase.default.typeClasses.datetime = TDEDateTime;
_TDEBase.default.typeClasses.DateTime = TDEDateTime;
var _default = TDEDateTime;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDEEnum.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDEEnum.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _SCore = require("../../dom/SCore");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _util = require("../../util");


/***
 * @extends TDEBase
 * @param {TableEditor} tableEditor
 * @param {TSCell} cell
 * @constructor
 */
function TDEEnum(tableEditor, cell) {
  _TDEBase.default.call(this, tableEditor, cell);
}

_OOP.default.mixClass(TDEEnum, _TDEBase.default);

TDEEnum.prototype.prepareInput = function () {
  this.$input = (0, _SCore._)({
    tag: 'selectmenu',
    attr: {
      'data-strict-value': 'true'
    },
    class: 'asht-cell-editor-input',
    on: {
      change: this.ev_inputChange
    }
  });
  this.$editingbox.clearChild().addChild(this.$input);

  this._loadCellStyle();

  this.$input.addStyle(this._cellStyle);
};

TDEEnum.prototype.reload = function () {
  var prevValue = this.cell.value;
  var descriptor = this.cell.descriptor;
  this.$input.items = descriptor.items;
  this.$input.value = this.cell.value;
  this.$input.disabled = descriptor.readOnly;
  this.$input.enableSearch = descriptor.enableSearch || descriptor.searchable;

  if (this.$input.items && this.$input.items.length > 0 && (0, _util.isDifferent)(prevValue, this.$input.value)) {
    setTimeout(function () {
      if ((0, _util.isDifferent)(prevValue, this.$input.value)) {
        this.ev_inputChange();
      }
    }.bind(this), 0);
  }
};

TDEEnum.prototype._loadCellStyle = function () {
  var cellElt = this.cell.elt;
  this._cellStyle = {
    'font-size': cellElt.getComputedStyleValue('font-size'),
    'font-family': cellElt.getComputedStyleValue('font-family'),
    'font-style': cellElt.getComputedStyleValue('font-style')
  };
};

TDEEnum.prototype.ev_inputChange = function () {
  this.flushValue(this.$input.value);

  _ResizeSystem.default.update();
};

_TDEBase.default.typeClasses.enum = TDEEnum;
var _default = TDEEnum;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDEEnumSet.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDEEnumSet.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _SCore = require("../../dom/SCore");


/***
 * @extends TDEBase
 * @constructor
 */
function TDEEnumSet() {
  _TDEBase.default.apply(this, arguments);
}

_OOP.default.mixClass(TDEEnumSet, _TDEBase.default);

TDEEnumSet.prototype.prepareInput = function () {
  var descriptor = this.cell.descriptor;
  this.$input = (0, _SCore._)({
    tag: 'multiselectmenu',
    class: 'asht-enum-set-cell-editor-input',
    props: {
      items: descriptor.items,
      values: this.cell.value
    },
    on: {
      change: this.ev_inputChange
    }
  });
  this.$editingbox.clearChild().addChild(this.$input);
};

TDEEnumSet.prototype.reload = function () {
  var descriptor = this.cell.descriptor;
  this.$input.items = descriptor.items;
  this.$input.values = this.cell.value;
  this.$input.disabled = descriptor.readOnly || 'calc' in descriptor;
  this.$input.enableSearch = descriptor.enableSearch || descriptor.searchable;
};

TDEEnumSet.prototype.ev_inputChange = function () {
  this.flushValue(this.$input.values.slice());

  _ResizeSystem.default.update();
};

_TDEBase.default.typeClasses['{enum}'] = TDEEnumSet;
_TDEBase.default.typeClasses.EnumSet = TDEEnumSet;
var _default = TDEEnumSet;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDEBoolean.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDEBoolean.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _SCore = require("../../dom/SCore");

var _TDEText = _interopRequireDefault(require("./TDEText"));


/***
 * @extends TDEBase
 * @param {TableEditor} tableEditor
 * @param {TSCell} cell
 * @constructor
 */
function TDEBoolean(tableEditor, cell) {
  _TDEBase.default.call(this, tableEditor, cell);
}

_OOP.default.mixClass(TDEBoolean, _TDEBase.default);

TDEBoolean.prototype.prepareInput = function () {
  var descriptor = this.cell.descriptor;
  this.$checkbox = (0, _SCore._)({
    tag: 'checkboxbutton',
    props: {
      checked: !!this.cell.value
    },
    on: {
      change: this.ev_checkboxChange
    }
  });
  /***
   * @type {Button ||AElement}
   */

  this.$input = (0, _SCore._)({
    attr: {
      tabindex: '1'
    },
    class: ['asht-cell-editor-input', 'asht-boolean-cell-editor-input'],
    child: this.$checkbox
  });
  this.$editingbox.clearChild().addChild(this.$input);
};

TDEBoolean.prototype.reload = function () {
  this.$checkbox.disabled = !!this.cell.descriptor.readOnly || 'calc' in this.cell.descriptor;
  this.$checkbox.checked = this.cell.value;
};

TDEBoolean.prototype.ev_checkboxChange = function (event) {
  this.flushValue(this.$checkbox.checked);
};

_TDEBase.default.typeClasses.bool = TDEBoolean;
_TDEBase.default.typeClasses.boolean = TDEBoolean;
var _default = TDEBoolean;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDETreeEnum.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDETreeEnum.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _SCore = require("../../dom/SCore");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _util = require("../../util");


/***
 * @extends TDEBase
 * @param {TableEditor} tableEditor
 * @param {TDBase} cell
 * @constructor
 */
function TDETreeEnum(tableEditor, cell) {
  _TDEBase.default.call(this, tableEditor, cell);
}

_OOP.default.mixClass(TDETreeEnum, _TDEBase.default);

TDETreeEnum.prototype.prepareInput = function () {
  this.$input = (0, _SCore._)({
    tag: 'selecttreemenu',
    class: 'asht-cell-editor-input',
    on: {
      change: this.ev_inputChange
    }
  });
  this.$editingbox.clearChild().addChild(this.$input);

  this._loadCellStyle();

  this.$input.addStyle(this._cellStyle);
};

TDETreeEnum.prototype.reload = function () {
  var preValue = this.cell.value;
  var descriptor = this.cell.descriptor;
  this.$input.items = descriptor.items;
  this.$input.value = this.cell.value;
  this.$input.enableSearch = descriptor.enableSearch || descriptor.searchable;
  this.$input.disabled = descriptor.readOnly || 'calc' in descriptor;

  if ((0, _util.isDifferent)(preValue, this.$input.value)) {
    setTimeout(function () {
      if ((0, _util.isDifferent)(preValue, this.$input.value)) {
        this.ev_inputChange();
      }
    }.bind(this), 0);
  }
};

TDETreeEnum.prototype._loadCellStyle = function () {
  var cellElt = this.cell.elt;
  this._cellStyle = {
    'font-size': cellElt.getComputedStyleValue('font-size'),
    'font-family': cellElt.getComputedStyleValue('font-family'),
    'font-style': cellElt.getComputedStyleValue('font-style')
  };
};

TDETreeEnum.prototype.ev_inputChange = function () {
  this.flushValue(this.$input.value);

  _ResizeSystem.default.update();
};

_TDEBase.default.typeClasses.treeenum = TDETreeEnum;
_TDEBase.default.typeClasses.TreeEnum = TDETreeEnum;
var _default = TDETreeEnum;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/editor/TDETime.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/editor/TDETime.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TDEBase = _interopRequireDefault(require("./TDEBase"));

var _Dom = require("absol/src/HTML5/Dom");

var _SelectMenu = _interopRequireDefault(require("absol-acomp/js/SelectMenu2"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _SCore = require("../../dom/SCore");

var _TDEText = _interopRequireDefault(require("./TDEText"));

var _datetime = require("absol/src/Time/datetime");

var _TDEDate = _interopRequireDefault(require("./TDEDate"));


/***
 * @extends TDEBase
 * @param {TableEditor} tableEditor
 * @param {TDBase} cell
 * @constructor
 */
function TDETime(tableEditor, cell) {
  _TDEBase.default.call(this, tableEditor, cell);
}

_OOP.default.mixClass(TDETime, _TDEBase.default);

TDETime.prototype.prepareInput = function () {
  this.$input = (0, _SCore._)({
    tag: 'timeinput',
    class: 'asht-date-cell-editor-input',
    props: {
      format: 'hh:mm a'
    },
    on: {
      change: this.ev_inputChange
    }
  });
  this.$editingbox.clearChild().addChild(this.$input);

  this._loadCellStyle();

  this.$input.addStyle(this._cellStyle);
};

TDETime.prototype.reload = function () {
  var value = this.cell.value;
  var descriptor = this.cell.descriptor;
  var timeValue = this.cell.implicit(value);
  if (typeof timeValue !== "number") timeValue = 0;
  this.$input.dayOffset = timeValue;
  this.$input.disabled = descriptor.readOnly || 'calc' in descriptor;
};

TDETime.prototype._loadCellStyle = function () {
  var cellElt = this.cell.elt;
  this._cellStyle = {
    'font-size': cellElt.getComputedStyleValue('font-size'),
    'font-family': cellElt.getComputedStyleValue('font-family'),
    'font-style': cellElt.getComputedStyleValue('font-style')
  };
};
/***
 *
 * @param {KeyboardEvent} event
 */


TDETime.prototype.ev_firstKey = function (event) {
  if (event.key === "Delete") {
    this.cell.value = "";
  } else if (event.key === 'Enter' || event.key === 'F2') {
    this.$input.value = this.cell.value;
    this.startEditing();
    event.preventDefault();
  } else if (event.key === 'Tab') {
    this.editCellNext();
    event.preventDefault();
  } else if (event.key.length === 1 || event.key === "Backspace") {
    this.startEditing();
  } else if (event.key.startsWith('Arrow')) {
    event.preventDefault();

    switch (event.key) {
      case "ArrowLeft":
        this.editCellLeft();
        break;

      case "ArrowRight":
        this.editCellRight();
        break;

      case "ArrowUp":
        this.editCellAbove();
        break;

      case "ArrowDown":
        this.editCellBellow();
        break;
    }
  }
}; // TODO: handle enter key, blur


TDETime.prototype.ev_blur = function (event) {
  this.$editingbox.removeClass('as-status-focus');
  if (this._waitBlurTimeout >= 0) clearTimeout(this._waitBlurTimeout);
  this._waitBlurTimeout = setTimeout(function () {
    this._waitBlurTimeout = -1;

    if (!document.activeElement || this.$input.$text !== document.activeElement && !_AElement.default.prototype.isDescendantOf.call(document.activeElement, this.$input)) {//blur before finished
    }
  }.bind(this), 100);
};

TDETime.prototype.ev_inputChange = function () {
  this.flushValue(this.$input.dayOffset);
  this.$input.$text.focus();
  this.$input.$text.select();
};

TDETime.prototype.ev_focus = _TDEText.default.prototype.ev_focus;
_TDEBase.default.typeClasses.time = TDETime;
_TDEBase.default.typeClasses.time = TDETime;
var _default = TDETime;
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/js/fragment/dialogs.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/dialogs.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.selectRowHeight = selectRowHeight;

var _SCore = require("../dom/SCore");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

require("../../css/dialogs.css");


function selectRowHeight(opt) {
  var okBtn = (0, _SCore._)({
    tag: 'button',
    style: {
      display: 'block',
      width: '80px'
    },
    child: {
      text: "OK"
    }
  });
  var cancelBtn = (0, _SCore._)({
    tag: 'button',
    style: {
      display: 'block',
      width: '80px',
      marginTop: '5px'
    },
    child: {
      text: "Cancel"
    }
  });
  var valueInput = (0, _SCore._)({
    tag: 'input',
    attr: {
      type: 'number',
      step: '0.5',
      min: '0',
      value: opt.value + ''
    },
    style: {
      marginLeft: '5px',
      width: '50px'
    }
  });
  var standardCBx = (0, _SCore._)('checkboxbutton').on('change', function (event) {
    if (this.checked) {
      valueInput.value = opt.standard;
    }
  });
  var windowElt = (0, _SCore._)({
    tag: 'onscreenwindow',
    class: ['asht-window', 'asht-select-row-width-window'],
    style: {
      top: '30vh',
      left: '30vw',
      width: '250px',
      height: '85px'
    },
    props: {
      windowTitle: 'Row Height',
      windowIcon: 'span.mdi.mdi-table-row-height'
    },
    child: {
      class: 'asht-select-row-width-window-content',
      style: {
        whiteSpace: 'nowrap'
      },
      child: [{
        style: {
          verticalAlign: 'top',
          display: 'inline-block'
        },
        child: [{
          child: [{
            tag: 'span',
            child: {
              text: "Row Height:"
            }
          }, valueInput]
        }, {
          child: [standardCBx, {
            tag: 'span',
            style: {
              marginLeft: '5px'
            },
            child: {
              text: 'Standard Height'
            }
          }]
        }]
      }, {
        style: {
          verticalAlign: 'top',
          display: 'inline-block',
          marginLeft: '10px'
        },
        child: [okBtn, cancelBtn]
      }]
    }
  });
  var blinkTO = -1;
  var modal = (0, _SCore._)({
    class: 'asht-modal',
    child: windowElt,
    on: {
      mousedown: function () {
        if (blinkTO >= 0) clearTimeout(blinkTO);
        windowElt.removeClass('as-blink');
      },
      click: function (event) {
        if (event.target === this) {
          windowElt.addClass('as-blink');
          blinkTO = setTimeout(function () {
            blinkTO = -1;
            windowElt.removeClass('as-blink');
          }, 1000);
        }
      }
    }
  });
  modal.addTo(document.body);
  return new Promise(function (resolve, reject) {
    windowElt.$closeBtn.once('click', function () {
      modal.remove();
      reject();
    });
    okBtn.once('click', function () {
      modal.remove();
      resolve(parseFloat(valueInput.value));
    });
    cancelBtn.once('click', function () {
      modal.remove();
      reject();
    });
  });
}
};

moduleFactories["node_modules/absol-sheet/js/fragment/TableEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/js/fragment/TableEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/tableeditable.css");

var _SComp = _interopRequireDefault(require("../dom/SComp"));

var _TableData = _interopRequireDefault(require("../viewer/TableData"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

require("./editor/TDEText");

require("./editor/TDENumber");

require("./editor/TDEDate");

require("./editor/TDEDateTime");

require("./editor/TDEEnum");

require("./editor/TDEEnumSet");

require("./editor/TDEBoolean");

require("./editor/TDETreeEnum");

require("./editor/TDETime");

require("absol-acomp/js/BContextCapture");

var _ContextMenu = _interopRequireDefault(require("absol-acomp/js/ContextMenu"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _TDEBase = _interopRequireDefault(require("./editor/TDEBase"));

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _TDRecord = _interopRequireDefault(require("../viewer/TDRecord"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _dialogs = require("./dialogs");

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _Clipboard = require("absol/src/HTML5/Clipboard");

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _util = require("../util");


// selectRowHeight()
var _ = _SComp.default._;
var $ = _SComp.default.$;
/***
 * @extends EventEmitter
 * @constructor
 */

function TableEditor(opt) {
  var defaultOpt = Object.assign({}, this.opt, opt);
  this.opt = new _Attributes.default(this);
  Object.assign(this.opt, defaultOpt);

  _EventEmitter.default.call(this);

  this.hoverRow = null;
  this.currentCellEditor = null;
  this.selectedData = null;

  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }

  this.$indexColRows = [];
}

_OOP.default.mixClass(TableEditor, _EventEmitter.default);

TableEditor.prototype.opt = {};

TableEditor.prototype.getView = function () {
  if (this.$view) return this.$view;

  _ContextMenu.default.auto();

  this.$view = _({
    class: 'asht-table-editor',
    child: ['attachhook', {
      class: 'asht-table-editor-body',
      child: {
        class: 'asht-table-editor-content',
        child: {
          class: 'asht-table-editor-editing-layer',
          child: '.asht-table-editor-editing-box'
        }
      }
    }, {
      class: 'asht-table-editor-foreground',
      child: [{
        class: "asht-table-editor-header-viewport",
        child: {
          class: "asht-table-editor-header-scroller",
          child: {
            tag: 'table',
            class: ['asht-table-editor-header', 'asht-table-data'],
            child: {
              tag: 'thead',
              child: 'tr'
            }
          }
        }
      }, {
        class: 'asht-table-editor-index-viewport',
        child: {
          class: 'asht-table-editor-index-scroller',
          child: {
            tag: 'table',
            class: ['asht-table-editor-index-col', 'asht-table-data'],
            extendEvent: 'contextmenu'
          }
        }
      }, '.asht-table-editor-root-cell', '.asht-table-editor-selected-box']
    }]
  });
  this.$attachook = $('attachhook', this.$view);
  this.$attachook.requestUpdateSize = this.ev_resize;
  this.$attachook.on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdateSize();
  });
  this.$domSignal = _('attachhook').addTo(this.$view);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('request_load_foreground_content', this.loadForegroundContent.bind(this));
  this.$body = $('.asht-table-editor-body', this.$view);
  this.$body.on('scroll', this.ev_scrollBody);
  this.$content = $('.asht-table-editor-content', this.$view);
  this.$foreground = $('.asht-table-editor-foreground', this.$view);
  this.$editingLayer = $('.asht-table-editor-editing-layer', this.$view).on('mousedown', this.ev_editLayerMouseDown);
  this.$editingbox = $('.asht-table-editor-editing-box', this.$view).addStyle('display', 'none');
  this.$selectedbox = $('.asht-table-editor-selected-box', this.$foreground).addStyle('display', 'none');
  this.$view.on('wheel', this.ev_wheel).on('mousemove', this.ev_mosemove);
  this.$rootCell = $('.asht-table-editor-root-cell', this.$view).on('mousedown', this.ev_rootCellMouseDown);
  this.$rootCell.defineEvent('contextmenu');
  this.$rootCell.on('contextmenu', this.ev_rootCellContextMenu);
  this.$header = $('.asht-table-editor-header', this.$view);
  this.$headRow = $('tr', this.$header).on('mousedown', this.ev_headerMouseDown);
  this.$headerScroller = $('.asht-table-editor-header-scroller', this.$view);
  this.$headerScroller.on('scroll', this.ev_scrollHeader);
  this.$headerViewport = $('.asht-table-editor-header-viewport', this.$view);
  this.$indexViewport = $('.asht-table-editor-index-viewport', this.$view);
  this.$indexCol = $('.asht-table-editor-index-col', this.$view).on('mousedown', this.ev_indexColMouseDown).on('contextmenu', this.ev_indexColContextMenu);
  this.$indexSccroller = $('.asht-table-editor-index-scroller', this.$view);
  this.opt.loadAttributeHandlers(this.optHandlers);
  return this.$view;
};

TableEditor.prototype.setData = function (data) {
  data = (0, _util.duplicateData)(data);
  if (this.$tableData) this.$tableData.remove();
  var tableData = new _TableData.default(this, {});
  this.$tableData = tableData.getView();
  this.$content.addChildBefore(this.$tableData, this.$editingLayer);
  tableData.import(data);
  this.tableData = tableData;
  this.domSignal.emit('request_load_foreground_content');
  tableData.on('new_row_property_change', this.ev_newRowPropertyChange);
};

TableEditor.prototype.loadForegroundContent = function () {
  this.loadHeader();
  this.loadIndexCol();
  this.updateFixedTableEltPosition();
  this.updateForegroundPosition();
};

TableEditor.prototype.getData = function () {
  return this.tableData && this.tableData.export();
};

TableEditor.prototype.getRecords = function () {
  return this.tableData && this.tableData.records;
};

TableEditor.prototype.scrollYBy = function (dy, dx) {
  dx = dx || 0;

  if (this.$body.scrollTop + dy > this.$body.scrollHeight - this.$body.clientHeight) {
    dy = this.$body.scrollHeight - this.$body.clientHeight - this.$body.scrollTop;
  } else if (this.$body.scrollTop + dy < 0) {
    dy = -this.$body.scrollTop;
  }

  if (dy) this.$body.scrollTop += dy;

  if (this.$body.scrollLeft + dx > this.$body.scrollWidth - this.$body.clientWidth) {
    dx = this.$body.scrollWidth - this.$body.clientWidth - this.$body.scrollLeft;
  } else if (this.$body.scrollLeft + dx < 0) {
    dx = -this.$body.scrollLeft;
  }

  if (dx) this.$body.scrollLeft += dx;
  return dy * dy + dx * dx;
};
/***
 *
 * @param {WheelEvent} ev
 */


TableEditor.prototype.ev_wheel = function (ev) {
  var dL = ev.shiftKey ? this.scrollYBy(0, ev.deltaY) : this.scrollYBy(ev.deltaY);
  if (dL !== 0) ev.preventDefault();
};

TableEditor.prototype.ev_scrollBody = function () {
  var now = new Date().getTime();

  if (this._scrollHolder && this._scrollHolder.by !== 'body' && now - this._scrollHolder.time < 100) {
    return;
  }

  this._scrollHolder = {
    time: now,
    by: 'body'
  };
  this.$indexSccroller.scrollTop = this.$body.scrollTop;
  this.$headerScroller.scrollLeft = this.$body.scrollLeft;
  this.updateSelectedPosition();
};

TableEditor.prototype.ev_scrollHeader = function () {
  var now = new Date().getTime();

  if (this._scrollHolder && this._scrollHolder.by !== 'header' && now - this._scrollHolder.time < 100) {
    return;
  }

  this._scrollHolder = {
    time: now,
    by: 'header'
  };
  this.$indexSccroller.scrollTop = this.$body.scrollTop;
  this.$body.scrollLeft = this.$headerScroller.scrollLeft;
  this.updateSelectedPosition();
};

TableEditor.prototype.ev_mosemove = function (ev) {
  if (!this.tableData) return;
};

TableEditor.prototype.ev_rootCellMouseDown = function (ev) {
  if (this.opt.readOnly) return;
  this.selectAll();
  var row = this.tableData.findRowByIndex(0);
  var col = this.tableData.findColByIndex(0);

  if (row && col) {
    this.editCellDelay(row, col);
  }
};

TableEditor.prototype.ev_headerMouseDown = function (ev) {
  // if (this.opt.readOnly) return;
  var x = ev.clientX;
  var col = this.tableData.findColByClientX(x);
  var row;

  if (col) {
    this.selectCol(col);
    row = this.tableData.findRowByIndex(0);

    if (row) {
      this.editCellDelay(row, col);
    }
  }
};

TableEditor.prototype.ev_editLayerMouseDown = function (ev) {
  var x = ev.clientX;
  var y = ev.clientY;
  this.hoverRow = this.tableData.findRowByClientY(y);
  this.hoverCol = this.tableData.findColByClientX(x);

  if (ev.target === this.$editingLayer) {
    if (this.hoverRow) {
      if (this.hoverCol) {
        this.editCellDelay(this.hoverRow, this.hoverCol);
        this.selectRow(null);
      } else {
        this.selectRow(this.hoverRow);
        this.editCellDelay(this.hoverRow, this.tableData.headCells[0]);
      }
    }
  }
};

TableEditor.prototype.ev_indexColMouseDown = function (ev) {
  var y = ev.clientY;
  this.hoverRow = this.tableData.findRowByClientY(y);

  if (this.hoverRow) {
    this.selectRow(this.hoverRow);
    this.editCellDelay(this.hoverRow, this.tableData.headCells[0]);
  }
};

TableEditor.prototype.ev_indexColContextMenu = function (ev) {
  var thisTE = this;
  var row = this.tableData.findRowByClientY(ev.clientY);
  var items = [];

  if (row.idx === "*") {} else {
    items.push({
      cmd: 'insert_before',
      text: 'Insert Before',
      icon: 'span.mdi.mdi-table-row-plus-before'
    }, {
      cmd: 'insert_after',
      text: 'Insert After',
      icon: 'span.mdi.mdi-table-row-plus-after'
    }, {
      cmd: 'remove',
      text: 'Delete',
      icon: 'span.mdi.mdi-table-row-remove'
    });
  }

  if (items.length > 0 && items[items.length - 1] !== '===') {
    items.push("===");
  }

  if (row.idx !== "*") {
    items.push({
      cmd: 'copy',
      text: "Copy",
      icon: "span.mdi.mdi-content-copy"
    });
  }

  items.push({
    cmd: 'paste',
    text: "Paste",
    icon: 'span.mdi.mdi-content-paste'
  });
  items.push('===', {
    cmd: 'row_height',
    text: 'Row Height',
    icon: 'span.mdi.mdi-table-row-height'
  });
  ev.showContextMenu({
    extendStyle: {
      fontSize: '14px'
    },
    items: items
  }, function (ev1) {
    var cmd = ev1.menuItem.cmd;
    var eventData = {
      cmd: cmd
    };

    switch (cmd) {
      case 'row_height':
        (0, _dialogs.selectRowHeight)({
          value: thisTE.tableData.config.rowHeight,
          standard: 21
        }).then(function (result) {
          thisTE.tableData.config.rowHeight = result;

          _ResizeSystem.default.update();
        }, _noop.default);
        break;

      case 'remove':
        eventData.type = 'cmd_remove_row';
        eventData.rowIdx = row.idx;
        eventData.accepted = true;

        eventData.accept = function (isAccepted) {
          this.accepted = isAccepted;
        };

        thisTE.emit(eventData.type, eventData, thisTE);

        if (eventData.accepted && eventData.accepted.then) {
          eventData.accepted.then(function (isAccept) {
            if (isAccept) thisTE.removeRow(eventData.rowIdx);
          });
        } else if (eventData.accepted) {
          thisTE.removeRow(eventData.rowIdx);
        }

        break;

      case 'insert_before':
      case 'insert_after':
        eventData.type = 'cmd_insert_row';
        eventData.rowIdx = row.idx + (cmd === 'insert_after' ? 1 : 0);
        eventData.result = {};

        eventData.resolve = function (result) {
          this.result = result;
        };

        thisTE.emit(eventData.type, eventData, thisTE);

        if (eventData.result) {
          if (eventData.result.then) {
            eventData.result.then(function (result) {
              if (result) {
                thisTE.insertRow(eventData.rowIdx, result);
              }
            });
          } else {
            thisTE.insertRow(eventData.rowIdx, eventData.result);
          }
        }

        break;

      case "copy":
        (0, _Clipboard.copyText)(JSON.stringify(row.record));
        break;

      case "paste":
        (0, _Clipboard.pasteText)().then(function (result) {
          try {
            var obj = (0, _util.duplicateData)(JSON.parse(result));
            thisTE.tableData.propertyNames.forEach(function (cr) {
              row.propertyByName[cr].value = obj[cr];
            }, {});

            if (thisTE.currentCellEditor) {
              thisTE.currentCellEditor.reload();
            }

            _ResizeSystem.default.update();
          } catch (e) {
            setTimeout(function () {
              throw e;
            }, 0);
          }
        });
        break;
    }
  });
};

TableEditor.prototype.ev_rootCellContextMenu = function (ev) {
  var thisTE = this;
  ev.showContextMenu({
    items: [{
      cmd: 'insert_first',
      text: 'Insert First',
      icon: 'span.mdi.mdi-table-row-plus-before'
    }, {
      cmd: 'append_last',
      text: 'Append Last',
      icon: 'span.mdi.mdi-table-row-plus-after'
    }]
  }, function (ev1) {
    var cmd = ev1.menuItem.cmd;
    var eventData = {
      cmd: cmd
    };
    eventData.type = 'cmd_insert_row';
    eventData.rowIdx = cmd === 'insert_first' ? 0 : thisTE.tableData.records.length;
    eventData.result = {};

    eventData.resolve = function (result) {
      this.result = result;
    };

    thisTE.emit(eventData.type, eventData, thisTE);

    if (eventData.result) {
      if (eventData.result.then) {
        eventData.result.then(function (result) {
          if (result) {
            thisTE.insertRow(eventData.rowIdx, result);

            if (cmd === 'append_last') {
              thisTE.$body.scrollTop = thisTE.$body.scrollHeight - thisTE.$body.clientHeight;
            }
          }
        });
      } else {
        thisTE.insertRow(eventData.rowIdx, eventData.result);
        thisTE.$body.scrollTop = thisTE.$body.scrollHeight - thisTE.$body.clientHeight;
      }
    }
  });
};

TableEditor.prototype.ev_resize = function (event) {
  this.updateFixedTableEltPosition();
};

var t = 10;

TableEditor.prototype.ev_newRowPropertyChange = function (event) {
  this.tableData.flushNewRow({});
  this.loadIndexCol();
};

TableEditor.prototype.editCellDelay = function (row, col) {
  setTimeout(() => {
    this.editCell(row, col);
  }, 100);
};

TableEditor.prototype.editCell = function (row, col) {
  if (this.currentCellEditor) {
    this.currentCellEditor.off('finish', this.ev_cellEditorFinish);
    this.currentCellEditor.destroy();
    this.currentCellEditor = null; // if (document.activeElement && AElement.prototype.isDescendantOf.call(document.activeElement, this.$editingbox)){
    //     // document.activeElement.blur();
    // }

    this.$editingbox.clearChild();
  }

  if (row && col) {
    var cell = row.cells[col.index];
    var EditorClass = _TDEBase.default.typeClasses[cell.descriptor.type];

    if (EditorClass) {
      this.currentCellEditor = new EditorClass(this, row.cells[col.index]);
      this.$editingbox.removeStyle('display');
      this.currentCellEditor.start();
    } else {
      this.currentCellEditor = null;
      this.showError('Data Error', 'Not support ' + cell.descriptor.type);
      this.$editingbox.addStyle('display', 'none');
    }

    this.updateEditingBoxPosition();
    this.scrollIntoRow(row);
    this.scrollIntoCol(col);

    if (this.currentCellEditor) {
      this.currentCellEditor.on('finish', this.ev_cellEditorFinish);
    }
  } else {
    this.$editingbox.addStyle('display', 'none');
  }
};

TableEditor.prototype.updateEditingBoxPosition = function () {
  if (!this.currentCellEditor) return;
  var cellEditor = this.currentCellEditor;
  var elt = cellEditor.cell.elt;
  var eLBound = this.$editingLayer.getBoundingClientRect();
  var eBound = elt.getBoundingClientRect();
  var left = eBound.left - eLBound.left;
  var width = eBound.width;
  this.$editingbox.addStyle({
    left: left + 'px',
    top: eBound.top - eLBound.top + 'px',
    '--cell-width': width + 'px',
    '--cell-height': eBound.height + 'px'
  });
};

TableEditor.prototype.selectRow = function (row) {
  if (row) {
    this.selectedData = {
      type: 'row',
      row: row
    };
    this.$selectedbox.removeStyle('display');
    this.updateSelectedPosition();
  } else {
    // this.$selectrow
    this.selectedData = null;
    this.$selectedbox.addStyle('display', 'none');
  }
};

TableEditor.prototype.selectCol = function (col) {
  if (col) {
    this.selectedData = {
      type: 'col',
      col: col
    };
    this.$selectedbox.removeStyle('display');
    this.updateSelectedPosition();
  } else {
    // this.$selectrow
    this.selectedData = null;
    this.$selectedbox.addStyle('display', 'none');
  }
};

TableEditor.prototype.selectAll = function () {
  this.selectedData = {
    type: 'all'
  };
  this.$selectedbox.removeStyle('display');
  this.updateSelectedPosition();
};

TableEditor.prototype.focusIncompleteCell = function () {
  if (!this.tableData) return false;
  var incompleteCell = this.tableData.findFirsIncompleteCell();
  if (!incompleteCell) return false;
  var col = this.tableData.findColByName(incompleteCell.pName);
  this.editCellDelay(incompleteCell.row, col);
  return true;
};

TableEditor.prototype.insertRow = function (atIdx, record) {
  var tableData = this.tableData;
  atIdx = Math.min(atIdx, tableData.bodyRow.length);
  var currentRow = tableData.bodyRow[atIdx];
  var row = new _TDRecord.default(tableData, record, atIdx);

  if (currentRow) {
    tableData.records.splice(atIdx, 0, record);
    tableData.$tbody.addChildBefore(row.elt, currentRow.elt);
    tableData.bodyRow.splice(atIdx, 0, row);
  } else {
    tableData.records.push(record);

    if (tableData.bodyRow.length > 0) {
      tableData.$tbody.addChildAfter(row.elt, tableData.bodyRow[tableData.bodyRow.length - 1].elt);
    } else {
      tableData.$tbody.addChildBefore(row.elt, tableData.$tbody.firstChild);
    }

    tableData.bodyRow.push(row);
  }

  for (var i = atIdx; i < tableData.bodyRow.length; ++i) {
    tableData.bodyRow[i].idx = i;
  }

  this.loadIndexCol();
  this.updateFixedTableEltPosition();
};

TableEditor.prototype.removeRow = function (atIdx) {
  var tableData = this.tableData;
  atIdx = Math.min(atIdx, tableData.bodyRow.length - 1);
  if (atIdx < 0) return;
  var row = tableData.bodyRow.splice(atIdx, 1)[0];
  row.elt.remove();
  this.tableData.records.splice(atIdx, 1);

  for (var i = atIdx; i < tableData.bodyRow.length; ++i) {
    tableData.bodyRow[i].idx = i;
  }

  this.loadIndexCol();
  this.updateFixedTableEltPosition();
};

TableEditor.prototype.updateSelectedPosition = function () {
  if (!this.selectedData) return;
  var fBound = this.$foreground.getBoundingClientRect();

  if (this.selectedData.row) {
    var row = this.selectedData.row;
    var rBound = row.elt.getBoundingClientRect();
    this.$selectedbox.addStyle({
      left: rBound.left - fBound.left - 1 + 'px',
      // boder-width = 2px
      top: rBound.top - fBound.top - 1 + 'px',
      'min-width': rBound.width + 2 + 'px',
      'min-height': rBound.height + 2 + 'px'
    });
    this.$header.addStyle('z-index', '21');
  } else if (this.selectedData.col) {
    var col = this.selectedData.col;
    var cBound = col.elt.getBoundingClientRect();
    var tBound = col.elt.parentElement.parentElement.parentElement.getBoundingClientRect();
    this.$selectedbox.addStyle({
      left: cBound.left - fBound.left - 1 + 'px',
      // boder-width = 2px
      top: tBound.top - fBound.top - 1 + 'px',
      'min-width': cBound.width + 2 + 'px',
      'min-height': tBound.height + 2 + 'px'
    });
    this.$header.addStyle('z-index', '19');
  } else if (this.selectedData.type == 'all') {
    var tBound = this.tableData.$view.getBoundingClientRect();
    this.$selectedbox.addStyle({
      left: tBound.left - fBound.left - 1 + 'px',
      // boder-width = 2px
      top: tBound.top - fBound.top - 1 + 'px',
      'min-width': tBound.width + 2 + 'px',
      'min-height': tBound.height + 2 + 'px'
    });
  }
};

TableEditor.prototype.loadHeader = function () {
  var $headRow = this.$headRow;
  $headRow.clearChild();
  Array.prototype.forEach.call(this.tableData.$headRow.children, function (td, index) {
    var newTd = $(td.cloneNode(true));
    newTd.$originElt = td;
    newTd.__index__ = index - 1;
    $headRow.addChild(newTd);
  });
  this.updateHeaderPosition();
};

TableEditor.prototype.updateHeaderPosition = function () {
  var headerElt = this.$header;
  var headerViewport = this.$headerViewport;
  var rootCellElt = this.$rootCell;
  Array.prototype.forEach.call(this.$headRow.children, function (td, i) {
    var originTd = td.$originElt;
    var bound = originTd.getBoundingClientRect();
    td.addStyle({
      width: bound.width + 'px'
    });

    if (i === 0) {
      headerElt.addStyle('height', bound.height + 1 + 'px');
      headerViewport.addStyle('height', bound.height + 1 + 'px');
      rootCellElt.addStyle('height', bound.height + 1 + 'px');
      rootCellElt.addStyle('width', bound.width + 1 + 'px');
    }
  });
  var bound = this.tableData.$view.getBoundingClientRect();
  this.$header.addStyle('width', bound.width + 'px');
};

TableEditor.prototype.loadIndexCol = function () {
  this.$indexCol.clearChild();
  this.$indexColRows = this.tableData.bodyRow.concat([this.tableData.newRow]).map(function (row) {
    var trElt = $(row.elt.cloneNode(false));
    trElt.$originElt = row.elt;
    var tdElt = $(row.elt.firstChild.cloneNode(true));
    tdElt.$originElt = row.elt.firstChild;
    trElt.addChild(tdElt);
    return trElt;
  });
  var indexHeaderElt = $(this.tableData.$headRow.firstChild.cloneNode());
  indexHeaderElt.$originElt = this.tableData.$headRow.firstChild;

  var indexHeaderRowElt = _({
    tag: 'tr',
    child: indexHeaderElt
  });

  indexHeaderRowElt.$originElt = this.tableData.$headRow;
  this.$indexColRows.unshift(indexHeaderRowElt);
  this.$indexCol.addChild(this.$indexColRows);
  this.updateIndexColPosition();
};

TableEditor.prototype.updateIndexColPosition = function () {
  var indexViewportElt = this.$indexViewport;
  var indexColElt = this.$indexCol;
  this.$indexColRows.forEach(function (trElt, i) {
    var tdElt = trElt.firstChild;
    var bound = tdElt.$originElt.getBoundingClientRect();
    tdElt.addStyle('height', bound.height + 'px');

    if (i === 0) {
      indexViewportElt.addStyle('width', bound.width + 1 + 'px'); //1px is border

      indexColElt.addStyle('width', bound.width + 1 + 'px');
    }
  });
};

TableEditor.prototype.updateForegroundPosition = function () {
  this.$view.addStyle({
    '--body-scroll-width': this.$body.offsetWidth - this.$body.clientWidth + 'px',
    '--body-scroll-height': this.$body.offsetHeight - this.$body.clientHeight + 'px'
  });

  if (this.$body.scrollWidth > this.$body.clientWidth) {
    this.$view.addClass('as-overflow-x');
  } else {
    this.$view.removeClass('as-overflow-x');
  }
};

TableEditor.prototype.updateFixedTableEltPosition = function () {
  if (!this.tableData) return;
  var tableBound = this.tableData.getView().getBoundingClientRect();
  this.$view.addStyle({
    '--table-data-width': tableBound.width + 'px',
    '--table-data-height': tableBound.height + 'px'
  });
  this.updateForegroundPosition();
  this.updateHeaderPosition();
  this.updateIndexColPosition();
  this.updateEditingBoxPosition();
  this.updateSelectedPosition();
};

TableEditor.prototype.scrollIntoRow = function (row) {
  var headerBound = this.$header.getBoundingClientRect();
  var bBound = this.$foreground.getBoundingClientRect();
  var rowBound = row.elt.getBoundingClientRect();
  var vTop = headerBound.bottom;
  var vBottom = bBound.bottom;

  if (vBottom - vTop >= rowBound.height) {
    if (rowBound.bottom > vBottom) {
      this.$body.scrollTop += rowBound.bottom - vBottom;
    } else if (rowBound.top < vTop) {
      this.$body.scrollTop += rowBound.top - vTop;
    }
  } else {
    this.$body.scrollTop += rowBound.top + rowBound.height / 2 - (vBottom + vTop) / 2;
  }
};

TableEditor.prototype.scrollIntoCol = function (col) {
  var colBound = col.elt.getBoundingClientRect();
  var iBound = this.$indexCol.getBoundingClientRect();
  var bBound = this.$foreground.getBoundingClientRect();
  var vLeft = iBound.right;
  var vRight = bBound.right;

  if (vRight - vLeft >= colBound.width) {
    if (colBound.right > vRight) {
      this.$body.scrollLeft += colBound.right - vRight;
    } else if (colBound.left < vLeft) {
      this.$body.scrollLeft += colBound.left - vLeft;
    }
  } else {
    if (vLeft < colBound.left) {
      this.$body.scrollLeft += colBound.left - vLeft;
    } else if (vRight > colBound.right) {
      this.$body.scrollLeft += colBound.right - vRight;
    }
  }
};

TableEditor.prototype.ev_cellEditorFinish = function (event) {
  if (this.currentCellEditor === event.target) {
    this.editCellDelay(null);
  }
};

TableEditor.prototype.showError = function (title, message) {
  var toast = _Toast.default.make({
    props: {
      htitle: title,
      message: message,
      variant: 'error'
    }
  });

  setTimeout(toast.disappear.bind(toast), 2000);
};

TableEditor.prototype.optHandlers = {};
TableEditor.prototype.optHandlers.readOnly = {
  set: function (value) {
    if (value) {
      this.$view.addClass('asht-read-only');
    } else {
      this.$view.removeClass('asht-read-only');
    }

    _ResizeSystem.default.update();
  },
  get: function () {
    return this.$view.containsClass('asht-read-only');
  },
  descriptor: {
    type: 'bool'
  }
};
Object.defineProperty(TableEditor.prototype, 'records', {
  get: function () {
    return this.tableData && this.tableData.records;
  }
});
Object.defineProperty(TableEditor.prototype, 'fragment', {
  get: function () {
    return this.opt.fragment;
  },
  set: function (value) {
    this.opt.fragment = value;
  }
});
var _default = TableEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/cmds/SelectListEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/cmds/SelectListEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SelectListCmdDescriptors = exports.SelectListCmdTree = exports.default = void 0;
var SelectListCmd = {};

SelectListCmd.save = function () {
  setTimeout(function () {
    if (this.verify()) this.emit('save', {
      type: 'save',
      target: this
    }, this);
  }.bind(this), 100); //wait for complete saving
};

SelectListCmd.insertRowBefore = function () {
  this.insertRowBeforeCurrent();
};

SelectListCmd.insertRowAfter = function () {
  this.insertRowAfterCurrent();
};

SelectListCmd.removeCurrentRow = function () {
  this.removeCurrentRow();
};

var _default = SelectListCmd;
exports.default = _default;
var SelectListCmdTree = [['save'], ['insertRowBefore', 'insertRowAfter', 'removeCurrentRow']];
exports.SelectListCmdTree = SelectListCmdTree;
var SelectListCmdDescriptors = {
  save: {
    desc: 'Save',
    icon: 'span.mdi.mdi-content-save-move-outline'
  },
  insertRowBefore: {
    desc: 'Insert Row Before',
    icon: 'span.mdi.mdi-table-row-plus-before'
  },
  insertRowAfter: {
    desc: 'Insert Row After',
    icon: 'span.mdi.mdi-table-row-plus-after'
  },
  removeCurrentRow: {
    desc: 'Remove Current Row',
    icon: 'span.mdi.mdi-table-row-remove'
  }
};
exports.SelectListCmdDescriptors = SelectListCmdDescriptors;
};

moduleFactories["node_modules/absol-form/js/editor/SelectListEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/SelectListEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../core/FCore");

require("../../css/selectlisteditor.css");

var _TableEditor = _interopRequireDefault(require("absol-sheet/js/fragment/TableEditor"));

var _R = _interopRequireDefault(require("../R"));

var _SelectListEditorCmd = _interopRequireWildcard(require("../cmds/SelectListEditorCmd"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));




function SelectListEditor() {
  _BaseEditor.default.call(this);

  this.cmdRunner.assign(_SelectListEditorCmd.default);
  this.tableEditor = new _TableEditor.default();
  window.E = this;
}

_OOP.default.mixClass(SelectListEditor, _BaseEditor.default);

SelectListEditor.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    class: 'as-select-list-editor',
    child: [{
      class: 'as-select-list-editor-header',
      child: {
        class: 'as-select-list-editor-cmd-tool-container'
      }
    }, {
      class: 'as-select-list-editor-body',
      child: this.tableEditor.getView()
    }]
  });
  this.$header = (0, _FCore.$)('.as-select-list-editor-header', this.$view);
  this.$body = (0, _FCore.$)('.as-select-list-editor-body', this.$view);
  this.$cmdToolCtn = (0, _FCore.$)('.as-select-list-editor-cmd-tool-container', this.$view);
  this.$attachhook = (0, _FCore._)('attachhook').on('attached', function () {
    this.requestUpdateSize();

    _ResizeSystem.default.add(this);
  });
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$view.addChild(this.$attachhook);
};

SelectListEditor.prototype.updateSize = function () {
  this.$body.addStyle('top', this.$header.offsetHeight + 'px');
};

SelectListEditor.prototype.setData = function (data) {
  var valueType = 'string';

  for (var i = 0; i < data.length; i++) {
    if (typeof data[i].value === 'number') {
      valueType = 'number';
    }
  }

  var tableData = {
    propertyDescriptors: [{
      text: {
        text: 'Text',
        type: 'string'
      },
      value: {
        text: 'Value',
        type: valueType
      }
    }],
    propertyNames: ['text', 'value'],
    records: data.map(function (item) {
      return {
        text: item.text,
        value: item.value
      };
    })
  };
  this.tableEditor.setData(tableData);
};

SelectListEditor.prototype.getData = function (data) {
  return this.tableEditor.getData().records;
};

SelectListEditor.prototype.onAttached = function () {
  this.CMDTool = this.getContext(_R.default.CMD_TOOL);
};

SelectListEditor.prototype.onResume = function () {
  this.updateSize();
  this.CMDTool = this.getContext(_R.default.CMD_TOOL);

  if (this.CMDTool) {
    this.CMDTool.bindWithEditor(this);
    this.CMDTool.start();
  }
};

SelectListEditor.prototype.onPause = function () {
  if (this.CMDTool) {
    this.CMDTool.pause();
  }
};

SelectListEditor.prototype.insertRowAfterCurrent = function () {
  var cellEditor = this.tableEditor.currentCellEditor;

  if (cellEditor) {
    this.tableEditor.insertRow(cellEditor.row.idx + 1, {});
  } else {
    this.tableEditor.insertRow(cellEditor.records.length, {});
  }
};

SelectListEditor.prototype.insertRowBeforeCurrent = function () {
  var cellEditor = this.tableEditor.currentCellEditor;

  if (cellEditor) {
    this.tableEditor.insertRow(cellEditor.row.idx, {});
  } else {
    this.tableEditor.insertRow(0, {});
  }
};

SelectListEditor.prototype.removeCurrentRow = function () {
  var cellEditor = this.tableEditor.currentCellEditor;
  var rowIdx;
  var colIdx;

  if (cellEditor) {
    rowIdx = cellEditor.row.idx;
    colIdx = cellEditor.col.index;
  } else {
    rowIdx = this.tableEditor.records.length - 1;
    colIdx = 0;
  }

  if (rowIdx >= 0) {
    this.tableEditor.removeRow(rowIdx);
    rowIdx = Math.min(rowIdx, this.tableEditor.records.length - 1);

    if (rowIdx >= 0) {
      this.tableEditor.editCell(this.tableEditor.tableData.findRowByIndex(rowIdx), this.tableEditor.tableData.findColByIndex(colIdx));
    }
  }
};

SelectListEditor.prototype.verify = function () {
  var record;
  var records = this.tableEditor.records;
  var error = false;
  var dict = {};

  for (var i = 0; i < records.length; ++i) {
    record = records[i];

    if (typeof record.text !== "string" || record.text.length == 0) {
      error = 'Invalid data!';
      this.tableEditor.editCell(this.tableEditor.tableData.findRowByIndex(i), this.tableEditor.tableData.findColByIndex(0));
      break;
    }

    if (typeof record.value !== "string" || record.value.length == 0 || dict[record.value]) {
      if (typeof record.value !== "string" || record.value.length == 0) {
        error = 'Invalid data!';
      } else {
        error = 'Duplicate value!';
      }

      this.tableEditor.editCell(this.tableEditor.tableData.findRowByIndex(i), this.tableEditor.tableData.findColByIndex(1));
      break;
    }

    dict[record.value] = true;
  }

  if (error) {
    var errorToast = _Toast.default.make({
      props: {
        htitle: 'Error',
        message: error,
        variant: 'error'
      }
    });

    setTimeout(function () {
      errorToast.disappear();
    }, 3000);
  }

  return !error;
};

SelectListEditor.prototype.getCmdDescriptor = function (name) {
  var descriptor = _SelectListEditorCmd.SelectListCmdDescriptors[name];
  var res = Object.assign({
    type: 'trigger',
    desc: 'command: ' + name,
    icon: 'span.mdi.mdi-apple-keyboard-command',
    disabled: false
  }, descriptor);
  return res;
};

SelectListEditor.prototype.getCmdGroupTree = function () {
  return _SelectListEditorCmd.SelectListCmdTree;
};

SelectListEditor.prototype.getCmdToolCtn = function () {
  return this.$cmdToolCtn;
};

var _default = SelectListEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEBaseType.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEBaseType.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


/***
 *
 * @param {MultiObjectPropertyEditor} editor
 * @param {string} pName
 * @param {Object} descriptor
 * @param {AElement} cellElt
 * @constructor
 */
function PEBaseType(editor, pName, descriptor, cellElt) {
  this.editor = editor;
  this.cellElt = cellElt;
  this.pName = pName;
  this.descriptor = descriptor;
  this.attachInput();
  this.reload();
}

PEBaseType.prototype.attachInput = _noop.default;
PEBaseType.prototype.reload = _noop.default;

PEBaseType.prototype.renewDescriptor = function () {
  this.descriptor = Object.assign({}, this.editor.getPropertyDescriptor(this.editor.objects[0], this.pName)); //TODO: check permission

  var disabled = ['name', 'disembark', 'dataBinding', 'value', 'values', 'list', 'treeList', 'disabled', 'text', 'checked', 'textType'].indexOf(this.pName) >= 0 && this.editor.objects.some(function (obj) {
    return obj.attributes && obj.attributes.permissions && obj.attributes.permissions.edit_attributes === 'GENERATOR';
  });
  this.descriptor.disabled = this.descriptor.disabled || disabled;
  return this.descriptor;
};

PEBaseType.prototype.getValue = function () {
  return this.editor.getProperty.apply(this.editor, [this.editor.objects[0], this.pName].concat(Array.prototype.slice.call(arguments)));
};

PEBaseType.prototype.setValue = function (value) {
  this.editor.setPropertyAll.apply(this.editor, [this.pName, value].concat(Array.prototype.slice.call(arguments, 1)));
};

PEBaseType.prototype.notifyChange = function () {
  this.editor.notifyChange(this.pName, this);
};

PEBaseType.prototype.notifyStopChange = function () {
  this.editor.notifyStopChange(this.pName);
};

var _default = PEBaseType;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PEText() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEText, _PEBaseType.default);

PEText.prototype.reload = function () {
  this.renewDescriptor();
  this.$input.value = this.getValue();
  this.$input.disabled = this.descriptor.disabled;
};

PEText.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: this.descriptor.long ? 'textarea' : 'input',
    attr: {
      type: 'text'
    },
    on: {
      keyup: function () {
        self.setValue(this.value);
        self.notifyChange();
      },
      change: function () {
        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

var _default = PEText;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEUniqueText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEUniqueText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PEUniqueText() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEUniqueText, _PEBaseType.default);

PEUniqueText.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: this.descriptor.long ? 'textarea' : 'input',
    attr: {
      type: 'text'
    },
    on: {
      keyup: function () {
        self._verifyDuplicate();

        self.setValue(this.value);
        self.notifyChange();
      },
      change: function () {
        self._verifyDuplicate();

        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

PEUniqueText.prototype.reload = function () {
  this.renewDescriptor();
  this.$input.value = this.getValue();
  this.$input.disabled = !!this.descriptor.disabled;

  this._verifyDuplicate();
};

PEUniqueText.prototype._verifyDuplicate = function () {
  if (this.descriptor.others[this.$input.value]) {
    this.$input.addStyle('border-color', '#f99');
    this.$input.attr('title', 'This name is used!');
  } else {
    this.$input.attr('title', null);
    this.$input.removeStyle('border-color');
  }
};

var _default = PEUniqueText;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEColor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEColor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/***
 * @extends PEBaseType
 * @constructor
 */
function PEColor() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEColor, _PEBaseType.default);

PEColor.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: 'colorpickerbutton',
    on: {
      change: function (event) {
        self.setValue('#' + event.value.toHex8());
        self.notifyChange();
      },
      stopchange: function () {
        self.notifyStopChange();
      }
    },
    props: {
      value: 'transparent',
      mode: 'RGBA'
    }
  });
  this.cellElt.addChild(this.$input);
};

PEColor.prototype.reload = function () {
  this.$input.value = this.getValue() || 'transparent';
};

var _default = PEColor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEConst.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEConst.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/***
 * @extends PEBaseType
 * @constructor
 */
function PEConst() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEConst, _PEBaseType.default);

PEConst.prototype.attachInput = function () {
  var self = this;
  var value = this.descriptor.value;
  this.$input = (0, _FCore._)({
    tag: 'strong'
  });
  this.cellElt.addChild(this.$input);

  if (value && value.then) {
    value.then(function (value) {
      self.$input.addChild((0, _FCore._)({
        text: '' + value
      }));
    });
  } else {
    this.$input.addChild((0, _FCore._)({
      text: '' + value
    }));
  }
};

var _default = PEConst;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEEnum.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEEnum.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PEEnum() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEEnum, _PEBaseType.default);

PEEnum.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: 'selectmenu',
    props: {
      items: this.descriptor.values.map(function (value) {
        return {
          text: value + "",
          value: value
        };
      }),
      value: this.getValue()
    },
    on: {
      change: function () {
        self.setValue(this.value);
        self.notifyChange();
        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

PEEnum.prototype.reload = function () {
  var value = this.getValue();

  if (value !== this.$input.value) {
    this.$input.value = value;
  }
};

var _default = PEEnum;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEArrayOfText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEArrayOfText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _TokenField = _interopRequireDefault(require("absol-acomp/js/TokenField"));


/***
 * @extends PEBaseType
 * @constructor
 */
function PEArrayOfText() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEArrayOfText, _PEBaseType.default);

PEArrayOfText.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: _TokenField.default.tag,
    attr: {
      title: 'Each value is separated by ;'
    },
    props: {
      separator: ';',
      placeHolder: 'Enter item text, separated by ;'
    },
    on: {
      change: function () {
        self.setValue(this.items);
        self.notifyChange();
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

PEArrayOfText.prototype.reload = function () {
  this.renewDescriptor();
  this.$input.autocomplete = this.descriptor.autocomplete;
  this.$input.items = this.getValue();
};

var _default = PEArrayOfText;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEMeasureSize.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEMeasureSize.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PEMeasureSize() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEMeasureSize, _PEBaseType.default);

PEMeasureSize.prototype.attachInput = function () {
  var self = this;
  var units = this.descriptor.units || ['px', '%', 'match_parent', 'auto'];
  this.cellElt.addStyle('white-space', 'nowrap');
  this.$numberInput = (0, _FCore._)('numberinput').addStyle('margin-right', '5px');
  this.$typeSelect = (0, _FCore._)({
    tag: 'selectmenu',
    style: {
      verticalAlign: 'middle'
    },
    props: {
      items: units.map(function (unit) {
        return {
          text: unit,
          value: unit
        };
      })
    }
  });
  this.cellElt.addChild([this.$numberInput, this.$typeSelect]);
  this.$numberInput.on('change', function (event) {
    if (event.by === 'keyup') return;
    self.setValueFromInput();
    self.notifyChange();
    if (event.by !== 'long_press_button') self.notifyStopChange();
  }).on('stopchange', function () {
    self.setValueFromInput();
    self.notifyStopChange();
  });
  this.$typeSelect.on('change', function (event) {
    var cValue;

    switch (this.value) {
      case "px":
        cValue = self.getValue('px');
        self.$numberInput.value = cValue;
        break;

      case 'match_parent':
        cValue = '100%';
        self.$numberInput.value = 100;
        break;

      case '%':
        cValue = self.getValue('%');
        self.$numberInput.value = cValue;
        cValue += '%';
        break;

      case 'auto':
        self.$numberInput.value = self.getValue('px');
        cValue = 'auto';
        break;
    }

    self.setValue(cValue);
    self.$numberInput.disabled = this.value === 'match_parent' || this.value === 'auto';
    self.notifyChange();
    self.notifyStopChange();
  });
};

PEMeasureSize.prototype.reload = function () {
  var descriptor = this.renewDescriptor();
  this.$numberInput.disabled = !!descriptor.disabled;
  var value = this.getValue();

  if (typeof value === 'number') {
    this.$numberInput.value = value;
    this.$typeSelect.value = 'px';
  } else if (typeof value == 'string') {
    if (value.match(/%$/)) {
      this.$typeSelect.value = '%';
      this.$numberInput.value = parseFloat(value.replace('%', ''));
      this.$numberInput.disabled = false;
    } else if (value === 'match_parent' || value === 'auto') {
      this.$numberInput.disabled = true;
      this.$typeSelect.value = value;
    } else {
      console.error("Unknow typeof " + name, value);
    }
  }
};

PEMeasureSize.prototype.setValueFromInput = function () {
  switch (this.$typeSelect.value) {
    case '%':
      this.setValue(this.$numberInput.value + '%');
      break;

    case 'px':
      this.setValue(this.$numberInput.value);
      break;
  }
};

var _default = PEMeasureSize;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEMeasurePosition.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEMeasurePosition.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PEMeasurePosition() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEMeasurePosition, _PEBaseType.default);

PEMeasurePosition.prototype.attachInput = function () {
  var self = this;
  this.cellElt.addStyle('white-space', 'nowrap');
  this.$numberInput = (0, _FCore._)('numberinput').addStyle('margin-right', '5px');
  this.$typeSelect = (0, _FCore._)({
    tag: 'selectmenu',
    style: {
      verticalAlign: 'middle'
    },
    props: {
      items: [{
        text: 'px',
        value: 'px'
      }, {
        text: '%',
        value: '%'
      }]
    }
  });
  this.cellElt.addChild([this.$numberInput, this.$typeSelect]);
  this.$numberInput.on('change', function (event) {
    if (event.by === 'keyup') return;
    self.setValueFromInput();
    self.notifyChange();
    if (event.by !== 'long_press_button') self.notifyStopChange();
  }).on('stopchange', function () {
    self.setValueFromInput();
    self.notifyStopChange();
  });
  this.$typeSelect.on('change', function (event) {
    self.$numberInput.disabled = false;
    var value = self.getValue(this.value);
    self.$numberInput.value = value;

    if (this.value === '%') {
      self.setValue(value + '%');
    } else {
      self.setValue(value);
    }

    self.notifyChange();
    self.notifyStopChange();
  });
};

PEMeasurePosition.prototype.reload = function () {
  var descriptor = this.renewDescriptor();
  this.$numberInput.disabled = !!descriptor.disabled;
  var value;

  if (descriptor.disabled) {
    value = this.getValue(this.$typeSelect.value);
    this.$numberInput.value = value; //set-back

    if (this.$typeSelect.value === 'px') {
      this.setValue(value);
    } else if (this.$typeSelect.value === '%') {
      this.setValue(value + '%');
    }
  } else {
    value = this.getValue();

    if (typeof value === 'number') {
      this.$numberInput.value = value;
      this.$typeSelect.value = 'px';
    } else if (typeof value == 'string') {
      if (value.match(/%$/)) {
        this.$typeSelect.value = '%';
        this.$numberInput.value = parseFloat(value.replace('%', ''));
      } else {
        console.error("Unknow typeof " + name, value);
      }
    }
  }
};

PEMeasurePosition.prototype.setValueFromInput = function () {
  switch (this.$typeSelect.value) {
    case '%':
      this.setValue(this.$numberInput.value + '%');
      break;

    case 'px':
      this.setValue(this.$numberInput.value);
      break;
  }
};

var _default = PEMeasurePosition;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEFont.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEFont.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _GoogleFont = require("../../font/GoogleFont");

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/***
 * @extends PEBaseType
 * @constructor
 */
function PEFont() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEFont, _PEBaseType.default);

PEFont.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: 'selectmenu',
    class: 'as-need-update',
    props: {
      items: [{
        text: 'None',
        value: 'unset'
      }].concat(_GoogleFont.FONT_ITEMS),
      value: 'unset'
    },
    on: {
      change: function () {
        if (this.value === 'unset') self.setValue(undefined);else self.setValue(this.value);
        self.notifyChange();
        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

PEFont.prototype.reload = function () {
  var value = this.getValue() || 'unset';

  if (value !== this.$input.value) {
    this.$input.value = value;
  }
};

var _default = PEFont;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PETextAlign.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PETextAlign.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PETextAlign() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PETextAlign, _PEBaseType.default);

PETextAlign.prototype.icons = {
  left: 'mdi-format-align-left',
  right: 'mdi-format-align-right',
  center: 'mdi-format-align-center'
};

PETextAlign.prototype.attachInput = function () {
  var self = this;
  this.$button = (0, _FCore._)({
    tag: 'button',
    class: 'as-property-editor-text-align-input',
    child: 'span.mdi'
  });
  this.cellElt.addChild(this.$button);
  this.$icon = (0, _FCore.$)('span.mdi', this.$button);
  this._lastClass = this.icons[this.getValue()] || this.icons.left;

  _QuickMenu.default.toggleWhenClick(this.$button, {
    getMenuProps: function () {
      return {
        items: [{
          text: 'Left',
          icon: 'span.mdi.' + self.icons.left,
          menuData: 'left'
        }, {
          text: 'Center',
          icon: 'span.mdi.' + self.icons.center,
          menuData: 'center'
        }, {
          text: 'Right',
          icon: 'span.mdi.' + self.icons.right,
          menuData: 'right'
        }]
      };
    },
    onSelect: function (item) {
      var newIcon = self.icons[item.menuData];

      if (newIcon !== self._lastClass) {
        self.$icon.removeClass(self._lastClass).addClass(newIcon);
        self._lastClass = newIcon;
      }

      self.setValue(item.menuData);
      self.notifyStopChange();
    }
  });
};

PETextAlign.prototype.reload = function () {
  this.$icon.removeClass(this._lastClass).addClass(this.icons[this.getValue()] || this.icons.left);
};

var _default = PETextAlign;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEBoxAlign.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEBoxAlign.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _base = require("absol/src/Converter/base64");

var _FCore = require("../../core/FCore");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));


/***
 * @extends PEBaseType
 * @constructor
 */
function PEBoxAlign() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEBoxAlign, _PEBaseType.default);

PEBoxAlign.prototype.icons = {
  lefttop: 'm0 0v24h24v-24zm1 1h22v22h-22zm2 2h10.3v2h-10.3v-2m0 4h14v2h-14v-2m0 4h9.9v2h-9.9v-2',
  centertop: 'm24 24v-24h-24v24zm-1-1h-22v-22h22zm-6.05-18h-9.9v-2h9.9v2m2.05 4h-14v-2h14v2m-1.85 4h-10.3v-2h10.3v2',
  righttop: 'm24 0v24h-24v-24zm-1 1h-22v22h22zm-2 2h-10.3v2h10.3v-2m0 4h-14v2h14v-2m0 4h-9.9v2h9.9v-2',
  leftcenter: 'm0 24v-24h24v24zm1-1h22v-22h-22zm2-6h10.3v-2h-10.3v2m0-4h14v-2h-14v2m0-4h9.9v-2h-9.9v2',
  centercenter: 'm0 24v-24h24v24zm1-1h22v-22h-22zm6.05-14h9.9v-2h-9.9v2m-2.05 4h14v-2h-14v2m1.85 4h10.3v-2h-10.3v2',
  rightcenter: 'm24 24v-24h-24v24zm-1-1h-22v-22h22zm-2-6h-10.3v-2h10.3v2m0-4h-14v-2h14v2m0-4h-9.9v-2h9.9v2',
  leftbottom: 'm0 24v-24h24v24zm1-1h22v-22h-22zm2-2h10.3v-2h-10.3v2m0-4h14v-2h-14v2m0-4h9.9v-2h-9.9v2',
  centerbottom: 'm24 0v24h-24v-24zm-1 1h-22v22h22zm-6.05 18h-9.9v2h9.9v-2m2.05-4h-14v2h14v-2m-1.85-4h-10.3v2h10.3v-2',
  rightbottom: 'm24 24v-24h-24v24zm-1-1h-22v-22h22zm-2-2h-10.3v-2h10.3v2m0-4h-14v-2h14v2m0-4h-9.9v-2h9.9v2'
};

PEBoxAlign.prototype._makeIcon = function (name) {
  var path = this.icons[name];
  var data = '<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\
                    <path d="' + path + '" style="stroke-width:0"/>\
                </svg>';
  return (0, _FCore._)({
    tag: 'img',
    style: {
      'image-rendering': 'pixelated'
    },
    props: {
      src: 'data:image/svg+xml;base64,' + (0, _base.base64EncodeUnicode)(data)
    }
  });
};

PEBoxAlign.prototype.attachInput = function () {
  this.$button = (0, _FCore._)('button.as-property-editor-text-align-input');
  this.cellElt.addChild(this.$button);
  var self = this;

  _QuickMenu.default.toggleWhenClick(this.$button, {
    getMenuProps: function () {
      return {
        items: [{
          text: 'Left-Top',
          icon: self._makeIcon('lefttop'),
          menuData: 'lefttop'
        }, {
          text: 'Center-Top',
          icon: self._makeIcon('centertop'),
          menuData: 'centertop'
        }, {
          text: 'Right-Top',
          icon: self._makeIcon('righttop'),
          menuData: 'righttop'
        }, {
          text: 'Left-Center',
          icon: self._makeIcon('leftcenter'),
          menuData: 'leftcenter'
        }, {
          text: 'Center-Center',
          icon: self._makeIcon('centercenter'),
          menuData: 'centercenter'
        }, {
          text: 'Right-Center',
          icon: self._makeIcon('rightcenter'),
          menuData: 'rightcenter'
        }, {
          text: 'Left-Botttom',
          icon: self._makeIcon('leftbottom'),
          menuData: 'leftbottom'
        }, {
          text: 'Center-Botttom',
          icon: self._makeIcon('centerbottom'),
          menuData: 'centerbottom'
        }, {
          text: 'Right-Botttom',
          icon: self._makeIcon('rightbottom'),
          menuData: 'rightbottom'
        }]
      };
    },
    onSelect: function (item) {
      self.$button.clearChild().addChild(self._makeIcon(item.menuData));
      self.setValue(item.menuData);
      self.notifyStopChange();
    }
  });
};

PEBoxAlign.prototype.reload = function () {
  this.$button.clearChild().addChild(this._makeIcon(this.getValue() || 'lefttop'));
};

var _default = PEBoxAlign;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEBool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEBool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PEBool() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEBool, _PEBaseType.default);

PEBool.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: 'checkboxbutton',
    class: 'as-need-update',
    on: {
      change: function () {
        self.setValue(this.checked);
        self.notifyChange();
        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

PEBool.prototype.reload = function () {
  this.renewDescriptor();
  var value = this.getValue() || false;

  if (value !== this.$input.checked) {
    this.$input.checked = value;
  }

  this.$input.disabled = this.descriptor.disabled;
};

var _default = PEBool;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PENumber.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PENumber.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _utils = require("absol-acomp/js/utils");


/***
 * @extends PEBaseType
 * @constructor
 */
function PENumber() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PENumber, _PEBaseType.default);

PENumber.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: 'numberinput',
    class: 'as-need-update',
    style: {
      width: '120px'
    },
    props: {
      value: 0
    },
    on: {
      change: function (event) {
        if (event.by === 'keyup') return;
        if (!self.descriptor.livePreview && event.by === 'long_press_button') return;
        self.setValue(this.value);
        self.notifyChange();
        if (event.by !== 'long_press_button') self.notifyStopChange();
      }
    }
  });
  this.$null = (0, _FCore._)({
    tag: 'checkbox',
    style: {
      marginLeft: '5px'
    },
    props: {
      checked: false,
      text: 'null'
    },
    on: {
      change: function () {
        self.renewDescriptor();

        if (this.checked) {
          self.$input.disabled = true;
          self.setValue(null);
        } else {
          self.$input.disabled = false;
          self.$input.value = self.descriptor.defaultValue;
          self.setValue(self.descriptor.defaultValue);
        }

        self.notifyChange();
        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$input).addChild(this.$null);
};

PENumber.prototype.reload = function () {
  this.renewDescriptor();
  if (typeof this.descriptor.floatFixed === "number") this.$input.floatFixed = this.descriptor.floatFixed;
  this.$input.min = (0, _utils.isRealNumber)(this.descriptor.min) ? this.descriptor.min : -Infinity;
  this.$input.max = (0, _utils.isRealNumber)(this.descriptor.max) ? this.descriptor.max : Infinity;
  var value = this.getValue();

  if (this.descriptor.nullable) {
    this.$null.removeStyle('display');

    if (!(0, _utils.isRealNumber)(value)) {
      this.$input.value = (0, _utils.isRealNumber)(this.descriptor.defaultValue) ? this.descriptor.defaultValue : 0;
      this.$input.disabled = true;
      this.$null.checked = true;
    } else {
      this.$input.disabled = !!this.descriptor.disabled;
      this.$null.checked = false;
      this.$input.value = value;
    }
  } else {
    this.$null.addStyle('display', 'none');

    if (!(0, _utils.isRealNumber)(value)) {
      this.$input.value = 0;
    } else {
      this.$input.value = value;
    }

    this.$input.disabled = this.descriptor.disabled;
  }
};

var _default = PENumber;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEFragmentClass.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEFragmentClass.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _Assembler = require("../../core/Assembler");


/***
 * @extends PEBaseType
 * @constructor
 */
function PEFragmentClass() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEFragmentClass, _PEBaseType.default);

PEFragmentClass.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: 'selectmenu',
    on: {
      change: function () {
        if (this.value === 'null') self.setValue(null);else self.setValue(this.value);
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

PEFragmentClass.prototype.reload = function () {
  var constructors = _Assembler.AssemblerInstance.classes["FRAGMENT"];
  var items = Object.keys(constructors).map(function (key) {
    var cst = constructors[key];
    var cstName = cst.prototype.displayName || cst.prototype.contentViewData && cst.prototype.contentViewData.attributes && cst.prototype.contentViewData.attributes.name || cst.prototype.name || cst.prototype.tag;
    return {
      text: cstName,
      value: key
    };
  });
  items.unshift({
    text: "none",
    value: 'null',
    extendStyle: {
      "color": "#aaa"
    }
  });
  var value = this.getValue() || 'null';
  this.$input.items = items;
  this.$input.value = value;
};

var _default = PEFragmentClass;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PESelectList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PESelectList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _R = _interopRequireDefault(require("../../R"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _SelectListEditor = _interopRequireDefault(require("../../editor/SelectListEditor"));

var _FCore = require("../../core/FCore");

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));


/***
 * @extends PEBaseType
 * @constructor
 */
function PESelectList() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PESelectList, _PEBaseType.default);

PESelectList.prototype.attachInput = function () {
  this.$input = (0, _FCore._)({
    tag: 'button',
    class: 'as-from-tool-button',
    child: 'span.mdi.mdi-table-edit',
    on: {
      click: this.openTabForEditing.bind(this)
    }
  });
  this.cellElt.addChild(this.$input);
};

PESelectList.prototype.openTabForEditing = function () {
  var self = this;
  var listData = this.getValue();
  /**
   * @type {FormEditor}
   */

  var formEditor = this.editor.getContext(_R.default.FORM_EDITOR);
  if (!formEditor) return;
  this._objects = this.editor.objects.slice();
  var object = this._objects[this._objects.length - 1];
  object.__objectIdent__ = object.__objectIdent__ || 'layout_' + (Math.random() * 10000 >> 0);
  var selectListTabIdent = object.__objectIdent__ + '_selectList_' + name;
  var selectListEditor;
  var editorTabHolder = formEditor.getEditorHolderByIdent(selectListTabIdent);
  if (editorTabHolder) selectListEditor = editorTabHolder.editor;

  if (!selectListEditor) {
    selectListEditor = new _SelectListEditor.default();
    selectListEditor.attach(self.editor);
    var tabName = self.editor.getProperty(object, 'name') + '(' + self.pName + ')';
    var desc = 'SelectList';
    formEditor.openEditorTab(selectListTabIdent, tabName, desc, selectListEditor, {
      layoutEditor: this
    });
  } else {
    editorTabHolder.tabframe.requestActive();
  }

  selectListEditor.setData(listData);
  selectListEditor.on('save', function () {
    listData = this.getData();
    self.setValue(listData);
  });
};

PESelectList.prototype._verifyObjectList = function () {
  var currentObjects = this.editor.objects;

  var res = this._objects.every(function (obj, i) {
    return obj === currentObjects[i];
  });

  if (!res) {
    var toast = _Toast.default.make({
      props: {
        htitle: "Error",
        message: "Invalid object!"
      }
    });

    setTimeout(toast.disappear.bind(toast), 2000);
  }

  return res;
};

var _default = PESelectList;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PELengthInPixel.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PELengthInPixel.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PELengthInPixel() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PELengthInPixel, _PEBaseType.default);

PELengthInPixel.prototype.attachInput = function () {
  var self = this;
  this.cellElt.addStyle('white-space', 'nowrap');
  this.$numberInput = (0, _FCore._)('numberinput').addStyle('margin-right', '5px');
  this.$unsetCBx = (0, _FCore._)({
    tag: 'checkbox',
    props: {
      text: 'unset'
    },
    style: {
      verticalAlign: 'middle'
    }
  });
  this.cellElt.addChild([this.$numberInput, this.$unsetCBx]);
  this.$numberInput.on('change', function (event) {
    if (event.by === 'keyup') return;
    self.setValue(this.value);
    self.notifyChange();
    if (event.by !== 'long_press_button') self.notifyStopChange();
  }).on('stopchange', function () {
    self.setValueFromInput();
    self.notifyStopChange();
  });
  this.$unsetCBx.on('change', function () {
    if (this.checked) {
      self.$numberInput.disabled = true;
      self.setValue(null);
    } else {
      self.$numberInput.disabled = false;
      self.setValue(512);
    }
  });
};

PELengthInPixel.prototype.reload = function () {
  var descriptor = this.renewDescriptor();
  this.$numberInput.disabled = !!descriptor.disabled;
  this.$unsetCBx.disabled = !!descriptor.disabled;
  var value = this.getValue();

  if (value > 0 && value < Infinity) {
    this.$numberInput.value = value;
    this.$unsetCBx.checked = false;
  } else {
    this.$numberInput.value = 512;
    this.$unsetCBx.checked = true;
    this.$numberInput.disabled = false;
  }
};

var _default = PELengthInPixel;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/font/MaterialDesignIcons.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/font/MaterialDesignIcons.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.getMaterialDesignIconNames = getMaterialDesignIconNames;
exports.getMaterialDesignLinkElt = getMaterialDesignLinkElt;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _XHR = _interopRequireDefault(require("absol/src/Network/XHR"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var loadFontPromise = _Dom.default.documentReady.then(function () {
  var linkElts = document.getElementsByTagName('link');
  var linkElt;

  for (var i = 0; i < linkElts.length; ++i) {
    linkElt = linkElts[i];

    if (linkElt.href && linkElt.href.indexOf('materialdesignicons') >= 0) {
      break;
    }
  }

  return _XHR.default.getRequest(linkElt.href, 'text').then(function (text) {
    var regex = /\.mdi-([^:]+)::before/g;
    var iconNames = [];
    var iconNameMatch;

    do {
      iconNameMatch = regex.exec(text);
      if (iconNameMatch) iconNames.push(iconNameMatch[1]);
    } while (iconNameMatch);

    return {
      iconNames: iconNames
    };
  });
});

function getMaterialDesignIconNames() {
  return loadFontPromise.then(function (data) {
    return data.iconNames;
  });
}

;

function getMaterialDesignLinkElt() {
  var linkElts = document.getElementsByTagName('link');
  var linkElt;

  for (var i = 0; i < linkElts.length; ++i) {
    linkElt = linkElts[i];
    if (linkElt.href && linkElt.href.indexOf('materialdesignicons') >= 0) return linkElt;
  }
}
};

moduleFactories["node_modules/absol-form/js/font/GoogleMaterialIcons.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/font/GoogleMaterialIcons.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.GOOGLE_MATERIAL_ICON_NAMES = void 0;
var GOOGLE_MATERIAL_ICON_NAMES = ["backup", "3d_rotation", "accessibility", "accessibility_new", "accessible", "accessible_forward", "account_balance", "account_balance_wallet", "account_box", "account_circle", "add_shopping_cart", "alarm", "alarm_add", "alarm_off", "alarm_on", "all_inbox", "all_out", "android", "announcement", "arrow_right_alt", "aspect_ratio", "assessment", "assignment", "assignment_ind", "assignment_late", "assignment_return", "assignment_returned", "assignment_turned_in", "autorenew", "backup", "book", "bookmark", "bookmark_border", "bookmarks", "bug_report", "build", "cached", "calendar_today", "calendar_view_day", "camera_enhance", "cancel_schedule_send", "card_giftcard", "card_membership", "card_travel", "change_history", "check_circle", "check_circle_outline", "chrome_reader_mode", "class", "code", "commute", "compare_arrows", "contact_support", "contactless", "copyright", "credit_card", "dashboard", "date_range", "delete", "delete_forever", "delete_outline", "description", "dns", "done", "done_all", "done_outline", "donut_large", "donut_small", "drag_indicator", "eco", "eject", "euro_symbol", "event", "event_seat", "exit_to_app", "explore", "explore_off", "extension", "face", "favorite", "favorite_border", "feedback", "find_in_page", "find_replace", "fingerprint", "flight_land", "flight_takeoff", "flip_to_back", "flip_to_front", "g_translate", "gavel", "get_app", "gif", "grade", "group_work", "help", "help_outline", "highlight_off", "history", "home", "horizontal_split", "hourglass_empty", "hourglass_full", "http", "https", "important_devices", "info", "input", "invert_colors", "label", "label_important", "label_off", "language", "launch", "line_style", "line_weight", "list", "lock", "lock_open", "loyalty", "markunread_mailbox", "maximize", "minimize", "motorcycle", "note_add", "offline_bolt", "offline_pin", "opacity", "open_in_browser", "open_in_new", "open_with", "pageview", "pan_tool", "payment", "perm_camera_mic", "perm_contact_calendar", "perm_data_setting", "perm_device_information", "perm_identity", "perm_media", "perm_phone_msg", "perm_scan_wifi", "pets", "picture_in_picture", "picture_in_picture_alt", "play_for_work", "polymer", "power_settings_new", "pregnant_woman", "print", "query_builder", "question_answer", "receipt", "record_voice_over", "redeem", "remove_shopping_cart", "reorder", "report_problem", "restore", "restore_from_trash", "restore_page", "room", "rounded_corner", "rowing", "schedule", "search", "settings_applications", "settings_backup_restore", "settings_bluetooth", "settings_brightness", "settings_cell", "settings_ethernet", "settings_input_antenna", "settings_input_component", "settings_input_composite", "settings_input_hdmi", "settings_input_svideo", "settings_overscan", "settings_phone", "settings_power", "settings_remote", "settings_voice", "shop", "shop_two", "shopping_basket", "shopping_cart", "speaker_notes", "speaker_notes_off", "spellcheck", "stars", "store", "subject", "supervised_user_circle", "supervisor_account", "swap_horiz", "swap_horizontal_circle", "swap_vert", "swap_vertical_circle", "sync_alt", "system_update_alt", "tab", "tab_unselected", "text_rotate_up", "text_rotate_vertical", "text_rotation_angledown", "text_rotation_angleup", "text_rotation_down", "text_rotation_none", "theaters", "thumb_down", "thumb_up", "thumbs_up_down", "timeline", "toc", "today", "toll", "touch_app", "track_changes", "translate", "trending_down", "trending_flat", "trending_up", "turned_in", "turned_in_not", "update", "verified_user", "vertical_split", "view_agenda", "view_array", "view_carousel", "view_column", "view_day", "view_headline", "view_list", "view_module", "view_quilt", "view_stream", "view_week", "visibility", "visibility_off", "voice_over_off", "watch_later", "work", "work_off", "work_outline", "youtube_searched_for", "zoom_in", "zoom_out", "add_alert", "error", "error_outline", "notification_important", "warning", "4k", "add_to_queue", "airplay", "album", "art_track", "av_timer", "branding_watermark", "call_to_action", "closed_caption", "control_camera", "equalizer", "explicit", "fast_forward", "fast_rewind", "featured_play_list", "featured_video", "fiber_dvr", "fiber_manual_record", "fiber_new", "fiber_pin", "fiber_smart_record", "forward_10", "forward_30", "forward_5", "games", "hd", "hearing", "high_quality", "library_add", "library_books", "library_music", "loop", "mic", "mic_none", "mic_off", "missed_video_call", "movie", "music_video", "new_releases", "not_interested", "note", "pause", "pause_circle_filled", "pause_circle_outline", "play_arrow", "play_circle_filled", "play_circle_outline", "playlist_add", "playlist_add_check", "playlist_play", "queue", "queue_music", "queue_play_next", "radio", "recent_actors", "remove_from_queue", "repeat", "repeat_one", "replay", "replay_10", "replay_30", "replay_5", "shuffle", "skip_next", "skip_previous", "slow_motion_video", "snooze", "sort_by_alpha", "speed", "stop", "subscriptions", "subtitles", "surround_sound", "video_call", "video_label", "video_library", "videocam", "videocam_off", "volume_down", "volume_mute", "volume_off", "volume_up", "web", "web_asset", "business", "call", "call_end", "call_made", "call_merge", "call_missed", "call_missed_outgoing", "call_received", "call_split", "cancel_presentation", "chat", "chat_bubble", "chat_bubble_outline", "clear_all", "comment", "contact_mail", "contact_phone", "contacts", "desktop_access_disabled", "dialer_sip", "dialpad", "domain_disabled", "duo", "email", "forum", "import_contacts", "import_export", "invert_colors_off", "list_alt", "live_help", "mail_outline", "message", "mobile_screen_share", "no_sim", "pause_presentation", "person_add_disabled", "phone", "phone_disabled", "phone_enabled", "phonelink_erase", "phonelink_lock", "phonelink_ring", "phonelink_setup", "portable_wifi_off", "present_to_all", "print_disabled", "ring_volume", "rss_feed", "screen_share", "sentiment_satisfied_alt", "speaker_phone", "stay_current_landscape", "stay_current_portrait", "stay_primary_landscape", "stay_primary_portrait", "stop_screen_share", "swap_calls", "textsms", "unsubscribe", "voicemail", "vpn_key", "add", "add_box", "add_circle", "add_circle_outline", "amp_stories", "archive", "backspace", "ballot", "block", "clear", "create", "delete_sweep", "drafts", "dynamic_feed", "file_copy", "filter_list", "flag", "font_download", "forward", "gesture", "how_to_reg", "how_to_vote", "inbox", "link", "link_off", "low_priority", "mail", "markunread", "move_to_inbox", "next_week", "outlined_flag", "policy", "redo", "remove", "remove_circle", "remove_circle_outline", "reply", "reply_all", "report", "report_off", "save", "save_alt", "select_all", "send", "sort", "square_foot", "text_format", "unarchive", "undo", "waves", "where_to_vote", "access_alarm", "access_alarms", "access_time", "add_alarm", "add_to_home_screen", "airplanemode_active", "airplanemode_inactive", "battery_alert", "battery_charging_full", "battery_full", "battery_std", "battery_unknown", "bluetooth", "bluetooth_connected", "bluetooth_disabled", "bluetooth_searching", "brightness_auto", "brightness_high", "brightness_low", "brightness_medium", "data_usage", "developer_mode", "devices", "dvr", "gps_fixed", "gps_not_fixed", "gps_off", "graphic_eq", "location_disabled", "location_searching", "mobile_friendly", "mobile_off", "nfc", "screen_lock_landscape", "screen_lock_portrait", "screen_lock_rotation", "screen_rotation", "sd_storage", "settings_system_daydream", "signal_cellular_4_bar", "signal_cellular_alt", "signal_cellular_connected_no_internet_4_bar", "signal_cellular_no_sim", "signal_cellular_null", "signal_cellular_off", "signal_wifi_4_bar", "signal_wifi_4_bar_lock", "signal_wifi_off", "storage", "usb", "wallpaper", "widgets", "wifi_lock", "wifi_tethering", "add_comment", "attach_file", "attach_money", "bar_chart", "border_all", "border_bottom", "border_clear", "border_horizontal", "border_inner", "border_left", "border_outer", "border_right", "border_style", "border_top", "border_vertical", "bubble_chart", "drag_handle", "format_align_center", "format_align_justify", "format_align_left", "format_align_right", "format_bold", "format_clear", "format_color_reset", "format_indent_decrease", "format_indent_increase", "format_italic", "format_line_spacing", "format_list_bulleted", "format_list_numbered", "format_list_numbered_rtl", "format_paint", "format_quote", "format_shapes", "format_size", "format_strikethrough", "format_textdirection_l_to_r", "format_textdirection_r_to_l", "format_underlined", "functions", "height", "highlight", "insert_chart", "insert_chart_outlined", "insert_comment", "insert_drive_file", "insert_emoticon", "insert_invitation", "insert_link", "insert_photo", "linear_scale", "merge_type", "mode_comment", "monetization_on", "money_off", "multiline_chart", "notes", "pie_chart", "post_add", "publish", "scatter_plot", "score", "short_text", "show_chart", "space_bar", "strikethrough_s", "table_chart", "text_fields", "title", "vertical_align_bottom", "vertical_align_center", "vertical_align_top", "wrap_text", "attachment", "cloud", "cloud_circle", "cloud_done", "cloud_download", "cloud_off", "cloud_queue", "cloud_upload", "create_new_folder", "folder", "folder_open", "folder_shared", "cast", "cast_connected", "computer", "desktop_mac", "desktop_windows", "developer_board", "device_hub", "device_unknown", "devices_other", "dock", "gamepad", "headset", "headset_mic", "keyboard", "keyboard_arrow_down", "keyboard_arrow_left", "keyboard_arrow_right", "keyboard_arrow_up", "keyboard_backspace", "keyboard_capslock", "keyboard_hide", "keyboard_return", "keyboard_tab", "keyboard_voice", "laptop", "laptop_chromebook", "laptop_mac", "laptop_windows", "memory", "mouse", "phone_android", "phone_iphone", "phonelink", "phonelink_off", "power_input", "router", "scanner", "security", "sim_card", "smartphone", "speaker", "speaker_group", "tablet", "tablet_android", "tablet_mac", "toys", "tv", "videogame_asset", "watch", "add_a_photo", "add_photo_alternate", "add_to_photos", "adjust", "assistant", "assistant_photo", "audiotrack", "blur_circular", "blur_linear", "blur_off", "blur_on", "brightness_1", "brightness_2", "brightness_3", "brightness_4", "brightness_5", "brightness_6", "brightness_7", "broken_image", "brush", "burst_mode", "camera", "camera_alt", "camera_front", "camera_rear", "camera_roll", "center_focus_strong", "center_focus_weak", "collections", "collections_bookmark", "color_lens", "colorize", "compare", "control_point", "control_point_duplicate", "crop", "crop_16_9", "crop_3_2", "crop_5_4", "crop_7_5", "crop_din", "crop_free", "crop_landscape", "crop_original", "crop_portrait", "crop_rotate", "crop_square", "dehaze", "details", "edit", "euro", "exposure", "exposure_neg_1", "exposure_neg_2", "exposure_plus_1", "exposure_plus_2", "exposure_zero", "filter", "filter_1", "filter_2", "filter_3", "filter_4", "filter_5", "filter_6", "filter_7", "filter_8", "filter_9", "filter_9_plus", "filter_b_and_w", "filter_center_focus", "filter_drama", "filter_frames", "filter_hdr", "filter_none", "filter_tilt_shift", "filter_vintage", "flare", "flash_auto", "flash_off", "flash_on", "flip", "flip_camera_android", "flip_camera_ios", "gradient", "grain", "grid_off", "grid_on", "hdr_off", "hdr_on", "hdr_strong", "hdr_weak", "healing", "image", "image_aspect_ratio", "image_search", "iso", "landscape", "leak_add", "leak_remove", "lens", "linked_camera", "looks", "looks_3", "looks_4", "looks_5", "looks_6", "looks_one", "looks_two", "loupe", "monochrome_photos", "movie_creation", "movie_filter", "music_note", "music_off", "nature", "nature_people", "navigate_before", "navigate_next", "palette", "panorama", "panorama_fish_eye", "panorama_horizontal", "panorama_vertical", "panorama_wide_angle", "photo", "photo_album", "photo_camera", "photo_filter", "photo_library", "photo_size_select_actual", "photo_size_select_large", "photo_size_select_small", "picture_as_pdf", "portrait", "remove_red_eye", "rotate_90_degrees_ccw", "rotate_left", "rotate_right", "shutter_speed", "slideshow", "straighten", "style", "switch_camera", "switch_video", "tag_faces", "texture", "timelapse", "timer", "timer_10", "timer_3", "timer_off", "tonality", "transform", "tune", "view_comfy", "view_compact", "vignette", "wb_auto", "wb_cloudy", "wb_incandescent", "wb_iridescent", "wb_sunny", "360", "atm", "beenhere", "category", "compass_calibration", "departure_board", "directions", "directions_bike", "directions_boat", "directions_bus", "directions_car", "directions_railway", "directions_run", "directions_subway", "directions_transit", "directions_walk", "edit_attributes", "ev_station", "fastfood", "flight", "hotel", "layers", "layers_clear", "local_activity", "local_airport", "local_atm", "local_bar", "local_cafe", "local_car_wash", "local_convenience_store", "local_dining", "local_drink", "local_florist", "local_gas_station", "local_grocery_store", "local_hospital", "local_hotel", "local_laundry_service", "local_library", "local_mall", "local_movies", "local_offer", "local_parking", "local_pharmacy", "local_phone", "local_pizza", "local_play", "local_post_office", "local_printshop", "local_see", "local_shipping", "local_taxi", "map", "menu_book", "money", "museum", "my_location", "navigation", "near_me", "person_pin", "rate_review", "restaurant", "restaurant_menu", "satellite", "store_mall_directory", "streetview", "subway", "terrain", "traffic", "train", "tram", "transfer_within_a_station", "transit_enterexit", "trip_origin", "zoom_out_map", "apps", "arrow_back", "arrow_back_ios", "arrow_downward", "arrow_drop_down", "arrow_drop_down_circle", "arrow_drop_up", "arrow_forward", "arrow_forward_ios", "arrow_left", "arrow_right", "arrow_upward", "cancel", "check", "chevron_left", "chevron_right", "close", "double_arrow", "expand_less", "expand_more", "first_page", "fullscreen", "fullscreen_exit", "home_work", "last_page", "menu", "menu_open", "more_horiz", "more_vert", "refresh", "subdirectory_arrow_left", "subdirectory_arrow_right", "unfold_less", "unfold_more", "account_tree", "adb", "airline_seat_flat", "airline_seat_flat_angled", "airline_seat_individual_suite", "airline_seat_legroom_extra", "airline_seat_legroom_normal", "airline_seat_legroom_reduced", "airline_seat_recline_extra", "airline_seat_recline_normal", "bluetooth_audio", "confirmation_number", "disc_full", "drive_eta", "enhanced_encryption", "event_available", "event_busy", "event_note", "folder_special", "live_tv", "mms", "more", "network_check", "network_locked", "no_encryption", "ondemand_video", "personal_video", "phone_bluetooth_speaker", "phone_callback", "phone_forwarded", "phone_in_talk", "phone_locked", "phone_missed", "phone_paused", "power", "power_off", "priority_high", "sd_card", "sms", "sms_failed", "sync", "sync_disabled", "sync_problem", "system_update", "tap_and_play", "time_to_leave", "tv_off", "vibration", "voice_chat", "vpn_lock", "wc", "wifi", "wifi_off", "ac_unit", "airport_shuttle", "all_inclusive", "apartment", "bathtub", "beach_access", "business_center", "casino", "child_care", "child_friendly", "fitness_center", "free_breakfast", "golf_course", "hot_tub", "house", "kitchen", "meeting_room", "no_meeting_room", "pool", "room_service", "rv_hookup", "smoke_free", "smoking_rooms", "spa", "storefront", "cake", "deck", "emoji_emotions", "emoji_events", "emoji_flags", "emoji_food_beverage", "emoji_nature", "emoji_objects", "emoji_people", "emoji_symbols", "emoji_transportation", "fireplace", "group", "group_add", "king_bed", "location_city", "mood", "mood_bad", "nights_stay", "notifications", "notifications_active", "notifications_none", "notifications_off", "notifications_paused", "outdoor_grill", "pages", "party_mode", "people", "people_alt", "people_outline", "person", "person_add", "person_outline", "plus_one", "poll", "public", "school", "sentiment_dissatisfied", "sentiment_satisfied", "sentiment_very_dissatisfied", "sentiment_very_satisfied", "share", "single_bed", "sports", "sports_baseball", "sports_basketball", "sports_cricket", "sports_esports", "sports_football", "sports_golf", "sports_handball", "sports_hockey", "sports_kabaddi", "sports_mma", "sports_motorsports", "sports_rugby", "sports_soccer", "sports_tennis", "sports_volleyball", "thumb_down_alt", "thumb_up_alt", "whatshot", "check_box", "check_box_outline_blank", "indeterminate_check_box", "radio_button_checked", "radio_button_unchecked", "star", "star_border", "star_half", "toggle_off", "toggle_on"];
exports.GOOGLE_MATERIAL_ICON_NAMES = GOOGLE_MATERIAL_ICON_NAMES;
};

moduleFactories["node_modules/absol-form/js/dom/FontIconPicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/FontIconPicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/fonticonpicker.css");

var _stringMatching = require("absol/src/String/stringMatching");

var _MaterialDesignIcons = require("../font/MaterialDesignIcons");

var _GoogleMaterialIcons = require("../font/GoogleMaterialIcons");


var _ = _FCore.default._;
var $ = _FCore.default.$;

function FontIconPicker() {
  var self = this;
  this._fontIndex = 0;
  this._viewingFontIndex = -1;
  this.$searchInput = $('searchtextinput', this).on('stoptyping', this.search.bind(this));
  this.$selectFont = $('.as-font-icon-picker-select-font', this).on('change', this.updateContent.bind(this));
  this.$option = $('.as-font-icon-picker-option', this);
  this.$materialDesignContent = $('.as-font-icon-picker-content.as-font-icon-picker-material-design-icons', this);
  this.$googleMaterialContent = $('.as-font-icon-picker-content.as-font-icon-picker-google-material-icons', this);
  this.$mdiButtons = [];
  this.$googleMaterialIconButtons = [];
  this.on('click', this.eventHandler.clickContent);
  this.$activeButtons = {};
  this.$buttonList = {};
  (0, _MaterialDesignIcons.getMaterialDesignIconNames)().then(function (result) {
    var button;

    for (var i = 0; i < result.length; ++i) {
      button = _({
        tag: 'button',
        class: 'as-font-icon-picker-icon',
        child: 'span.mdi.mdi-' + result[i],
        attr: {
          title: result[i]
        },
        props: {
          __keywods__: result[i].split(/[\-\_\s]+/),
          __data__: 'span.mdi.mdi-' + result[i]
        }
      }).addTo(self.$materialDesignContent);
      self.$mdiButtons.push(button);
      self.$buttonList[button.__data__] = button;
    }
  });

  _GoogleMaterialIcons.GOOGLE_MATERIAL_ICON_NAMES.forEach(function (name) {
    var button = _({
      tag: 'button',
      class: 'as-font-icon-picker-icon',
      attr: {
        title: name
      },
      props: {
        __keywods__: name.split(/[\-\_\s]+/),
        __data__: '<i class="material-icons">' + name + '</i>'
      },
      child: {
        tag: 'i',
        class: 'material-icons',
        child: {
          text: name
        }
      }
    }).addTo(self.$googleMaterialContent);

    self.$googleMaterialIconButtons.push(button);
    self.$buttonList[button.__data__] = button;
  });

  this.updateContent();
  this.$noneBtn = $('button.none-icon', this);
  this.$noneBtn.__data__ = null;
  this.$noneBtn.on('click', this.eventHandler.clickContent);
}

FontIconPicker.render = function () {
  return _({
    extendEvent: 'clickicon',
    class: 'as-font-icon-picker',
    child: ['searchtextinput', {
      tag: 'selectmenu',
      class: 'as-font-icon-picker-select-font',
      props: {
        items: [{
          text: 'Material Design Icons',
          value: 0
        }, {
          text: 'Google Material Icons',
          value: 1
        }]
      },
      value: 0
    }, {
      tag: 'button',
      class: ['as-font-icon-picker-icon', 'none-icon'],
      attr: {
        title: 'None'
      },
      style: {
        height: '2em',
        verticalAlign: 'top'
      },
      child: {
        tag: 'span',
        style: {
          fontSize: '1em'
        },
        child: {
          text: 'None'
        }
      }
    }, {
      tag: 'bscroller',
      class: ['as-font-icon-picker-content', 'as-font-icon-picker-material-design-icons']
    }, {
      tag: 'bscroller',
      class: ['as-font-icon-picker-content', 'as-font-icon-picker-google-material-icons']
    }]
  });
};

FontIconPicker.eventHandler = {};

FontIconPicker.eventHandler.clickContent = function (event) {
  var target = event.target;

  while (target !== this && target) {
    if (target.containsClass('as-font-icon-picker-icon')) break;
    target = target.parentNode;
  }

  if (target && target.containsClass('as-font-icon-picker-icon')) {
    this.emit('clickicon', {
      type: 'clickicon',
      value: target.__data__,
      originEvent: event,
      target: this
    }, this);
  }
};

FontIconPicker.prototype.selectValues = function () {
  for (var name in this.$activeButtons) {
    this.$activeButtons[name].removeClass('as-font-icon-picker-selected');
  }

  this.$activeButtons = {};
  var button;

  for (var i = 0; i < arguments.length; ++i) {
    button = this.$buttonList[arguments[i]];

    if (button) {
      this.$activeButtons[arguments[i]] = button;
      button.addClass('as-font-icon-picker-selected');
    }
  }
};

FontIconPicker.prototype.updateContent = function () {
  this._fontIndex = this.$selectFont.value;
  if (this._fontIndex == 0) this.showMaterialDesignIcons();else if (this._fontIndex == 1) this.showGoogleMaterialIcons();
};

FontIconPicker.prototype.showMaterialDesignIcons = function () {
  this._fontIndex = 0;
  if (this._viewingFontIndex == 0) return;
  this._viewingFontIndex = 0;
  this.$materialDesignContent.removeStyle('display');
  this.$googleMaterialContent.addStyle('display', 'none');
  this.search();
};

FontIconPicker.prototype.showGoogleMaterialIcons = function () {
  this._fontIndex = 1;
  if (this._viewingFontIndex == 1) return;
  this._viewingFontIndex = 1;
  this.$materialDesignContent.addStyle('display', 'none');
  this.$googleMaterialContent.removeStyle('display');
  this.search();
};

FontIconPicker.prototype.search = function () {
  var keyword = this.$searchInput.value.trim().split(/[\-\_\s]+/).filter(function (w) {
    return !!w;
  });
  var viewList = this._fontIndex == 0 ? this.$mdiButtons : this.$googleMaterialIconButtons;
  var contentElt = this._fontIndex == 0 ? this.$materialDesignContent : this.$googleMaterialContent;

  if (keyword.length > 0) {
    var list = viewList.map(function (button) {
      return {
        elt: button,
        value: (0, _stringMatching.wordsMatch)(keyword, button.__keywods__)
      };
    });
    list.sort(function (a, b) {
      return b.value - a.value;
    });
    var minValue = list[0].value;
    var maxValue = list[list.length - 1].value;
    var midValue = (minValue * 2 + maxValue) / 3;
    list = list.filter(function (item) {
      return item.value > midValue;
    });
    viewList = list.map(function (item) {
      return item.elt;
    });
  }

  contentElt.clearChild();
  viewList.forEach(function (elt) {
    elt.addTo(contentElt);
  });
};

_FCore.default.install('fonticonpicker', FontIconPicker);

var _default = FontIconPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/FontIconInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/FontIconInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("./FontIconPicker");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));


var _ = _FCore.default._;
var $ = _FCore.default.$;
/***
 * @extends AElement
 * @constructor
 */

function FontIconInput() {
  this.on('click', this.eventHandler.click);
}

FontIconInput.tag = 'FontIconInput'.toLowerCase();
FontIconInput.eventHandler = {};

FontIconInput.eventHandler.click = function (event) {
  this.togglePicker();
};

FontIconInput.eventHandler.clickIcon = function (event) {
  this.value = event.value;
  this.emit('change', {
    type: 'change',
    value: event.value,
    target: this,
    originEvent: event.originEvent || event
  }, this);
  this.closePicker();
};

FontIconInput.prototype.share = {
  $follower: null,
  $picker: null,
  $holder: null
};

FontIconInput.eventHandler.clickBody = function (event) {
  if (_EventEmitter.default.hitElement(this, event) || _EventEmitter.default.hitElement(this.share.$picker, event)) return;
  this.closePicker();
};

FontIconInput.prototype.togglePicker = function () {
  if (this.containsClass('as-font-icon-selecting')) {
    this.closePicker();
  } else {
    this.openPicker();
  }
};

FontIconInput.prototype.openPicker = function () {
  this.prepare();

  if (this.share.$holder) {
    this.share.$holder.closePicker();
  }

  this.share.$holder = this;
  this.addClass('as-font-icon-selecting');
  this.share.$picker.on('clickicon', this.eventHandler.clickIcon);
  this.share.$follower.addTo(document.body);
  this.share.$follower.followTarget = this;
  $(document.body).on('click', this.eventHandler.clickBody);
  this.share.$picker.selectValues(this.value);
};

FontIconInput.prototype.closePicker = function () {
  this.removeClass('as-font-icon-selecting');
  document.body.off('click', this.eventHandler.clickBody);
  this.share.$picker.off('clickicon', this.eventHandler.clickIcon);

  if (this.share.$holder === this) {
    this.share.$holder = null;
    this.share.$follower.remove();
  }
};

FontIconInput.prototype.prepare = function () {
  if (!this.share.$picker) {
    this.share.$follower = _('follower.as-font-icon-follower');
    this.share.$picker = _('fonticonpicker').addTo(this.share.$follower);
  }
};

FontIconInput.render = function () {
  return _({
    tag: 'button',
    extendEvent: 'change',
    class: 'as-font-icon-input'
  });
};

FontIconInput.property = {};
FontIconInput.property.value = {
  set: function (value) {
    this.clearChild();
    this._value = value;

    if (this._value) {
      this.addChild(_(value));
    } else {
      this.addChild(_('<span></span>'));
    }
  },
  get: function () {
    return this._value;
  }
};

_FCore.default.install(FontIconInput);

var _default = FontIconInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEIcon.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEIcon.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _FontIconInput = _interopRequireDefault(require("../../dom/FontIconInput"));


/***
 * @extends PEBaseType
 * @constructor
 */
function PEIcon() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEIcon, _PEBaseType.default);

PEIcon.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: _FontIconInput.default.tag,
    props: {},
    on: {
      change: function () {
        self.setValue(this.value);
        self.notifyChange();
        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

PEIcon.prototype.reload = function () {
  var value = this.getValue();

  if (value !== this.$input.value) {
    this.$input.value = value;
  }
};

var _default = PEIcon;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEPermission.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEPermission.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");


/***
 * @extends PEBaseType
 * @constructor
 */
function PEPermission() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PEPermission, _PEBaseType.default);

PEPermission.prototype.attachInput = function () {
  var self = this;
  this.$lock = (0, _FCore._)({
    tag: 'button',
    class: 'as-from-tool-button',
    style: {
      color: 'rgb(190, 190, 192)'
    },
    child: 'span.mdi.mdi-lock-open-variant-outline',
    on: {
      click: function () {
        var per = Object.assign({}, self.getValue() || {});

        if (per.owner === 'system') {
          delete per.owner;
        } else {
          per.owner = 'system';
        }

        self.setValue(per);
        self.reload();
        self.notifyChange();
        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$lock);
};

PEPermission.prototype.reload = function () {
  this.renewDescriptor();
  var value = this.getValue();

  if (value && value.owner === 'system') {
    this.$lock.addStyle('color', 'red');
    this.$lock.firstChild.removeClass('mdi-lock-open-variant-outline').addClass('mdi-lock-outline');
  } else {
    this.$lock.addStyle('color', 'rgb(190, 190, 192)');
    this.$lock.firstChild.addClass('mdi-lock-open-variant-outline').removeClass('mdi-lock-outline');
  }
};

var _default = PEPermission;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/types/PEDate.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/types/PEDate.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PEBaseType = _interopRequireDefault(require("./PEBaseType"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _utils = require("absol-acomp/js/utils");


/***
 * @extends PEBaseType
 * @constructor
 */
function PENumber() {
  _PEBaseType.default.apply(this, arguments);
}

_OOP.default.mixClass(PENumber, _PEBaseType.default);

PENumber.prototype.attachInput = function () {
  var self = this;
  this.$input = (0, _FCore._)({
    tag: 'dateinput',
    class: 'as-need-update',
    style: {
      width: '120px'
    },
    props: {},
    on: {
      change: function (event) {
        self.setValue(this.value);
        self.notifyChange();
        self.notifyStopChange();
      }
    }
  });
  this.cellElt.addChild(this.$input);
};

PENumber.prototype.reload = function () {
  this.renewDescriptor();
  var value = this.getValue();
  this.$input.value = value;
};

var _default = PENumber;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/MultiObjectPropertyEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/MultiObjectPropertyEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _stringFormat = require("absol/src/String/stringFormat");

var _GoogleFont = require("../font/GoogleFont");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _base = require("absol/src/Converter/base64");

var _R = _interopRequireDefault(require("../R"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _SelectListEditor = _interopRequireDefault(require("../editor/SelectListEditor"));

var _TokenField = _interopRequireDefault(require("absol-acomp/js/TokenField"));

var _Assembler = require("../core/Assembler");

var _PEText = _interopRequireDefault(require("./types/PEText"));

var _PEUniqueText = _interopRequireDefault(require("./types/PEUniqueText"));

var _PEColor = _interopRequireDefault(require("./types/PEColor"));

var _PEConst = _interopRequireDefault(require("./types/PEConst"));

var _PEEnum = _interopRequireDefault(require("./types/PEEnum"));

var _PEArrayOfText = _interopRequireDefault(require("./types/PEArrayOfText"));

var _PEMeasureSize = _interopRequireDefault(require("./types/PEMeasureSize"));

var _PEMeasurePosition = _interopRequireDefault(require("./types/PEMeasurePosition"));

var _PEFont = _interopRequireDefault(require("./types/PEFont"));

var _PETextAlign = _interopRequireDefault(require("./types/PETextAlign"));

var _PEBoxAlign = _interopRequireDefault(require("./types/PEBoxAlign"));

var _PEBool = _interopRequireDefault(require("./types/PEBool"));

var _PENumber = _interopRequireDefault(require("./types/PENumber"));

var _PEFragmentClass = _interopRequireDefault(require("./types/PEFragmentClass"));

var _PESelectList = _interopRequireDefault(require("./types/PESelectList"));

var _PELengthInPixel = _interopRequireDefault(require("./types/PELengthInPixel"));

var _PEIcon = _interopRequireDefault(require("./types/PEIcon"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _PEPermission = _interopRequireDefault(require("./types/PEPermission"));

var _PEDate = _interopRequireDefault(require("./types/PEDate"));


var _ = _FCore.default._;
var $ = _FCore.default.$;

function MultiObjectPropertyEditor() {
  _Context.default.call(this);

  _EventEmitter.default.call(this);

  this.dependents = {};
  this.propertyHolders = {};
  /**
   * @type {Array<import('../core/BaseComponent').default>}
   */

  this.objects = null;
  this.propertyNames = [];
  this.queuePools = {};
}

Object.defineProperties(MultiObjectPropertyEditor.prototype, Object.getOwnPropertyDescriptors(_Context.default.prototype));
Object.defineProperties(MultiObjectPropertyEditor.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
MultiObjectPropertyEditor.prototype.constructor = MultiObjectPropertyEditor;
MultiObjectPropertyEditor.prototype.pools = {};
MultiObjectPropertyEditor.prototype.type2EditorClass = {
  text: _PEText.default,
  string: _PEText.default,
  uniqueText: _PEUniqueText.default,
  color: _PEColor.default,
  'const': _PEConst.default,
  'enum': _PEEnum.default,
  arrayOfText: _PEArrayOfText.default,
  measureSize: _PEMeasureSize.default,
  measurePosition: _PEMeasurePosition.default,
  font: _PEFont.default,
  textAlign: _PETextAlign.default,
  boxAlign: _PEBoxAlign.default,
  bool: _PEBool.default,
  boolean: _PEBool.default,
  number: _PENumber.default,
  fragmentClass: _PEFragmentClass.default,
  SelectList: _PESelectList.default,
  LengthInPixel: _PELengthInPixel.default,
  icon: _PEIcon.default,
  Permission: _PEPermission.default,
  date: _PEDate.default
};

MultiObjectPropertyEditor.prototype.getPropertyNames = function (object) {
  return Object.keys(object);
};

MultiObjectPropertyEditor.prototype.getProperty = function (object, name) {
  return object[name];
};

MultiObjectPropertyEditor.prototype.setProperty = function (object, name, value) {
  return object[name] = value;
};

MultiObjectPropertyEditor.prototype.setPropertyAll = function () {
  for (var i = 0; i < this.objects.length; ++i) this.setProperty.apply(this, [this.objects[i]].concat(Array.prototype.slice.call(arguments)));
};

MultiObjectPropertyEditor.prototype.getPropertyDescriptor = function (object, name) {
  return {
    type: typeof object[name]
  };
};

MultiObjectPropertyEditor.prototype.edit = function () {
  this.objects = Array.prototype.slice.call(arguments);
  this.loadAttributes();
};

MultiObjectPropertyEditor.prototype.loadAttributes = function () {
  this.flushAllToPools();
  this.$body.clearChild();
  this.clearAllDependents();
  var self = this;
  var objects = this.objects;
  if (objects.length <= 0) return;
  var availablePropertyNames = objects.reduce(function (ac, obj) {
    var ret = {};
    var propNames = self.getPropertyNames(obj);
    var name;

    for (var i = 0; i < propNames.length; ++i) {
      name = propNames[i];

      if (ac === null || typeof ac[name] == 'number') {
        ret[name] = Math.max(i, ret[name] || 0);
      }
    }

    return ret;
  }, null);
  var names = Object.keys(availablePropertyNames);
  names.sort(function (a, b) {
    return availablePropertyNames[a] - availablePropertyNames[b];
  });
  var editableNames = names.filter(function (name) {
    var descriptor;
    var lastSign = null;
    if (objects.length === 1) return true;

    for (var i = 0; i < objects.length; ++i) {
      descriptor = self.getPropertyDescriptor(objects[i], name);
      if (!descriptor.independence) return false;

      if (lastSign === null) {
        lastSign = descriptor.sign;
      } else if (lastSign !== descriptor.sign) {
        return false;
      }
    }

    return true;
  });
  this.propertyNames = editableNames;
  this.propertyHolders = {};
  var object = objects[objects.length - 1];
  this.propertyNames.forEach(function (name) {
    var descriptor = self.getPropertyDescriptor(object, name) || {
      type: "NoDescriptor"
    };
    var displayName = descriptor.displayName || name;
    if (descriptor.hidden) return;
    var EditorClass = self.type2EditorClass[descriptor.type];
    var functionName = 'load' + (0, _stringFormat.camelCaseToPascalCase)(descriptor.type) + 'Property';

    var cell = _('td');

    if (descriptor.dependency) {// self.addDependents(name, descriptor.dependency);
    }

    if (!self[functionName]) {
      // throw new Error('Not support type' + descriptor.type + '!')
      functionName = 'loadNotSupportedProperty';
    }

    var rowElt = _({
      tag: 'tr',
      child: [{
        tag: 'td',
        child: {
          text: displayName
        }
      }, cell]
    });

    rowElt.addTo(self.$body);

    if (descriptor.dependency) {
      self.addDependents(name, descriptor.dependency);
    }

    if (EditorClass) {
      self.propertyHolders[name] = new EditorClass(self, name, descriptor, cell);
    } else {
      self.propertyHolders[name] = self[functionName](name, descriptor, cell, cell);
    }
  });

  _ResizeSystem.default.update();
};

MultiObjectPropertyEditor.prototype.flushAllToPools = function () {
  var self = this;
  Object.keys(this.queuePools).forEach(function (key) {
    self.pools[key] = self.pools[key] === undefined ? [] : self.pools[key];
    var all = self.queuePools[key].splice(0);
    self.pools[key].push.apply(self.pools[key], all);
  });
};

MultiObjectPropertyEditor.prototype.assignToPool = function (key, value) {
  this.queuePools[key] = this.queuePools[key] === undefined ? [] : this.queuePools[key];

  if (value.__pool_assign__) {
    console.warn("Pool: reassign object", key, value);
  } else {
    value.__pool_assign__ = true;
    this.queuePools[key].push(value);
  }
};

MultiObjectPropertyEditor.prototype.putOnceFromPool = function (key) {
  var res = null;

  if (this.pools[key] && this.pools[key].length > 0) {
    res = this.pools[key].pop();
  }

  if (res) res.__pool_assign__ = false;
  return res;
};

MultiObjectPropertyEditor.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = _({
    class: 'as-property-editor',
    child: {
      tag: 'table',
      class: 'as-basic-table',
      child: [{
        tag: 'thead',
        child: [{
          tag: 'tr',
          child: [{
            tag: 'td',
            child: {
              text: "key"
            }
          }, {
            tag: 'td',
            attr: {
              colspan: '3'
            },
            child: {
              text: 'value'
            }
          }]
        }]
      }, {
        tag: 'tbody'
      }]
    }
  });
  this.$body = $('tbody', this.$view);
  return this.$view;
};

MultiObjectPropertyEditor.prototype.loadNotSupportedProperty = function (name, descriptor, cell, cellElt) {
  cellElt.addChild(_({
    text: 'Not supported '
  })).addChild(_({
    tag: 'strong',
    child: {
      text: descriptor.type
    }
  }));
  return {};
};

MultiObjectPropertyEditor.prototype.clearAllDependents = function () {
  for (var key in this.dependents) delete this.dependents[key];
};
/**
 * @param {String} propertyName
 * @param {Array<String>} dependencyProperties
 */


MultiObjectPropertyEditor.prototype.addDependents = function (propertyName, dependencyProperties) {
  var dependencyProperty;

  for (var i = 0; i < dependencyProperties.length; ++i) {
    dependencyProperty = dependencyProperties[i];
    this.dependents[dependencyProperty] = this.dependents[dependencyProperty] || {};
    this.dependents[dependencyProperty][propertyName] = true;
  }
};

MultiObjectPropertyEditor.prototype.updateDependentsOf = function (name, excludes) {
  excludes = excludes || {};
  excludes[name] = true;

  for (var dependentPropertyName in this.dependents[name]) {
    if (!excludes[dependentPropertyName] && this.propertyHolders[dependentPropertyName]) {
      excludes[dependentPropertyName] = true;

      if (this.propertyHolders[dependentPropertyName].requestUpdate) {
        this.propertyHolders[dependentPropertyName].requestUpdate();
      } else if (this.propertyHolders[dependentPropertyName].reload) {
        this.propertyHolders[dependentPropertyName].reload();
      }

      this.updateDependentsOf(dependentPropertyName, excludes);
    }
  }
};

MultiObjectPropertyEditor.prototype.updatePropertyRecursive = function (name) {
  if (!this.propertyHolders[name]) return;
  if (this.propertyHolders[name].requestUpdate) this.propertyHolders[name].requestUpdate();else if (this.propertyHolders[name].reload) {
    this.propertyHolders[name].reload();
  }
  this.updateDependentsOf(name);
};

MultiObjectPropertyEditor.prototype.notifyChange = function (name, from) {
  this.updateDependentsOf(name);
  this.emit('change', {
    type: 'change',
    target: this,
    from: from,
    name: name,
    objects: this.objects
  }, this);
};

MultiObjectPropertyEditor.prototype.notifyStopChange = function (name) {
  this.emit('stopchange', {
    type: 'stopchange',
    name: name,
    objects: this.objects
  }, this);
};

MultiObjectPropertyEditor.prototype.getBound = function () {
  var bound = this.$body.getBoundingClientRect();
  return {
    width: bound.width + 15,
    height: bound.height + 24 + 24 + 10
  };
};

var _default = MultiObjectPropertyEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/AttributeEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/AttributeEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _MultiObjectPropertyEditor = _interopRequireDefault(require("../propertyeditors/MultiObjectPropertyEditor"));


function AttributeEditor() {
  _MultiObjectPropertyEditor.default.call(this);
}

Object.defineProperties(AttributeEditor.prototype, Object.getOwnPropertyDescriptors(_MultiObjectPropertyEditor.default.prototype));
_MultiObjectPropertyEditor.default.prototype.constructor = AttributeEditor;

AttributeEditor.prototype.setProperty = function (object, name, value) {
  return object.setAttribute(name, value);
};

AttributeEditor.prototype.getProperty = function (object, name) {
  return object.getAttribute(name);
};

AttributeEditor.prototype.getPropertyDescriptor = function (object, name) {
  return object.getAttributeDescriptor(name);
};

AttributeEditor.prototype.getPropertyNames = function (object) {
  return object.getAcceptsAttributeNames();
};

var _default = AttributeEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/StyleEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/StyleEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _MultiObjectPropertyEditor = _interopRequireDefault(require("../propertyeditors/MultiObjectPropertyEditor"));


function StyleEditor() {
  _MultiObjectPropertyEditor.default.call(this);
}

Object.defineProperties(StyleEditor.prototype, Object.getOwnPropertyDescriptors(_MultiObjectPropertyEditor.default.prototype));
StyleEditor.prototype.constructor = StyleEditor;

StyleEditor.prototype.setProperty = function (object, name, value) {
  return object.setStyle(name, value);
};

StyleEditor.prototype.getProperty = function (object) {
  return object.getStyle.apply(object, Array.prototype.slice.call(arguments, 1));
};

StyleEditor.prototype.getPropertyDescriptor = function (object) {
  return object.getStyleDescriptor.apply(object, Array.prototype.slice.call(arguments, 1));
};

StyleEditor.prototype.getPropertyNames = function (object) {
  return object.getAcceptsStyleNames();
};

var _default = StyleEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/AllPropertyEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/AllPropertyEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _MultiObjectPropertyEditor = _interopRequireDefault(require("../propertyeditors/MultiObjectPropertyEditor"));

var _IndexedPropertyNames = _interopRequireDefault(require("../core/IndexedPropertyNames"));


function AllPropertyEditor() {
  _MultiObjectPropertyEditor.default.call(this);
}

Object.defineProperties(AllPropertyEditor.prototype, Object.getOwnPropertyDescriptors(_MultiObjectPropertyEditor.default.prototype));
AllPropertyEditor.prototype.constructor = AllPropertyEditor;

AllPropertyEditor.prototype.setProperty = function (object, name, value) {
  if (object.__AllPropertyEditorGroupName__.attributes[name]) return object.setAttribute(object.__AllPropertyEditorGroupName__.attributes[name], value);
  if (object.__AllPropertyEditorGroupName__.style[name]) return object.setStyle(object.__AllPropertyEditorGroupName__.style[name], value);
  throw new Error('not found ' + name);
};

AllPropertyEditor.prototype.getProperty = function (object, name) {
  if (object.__AllPropertyEditorGroupName__.attributes[name]) return object.getAttribute(object.__AllPropertyEditorGroupName__.attributes[name]);
  if (object.__AllPropertyEditorGroupName__.style[name]) return object.getStyle.apply(object, [object.__AllPropertyEditorGroupName__.style[name]].concat(Array.prototype.slice.call(arguments, 2)));
  throw new Error('not found ' + name);
};

AllPropertyEditor.prototype.getPropertyDescriptor = function (object, name) {
  if (object.__AllPropertyEditorGroupName__.attributes[name]) return object.getAttributeDescriptor(object.__AllPropertyEditorGroupName__.attributes[name]);
  if (object.__AllPropertyEditorGroupName__.style[name]) return object.getStyleDescriptor(object.__AllPropertyEditorGroupName__.style[name]);
  throw new Error('not found ' + name);
};

AllPropertyEditor.prototype.getPropertyNames = function (object) {
  var indexed = _IndexedPropertyNames.default;
  return Object.keys(object.__AllPropertyEditorGroupName__.attributes).concat(Object.keys(object.__AllPropertyEditorGroupName__.style)).sort(function (a, b) {
    return indexed[a] - indexed[b];
  });
};

AllPropertyEditor.prototype.edit = function () {
  if (this.objects) this.objects.forEach(function (object) {
    delete object.__AllPropertyEditorGroupName__;
  });
  Array.prototype.forEach.call(arguments, function (object) {
    object.__AllPropertyEditorGroupName__ = {};
    var attributes = object.getAcceptsAttributeNames();
    var style = object.getAcceptsStyleNames();
    object.__AllPropertyEditorGroupName__.attributes = attributes.reduce(function (ac, cr) {
      ac[cr] = cr;
      return ac;
    }, {});
    object.__AllPropertyEditorGroupName__.style = style.reduce(function (ac, cr) {
      ac[cr] = cr;
      return ac;
    }, {});
    var key;

    for (key in object.__AllPropertyEditorGroupName__.attributes) {
      if (object.__AllPropertyEditorGroupName__.style[key]) {
        delete object.__AllPropertyEditorGroupName__.attributes[key];
        delete object.__AllPropertyEditorGroupName__.style[key];
        object.__AllPropertyEditorGroupName__.attributes[key + '(attribute)'] = key;
        object.__AllPropertyEditorGroupName__.style[key + '(style)'] = key;
      }
    }
  });
  return _MultiObjectPropertyEditor.default.prototype.edit.apply(this, arguments);
};

var _default = AllPropertyEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/ComponentPropertiesEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/ComponentPropertiesEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/componentpropertieseditor.css");

var _AttributeEditor = _interopRequireDefault(require("./AttributeEditor"));

var _R = _interopRequireDefault(require("../R"));

var _StyleEditor = _interopRequireDefault(require("./StyleEditor"));

var _AllPropertyEditor = _interopRequireDefault(require("./AllPropertyEditor"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


var _ = _FCore.default._;
var $ = _FCore.default.$;

function ComponentPropertiesEditor(editor) {
  _BaseEditor.default.call(this);

  this.editor = editor;
  var self = this;
  var repeatEvents = {
    change: function (event) {
      self.emit('change', Object.assign({
        componentPropertiesEditor: self
      }, event), self);
    },
    stopchange: function (event) {
      self.emit('stopchange', Object.assign({
        componentPropertiesEditor: self
      }, event), self);
    }
  };
  this.attributeEditor = new _AttributeEditor.default().on(repeatEvents).on('stopchange', function (event) {
    self.allPropertyEditor.updatePropertyRecursive(event.name);
  });
  this.styleEditor = new _StyleEditor.default().on(repeatEvents).on('stopchange', function (event) {
    self.allPropertyEditor.updatePropertyRecursive(event.name);
  });
  this.allPropertyEditor = new _AllPropertyEditor.default().on(repeatEvents).on('stopchange', function (event) {
    self.attributeEditor.updatePropertyRecursive(event.name);
    self.styleEditor.updatePropertyRecursive(event.name);
  });
  this.$dockElt = null;
  this.component = undefined;
}

Object.defineProperties(ComponentPropertiesEditor.prototype, Object.getOwnPropertyDescriptors(_BaseEditor.default.prototype));
ComponentPropertiesEditor.prototype.constructor = ComponentPropertiesEditor;
ComponentPropertiesEditor.prototype.CONFIG_STORE_KEY = "AS_ComponentPropertiesEditor_config";
ComponentPropertiesEditor.prototype.config = {};

ComponentPropertiesEditor.prototype.getView = function () {
  if (this.$view) return this.$view;
  var thisEditor = this;
  this.$attachhook = _('attachhook');
  this.$view = _({
    tag: 'tabview',
    class: ["as-form-component-properties-editor", 'xp-tiny'],
    child: [{
      tag: 'tabframe',
      class: 'absol-bscroller',
      attr: {
        name: 'Attribute'
      },
      child: this.attributeEditor.getView()
    }, {
      tag: 'tabframe',
      attr: {
        name: 'Style'
      },
      child: this.styleEditor.getView()
    }, {
      tag: 'tabframe',
      class: 'absol-bscroller',
      attr: {
        name: 'All'
      },
      child: this.allPropertyEditor.getView()
    }]
  });
  this.$view.appendChild(this.$attachhook);
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);

  _ResizeSystem.default.add(this.$attachhook);

  this.$quickmenuBtn = _({
    tag: 'button',
    class: ['as-form-component-properties-editor-quickmenu-button', 'as-from-tool-button'],
    child: 'span.mdi.mdi-dots-horizontal'
  });

  _QuickMenu.default.toggleWhenClick(this.$quickmenuBtn, {
    getMenuProps: function () {
      return {
        extendStyle: {
          'font-size': '12px'
        },
        items: [{
          text: 'Undock',
          icon: 'span.mdi.mdi-dock-window',
          cmd: 'undock'
        }, {
          text: 'Help',
          icon: 'span.mdi.mdi-help'
        }]
      };
    },
    onSelect: function (item) {
      switch (item.cmd) {
        case 'undock':
          break;
      }
    }
  });

  this.$view.appendChild(this.$quickmenuBtn);
  return this.$view;
};

ComponentPropertiesEditor.prototype.onAttached = function () {
  this.setContext(_R.default.ATTRIBUTE_EDITOR, this.attributeEditor);
  this.setContext(_R.default.STYLE_EDITOR, this.styleEditor);
  this.setContext(_R.default.ALL_PROPERTY_EDITOR, this.allPropertyEditor);
  this.attributeEditor.attach(this);
  this.styleEditor.attach(this);
  this.allPropertyEditor.attach(this);
};

ComponentPropertiesEditor.prototype.onStart = function () {
  this.getView();
  this.attributeEditor.start();
  this.styleEditor.start();
  this.allPropertyEditor.start();
};

ComponentPropertiesEditor.prototype.onDestroy = function () {
  this.attributeEditor.destroy();
  this.styleEditor.destroy();
  this.allPropertyEditor.destroy();
};

ComponentPropertiesEditor.prototype.onPause = function () {
  this.attributeEditor.pause();
  this.styleEditor.pause();
  this.allPropertyEditor.pause();
};

ComponentPropertiesEditor.prototype.onResume = function () {
  this.attributeEditor.resume();
  this.styleEditor.resume();
  this.allPropertyEditor.resume();
};

ComponentPropertiesEditor.prototype.edit = function () {
  this.component = arguments[0];
  this.components = Array.prototype.slice.call(arguments);
  this.styleEditor.edit.apply(this.styleEditor, arguments);
  this.attributeEditor.edit.apply(this.attributeEditor, arguments);
  this.allPropertyEditor.edit.apply(this.allPropertyEditor, arguments);
};

ComponentPropertiesEditor.prototype.updateSize = function () {
  var ateB = this.attributeEditor.getBound();
  var steB = this.styleEditor.getBound();
  var aleB = this.allPropertyEditor.getBound();
  var width = Math.max(ateB.width, steB.width, aleB.width);
  var height = Math.max(ateB.height, steB.height, aleB.height);

  if (width > 0 && height > 0) {
    this.$view.addStyle('min-width', Math.max(200, width) + 'px').addStyle('height', height + 'px');
  }

  this.$view.addStyle('max-height', '100%');
};

var _default = ComponentPropertiesEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/cmds/FormPreviewCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/cmds/FormPreviewCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.FormPreviewCmdDescriptors = exports.default = void 0;
var FormPreviewCmd = {
  reload: function () {
    this.refresh();
  }
};
var _default = FormPreviewCmd;
exports.default = _default;
var FormPreviewCmdDescriptors = {
  reload: {
    type: 'trigger',
    desc: "Reload",
    icon: 'span.mdi.mdi-reload'
  }
};
exports.FormPreviewCmdDescriptors = FormPreviewCmdDescriptors;
};

moduleFactories["node_modules/absol-form/js/fragment/CMDTool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/fragment/CMDTool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/cmdtool.css");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _RibbonButton = _interopRequireDefault(require("absol-acomp/js/RibbonButton"));


var _ = _FCore.default._;
var $ = _FCore.default.$;

function CMDTool() {
  _BaseEditor.default.call(this);

  this.$dockElt = null;
  this.cmdTree = [];
  this.$buttons = {}; // button dictionaryx

  this.$visiable = [];
  this.updateVisibility = this.updateVisibility.bind(this);
  this.refresh = this.refresh.bind(this);
}

_OOP.default.mixClass(CMDTool, _BaseEditor.default);

CMDTool.prototype.constructor = CMDTool;
CMDTool.prototype.CONFIG_STORE_KEY = "AS_CMDTool_config";
CMDTool.prototype.config = {};
/**
 * @param {import('../editor/editor').default} editor
 */

CMDTool.prototype.bindWithEditor = function (editor) {
  // this.updateVisibility is binded
  if (this.editor) {
    this.editor.off('cmddescriptorschange', this.updateVisibility);
    this.editor.off('cmdchange', this.refresh);
  }

  this.editor = editor;

  if (this.editor) {
    this.editor.on('cmdchange', this.refresh);
    this.editor.on("cmddescriptorschange", this.updateVisibility);
  }

  this.refresh();
};

CMDTool.prototype.onStart = function () {
  this.getView();
};

CMDTool.prototype.updateVisibility = function () {
  if (!this.editor) return;
  var self = this;
  Object.keys(this.$buttons).forEach(function (name) {
    var descriptor = self.editor.getCmdDescriptor(name);
    self.$buttons[name].descriptor = descriptor;
    self.$buttons[name].disabled = descriptor.disabled;

    if (descriptor.type === 'toggle_switch') {
      if (descriptor.checked) {
        self.$buttons[name].addClass('as-checked');
      } else {
        self.$buttons[name].removeClass('as-checked');
      }
    } else if (descriptor.type === 'ribbon') {
      self.$buttons[name].items = descriptor.items;
    }
  });
};

CMDTool.prototype.onResume = function () {
  this.updateVisibility();
};

CMDTool.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = _({
    tag: 'bscroller',
    class: "as-form-cmd-tool"
  });
  this.refresh();
  return this.$view;
};

CMDTool.prototype.refresh = function () {
  if (!this.editor) return;
  this.getView();
  this.$view.clearChild();
  this.$buttons = {};
  var groupTree = this.editor.getCmdGroupTree();
  var self = this;

  function visit(node) {
    if (node instanceof Array) {
      return _({
        class: 'as-from-tool-group-buttons',
        child: node.map(visit)
      });
    } else {
      self.$buttons[node] = self.makeCmdBtn(node);
      return self.$buttons[node];
    }
  }

  this.$view.addChild(visit(groupTree));
};

CMDTool.prototype.makeCmdBtn = function (name) {
  var descriptor = this.editor.getCmdDescriptor(name);

  switch (descriptor.type) {
    case 'trigger':
      return this.makeTriggerBtn(name, descriptor);

    case 'toggle_switch':
      return this.makeToggleSwitchBtn(name, descriptor);

    case 'ribbon':
      return this.makeRibbonBtn(name, descriptor);

    default:
      return this.makeTriggerBtn(name, descriptor);
  }
};

CMDTool.prototype.makeTriggerBtn = function (name, descriptor) {
  var title = descriptor.desc;
  var self = this;

  var btn = _({
    tag: 'button',
    class: ['as-from-tool-button', 'as-type-trigger'],
    attr: {
      title: title,
      'data-cmd-name': name
    },
    child: descriptor.icon,
    props: {
      disabled: !!descriptor.disabled,
      descriptor: descriptor
    },
    on: {
      click: function () {
        self.execCmd.apply(self, [name].concat(this.descriptor.args || []));
      }
    }
  });

  return btn;
};

CMDTool.prototype.makeRibbonBtn = function (name, descriptor) {
  var self = this;

  var btn = _({
    tag: _RibbonButton.default.tag,
    class: 'as-from-tool-ribbon-button',
    props: {
      icon: descriptor.icon || descriptor.items[0].icon,
      items: descriptor.items,
      descriptor: descriptor,
      disabled: !!descriptor.disabled
    },
    on: {
      select: function (event) {
        //select a item in menu
        var item = event.item;
        this.icon = item.icon;
        self.execCmd.apply(self, [name].concat(item.args || []).concat(this.descriptor.args || []));
      }
    }
  });

  return btn;
};

CMDTool.prototype.makeToggleSwitchBtn = function (name, descriptor) {
  var self = this;
  var title = descriptor.desc;

  var btn = _({
    tag: 'button',
    class: ['as-from-tool-button', 'as-type-toggle-switch'],
    attr: {
      title: title,
      'data-group': descriptor.group,
      "data-name": name
    },
    child: descriptor.icon,
    props: {
      disabled: !!descriptor.disabled,
      descriptor: descriptor
    },
    on: {
      click: function () {
        var newChecked = !this.hasClass('as-checked');
        if (newChecked && descriptor.group) Object.keys(self.$buttons).forEach(function (otherName) {
          var otherBtn = self.$buttons[otherName];
          if (otherName === name) return;

          if (otherBtn.hasClass('as-type-toggle-switch') && otherBtn.descriptor.group === descriptor.group && otherBtn.hasClass('as-checked')) {
            otherBtn.removeClass('as-checked');
            self.execCmd.apply(self, [otherBtn.attr('data-name'), false].concat(otherBtn.descriptor.args || []));
          }
        });

        if (newChecked) {
          this.addClass('as-checked');
        } else {
          this.removeClass('as-checked');
        }

        self.execCmd.apply(self, [name, newChecked].concat(descriptor.args || []));
      }
    }
  });

  if (descriptor.checked) btn.addClass('as-checked');
  return btn;
};

CMDTool.prototype.execCmd = function () {
  this.editor.execCmd.apply(this.editor, arguments);
};

CMDTool.prototype.ev_cmdKeyDown = function (event) {
  this.editor.ev_cmdKeyDown(event); //repeat event
};

var _default = CMDTool;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/FormPreview.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/FormPreview.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _Assembler = _interopRequireDefault(require("../core/Assembler"));

require("../../css/formpreview.css");

var _R = _interopRequireDefault(require("../R"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _FormPreviewCmd = _interopRequireWildcard(require("../cmds/FormPreviewCmd"));

var _FmFragment = require("../core/FmFragment");

var _CMDTool = _interopRequireDefault(require("../fragment/CMDTool"));




var _ = _FCore.default._;
var $ = _FCore.default.$;

function FormPreview() {
  _BaseEditor.default.call(this);

  _Assembler.default.call(this);

  this.cmdRunner.assign(_FormPreviewCmd.default);
  this.cmdTool = new _CMDTool.default();
  this.data = null;
  this.dataFlushed = true;
  this.cmdTool.bindWithEditor(this);
}

Object.defineProperties(FormPreview.prototype, Object.getOwnPropertyDescriptors(_BaseEditor.default.prototype));
Object.defineProperties(FormPreview.prototype, Object.getOwnPropertyDescriptors(_Assembler.default.prototype));
FormPreview.prototype.constructor = FormPreview;

FormPreview.prototype.onStart = function () {
  this.cmdTool.start();
};

FormPreview.prototype.onResume = function () {
  this.flushDataToView();
};

FormPreview.prototype.getView = function () {
  if (this.$view) return this.$view;
  var self = this;
  this.$view = _({
    tag: 'bscroller',
    class: 'as-form-preview',
    child: [{
      class: 'as-form-preview-size-setting',
      child: [{
        tag: 'span',
        child: {
          text: 'Size : '
        }
      }, {
        tag: 'input',
        class: 'as-input-width',
        props: {
          type: 'number',
          min: '0'
        },
        on: {
          change: this.ev_sizeInputChange.bind(this)
        }
      }, {
        tag: 'span',
        child: {
          text: ' x '
        }
      }, {
        tag: 'input',
        class: 'as-input-height',
        props: {
          type: 'number',
          min: '0'
        },
        on: {
          change: this.ev_sizeInputChange.bind(this)
        }
      }]
    }, {
      class: 'as-form-preview-content'
    }],
    on: {
      sizechange: this.ev_sizeChange.bind(this)
    }
  });
  this.$content = $('.as-form-preview-content', this.$view);
  this.$widthIp = $('input.as-input-width', this.$view);
  this.$heightIp = $('input.as-input-height', this.$view);
  this.refresh();
  return this.$view;
};

FormPreview.prototype.refresh = function () {
  var data;
  var editor = this.getContext(_R.default.LAYOUT_EDITOR);
  if (editor) data = editor.getData();
  if (data) this.setData(data);
};

FormPreview.prototype.ev_sizeChange = function (event) {
  _Dom.default.updateResizeSystem.bind(_Dom.default);

  var bound = this.$view.getBoundingClientRect();
  var contentBound = (this.$content.children.length > 0 ? this.$content.children[0] : this.$content).getBoundingClientRect();
  this.$content.addStyle({
    width: bound.width + 'px',
    height: bound.height - (contentBound.top - bound.top) + 'px'
  });
};

FormPreview.prototype.flushDataToView = function () {
  if (this.dataFlushed) return;
  this.dataFlushed = true; //TODO: remove older view

  if (!this.data) return;
  this.$content.clearChild();

  if (this.data && this.$view) {
    if (this.previewFrg) {
      this.previewFrg.stop();
      this.previewFrg.destroy();
    }

    this.PreviewClass = (0, _FmFragment.makeFmFragmentClass)({
      tag: 'preview',
      contentViewData: this.data
    });
    this.previewFrg = new this.PreviewClass();
    this.rootComponent = this.previewFrg.view;
    this.$content.addChild(this.rootComponent.domElt);
    this.$widthIp.value = this.rootComponent.getStyle('width', 'px');
    this.$heightIp.value = this.rootComponent.getStyle('height', 'px');
    this.previewFrg.start();
  }
};

FormPreview.prototype.setData = function (data) {
  this.data = data;
  this.data.tracking = "OK";
  this.dataFlushed = false;
  if (this.state == "RUNNING") this.flushDataToView();
};

FormPreview.prototype.getCmdNames = function () {
  return Object.keys(_FormPreviewCmd.default);
};

FormPreview.prototype.getCmdDescriptor = function (name) {
  var res = Object.assign({
    type: 'trigger',
    desc: 'command: ' + name,
    icon: 'span.mdi.mdi-apple-keyboard-command'
  }, _FormPreviewCmd.FormPreviewCmdDescriptors[name]);
  return res;
};

FormPreview.prototype.getCmdGroupTree = function () {
  return ['reload'];
};

FormPreview.prototype.ev_sizeInputChange = function () {
  var width = this.$widthIp.value;
  var height = this.$heightIp.value;

  if (this.rootComponent) {
    this.rootComponent.setStyle('width', width);
    this.rootComponent.setStyle('height', height);
  }
};

FormPreview.prototype.onStop = function () {
  if (this.previewFrg) {
    this.previewFrg.stop();
    this.previewFrg.destroy();
  }
};

var _default = FormPreview;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ClipboardManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ClipboardManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Broadcast = _interopRequireDefault(require("absol/src/Network/Broadcast"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _generator = require("absol/src/JSMaker/generator");


/**
 * Share bestween tab(same origin) use localStorage and BroardCast
 */
function ClipboardManager() {
  _EventEmitter.default.call(this);

  this.broadcast = new _Broadcast.default('formeditor_clipboard', (0, _stringGenerate.randomIdent)(20));
  var localDataText = localStorage.getItem(this.LOCAL_STORE_KEY);
  var localData;

  try {
    localData = (0, _generator.replaceDateStringJSVariable)(JSON.parse(localDataText || '{}'));
  } catch (error) {
    localData.data = {};
  }

  this.data = localData.data || {};
  this.broadcast.on('set', this.ev_BroadcastSet.bind(this));
}

;
Object.defineProperties(ClipboardManager.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
ClipboardManager.prototype.constructor = ClipboardManager;
ClipboardManager.prototype.LOCAL_STORE_KEY = 'AS_Form_ClipboardManager';

ClipboardManager.prototype.ev_BroadcastSet = function (key, value) {
  this.set(key, value, true);
};

ClipboardManager.prototype.set = function (key, value, isPrivate) {
  this.data[key] = value;
  this.emit('set', key, value, this);

  if (!isPrivate) {
    this.broadcast.emit('set', key, value);
    localStorage.setItem(this.LOCAL_STORE_KEY, JSON.stringify({
      data: this.data
    }));
  }
};

ClipboardManager.prototype.get = function (key) {
  return this.data[key];
};

var _default = new ClipboardManager();

exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/IdentTextInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/IdentTextInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../core/FCore"));

var _Text = require("absol/src/HTML5/Text");



/***
 * @augments HTMLInputElement
 * @augments AElement
 * @augments PreInput
 * @constructor
 */
function IdentTextInput() {
  this.on('keydown', this.eventHandler.identTextKeyDown).on('paste', this.applyData ? this.eventHandler.identTextPaste : this.eventHandler.identTextPaste1);
}

IdentTextInput.tag = 'IdentTextInput'.toLowerCase();

IdentTextInput.render = function () {
  return (0, _FCore._)('input[type="text"]');
};

IdentTextInput.eventHandler = {};

IdentTextInput.prototype.getSelectionStart = function () {
  var start = 0;

  if (this.getSelectPosition) {
    start = this.getSelectPosition().start;
  } else {
    if (this.selectionStart || this.selectionStart === 0) start = this.selectionStart;
  }

  return start;
};

IdentTextInput.prototype.getSelectionEnd = function () {
  var start = 0;

  if (this.getSelectPosition) {
    start = this.getSelectPosition().end;
  } else {
    if (this.selectionEnd || this.selectionEnd === 0) start = this.selectionEnd;
  }

  return start;
};

IdentTextInput.prototype._filterHistory = function () {
  if (!this.history) return;
  var temp = this.history.filter(function (t) {
    return !t.text.match(/(^[^a-zA-Z_$])|([^a-zA-Z$_0-9]+)/);
  });
  this.history.splice(0, this.history.length);
  this.history.push.apply(this.history, temp);
};

IdentTextInput.prototype._setNewText = function (text, caretPos) {
  this._filterHistory();

  if (typeof caretPos !== "number") caretPos = text.length;
  caretPos = Math.max(0, Math.min(text.length, caretPos >> 0));

  if (this.applyData) {
    this.applyData(text, {
      start: caretPos,
      end: caretPos,
      direction: 'forward'
    });
  } else {
    this.value = text;
    (0, _Text.setCaretPosition)(this, caretPos);
  }
};

IdentTextInput.eventHandler.identTextKeyDown = function (event) {
  var selectedPositionStart;
  var key = event.key;

  if (key === ' ') {
    event.preventDefault();
  } else if (key === 'Enter') {
    event.preventDefault();
    this.blur();
  } else if (key === "Escape") {
    this.value = this._prevValue || '';
    this.blur();
  } else if (!event.ctrlKey && !event.altKey && key.length === 1) {// if (key.match(/[a-zA-Z$_0-9]/)) {
    //     selectedPositionStart = this.getSelectionStart();
    //     if (selectedPositionStart === 0 && key.match(/[0-9]/)) {
    //         event.preventDefault();
    //     }
    // }
    // else {
    //     event.preventDefault();
    // }
  }

  if (!this.applyData) {
    var prevValue = this.value;
    setTimeout(function () {
      if (this.value !== prevValue) {
        this.emit('change', {}, this);
      }
    }.bind(this), 10);
  }
};

IdentTextInput.eventHandler.identTextPaste = function (event) {
  var prevValue = this.value;
  var startPos = this.getSelectionStart();
  var endPos = this.getSelectionEnd();
  setTimeout(function () {
    var newValue = this.value;
    var newEndPos = endPos + newValue.length - prevValue.length;
    var pastedText = newValue.substr(startPos, newEndPos - startPos).replace(/(^[^a-zA-Z_$])|([^a-zA-Z$_0-9]+)/g, '');
    var newValue1 = newValue.substr(0, startPos) + pastedText + newValue.substr(newEndPos);

    if (!newValue1 !== newValue) {
      this._setNewText(newValue1, startPos + pastedText.length);
    }
  }.bind(this), 0);
};

IdentTextInput.eventHandler.identTextPaste1 = function (event) {
  var clipboardData = event.clipboardData || window.clipboardData;
  var pastedText = clipboardData.getData('text/plain');
  var pastedText1 = pastedText.replace(/(^[^a-zA-Z_$])|([^a-zA-Z$_0-9]+)/g, '');

  if (pastedText !== pastedText1) {
    document.execCommand("insertText", false, pastedText1);
    event.preventDefault();
  }
};

_FCore.default.install(IdentTextInput);

var _default = IdentTextInput; // Core

exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEBase.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEBase.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = _interopRequireWildcard(require("absol/src/HTML5/EventEmitter"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _utils = require("../../../core/utils");




/***
 *
 * @param {BlockEditor} editor
 * @constructor
 */

/***
 * @extends {EventEmitter}
 * @param {BlockEditor} editor
 * @constructor
 */
function BEBase(editor) {
  _EventEmitter.default.call(this);

  this.editor = editor;
}

_OOP.default.mixClass(BEBase, _EventEmitter.default);

BEBase.prototype.menuIcon = 'span.mdi.mdi-cube-outline';
BEBase.prototype.tag2Class = {
  base: BEBase
};
BEBase.prototype.tag = 'CBBase';

BEBase.prototype.createHeader = function () {
  this.$header = (0, _FCore._)({
    class: ['as-be-base-header', _BoardTable.default.DRAG_ZONE_CLASS_NAME],
    child: [this.menuIcon, {
      tag: 'span',
      class: 'as-be-base-tag',
      child: {
        text: this.tag
      }
    }, {
      class: 'as-be-base-header-right-ctn',
      child: [{
        class: 'as-be-line-count-ctn',
        child: [{
          tag: 'span',
          class: 'as-be-line-count',
          child: {
            text: '0'
          }
        }, 'span.mdi.mdi-relation-one-to-one']
      }, {
        class: 'as-be-base-permission-ctn',
        child: ['span.mdi.mdi-lock-outline']
      }]
    }]
  });
  this.$lineCount = (0, _FCore.$)('.as-be-line-count', this.$header);
  return this.$header;
};

BEBase.prototype.createNameAttr = function () {
  this.$nameAttr = (0, _FCore._)({
    class: 'as-be-base-attribute',
    child: [{
      class: 'as-be-base-attribute-name-ctn',
      child: '<label class="as-be-base-attribute-name">ID</label>'
    }, {
      class: 'as-be-base-attribute-value-ctn',
      child: {
        tag: _IdentTextInput.default.tag,
        class: 'as-be-base-id',
        attr: {
          type: 'text'
        }
      }
    }]
  });
  this.$id = (0, _FCore.$)('.as-be-base-id', this.$nameAttr).on('change', this.notifyChange.bind(this));
  return this.$nameAttr;
};

BEBase.prototype.createBody = function () {
  this.$body = (0, _FCore._)({
    class: 'as-be-base-body',
    child: [this.createNameAttr()]
  });
  return this.$body;
};

BEBase.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    tag: _Board.default.tag,
    attr: {
      'data-tag': this.tag
    },
    class: 'as-be-base',
    child: [this.createHeader(), this.createBody()]
  });
  this.$view.on('click', this.ev_click.bind(this));
  this.$view.fmBlock = this;
  return this.$view;
};

BEBase.prototype.getView = function () {
  if (this.$view) return this.$view;
  var v = this.createView();
  this.$view = this.$view || v;
  return this.$view;
};

BEBase.prototype.setData = function (data) {
  if (!this.$view) this.getView();
  this._data = data;
  data.attributes = data.attributes || {};
  data.attributes.id = data.attributes.id || (0, _utils.randomUniqueIdent)();
  this.$id.value = data.attributes && (data.attributes.name || data.attributes.id) || (0, _utils.randomUniqueIdent)();
  this.$id.disabled = !window['FORM_DEV_MODE'] && data.attributes && data.attributes.permissions && data.attributes.permissions.owner === "system";
  this.owner = data.attributes && data.attributes.permissions && data.attributes.permissions.owner;
};

BEBase.prototype.getData = function () {
  var data = Object.assign({}, this._data);
  data.attributes = Object.assign({}, data.attributes);
  data.attributes.name = this.$id.value;
  data.tag = this.tag;
  if (!data.attributes.permissions && this.owner) data.attributes.permissions = {};

  if (this.owner) {
    data.attributes.permissions.owner = this.owner;
  }

  if (!this.owner && data.attributes.permissions) delete data.attributes.owner;
  if (data.attributes.permissions && Object.keys(data.attributes.permissions).length === 0) delete data.attributes.permissions;
  return data;
};

BEBase.prototype.notifySelect = function (originEvent) {
  this.emit('select', originEvent, this);
};

BEBase.prototype.notifyChange = function () {
  this.editor.notifyUnsaved();
};

BEBase.prototype.ev_inputKeydown = function (input, event) {
  var prev = input.value;
  setTimeout(function () {
    if (input.value !== prev) {
      this.notifyChange();
    }
  }.bind(this), 10);
};

BEBase.prototype.ev_click = function (event) {
  if ((0, _EventEmitter.hitElement)(this.$header, event) || event.target === this.$view) {
    this.notifySelect(event);
  }
};

Object.defineProperty(BEBase.prototype, 'owner', {
  set: function (value) {
    if (value) {
      this.$view.attr('data-permission-owner', value);
    } else {
      this.$view.attr('data-permission-owner', undefined);
    }
  },
  get: function () {
    this.getView();
    return this.$view.attr('data-permission-owner') || undefined;
  }
});
Object.defineProperty(BEBase.prototype, 'lineCount', {
  set: function (value) {
    this.getView();
    this.$lineCount.firstChild.data = value + '';

    if (value > 0) {
      this.$view.addClass('as-has-lines');
    } else {
      this.$view.removeClass('as-has-lines');
    }
  },
  get: function () {
    return parseInt(this.$lineCount.firstChild.data, 10);
  }
});
BEBase.prototype.destroy = _noop.default;
var _default = BEBase;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEFunction.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEFunction.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BEFunction(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BEFunction, _BEBase.default);

_BEBase.default.prototype.tag2Class.function = BEFunction;
BEFunction.prototype.tag = 'function';
BEFunction.prototype.menuIcon = 'span.mdi.mdi-function';

BEFunction.prototype.createArgsAttr = function () {
  this.$argsAttr = (0, _FCore._)({
    class: 'as-be-base-attribute',
    child: [{
      class: 'as-be-base-attribute-name-ctn',
      child: '<label class="as-be-base-attribute-name">args</label>'
    }, {
      class: 'as-be-base-attribute-value-ctn',
      child: {
        class: 'as-be-function-args',
        child: {
          tag: 'button',
          class: ['as-be-function-args-add-btn', 'as-from-tool-button'],
          child: 'span.mdi.mdi-plus'
        }
      }
    }]
  });
  this.$args = (0, _FCore.$)('.as-be-function-args', this.$argsAttr);
  this.$addArgbtn = (0, _FCore.$)('.as-be-function-args-add-btn', this.$args).on('click', this._newArgs.bind(this, '', true));
  return this.$argsAttr;
};

BEFunction.prototype.createBody = function () {
  var body = _BEBase.default.prototype.createBody.apply(this, arguments);

  body.addChild(this.createArgsAttr());
  body.addChild(this.createBodyAttr());
  return body;
};

BEFunction.prototype.createBodyAttr = function () {
  this.$bodyAttr = (0, _FCore._)({
    class: 'as-be-base-attribute',
    child: [{
      class: 'as-be-base-attribute-name-ctn',
      child: '<label class="as-be-base-attribute-name">body</label>'
    }, {
      class: 'as-be-base-attribute-value-ctn',
      child: {
        tag: 'pre',
        class: 'as-be-function-body'
      }
    }]
  });
  this.$functionBody = (0, _FCore.$)('.as-be-function-body', this.$bodyAttr);
  this.bodyEditor = ace.edit(this.$functionBody);
  this.bodyEditor.$blockScrolling = Infinity;
  this.bodyEditor.setOption('maxLines', 80);
  this.bodyEditor.session.setMode("ace/mode/javascript");
  this.bodyEditor.setOptions({
    enableBasicAutocompletion: true,
    enableSnippets: true
  });
  this.bodyEditor.on('change', this.ev_bodyEditorChange.bind(this));
  return this.$bodyAttr;
};

BEFunction.prototype.setData = function (data) {
  this._setDataTime = new Date().getTime();

  _BEBase.default.prototype.setData.apply(this, arguments);

  var args = data.attributes.args || [];

  for (var i = 0; i < args.length; ++i) {
    this._newArgs(args[i], false);
  }

  this.bodyEditor.setValue(data.attributes.body || '', -1);
};

BEFunction.prototype.getData = function () {
  var data = _BEBase.default.prototype.getData.call(this);

  data.attributes.args = (0, _FCore.$$)('.as-be-function-arg', this.$args).map(function (e) {
    return e.value;
  }).filter(function (value) {
    return value.trim().length > 0;
  });
  data.attributes.body = this.bodyEditor.getValue();
  return data;
};

BEFunction.prototype._newArgs = function (value, userAction) {
  /***
   * @type {PreInput}
   */
  var argsInput = (0, _FCore._)({
    tag: _IdentTextInput.default.tag,
    elt: (0, _FCore._)('preinput'),
    class: ['as-be-function-arg'],
    props: {
      value: value || ''
    },
    on: {
      blur: function () {
        var value = this.value;
        value = value.trim();

        if (value.length === 0) {
          var beforeElt = this.parentElement.findChildBefore(this);

          if (beforeElt && beforeElt.innerHTML === ', ') {
            beforeElt.remove();
          }

          this.remove();
        } else {
          this.removeClass('as-be-function-arg-new-input');
        }
      },
      focus: function () {
        this.addClass('as-be-function-arg-new-input');
        this._prevValue = this.value;
      }
    }
  });

  if (this.$args.childNodes.length > 1) {
    this.$args.addChildBefore((0, _FCore._)('<span>, </span>'), this.$addArgbtn);
  }

  this.$args.addChildBefore(argsInput, this.$addArgbtn);
  if (userAction) argsInput.focus();
  var now = new Date().getTime();
  if (!this._setDataTime || now - this._setDataTime > 1000) this.notifyChange();
};

BEFunction.prototype.ev_bodyEditorChange = function () {
  var now = new Date().getTime();
  if (!this._setDataTime || now - this._setDataTime > 1000) this.notifyChange();
};

var _default = BEFunction;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEEntry.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEEntry.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _utils = require("../../../core/utils");


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BEEntry(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BEEntry, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBEntry = BEEntry;
BEEntry.prototype.menuIcon = 'span.mdi.mdi-ray-start-arrow';
BEEntry.prototype.tag = 'CBEntry';
var _default = BEEntry;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEFileDownloader.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEFileDownloader.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BEFileDownloader(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BEFileDownloader, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBFileDownloader = BEFileDownloader;
BEFileDownloader.prototype.menuIcon = 'span.mdi.mdi-download';
BEFileDownloader.prototype.tag = 'CBFileDownloader';

BEFileDownloader.prototype.createFileNameAttr = function () {
  this.$fileNameAttr = (0, _FCore._)({
    class: 'as-be-base-attribute',
    child: [{
      class: 'as-be-base-attribute-name-ctn',
      child: '<label class="as-be-base-attribute-name">fileName</label>'
    }, {
      class: 'as-be-base-attribute-value-ctn',
      child: {
        tag: 'input',
        class: 'as-be-file-downloader-file-name',
        attr: {
          type: 'text'
        }
      }
    }]
  });
  this.$fileName = (0, _FCore.$)('.as-be-file-downloader-file-name', this.$fileNameAttr);
  this.$fileName.on('keydown', this.ev_inputKeydown.bind(this, this.$fileName));
  return this.$fileNameAttr;
};

BEFileDownloader.prototype.createBody = function () {
  var body = _BEBase.default.prototype.createBody.apply(this, arguments);

  body.addChild(this.createFileNameAttr());
  return body;
};

BEFileDownloader.prototype.setData = function (data) {
  _BEBase.default.prototype.setData.apply(this, arguments);

  this.$fileName.value = data.attributes && data.attributes.fileName || '';
};

BEFileDownloader.prototype.getData = function () {
  var data = _BEBase.default.prototype.getData.call(this);

  data.attributes.fileName = this.$fileName.value;
  return data;
};

var _default = BEFileDownloader;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEPropsGate.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEPropsGate.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BEPropsGate(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BEPropsGate, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBPropsGate = BEPropsGate;
BEPropsGate.prototype.menuIcon = 'span.mdi.mdi-code-json';
BEPropsGate.prototype.tag = 'CBPropsGate';
var _default = BEPropsGate;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BERadioGroup.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BERadioGroup.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _R = _interopRequireDefault(require("../../../R"));

var _FNode = require("../../../core/FNode");

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BERadioGroup(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BERadioGroup, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBRadioGroup = BERadioGroup;
BERadioGroup.prototype.tag = 'CBRadioGroup';
BERadioGroup.prototype.menuIcon = 'span.mdi.mdi-radiobox-marked';

BERadioGroup.prototype.createGroupNameAttr = function () {
  this.$groupNameAttr = (0, _FCore._)({
    class: 'as-be-base-attribute',
    child: [{
      class: 'as-be-base-attribute-name-ctn',
      child: '<label class="as-be-base-attribute-name">groupName</label>'
    }, {
      class: 'as-be-base-attribute-value-ctn',
      child: {
        tag: 'selectmenu',
        class: 'as-be-as-be-radio-group-name'
      }
    }]
  });
  this.$groupName = (0, _FCore.$)('.as-be-as-be-radio-group-name', this.$groupNameAttr).on('change', this.notifyChange.bind(this));
  return this.$groupNameAttr;
};

BERadioGroup.prototype.createBody = function () {
  _BEBase.default.prototype.createBody.apply(this, arguments);

  this.$body.addChild(this.createGroupNameAttr());
  return this.$body;
};

BERadioGroup.prototype.setData = function (data) {
  _BEBase.default.prototype.setData.apply(this, arguments);

  this.$groupName.items = this._getRadioGroupNames();
  this.$groupName.value = this._data.attributes.groupName;
};

BERadioGroup.prototype.getData = function () {
  var data = _BEBase.default.prototype.getData.call(this);

  data.attributes.groupName = this.$groupName.value;
  return data;
};

BERadioGroup.prototype._getRadioGroupNames = function () {
  /***
   *
   * @type {LayoutEditor}
   */
  var layoutEditor = this.editor.getContext(_R.default.LAYOUT_EDITOR);
  var rootLayout = layoutEditor.rootLayout;
  var rootFragment = layoutEditor.rootFragment;
  var nameDict = {};
  (0, _FNode.traversal)(rootLayout, function (path) {
    var node = path.node;

    if (node.fragment !== rootFragment) {
      path.skipChildren();
      return;
    }

    if (node.tag === 'Radio' && node.attributes.groupName) {
      nameDict[node.attributes.groupName] = true;
    }
  });
  return Object.keys(nameDict).map(function (name) {
    return {
      text: name,
      value: name
    };
  });
};

var _default = BERadioGroup;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BESnackBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BESnackBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BESnackBar(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BESnackBar, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBSnackBar = BESnackBar;
BESnackBar.prototype.menuIcon = 'span.mdi.mdi-message-text';
BESnackBar.prototype.tag = 'CBSnackBar';
var _default = BESnackBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BETimer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BETimer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _utils = require("absol-acomp/js/utils");


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BETimer(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BETimer, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBTimer = BETimer;
BETimer.prototype.menuIcon = 'span.mdi.mdi-timer-outline';
BETimer.prototype.tag = 'CBTimer';

BETimer.prototype.createDurationAttr = function () {
  this.$durationAttr = (0, _FCore._)({
    class: 'as-be-base-attribute',
    child: [{
      class: 'as-be-base-attribute-name-ctn',
      child: '<label class="as-be-base-attribute-name">duration</label>'
    }, {
      class: 'as-be-base-attribute-value-ctn',
      child: {
        tag: 'input',
        class: 'as-be-timer-duration',
        attr: {
          type: 'number',
          min: '0'
        }
      }
    }]
  });
  this.$duration = (0, _FCore.$)('.as-be-timer-duration', this.$durationAttr);
  this.$duration.on('mousedown', this.ev_inputKeydown.bind(this, this.$duration)).on('keydown', this.ev_inputKeydown.bind(this, this.$duration));
  return this.$durationAttr;
};

BETimer.prototype.createBody = function () {
  var body = _BEBase.default.prototype.createBody.apply(this, arguments);

  body.addChild(this.createDurationAttr());
  return body;
};

BETimer.prototype.setData = function (data) {
  _BEBase.default.prototype.setData.apply(this, arguments);

  if (!(0, _utils.isRealNumber)(data.attributes.duration)) data.attributes.duration = 60000;
  this.$duration.value = data.attributes.duration;
};

BETimer.prototype.getData = function () {
  var data = _BEBase.default.prototype.getData.apply(this, arguments);

  var duration = parseFloat(this.$duration.value);
  if (!(0, _utils.isRealNumber)(duration)) duration = 60000;
  data.attributes.duration = duration;
  return data;
};

var _default = BETimer;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEEntryCompleted.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEEntryCompleted.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BEEntryCompleted(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BEEntryCompleted, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBEntryCompleted = BEEntryCompleted;
BEEntryCompleted.prototype.menuIcon = 'span.mdi.mdi-database-arrow-right-outline';
BEEntryCompleted.prototype.tag = 'CBEntryCompleted';
var _default = BEEntryCompleted;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEYesNoQuestion.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEYesNoQuestion.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BEYesNoQuestion(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BEYesNoQuestion, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBYesNoQuestion = BEYesNoQuestion;
BEYesNoQuestion.prototype.menuIcon = 'span.mdi.mdi-comment-question-outline';
BEYesNoQuestion.prototype.tag = 'CBYesNoQuestion';

BEYesNoQuestion.prototype.createMessageAttr = function () {
  this.$messageAttr = (0, _FCore._)({
    class: 'as-be-base-attribute',
    child: [{
      class: 'as-be-base-attribute-name-ctn',
      child: '<label class="as-be-base-attribute-name">message</label>'
    }, {
      class: 'as-be-base-attribute-value-ctn',
      child: {
        class: 'as-be-base-attribute-value-ctn',
        child: {
          tag: 'textarea2',
          class: 'as-be-message'
        }
      }
    }]
  });
  this.$message = (0, _FCore.$)('.as-be-message', this.$messageAttr);
  return this.$messageAttr;
};

BEYesNoQuestion.prototype.createBody = function () {
  var body = _BEBase.default.prototype.createBody.apply(this, arguments);

  body.addChild(this.createMessageAttr());
  return body;
};

BEYesNoQuestion.prototype.setData = function (data) {
  _BEBase.default.prototype.setData.apply(this, arguments);

  this.$message.value = data.attributes && data.attributes.message || '';
};

BEYesNoQuestion.prototype.getData = function () {
  var data = _BEBase.default.prototype.getData.call(this);

  data.attributes.message = this.$message.value;
  return data;
};

var _default = BEYesNoQuestion;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBCmpSwitch.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBCmpSwitch.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


function CBCmpSwitch() {
  _BaseBlock.default.call(this);

  this.value = null;
  this.result = {};
  this.patternByRet = {};
  /***
   *
   * @type {{pattern: string|number|boolean|null|undefined, ret: string}[]}
   */

  this.attributes.cases = [];
  this.pinHandlers = Object.assign({}, CBCmpSwitch.prototype.pinHandlers);
}

(0, _inheritComponentClass.default)(CBCmpSwitch, _BaseBlock.default);
CBCmpSwitch.prototype.menuIcon = 'span.mdi.mdi-set-split';
CBCmpSwitch.prototype.tag = 'CBCmpSwitch';
CBCmpSwitch.prototype.attributeHandlers.cases = {
  set: function (value, ref) {
    ref.set(value);
    this.rebuildSwitch();
    return value;
  }
};
CBCmpSwitch.prototype.pinHandlers.value = {
  receives: function (value) {
    this.value = value;
    var cases = this.attributes.cases || [];

    for (var i = 0; i < cases.length; ++i) {
      this.pinFire(cases[i].ret);
    }
  }
};

CBCmpSwitch.prototype.rebuildSwitch = function () {
  var self = this;
  var cases = this.attributes.cases || [];
  this.pinHandlers = CBCmpSwitch.prototype.pinHandlers;
  var patternByRet = cases.reduce(function (ac, cr) {
    ac[cr.ret] = ac[cr.ret] || [];
    ac[cr.ret].push(cr.pattern);
    return ac;
  }, {});
  this.patternByRet = patternByRet;
  Object.keys(patternByRet).reduce(function (ac, pin) {
    var patterns = patternByRet[pin];
    ac[pin] = {
      get: function () {
        var value = self.value;
        return patterns.reduce(function (res, pattern) {
          res = res || value === pattern;
          res = res || value + '' === pattern;
          res = res || JSON.stringify(value) === pattern;
          return res;
        }, false);
      }
    };
    return ac;
  }, this.pinHandlers);
};

_Assembler.AssemblerInstance.addClass(CBCmpSwitch);

var _default = CBCmpSwitch;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BECmpSwitch.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BECmpSwitch.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _utils = require("../../../core/utils");

var _CBCmpSwitch = _interopRequireDefault(require("../../../blocks/CBCmpSwitch"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BECmpSwitch(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BECmpSwitch, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBCmpSwitch = BECmpSwitch;
BECmpSwitch.prototype.menuIcon = 'span.mdi.mdi-set-split';
BECmpSwitch.prototype.tag = 'CBCmpSwitch';
var _default = BECmpSwitch;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEExtendProperty.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEExtendProperty.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _utils = require("absol-acomp/js/utils");

var _CheckBoxInput = _interopRequireDefault(require("absol-acomp/js/CheckBoxInput"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BEExtendProperty(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BEExtendProperty, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBExtendProperty = BEExtendProperty;
BEExtendProperty.prototype.menuIcon = 'span.mdi.mdi-source-commit-start';
BEExtendProperty.prototype.tag = 'CBExtendProperty';

BEExtendProperty.prototype.createDisembarkAttr = function () {
  this.$disembarkAttr = (0, _FCore._)({
    class: 'as-be-base-attribute',
    child: [{
      class: 'as-be-base-attribute-name-ctn',
      child: '<label class="as-be-base-attribute-name">disembark</label>'
    }, {
      class: 'as-be-base-attribute-value-ctn',
      child: {
        tag: _CheckBoxInput.default.tag,
        class: 'as-be-base-disembark'
      }
    }]
  });
  this.$disembark = (0, _FCore.$)('.as-be-base-disembark', this.$disembarkAttr);
  return this.$disembarkAttr;
};

BEExtendProperty.prototype.createBody = function () {
  var body = _BEBase.default.prototype.createBody.apply(this, arguments);

  body.addChild(this.createDisembarkAttr());
  return body;
};

BEExtendProperty.prototype.setData = function (data) {
  _BEBase.default.prototype.setData.apply(this, arguments);

  this.$disembark.checked = data.attributes.disembark;
};

BEExtendProperty.prototype.getData = function () {
  var data = _BEBase.default.prototype.getData.call(this);

  data.attributes.disembark = this.$disembark.checked;
  return data;
};

var _default = BEExtendProperty;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBExtendConfig.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBExtendConfig.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _Assembler = require("../core/Assembler");

var _BaseComponent = _interopRequireDefault(require("../core/BaseComponent"));


/***
 * @extends BaseBlock
 * @constructor
 */
function CBExtendConfig() {
  _BaseBlock.default.call(this);

  this.value = undefined;
  this.configBindingDescriptor = this.createConfigBindingDescriptor();
}

(0, _inheritComponentClass.default)(CBExtendConfig, _BaseBlock.default);
CBExtendConfig.prototype.tag = 'CBExtendConfig';
CBExtendConfig.prototype.menuIcon = 'span.mdi.mdi-cog-transfer-outline';
/***
 *
 */

CBExtendConfig.prototype.bindConfigToFragment = function () {
  if (!this.fragment) return;
  var name = this.attributes.name;
  if (!name) return;
  var boundConfig = this.fragment.boundConfig[name];
  if (boundConfig === this) return;
  var descriptor = this.configBindingDescriptor;
  if (!descriptor) return;
  var obj = this.fragment.config;
  Object.assign(descriptor, {
    enumerable: true,
    configurable: true
  });
  Object.defineProperty(obj, name, descriptor);
  this.fragment.boundConfig[name] = this;
};

CBExtendConfig.prototype.unbindConfigToFragment = function () {
  if (!this.fragment) return;
  var name = this.attributes.name;
  if (!name) return;
  var boundConfig = this.fragment.boundConfig[name];
  if (boundConfig !== this) return;
  var obj = this.fragment._config;
  delete obj[name];
  delete this.fragment.boundConfig[name];
};

CBExtendConfig.prototype.attributes.disembark = false;

CBExtendConfig.prototype.onAttached = function () {
  this.bindConfigToFragment();
};

CBExtendConfig.prototype.onDetach = function () {
  this.unbindConfigToFragment();
};

CBExtendConfig.prototype.createConfigBindingDescriptor = function () {
  var self = this;
  return {
    set: function (value) {
      if (self.value !== value) {
        self.value = value;
        self.pinFire('value');
      }
    },
    get: function () {
      return self.value;
    }
  };
};

CBExtendConfig.prototype.pinHandlers.value = {
  receives: function (value) {
    if (this.value !== value) {
      this.value = value;
      this.pinFire('value');
    }
  },
  get: function () {
    return this.value;
  }
};

_Assembler.AssemblerInstance.addClass(CBExtendConfig);

var _default = CBExtendConfig;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEExtendConfig.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEExtendConfig.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _IdentTextInput = _interopRequireDefault(require("../../../dom/IdentTextInput"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _CheckBoxInput = _interopRequireDefault(require("absol-acomp/js/CheckBoxInput"));

var _CBExtendConfig = _interopRequireDefault(require("../../../blocks/CBExtendConfig"));

var _BEExtendProperty = _interopRequireDefault(require("./BEExtendProperty"));


/***
 * @extends BEExtendProperty
 * @param {BlockEditor} editor
 * @constructor
 */
function BEExtendConfig(editor) {
  _BEExtendProperty.default.call(this, editor);
}

_OOP.default.mixClass(BEExtendConfig, _BEExtendProperty.default);

_BEBase.default.prototype.tag2Class.CBExtendConfig = BEExtendConfig;
BEExtendConfig.prototype.menuIcon = _CBExtendConfig.default.prototype.menuIcon;
BEExtendConfig.prototype.tag = 'CBExtendConfig';
var _default = BEExtendConfig;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/cmds/CmdDescriptors.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/cmds/CmdDescriptors.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var CmdDescriptors = {
  editRootLayout: {
    type: 'trigger',
    desc: "Edit Root Layout",
    icon: 'span.mdi.mdi-border-outside'
  },
  preview: {
    type: 'trigger',
    icon: 'span.mdi.mdi-play',
    desc: 'Preview',
    bindKey: {
      win: 'Ctrl-K',
      mac: 'TODO?'
    }
  },
  cut: {
    type: 'trigger',
    icon: 'span.mdi.mdi-content-cut',
    desc: 'Cut',
    bindKey: {
      win: 'Ctrl-X',
      mac: 'TODO?'
    }
  },
  copy: {
    type: 'trigger',
    icon: 'span.mdi.mdi-content-copy',
    desc: 'Copy',
    bindKey: {
      win: 'Ctrl-C',
      mac: 'TODO?'
    }
  },
  paste: {
    type: 'trigger',
    icon: 'span.mdi.mdi-content-paste',
    desc: 'Paste',
    bindKey: {
      win: 'Ctrl-V',
      mac: 'TODO?'
    }
  },
  pasteSCBlock: {
    type: 'ribbon',
    desc: 'Depth Select',
    icon: 'span.mdi.mdi-content-paste',
    items: [{
      text: 'Paste In',
      icon: 'span.mdi.mdi-content-paste',
      args: ['IN']
    }, {
      text: 'Paste Before',
      icon: 'span.mdi.mdi-content-paste',
      args: ['BEFORE']
    }, {
      text: 'Paste After',
      icon: 'span.mdi.mdi-content-paste',
      args: ['AFTER']
    }]
  },
  viewClipboard: {
    type: 'trigger',
    icon: 'clipboard-view-ico',
    desc: 'View Clipboard'
  },
  delete: {
    type: 'trigger',
    icon: 'span.mdi.mdi-delete-variant',
    desc: 'Delete',
    bindKey: {
      win: 'Delete',
      mac: 'Delete'
    }
  },
  save: {
    type: 'trigger',
    icon: 'span.mdi.mdi-content-save',
    desc: 'Save',
    bindKey: {
      win: 'Ctrl-S',
      mac: '//todo'
    }
  },
  saveAs: {
    type: 'trigger',
    icon: 'span.mdi.mdi-content-save-edit',
    desc: 'Save As'
  },
  saveAsSystem: {
    type: 'trigger',
    icon: 'span.mdi.mdi-content-save-cog-outline',
    desc: 'Save As System'
  },
  importFromJson: {
    type: 'trigger',
    icon: 'span.mdi.mdi-cloud-upload[style="color:#1da8f2"]',
    desc: 'Import From JSON',
    bindKey: {
      win: 'Ctrl-Shift-I',
      mac: 'TODO?'
    }
  },
  importFromFile: {
    type: 'trigger',
    icon: 'span.mdi.mdi-cloud-upload[style="color:#1da8f2"]',
    desc: 'Import From File',
    bindKey: {
      win: 'Ctrl-Shift-I',
      mac: 'TODO?'
    }
  },
  export2Json: {
    type: 'trigger',
    icon: 'span.mdi.mdi-cloud-download-outline',
    desc: 'Export To JSON',
    bindKey: {
      win: 'Ctrl-Shift-E',
      mac: 'TODO?'
    }
  },
  export2sharpEncode: {
    type: 'trigger',
    icon: 'span.mdi.mdi-music-accidental-sharp',
    desc: 'Export To #',
    bindKey: {
      win: 'Ctrl-Shift-#',
      mac: 'TODO?'
    }
  },
  export2clipboard: {
    type: 'trigger',
    icon: 'span.mdi.mdi-clipboard-arrow-down-outline',
    desc: 'Copy To clipboard as JS' // bindKey: { win: 'Ctrl-Shift-C', mac: 'TODO?' }

  },
  undo: {
    type: 'trigger',
    icon: 'span.mdi.mdi-undo',
    desc: 'Undo',
    bindKey: {
      win: 'Ctrl-Z',
      mac: 'TODO?'
    }
  },
  redo: {
    type: 'trigger',
    icon: 'span.mdi.mdi-redo',
    desc: 'Redo',
    bindKey: {
      win: 'Ctrl-Y',
      mac: 'TODO?'
    }
  },
  selectAll: {
    type: 'trigger',
    desc: 'Select All',
    icon: 'span.mdi.mdi-select-all',
    bindKey: {
      win: 'Ctrl-A',
      mac: 'TODO?'
    }
  },
  setSelectMode: {
    type: 'ribbon',
    desc: 'Depth Select',
    icon: 'span.mdi.mdi-selection',
    items: [{
      text: 'Select In Current Layout',
      icon: 'span.mdi.mdi-selection',
      args: ['CURRENT_LAYOUT']
    }, {
      text: 'Depth Select',
      icon: 'depth-select-ico',
      args: ['DEPTH']
    }]
  },
  zoomIn: {
    type: 'trigger',
    desc: 'Zoom In',
    icon: 'span.mdi.mdi-magnify-plus-outline'
  },
  zoomOut: {
    type: 'trigger',
    desc: 'Zoom Out',
    icon: 'span.mdi.mdi-magnify-minus-outline'
  },
  resetZoom: {
    type: 'trigger',
    desc: 'Reset Zoom ',
    icon: 'span.mdi.mdi-magnify-close'
  },
  autoAlignPosition: {
    type: 'trigger',
    icon: 'span.mdi.mdi-auto-fix',
    desc: 'Auto Align Position'
  },
  scrollIntoNodes: {
    type: 'trigger',
    icon: 'span.mdi.mdi-image-filter-center-focus-weak',
    desc: 'Scroll Into Nodes'
  },
  scrollIntoBlock: {
    type: 'trigger',
    icon: 'span.mdi.mdi-image-filter-center-focus-weak',
    desc: "Scroll Into Block"
  },
  openIncludedBlockManager: {
    type: 'trigger',
    icon: {
      tag: 'mdi-package-variant',
      style: {
        color: 'rgb(30, 200, 200)'
      }
    },
    desc: 'Included Block Manager'
  },
  system_owner_lock: {
    type: 'trigger',
    icon: {
      tag: 'span',
      style: {
        color: 'red'
      },
      class: ['mdi', 'mdi-lock-outline']
    }
  },
  system_owner_unlock: {
    type: 'trigger',
    icon: {
      tag: 'span',
      style: {
        color: 'rgb(100, 100, 255)'
      },
      class: ['mdi', 'mdi-lock-open-variant-outline']
    }
  },
  addComponent: {
    type: 'trigger',
    icon: {
      tag: 'span',
      style: {
        color: 'rgb(68,138,251)'
      },
      class: ['mdi', 'mdi-shape-plus']
    },
    desc: 'Add Component'
  },
  transformComponentType: {
    type: 'trigger',
    icon: 'transform-ico'
  },
  moveUp: {
    type: 'trigger',
    icon: 'span.mdi.mdi-arrow-up',
    desc: 'Move Up'
  },
  moveDown: {
    type: 'trigger',
    icon: 'span.mdi.mdi-arrow-down',
    desc: 'Move Down'
  },
  remotePreview: {
    type: 'trigger',
    icon: 'span.mdi.mdi-cellphone-play',
    desc: 'Remote Preview'
  },
  editAsSCLang: {
    type: 'trigger',
    icon: 'span.mdi.mdi-text-box-edit-outline[style="color: green;"]',
    desc: 'Edit as Script'
  },
  pageSetting: {
    type: 'trigger',
    icon: 'span.mdi.mdi-file-cog-outline',
    desc: 'Page Setting(print)'
  },
  editContent: {
    type: 'trigger',
    icon: 'span.mdi.mdi-edit',
    desc: 'EditContent',
    bindKey: {
      win: 'F2',
      mac: 'TODO?'
    }
  }
};
var _default = CmdDescriptors;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEExternalTrigger.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/types/BEExternalTrigger.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BEBase = _interopRequireDefault(require("./BEBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/***
 * @extends BEBase
 * @param {BlockEditor} editor
 * @constructor
 */
function BEExternalTrigger(editor) {
  _BEBase.default.call(this, editor);
}

_OOP.default.mixClass(BEExternalTrigger, _BEBase.default);

_BEBase.default.prototype.tag2Class.CBExternalTrigger = BEExternalTrigger;
BEExternalTrigger.prototype.menuIcon = 'span.mdi.mdi.mdi-square-wave';
BEExternalTrigger.prototype.tag = 'CBExternalTrigger';
var _default = BEExternalTrigger;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/BlockEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/BlockEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.BlockEditorCmdDescriptors = exports.BlockEditorCmdTree = void 0;

var _BEEntry = _interopRequireDefault(require("./types/BEEntry"));

var _BEFunction = _interopRequireDefault(require("./types/BEFunction"));

var _BERadioGroup = _interopRequireDefault(require("./types/BERadioGroup"));

var _BEPropsGate = _interopRequireDefault(require("./types/BEPropsGate"));

var _BETimer = _interopRequireDefault(require("./types/BETimer"));

var _BESnackBar = _interopRequireDefault(require("./types/BESnackBar"));

var _BEFileDownloader = _interopRequireDefault(require("./types/BEFileDownloader"));

var _BEBase = _interopRequireDefault(require("./types/BEBase"));

var _utils = require("../../core/utils");

var _utils2 = require("absol-acomp/js/utils");

var _BEExtendProperty = _interopRequireDefault(require("./types/BEExtendProperty"));

var _BEExtendConfig = _interopRequireDefault(require("./types/BEExtendConfig"));

var _FlagManager = _interopRequireDefault(require("absol/src/Code/FlagManager"));

var _BEEntryCompleted = _interopRequireDefault(require("./types/BEEntryCompleted"));

var _CmdDescriptors = _interopRequireDefault(require("../../cmds/CmdDescriptors"));

var _BEYesNoQuestion = _interopRequireDefault(require("./types/BEYesNoQuestion"));

var _BECmpSwitch = _interopRequireDefault(require("./types/BECmpSwitch"));

var _BEExternalTrigger = _interopRequireDefault(require("./types/BEExternalTrigger"));


var editors = [_BEEntry.default, _BEEntryCompleted.default, _BEFunction.default, _BERadioGroup.default, _BEPropsGate.default, _BETimer.default, _BESnackBar.default, _BEFileDownloader.default, _BEExtendProperty.default, _BEExtendConfig.default, _BEExternalTrigger.default, _BEYesNoQuestion.default, _BECmpSwitch.default];
var BlockEditorCmd = {};

BlockEditorCmd.preview = function () {
  this.layoutEditor.execCmd('preview');
};

BlockEditorCmd.importFromJson = function () {
  this.flexFormEditor.execCmd('importFromJson');
};

BlockEditorCmd.export2Json = function () {
  this.flexFormEditor.execCmd('export2Json');
};

BlockEditorCmd.export2sharpEncode = function () {
  this.flexFormEditor.execCmd('export2sharpEncode');
};

BlockEditorCmd.export2clipboard = function () {
  this.flexFormEditor.execCmd('export2clipboard');
};
/***
 * @this BlockEditor
 */


BlockEditorCmd.delete = function () {
  var blocks = this.activatedBlocks.slice();

  for (var i = 0; i < blocks.length; ++i) {
    if (this.isDeletableBlock(blocks[i])) this.deleteBlock(blocks[i]);
  }
};

BlockEditorCmd.system_owner_lock = function () {
  var blocks = this.activatedBlocks.slice();
  var changed = false;

  for (var i = 0; i < blocks.length; ++i) {
    if (blocks[i].owner !== 'system') {
      blocks[i].owner = 'system';
      changed = true;
    }
  }

  if (changed) this.notifyUnsaved();
};

BlockEditorCmd.system_owner_unlock = function () {
  var blocks = this.activatedBlocks.slice();

  for (var i = 0; i < blocks.length; ++i) {
    blocks[i].owner = null;
  }
};

BlockEditorCmd.copy = function () {
  this.setClipboardBlocks(this.activatedBlocks);
};

BlockEditorCmd.save = function () {
  this.flexFormEditor.execCmd('save');
};

BlockEditorCmd.saveAs = function () {
  this.flexFormEditor.execCmd('saveAs');
};

BlockEditorCmd.saveAsSystem = function () {
  this.flexFormEditor.execCmd('saveAsSystem');
};

BlockEditorCmd.paste = function () {
  var rawBlocks = this.getClipboardBlocks();
  if (!rawBlocks) return;
  var self = this;
  rawBlocks.forEach(function (rawBlock, i) {
    var clazz = _BEBase.default.prototype.tag2Class[rawBlock.tag] || _BEBase.default;
    var block = new clazz(this);
    block.on('select', function (event) {
      if (self.isActivatedBlock(block)) {
        if (event.shiftKey && self.activatedBlocks.length > 1) {
          self.deactivateBlock(block);
        } else self.activateBlock(block);
      } else {
        self.activateBlock(block, event.shiftKey);
      }
    });
    this.$body.addChild(block.getView());
    this.blocks.push(block);
    if (i + 1 === rawBlocks.length) (0, _utils2.vScrollIntoView)(block.getView());
    var id = rawBlock.attributes && rawBlock.attributes.id || (0, _utils.randomUniqueIdent)();
    var idPart;
    var idNum;

    if (self.findBlockById(id)) {
      idPart = id.split('_');
      idNum = parseInt(idPart[idPart.length - 1]);

      if (isNaN(idNum)) {
        idPart.push(0);
        idNum = 1;
      }

      idPart[idPart.length - 1] = idNum;
      id = idPart.join('_');

      while (self.findBlockById(id)) {
        idNum++;
        idPart[idPart.length - 1] = idNum;
        id = idPart.join('_');
      }

      rawBlock.attributes = rawBlock.attributes || {};
      rawBlock.attributes.id = id;
    }

    if (rawBlock.attributes && rawBlock.attributes.permissions && rawBlock.attributes.permissions.edit_attributes) {
      delete rawBlock.attributes.permissions.edit_attributes;
    }

    block.setData(rawBlock);
    this.activateBlock(block, i > 0);
  }.bind(this));
  this.notifyUnsaved();
};

var BlockEditorCmdTree = [['preview'], ['save', 'saveAs', 'saveAsSystem', 'importFromJson', 'export2Json', 'export2sharpEncode', 'export2clipboard'], [// 'cut',
'copy', 'paste', 'delete'], editors.map(function (clazz) {
  return 'insert_' + clazz.prototype.tag;
})];
exports.BlockEditorCmdTree = BlockEditorCmdTree;

if (window['FORM_DEV_MODE']) {
  BlockEditorCmdTree.push(['system_owner_lock', 'system_owner_unlock']);
}

var BlockEditorCmdDescriptors = Object.assign({}, _CmdDescriptors.default);
exports.BlockEditorCmdDescriptors = BlockEditorCmdDescriptors;
editors.forEach(function (clazz) {
  BlockEditorCmdDescriptors['insert_' + clazz.prototype.tag] = {
    type: 'trigger',
    icon: clazz.prototype.menuIcon,
    desc: "Insert " + clazz.prototype.tag
  };

  BlockEditorCmd['insert_' + clazz.prototype.tag] = function () {
    var block = new clazz(this);
    var self = this;
    block.on('select', function (event) {
      if (self.isActivatedBlock(block)) {
        if (event.shiftKey && self.activatedBlocks.length > 1) {
          self.deactivateBlock(block);
        } else self.activateBlock(block);
      } else {
        self.activateBlock(block, event.shiftKey);
      }
    });
    this.$body.addChild(block.getView());
    this.blocks.push(block);
    (0, _utils2.vScrollIntoView)(block.getView());
    block.setData({
      attributes: {
        id: (0, _utils.randomUniqueIdent)()
      }
    });
    this.activateBlock(block);
    this.notifyUnsaved();
  };
});
var _default = BlockEditorCmd;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/BlockEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/BlockEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _BaseEditor = _interopRequireDefault(require("../../core/BaseEditor"));

var _FCore = require("../../core/FCore");

require("../../../css/blockeditor.css");

var _BEBase = _interopRequireDefault(require("./types/BEBase"));

require("./types/BEFunction");

require("./types/BEEntry");

require("./types/BEFileDownloader");

require("./types/BEPropsGate");

require("./types/BERadioGroup");

require("./types/BESnackBar");

require("./types/BETimer");

require("./types/BEEntryCompleted");

require("./types/BEYesNoQuestion");

require("./types/BECmpSwitch");

var _R = _interopRequireDefault(require("../../R"));

var _CMDTool = _interopRequireDefault(require("../../fragment/CMDTool"));

var _BlockEditorCmd = _interopRequireWildcard(require("./BlockEditorCmd"));

var _ClipboardManager = _interopRequireDefault(require("../../ClipboardManager"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));




function BlockEditor() {
  _BaseEditor.default.call(this);

  this.cmdRunner.assign(_BlockEditorCmd.default);
  /***
   *
   * @type {BEBase[]}
   */

  this.activatedBlocks = [];
  this.CMDTool = new _CMDTool.default();
  this.CMDTool.attach(this);
  this.CMDTool.bindWithEditor(this);
  var self = this;
  Object.keys(_BlockEditorCmd.BlockEditorCmdDescriptors).forEach(function (cmd) {
    if (_BlockEditorCmd.BlockEditorCmdDescriptors[cmd].bindKey) self.bindKeyToCmd(_BlockEditorCmd.BlockEditorCmdDescriptors[cmd].bindKey.win, cmd);
  });
}

_OOP.default.mixClass(BlockEditor, _BaseEditor.default);

BlockEditor.prototype.clipboardType = "CB_BLOCKS";

BlockEditor.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    attr: {
      tabindex: 1
    },
    class: 'as-block-editor',
    child: [{
      class: 'as-block-editor-header',
      child: this.CMDTool.getView()
    }, {
      tag: _BoardTable.default.tag,
      class: ['as-block-editor-body', 'as-bscroller']
    }]
  });
  this.$cmdToolCtn = (0, _FCore.$)('.as-block-editor-header', this.$view);
  this.$body = (0, _FCore.$)('.as-block-editor-body', this.$view).on('orderchange', this.ev_blockOrderChange.bind(this));
  this.$view.on('keydown', this.ev_cmdKeyDown.bind(this));
};

BlockEditor.prototype.onAttached = function () {
  /***
   *
   * @type {LayoutEditor}
   */
  this.layoutEditor = this.getContext(_R.default.LAYOUT_EDITOR);
  /***
   *
   * @type {FormEditor}
   */

  this.formEditor = this.getContext(_R.default.FORM_EDITOR);
  this.flexFormEditor = this.getContext(_R.default.FLEX_FORM_EDITOR);
  /***
   *
   * @type {CircuitDiagramEditor}
   */

  this.diagramEditor = this.getContext(_R.default.DIAGRAM_EDITOR);
};

BlockEditor.prototype.onStart = function () {
  this.selfHolder = this.formEditor.getEditorHolderByEditor(this);
  this.CMDTool.start();
};

BlockEditor.prototype.onPause = function () {// if (this.selfHolder.tabframe.modified)
  //     this.layoutEditor.setBlockData(this.getData());
};

BlockEditor.prototype.onResume = function () {
  this._updateLineCount();
};

BlockEditor.prototype._updateLineCount = function () {
  var lineData = this.diagramEditor.getLineData();
  var lineCountById = lineData.reduce(function (ac, cr) {
    ac[cr.u] = ac[cr.u] || 0;
    ac[cr.v] = ac[cr.v] || 0;
    ac[cr.u]++;
    if (cr.u !== cr.v) ac[cr.v]++;
    return ac;
  }, {});
  this.blocks.forEach(function (be) {
    be.lineCount = lineCountById[be._data.attributes.id] || 0;
  });
};

BlockEditor.prototype.setData = function (data) {
  var self = this;
  this._data = data;
  this.$body.clearChild();
  this.blocks = data.map(function (it) {
    var clazz = _BEBase.default.prototype.tag2Class[it.tag] || _BEBase.default;
    var block = new clazz(self);
    block.setData(it);
    block.on('select', function (event) {
      if (self.isActivatedBlock(block)) {
        if (event.shiftKey && self.activatedBlocks.length > 1) {
          self.deactivateBlock(block);
        } else self.activateBlock(block);
      } else {
        self.activateBlock(block, event.shiftKey);
      }
    });
    return block;
  });
  this.blocks.forEach(function (blk) {
    self.$body.addChild(blk.getView());
  });
};

BlockEditor.prototype.getData = function () {
  return this.blocks.map(function (blk) {
    return blk.getData();
  });
};

BlockEditor.prototype.getCmdNames = function () {
  return Object.keys(_BlockEditorCmd.default);
};

BlockEditor.prototype.getCmdDescriptor = function (name) {
  var descriptor = _BlockEditorCmd.BlockEditorCmdDescriptors[name];
  var res = Object.assign({
    type: 'trigger',
    desc: 'command: ' + name,
    icon: 'span.mdi.mdi-apple-keyboard-command'
  }, descriptor);

  if (name === 'cut' || name === 'copy' || name === 'delete' || name === 'system_owner_lock' || name === 'system_owner_unlock') {
    res.disabled = this.activatedBlocks.length === 0;

    if (name === 'delete' || name === 'cut') {
      res.disabled = res.disabled || this.activatedBlocks.length === 0 || this.activatedBlocks.length > 0 && this.activatedBlocks.every(function (blk) {
        return !this.isDeletableBlock(blk);
      }.bind(this));
    }
  } else if (name === 'paste') {
    res.disabled = !_ClipboardManager.default.get(this.clipboardType);
  }

  return res;
};

BlockEditor.prototype.getCmdGroupTree = function () {
  var tree = _BlockEditorCmd.BlockEditorCmdTree;
  return tree;
};

BlockEditor.prototype.activateBlock = function (block, append) {
  var idx = this.activatedBlocks.indexOf(block);

  if (idx >= 0) {
    this.activatedBlocks.splice(idx, 1);

    if (!append) {
      this.activatedBlocks.splice(0, this.activatedBlocks.length).forEach(function (blk) {
        blk.getView().removeClass('as-activated').removeClass('as-focus');
      });
    }

    this.activatedBlocks.push(block);
  } else {
    if (!append) {
      this.activatedBlocks.splice(0, this.activatedBlocks.length).forEach(function (blk) {
        blk.getView().removeClass('as-activated').removeClass('as-focus');
      });
    }

    this.activatedBlocks.push(block);
    block.getView().addClass('as-activated');
  }

  this.activatedBlocks.forEach(function (blk, i, arr) {
    if (i + 1 === arr.length) {
      blk.getView().addClass('as-focus');
    } else {
      blk.getView().removeClass('as-focus');
    }
  });
  this.notifyCmdDescriptorsChange();
};

BlockEditor.prototype.deactivateBlock = function (block) {
  var idx = this.activatedBlocks.indexOf(block);
  if (idx < 0) return;
  this.activatedBlocks.splice(idx, 1);
  block.getView().removeClass('as-activated').removeClass('as-focus');
  this.notifyCmdDescriptorsChange();
};

BlockEditor.prototype.deleteBlock = function (block) {
  this.deactivateBlock(block);
  var idx = this.blocks.indexOf(block);
  if (idx < 0) return;
  this.blocks.splice(idx, 1);
  block.destroy();
  block.getView().remove();
  this.notifyUnsaved();
};
/***
 *
 * @param {BEBase} blk
 * @returns {*}
 */


BlockEditor.prototype.isDeletableBlock = function (blk) {
  if (!blk) return false;
  if (blk.lineCount > 0) return false;
  if (window['FORM_DEV_MODE']) return true;
  if (blk._data && blk._data.attributes && blk._data.attributes.permissions && blk._data.attributes.permissions.owner === "system") return false;
  return true;
};

BlockEditor.prototype.isActivatedBlock = function (block) {
  return this.activatedBlocks.indexOf(block) >= 0;
};

BlockEditor.prototype.setClipboardBlocks = function (blocks) {
  if (blocks.length === 0) return;
  blocks = blocks.map(function (blk) {
    return blk.getData();
  });

  _ClipboardManager.default.set(this.clipboardType, blocks);

  this.notifyCmdDescriptorsChange();
};

BlockEditor.prototype.getClipboardBlocks = function () {
  var blocks = _ClipboardManager.default.get(this.clipboardType);

  if (blocks && blocks.length > 0 && blocks.push) {
    return blocks;
  }

  return null;
};

BlockEditor.prototype.findBlockById = function (id) {
  var block;

  for (var i = 0; i < this.blocks.length; ++i) {
    block = this.blocks[i];

    if (block._data && block._data.attributes && block._data.attributes.id === id) {
      return block;
    }
  }

  return null;
};

BlockEditor.prototype.ev_blockOrderChange = function (event) {
  var from = event.from;
  var to = event.to;
  var block = this.blocks.splice(from, 1)[0];
  this.blocks.splice(to, 0, block);
  this.notifyUnsaved();
  this.layoutEditor.notifyUnsaved();
};

BlockEditor.prototype.notifyUnsaved = function () {
  this.layoutEditor.notifyUnsaved();
};

BlockEditor.prototype.notifySaved = function () {
  this.layoutEditor.notifySaved();
};

var _default = BlockEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/GCore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/GCore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$$ = exports.$ = exports._ = void 0;

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _install = _interopRequireDefault(require("absol-svg/js/svg/install"));


var GCore = new _Svg.default();
(0, _install.default)(GCore);
var _ = GCore._;
exports._ = _;
var $ = GCore.$;
exports.$ = $;
var $$ = GCore.$$;
exports.$$ = $$;
var _default = GCore;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/circuit/CDENode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/circuit/CDENode.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../../core/FCore"));

var _Hanger = _interopRequireDefault(require("absol-acomp/js/Hanger"));

var _utils = require("absol-acomp/js/utils");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _GCore = _interopRequireDefault(require("../../core/GCore"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function CDENode() {
  this.pinHolders = {
    in: {},
    out: {}
  };
  this.rect = {
    width: 0,
    height: 0
  };
  this.$typeIcon = null;
  this.$nameCtn = (0, _FCore.$)('.as-cde-node-name-ctn', this);
  this.$name = (0, _FCore.$)('.as-cde-node-name', this);
  this.$decs = (0, _FCore.$)('.as-cde-node-description', this);
  /***
   *
   * @type {Hanger}
   */

  this.$header = (0, _FCore.$)('.as-cde-node-header', this);
  this.$header.hangOn = 3;
  this.$inputCtn = (0, _FCore.$)('.as-cde-node-input-ctn', this);
  this.$outputCtn = (0, _FCore.$)('.as-cde-node-output-ctn', this);
  this.$inputPins = [];
  this.$outputPins = [];
  this._inputPins = [];
  this.inputPins = this._inputPins;
  this._outputPins = [];
  this.outputPins = this._outputPins;
  this._x = 0;
  this._y = 0;
  /***
   * @name x
   * @type {number}
   * @memberOf! CDENode#
   *
   */

  /***
   * @name y
   * @type {number}
   * @memberOf! CDENode#
   *
   */

  /***
   * @name position
   * @type {Vec2}
   * @memberOf! CDENode#
   *
   */
}

CDENode.tag = 'CDENode'.toLowerCase();

CDENode.render = function () {
  return (0, _FCore._)({
    extendEvent: ['presspin'],
    class: 'as-cde-node',
    child: [{
      tag: _Hanger.default.tag,
      class: 'as-cde-node-header',
      child: [{
        class: 'as-cde-node-name-ctn',
        child: [{
          class: 'as-cde-node-name',
          child: {
            text: 'Tiêu đề'
          }
        }, {
          class: 'as-cde-node-description',
          child: {
            text: ''
          }
        }]
      }]
    }, {
      class: 'as-cde-node-body',
      child: [{
        class: 'as-cde-node-input-ctn',
        child: Array(5).fill(null).map(function (u, i) {
          return {
            class: 'as-cde-node-pin',
            child: [_GCore.default._({
              tag: 'svg',
              child: {
                tag: 'path',
                attr: {
                  d: "m 13.570174,6.3342697 c 1.607518,1.5146681 2.614487,3.6595924 2.614487,6.0338973 0,2.009296 -0.720663,3.857835 -1.916484,5.297565 L 17.83082,15.634259 23.864715,12.19871 17.83082,8.7611427 Z M 13.800004,12 A 6.7499998,6.7499998 0 0 1 7.0500003,18.75 6.7499998,6.7499998 0 0 1 0.3,12 6.7499998,6.7499998 0 0 1 7.0500003,5.25 6.7499998,6.7499998 0 0 1 13.800004,12 Z"
                }
              }
            }), {
              tag: 'span',
              child: {
                text: 'pin ' + i
              }
            }]
          };
        })
      }, {
        class: 'as-cde-node-output-ctn',
        child: Array(5).fill(null).map(function (u, i) {
          return {
            class: 'as-cde-node-pin',
            child: [{
              tag: 'span',
              child: {
                text: 'pin ' + i
              }
            }, 'span.mdi.mdi-arrow-right-bold-outline']
          };
        })
      }]
    }]
  });
};

CDENode.property = {};

CDENode.prototype.reloadPinPosition = function () {
  var pinName;
  var bound = this.getBoundingClientRect();
  this.rect.width = bound.width;
  this.rect.height = bound.height;
  var pinBound;

  for (pinName in this.pinHolders.in) {
    pinBound = this.pinHolders.in[pinName].elt.getBoundingClientRect();
    this.pinHolders.in[pinName].pos = new _Vec.default(pinBound.left - bound.left + 5, pinBound.top - bound.top + pinBound.height / 2);
  }

  for (pinName in this.pinHolders.out) {
    pinBound = this.pinHolders.out[pinName].elt.getBoundingClientRect();
    this.pinHolders.out[pinName].pos = new _Vec.default(pinBound.right - bound.left - 5, pinBound.top - bound.top + pinBound.height / 2);
  }
};

CDENode.property.inputPins = {
  set: function (pins) {
    var self = this;
    pins = pins || [];
    this._inputPins = pins;
    this.$inputPins = pins.map(function (pin) {
      return (0, _FCore._)({
        class: 'as-cde-node-pin',
        child: [_GCore.default._({
          tag: 'svg',
          class: 'as-cde-node-pin-ico',
          attr: {
            viewBox: '0 0 24 24'
          },
          child: {
            tag: 'path',
            attr: {
              d: "m 13.570174,6.3342697 c 1.607518,1.5146681 2.614487,3.6595924 2.614487,6.0338973 0,2.009296 -0.720663,3.857835 -1.916484,5.297565 L 17.83082,15.634259 23.864715,12.19871 17.83082,8.7611427 Z M 13.800004,12 A 6.7499998,6.7499998 0 0 1 7.0500003,18.75 6.7499998,6.7499998 0 0 1 0.3,12 6.7499998,6.7499998 0 0 1 7.0500003,5.25 6.7499998,6.7499998 0 0 1 13.800004,12 Z"
            }
          }
        }), {
          tag: 'span',
          child: {
            text: pin.text || pin.name
          }
        }],
        props: {
          name: pin.name
        },
        on: {
          click: self.eventHandler.pressPin.bind(null, pin.name, 'in')
        }
      });
    });
    this.$inputCtn.clearChild().addChild(this.$inputPins);
    this.pinHolders.in = this.$inputPins.reduce(function (ac, pinElt) {
      ac[pinElt.name] = {
        elt: pinElt,
        pos: new _Vec.default(0, 0)
      };
      return ac;
    }, {});
  },
  get: function () {
    return this._inputPins;
  }
};
CDENode.property.outputPins = {
  set: function (pins) {
    pins = pins || [];
    this._outputPins = pins;
    var self = this;
    this.$outputPins = pins.map(function (pin) {
      return (0, _FCore._)({
        class: 'as-cde-node-pin',
        child: [{
          tag: 'span',
          child: {
            text: pin.text || pin.name
          }
        }, _GCore.default._({
          tag: 'svg',
          class: 'as-cde-node-pin-ico',
          attr: {
            viewBox: '0 0 24 24'
          },
          child: {
            tag: 'path',
            attr: {
              d: "m 13.570174,6.3342697 c 1.607518,1.5146681 2.614487,3.6595924 2.614487,6.0338973 0,2.009296 -0.720663,3.857835 -1.916484,5.297565 L 17.83082,15.634259 23.864715,12.19871 17.83082,8.7611427 Z M 13.800004,12 A 6.7499998,6.7499998 0 0 1 7.0500003,18.75 6.7499998,6.7499998 0 0 1 0.3,12 6.7499998,6.7499998 0 0 1 7.0500003,5.25 6.7499998,6.7499998 0 0 1 13.800004,12 Z"
            }
          }
        })],
        props: {
          name: pin.name
        },
        on: {
          click: self.eventHandler.pressPin.bind(null, pin.name, 'out')
        }
      });
    });
    this.$outputCtn.clearChild().addChild(this.$outputPins);
    this.pinHolders.out = this.$outputPins.reduce(function (ac, pinElt) {
      ac[pinElt.name] = {
        elt: pinElt,
        pos: new _Vec.default(0, 0)
      };
      return ac;
    }, {});
  },
  get: function () {
    return this._outputPins;
  }
};
CDENode.property.typeIcon = {
  set: function (value) {
    this._typeIcon = value;

    if (this.$typeIcon) {
      this.$typeIcon.remove();
      this.$typeIcon = null;
    }

    if (value) {
      this.$typeIcon = (0, _FCore._)(value).addClass('as-cde-node-type-icon');
      this.$header.addChildBefore(this.$typeIcon, this.$nameCtn);
    }
  },
  get: function () {
    return this._windowIcon;
  }
};
CDENode.property.name = {
  set: function (value) {
    this.$name.firstChild.data = (value || '') + '';
  },
  get: function () {
    return this.$name.firstChild.data;
  }
};
CDENode.property.desc = {
  set: function (value) {
    this.$decs.firstChild.data = (value || '') + '';

    if (!value) {
      this.$decs.addStyle('display', 'none');
    } else {
      this.$decs.removeStyle('display');
    }
  },
  get: function () {
    return this.$decs.firstChild.data;
  }
};
CDENode.property.x = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    this._x = value;
    this.addStyle('left', value + 'px');
  },
  get: function () {
    return this._x;
  }
};
CDENode.property.y = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    this._y = value;
    this.addStyle('top', value + 'px');
  },
  get: function () {
    return this._y;
  }
};
CDENode.property.position = {
  set: function (value) {
    this.x = value.x;
    this.y = value.y;
  },
  get: function () {
    return new _Vec.default(this.x, this.y);
  }
};
CDENode.eventHandler = {};

CDENode.eventHandler.pressPin = function (pinName, mode, event) {
  this.emit('presspin', (0, _EventEmitter.copyEvent)(event, {
    type: 'presspin',
    pinName: pinName,
    mode: mode,
    target: this
  }), this);
};

_FCore.default.install(CDENode);

var _default = CDENode;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/GraphOptimizerFactor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/GraphOptimizerFactor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = GraphOptimizerFactor;

function GraphOptimizerFactor(global) {
  function Vec2(t, e) {
    this.x = t, this.y = e;
  }

  Vec2.prototype.copy = function () {
    return new Vec2(this.x, this.y);
  }, Vec2.prototype.toString = function () {
    return "(" + this.x + ", " + this.y + ")";
  }, Vec2.prototype.abs = function () {
    return Math.sqrt(this.x * this.x + this.y * this.y);
  }, Vec2.prototype.normalized = function () {
    var t = this.abs();
    return 0 == t && (t = 1), this.div(t);
  }, Vec2.prototype.mult = function (t) {
    return new Vec2(this.x * t, this.y * t);
  }, Vec2.prototype.div = function (t) {
    return new Vec2(this.x / t, this.y / t);
  }, Vec2.prototype.dist = function (t) {
    var e = t.x - this.x,
        n = t.y - this.y;
    return Math.sqrt(e * e + n * n);
  }, Vec2.prototype.sub = function (t) {
    return new Vec2(this.x - t.x, this.y - t.y);
  }, Vec2.prototype.add = function (t) {
    return new Vec2(this.x + t.x, this.y + t.y);
  }, Vec2.prototype.inv = function () {
    return new Vec2(-this.x, -this.y);
  }, Vec2.prototype.linear = function (t, e) {
    return new Vec2(this.x * (1 - e) + t.x * e, this.y * (1 - e) + t.y * e);
  }, Vec2.prototype.dot = function (t) {
    return this.x * t.x + this.y * t.y;
  }, Vec2.prototype.direction = function () {
    return Math.atan2(this.y, this.x);
  }, Vec2.prototype.translate = function (t, e) {
    return this.add(new Vec2(t, e));
  }, Vec2.prototype.rotate = function (t) {
    var e = Math.sin(t),
        n = Math.cos(t);
    return new Vec2(this.x * n - this.y * e, this.x * e + this.y * n);
  }, Vec2.prototype.rotate90 = function () {
    return new Vec2(-this.y, this.x);
  }, Vec2.fromDirection = function (t) {
    return new Vec2(Math.cos(t), Math.sin(t));
  }, Vec2.make = function (t, e) {
    return t instanceof Array ? new Vec2(t[0], t[1]) : t instanceof Vec2 ? t.copy() : new Vec2(t, e);
  };

  Vec2.prototype.cross = function (t) {
    return this.x * t.y - this.y * t.x;
  };

  function randomPosition(nodeIdArr, nodes) {
    var n = Math.sqrt(nodeIdArr.length);
    var minX = Infinity;
    var minY = Infinity;
    var d = {};
    return nodeIdArr.map(function (id) {
      var x, y;
      var found = false;
      var node = nodes[id];
      var width = node.width;
      var height = node.height;

      while (!found) {
        x = Math.floor(Math.random() * n * 5) * 4;
        y = Math.floor(Math.random() * n * 4) * 4;
        found = true;

        for (var dx = 0; dx < width && found; ++dx) {
          for (var dy = 0; dy < height && found; ++dy) {
            if (d[x + dx + '_' + (y + dy)]) found = false;
          }
        }
      }

      for (var dx = 0; dx < node.width; ++dx) {
        for (var dy = 0; dy < node.height; ++dy) {
          d[x + dx + '_' + (y + dy)] = true;
        }
      }

      minX = Math.min(minX, x);
      minY = Math.min(minY, y);
      return new Vec2(x, y);
    }).reduce(function (ac, cr, idx) {
      cr.x -= minX;
      cr.y -= minY;
      ac[nodeIdArr[idx]] = cr;
      return ac;
    }, {});
  }

  function hybrid(a, b) {
    var res = {};
    var prev, temp;

    for (var i in res) {
      if (Math.random() < 0.5 / i) res = a[i];else res = b[i];

      if (Math.random() < 0.2) {
        if (!prev) prev = i;else {
          temp = res[prev];
          res[prev] = res[i];
          res[i] = temp;
        }
      }

      if (Math.random() < 0.2 && res[i].x > 0) res[i].x -= Math.floor(Math.random() * 5) * (Math.random() > 0.5 ? 1 : -1);
      if (Math.random() < 0.2 && res[i].y > 0) res[i].y -= Math.floor(Math.random() * 5) * (Math.random() > 0.5 ? 1 : -1);
    }

    return res;
  }

  function isCross(A, B, C, D) {
    var t1 = C.sub(D).cross(D.sub(A));
    var t2 = C.sub(D).cross(D.sub(B));
    if (t1 * t2 >= 0) return false;
    var t3 = A.sub(B).cross(B.sub(C));
    var t4 = A.sub(B).cross(B.sub(D));
    if (t3 * t4 >= 0) return false;
    return true;
  }

  function calcBadScore(nodes, lines, positions) {
    var node1, node2;
    var pos1, pos2;
    var line1, line2;
    var res = 0;
    var i, j;
    var maxX = -Infinity,
        maxY = -Infinity,
        minX = Infinity,
        minY = Infinity;

    for (i in nodes) {
      node1 = nodes[i];
      pos1 = positions[i];
      maxX = Math.max(maxX, pos1.x + node1.width);
      maxY = Math.max(maxY, pos1.y + node1.height);
      minX = Math.min(minX, pos1.x);
      minY = Math.min(minY, pos1.y);
      res += pos1.x * 30 + pos1.y * 30;

      for (j in nodes) {
        if (i === j) continue;
        node2 = nodes[j];
        pos2 = positions[j];

        if (!(pos1.x > pos2.x + node2.width || pos1.y > pos2.y + node2.height || pos2.x > pos1.x + node1.width || pos2.y > pos1.y + node1.height)) {
          res += 1e7;
        }
      }
    }

    res += (maxX - minX) * (maxY - minY) * 1e2;
    var uNode, vNode;
    var posU, posV;
    var v1;
    var A, B, C, D;

    for (i in lines) {
      line1 = lines[i];
      uNode = nodes[line1.uId];
      vNode = nodes[line1.vId];
      posU = positions[line1.uId];
      posV = positions[line1.vId];
      A = new Vec2(posU.x + uNode.outputPos[line1.uPin].x, posU.y + +uNode.outputPos[line1.uPin].y);
      B = new Vec2(posV.x + vNode.inputPos[line1.vPin].x, posV.y + vNode.inputPos[line1.vPin].y);
      v1 = A.sub(B);
      res += v1.abs() * v1.abs() * 1e3;
      if (v1.x > 0) res += v1.x * v1.x * 1e4;
      res += Math.abs(v1.y) * 1e3;

      for (j in lines) {
        if (i === j) continue;
        line2 = lines[j];
        uNode = nodes[line2.uId];
        vNode = nodes[line2.vId];
        posU = positions[line2.uId];
        posV = positions[line2.vId];
        C = new Vec2(posU.x + uNode.outputPos[line2.uPin].x, posU.y + +uNode.outputPos[line2.uPin].y);
        D = new Vec2(posV.x + vNode.inputPos[line2.vPin].x, posV.y + vNode.inputPos[line2.vPin].y);

        if (isCross(A, B, C, D)) {
          res += 1e4;
        }
      }
    }

    return res;
  }

  function normalize(pos) {
    var minX = Infinity;
    var minY = Infinity;

    for (var i in pos) {
      minX = Math.min(minX, pos[i].x);
      minY = Math.min(minX, pos[i].y);
    }

    for (var i in pos) {
      pos[i].x -= minX;
      pos[i].y -= minY;
    }
  }

  global.findBeautyGrid1 = function (gridData, timeOut) {
    var now = new Date().getTime();
    var nodeIdArr = Object.keys(gridData.nodes);
    var nodes = gridData.nodes;
    var lines = gridData.lines;
    var current = nodeIdArr.reduce(function (ac, id) {
      ac[id] = {
        x: nodes[id].x,
        y: nodes[id].y
      };
      return ac;
    }, {});
    var gen = Array(6000).fill(0).map(function () {
      var positions = randomPosition(nodeIdArr, nodes);
      var badScore = calcBadScore(nodes, lines, positions);
      return {
        positions: positions,
        badScore: badScore
      };
    });
    gen.push({
      positions: current,
      badScore: calcBadScore(nodes, lines, current)
    });
    gen.sort(function (a, b) {
      return a.badScore - b.badScore;
    });
    var best = gen[0];
    var now1 = new Date().getTime();
    var gen1;
    var i, j;
    var counter = 0;

    while (now1 - now < timeOut && counter < 40) {
      gen1 = [best];

      for (i = 0; i < 33; ++i) {
        gen1.push(randomPosition(nodeIdArr, nodes));

        for (j = 0; j < 33; ++j) if (i !== j) {
          gen1.push(hybrid(gen[i], gen[j]));
        }
      }

      gen1.sort(function (a, b) {
        return a.badScore - b.badScore;
      });
      counter++;

      if (gen1[0].badScore < best.badScore) {
        best = gen1[0];
        counter = 0;
      }

      gen = gen1;
      now1 = new Date().getTime();
    }

    if (best === current) return null;
    normalize(best.positions);
    return best;
  };

  global.findBeautyGrid = function (gridData, timeout) {
    timeout = timeout || 2000;
    var now = new Date().getTime();
    var nodeIdArr = Object.keys(gridData.nodes);
    var nodes = gridData.nodes;
    var lines = gridData.lines;
    Object.keys(lines).forEach(function (lineId) {
      line = lines[lineId];

      if (!nodes[line.uId] || !nodes[line.vId]) {
        delete lines[lineId];
      }
    });
    var current = nodeIdArr.reduce(function (ac, id) {
      ac[id] = {
        x: nodes[id].x,
        y: nodes[id].y
      };
      return ac;
    }, {});
    var best = {
      positions: current,
      badScore: calcBadScore(nodes, lines, current),
      noChange: true
    };
    var inCount = Object.keys(nodes).reduce(function (ac, cr) {
      ac[cr] = 0;
      return ac;
    }, {});
    var lineByU = {};
    var lineByV = {};
    var line;

    for (var lineId in lines) {
      line = lines[lineId];
      inCount[line.vId]++;
      lineByU[line.uId] = lineByU[line.uId] || [];
      lineByU[line.uId].push(line);
      lineByV[line.vId] = lineByV[line.vId] || [];
      lineByV[line.vId].push(line);
    }

    var cols = [];
    var colWidths = [];
    var col;
    var colWidth;
    var node;
    var count = 0;
    var nodeId;
    var nodes1 = Object.assign({}, nodes);
    var minCount;

    while (count++ < 1000) {
      col = [];
      colWidth = 0;
      minCount = Infinity;

      for (nodeId in nodes1) {
        if (inCount[nodeId] === minCount) {
          col.push(nodeId);
        } else if (inCount[nodeId] < minCount) {
          minCount = inCount[nodeId];
          col = [nodeId];
        }
      }

      if (col.length > 0) {
        cols.push(col);
        col.forEach(function (nodeId) {
          colWidth = Math.max(colWidth, nodes[nodeId].width);
          delete nodes1[nodeId];
          if (lineByU[nodeId]) lineByU[nodeId].forEach(function (line) {
            var vId = line.vId;
            inCount[vId]--;
          });
        });
        colWidths.push(colWidth);
      } else break;
    }

    var maxGenLength = 2000000 / nodeIdArr.length >> 0;
    var gen = [best];
    var positions = {};
    var stop = false;

    function tryAlign(i, x) {
      if (i >= cols.length) {
        gen.push({
          positions: Object.assign({}, positions),
          badScore: calcBadScore(nodes, lines, positions)
        });

        if (gen.length % 1000 === 0) {
          if (new Date().getTime() - now > timeout) stop = true;
        }

        return;
      }

      var y;
      col = cols[i];
      var j1, j2, t;

      for (var k = col.length * col.length; !stop && k >= 0; --k) {
        y = 0;

        for (var j = 0; j < col.length; ++j) {
          nodeId = col[j];
          node = nodes[nodeId];
          positions[nodeId] = new Vec2(x, y);
          y += node.height + 2;
        }

        tryAlign(i + 1, x + colWidths[i] + 4);

        if (gen.length < maxGenLength) {
          j1 = Math.random() * col.length >> 0;
          j2 = Math.random() * col.length >> 0;

          if (j1 !== j2) {
            t = col[j1];
            col[j1] = col[j2];
            col[j2] = t;
          }
        }
      }
    }

    tryAlign(0, 0);
    gen.sort(function (a, b) {
      return a.badScore - b.badScore;
    });
    best = gen[0]; //recover cols

    cols.forEach(function (col) {
      col.sort(function (a, b) {
        return best.positions[a].y - best.positions[b].y;
      });
    });
    makeLineStraight(nodes, lines, lineByU, lineByV, cols, best.positions);
    normalize(best.positions);
    return best;
  };

  function makeLineStraight(nodes, lines, lineByU, lineByV, cols, positions) {
    var count = 10000;
    var cont = true;
    var i, j, col;
    var top, bot;
    var fLeft, fRight, f;
    var cId, cNode;

    while (count-- > 0 && cont) {
      cont = false;

      for (i = 0; i < cols.length; ++i) {
        col = cols[i];

        for (j = 0; j < col.length; ++j) {
          top = -Infinity;
          bot = Infinity;
          cId = col[j];
          cNode = nodes[cId];

          if (j > 0) {
            top = positions[col[j - 1]].y + nodes[col[j - 1]].height + 2;
          }

          if (j + 1 < col.length) {
            bot = positions[col[j + 1]].y - nodes[cId].height - 2;
          }

          fLeft = lineByV[cId] && lineByV[cId].reduce(function (ac, cr) {
            var node = nodes[cr.uId];
            var y0 = node.outputPos[cr.uPin].y + positions[cr.uId].y;
            var y1 = cNode.inputPos[cr.vPin].y + positions[cr.vId].y;
            var dy = y0 - y1;
            ac.min = Math.min(ac.min, dy);
            ac.max = Math.max(ac.max, dy);
            return ac;
          }, {
            min: Infinity,
            max: -Infinity
          });
          fLeft = fLeft || {
            min: 0,
            max: 0
          };
          fRight = lineByU[cId] && lineByU[cId].reduce(function (ac, cr) {
            var node = nodes[cr.vId];
            var y0 = node.inputPos[cr.vPin].y + positions[cr.vId].y;
            var y1 = cNode.outputPos[cr.uPin].y + positions[cr.uId].y;
            var dy = y0 - y1;
            ac.min = Math.min(ac.min, dy);
            ac.max = Math.max(ac.max, dy);
            return ac;
          }, {
            min: Infinity,
            max: -Infinity
          });
          fRight = fRight || {
            min: 0,
            max: 0
          };
          f = Math.round((fLeft.min + fLeft.max + fRight.min + fRight.max) / 4);

          if (f < 0 && positions[cId].y > top) {
            positions[cId].y--;
            cont = true;
          } else if (f > 0 && positions[cId].y < bot) {
            cont = true;
            positions[cId].y++;
          }
        }
      }
    }
  }
}

;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/NodePositionController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/NodePositionController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));


/***
 *
 * @param {CircuitDiagramEditor}  editor
 * @constructor
 */
function NodePositionController(editor) {
  this.editor = editor;

  for (var i in this) {
    if (i.startsWith('ev_')) {
      this[i] = this[i].bind(this);
    }
  }
}

NodePositionController.prototype.addEventControl = function (nodeElt) {
  nodeElt.$header.on('click', this.ev_clickNode.bind(this, nodeElt));
  nodeElt.$header.on('dragstart', this.ev_dragStart.bind(this, nodeElt));
  nodeElt.$header.on('dragend', this.ev_dragEnd.bind(this, nodeElt));
  nodeElt.$header.on('drag', this.ev_drag.bind(this, nodeElt));
};

NodePositionController.prototype.ev_clickNode = function (node, event) {
  if (node.__draging) return;
  this.editor.lineSelectController.unSelectAll();
  this.editor.nodeSelectController.toggleSelect(node, event.shiftKey);
};

NodePositionController.prototype.ev_dragStart = function (node, event) {
  if (!node.containsClass('as-selected')) {
    this.editor.lineSelectController.unSelectAll();
    this.editor.nodeSelectController.select(node);
  }

  node.__draging = Math.random() + '';
  this.dragingNodeHolders = this.editor.nodeSelectController.$selectedNodes.reduce(function (ac, cr) {
    ac[cr.nodeId] = {
      elt: cr,
      pos: new _Vec.default(cr.x, cr.y)
    };
    return ac;
  }, {});
};

NodePositionController.prototype.ev_dragEnd = function (node, event) {
  var currentDragSession = node.__draging;
  this.dragingNodeHolders = null;
  setTimeout(function () {
    if (node.__draging === currentDragSession) {
      node.__draging = null;
    }
  }, 100);
  this.editor.notifyUnsaved();
};

NodePositionController.prototype.ev_drag = function (node, event) {
  var d = event.currentPoint.sub(event.startingPoint);
  var lines = {};
  var holder;

  for (var nodeId in this.dragingNodeHolders) {
    holder = this.dragingNodeHolders[nodeId];
    holder.newPos = holder.pos.add(d);
    holder.elt.x = holder.newPos.x;
    holder.elt.y = holder.newPos.y;
    Object.assign(lines, holder.elt.lines);
  }

  for (var lineId in lines) {
    this.editor.updateLinePosition(lineId);
  }
};

var _default = NodePositionController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/ViewBoxController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/ViewBoxController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));


/***
 *
 * @param {CircuitDiagramEditor}  editor
 * @constructor
 */
function ViewBoxController(editor) {
  this.editor = editor;

  for (var i in this) {
    if (i.startsWith('ev_')) {
      this[i] = this[i].bind(this);
    }
  }
}

ViewBoxController.prototype.onCreateView = function () {
  this.$lineLayer = this.editor.$lineLayer;
  this.$lineLayer.on('dragstart', this.ev_dragStart);
  this.$nodeLayer = this.editor.$nodeLayer;
  this.$body = this.editor.$body;
  this.$body.on('wheel', this.ev_wheel);
};

ViewBoxController.prototype.ev_dragStart = function (event) {
  if (event.target === this.$lineLayer) {
    this.startOrigin = this.$lineLayer.box.origin;
    this.$lineLayer.on('drag', this.ev_drag).on('dragend', this.ev_dragEnd);
  }
};

ViewBoxController.prototype.ev_drag = function (event) {
  var d = event.currentPoint.sub(event.startingPoint);
  var newOrigin = this.startOrigin.add(d);
  this.$lineLayer.box.origin = newOrigin;
  this.$nodeLayer.addStyle({
    left: newOrigin.x + 'px',
    top: newOrigin.y + 'px'
  });
};

ViewBoxController.prototype.ev_dragEnd = function (event) {
  this.$lineLayer.off('drag', this.ev_drag).off('dragend', this.ev_dragEnd);
};

ViewBoxController.prototype.ev_wheel = function (event) {
  var d = event.deltaY < 0 ? 100 : -100;
  var newOrigin = this.$lineLayer.box.origin.add(new _Vec.default(event.shiftKey ? d : 0, event.shiftKey ? 0 : d));
  this.$lineLayer.box.origin = newOrigin;
  this.$nodeLayer.addStyle({
    left: newOrigin.x + 'px',
    top: newOrigin.y + 'px'
  });
};

ViewBoxController.prototype.scrollIntoNodes = function () {
  var nodesBound = this.getNodesBound();
  this.scrollIntoBound(nodesBound);
};

ViewBoxController.prototype.scrollIntoSelectedNodes = function () {
  var nodes = Object.values(this.editor.nodeSelectController.$selectedNodes);
  var nodesBound = this.getBoundOf(nodes);
  this.scrollIntoBound(nodesBound);
};

ViewBoxController.prototype.scrollIntoBound = function (bound) {
  var maxX = bound.x + bound.width;
  var minX = bound.x;
  var minY = bound.y;
  var maxY = bound.y + bound.height;
  var viewBox = this.$lineLayer.box.viewBox;
  /***
   * @type {Vec2}
   */

  var curOrigin = this.$lineLayer.box.origin;
  var viewRect = new _Rectangle.default(-curOrigin.x, -curOrigin.y, viewBox.width, viewBox.height);
  var contentRect = new _Rectangle.default(bound.x - 10, bound.y - 10, bound.width + 30, bound.height + 20);

  if (viewRect.contains(contentRect) || contentRect.contains(viewRect)) {
    return;
  }

  var newOriginOptions = [contentRect.A().inv(), contentRect.B().sub(new _Vec.default(viewRect.width, 0)).inv(), contentRect.C().sub(new _Vec.default(viewRect.width, viewRect.height)).inv(), contentRect.D().sub(new _Vec.default(0, viewRect.height)).inv()];
  var newOrigin = newOriginOptions.reduce((ac, cr) => {
    if (ac.dist(curOrigin) > cr.dist(curOrigin)) return cr;
    return ac;
  });
  this.$lineLayer.box.origin = newOrigin;
  this.$nodeLayer.addStyle({
    left: newOrigin.x + 'px',
    top: newOrigin.y + 'px'
  });
};

ViewBoxController.prototype.getNodesBound = function () {
  var nodes = Object.values(this.editor.$nodes);
  return this.getBoundOf(nodes);
};

ViewBoxController.prototype.getBoundOf = function (nodes) {
  var minY = Infinity,
      maxY = -Infinity,
      minX = Infinity,
      maxX = -Infinity;
  var node, found;

  for (var i = 0; i < nodes.length; ++i) {
    found = true;
    node = nodes[i];
    minX = Math.min(minX, node.x);
    minY = Math.min(minY, node.y);
    maxX = Math.max(maxX, node.x + node.rect.width);
    maxY = Math.max(maxY, node.y + node.rect.height);
  }

  return found ? {
    x: minX,
    y: minY,
    width: maxX - minX,
    height: maxY - minY
  } : {
    x: 0,
    y: 0,
    width: 0,
    height: 0
  };
};

var _default = ViewBoxController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/NodeSelectController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/NodeSelectController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {CircuitDiagramEditor}  editor
 * @constructor
 */
function NodeSelectController(editor) {
  this.editor = editor;

  for (var i in this) {
    if (i.startsWith('ev_')) {
      this[i] = this[i].bind(this);
    }
  }

  this.$selectedNodes = [];
}

NodeSelectController.prototype.select = function (nodeElt, append) {
  var idx;

  if (nodeElt) {
    idx = this.$selectedNodes.indexOf(nodeElt);

    if (append) {
      if (idx < 0) {
        this.blur();
        nodeElt.addClass('as-focus').addClass('as-selected');
        this.$selectedNodes.push(nodeElt);
      } else {
        if (idx + 1 < this.$selectedNodes.length) {
          this.blur();
          this.$selectedNodes.splice(idx, 1);
          this.$selectedNodes.push(nodeElt);
          nodeElt.addClass('as-focus');
        }
      }
    } else {
      if (idx >= 0) {
        if (idx + 1 < this.$selectedNodes.length) {
          this.blur();
          this.$selectedNodes.splice(idx, 1);
          this.unSelectAll();
          this.$selectedNodes.push(nodeElt);
          nodeElt.addClass('as-focus');
        } else {
          this.$selectedNodes.pop();
          this.unSelectAll();
          this.$selectedNodes.push(nodeElt);
        }
      } else {
        this.unSelectAll();
        this.$selectedNodes.push(nodeElt);
        nodeElt.addClass('as-focus').addClass('as-selected');
      }
    }
  } else {
    this.blur();
    this.unSelectAll();
  }
};

NodeSelectController.prototype.unSelectNode = function (node) {
  if (!node) return;
  var idx = this.$selectedNodes.indexOf(node);
  if (idx < 0) return;
  var refocus = node.containsClass('as-focus');
  node.removeClass('as-selected');

  if (refocus) {
    this.blur();
  }

  this.$selectedNodes.splice(idx, 1);

  if (refocus) {
    if (this.$selectedNodes.length > 0) {
      this.$selectedNodes[this.$selectedNodes.length - 1].addClass('as-focus');
    }
  }
};

NodeSelectController.prototype.toggleSelect = function (node, append) {
  if (node.containsClass('as-selected')) {
    if (append) this.unSelectNode(node);else {
      this.select(node, false);
    }
  } else {
    this.select(node, append);
  }
};

NodeSelectController.prototype.blur = function () {
  if (this.$selectedNodes.length > 0) {
    if (this.$selectedNodes[this.$selectedNodes.length - 1].containsClass('as-focus')) {
      this.$selectedNodes[this.$selectedNodes.length - 1].removeClass('as-focus');
    }
  }
};

NodeSelectController.prototype.unSelectAll = function () {
  this.blur();
  this.$selectedNodes.splice(0, this.$selectedNodes.length).forEach(function (elt) {
    elt.removeClass('as-selected');
  });
};

var _default = NodeSelectController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/CircuitDiagramEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/CircuitDiagramEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CircuitDiagramEditorCmdTree = exports.CircuitDiagramEditorCmdDescriptors = exports.default = void 0;

var _CmdDescriptors = _interopRequireDefault(require("../../cmds/CmdDescriptors"));


var CircuitDiagramEditorCmd = {};
/***
 * @this CircuitDiagramEditor
 */

CircuitDiagramEditorCmd.preview = function () {
  this.layoutEditor.execCmd('preview');
};

CircuitDiagramEditorCmd.importFromJson = function () {
  this.flexFormEditor.execCmd('importFromJson');
};

CircuitDiagramEditorCmd.export2sharpEncode = function () {
  this.flexFormEditor.execCmd('export2sharpEncode');
};

CircuitDiagramEditorCmd.export2clipboard = function () {
  this.flexFormEditor.execCmd('export2clipboard');
};

CircuitDiagramEditorCmd.export2Json = function () {
  this.flexFormEditor.execCmd('export2Json');
};
/***
 * @this CircuitDiagramEditor
 */


CircuitDiagramEditorCmd.autoAlignPosition = function () {
  this.autoAlignPosition();
};
/***
 * @this CircuitDiagramEditor
 */


CircuitDiagramEditorCmd.delete = function () {
  var selectedIdList = this.lineSelectController.getSelectedIdList();

  for (var i = 0; i < selectedIdList.length; ++i) this.deleteLine(selectedIdList[i]);
};
/***
 * @this CircuitDiagramEditor
 */


CircuitDiagramEditorCmd.system_owner_unlock = function () {
  var selectedIdList = this.lineSelectController.getSelectedIdList();

  for (var i = 0; i < selectedIdList.length; ++i) this.setLinePermissionOwner(selectedIdList[i], null);
};
/***
 * @this CircuitDiagramEditor
 */


CircuitDiagramEditorCmd.system_owner_lock = function () {
  var selectedIdList = this.lineSelectController.getSelectedIdList();

  for (var i = 0; i < selectedIdList.length; ++i) this.setLinePermissionOwner(selectedIdList[i], 'system');
};
/***
 * @this CircuitDiagramEditor
 */


CircuitDiagramEditorCmd.save = function () {
  this.flexFormEditor.execCmd('save');
};
/***
* @this CircuitDiagramEditor
*/


CircuitDiagramEditorCmd.saveAs = function () {
  this.flexFormEditor.execCmd('saveAs');
};
/***
 * @this CircuitDiagramEditor
 */


CircuitDiagramEditorCmd.saveAsSystem = function () {
  this.flexFormEditor.execCmd('saveAsSystem');
};
/***
 * @this CircuitDiagramEditor
 */


CircuitDiagramEditorCmd.scrollIntoNodes = function () {
  this.viewBoxCtroller.scrollIntoNodes();
};
/***
 * @this CircuitDiagramEditor
 */


CircuitDiagramEditorCmd.openIncludedBlockManager = function () {
  this.includedBlockManager.start();
};

var _default = CircuitDiagramEditorCmd;
exports.default = _default;
var CircuitDiagramEditorCmdDescriptors = Object.assign({}, _CmdDescriptors.default);
exports.CircuitDiagramEditorCmdDescriptors = CircuitDiagramEditorCmdDescriptors;
var CircuitDiagramEditorCmdTree = [['preview'], ['save', 'saveAs', 'saveAsSystem', 'importFromJson', 'export2Json', 'export2sharpEncode', 'export2clipboard'], ['delete'], ['autoAlignPosition'], ['scrollIntoNodes'], ['openIncludedBlockManager']];
exports.CircuitDiagramEditorCmdTree = CircuitDiagramEditorCmdTree;

if (window['FORM_DEV_MODE']) {
  CircuitDiagramEditorCmdTree.push(['system_owner_lock', 'system_owner_unlock']);
}
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/NewLineController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/NewLineController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _GCore = _interopRequireDefault(require("../../../core/GCore"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _utils = require("../../../core/utils");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));


function NewLineController(editor) {
  this.editor = editor;

  for (var i in this) {
    if (i.startsWith('ev_')) {
      this[i] = this[i].bind(this);
    }
  }

  this.isMouseListenning = false;
  this.u = null;
  this.v = null;
  this.lineElt = null;
  this.mousePos = null;
  this._prevClick = null;
}

NewLineController.prototype.addNodeEventControl = function (nodeElt) {
  nodeElt.on('presspin', this.ev_pressPin.bind(this, nodeElt));
};

NewLineController.prototype.ev_pressPin = function (nodeElt, event) {
  this.mousePos = new _Vec.default(event.clientX, event.clientY);
  var cClick = nodeElt.nodeId + '.' + event.mode + '.' + event.pinName;

  if (this._prevClick === cClick) {
    this.cancel();
    return;
  }

  this._prevClick = cClick;

  if (event.mode === 'out') {
    this.u = {
      nodeElt: nodeElt,
      pinName: event.pinName
    };
  } else {
    this.v = {
      nodeElt: nodeElt,
      pinName: event.pinName
    };
  }

  var id;

  if (!this.lineElt) {
    id = (0, _utils.randomUniqueIdent)();
    this.lineElt = _GCore.default._({
      tag: 'g',
      class: ['as-cde-line-group', 'as-new'],
      attr: {
        'data-line-id': id
      },
      style: {
        '--line-color': new _Color.default([Math.random(), Math.random(), Math.random(), 1]).toString()
      },
      child: [{
        tag: 'path',
        class: 'as-cde-hit-line'
      }, {
        tag: 'path',
        class: 'as-cde-line'
      }],
      props: {
        lineId: id
      }
    });
    this.editor.$lineLayer.addChild(this.lineElt);
  }

  if (!!this.u !== !!this.v && !this.isMouseListenning) {
    document.body.addEventListener('mousemove', this.ev_mouseMove);
    document.body.addEventListener('wheel', this.ev_mouseMove);
    this.isMouseListenning = true;
  }

  this._updateLinePath();

  if (this.u && this.v) {
    this.flushToEditor();
  }
};

NewLineController.prototype.ev_mouseMove = function (event) {
  this.mousePos = new _Vec.default(event.clientX, event.clientY);

  this._updateLinePath();
};

NewLineController.prototype._updateLinePath = function () {
  var viewportBound = this.editor.$lineLayer.getBoundingClientRect();
  var pInViewport = this.mousePos.sub(new _Vec.default(viewportBound.left, viewportBound.top));
  var p = pInViewport.sub(this.editor.$lineLayer.box.origin);
  var startPos;
  var endPos;

  if (this.u) {
    startPos = this.u.nodeElt.position.add(this.u.nodeElt.pinHolders.out[this.u.pinName].pos);
  }

  if (this.v) {
    endPos = this.v.nodeElt.position.add(this.v.nodeElt.pinHolders.in[this.v.pinName].pos);
  }

  startPos = startPos || p;
  endPos = endPos || p;
  var dx = 50;
  if (startPos.x > endPos.x) dx += Math.min(200, startPos.x - endPos.x) / 2;
  var path = ['M', startPos.x, startPos.y, 'C', startPos.x + dx, startPos.y, ',', endPos.x - dx, endPos.y, ',', endPos.x, endPos.y].join(' ');
  this.lineElt.lastChild.attr('d', path);
  this.lineElt.firstChild.attr('d', path);
};

NewLineController.prototype.flushToEditor = function () {
  var u = this.u.nodeElt.nodeId;
  var v = this.v.nodeElt.nodeId;
  var uPin = this.u.pinName;
  var vPin = this.v.pinName;
  var lineId = this.lineElt.lineId;
  var line = {
    u: u,
    v: v,
    uPin: uPin,
    vPin: vPin,
    id: lineId
  };

  if (!this.isDuplicatedLine(line)) {
    this.lineElt.uId = this.u.nodeElt.nodeId;
    this.lineElt.vId = this.v.nodeElt.nodeId;
    this.lineElt.uPin = uPin;
    this.lineElt.vPin = vPin;
    this.lineElt.removeClass('as-new');
    this.editor.lines.push(line);
    this.editor.$lines[lineId] = this.lineElt;
    this.u.nodeElt.lines[lineId] = line;
    this.v.nodeElt.lines[lineId] = line;
    this.editor.lineSelectController.addLineControlEvent(this.lineElt);
    this.editor.notifyUnsaved();
  } else {
    this.lineElt.remove();
  }

  if (this.isMouseListenning) {
    document.body.removeEventListener('mousemove', this.ev_mouseMove);
    document.body.removeEventListener('wheel', this.ev_mouseMove);
    this.isMouseListenning = false;
  }

  this.u = null;
  this.v = null;
  this.lineElt = null;
  this._prevClick = null;
};

NewLineController.prototype.isDuplicatedLine = function (line) {
  var nodes = this.editor.$nodes;
  return this.editor.lines.some(function (other) {
    var uId = other.u;

    if (nodes[uId]) {
      uId = nodes[uId].nodeId;
    }

    var vId = other.v;

    if (nodes[vId]) {
      vId = nodes[vId].nodeId;
    }

    return uId === line.u && vId === line.v && other.uPin === line.uPin && other.vPin === line.vPin;
  }.bind(this));
};

NewLineController.prototype.cancel = function () {
  if (this.isMouseListenning) {
    document.body.removeEventListener('mousemove', this.ev_mouseMove);
    document.body.removeEventListener('wheel', this.ev_mouseMove);
    this.isMouseListenning = false;
  }

  this.u = null;
  this.v = null;
  this._prevClick = null;

  if (this.lineElt) {
    this.lineElt.remove();
    this.lineElt = null;
  }
};

var _default = NewLineController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/LineSelectController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/controller/LineSelectController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {CircuitDiagramEditor}  editor
 * @constructor
 */
function LineSelectController(editor) {
  this.editor = editor;

  for (var i in this) {
    if (i.startsWith('ev_')) {
      this[i] = this[i].bind(this);
    }
  }

  this.$selectedLines = [];
}

LineSelectController.prototype.select = function (nodeElt, append) {
  var idx;

  if (nodeElt) {
    idx = this.$selectedLines.indexOf(nodeElt);

    if (append) {
      if (idx < 0) {
        this.blur();
        nodeElt.addClass('as-focus').addClass('as-selected');
        this.$selectedLines.push(nodeElt);
      } else {
        if (idx + 1 < this.$selectedLines.length) {
          this.blur();
          this.$selectedLines.splice(idx, 1);
          this.$selectedLines.push(nodeElt);
          nodeElt.addClass('as-focus');
        }
      }
    } else {
      if (idx >= 0) {
        if (idx + 1 < this.$selectedLines.length) {
          this.blur();
          this.$selectedLines.splice(idx, 1);
          this.unSelectAll();
          this.$selectedLines.push(nodeElt);
          nodeElt.addClass('as-focus');
        } else {
          this.$selectedLines.pop();
          this.unSelectAll();
          this.$selectedLines.push(nodeElt);
        }
      } else {
        this.unSelectAll();
        this.$selectedLines.push(nodeElt);
        nodeElt.addClass('as-focus').addClass('as-selected');
      }
    }
  } else {
    this.blur();
    this.unSelectAll();
  }
};

LineSelectController.prototype.unSelect = function (node) {
  if (!node) return;
  var idx = this.$selectedLines.indexOf(node);
  if (idx < 0) return;
  var refocus = node.containsClass('as-focus');
  node.removeClass('as-selected');

  if (refocus) {
    this.blur();
  }

  this.$selectedLines.splice(idx, 1);

  if (refocus) {
    if (this.$selectedLines.length > 0) {
      this.$selectedLines[this.$selectedLines.length - 1].addClass('as-focus');
    }
  }
};

LineSelectController.prototype.toggleSelect = function (node, append) {
  if (node.hasClass('as-selected')) {
    if (append) this.unSelect(node);else {
      this.select(node, false);
    }
  } else {
    this.select(node, append);
  }
};

LineSelectController.prototype.blur = function () {
  if (this.$selectedLines.length > 0) {
    if (this.$selectedLines[this.$selectedLines.length - 1].hasClass('as-focus')) {
      this.$selectedLines[this.$selectedLines.length - 1].removeClass('as-focus');
    }
  }
};

LineSelectController.prototype.getSelectedIdList = function () {
  return this.$selectedLines.map(function (elt) {
    return elt.lineId;
  });
};

LineSelectController.prototype.unSelectAll = function () {
  this.blur();
  this.$selectedLines.splice(0, this.$selectedLines.length).forEach(function (elt) {
    elt.removeClass('as-selected');
  });
};

LineSelectController.prototype.addLineControlEvent = function (lineElt) {
  lineElt.on('click', this.ev_lineClick.bind(this, lineElt));
};

LineSelectController.prototype.ev_lineClick = function (lineElt, event) {
  this.editor.nodeSelectController.unSelectAll();
  this.toggleSelect(lineElt, event.shiftKey);
};

var _default = LineSelectController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/IncludedBlockManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/IncludedBlockManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

require("../../../css/includedblockmanager.css");

require("absol-acomp/css/messagedialog.css");

var _Searcher = _interopRequireDefault(require("absol-acomp/js/Searcher"));

var _FlexiconButton = _interopRequireDefault(require("absol-acomp/js/FlexiconButton"));

var _search = _interopRequireWildcard(require("absol-acomp/js/list/search"));




/****
 * @extends Fragment
 * @constructor
 * @param {CircuitDiagramEditor} editor
 */
function IncludedBlockManager(editor) {
  _Fragment.default.call(this);

  this.editor = editor;
  this.changed = {};
}

_OOP.default.mixClass(IncludedBlockManager, _Fragment.default);

IncludedBlockManager.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    class: ['as-included-block-manager', 'as-message-dialog'],
    child: [{
      class: 'as-message-dialog-header',
      child: {
        tag: 'span',
        class: 'as-message-dialog-title',
        child: {
          text: 'Included Block Manager'
        }
      }
    }, {
      class: ['as-message-dialog-body'],
      child: [{
        class: 'as-included-block-manager-search-ctn',
        child: [{
          tag: _Searcher.default.tag
        }]
      }, {
        class: ['as-included-block-manager-table-wrapper'],
        child: [{
          class: ['as-included-block-manager-table-scroller', 'as-bscroller'],
          child: {
            tag: 'table',
            class: 'as-included-block-manager-table',
            child: [{
              tag: 'thead',
              child: [{
                tag: 'tr',
                child: [{
                  tag: 'th',
                  child: {
                    text: 'Include'
                  }
                }, {
                  tag: 'th',
                  child: {
                    text: 'ID'
                  }
                }, {
                  tag: 'th',
                  child: {
                    text: 'Name'
                  }
                }, {
                  tag: 'th',
                  child: {
                    text: 'Type'
                  }
                }, {
                  tag: 'th',
                  child: {
                    text: 'Lines'
                  }
                }]
              }]
            }, {
              tag: 'tbody',
              child: []
            }]
          }
        }, {
          class: 'as-included-block-manager-table-header-ctn',
          child: [{
            class: 'as-included-block-manager-table-header-cell',
            child: {
              text: 'Include'
            }
          }, {
            class: 'as-included-block-manager-table-header-cell',
            child: {
              text: 'ID'
            }
          }, {
            class: 'as-included-block-manager-table-header-cell',
            child: {
              text: 'Type'
            }
          }, {
            class: 'as-included-block-manager-table-header-cell',
            child: {
              text: 'Name'
            }
          }, {
            class: 'as-included-block-manager-table-header-cell',
            child: {
              text: 'Lines'
            }
          }]
        }]
      }]
    }, {
      class: 'as-message-dialog-footer',
      child: [{
        tag: _FlexiconButton.default.tag,
        class: ['as-included-block-manager-cancel-btn', 'secondary'],
        props: {
          text: 'Cancel'
        }
      }, {
        tag: _FlexiconButton.default.tag,
        class: ['as-included-block-manager-ok-btn', 'primary'],
        props: {
          text: 'OK'
        }
      }]
    }]
  });
  this.$modal = (0, _FCore._)('modal');
  this.$modal.addChild(this.$view);
  this.$table = (0, _FCore.$)('.as-included-block-manager-table', this.$view);
  this.$tbody = (0, _FCore.$)('tbody', this.$table);
  this.$ths = (0, _FCore.$$)('thead th', this.$table);
  this.$fixedCells = (0, _FCore.$$)('.as-included-block-manager-table-header-cell', this.$view);
  this.$okBtn = (0, _FCore.$)('.as-included-block-manager-ok-btn', this.$view).on('click', this.ok.bind(this));
  this.$cancelBtn = (0, _FCore.$)('.as-included-block-manager-cancel-btn', this.$view).on('click', this.cancel.bind(this));
  this.$search = (0, _FCore.$)(_Searcher.default.tag, this.$view).on('stoptyping', this.ev_search.bind(this));
};

IncludedBlockManager.prototype.onResume = function () {
  this.getView();
  document.body.appendChild(this.$modal);
  this.$search.value = '';
  this.loadTable();
};

IncludedBlockManager.prototype.onPause = function () {
  this.$modal.remove();
};

IncludedBlockManager.prototype.ok = function () {
  this.pause();
  var nodeSheet = this.editor.getNodeSheet();
  var changed = this.changed;
  var editor = this.editor;
  var nodeElt;
  var nodeInf;
  var count = 0;
  var posChange = false;
  var nodesBound = editor.viewBoxCtroller.getNodesBound();
  var y = nodesBound.y + nodesBound.height + 10;
  var x = 0;
  var i;
  var newNodes = [];

  for (var nodeId in changed) {
    posChange = true;

    if (changed[nodeId]) {
      nodeInf = nodeSheet.byId[nodeId];
      nodeElt = editor._makeNodeElt({
        typeIcon: nodeInf.clazz.prototype.menuIcon,
        name: nodeInf.displayName || nodeInf.name || nodeInf.id,
        inputPins: nodeInf.inputPins,
        outputPins: nodeInf.outputPins,
        inputLines: {},
        outputLines: {},
        title: nodeId,
        nodeId: nodeId,
        x: x,
        y: y
      });
      editor.$nodes[nodeId] = nodeElt;
      editor.$nodeLayer.addChild(nodeElt);
      nodeElt.reloadPinPosition();
      if (this.editor.diagram.includedBlocks.indexOf(nodeId) < 0) this.editor.diagram.includedBlocks.push(nodeId);
      this.editor.diagram.positions[nodeId] = {
        x: x,
        y: y
      };
      x += 10 + nodeElt.rect.width;
      newNodes.push(nodeElt);
    } else {
      nodeElt = editor.$nodes[nodeId];
      nodeElt.remove();
      i = this.editor.diagram.includedBlocks.indexOf(nodeId);
      if (i >= 0) this.editor.diagram.includedBlocks.splice(i, 1);
      delete this.editor.diagram.positions[nodeId];
    }
  }

  if (newNodes.length > 0) {
    this.editor.nodeSelectController.unSelectAll();
    newNodes.forEach(node => {
      this.editor.nodeSelectController.select(node, true);
    });
    this.editor.viewBoxCtroller.scrollIntoSelectedNodes();
  }
};

IncludedBlockManager.prototype.cancel = function () {
  this.pause();
};

IncludedBlockManager.prototype.query = function (text) {
  text = text.trim();

  if (text.length === 0) {
    this.$tbody.clearChild().addChild(this.$rows);
    this.requestUpdateSize();
    return;
  }

  var items = this.$rows.map(function (elt) {
    return elt.searchItem;
  });
  var sItems = (0, _search.searchListByText)(text, items);
  var rows = sItems.map(function (item) {
    return this.$rows[item.value];
  }.bind(this));
  this.$tbody.clearChild();
  this.$tbody.addChild(rows);
  this.requestUpdateSize();
};

IncludedBlockManager.prototype.requestUpdateSize = function () {
  this.$fixedCells.forEach(function (cell, i, arr) {
    var oCell = this.$ths[i];
    var oBound = oCell.getBoundingClientRect();
    cell.addStyle('width', (arr.length - 1 === i ? 1 : 0) + oBound.width + 'px');
  }.bind(this));
};

IncludedBlockManager.prototype.loadTable = function () {
  var self = this;
  var changed = {};
  this.changed = changed;
  this.$tbody.clearChild();
  var nodeSheet = this.editor.getNodeSheet();
  var lineByU = this.editor.lines.reduce(function (ac, line) {
    ac[line.u] = ac[line.u] || {};
    ac[line.u][line.id] = line;
    return ac;
  }, {});
  var lineByV = this.editor.lines.reduce(function (ac, line) {
    ac[line.v] = ac[line.v] || {};
    ac[line.v][line.id] = line;
    return ac;
  }, {});
  this.$rows = nodeSheet.list.map(function (it, idx) {
    var id = it.id;
    var name = it.name;
    var lines = Object.assign({}, lineByU[id], lineByU[name], lineByV[id], lineByV[name]);
    var lineCount = Object.keys(lines).length;
    var checked = !!this.editor.$nodes[id];
    var rowElt = (0, _FCore._)({
      tag: 'tr',
      props: {
        idx: idx,
        searchItem: (0, _search.default)({
          text: [checked ? 'checked' : '', it.bTag, id || '', name || '', it.displayName || ''].join(' '),
          value: idx
        }),
        blockId: id
      },
      child: [{
        tag: 'td',
        child: {
          tag: 'checkboxbutton',
          props: {
            checked: checked,
            disabled: checked && lineCount > 0
          },
          on: {
            change: function () {
              if (this.checked !== checked) {
                rowElt.addClass(checked ? 'as-will-removed' : 'as-will-added');
                changed[id] = this.checked;
              } else {
                delete changed[id];
                rowElt.removeClass(checked ? 'as-will-removed' : 'as-will-added');
              }
            }
          }
        }
      }, {
        tag: 'td',
        child: {
          tag: 'span',
          child: {
            text: it.name
          }
        }
      }, {
        tag: 'td',
        child: [it.clazz.prototype.menuIcon, {
          tag: 'span',
          child: {
            text: it.bTag
          }
        }]
      }, {
        tag: 'td',
        child: {
          tag: 'span',
          child: {
            text: it.displayName || ''
          }
        }
      }, {
        tag: 'td',
        child: {
          tag: 'span',
          child: {
            text: lineCount + ''
          }
        }
      }]
    });
    return rowElt;
  }.bind(this));
  this.$tbody.addChild(this.$rows);
  this.requestUpdateSize();
};

IncludedBlockManager.prototype.ev_search = function (event) {
  this.query(this.$search.value);
};

var _default = IncludedBlockManager;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/diagrameditor/CircuitDiagramEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/diagrameditor/CircuitDiagramEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _BaseEditor = _interopRequireDefault(require("../../core/BaseEditor"));

var _FCore = _interopRequireWildcard(require("../../core/FCore"));

require("../../../css/circuitdiagram.css");

var _SvgViewBox = _interopRequireDefault(require("absol-svg/js/svg/SvgViewBox"));

var _GCore = _interopRequireDefault(require("../../core/GCore"));

var _Assembler = require("../../core/Assembler");

var _CDENode = _interopRequireDefault(require("../../dom/circuit/CDENode"));

var _IndexedPropertyNames = _interopRequireDefault(require("../../core/IndexedPropertyNames"));

var _R = _interopRequireDefault(require("../../R"));

var _FNode = require("../../core/FNode");

var _BaseBlock = _interopRequireDefault(require("../../core/BaseBlock"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _Thread = _interopRequireDefault(require("absol/src/Network/Thread"));

var _GraphOptimizerFactor = _interopRequireDefault(require("./GraphOptimizerFactor"));

var _NodePositionController = _interopRequireDefault(require("./controller/NodePositionController"));

var _ViewBoxController = _interopRequireDefault(require("./controller/ViewBoxController"));

var _Hanger = _interopRequireDefault(require("absol-acomp/js/Hanger"));

var _NodeSelectController = _interopRequireDefault(require("./controller/NodeSelectController"));

var _CMDTool = _interopRequireDefault(require("../../fragment/CMDTool"));

var _CircuitDiagramEditorCmd = _interopRequireWildcard(require("./CircuitDiagramEditorCmd"));

var _ClipboardManager = _interopRequireDefault(require("../../ClipboardManager"));

var _LoadingCubeModal = _interopRequireDefault(require("absol-acomp/js/LoadingCubeModal"));

var _NewLineController = _interopRequireDefault(require("./controller/NewLineController"));

var _LineSelectController = _interopRequireDefault(require("./controller/LineSelectController"));

var _IncludedBlockManager = _interopRequireDefault(require("./IncludedBlockManager"));

var _utils = require("absol-acomp/js/utils");




/***
 * @extends BaseEditor
 * @constructor
 */
function CircuitDiagramEditor() {
  _BaseEditor.default.call(this);

  this.viewBoxCtroller = new _ViewBoxController.default(this);
  this.nodeController = new _NodePositionController.default(this);
  this.nodeSelectController = new _NodeSelectController.default(this);
  this.lineSelectController = new _LineSelectController.default(this);
  this.newLineController = new _NewLineController.default(this);
  this.cmdTool = new _CMDTool.default();
  this.includedBlockManager = new _IncludedBlockManager.default(this);

  for (var i in this) {
    if (i.startsWith('ev_')) {
      this[i] = this[i].bind(this);
    }
  }

  this.$nodes = {};
  this.$lines = {};
  this.lines = [];
  this.diagram = {};

  if (!CircuitDiagramEditor.optimizer) {
    CircuitDiagramEditor.optimizer = new _Thread.default({
      methods: {
        GraphOptimizerFactor: _GraphOptimizerFactor.default
      },
      extendCode: 'GraphOptimizerFactor(self);'
    });

    CircuitDiagramEditor.optimizer.findBeautyGrid = function () {
      return this.invoke.apply(this, ['findBeautyGrid'].concat(Array.prototype.slice.call(arguments)));
    };
  }

  this.optimizer = CircuitDiagramEditor.optimizer;
  this.cmdTool.attach(this);
  this.cmdTool.bindWithEditor(this);
  this.cmdRunner.assign(_CircuitDiagramEditorCmd.default);
  Object.keys(_CircuitDiagramEditorCmd.CircuitDiagramEditorCmdDescriptors).forEach(function (cmd) {
    if (_CircuitDiagramEditorCmd.CircuitDiagramEditorCmdDescriptors[cmd].bindKey) this.bindKeyToCmd(_CircuitDiagramEditorCmd.CircuitDiagramEditorCmdDescriptors[cmd].bindKey.win, cmd);
  }.bind(this));
}

_OOP.default.mixClass(CircuitDiagramEditor, _BaseEditor.default);

CircuitDiagramEditor.prototype.onStart = function () {
  this.cmdTool.start();
};

CircuitDiagramEditor.prototype.onPause = function () {
  this.cmdTool.pause();
};

CircuitDiagramEditor.prototype.notifySaved = function () {
  this.flexFormEditor.notifySaved();
};

CircuitDiagramEditor.prototype.notifyUnsaved = function () {
  this.flexFormEditor.notifyUnsaved();
};

CircuitDiagramEditor.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    class: ['as-cde', 'as-choose-remove-line'],
    attr: {
      tabindex: 1
    },
    child: [{
      class: 'as-cde-header',
      child: [this.cmdTool.getView()]
    }, {
      class: 'as-cde-body',
      child: [_GCore.default._({
        tag: _SvgViewBox.default.tag,
        class: 'as-cde-line-layer'
      }), {
        class: 'as-cde-node-layer',
        style: {
          left: '10px',
          top: '10px'
        }
      }, {
        class: 'as-cde-loading-modal',
        child: {
          class: 'as-cde-loading',
          child: 'cube-loading-ico'
        }
      }]
    }]
  });
  this.$body = (0, _FCore.$)('.as-cde-body', this.$view);
  this.$lineLayer = (0, _FCore._)({
    tag: _Hanger.default.tag,
    elt: (0, _FCore.$)('.as-cde-line-layer', this.$view)
  });
  this.$lineLayer.box.origin = new _Vec.default(10, 10);
  this.$nodeLayer = (0, _FCore.$)('.as-cde-node-layer', this.$view);
  this.viewBoxCtroller.onCreateView();
  this.$view.on('keydown', this.ev_cmdKeyDown.bind(this));
};

CircuitDiagramEditor.prototype._clearView = function () {
  this.lineSelectController.unSelectAll();
  this.nodeSelectController.unSelectAll();
  var id;

  for (id in this.$nodes) {
    this.$nodes[id].remove();
  }

  for (id in this.$lines) {
    this.$lines[id].remove();
  }

  this.$nodes = {};
  this.$lines = {};
};

CircuitDiagramEditor.prototype.setData = function (lines, diagram) {
  this._clearView();

  this.lines = lines;
  this.diagram = diagram;

  this._updateNodes();

  this._updateLines();

  if (!diagram || !diagram.positions) setTimeout(this.autoAlignPosition.bind(this), 100);
};

CircuitDiagramEditor.prototype.getLineData = function () {
  return this.lines;
};

CircuitDiagramEditor.prototype.getDiagramData = function () {
  var positions = {};
  var nodeElt;

  for (var nodeId in this.$nodes) {
    nodeElt = this.$nodes[nodeId];
    positions[nodeId] = {
      x: nodeElt.x,
      y: nodeElt.y
    };
  }

  return {
    includedBlocks: Object.keys(this.$nodes),
    positions: positions
  };
};

CircuitDiagramEditor.prototype._makeNodeElt = function (props) {
  /***
   * @type {CDENode}
   */
  var nodeElt = (0, _FCore._)({
    tag: _CDENode.default.tag,
    props: Object.assign({
      lines: []
    }, props)
  });
  nodeElt.$header.on('dblclick', this.viewTo.bind(this, props.classType, props.nodeId));
  this.nodeController.addEventControl(nodeElt);
  this.newLineController.addNodeEventControl(nodeElt);
  return nodeElt;
};

CircuitDiagramEditor.prototype.onAttached = function () {
  /***
   *
   * @type {FlexFormEditor}
   */
  this.flexFormEditor = this.getContext(_R.default.FLEX_FORM_EDITOR);
  /***
   *
   * @type {LayoutEditor}
   */

  this.layoutEditor = this.getContext(_R.default.LAYOUT_EDITOR);
  /***
   *
   * @type {FormEditor}
   */

  this.formEditor = this.getContext(_R.default.FORM_EDITOR);
  /***
   * @type {BlockEditor}
   */

  this.blockEditor = this.getContext(_R.default.BLOCK_EDITOR);
};

CircuitDiagramEditor.prototype.onResume = function () {
  this._updateNodes();

  this._updateLines();

  this.cmdTool.resume();
};

CircuitDiagramEditor.prototype._updateNodes = function () {
  var nodeSheet = this.getNodeSheet();
  var displayedBlockDict = this.lines.reduce(function (ac, cr) {
    var uNode = nodeSheet.byId[cr.u];
    var vNode = nodeSheet.byId[cr.v];
    if (uNode) ac[uNode.id] = uNode;
    if (vNode) ac[vNode.id] = vNode;
    return ac;
  }, {});

  if (this.diagram && this.diagram.includedBlocks) {
    this.diagram.includedBlocks.reduce(function (ac, cr) {
      var node = nodeSheet.byId[cr];

      if (node) {
        ac[node.id] = node;
      }

      return ac;
    }, displayedBlockDict);
  }

  var nodeId;

  for (nodeId in this.$nodes) {
    if (!displayedBlockDict[nodeId]) {
      this.$nodes[nodeId].remove();
      delete this.$nodes[nodeId];
    }
  }

  var nodeElt;
  var nodeInf;

  for (nodeId in displayedBlockDict) {
    nodeElt = this.$nodes[nodeId];
    nodeInf = displayedBlockDict[nodeId];

    if (!nodeElt) {
      if (!nodeInf.clazz) {
        console.error('block error', nodeInf);
      }

      nodeElt = this._makeNodeElt({
        typeIcon: nodeInf.clazz.prototype.menuIcon,
        name: nodeInf.displayName || nodeInf.name || nodeInf.id,
        displayName: nodeInf.displayName,
        inputPins: nodeInf.inputPins,
        outputPins: nodeInf.outputPins,
        inputLines: {},
        outputLines: {},
        title: nodeId,
        nodeId: nodeId,
        classType: nodeInf.type
      });

      if (this.diagram && this.diagram && this.diagram.positions && this.diagram.positions[nodeId]) {
        nodeElt.x = this.diagram.positions[nodeId].x;
        nodeElt.y = this.diagram.positions[nodeId].y;
      }

      this.$nodes[nodeId] = nodeElt;
      this.$nodeLayer.addChild(nodeElt);
      nodeElt.reloadPinPosition();
    } else {
      if (nodeElt.name !== (nodeInf.displayName || nodeInf.name)) {
        nodeElt.name = nodeInf.displayName || nodeInf.name;
        nodeElt.reloadPinPosition();
      }
    }
  }
};

CircuitDiagramEditor.prototype._updateLines = function () {
  var line;
  var lineElt;
  var startNode, endNode;
  var nodeSheet = this.getNodeSheet();
  var u, v;
  var uId, vId;
  var invalidLines = [];
  var lineColor;

  for (var i = 0; i < this.lines.length; ++i) {
    line = this.lines[i];
    u = nodeSheet.byId[line.u];
    v = nodeSheet.byId[line.v];
    if (!u || !v) continue;
    uId = u.id;
    vId = v.id;
    startNode = this.$nodes[uId];
    endNode = this.$nodes[vId];
    lineElt = this.$lines[line.id];

    if (!lineElt) {
      lineColor = new _Color.default([Math.random(), Math.random(), Math.random(), 1]);
      lineElt = _GCore.default._({
        tag: 'g',
        class: 'as-cde-line-group',
        style: {
          '--line-color': lineColor.toString(),
          '--line-lock-color': lineColor.getContrastYIQ().toString()
        },
        attr: {
          'data-id': line.id
        },
        child: [{
          tag: 'path',
          class: 'as-cde-hit-line'
        }, {
          tag: 'path',
          class: 'as-cde-line'
        }, {
          tag: 'path',
          class: 'as-cde-line-lock'
        }],
        props: {
          uId: uId,
          vId: vId,
          uPin: line.uPin,
          vPin: line.vPin,
          lineId: line.id
        }
      });

      if (line.permissions && line.permissions.owner) {
        lineElt.attr('data-permission-owner', line.permissions.owner);
      }

      this.lineSelectController.addLineControlEvent(lineElt);
      this.$lines[line.id] = lineElt;
      this.$lineLayer.addChild(lineElt);
      startNode.lines[line.id] = line;
      endNode.lines[line.id] = line;
    }

    if (!this.updateLinePosition(line.id)) {
      invalidLines.push(line.id);
    }
  }

  if (invalidLines.length > 0) {
    console.error("Invalid lines: ", invalidLines.map(function (id) {
      return this.lines.find(function (line) {
        return line.id === id;
      });
    }.bind(this)));
  }

  invalidLines.forEach(function (id) {
    this.deleteLine(id);
  }.bind(this));
};

CircuitDiagramEditor.prototype.updateLinePosition = function (id) {
  var lineElt = this.$lines[id];
  if (!lineElt) return true;
  var uId = lineElt.uId;
  var vId = lineElt.vId;
  var startNode = this.$nodes[uId];
  var endNode = this.$nodes[vId];

  if (!startNode || !endNode) {
    return false;
  }

  var startPinHolder = startNode.pinHolders.out[lineElt.uPin];
  var endPinHolder = endNode.pinHolders.in[lineElt.vPin];

  if (!startPinHolder || !endPinHolder) {
    return false;
  }

  var startPos = startNode.position.add(startPinHolder.pos);
  var endPos = endNode.position.add(endPinHolder.pos);
  var dx = 50;
  if (startPos.x > endPos.x) dx += Math.min(200, startPos.x - endPos.x) / 2;
  var path = ['M', startPos.x, startPos.y, 'C', startPos.x + dx, startPos.y, ',', endPos.x - dx, endPos.y, ',', endPos.x, endPos.y].join(' ');
  lineElt.lastChild.attr('d', path);
  lineElt.childNodes[1].attr('d', path);
  lineElt.firstChild.attr('d', path);
  return true;
};

CircuitDiagramEditor.prototype.focusNode = function (node) {
  node = node || null;
  this.nodeSelectController.select(node, false);
};
/***
 *
 * @param {string} id
 */


CircuitDiagramEditor.prototype.deleteLine = function (id) {
  var lineElt = this.$lines[id];
  if (!lineElt) return;
  lineElt.remove();
  var uNodeElt = this.$nodes[lineElt.uId];
  var vNodeElt = this.$nodes[lineElt.vId];
  delete uNodeElt.lines[lineElt.lineId];
  delete vNodeElt.lines[lineElt.lineId];
  delete this.$lines[lineElt.lineId];
  var lineIdx = this.lines.findIndex(function (it) {
    return it.id === lineElt.lineId;
  });

  if (lineIdx >= 0) {
    this.lines.splice(lineIdx, 1);
    this.notifyUnsaved();
  } else {
    console.error("Editor error: Could not find line id: " + lineElt.lineId);
  }
};
/***
 *
 * @param {string} id
 */


CircuitDiagramEditor.prototype.setLinePermissionOwner = function (id, owner) {
  var lineElt = this.$lines[id];
  var lineIdx = this.lines.findIndex(function (it) {
    return it.id === lineElt.lineId;
  });
  if (!lineElt || lineIdx < 0) return;
  var line = this.lines[lineIdx];

  if (owner) {
    lineElt.attr('data-permission-owner', owner);
    line.permissions = line.permissions || {};

    if (line.permissions.owner !== owner) {
      line.permissions.owner = owner;
      this.notifyUnsaved();
    }
  } else {
    lineElt.attr('data-permission-owner', undefined);

    if (line.permissions) {
      if (line.permissions.owner) {
        delete line.permissions.owner;
        this.notifyUnsaved();
      }
    }

    if (Object.keys(line.permissions).length === 0) {
      delete line.permissions;
    }
  }
};

CircuitDiagramEditor.prototype.getNodeSheet = function () {
  if (this._pointListCache && !this._pointListCache.expire) {
    return this._pointListCache;
  }

  this._pointListCache = {};
  setTimeout(function () {
    this.expire = true;
  }.bind(this._pointListCache), 300);
  var list = [];
  var rootLayout = this.layoutEditor.rootLayout;
  var rootFragment = this.layoutEditor.rootFragment;
  (0, _FNode.traversal)(rootLayout, function (path) {
    var node = path.node;
    var item;
    var pinCmp;

    if (node.fragment === rootFragment) {
      var clazz = _Assembler.AssemblerInstance.classes['COMPONENT'][node.tag];
      item = {
        type: 'COMPONENT',
        id: node.attributes.id,
        name: node.attributes.name,
        displayName: node.attributes.displayName,
        text: '[' + node.tag + '] ' + node.attributes.name,
        value: node.attributes.id,
        order: 'z_' + node.tag + '_' + node.attributes.name,
        bTag: node.tag,
        pinList: Object.keys(node.pinHandlers).map(function (name) {
          return {
            text: name,
            value: name
          };
        }),
        clazz: clazz
      };

      pinCmp = function (a, b) {
        var av = _IndexedPropertyNames.default[a.name] || 100;

        if (clazz.prototype.pinHandlers[a.name].get && clazz.prototype.pinHandlers[a.name].receives) {
          av /= 1000;
        }

        var bv = _IndexedPropertyNames.default[b.name] || 100;

        if (clazz.prototype.pinHandlers[b.name].get && clazz.prototype.pinHandlers[b.name].receives) {
          bv /= 1000;
        }

        return av - bv;
      };

      item.inputPins = Object.keys(clazz.prototype.pinHandlers).map(function (pinName) {
        if (clazz.prototype.pinHandlers[pinName].receives) return {
          name: pinName
        };else return null;
      }).filter(function (it) {
        return !!it;
      });
      item.inputPins.sort(pinCmp);
      item.outputPins = Object.keys(clazz.prototype.pinHandlers).map(function (pinName) {
        if (clazz.prototype.pinHandlers[pinName].get) return {
          name: pinName
        };else return null;
      }).filter(function (it) {
        return !!it;
      });
      item.outputPins.sort(pinCmp);

      if (node.tag.toLowerCase().match(/input|radio|checkbox|track|combo/)) {
        item.order = 'a_' + node.tag + '_' + node.attributes.name;
      } else if (node.tag.toLowerCase().match(/button|label|text/)) {
        item.order = 'c_' + node.tag + '_' + node.attributes.name;
      }

      list.push(item);
    } else {
      item = {
        type: 'FRAGMENT',
        id: node.attributes.id,
        name: node.attributes.name,
        displayName: node.attributes.displayName,
        text: '[' + node.tag + '] ' + node.attributes.name,
        value: node.attributes.id,
        order: 'f_fragment' + +'_' + node.attributes.name,
        bTag: node.tag,
        pinList: Object.keys(node.fragment.pinHandlers).map(function (name) {
          return {
            text: name,
            value: name
          };
        }),
        clazz: node.fragment.constructor
      };
      item.inputPins = [{
        name: 'props'
      }];
      item.outputPins = [{
        name: 'props'
      }];
      list.push(item);
      path.skipChildren();
    }
  });
  var blocks = this.flexFormEditor.blockEditor.getData();
  blocks.forEach(function (block) {
    var id = block.attributes && block.attributes.id;
    var name = block.attributes && block.attributes.name;
    var clazz = _Assembler.AssemblerInstance.classes['BLOCK'][block.tag] || _BaseBlock.default;
    var pinCmp;
    if (!id) return;
    var item = {
      type: 'BLOCK',
      id: id,
      name: name,
      displayName: block.attributes.displayName,
      text: '[' + block.tag + '] ' + id,
      value: id,
      order: 'b_' + block.tag + '_' + id,
      bTag: block.tag,
      pinList: Object.keys(clazz.prototype.pinHandlers).map(function (name) {
        return {
          text: name,
          value: name
        };
      }),
      clazz: _Assembler.AssemblerInstance.classes['BLOCK'][block.tag]
    };

    pinCmp = function (a, b) {
      var av = _IndexedPropertyNames.default[a.name] || 100;

      if (clazz.prototype.pinHandlers[a.name] && clazz.prototype.pinHandlers[a.name].get && clazz.prototype.pinHandlers[a.name].receives) {
        av /= 1000;
      }

      var bv = _IndexedPropertyNames.default[b.name] || 100;

      if (clazz.prototype.pinHandlers[b.name] && clazz.prototype.pinHandlers[b.name].get && clazz.prototype.pinHandlers[b.name].receives) {
        bv /= 1000;
      }

      return av - bv;
    };

    item.inputPins = Object.keys(clazz.prototype.pinHandlers).map(function (pinName) {
      if (clazz.prototype.pinHandlers[pinName].receives) return {
        name: pinName
      };else return null;
    }).filter(function (it) {
      return !!it;
    });

    if (block.tag === 'function' && block.attributes && block.attributes.args) {
      item.inputPins.unshift.apply(item.inputPins, block.attributes.args.map(function (it) {
        return {
          name: it
        };
      }));
    }

    item.inputPins.sort(pinCmp);
    item.outputPins = Object.keys(clazz.prototype.pinHandlers).map(function (pinName) {
      if (clazz.prototype.pinHandlers[pinName].get) return {
        name: pinName
      };else return null;
    }).filter(function (it) {
      return !!it;
    });

    if (block.tag === 'CBCmpSwitch' && block.attributes && block.attributes.cases) {
      item.outputPins.unshift.apply(item.outputPins, block.attributes.cases.map(function (it) {
        return {
          name: it.ret
        };
      }));
    }

    item.outputPins.sort(pinCmp);
    list.push(item);
  });
  list.sort(function (a, b) {
    a = a.order;
    b = b.order;
    if (a === b) return 0;
    if (a < b) return -1;
    return 1;
  });
  this._pointListCache.list = list;
  this._pointListCache.byId = list.reduce(function (ac, cr) {
    ac[cr.id] = cr;
    return ac;
  }, {});
  return this._pointListCache;
};

CircuitDiagramEditor.prototype.getGridData = function () {
  var res = {
    nodes: {},
    lines: {}
  };
  var nodeElt;
  var nodeData;

  for (var i in this.$nodes) {
    nodeElt = this.$nodes[i];
    nodeData = {
      x: nodeElt.x / 25,
      y: nodeElt.y / 25,
      width: Math.ceil(nodeElt.rect.width / 25),
      height: Math.ceil(nodeElt.rect.height / 25),
      inputPos: nodeElt.inputPins.reduce(function (ac, cr, idx) {
        var pos = nodeElt.pinHolders.in[cr.name].pos;
        ac[cr.name] = {
          x: pos.x / 25,
          y: pos.y / 25
        };
        return ac;
      }, {}),
      outputPos: nodeElt.outputPins.reduce(function (ac, cr, idx) {
        var pos = nodeElt.pinHolders.out[cr.name].pos;
        ac[cr.name] = {
          x: pos.x / 25,
          y: pos.y / 25
        };
        return ac;
      }, {})
    };
    res.nodes[i] = nodeData;
  }

  var lineElt;

  for (var j in this.$lines) {
    lineElt = this.$lines[j];
    res.lines[j] = {
      uId: lineElt.uId,
      vId: lineElt.vId,
      uPin: lineElt.uPin,
      vPin: lineElt.vPin
    };
  }

  return res;
};

CircuitDiagramEditor.prototype.autoAlignPosition = function () {
  var self = this;

  var token = _LoadingCubeModal.default.show();

  this.optimizer.findBeautyGrid(this.getGridData(), 3000).then(function (res) {
    _LoadingCubeModal.default.close(token);

    if (res.noChange) return;
    var positions = res.positions;
    var nodeElt;
    var pos;

    for (var i in positions) {
      nodeElt = self.$nodes[i];
      if (!nodeElt) continue;
      pos = positions[i];
      if (!pos) continue;
      nodeElt.x = pos.x * 25;
      nodeElt.y = pos.y * 25;
    }

    for (var j in self.$lines) {
      self.updateLinePosition(j);
    }

    self.notifyUnsaved();
  }).catch(function () {
    _LoadingCubeModal.default.close(token);
  });
};

CircuitDiagramEditor.prototype.getCmdDescriptor = function (name) {
  var descriptor = _CircuitDiagramEditorCmd.CircuitDiagramEditorCmdDescriptors[name];
  var res = Object.assign({
    type: 'trigger',
    desc: 'command: ' + name,
    icon: 'span.mdi.mdi-apple-keyboard-command'
  }, descriptor);
  return res;
};

CircuitDiagramEditor.prototype.getCmdGroupTree = function () {
  var tree = _CircuitDiagramEditorCmd.CircuitDiagramEditorCmdTree;
  return tree;
};

CircuitDiagramEditor.prototype.viewTo = function (classType, id) {
  if (classType === 'BLOCK') {
    this.viewToBlock(id);
  } else if (classType === 'COMPONENT') {
    this.viewToComponent(id);
  }
};

CircuitDiagramEditor.prototype.viewToBlock = function (id) {
  var blockEd = this.blockEditor.findBlockById(id);
  this.flexFormEditor.activeEditorTab(1);
  (0, _utils.vScrollIntoView)(blockEd.$view);
  this.blockEditor.activateBlock(blockEd);
};

CircuitDiagramEditor.prototype.viewToComponent = function (id) {// console.log(id)
};

var _default = CircuitDiagramEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/tool/SelectComponentTypeDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/tool/SelectComponentTypeDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.openSelectComponentTypeDialog = openSelectComponentTypeDialog;
exports.default = void 0;

require("../../../css/selectcomponenttypedialog.css");

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _FCore = _interopRequireWildcard(require("../../core/FCore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FlexiconButton = _interopRequireDefault(require("absol-acomp/js/FlexiconButton"));

var _Searcher = _interopRequireDefault(require("absol-acomp/js/Searcher"));

var _Assembler = require("../../core/Assembler");

var _ExpTree = _interopRequireDefault(require("absol-acomp/js/ExpTree"));

var _search = _interopRequireWildcard(require("absol-acomp/js/list/search"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));




/****
 * @extends Context
 * @constructor
 */
function SelectComponentTypeDialog(opt) {
  _Fragment.default.call(this);

  this.opt = Object.assign({
    confirmButtonText: 'CONFIRM'
  }, opt);
  this.cache = {};
  this.selectedClass = null;
}

_OOP.default.mixClass(SelectComponentTypeDialog, _Fragment.default);

SelectComponentTypeDialog.prototype.createView = function () {
  var self = this;
  var componentClasses = Object.keys(_Assembler.AssemblerInstance.classes['COMPONENT']).reduce(function (ac, cr) {
    var clazz = _Assembler.AssemblerInstance.classes['COMPONENT'][cr];

    if (cr === clazz.prototype.tag) {
      ac.push(clazz);
    }

    return ac;
  }, []);
  componentClasses.sort(function (a, b) {
    if (a.prototype.tag < b.prototype.tag) return -1;
    return 1;
  });
  this.componentClasses = componentClasses;
  this.$activeNode = null;
  this.$typeNodes = this.componentClasses.map(function (clazz) {
    var elt = (0, _FCore._)({
      tag: _ExpTree.default.tag,
      props: {
        name: clazz.prototype.tag,
        icon: clazz.prototype.menuIcon,
        componentClass: clazz
      },
      on: {
        click: function () {
          if (self.$activeNode === this) return;
          if (self.$activeNode) self.$activeNode.removeClass('as-selected');
          self.$activeNode = this;
          self.$activeNode.addClass('as-selected');
          self.$confirmBtn.disabled = false;
          self.selectedClass = clazz;
        },
        dblclick: function () {
          if (self.$activeNode === this) {
            self.onConfirm();
            return;
          }

          if (self.$activeNode) self.$activeNode.removeClass('as-selected');
          self.$activeNode = this;
          self.$activeNode.addClass('as-selected');
          self.$confirmBtn.disabled = false;
          self.selectedClass = clazz;
          self.onConfirm();
        }
      }
    });
    return elt;
  });
  this.$searchInput = (0, _FCore._)({
    tag: _Searcher.default.tag,
    on: {
      stoptyping: this.ev_inputChange.bind(this)
    }
  });
  this.$view = (0, _FCore._)({
    class: ['as-select-component-type-dialog', 'as-message-dialog'],
    child: [{
      class: 'as-message-dialog-header',
      child: this.$searchInput
    }, {
      class: ['as-message-dialog-body', 'absol-bscroller'],
      child: this.$typeNodes
    }, {
      class: 'as-message-dialog-footer',
      child: [{
        tag: _FlexiconButton.default.tag,
        class: ['as-message-dialog-cancel-btn', 'secondary'],
        props: {
          text: 'Cancel'
        },
        on: {
          click: function () {
            self.onCancel();
          }
        }
      }, {
        tag: _FlexiconButton.default.tag,
        class: ['as-message-dialog-confirm-btn', 'primary'],
        props: {
          text: this.opt.confirmButtonText,
          disabled: true
        },
        on: {
          click: function () {
            self.onConfirm();
          }
        }
      }]
    }]
  });
  this.$body = (0, _FCore.$)('.as-message-dialog-body', this.$view);
  this.$confirmBtn = (0, _FCore.$)('.as-message-dialog-confirm-btn', this.$view);
};

SelectComponentTypeDialog.prototype._getNodesBySearch = function (query) {
  this._searchingItems = this._searchingItems || this.$typeNodes.map(function (elt) {
    return (0, _search.default)({
      text: elt.name,
      value: elt
    });
  });
  return (0, _search.searchListByText)(query, this._searchingItems).map(function (item) {
    return item.value;
  });
};

SelectComponentTypeDialog.prototype.ev_inputChange = function () {
  var query = this.$searchInput.value.trim().replace(/\s\s+/g, ' ');
  var cNodes;
  this.$body.clearChild();

  if (query.length === 0) {
    this.$body.addChild(this.$typeNodes);
  } else {
    cNodes = this.cache[query] || this._getNodesBySearch(query);
    this.$body.addChild(cNodes);
  }
};

SelectComponentTypeDialog.prototype.onConfirm = _noop.default;
SelectComponentTypeDialog.prototype.onCancel = _noop.default;

function openSelectComponentTypeDialog(opt) {
  var frg = new SelectComponentTypeDialog(opt);
  var modal = (0, _FCore._)('modal.as-select-component-type-modal').addTo(document.body);
  frg.start();
  modal.addChild(frg.getView());
  return new Promise(function (resolve) {
    frg.onCancel = function () {
      frg.destroy();
      modal.remove();
      resolve(null);
    };

    frg.onConfirm = function () {
      frg.destroy();
      modal.remove();
      return resolve(frg.selectedClass);
    };
  });
}

var _default = SelectComponentTypeDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/layoutUtils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/layoutUtils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.componentHasSystemLock = componentHasSystemLock;
exports.collectComponentIdList = collectComponentIdList;
exports.collectDeleteLockReason = collectDeleteLockReason;

function componentHasSystemLock(comp, recursive) {
  if (comp.attributes.permissions && comp.attributes.permissions.owner === "system") {
    return true;
  }

  if (recursive && comp.children && comp.children.length > 0) {
    return comp.children.some(c => componentHasSystemLock(c, recursive));
  }

  return false;
}

function collectComponentIdList(root, ac) {
  var res = ac || [];
  res.push(root.attributes.id);

  if (root.children && root.children.length > 0) {
    root.children.forEach(child => collectComponentIdList(child, res));
  }

  return res;
}

function collectDeleteLockReason(idRefs, comp, ac) {
  ac = ac || [];
  var reason;

  if (comp.attributes.permissions && comp.attributes.permissions.owner === "system") {
    reason = reason || {};
    reason.owner = 'system';
  }

  if (idRefs[comp.attributes.id]) {
    reason = reason || {};
    reason.ref = idRefs[comp.attributes.id];
  }

  if (reason) reason.comp = comp;
  if (reason) ac.push(reason);

  if (comp.children && comp.children.length > 0) {
    comp.children.forEach(child => collectDeleteLockReason(idRefs, child, ac));
  }

  return ac;
}
};

moduleFactories["node_modules/absol-form/js/layouteditor/dialog/LEDeleteErrorDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/dialog/LEDeleteErrorDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _MessageDialog = _interopRequireDefault(require("absol-acomp/js/MessageDialog"));

var _Modal = _interopRequireDefault(require("absol-acomp/js/Modal"));

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _FCore = _interopRequireWildcard(require("../../core/FCore"));




function LEDeleteErrorDialog(data) {
  _Fragment.default.call(this);

  this.data = data;
}

_OOP.default.mixClass(LEDeleteErrorDialog, _Fragment.default);

LEDeleteErrorDialog.prototype.createView = function () {
  this.$reasons = this.data.reasons.map(reason => {
    return (0, _FCore._)({
      tag: 'tr',
      child: [{
        tag: 'td',
        child: [(0, _FCore._)(reason.comp.menuIcon).addStyle({
          'font-size': '1.5em',
          verticalAlign: 'middle'
        }), {
          tag: 'span',
          style: {
            verticalAlign: 'middle'
          },
          child: {
            text: ' ' + (reason.comp.attributes.name || reason.comp.attributes.name)
          }
        }]
      }, {
        tag: 'td',
        style: {
          textAlign: 'right'
        },
        child: {
          tag: 'span',
          child: {
            text: reason.ref ? reason.ref : ''
          }
        }
      }, {
        tag: 'td',
        style: {
          textAlign: 'right'
        },
        child: {
          tag: 'span',
          child: {
            text: reason.owner ? 'owner=system' : ''
          }
        }
      }]
    });
  });
  this.$reasonTable = (0, _FCore._)({
    tag: 'table',
    class: 'as-basic-table',
    child: [{
      tag: 'thead',
      child: {
        tag: 'tr',
        child: [{
          tag: 'td',
          child: {
            text: 'Component'
          }
        }, {
          tag: 'td',
          child: {
            text: 'Reference Lines'
          }
        }, {
          tag: 'td',
          child: {
            text: 'Permission'
          }
        }]
      }
    }, {
      tag: 'tbody',
      child: this.$reasons
    }]
  });
  this.$view = (0, _FCore._)({
    tag: _MessageDialog.default,
    props: {
      dialogTitle: 'Can not delete components',
      dialogActions: [{
        class: 'primary',
        text: 'OK'
      }]
    },
    child: this.$reasonTable,
    on: {
      action: event => {
        this.stop();
      }
    }
  });
};

LEDeleteErrorDialog.prototype.onStart = function () {
  this.$modal = (0, _FCore._)({
    tag: _Modal.default,
    child: this.getView()
  }).addTo(document.body);
};

LEDeleteErrorDialog.prototype.onStop = function () {
  this.$modal.remove();
};

var _default = LEDeleteErrorDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/dialog/LEPageSettingDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/dialog/LEPageSettingDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.openPageSettingDialog = openPageSettingDialog;
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _FCore = require("../../core/FCore");

var _MessageDialog = _interopRequireDefault(require("absol-acomp/js/MessageDialog"));

var _Modal = _interopRequireDefault(require("absol-acomp/js/Modal"));

var _measurements = require("absol/src/Math/measurements");

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


function LEPageSettingDialog() {
  _Fragment.default.call(this);

  this.pageList = Object.keys(_measurements.PAGE_SIZE_IN_POINT);
  this.pageList.sort();
  this.pageInPx = this.pageList.reduce((ac, cr) => {
    var size = _measurements.PAGE_SIZE_IN_POINT[cr].map(x => Math.round(x));

    var sc = _measurements.PAGE_SIZE_IN_POINT[cr][1] / _measurements.PAGE_SIZE_IN_POINT['a4'][1];
    size.push(Math.round((0, _measurements.centimeterToPx)(2) * sc));
    size.push(Math.round((0, _measurements.centimeterToPx)(1.5) * sc));
    ac[cr] = size;
    return ac;
  }, {});
}

_OOP.default.mixClass(LEPageSettingDialog, _Fragment.default);

LEPageSettingDialog.prototype.createView = function () {
  var items = this.pageList.map(key => ({
    text: `${key.toUpperCase()} (${Math.round(_measurements.PAGE_SIZE_IN_POINT[key][0])} x ${Math.round(_measurements.PAGE_SIZE_IN_POINT[key][1])})`,
    value: key
  }));
  this.$view = (0, _FCore._)({
    tag: _MessageDialog.default,
    props: {
      dialogTitle: 'Page Setup(print)',
      dialogActions: [{
        class: 'primary',
        text: 'OK',
        name: 'ok'
      }, {
        // class: 'primary',
        text: 'CANCEL',
        name: 'cancel'
      }]
    },
    child: [{
      child: [{
        tag: 'selectmenu',
        props: {
          enableSearch: true,
          items: items,
          value: 'a4'
        }
      }]
    }, {
      style: {
        padding: '5px',
        textAlign: 'center'
      },
      child: {
        class: 'as-page-setting-paper-box',
        child: [{
          class: 'as-page-setting-padding-tb',
          child: {
            tag: 'span',
            class: 'as-page-setting-padding-value',
            child: {
              text: '-'
            }
          }
        }, {
          child: [{
            class: 'as-page-setting-padding-lr',
            child: {
              tag: 'span',
              class: 'as-page-setting-padding-value',
              child: {
                text: '-'
              }
            }
          }, {
            class: 'as-page-setting-paper-content-box',
            child: {
              tag: 'span',
              child: {
                text: '- x -'
              }
            }
          }, {
            class: 'as-page-setting-padding-lr',
            child: {
              tag: 'span',
              class: 'as-page-setting-padding-value',
              child: {
                text: '-'
              }
            }
          }]
        }, {
          class: 'as-page-setting-padding-tb',
          child: {
            tag: 'span',
            class: 'as-page-setting-padding-value',
            child: {
              text: '-'
            }
          }
        }]
      }
    }],
    on: {
      action: event => {
        this.stop();

        if (event.action.name === 'ok') {
          this.onOK();
        } else {
          this.onCancel();
        }

        console.log(event);
      }
    }
  });
  this.$modal = (0, _FCore._)({
    tag: _Modal.default,
    child: this.$view
  });
  this.$pageSelect = (0, _FCore.$)('selectmenu', this.$view).on('change', this._updatePreview.bind(this));
  this.$paddingValues = (0, _FCore.$$)('.as-page-setting-padding-value', this.$view);
  this.$contentSize = (0, _FCore.$)('.as-page-setting-paper-content-box span', this.$view);

  this._updatePreview();
};

LEPageSettingDialog.prototype._updatePreview = function () {
  var pageId = this.$pageSelect.value;
  var pageSize = this.pageInPx[pageId];
  this.selectedSize = pageSize;
  this.$paddingValues[0].innerHTML = '' + pageSize[2];
  this.$paddingValues[1].innerHTML = '' + pageSize[2];
  this.$paddingValues[2].innerHTML = '' + pageSize[3];
  this.$paddingValues[3].innerHTML = '' + pageSize[3];
  this.$contentSize.innerHTML = [pageSize[0] - pageSize[2] * 2, pageSize[1] - pageSize[3] * 2].join(' x ');
};

LEPageSettingDialog.prototype.onStart = function () {
  this.getView();
  this.$modal.addTo(document.body);
};

LEPageSettingDialog.prototype.onStop = function () {
  this.$modal.remove();
};

LEPageSettingDialog.prototype.onOK = _noop.default;
LEPageSettingDialog.prototype.onCancel = _noop.default;
var _default = LEPageSettingDialog;
exports.default = _default;

function openPageSettingDialog() {
  var dialog = new LEPageSettingDialog();
  return new Promise(rs => {
    dialog.onOK = () => {
      rs(dialog.selectedSize || null);
    };

    dialog.onCancel = () => {
      rs(null);
    };

    dialog.start();
  });
}
};

moduleFactories["node_modules/absol-form/js/layouteditor/LayoutEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/LayoutEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.LayoutEditorCmdDescriptors = exports.LayoutEditorCmdTree = exports.LayoutEditorCmdNames = exports.default = void 0;

var _R = _interopRequireDefault(require("../R"));

var _FormPreview = _interopRequireDefault(require("../editor/FormPreview"));

var _ClipboardManager = _interopRequireDefault(require("../ClipboardManager"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _FileSaver = require("absol/src/Network/FileSaver");

var _BlockEditor = _interopRequireDefault(require("../ciruiteditor/blockeditor/BlockEditor"));

var _CircuitDiagramEditor = _interopRequireDefault(require("../ciruiteditor/diagrameditor/CircuitDiagramEditor"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));

var _CmdDescriptors = _interopRequireDefault(require("../cmds/CmdDescriptors"));

var _SelectComponentTypeDialog = require("./tool/SelectComponentTypeDialog");

var _layoutUtils = require("./layoutUtils");

var _LEDeleteErrorDialog = _interopRequireDefault(require("./dialog/LEDeleteErrorDialog"));

var _LEPageSettingDialog = _interopRequireWildcard(require("./dialog/LEPageSettingDialog"));

var _FNode = require("../core/FNode");




/**
 * @type {import('./LayoutEditor').default}
 */
var LayoutEditorCmd = {};

LayoutEditorCmd.preview = function () {
  this.flexFormEditor.execCmd('preview');
};

LayoutEditorCmd.remotePreview = function () {
  this.flexFormEditor.execCmd('remotePreview');
};

LayoutEditorCmd.save = function () {
  this.flexFormEditor.execCmd('save'); // var tabHolder = this.formEditor.getEditorHolderByEditor(this);
  // if (tabHolder)
  //     PluginManager.exec(this, R.PLUGINS.SAVE_CONTENT_DATA, tabHolder);
  // this.notifySaved();
};

LayoutEditorCmd.saveAs = function () {
  this.flexFormEditor.execCmd('saveAs');
};

LayoutEditorCmd.saveAsSystem = function () {
  this.flexFormEditor.execCmd('saveAsSystem');
};

LayoutEditorCmd.update_from_other = function () {
  var formEditor = this.getContext(_R.default.FORM_EDITOR);

  if (formEditor) {
    var tabHolder = formEditor.getEditorHolderByEditor(this);
    var currentTabIdent = tabHolder.ident;
    var blockEditorTabIdent = currentTabIdent + '_blocks';
    var blockEditor;
    var blockEditorTabHolder = formEditor.getEditorHolderByIdent(blockEditorTabIdent);
    if (blockEditorTabHolder) blockEditor = blockEditorTabHolder.editor;

    if (blockEditor) {
      this.setBlockData(blockEditor.getData());
      blockEditor.notifySaved();
    }

    var lineEditorTabIdent = currentTabIdent + '_lines';
    var lineEditor;
    var lineEditorTabHolder = formEditor.getEditorHolderByIdent(lineEditorTabIdent);
    if (lineEditorTabHolder) lineEditor = lineEditorTabHolder.editor;

    if (lineEditor) {
      this.setLineData(lineEditor.getLineData());
      this.setDiagramData(lineEditor.getDiagramData());
      lineEditor.notifySaved();
    }
  }
};
/***
 * @this LayoutEditor
 */


LayoutEditorCmd.importFromJson = function () {
  this.flexFormEditor.execCmd('importFromJson');
};

LayoutEditorCmd.export2Json = function () {
  this.flexFormEditor.execCmd('export2Json');
};

LayoutEditorCmd.export2sharpEncode = function () {
  this.flexFormEditor.execCmd('export2sharpEncode');
};

LayoutEditorCmd.export2clipboard = function () {
  this.flexFormEditor.execCmd('export2clipboard');
};

LayoutEditorCmd.editBlocks = function () {
  if (!this.rootLayout) return;
  /**
   * @type {import('./FormEditor').default}
   */

  var formEditor = this.getContext(_R.default.FORM_EDITOR);
  if (!formEditor) return;
  var tabHolder = formEditor.getEditorHolderByEditor(this);
  var currentTabIdent = tabHolder.ident;
  var blockEditorTabIdent = currentTabIdent + '_blocks';
  var blockEditor;
  var blockEditorTabHolder = formEditor.getEditorHolderByIdent(blockEditorTabIdent);
  if (blockEditorTabHolder) blockEditor = blockEditorTabHolder.editor;

  if (!blockEditor) {
    blockEditor = new _BlockEditor.default();
    blockEditor.attach(this);
    var name = tabHolder.name + '(blocks)';
    var desc = tabHolder.desc;
    formEditor.openEditorTab(blockEditorTabIdent, name, desc, blockEditor, {
      layoutEditor: this
    });
  } else {
    blockEditorTabHolder.tabframe.requestActive();
  }

  var data = this.getBlockData();
  blockEditor.setData(data);
};

LayoutEditorCmd.editLines = function () {
  if (!this.rootLayout) return;
  var formEditor = this.getContext(_R.default.FORM_EDITOR);
  if (!formEditor) return;
  var tabHolder = formEditor.getEditorHolderByEditor(this);
  var currentTabIdent = tabHolder.ident;
  var lineEditorTabIdent = currentTabIdent + '_lines';
  var lineEditor;
  var lineEditorTabHolder = formEditor.getEditorHolderByIdent(lineEditorTabIdent);
  if (lineEditorTabHolder) lineEditor = lineEditorTabHolder.editor;

  if (!lineEditor) {
    lineEditor = new _CircuitDiagramEditor.default();
    lineEditor.attach(this);
    var name = tabHolder.name + '(lines)';
    var desc = tabHolder.desc;
    formEditor.openEditorTab(lineEditorTabIdent, name, desc, lineEditor, {
      layoutEditor: this
    });
  } else {
    lineEditorTabHolder.tabframe.requestActive();
  }

  var lines = this.getLineData();
  var diagram = this.getDiagramData();
  lineEditor.setData(lines, diagram);
};

LayoutEditorCmd.cut = function () {
  this.clipboardCtrl.cut();
  return;
  if (this.anchorEditors.length < 1) return;
  var components = this.anchorEditors.map(function (ed) {
    return ed.component;
  });
  var componentsData = components.map(function (component) {
    var data = component.getData();
    data.bound = component.view.getBoundingClientRect().toJSON();
    return data;
  });

  _ClipboardManager.default.set(_R.default.CLIPBOARD.COMPONENTS, componentsData); //code copy and edit from LayoutEditor.prototype.removeComponent


  var self = this;
  this.anchorEditors.forEach(function (ed) {
    ed.component.remove();
    self.emit('removecomponent', {
      type: 'removecomponent',
      target: this,
      component: ed.component
    }, this);
  });

  function visit(node) {
    if (node.attributes && node.attributes.name) {
      node.attributes.id = undefined;
      delete node.attributes.id;
    }

    if (node.children) node.children.forEach(visit);
  }

  componentsData.forEach(visit);
  this.componentPropertiesEditor.edit();
  this.setActiveComponent();
  this.notifyDataChange();
  this.notifyUnsaved();
  this.componentOtline.updateComponentTree();
  this.commitHistory('cut', 'Cut ' + components.map(function (c) {
    return c.getAttribute('name');
  }).join(', '));
};

LayoutEditorCmd.copy = function () {
  this.clipboardCtrl.copy();
  return;
  if (this.anchorEditors.length < 1) return;
  var componentsData = this.anchorEditors.map(function (ed) {
    var data = ed.component.getData();
    data.bound = ed.component.view.getBoundingClientRect().toJSON();
    return data;
  });

  function visit(node) {
    if (node.attributes && node.attributes.name) {
      node.attributes.name = undefined;
      delete node.attributes.name;
      node.attributes.id = undefined;
      delete node.attributes.id;
    }

    if (node.children) node.children.forEach(visit);
  }

  componentsData.forEach(visit);

  _ClipboardManager.default.set(_R.default.CLIPBOARD.COMPONENTS, componentsData);
};

LayoutEditorCmd.paste = function (event) {
  this.clipboardCtrl.paste();
};
/***
 * @this LayoutEditor
 */


LayoutEditorCmd.delete = function () {
  var editors = this.anchorEditors;
  var components = editors.map(function (e) {
    return e.component;
  });
  var diagramEditor = this.getContext(_R.default.DIAGRAM_EDITOR);
  var refCountById = diagramEditor.getLineData().reduce((ac, line) => {
    ac[line.u] = (ac[line.u] || 0) + 1;

    if (line.u !== line.v) {
      ac[line.v] = (ac[line.v] || 0) + 1;
    }

    return ac;
  }, {});
  var reasons = components.reduce((ac, comp) => {
    (0, _layoutUtils.collectDeleteLockReason)(refCountById, comp, ac);
    return ac;
  }, []);

  if (reasons.length === 0) {
    this.removeComponent.apply(this, components);
  } else {
    new _LEDeleteErrorDialog.default({
      reasons: reasons
    }).start();
  }
};

LayoutEditorCmd.undo = function () {
  this.undoHistory.undo();
};

LayoutEditorCmd.redo = function () {
  this.undoHistory.redo();
};

LayoutEditorCmd.selectAll = function () {
  var now = new Date().getTime();
  var comp;

  if (this.anchorEditors.length == 0) {
    comp = this.rootLayout.children;
  } else {
    comp = (this.findNearestLayoutParent(this.anchorEditors[0].component.parent) || this.rootLayout).children;
  }

  this.setActiveComponent.apply(this, comp);
};

LayoutEditorCmd.editRootLayout = function () {
  this.editLayout(this.rootLayout);
  this.setActiveComponent(this.rootLayout);
};

LayoutEditorCmd.zoomIn = function () {
  this.zoomBy(1 / 0.9);
};

LayoutEditorCmd.zoomOut = function () {
  this.zoomBy(0.9);
};

LayoutEditorCmd.resetZoom = function () {
  this.setSoftScale(1);
};
/***
 * @this {LayoutEditor}
 */


LayoutEditorCmd.setSelectMode = function (mode) {
  this.selectCtrl.setSelectMode(mode);
};
/***
 * @this {LayoutEditor}
 */


LayoutEditorCmd.addComponent = function () {
  (0, _SelectComponentTypeDialog.openSelectComponentTypeDialog)({
    confirmButtonText: 'ADD'
  }).then(function (clazz) {
    if (!clazz) return;
    var focusAE = this.anchorEditorsCtrl.anchorEditors[this.anchorEditorsCtrl.anchorEditors.length - 1];
    var focusC = focusAE && focusAE.component;
    var editingLayout = this.editingLayout || this.rootLayout;
    if (focusC) editingLayout = focusC.parent;
    var newComponent = this.buildComponent({
      tag: clazz.prototype.tag
    }, editingLayout.fragment);
    var nameDict = {};
    (0, _FNode.traversal)(editingLayout, function (path) {
      nameDict[path.node.attributes.name] = true;
    });
    var name = newComponent.attributes.name.replace(/[0-9]+$/, '');
    var i = 0;

    if (nameDict) {
      while (nameDict[name + i]) {
        ++i;
      }

      name = name + i;
      newComponent.attributes.name = name;
    }

    if (focusC) {
      editingLayout.addChildAfter(newComponent, focusC);
    } else {
      editingLayout.addChild(newComponent);
    }

    this.anchorEditorsCtrl.setActiveComponent(newComponent);
    this.componentOtline.updateComponentTree();
  }.bind(this));
};

LayoutEditorCmd.transformComponentType = function () {
  alert('In processing!');
};
/***
 * @this {LayoutEditor}
 */


LayoutEditorCmd.pageSetting = function () {
  (0, _LEPageSettingDialog.openPageSettingDialog)().then(result => {
    if (!result || !this.rootLayout) return;
    this.rootLayout.style.width = result[0];
    this.rootLayout.style.height = 'auto';

    if (this.rootLayout.tag === 'LinearLayout') {
      this.rootLayout.style.paddingLeft = result[2];
      this.rootLayout.style.paddingRight = result[2];
      this.rootLayout.style.paddingTop = result[3];
      this.rootLayout.style.paddingBottom = result[3];
    }
  });
};
/***
 * @this {LayoutEditor}
 */


LayoutEditorCmd.editContent = function () {
  var editors = this.anchorEditors;
  var components = editors.map(function (e) {
    return e.component;
  });
  var comp = components.pop();

  if (comp) {
    if (comp.isLayout) this.editLayout(comp);else this.editComponent(comp);
  }
};

var _default = LayoutEditorCmd;
exports.default = _default;
var LayoutEditorCmdNames = [];
exports.LayoutEditorCmdNames = LayoutEditorCmdNames;
var LayoutEditorCmdTree = [[['preview', 'remotePreview'], ['save', 'saveAs', 'saveAsSystem', 'importFromJson', 'export2Json', 'export2sharpEncode', 'export2clipboard'], ['undo', 'redo'], ['cut', 'copy', 'paste', 'delete']], ['pageSetting', 'editRootLayout', 'selectAll', 'setSelectMode'], ['addComponent', 'transformComponentType']];
exports.LayoutEditorCmdTree = LayoutEditorCmdTree;
var LayoutEditorCmdDescriptors = Object.assign({}, _CmdDescriptors.default);
exports.LayoutEditorCmdDescriptors = LayoutEditorCmdDescriptors;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LEQuickPathController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LEQuickPathController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

/***
 *
 * @param {LayoutEditor} editor
 * @constructor
 */
function LEQuickPathController(editor) {
  this.editor = editor;
}

LEQuickPathController.prototype.update = function () {
  this.$quickpath.path = this.getQuickPathFrom(this.editor.editingLayout);
};

LEQuickPathController.prototype.ev_quickPathChange = function (event) {
  var layout = event.item.layout;
  var editor = this.editor;
  setTimeout(function () {
    editor.editLayout(layout);
  }, 10);
};

LEQuickPathController.prototype.onCreateView = function () {
  this.$quickpath = (0, _FCore.$)('quickpath', this.editor.$header).on('change', this.ev_quickPathChange.bind(this));
};

LEQuickPathController.prototype.getQuickPathFrom = function (layout) {
  while (layout && !layout.isLayout) {
    layout = layout.parent;
  }

  var res = [];

  if (layout) {
    var childLayoutItems = layout.children.filter(function (comp) {
      return comp.isLayout;
    }).map(function (comp) {
      return {
        name: comp.getAttribute('name'),
        icon: comp.menuIcon,
        layout: comp
      };
    });

    if (childLayoutItems.length > 0) {
      res.push({
        name: '...',
        items: childLayoutItems
      });
    }
  }

  var node;

  while (layout) {
    node = {
      name: layout.getAttribute('name'),
      icon: layout.menuIcon,
      layout: layout
    };

    if (layout.parent && layout.parent.children) {
      node.items = layout.parent.children.filter(function (comp) {
        return comp.isLayout;
      }).map(function (comp) {
        return {
          name: comp.getAttribute('name'),
          icon: comp.menuIcon,
          layout: comp,
          extendStyle: layout == comp ? {
            color: "#009"
          } : {}
        };
      });
    } else node.items = [{
      name: layout.getAttribute('name'),
      icon: layout.menuIcon,
      layout: layout
    }];

    res.unshift(node);
    layout = layout.parent;
  }

  return res;
};

var _default = LEQuickPathController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LEUndoController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LEUndoController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

/***
 *
 * @param {LayoutEditor} editor
 * @constructor
 */
function LEUndoController(editor) {
  this.editor = editor;
  this.undoHistory = editor.undoHistory;
  this.lastCommitData = {
    editing: null,
    data: null,
    selected: []
  };
  this.setup();
}

LEUndoController.prototype.setup = function () {
  var editor = this.editor;
  this.undoHistory.on('checkout', function (event) {
    var editing = event.item.data.editing;
    var selected = event.item.data.selected;
    editor.applyData(event.item.data.data);
    editor.lastCommitData = event.item.data;

    if (editing) {
      editor.editLayoutByName(editing);
    } else {
      editor.editLayout(editor.rootLayout);
    }

    editor.setActiveComponentById.apply(editor, selected);
    editor.updateAnchor();
    editor.notifyCmdDescriptorsChange();
    editor.notifyUnsaved();
  });
};

LEUndoController.prototype.commit = function (type, desc) {
  this.lastCommitData = {
    editing: this.editor.editingLayout && this.editor.editingLayout.attributes.name,
    selected: this.editor.getSelected(),
    data: this.editor.getData()
  };
  this.undoHistory.commit(type, this.lastCommitData, desc, new Date());
  this.editor.notifyCmdDescriptorsChange();
};
/***
 *
 * @param {{editing?: string, data?:Object, selected?: string[]}} o
 */


LEUndoController.prototype.modifyLastCommit = function (o) {
  Object.assign(this.lastCommitData, o);
};

var _default = LEUndoController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LERulerController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LERulerController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _R = _interopRequireDefault(require("../../R"));


/***
 *
 * @param editor
 * @constructor
 */
function LERulerController(editor) {
  this.editor = editor;
}

LERulerController.prototype.onCreateView = function () {
  this.$hruler = (0, _FCore.$)('hruler', this.editor.$view);
  this.$hruler.measureElement((0, _FCore.$)('.as-relative-layout', this.editor.$view));
  this.$hrulerMouse = (0, _FCore._)('.as-hruler-mouse').addTo(this.$hruler);
  this.$hrulerEditing = (0, _FCore._)('.as-hruler-editing').addTo(this.$hruler);
  this.$vruler = (0, _FCore.$)('vruler', this.editor.$view);
  this.$vruler.measureElement((0, _FCore.$)('.as-relative-layout', this.editor.$view));
  this.$vrulerMouse = (0, _FCore._)('.as-vruler-mouse').addTo(this.$vruler);
  this.$vrulerEditing = (0, _FCore._)('.as-vruler-editing').addTo(this.$vruler);
  this.$mouseOffsetStatus = (0, _FCore._)({
    tag: 'button',
    class: ['as-status-bar-item', 'as-mouse-status'],
    child: [{
      tag: 'span',
      class: 'as-mouse-status-pos',
      child: ['span.mdi.mdi-cursor-default-outline', 'span']
    }, {
      tag: 'span',
      class: 'as-mouse-status-drag',
      style: {
        display: 'none'
      },
      child: ['<span> Δ<span>', 'span']
    }]
  });
  this.$mouseSDrag = (0, _FCore.$)('.as-mouse-status-drag', this.$mouseOffsetStatus);
  this.$mouseSPosText = (0, _FCore.$)('.as-mouse-status-pos', this.$mouseOffsetStatus).lastChild;
  this.$mouseSDragText = (0, _FCore.$)('.as-mouse-status-drag', this.$mouseOffsetStatus).lastChild;
  this.editor.$view.on('mousemove', this.ev_mouseMove.bind(this));
};

LERulerController.prototype.ev_mouseMove = function (event) {
  var vruleBound = this.$vruler.getBoundingClientRect();
  var hruleBound = this.$hruler.getBoundingClientRect();
  this.$vrulerMouse.addStyle('top', event.clientY - vruleBound.top - 1 - 1 + 'px');
  this.$hrulerMouse.addStyle('left', event.clientX - hruleBound.left - 1 - 1 + 'px');
  this.mouseClientX = event.clientX;
  this.mouseClientY = event.clientY;

  if (this.editor.rootLayout) {
    var rootBound = this.editor.rootLayout.domElt.getBoundingClientRect();
    this.mouseOffsetX = Math.round(event.clientX - rootBound.left);
    this.mouseOffsetY = Math.round(event.clientY - rootBound.top);
    this.viewMousePos(this.mouseOffsetX, this.mouseOffsetY);
  }
};

LERulerController.prototype.viewMousePos = function (x, y) {
  this.$mouseSPosText.innerHTML = x + ',' + y;
};
/***
 *
 * @param {number|null} x
 * @param {number=} y
 */


LERulerController.prototype.viewMouseDrag = function (x, y) {
  if (typeof x === "number") {
    this.$mouseSDrag.removeStyle('display');
    this.$mouseSDragText.innerHTML = x + ',' + y;
  } else {
    this.$mouseSDrag.addStyle('display', 'none');
  }
};

LERulerController.prototype.updateEditing = function () {
  var hruleBound = this.$hruler.getBoundingClientRect();
  var vruleBound = this.$vruler.getBoundingClientRect();
  var editingBound = this.editor.editingLayout.domElt.getBoundingClientRect();
  this.$hrulerEditing.addStyle({
    left: editingBound.left - hruleBound.left - 1 + 'px',
    width: editingBound.width + 'px'
  });
  this.$vrulerEditing.addStyle({
    top: editingBound.top - vruleBound.top - 1 + 'px',
    height: editingBound.height + 'px'
  });
};

LERulerController.prototype.update = function () {
  this.$vruler.update();
  this.$hruler.update();
  this.updateEditing();
};

LERulerController.prototype.onEditorResume = function () {
  var $statusBar = this.editor.getContext(_R.default.STATUS_BAR_ELT);
  this.$mouseOffsetStatus.addTo($statusBar.$rightCtn);
};

LERulerController.prototype.onEditorPause = function () {
  this.$mouseOffsetStatus.remove();
};

LERulerController.prototype.assignRoot = function () {
  this.$vruler.measureElement(this.editor.rootLayout.domElt);
  this.$hruler.measureElement(this.editor.rootLayout.domElt);
};

var _default = LERulerController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LEToolTabController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LEToolTabController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


/***
 *
 * @param {LayoutEditor} editor
 * @constructor
 */
function LEToolTabController(editor) {
  this.editor = editor;
  this._activatedToolTab = null;
}

LEToolTabController.prototype.onCreateView = function () {
  this._tabToolHolders = {
    history: {
      $tabBtn: (0, _FCore.$)('.as-layout-editor-tool-tab-btn[data-tab="history"]', this.editor.$view),
      $ctn: (0, _FCore.$)('.as-layout-editor-tool-ctn[data-tab="history"]', this.editor.$view)
    },
    properties: {
      $tabBtn: (0, _FCore.$)('.as-layout-editor-tool-tab-btn[data-tab="properties"]', this.editor.$view),
      $ctn: (0, _FCore.$)('.as-layout-editor-tool-ctn[data-tab="properties"]', this.editor.$view)
    }
  };
};

LEToolTabController.prototype.toggle = function (name) {
  var holder = this._tabToolHolders[this._activatedToolTab];

  if (holder) {
    holder.$tabBtn.removeClass('active');
    holder.$ctn.addStyle('display', 'none');
  }

  holder = this._tabToolHolders[name];

  if (!holder) {
    name = null;
  }

  if (name === this._activatedToolTab) {
    this._activatedToolTab = null;
    return;
  }

  this._activatedToolTab = name;
  holder.$tabBtn.addClass('active');
  holder.$ctn.removeStyle('display');

  _ResizeSystem.default.update();
};

var _default = LEToolTabController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LEViewportController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LEViewportController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _keyboard = require("absol/src/Input/keyboard");


/***
 *
 * @param {LayoutEditor} editor
 * @constructor
 */
function LEViewportController(editor) {
  this.editor = editor;
  this.origin = new _Vec.default(0, 0);
  this.overOffset = new _Vec.default(0, 0);
  this._isScrollingByBar = false;
}

LEViewportController.prototype.onCreateView = function () {
  this.$spaceCtn = (0, _FCore.$)('.as-layout-editor-space-container', this.editor.$view).on('wheel', this.ev_wheel.bind(this)).on('auxclick', this.ev_auxclick.bind(this)).on('dblclick', this.ev_dblClick.bind(this));
  this.editor.$view.on('keydown', this.ev_keydown.bind(this));
  this.$layoutCtn = this.editor.$layoutCtn;
  this.$vscrollbar = this.editor.$vscrollbar.on({
    active: () => {
      this._isScrollingByBar = true;
    },
    inactive: () => {
      this._isScrollingByBar = false;
      this.updateScrollbar();
    },
    scroll: event => {
      this.origin = new _Vec.default(this.origin.x, -this.$vscrollbar.innerOffset - this.overOffset.y);

      this._origin2View(event);
    }
  });
  this.$hscrollbar = this.editor.$hscrollbar.on({
    active: () => {
      this._isScrollingByBar = true;
    },
    inactive: () => {
      this._isScrollingByBar = false;
      this.updateScrollbar();
    },
    scroll: event => {
      this.origin = new _Vec.default(-this.$hscrollbar.innerOffset - this.overOffset.x, this.origin.y);

      this._origin2View(event);
    }
  });
};

LEViewportController.prototype.autoHoming = function () {
  if (this.$spaceCtn.hasClass('as-homing')) return;
  this.$spaceCtn.addClass('as-homing');
  this.homingTimeout = setTimeout(function () {
    this.origin = new _Vec.default(0, 0);
    this.$spaceCtn.addStyle('--viewport-x', this.origin.x + 'px');
    this.$spaceCtn.addStyle('--viewport-y', this.origin.y + 'px');
    this.homingTimeout = setTimeout(function () {
      this.homingTimeout = -1;
      this.$spaceCtn.removeClass('as-homing');
      this.editor.rulerCtrl.update();
    }.bind(this), 300);
  }.bind(this), 3);
  setTimeout(this.editor.rulerCtrl.update.bind(this.editor.rulerCtrl), 320);
  setTimeout(this.editor.rulerCtrl.update.bind(this.editor.rulerCtrl), 240);
  setTimeout(this.editor.rulerCtrl.update.bind(this.editor.rulerCtrl), 120);
  setTimeout(this.editor.rulerCtrl.update.bind(this.editor.rulerCtrl), 60);
  setTimeout(this.updateScrollbar.bind(this), 320);
  setTimeout(this.updateScrollbar.bind(this), 240);
  setTimeout(this.updateScrollbar.bind(this), 120);
  setTimeout(this.updateScrollbar.bind(this), 60);
};

LEViewportController.prototype.updateScrollbar = function () {
  if (this._isScrollingByBar) return;

  var innerBound = _Rectangle.default.fromClientRect(this.$layoutCtn.getBoundingClientRect());

  var outerBound = _Rectangle.default.fromClientRect(this.$spaceCtn.getBoundingClientRect());

  var scrollingRect = innerBound.merge(outerBound);
  var scrollingOffset = outerBound.A().sub(scrollingRect.A());
  this.overOffset = scrollingRect.A().sub(innerBound.A());
  this.$vscrollbar.innerHeight = scrollingRect.height;
  this.$vscrollbar.outerHeight = outerBound.height;
  this.$vscrollbar.innerOffset = scrollingOffset.y;
  this.$hscrollbar.innerWidth = scrollingRect.width;
  this.$hscrollbar.outerWidth = outerBound.width;
  this.$hscrollbar.innerOffset = scrollingOffset.x;
  if (scrollingRect.height > outerBound.height) this.$hscrollbar.addStyle('right', '10px');else this.$hscrollbar.removeStyle('right');
  if (scrollingRect.width > outerBound.width) this.$vscrollbar.addStyle('bottom', '10px');else this.$vscrollbar.removeStyle('bottom');
};

LEViewportController.prototype._origin2View = function (event) {
  this.$spaceCtn.addStyle('--viewport-x', this.origin.x + 'px');
  this.$spaceCtn.addStyle('--viewport-y', this.origin.y + 'px');
  this.editor.rulerCtrl.update();
  setTimeout(this.editor.rulerCtrl.update.bind(this.editor.rulerCtrl), 120);
  setTimeout(this.editor.rulerCtrl.update.bind(this.editor.rulerCtrl), 60);
  setTimeout(this.editor.rulerCtrl.ev_mouseMove.bind(this.editor.rulerCtrl, event), 120);
  setTimeout(this.updateScrollbar.bind(this), 120);
  setTimeout(this.updateScrollbar.bind(this), 60);
};
/***
 *
 * @param {WheelEvent} event
 */


LEViewportController.prototype.ev_wheel = function (event) {
  var dy = event.deltaY;
  var d = event.shiftKey ? new _Vec.default(-dy, 0) : new _Vec.default(0, -dy);
  this.origin = this.origin.add(d);

  this._origin2View(event);
};

LEViewportController.prototype.ev_dblClick = function (event) {
  var layoutCtnRect;
  var mPos;

  if (event.target === this.editor.$foreground) {
    layoutCtnRect = _Rectangle.default.fromClientRect(this.editor.$layoutCtn.getBoundingClientRect());
    mPos = new _Vec.default(event.clientX, event.clientY);

    if (!layoutCtnRect.containsPoint(mPos)) {
      this.autoHoming();
    }
  } else if (event.target === this.$spaceCtn) this.autoHoming();
};
/***
 *
 * @param {KeyboardEvent} event
 */


LEViewportController.prototype.ev_keydown = function (event) {
  var key = (0, _keyboard.keyboardEventToKeyBindingIdent)(event);

  if (key === 'space' && event.target === this.editor.$view) {
    this.autoHoming();
  }
};
/***
 *
 * @param {MouseEvent} event
 */


LEViewportController.prototype.ev_auxclick = function (event) {
  this.autoHoming();
};

var _default = LEViewportController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LESelectController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LESelectController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _CmdDescriptors = _interopRequireDefault(require("../../cmds/CmdDescriptors"));


/***
 *
 * @param {LayoutEditor} editor
 * @constructor
 */
function LESelectController(editor) {
  this.editor = editor;
  this.mode = this.MODE_CURRENT_LAYOUT;

  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }
}

LESelectController.prototype.MODE_CURRENT_LAYOUT = 0;
LESelectController.prototype.MODE_DEPTH = 1;

LESelectController.prototype.onCreateView = function () {
  this.editor.$foreground.on('click', this.ev_mouseClickFG);
  this.editor.$layoutCtn.addClass('as-current-layout-selecting-mode');
};

LESelectController.prototype.findCompByMousePosition = function (root, depth, x, y) {
  var res = null;
  var child;
  var rect;
  var mouse = new _Vec.default(x, y);

  for (var i = root.children.length - 1; i >= 0; --i) {
    child = root.children[i];

    if (depth && child.fragment === root.fragment) {
      res = this.findCompByMousePosition(child, true, x, y);
    }

    if (res) break;
    rect = _Rectangle.default.fromClientRect(child.domElt.getBoundingClientRect());

    if (rect.containsPoint(mouse)) {
      res = child;
    }

    if (res) break;
  }

  return res;
};

LESelectController.prototype.setSelectMode = function (mode) {
  switch (this.mode) {
    case this.MODE_CURRENT_LAYOUT:
      this.editor.$layoutCtn.removeClass('as-current-layout-selecting-mode');
      break;

    case this.MODE_DEPTH:
      this.editor.$layoutCtn.removeClass('as-depth-selecting-mode');
      break;
  }

  switch (mode) {
    case 'CURRENT_LAYOUT':
      this.mode = this.MODE_CURRENT_LAYOUT;
      this.editor.$layoutCtn.addClass('as-current-layout-selecting-mode');
      break;

    case 'DEPTH':
      this.mode = this.MODE_DEPTH;
      this.editor.$layoutCtn.addClass('as-depth-selecting-mode');
      break;
  }

  this.editor.boundViewCtrl.update();
};

LESelectController.prototype.calcSelectBoundStyle = function () {
  var rootFragment = this.editor.rootFragment;

  function visit(node) {
    var bound;
    var anchorElt;

    if (node.style.vAlign === 'center' || node.style.hAlign === 'center') {
      bound = node.domElt.getBoundingClientRect();
      anchorElt = node.anchor && node.anchor.domElt || node.domElt.parentElement;
      anchorElt.addStyle('--select-bound-width', bound.width + 'px');
      anchorElt.addStyle('--select-bound-height', bound.height + 'px');
    }

    if (node.fragment === rootFragment && node.children) node.children.forEach(visit);
  }

  if (this.editor.rootLayout) visit(this.editor.rootLayout);
};

LESelectController.prototype.getCmdDescriptor = function (name) {
  if (name !== 'setSelectMode') return;
  var descriptor = Object.assign({}, _CmdDescriptors.default[name]);

  switch (this.mode) {
    case this.MODE_CURRENT_LAYOUT:
      descriptor.desc = 'Select In Current Layout';
      descriptor.icon = 'span.mdi.mdi-selection';
      break;

    case this.MODE_DEPTH:
      descriptor.desc = 'Depth Select';
      descriptor.icon = 'depth-select-ico';
      break;
  }

  return descriptor;
};
/***
 *
 * @param {MouseEvent} event
 */


LESelectController.prototype.ev_normalSelect = function (event) {
  var comp = this.findCompByMousePosition(this.editor.editingLayout, false, event.clientX, event.clientY);

  if (comp) {
    if (event.altKey) {
      if (!comp.isLayout) comp = comp.parent;

      if (this.editor.editingLayout !== comp) {
        this.editor.editingLayoutCtrl.edit(comp);
        this.editor.setActiveComponent();
      }
    } else if (event.shiftKey) {
      this.editor.anchorEditorsCtrl.toggleActiveComponent(comp);
    } else {
      this.editor.setActiveComponent(comp);
    }
  } else {
    this.editor.editingLayoutCtrl.edit(this.editor.rootLayout);
    this.editor.setActiveComponent();
  }
};
/***
 *
 * @param {MouseEvent} event
 */


LESelectController.prototype.ev_depthSelect = function (event) {
  var comp = this.findCompByMousePosition(this.editor.rootLayout, true, event.clientX, event.clientY);

  if (comp) {
    if (event.altKey) {
      if (!comp.isLayout) comp = comp.parent;

      if (this.editor.editingLayout !== comp) {
        this.editor.editingLayoutCtrl.edit(comp);
        this.editor.anchorEditorsCtrl.setActiveComponent();
      }
    } else if (event.shiftKey) {
      if (this.editor.editingLayout === comp.parent) {
        this.editor.anchorEditorsCtrl.toggleActiveComponent(comp);
      } else {
        this.editor.editingLayoutCtrl.edit(comp.parent);
        this.editor.anchorEditorsCtrl.setActiveComponent(comp);
      }
    } else {
      if (this.editor.editingLayout !== comp.parent) {
        this.editor.editingLayoutCtrl.edit(comp.parent);
      }

      this.editor.anchorEditorsCtrl.setActiveComponent(comp);
    }
  } else {
    this.editor.editingLayoutCtrl.edit(this.editor.rootLayout);
    this.editor.setActiveComponent();
  }
};

LESelectController.prototype.ev_mouseClickFG = function (event) {
  if (event.target === this.editor.$foreground) {
    switch (this.mode) {
      case this.MODE_CURRENT_LAYOUT:
        this.ev_normalSelect(event);
        break;

      case this.MODE_DEPTH:
        this.ev_depthSelect(event);
        break;
    }
  }
};

var _default = LESelectController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LEEditingLayoutControl.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LEEditingLayoutControl.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

/***
 * @param {LayoutEditor} editor
 * @constructor
 */
function LEEditingLayoutControl(editor) {
  this.editor = editor;
  this.$anchor = null;
  this.editingLayout = null;
}

LEEditingLayoutControl.prototype.onCreateView = function () {};

LEEditingLayoutControl.prototype.edit = function (layout) {
  layout = layout || this.editor.rootLayout;
  if (!layout || !layout.isLayout) return;
  this.editingLayout = layout;

  if (this.$anchor) {
    this.$anchor.removeClass('as-editing-layout-anchor');
  }

  this.$anchor = layout.anchor && layout.anchor.domElt || layout.domElt.parentElement;
  this.$anchor.addClass('as-editing-layout-anchor');
  this.editor.quickPathCtrl.update();
  this.editor.boundViewCtrl.update();
};

var _default = LEEditingLayoutControl;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LEAnchorEditorController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LEAnchorEditorController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _RelativeAnchorEditor = _interopRequireDefault(require("../anchoreditors/RelativeAnchorEditor"));


/***
 *
 * @param  {LayoutEditor} editor
 * @constructor
 */
function LEAnchorEditorController(editor) {
  this.editor = editor;
  /**
   * @type {Array<BaseAnchorEditor>}
   */

  this.anchorEditors = [];
}

LEAnchorEditorController.prototype.onCreateView = function () {};

LEAnchorEditorController.prototype._newAnchorEditor = function (component) {
  var self = this;
  var layoutEditor = this.editor;
  var AnchorEditor = component.parent ? component.parent.AnchorEditorClass : _RelativeAnchorEditor.default;
  var editor = new AnchorEditor(layoutEditor).on('click', function (event) {
    if (editor.preventClick) return;
    if (this.component) if (event.shiftKey) {
      self.toggleActiveComponent(this.component);
    } else {
      self.setActiveComponent(this.component);
    }
  }).on('beginmove', function (event) {
    var repeatEvent = event.repeatEvent;
    var other;

    for (var i = 0; i < self.anchorEditors.length; ++i) {
      other = self.anchorEditors[i];

      if (other !== this) {
        other.ev_beginMove(false, repeatEvent);
      }
    }
  }).on('moving', function (event) {
    var repeatEvent = event.repeatEvent;
    var other;

    for (var i = 0; i < self.anchorEditors.length; ++i) {
      other = self.anchorEditors[i];

      if (other !== this) {
        other.ev_moving(false, repeatEvent);
      }
    }

    layoutEditor.notifyDataChange();
    layoutEditor.componentPropertiesEditor.styleEditor.updatePropertyRecursive('width');
    layoutEditor.componentPropertiesEditor.styleEditor.updatePropertyRecursive('height');
    layoutEditor.componentPropertiesEditor.allPropertyEditor.updatePropertyRecursive('width');
    layoutEditor.componentPropertiesEditor.allPropertyEditor.updatePropertyRecursive('height');
    layoutEditor.updateEditing();
  }).on('endmove', function (event) {
    var originEvent = event.originEvent;
    var other;

    for (var i = 0; i < self.anchorEditors.length; ++i) {
      other = self.anchorEditors[i];

      if (other !== this) {
        other.ev_endMove(false, originEvent);
      }
    }

    layoutEditor.undoCtrl.commit('move', 'Move/Resize component');
    layoutEditor.notifyUnsaved();
  }).on('focus', function (event) {
    layoutEditor.componentPropertiesEditor.edit.apply(layoutEditor.componentPropertiesEditor, layoutEditor.getActivatedComponents());
    layoutEditor.emit('focuscomponent', {
      type: 'focuscomponent',
      component: this.component,
      originEvent: event,
      target: layoutEditor
    }, layoutEditor);
  }).on('change', function (event) {
    layoutEditor.notifyDataChange();
  });
  editor.edit(component);
  return editor;
};
/***
 * @param  {...BaseComponent} arguments
 */


LEAnchorEditorController.prototype.setActiveComponent = function () {
  var self = this;
  var components = Array.prototype.slice.call(arguments);
  var oldEditors = this.anchorEditors.slice();
  var oldComponents = this.anchorEditors.map(function (editor) {
    return editor.component;
  }); //todo

  while (this.anchorEditors.length > 0) {
    this.anchorEditors.pop();
  }

  var oldIndex;
  var component;
  var editor;

  while (this.anchorEditors.length < components.length) {
    component = components[this.anchorEditors.length];
    oldIndex = oldComponents.indexOf(component);

    if (oldIndex >= 0) {
      editor = oldEditors[oldIndex];
      oldEditors[oldIndex] = null; // for removing
    } else {
      editor = this._newAnchorEditor(components[this.anchorEditors.length]);
    }

    this.anchorEditors.push(editor);
  }

  oldEditors.forEach(function (editor) {
    editor && editor.edit();
  });
  if (this.anchorEditors.length > 0) this.anchorEditors[this.anchorEditors.length - 1].focus(); //todo: event to emit

  this.editor.componentOtline.updateComponentStatus();
  this.editor.undoCtrl.modifyLastCommit({
    selected: this.editor.getSelected(),
    editing: this.editor.editingLayout.getAttribute('name')
  });
  this.editor.emit('selectedcomponentchange', {
    target: this,
    type: 'selectedcomponentchange'
  }, this);
  this.editor.notifyCmdChange(); // this.editor.notifyCmdDescriptorsChange();
};

LEAnchorEditorController.prototype.findAnchorEditorByComponent = function (comp) {
  for (var i = 0; i < this.anchorEditors.length; ++i) {
    if (this.anchorEditors[i].component === comp) return this.anchorEditors[i];
  }

  return undefined;
};
/***
 * @param {BaseComponent} comp
 */


LEAnchorEditorController.prototype.toggleActiveComponent = function (comp) {
  var editor;
  var focusEditor = undefined;

  for (var i = 0; i < arguments.length; ++i) {
    editor = this.findAnchorEditorByComponent(arguments[i]);

    if (editor) {
      editor.edit(undefined);
    } else {
      editor = this._newAnchorEditor(arguments[i]);
      this.anchorEditors.push(editor);
      focusEditor = editor;
    }
  }

  this.anchorEditors = this.anchorEditors.filter(function (e) {
    return !!e.component;
  });

  if (this.anchorEditors.length > 0) {
    focusEditor = this.anchorEditors[this.anchorEditors.length - 1];
  }

  if (focusEditor) focusEditor.focus();
  this.editor.componentOtline.updateComponentStatus();
  this.editor.undoCtrl.modifyLastCommit({
    selected: this.editor.getSelected(),
    editing: this.editor.editingLayout.attributes.name
  });
  this.editor.emit('selectedcomponentchange', {
    target: this,
    type: 'selectedcomponentchange'
  }, this); // this.editor.notifyCmdDescriptorsChange();

  this.editor.notifyCmdChange();
};

LEAnchorEditorController.prototype.setActiveComponentById = function () {
  var components = Array(arguments.length).fill(null);
  var dict = Array.prototype.reduce.call(arguments, function (ac, cr, i) {
    ac[cr] = i;
    return ac;
  }, {});
  var rootFragment = this.editor.rootFragment;

  function visit(node) {
    var id = node.attributes.id;

    if (typeof dict[id] == 'number') {
      components[dict[id]] = node;
    }

    if (node.fragment === rootFragment) node.children.forEach(visit);
  }

  visit(this.editor.rootLayout);
  components = components.filter(function (c) {
    return !!c;
  });
  this.setActiveComponent.apply(this, components);
};

LEAnchorEditorController.prototype.setActiveComponentByName = function () {
  var components = Array(arguments.length).fill(null);
  var dict = Array.prototype.reduce.call(arguments, function (ac, cr, i) {
    ac[cr] = i;
    return ac;
  }, {});
  var rootFragment = this.editor.rootFragment;

  function visit(node) {
    var name = node.getAttribute('name');

    if (typeof dict[name] == 'number') {
      components[dict[name]] = node;
    }

    if (node.fragment === rootFragment) node.children.forEach(visit);
  }

  visit(this.editor.rootLayout);
  this.setActiveComponent.apply(this, components);
};

LEAnchorEditorController.prototype.getCmdGroupTree = function () {
  if (this.anchorEditors.length === 0) return [];
  return this.anchorEditors[0].getCmdGroupTree();
};

LEAnchorEditorController.prototype.getCmdDescriptor = function (name) {};

var _default = LEAnchorEditorController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/tool/LEClipboardTool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/tool/LEClipboardTool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _Broadcast = _interopRequireDefault(require("absol/src/Network/Broadcast"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _ClipboardManager = _interopRequireDefault(require("../../ClipboardManager"));

var _R = _interopRequireDefault(require("../../R"));

var _keyboard = require("absol/src/Input/keyboard");

var _FNode = require("../../core/FNode");

var _utils = require("../../core/utils");

var _generator = require("absol/src/JSMaker/generator");


/***
 *
 * @param editor
 * @constructor
 */
function LEClipboardTool(editor) {
  this.editor = editor;
  this.id = (0, _stringGenerate.randomIdent)(12);
  this.preInit();
  this.share.emitter.on('data', this.ev_data.bind(this));
  this.share.broadcast.on('data', this.ev_data.bind(this));
  this.share.emitter.on('paste', this.ev_paste.bind(this));
  this.share.broadcast.on('paste', this.ev_paste.bind(this));
  this.editor.on('change', this.ev_editorChange.bind(this));
  this.$anchorBorders = [];
  this.cuttingComponents = [];
}

LEClipboardTool.prototype.copy = function () {
  var data = this.editor.anchorEditorsCtrl.anchorEditors.map(function (ae) {
    return ae.component.getData();
  });
  if (data.length === 0) return;
  this.clearAnchorBorders();
  this.$anchorBorders = this.editor.anchorEditorsCtrl.anchorEditors.map(function (ae) {
    var comp = ae.component;
    var anchorElt = comp.anchor && comp.anchor.domElt || comp.domElt.parentElement;
    var borderElt = (0, _FCore._)({
      class: ['as-clipboard-anchor-border', 'as-action-copy']
    });
    anchorElt.insertBefore(borderElt, anchorElt.firstChild);
    return borderElt;
  });

  _ClipboardManager.default.set(_R.default.CLIPBOARD.COMPONENTS, {
    action: 'copy',
    controllerId: this.id,
    id: (0, _stringGenerate.randomIdent)(),
    data: data
  });

  this.emit('data', {
    action: 'copy'
  });
};

LEClipboardTool.prototype.cut = function () {
  var data = this.editor.anchorEditorsCtrl.anchorEditors.map(function (ae) {
    return ae.component.getData();
  });
  if (data.length === 0) return;
  this.clearAnchorBorders();
  this.$anchorBorders = this.editor.anchorEditorsCtrl.anchorEditors.map(function (ae) {
    var comp = ae.component;
    var anchorElt = comp.anchor && comp.anchor.domElt || comp.domElt.parentElement;
    var borderElt = (0, _FCore._)({
      class: ['as-clipboard-anchor-border', 'as-action-cut']
    });
    anchorElt.insertBefore(borderElt, anchorElt.firstChild);
    return borderElt;
  });

  _ClipboardManager.default.set(_R.default.CLIPBOARD.COMPONENTS, {
    action: 'cut',
    controllerId: this.id,
    id: (0, _stringGenerate.randomIdent)(),
    data: data
  });

  this.cuttingComponents = this.editor.anchorEditorsCtrl.anchorEditors.map(function (ae) {
    return ae.component;
  });
  this.emit('data', {
    action: 'cut'
  });
};

LEClipboardTool.prototype._pasteNormal = function () {
  var launcher = this.editor.getContext(_R.default.LAUNCHER);
  var shiftKey = launcher.userInteractionCtrl.shiftKey;

  var cTransfer = _ClipboardManager.default.get(_R.default.CLIPBOARD.COMPONENTS);

  var aeArr = this.editor.anchorEditorsCtrl.anchorEditors;
  var after = aeArr.length > 0 ? aeArr[aeArr.length - 1].component : null;
  var before = aeArr.length > 0 ? aeArr[0].component : null;
  var parent = this.editor.editingLayoutCtrl.editingLayout || this.editor.rootLayout;
  var nameDict = {};
  (0, _FNode.traversal)(this.editor.rootLayout, function (path) {
    nameDict[path.node.attributes.name] = true;
  });
  var data = (0, _generator.replaceDateStringJSVariable)(cTransfer.data);
  var comps = data.map(function (compData) {
    //todo: make new id and name
    (0, _FNode.traversal)(compData, function (path) {
      var node = path.node;
      node.attributes = node.attributes || {};
      node.attributes.id = (0, _utils.randomUniqueIdent)();
      var name = node.attributes.name || node.attributes.id;

      while (nameDict[name]) {
        name = (0, _utils.nextIdString)(name);
      }

      node.attributes.name = name;
      nameDict[name] = true;
    });
    return this.editor.buildComponent(compData, this.editor.rootFragment);
  }.bind(this));
  var comp;

  for (var i = 0; i < comps.length; ++i) {
    comp = comps[i];

    if (aeArr.length > 0) {
      if (shiftKey) {
        parent.addChildBefore(comp, before);
      } else {
        parent.addChildAfter(comp, after);
        after = comp;
      }
    } else {
      parent.addChild(comp);
    }
  }

  this.editor.setActiveComponent.apply(this.editor, comps);
};

LEClipboardTool.prototype._pasteForMoving = function () {
  var launcher = this.editor.getContext(_R.default.LAUNCHER);
  var shiftKey = launcher.userInteractionCtrl.shiftKey;
  var activeCompArr = this.editor.anchorEditorsCtrl.anchorEditors.map(function (ea) {
    return ea.component;
  });
  var cuttingCompDict = this.cuttingComponents.reduce(function (ac, cr) {
    ac[cr.attributes.id] = cr;
    return ac;
  }, {});
  activeCompArr = activeCompArr.filter(function (comp) {
    return !cuttingCompDict[comp.attributes.id];
  });
  var beforeComp = null;
  var afterComp = null;

  if (activeCompArr.length > 0) {
    beforeComp = activeCompArr[0];
    afterComp = activeCompArr[activeCompArr.length - 1];
  }

  var editingLayout = this.editor.editingLayoutCtrl.editingLayout || this.editor.rootLayout;
  var isSub = this.cuttingComponents.some(function (comp) {
    return editingLayout.domElt.isDescendantOf(comp.domElt) || comp === editingLayout;
  });

  if (isSub) {
    console.error("error", "Can not move to here"); //todo fail
  } else {
    if (!afterComp) {
      this.cuttingComponents.forEach(function (comp) {
        //todo: after select or before select
        editingLayout.addChild(comp);
      });
    } else {
      if (shiftKey) {
        this.cuttingComponents.forEach(function (comp) {
          //todo: after select or before select
          editingLayout.addChildBefore(comp, beforeComp);
        });
      } else {
        this.cuttingComponents.reverse().forEach(function (comp) {
          //todo: after select or before select
          editingLayout.addChildAfter(comp, beforeComp);
        });
      }
    }

    this.editor.setActiveComponent.apply(this.editor, this.cuttingComponents);
    this.cuttingComponents = [];
  }
};

LEClipboardTool.prototype.paste = function () {
  var cTransfer = _ClipboardManager.default.get(_R.default.CLIPBOARD.COMPONENTS);

  var rootElt = this.editor.rootLayout.domElt;
  var cuttingOK = cTransfer.action === 'cut' && cTransfer.controllerId === this.id && this.cuttingComponents.length > 0 && this.cuttingComponents.every(function (component) {
    return component.domElt.isDescendantOf(rootElt);
  });

  if (cuttingOK) {
    this._pasteForMoving();
  } else {
    this._pasteNormal();
  }

  this.editor.componentOtline.updateComponentTree();
  this.emit('paste', {});
};

LEClipboardTool.prototype.emit = function (name, eventData) {
  var data = Object.assign({
    fromId: this.id,
    type: name
  }, eventData);
  this.share.emitter.emit(name, data);
  this.share.broadcast.emit(name, data);
};

LEClipboardTool.prototype.clearAnchorBorders = function () {
  this.$anchorBorders.forEach(function (elt) {
    elt.remove();
  });
  this.$anchorBorders = [];
};

LEClipboardTool.prototype.onStart = function () {
  console.log("START");
};

LEClipboardTool.prototype.onStop = function () {
  console.log("STOP");
};

LEClipboardTool.prototype.share = {
  emitter: null,
  broadcast: null
};

LEClipboardTool.prototype.preInit = function () {
  this.share.broadcast = new _Broadcast.default('LEClipboardControllerBroadcastChannel');
  this.share.emitter = new _EventEmitter.default();

  var cTransfer = _ClipboardManager.default.get(_R.default.CLIPBOARD.COMPONENTS);

  if (cTransfer && !cTransfer.action && !cTransfer.data) {
    _ClipboardManager.default.set(_R.default.CLIPBOARD.COMPONENTS, null);
  }
};

LEClipboardTool.prototype.onOtherCopy = function () {
  this.cuttingComponents = [];
  this.clearAnchorBorders();
};

LEClipboardTool.prototype.ev_data = function (event) {
  if (event.fromId !== this.id) {
    this.onOtherCopy();
  }
};

LEClipboardTool.prototype.ev_paste = function () {
  this.cuttingComponents = [];
  this.clearAnchorBorders();
};

LEClipboardTool.prototype.ev_editorChange = function () {
  this.cuttingComponents = [];
  this.clearAnchorBorders();
};

var _default = LEClipboardTool;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/controller/LEBoundViewController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/controller/LEBoundViewController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FNode = require("../../core/FNode");

var _GCore = require("../../core/GCore");

/***
 *
 * @param {LayoutEditor} editor
 * @constructor
 */
function LEBoundViewController(editor) {
  this.editor = editor;
  /***
   *
   * @type {AElement|SVGAElement|null}
   */

  this.$graphic = null;
  this.$ctn = null;
  this.$bounds = {};
}

LEBoundViewController.prototype.onCreateView = function () {
  this.$graphic = this.editor.$overlayGraphic;
  /***
   * @type {AElementNS}
   */

  this.$ctn = (0, _GCore._)('g').addTo(this.$graphic);
  this.$editingLayoutBound = (0, _GCore._)({
    tag: 'rect',
    class: ['as-le-bound-rect', 'as-le-editing-layout-bound']
  }).addTo(this.$graphic);
};

LEBoundViewController.prototype.update = function () {
  var boundElements = this.$bounds;
  var gBound = this.$graphic.getBoundingClientRect();
  var updatedId = Math.random() * 10000 >> 0;
  var depth = this.editor.selectCtrl.mode === this.editor.selectCtrl.MODE_DEPTH;

  var drawRect = (comp, rectElt) => {
    var bound;
    var id;
    bound = comp.domElt.getBoundingClientRect();
    id = comp.attributes.id;
    rectElt = rectElt || boundElements[id];

    if (!rectElt) {
      rectElt = (0, _GCore._)({
        tag: 'rect',
        class: ['as-le-bound-rect']
      });
      boundElements[id] = rectElt;
      this.$ctn.addChild(rectElt);
    }

    rectElt.attr({
      x: bound.left - gBound.left,
      y: bound.top - gBound.top,
      width: bound.width,
      height: bound.height
    });
    rectElt.__updatedId__ = updatedId;
  };

  var deptDraw = comp => {
    drawRect(comp);
    comp.children.forEach(deptDraw);
  };

  if (this.editor.editingLayout) {
    drawRect(this.editor.editingLayout, this.$editingLayoutBound);
    this.editor.editingLayout.children.forEach(comp => {
      if (depth) deptDraw(comp);else drawRect(comp);
    });
  }

  Object.keys(boundElements).forEach(key => {
    if (boundElements[key].__updatedId__ !== updatedId) {
      boundElements[key].remove();
      delete boundElements[key];
    }
  });
};

var _default = LEBoundViewController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/componenttool/LETextEditTool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/componenttool/LETextEditTool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));

var _FCore = require("../../core/FCore");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");


/***
 * @extends Context
 * @param editor
 * @param component
 * @constructor
 */
function LETextEditTool(editor, component) {
  _Context.default.apply(this, arguments);

  this.editor = editor;
  this.component = component;
  this.attach(this.editor);
  this.$content = this.component.$content || this.component.domElt;
  this.ev_clickOut = this.ev_clickOut.bind(this);
}

_OOP.default.mixClass(LETextEditTool, _Context.default);

LETextEditTool.prototype.onStart = function () {
  this.text = this.component.attributes.text;
  this.editor.$editorSpace.addClass('as-text-editing-tool-attached');
  this.$content.addClass('as-text-editing-tool-target');

  if (!this.$content.__preinput__) {
    this.$content.__preinput__ = (0, _FCore._)({
      tag: _PreInput.default.tag,
      elt: this.$content,
      props: {
        contentEditable: true
      },
      on: {
        keydown: event => {
          if (event.key === 'Enter' && !event.shiftKey && !event.ctrlKey && !event.altKey) {
            event.preventDefault();
            this.$input.blur();
            this.stop();
          } else if (event.key === 'Escape') {
            this.$input.value = this.text;
            this.$input.blur();
            this.stop();
          }

          _ResizeSystem.default.requestUpdateSignal();
        }
      }
    });
  }
  /***
   *
   * @type {PreInput}
   */


  this.$input = this.$content.__preinput__;
  this.$input.value = this.text;
  this.$input.focus();
  this.$input.select(this.text.length);
  document.addEventListener('mousedown', this.ev_clickOut);
};

LETextEditTool.prototype.onStop = function () {
  var newText = this.$input.value;
  this.editor.$editorSpace.removeClass('as-text-editing-tool-attached');
  document.removeEventListener('mousedown', this.ev_clickOut);

  if (newText !== this.text) {
    this.component.attributes.text = this.$input.value;
    this.editor.notifyDataChange();
    this.editor.undoCtrl.commit('edit', "Edit  " + this.component.attributes.name + '.text');
  }
};

LETextEditTool.prototype.ev_clickOut = function (event) {
  if (!(0, _EventEmitter.hitElement)(this.$input, event)) this.stop();
};

var _default = LETextEditTool;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/LayoutEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/LayoutEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = _interopRequireDefault(require("../core/Assembler"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../dom/HLine");

require("../dom/VLine");

var _R = _interopRequireDefault(require("../R"));

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _UndoHistory = _interopRequireDefault(require("../editor/UndoHistory"));

var _ComponentPropertiesEditor = _interopRequireDefault(require("../editor/ComponentPropertiesEditor"));

var _LayoutEditorCmd = _interopRequireWildcard(require("./LayoutEditorCmd"));

var _ClipboardManager = _interopRequireDefault(require("../ClipboardManager"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _RelativeAnchorEditor = _interopRequireDefault(require("./anchoreditors/RelativeAnchorEditor"));

var _FmFragment = _interopRequireWildcard(require("../core/FmFragment"));

var _BaseComponent = _interopRequireDefault(require("../core/BaseComponent"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _CMDTool = _interopRequireDefault(require("../fragment/CMDTool"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));

var _LEQuickPathController = _interopRequireDefault(require("./controller/LEQuickPathController"));

var _LEUndoController = _interopRequireDefault(require("./controller/LEUndoController"));

var _LERulerController = _interopRequireDefault(require("./controller/LERulerController"));

var _LEToolTabController = _interopRequireDefault(require("./controller/LEToolTabController"));

var _LEViewportController = _interopRequireDefault(require("./controller/LEViewportController"));

var _LESelectController = _interopRequireDefault(require("./controller/LESelectController"));

var _LEEditingLayoutControl = _interopRequireDefault(require("./controller/LEEditingLayoutControl"));

var _LEAnchorEditorController = _interopRequireDefault(require("./controller/LEAnchorEditorController"));

var _LEClipboardTool = _interopRequireDefault(require("./tool/LEClipboardTool"));

var _LEBoundViewController = _interopRequireDefault(require("./controller/LEBoundViewController"));

var _LETextEditTool = _interopRequireDefault(require("./componenttool/LETextEditTool"));

var _Scroller = require("absol-acomp/js/Scroller");




var _ = _FCore.default._;
var $ = _FCore.default.$;
/***
 *
 */

/****
 * @extends BaseEditor
 * @constructor
 */

function LayoutEditor() {
  _BaseEditor.default.call(this);

  _Assembler.default.call(this);

  this._bindEvent();

  this.CMDTool = new _CMDTool.default();
  this._softScale = 1;
  var self = this;
  this.setContext(_R.default.LAYOUT_EDITOR, this);
  this.setContext(_R.default.HAS_CMD_EDITOR, this);
  this.setContext(_R.default.CMD_TOOL, this.CMDTool);
  this.setupCmd(_LayoutEditorCmd.default, _LayoutEditorCmd.LayoutEditorCmdDescriptors);
  this.undoHistory = new _UndoHistory.default();
  this.setContext(_R.default.UNDO_HISTORY, this.undoHistory); // because it had it's ContextManager

  this.componentPropertiesEditor = new _ComponentPropertiesEditor.default(this).on({
    change: function (event) {
      self.updateAnchorPosition();
      self.updateEditing();

      _Dom.default.updateResizeSystem();

      if (event.name && event.name.match(/vAlign|hAlign|top|bottom|left|right/)) {
        self.updateAnchor();
        self.updateEditing();
      }
    },
    stopchange: function (event) {
      var compName = event.object ? event.object.getAttribute('name') : '{' + event.objects.map(function (object) {
        return object.getAttribute('name');
      }).join(', ') + '}';
      self.undoCtrl.commit('edit', compName + '.' + event.name + '');
      self.notifyUnsaved();

      if (event.name === 'name') {
        self.componentOtline.updateComponentTree();
      }
    }
  });
  this.quickPathCtrl = new _LEQuickPathController.default(this);
  this.undoCtrl = new _LEUndoController.default(this);
  this.toolTabCtrl = new _LEToolTabController.default(this);
  this.rulerCtrl = new _LERulerController.default(this);
  this.viewportCtrl = new _LEViewportController.default(this);
  this.selectCtrl = new _LESelectController.default(this);
  this.editingLayoutCtrl = new _LEEditingLayoutControl.default(this);
  this.anchorEditorsCtrl = new _LEAnchorEditorController.default(this);
  this.boundViewCtrl = new _LEBoundViewController.default(this);
  this.clipboardCtrl = new _LEClipboardTool.default(this);
  /***
   *
   * @type {null|Context}
   */

  this.conponetEditTool = null;
  this.CMDTool.bindWithEditor(this);
}

_OOP.default.mixClass(LayoutEditor, _Assembler.default, _BaseEditor.default);

LayoutEditor.prototype.refresh = function () {
  if (!this.rootLayout) return;
  var data = this.getData();
  var selected = this.getSelected();
  var editing = this.editingLayout.getAttribute('name');
  this.applyData(data);

  if (editing) {
    this.editLayoutByName(editing);
  } else {
    this.editLayout(this.rootLayout);
  }

  this.setActiveComponentByName.apply(this, selected);
  this.updateAnchor();
  this.notifyCmdDescriptorsChange();
};

LayoutEditor.prototype._bindEvent = function () {
  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }
};

LayoutEditor.prototype.constructor = LayoutEditor;

LayoutEditor.prototype.setSoftScale = function (val) {
  //todo
  this._softScale = val;
  this.$editorSpace.addStyle('transform', 'scale(' + val + ')');
};

LayoutEditor.prototype.getSoftScale = function (val) {
  return this._softScale;
};

LayoutEditor.prototype.zoomBy = function (val) {
  this.setSoftScale(val * this._softScale);
};

LayoutEditor.prototype.onAttached = function () {
  this.flexFormEditor = this.getContext(_R.default.FLEX_FORM_EDITOR);
  this.componentPropertiesEditor.attach(this);
  this.undoHistory.attach(this);
  this.componentOtline = this.getContext(_R.default.COMPONENT_OUTLINE);
};

LayoutEditor.prototype.onStart = function () {
  this.undoHistory.start();
  this.componentPropertiesEditor.start();
  this.componentOtline.start();
  this.CMDTool.start();
};

LayoutEditor.prototype.onResume = function () {
  /**
   * @type {import('../launcher/FMLauncher').default}
   */
  this.formEditor = this.getContext(_R.default.FORM_EDITOR);
  this.flexFormEditor = this.getContext(_R.default.FLEX_FORM_EDITOR);
  this.selfHolder = this.formEditor.getEditorHolderByEditor(this);
  /**
   * @type {import('../editor/UndoHistory').default}
   */

  this.undoHistory.resume();
  this.componentPropertiesEditor.resume();
  this.componentOtline.resume();
  /**
   * @type {import('../fragment/CMDTool'.default)}
   */

  _ClipboardManager.default.on('set', this.ev_clipboardSet);

  this.getView().focus();
  this.rulerCtrl.onEditorResume();
};

LayoutEditor.prototype.onPause = function () {
  // release undoHistory
  this.undoHistory.pause();
  this.componentPropertiesEditor.pause();
  this.componentOtline.pause();

  if (this.CMDTool) {
    this.CMDTool.pause();
  }

  _ClipboardManager.default.off('set', this.ev_clipboardSet);

  this.getView().blur();
  this.rulerCtrl.onEditorPause();
};

LayoutEditor.prototype.onStop = function () {
  this.undoHistory.stop();
  this.componentPropertiesEditor.stop();
  this.componentOtline.stop();
};

LayoutEditor.prototype.onDestroy = function () {
  this.undoHistory.destroy();
  this.componentPropertiesEditor.destroy();
  this.componentOtline.destroy();

  if (this.autoDestroyInt > 0) {
    clearInterval(this.autoDestroyInt);
  }
};
/**
 * call whenever component is edited, event will not be fired if disable publicDataChange flag
 */


LayoutEditor.prototype.notifyDataChange = function () {
  if (this._publicDataChange) this.emit('change', {
    type: 'change',
    target: this
  }, this);
};

LayoutEditor.prototype.createView = function () {
  var self = this;
  this.$view = _({
    class: ['as-layout-editor'],
    attr: {
      tabindex: '1'
    },
    child: [{
      class: 'as-layout-editor-left',
      child: [{
        class: 'as-layout-editor-header',
        child: [{
          class: 'as-layout-editor-cmd-tool-container',
          child: this.CMDTool.getView()
        }, {
          class: 'as-layout-editor-quickpath-container',
          child: {
            tag: 'quickpath'
          }
        }]
      }, {
        class: 'as-layout-editor-body',
        child: [{
          class: 'as-layout-editor-measure-container',
          child: [{
            class: 'as-layout-editor-vrule-container',
            child: 'vruler'
          }, {
            class: 'as-layout-editor-hrule-container',
            child: 'hruler'
          }, {
            class: 'as-layout-editor-background-container'
          }, {
            class: ["as-layout-editor-space-container"],
            child: [{
              class: 'as-layout-editor-space',
              child: [{
                class: 'as-layout-editor-layout-container'
              }, 'svg.as-layout-editor-overlay-graphic', {
                class: 'as-layout-editor-foreground',
                extendEvent: 'contextmenu',
                on: {
                  contextmenu: this.ev_contextMenuLayout.bind(this)
                }
              }]
            }, {
              tag: _Scroller.VScrollbar,
              class: 'as-layout-editor-v-scroll-bar'
            }, {
              tag: _Scroller.HScrollbar,
              class: 'as-layout-editor-h-scroll-bar'
            }]
          }]
        }]
      }]
    }, {
      class: 'as-layout-editor-tool-tab-ctn',
      child: [{
        class: 'as-layout-editor-tool-tab-bar',
        child: [{
          tag: 'button',
          attr: {
            'data-tab': 'history'
          },
          class: ['as-layout-editor-tool-tab-btn'],
          child: 'history-ico',
          on: {
            click: this.toolTabCtrl.toggle.bind(this.toolTabCtrl, 'history')
          }
        }, {
          tag: 'button',
          attr: {
            'data-tab': 'properties'
          },
          class: 'as-layout-editor-tool-tab-btn',
          child: 'properties-ico',
          on: {
            click: this.toolTabCtrl.toggle.bind(this.toolTabCtrl, 'properties')
          }
        }]
      }, {
        class: 'as-layout-editor-tool-ctn',
        attr: {
          'data-tab': 'history'
        },
        style: {
          display: 'none'
        },
        child: this.undoHistory.getView()
      }, {
        class: 'as-layout-editor-tool-ctn',
        attr: {
          'data-tab': 'properties'
        },
        style: {
          display: 'none'
        },
        child: this.componentPropertiesEditor.getView()
      }]
    }],
    on: {
      keydown: this.ev_cmdKeyDown.bind(this)
    }
  });
  this.$header = $('.as-layout-editor-header', this.$view);
  this.$editorSpace = $('.as-layout-editor-space', this.$view);
  this.$layoutCtn = $('.as-layout-editor-layout-container', this.$view);
  this.$foreground = $('.as-layout-editor-foreground', this.$view); // .on('mousedown', this.ev_mousedownForeground.bind(this));//todo

  this.$overlayGraphic = $('svg.as-layout-editor-overlay-graphic', this.$view);
  this.$vscrollbar = $('.as-layout-editor-v-scroll-bar', this.$view);
  this.$hscrollbar = $('.as-layout-editor-h-scroll-bar', this.$view);
  this.quickPathCtrl.onCreateView();
  this.rulerCtrl.onCreateView();
  this.toolTabCtrl.onCreateView();
  this.viewportCtrl.onCreateView();
  this.selectCtrl.onCreateView();
  this.editingLayoutCtrl.onCreateView();
  this.anchorEditorsCtrl.onCreateView();
  this.boundViewCtrl.onCreateView();
  this.$attachHook = _('attachhook').on('attached', function () {
    this.updateSize = self.updateSize.bind(self);

    _Dom.default.addToResizeSystem(this);

    self.updateSize();
  }).addTo(this.$view);
  this.$editorSpaceCtn = $('.as-layout-editor-space-container', this.$view).on('click', this.ev_clickEditorSpaceCtn);
  this.autoDestroyInt = setInterval(function () {
    if (!self.$view.isDescendantOf(document.body)) {
      self.destroy();
    }
  }, 6900);
  this.$mouseSelectingBox = _('.as-layout-editor-mouse-selecting-box');
  this.$cmdToolCtn = $('.as-layout-editor-cmd-tool-container', this.$view);
  this.$measureCtn = $('.as-layout-editor-measure-container', this.$view); // this.$vscrollbar = $('.as-layout-editor-v-scroll-bar', this.$view);

  this.$view.layoutEditor = this;
};

LayoutEditor.prototype.ev_clickEditorSpaceCtn = function (event) {
  if (event.target === this.$editorSpaceCtn) {
    this.setActiveComponent();
  }
};

LayoutEditor.prototype.ev_mousedownForeground = function (event) {
  if (!_EventEmitter.default.isMouseLeft(event)) return;
  if (event.target !== this.$foreground) return;
  var hitComponent = this.findComponentsByMousePosition(event.clientX, event.clientY);

  if (hitComponent) {
    if (event.shiftKey) this.toggleActiveComponent(hitComponent);else this.setActiveComponent(hitComponent);
    var anchorEditor = this.anchorEditors[this.anchorEditors.length - 1]; //cheating

    var repeatedEvent = _EventEmitter.default.copyEvent(event, {
      target: $('.as-resize-box-body', anchorEditor.$resizeBox),
      preventDefault: event.preventDefault.bind(event)
    });

    anchorEditor.$resizeBox.eventHandler.mouseDownBody(repeatedEvent);
    this.$view.focus(); // layouteditor may be not focus before, prevent default effect make it not focus
    // prevent auto toggle with click event

    anchorEditor.preventClick = true;
    anchorEditor.once('click', function () {
      setTimeout(function () {
        anchorEditor.preventClick = false;
      }, 1);
    });
    anchorEditor.$resizeBox.on('endmove', function () {
      anchorEditor.preventClick = false;
    });
  } else {
    $(document.body).on('mouseup', this.ev_mouseFinishForeground).on('mouseleave', this.ev_mouseFinishForeground).on('mousemove', this.ev_mouseMoveForeground);
    this.$editorSpaceCtn.off('click', this.ev_clickEditorSpaceCtn);
    this.$mouseSelectingBox.addTo(this.$foreground);
    var foregroundBound = this.$foreground.getBoundingClientRect();
    this._forgroundMovingData = {
      left: event.clientX - foregroundBound.left,
      top: event.clientY - foregroundBound.top,
      width: 0,
      height: 0,
      event0: event
    };
    this.$mouseSelectingBox.addStyle({
      left: this._forgroundMovingData.left + 'px',
      top: this._forgroundMovingData.top + 'px',
      width: '0',
      height: '0'
    });
  }
};

LayoutEditor.prototype.ev_mouseMoveForeground = function (event) {
  var foregroundBound = this.$foreground.getBoundingClientRect();
  this._forgroundMovingData.width = event.clientX - foregroundBound.left - this._forgroundMovingData.left;
  this._forgroundMovingData.height = event.clientY - foregroundBound.top - this._forgroundMovingData.top;

  if (this._forgroundMovingData.width < 0) {
    this.$mouseSelectingBox.addStyle({
      left: this._forgroundMovingData.left + this._forgroundMovingData.width + 'px',
      width: -this._forgroundMovingData.width + 'px'
    });
  } else {
    this.$mouseSelectingBox.addStyle({
      left: this._forgroundMovingData.left + 'px',
      width: this._forgroundMovingData.width + 'px'
    });
  }

  if (this._forgroundMovingData.height < 0) {
    this.$mouseSelectingBox.addStyle({
      top: this._forgroundMovingData.top + this._forgroundMovingData.height + 'px',
      height: -this._forgroundMovingData.height + 'px'
    });
  } else {
    this.$mouseSelectingBox.addStyle({
      top: this._forgroundMovingData.top + 'px',
      height: this._forgroundMovingData.height + 'px'
    });
  }
};

LayoutEditor.prototype.ev_mouseFinishForeground = function (event) {
  $(document.body).off('mouseup', this.ev_mouseFinishForeground).off('mouseleave', this.ev_mouseFinishForeground).off('mousemove', this.ev_mouseMoveForeground);
  setTimeout(this.$editorSpaceCtn.on.bind(this.$editorSpaceCtn, 'click', this.ev_clickEditorSpaceCtn), 10);
  this.$mouseSelectingBox.remove(); //find all rectangle

  var selectedComp = [];
  var event0 = this._forgroundMovingData.event0;
  var left = Math.min(event0.clientX, event.clientX);
  var right = Math.max(event0.clientX, event.clientX);
  var top = Math.min(event0.clientY, event.clientY);
  var bottom = Math.max(event0.clientY, event.clientY);
  var selectRect = new _Rectangle.default(left, top, right - left, bottom - top);
  var children = this.editingLayout.children;

  if (this.anchorEditors.length > 0) {
    children = this.editingLayout.children;
  }

  var comp, compRect;

  for (var i = 0; i < children.length; ++i) {
    comp = children[i];
    compRect = _Rectangle.default.fromClientRect(comp.view.getBoundingClientRect());
    if (compRect.isCollapse(selectRect)) selectedComp.push(comp);
  }

  var self = this;

  if (event.shiftKey) {
    this.toggleActiveComponent.apply(this, selectedComp.filter(function (comp) {
      return !self.findAnchorEditorByComponent(comp);
    }));
  } else {
    this.setActiveComponent.apply(this, selectedComp);
  }
};

LayoutEditor.prototype.ev_layoutCtnScroll = function () {
  this.rulerCtrl.update();
};

LayoutEditor.prototype.ev_contextMenuLayout = function (event) {
  var self = this;

  if (event.target === this.$foreground) {
    event.showContextMenu({
      // play-box-outline
      items: [{
        text: 'Preview',
        icon: 'span.mdi.mdi-pencil-box-multiple-outline',
        cmd: 'preview'
      }],
      extendStyle: {
        fontSize: '12px'
      }
    }, function (menuEvent) {
      var cmd = menuEvent.menuItem.cmd;
      self.execCmd(cmd);
    });
  }
};

LayoutEditor.prototype.ev_clipboardSet = function () {
  this.notifyCmdDescriptorsChange();
};

LayoutEditor.prototype.ev_dblclickCurtain = function (event) {
  var parentLayout = this.findNearestLayoutParent(this.editingLayout.parent);
  if (parentLayout && parentLayout.isLayout) this.editLayout(parentLayout);
};

LayoutEditor.prototype.updateEditing = function () {
  this.rulerCtrl.updateEditing();
};

LayoutEditor.prototype.updateAnchor = function () {
  for (var i = 0; i < this.anchorEditors.length; ++i) {
    this.anchorEditors[i].update();
  }
};

LayoutEditor.prototype.updateAnchorPosition = function () {
  for (var i = 0; i < this.anchorEditors.length; ++i) {
    this.anchorEditors[i].updatePosition();
  }
};

LayoutEditor.prototype.findComponentsByName = function (name, from) {
  from = from || this.rootLayout;
  if (!from) return;
  var res = undefined;

  if (from.attributes.name === name) {
    return [from];
  }

  var self = this;
  if (from.fragment !== this.rootFragment) return undefined;
  if (from.children) res = from.children.reduce(function (ac, child) {
    var found = self.findComponentsByName(name, child);
    if (found) return ac.concat(found);
    return ac;
  }, []);
  if (res.length > 0) return res;
  return undefined;
};

LayoutEditor.prototype.findComponentsById = function (id, from) {
  from = from || this.rootLayout;
  if (!from) return undefined;
  var res = undefined;

  if (from.attributes.id === id) {
    return [from];
  }

  if (from.fragment !== this.rootFragment) return undefined;
  var self = this;

  if (from.children) {
    res = from.children.reduce(function (ac, child) {
      var found = self.findComponentsById(id, child);
      if (found) return ac.concat(found);
      return ac;
    }, []);
  }

  if (res.length > 0) return res;
  return undefined;
};

LayoutEditor.prototype.updateSize = function () {
  this.updateAnchorPosition();
  var gBound = this.$overlayGraphic.getBoundingClientRect();
  this.$overlayGraphic.attr('viewBox', [0, 0, gBound.width, gBound.height].join(' '));
  this.boundViewCtrl.update();
  this.viewportCtrl.updateScrollbar();
};

LayoutEditor.prototype.setActiveComponent = function () {
  this.anchorEditorsCtrl.setActiveComponent.apply(this.anchorEditorsCtrl, arguments);
};

LayoutEditor.prototype.setActiveComponentByName = function () {
  this.anchorEditorsCtrl.setActiveComponentByName.apply(this.anchorEditorsCtrl, arguments);
};

LayoutEditor.prototype.setActiveComponentById = function () {
  this.anchorEditorsCtrl.setActiveComponentById.apply(this.anchorEditorsCtrl, arguments);
};

LayoutEditor.prototype.findFocusAnchorEditor = function () {
  // faster
  for (var i = this.anchorEditors.length - 1; i >= 0; --i) {
    if (this.anchorEditors[i].isFocus) return this.anchorEditors[i];
  }

  return null;
};

LayoutEditor.prototype.getActivatedComponents = function () {
  return this.anchorEditors.map(function (e) {
    return e.component;
  }).filter(function (e) {
    return !!e;
  });
};

LayoutEditor.prototype.applyData = function (data) {
  var FmClass = (0, _FmFragment.makeFmFragmentClass)({
    tag: 'LayoutTest',
    contentViewData: {
      layout: data
    }
  });
  this.rootFragment = new FmClass();
  this.$layoutCtn.clearChild().addChild(this.rootLayout.domElt);
  this.rootLayout.onAttached(this);
  this.rulerCtrl.assignRoot();
  this.editingLayoutCtrl.edit(this.rootLayout);
  this.componentOtline.updateComponentTree();
  this.selectCtrl.calcSelectBoundStyle();
  this.emit('change', {
    type: 'change',
    target: this,
    data: data
  }, this);
};

LayoutEditor.prototype.setData = function (data) {
  this.applyData(data);
  this.undoCtrl.commit('set-data', "Set data");
  this.boundViewCtrl.update();
};

LayoutEditor.prototype.autoExpandRootLayout = function () {
  if (this.rootLayout) {
    var minSize = this.rootLayout.measureMinSize();
    var isChange = false;

    if (minSize.width > this.rootLayout.style.width) {
      this.rootLayout.setStyle('width', minSize.width);
      isChange = true;
    }

    if (minSize.height > this.rootLayout.style.height) {
      this.rootLayout.setStyle('height', minSize.height);
      isChange = true;
    }

    if (isChange) {
      this.emit('layoutexpand', {
        type: 'layoutexpand',
        target: this,
        layout: this.rootLayout
      }, this);
      this.notifyDataChange();
    }
  }
};

LayoutEditor.prototype.editLayout = function (layout) {
  if (layout && layout.isLayout) {
    this.anchorEditorsCtrl.setActiveComponent();
    this.editingLayoutCtrl.edit(layout);
  }
};
/***
 *
 * @param {BaseComponent} comp
 */


LayoutEditor.prototype.editComponent = function (comp) {
  if (this.conponetEditTool) {
    this.conponetEditTool.stop();
    this.conponetEditTool = null;
  }

  if (comp.tag === 'Text' || comp.tag === 'Label') {
    this.conponetEditTool = new _LETextEditTool.default(this, comp);
    this.conponetEditTool.start();
  }
};

LayoutEditor.prototype.editLayoutByName = function (name) {
  var comps = this.findComponentsByName(name);
  if (comps && comps.length > 0) this.editLayout(comps[0]);
};

LayoutEditor.prototype.getData = function () {
  if (this.rootLayout) {
    return this.rootLayout.getData();
  }

  return null;
};

LayoutEditor.prototype.getCmdNames = function () {
  return Object.keys(_LayoutEditorCmd.default);
};

LayoutEditor.prototype.getCmdDescriptor = function (name) {
  var descriptor = null;
  descriptor = descriptor || this.selectCtrl.getCmdDescriptor(name);

  if (this.editingLayout) {
    var anchorEditorConstructor = this.editingLayout.AnchorEditorClass;

    if (anchorEditorConstructor.prototype.getCmdDescriptor) {
      descriptor = descriptor || anchorEditorConstructor.prototype.getCmdDescriptor.call(null, name);
    }
  }

  descriptor = descriptor || _LayoutEditorCmd.LayoutEditorCmdDescriptors[name];
  var res = Object.assign({
    type: 'trigger',
    desc: 'command: ' + name,
    icon: 'span.mdi.mdi-apple-keyboard-command'
  }, descriptor);

  if ((name.startsWith('align') || name.startsWith('equalise')) && this.anchorEditors.length < 2) {
    res.disabled = true;
  } else if (name.startsWith('distribute') && this.anchorEditors.length < 3) {
    res.disabled = true;
  } else if (name.match(/^(delete|copy|cut|horizontalAlign|verticalAlign)/) && this.anchorEditors.length < 1) {
    res.disabled = true;
  } else if (name === 'paste') {
    res.disabled = !_ClipboardManager.default.get(_R.default.CLIPBOARD.COMPONENTS);
  } else if (name === 'undo') {
    res.disabled = this.undoHistory.lastItemIndex <= 0;
  } else if (name === 'redo') {
    res.disabled = this.undoHistory.lastItemIndex >= this.undoHistory.items.length - 1;
  }

  return res;
};

LayoutEditor.prototype.getCmdGroupTree = function () {
  var tree = _LayoutEditorCmd.LayoutEditorCmdTree.slice();

  tree.push(this.anchorEditorsCtrl.getCmdGroupTree());
  tree = tree.filter(function (e) {
    return e && e.length > 0;
  });
  return tree;
};

LayoutEditor.prototype.findNearestLayoutParent = function (comp) {
  while (comp) {
    if (comp.addChildByPosition) {
      break;
    }

    comp = comp.parent;
  }

  return comp;
};
/**
 * @returns {import('../core/BaseComponent') }
 */


LayoutEditor.prototype.addNewComponent = function (constructor, posX, posY) {
  var self = this;
  var layout = this.editingLayout;
  var rootBound = this.rootLayout.domElt.getBoundingClientRect();
  var layoutBound = layout.domElt.getBoundingClientRect();
  var layoutPosX = posX - (layoutBound.left - rootBound.left);
  var layoutPosY = posY - (layoutBound.top - rootBound.top);
  var addedComponents = [];

  if (!(constructor instanceof Array)) {
    constructor = [constructor];
  }

  addedComponents = constructor.map(function (cst) {
    var comp;

    if (typeof cst == 'function') {
      if (cst.prototype.type === _FmFragment.default.prototype.type) {
        var frg = new cst();
        comp = frg.view;
        self.rootFragment.addChild(frg);
      } else if (cst.prototype.type === _BaseComponent.default.prototype.type) {
        comp = new cst();
        comp.fragment = self.rootFragment;
      }
    } else {
      comp = self.buildComponent(cst, self.rootFragment);
    }

    layout.addChildByPosition(comp, layoutPosX, layoutPosY);
    return comp;
  });
  this.emit('addcomponent', {
    type: 'addcomponent',
    components: addedComponents,
    target: this
  }, this);
  this.setActiveComponent.apply(this, addedComponents);
  this.notifyDataChange();
  setTimeout(this.updateAnchorPosition.bind(this), 1);
  this.updateEditing();
  this.componentOtline.updateComponentTree();
  this.undoCtrl.commit('add', "Add " + addedComponents.map(function (comp) {
    return comp.getAttribute('name');
  }).join(', '));
  this.componentOtline.updateComponentTree();
  this.notifyUnsaved();
};

LayoutEditor.prototype.buildComponent = function () {
  var comp = _Assembler.default.prototype.buildComponent.apply(this, arguments);

  var thisEditor = this;
  var originFunction = comp.getStyle;

  comp.getStyle = function () {
    var res = originFunction.apply(this, arguments);

    if (arguments[1] == 'px' && comp.style[arguments[0]] != res) {
      res /= thisEditor._softScale;
    }

    return res;
  };

  return comp;
};

LayoutEditor.prototype.clearRootLayout = function () {
  this._activatedComponent = undefined;
  this.rootLayout.clearChild();
  this.updateAnchor();
  this.emit('clearallcomponent', {
    target: this
  }, this);
  this.notifyDataChange();
  this.componentOtline.updateComponentTree();
  this.undoCtrl.commit('remove', 'Remove all components');
  this.notifyUnsaved();
};

LayoutEditor.prototype.removeComponent = function () {
  var removedComponents = Array.prototype.slice.call(arguments);
  this.anchorEditorsCtrl.setActiveComponent();
  removedComponents.forEach(function (comp) {
    comp.remove();
  }); //edit nothing

  this.emit('removecomponent', {
    type: 'removecomponent',
    target: this,
    components: removedComponents
  }, this);
  this.componentPropertiesEditor.edit();
  this.notifyDataChange();

  if (removedComponents.length > 0) {
    this.componentOtline.updateComponentTree();
    this.undoCtrl.commit('remove', 'Remove ' + removedComponents.map(function (c) {
      return c.getAttribute('name');
    }).join(', '));
    this.notifyUnsaved();
  }
};

LayoutEditor.prototype.moveUpComponent = function (comp) {
  var parent = comp.parent;
  if (!parent) return;
  var prevChild = parent.findChildBefore(comp);
  if (!prevChild) return;
  comp.remove();
  parent.addChildBefore(comp, prevChild);
  this.emit('moveupcomponent', {
    type: 'moveupcomponent',
    target: this,
    component: comp
  }, this);
  this.notifyDataChange();
  this.componentOtline.updateComponentTree();
  this.undoCtrl.commit('move-order', 'Move ' + comp.getAttribute('name') + ' up');
  this.notifyUnsaved();
  this.updateAnchorPosition();
};

LayoutEditor.prototype.moveDownComponent = function (comp) {
  var parent = comp.parent;
  if (!parent) return;
  var nextChild = parent.findChildAfter(comp);
  if (!nextChild) return;
  nextChild.remove();
  parent.addChildBefore(nextChild, comp);
  this.emit('movedowncomponent', {
    type: 'movedowncomponent',
    target: this,
    component: comp
  }, this);
  this.notifyDataChange();
  this.componentOtline.updateComponentTree();
  this.undoCtrl.commit('move-order', 'Move ' + comp.getAttribute('name') + ' down');
  this.notifyUnsaved();
  this.updateAnchorPosition();
};

LayoutEditor.prototype.moveToBottomComponent = function (comp) {
  var parent = comp.parent;
  if (!parent) return;
  var lastChild = parent.children[parent.children - 1];
  if (lastChild == comp) return;
  comp.remove();
  parent.addChild(comp);
  this.emit('movetobottomcomponent', {
    type: 'movetobottomcomponent',
    target: this,
    component: comp
  }, this);
  this.notifyDataChange();
  this.componentOtline.updateComponentTree();
  this.undoCtrl.commit('move-order', 'Move ' + comp.getAttribute('name') + ' to bottom');
  this.notifyUnsaved();
  this.updateAnchorPosition();
};

LayoutEditor.prototype.moveToTopComponent = function (comp) {
  var parent = comp.parent;
  if (!parent) return;
  var firstChild = parent.children[0];
  if (firstChild === comp) return;
  comp.remove();
  parent.addChildBefore(comp, firstChild);
  this.emit('movetotopcomponent', {
    type: 'movetotopcomponent',
    target: this,
    component: comp
  }, this);
  this.notifyDataChange();
  this.componentOtline.updateComponentTree();
  this.undoCtrl.commit('move-order', 'Move ' + comp.getAttribute('name') + ' to top');
  this.notifyUnsaved();
  this.updateAnchorPosition();
};

LayoutEditor.prototype.notifyUnsaved = function () {
  this.flexFormEditor.notifyUnsaved();
};

LayoutEditor.prototype.notifySaved = function () {
  this.flexFormEditor.notifySaved();
};

LayoutEditor.prototype.getSelected = function () {
  return this.anchorEditors.map(function (aed) {
    return aed.component.attributes.id;
  });
};

LayoutEditor.prototype.execCmd = function () {
  try {
    return _BaseEditor.default.prototype.execCmd.apply(this, arguments);
  } catch (error) {
    if (!error.message.startsWith('No command')) (0, _safeThrow.default)(error);
  }

  try {
    var focusEditor = this.findFocusAnchorEditor();

    if (focusEditor) {
      return focusEditor.execCmd.apply(focusEditor, arguments);
    }
  } catch (error1) {
    if (!error1.message.startsWith('No command')) (0, _safeThrow.default)(error1);
  }
};

Object.defineProperty(LayoutEditor.prototype, 'editingLayout', {
  get: function () {
    return this.editingLayoutCtrl && this.editingLayoutCtrl.editingLayout;
  }
});
Object.defineProperty(LayoutEditor.prototype, 'rootLayout', {
  get: function () {
    return this.rootFragment && this.rootFragment.view || null;
  }
});
Object.defineProperty(LayoutEditor.prototype, 'anchorEditors', {
  get: function () {
    return this.anchorEditorsCtrl.anchorEditors;
  }
});
var _default = LayoutEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/fragment/ProjectExplorer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/fragment/ProjectExplorer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/projectexplorer.css");

var _PluginManager = _interopRequireDefault(require("../core/PluginManager"));

var _R = _interopRequireDefault(require("../R"));

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));


var _ = _FCore.default._;
var $ = _FCore.default.$;

function ProjectExplorer() {
  _BaseEditor.default.call(this);

  this.pluginContext = {
    self: this,
    _: _,
    $: $
  };
  this.data = {
    projectName: null
  };
}

Object.defineProperties(ProjectExplorer.prototype, Object.getOwnPropertyDescriptors(_BaseEditor.default.prototype));
Object.defineProperties(ProjectExplorer.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
_EventEmitter.default.prototype.constructor = ProjectExplorer;

ProjectExplorer.prototype.onStart = function () {
  _PluginManager.default.exec(this, _R.default.PLUGINS.PROJECT_EXPLORER, this.pluginContext);
};

ProjectExplorer.prototype.getView = function () {
  var self = this;
  if (this.$view) return this.$view;
  this.$view = _({
    class: 'as-form-explorer',
    child: {
      tag: 'droppanel',
      props: {
        name: this.data.projectName || 'NONE'
      }
    }
  });
  this.$droppanel = $('droppanel', this.$view);
  /** before new feature release, I cheated here */

  this.$cmdCtn = _('.absol-drop-panel-head-cmd-button-container');
  this.$reloadCmdBtn = _({
    tag: 'button',
    child: 'span.mdi.mdi-reload',
    on: {
      click: this.loadExpTree.bind(this)
    }
  }).addTo(this.$cmdCtn);
  this.$droppanel.$head.addChild(this.$cmdCtn);
  var clickCallback = this.$droppanel.$head._azar_extendEvents.nonprioritize.click[0].callback;
  this.$droppanel.$head.off('click', clickCallback).on('click', function (event) {
    if (!_EventEmitter.default.hitElement(self.$cmdCtn, event)) {
      clickCallback.apply(this, arguments);
    }
  });
  if (this.data.projectName != null) this.loadExpTree();
  return this.$view;
};

ProjectExplorer.prototype.openProject = function (value) {
  if (typeof value == 'string') this.data = {
    projectName: value || "Unknown"
  };else {
    this.data = value || {};
  }

  if (this.$view) {
    this.$droppanel.name = this.data.projectName;
    this.loadExpTree();
  }
};

ProjectExplorer.prototype.loadExpTree = function () {
  if (this.pluginContext.loadExpTree) this.pluginContext.loadExpTree();
};

ProjectExplorer.prototype.openItem = function (type, ident, name, contentArguments, desc) {
  var formEditor = this.getContext(_R.default.FORM_EDITOR);

  if (formEditor) {
    formEditor.openItem(type, ident, name, contentArguments, desc);
  }
};

var _default = ProjectExplorer;
exports.default = _default;
};

moduleFactories["node_modules/absol-brace/components/BCore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/components/BCore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$$ = exports.$ = exports._ = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Shape = _interopRequireDefault(require("absol-svg/js/svg/Shape"));


var BCore = new _Dom.default();
BCore.install(_Shape.default);
var _ = BCore._;
exports._ = _;
var $ = BCore.$;
exports.$ = $;
var $$ = BCore.$$;
exports.$$ = $$;
var _default = BCore;
exports.default = _default;
};

moduleFactories["node_modules/absol-brace/BraceExternal/ext/goto.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/BraceExternal/ext/goto.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.GoToCommand = void 0;

var _BCore = require("../../components/BCore");

var _OnsScreenWindow = _interopRequireDefault(require("absol-acomp/js/OnsScreenWindow"));

var _WindowBox = _interopRequireDefault(require("absol-acomp/js/WindowBox"));

var _FlexiconButton = _interopRequireDefault(require("absol-acomp/js/FlexiconButton"));

var _keyboard = require("absol/src/Input/keyboard");

require("absol-acomp/css/common.css");

var _Dom = require("absol/src/HTML5/Dom");

var _Modal = _interopRequireDefault(require("absol-acomp/js/Modal"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");


function openGoToDialog(editor) {
  var zIndex = 0;
  var maxZIndex = 0;
  var container = editor.container;
  var c = container;
  var screenSize = (0, _Dom.getScreenSize)();

  while (c) {
    zIndex = parseFloat(getComputedStyle(c).zIndex);
    if (!isNaN(zIndex)) maxZIndex = Math.max(maxZIndex, zIndex);
    c = c.parentElement;
  }

  var editorBound = container.getBoundingClientRect();
  var cursor = editor.getCursorPosition();
  var modal = (0, _BCore._)({
    tag: _Modal.default,
    style: {
      zIndex: maxZIndex + 1000
    },
    child: {
      tag: _OnsScreenWindow.default,
      style: {
        width: 'auto',
        height: 'auto',
        minWidth: '228px',
        minHeight: '102px',
        zIndex: maxZIndex + 1005,
        top: Math.max(0, Math.min(screenSize.height - 50, editorBound.top + editorBound.height / 2 - 50)) + 'px',
        left: Math.max(0, Math.min(screenSize.width - 276, editorBound.left + editorBound.width / 2 - 276 / 2)) + 'px'
      }
    }
  });
  /***
   *
   * @type {WindowBox}
   */

  var windowBox = (0, _BCore._)({
    elt: (0, _BCore.$)(_WindowBox.default.tag, modal),
    class: 'ace_window_box',
    style: {
      fontSize: '14px'
    },
    child: [{
      style: {
        padding: '5px',
        whiteSpace: 'nowrap'
      },
      child: ['<span>Line[:Column] </span>', {
        tag: 'input',
        class: 'as-text-input',
        attr: {
          type: 'text'
        },
        style: {
          width: '180px'
        },
        props: {
          value: [cursor.row + 1, cursor.column + 1].join(':')
        }
      }]
    }, {
      style: {
        padding: '5px',
        whiteSpace: 'nowrap',
        textAlign: 'center'
      },
      child: [{
        tag: _FlexiconButton.default,
        class: 'primary',
        style: {
          minWidth: '80px',
          marginRight: '20px'
        },
        props: {
          text: 'OK'
        }
      }, {
        tag: _FlexiconButton.default,
        style: {
          minWidth: '80px'
        },
        props: {
          text: 'CANCEL'
        }
      }]
    }],
    props: {
      windowActions: [{
        icon: '<span class="material-icons close">close</span>',
        name: 'close'
      }]
    },
    on: {
      action: event => {
        if (event.actionData.name === 'close') {
          cancel();
        }
      }
    }
  });

  var finish = () => {
    modal.selfRemove();
  };

  var cancel = () => {
    finish();
    editor.focus();
  };

  var ok = () => {
    var textParts = numInput.value.split(':').map(t => t.trim());
    var pos = null;
    var r, c;

    if (textParts.length === 1 || textParts.length === 2) {
      r = parseInt(textParts[0]);

      if (textParts.length === 2) {
        c = parseInt(textParts[1]);
      } else {
        c = 1;
      }

      if (!isNaN(r) && !isNaN(c)) {
        pos = [Math.max(r, 1), Math.max(c, 1)];
      }
    }

    if (pos) {
      finish();
      editor.gotoLine(pos[0], pos[1] - 1);
      editor.focus();
    } else {
      numInput.focus();
      numInput.select();
    }
  };

  windowBox.windowTitle = "Go To Line:Column";
  modal.addTo(document.body);
  var numInput = (0, _BCore.$)('.as-text-input', windowBox);
  var $buttons = (0, _BCore.$$)(_FlexiconButton.default.tag, windowBox);
  $buttons[0].on('click', ok);
  $buttons[1].on('click', cancel);
  modal.on('mouseup', event => {
    if ((0, _EventEmitter.hitElement)(numInput, event) || (0, _EventEmitter.hitElement)($buttons[0], event) || (0, _EventEmitter.hitElement)($buttons[1], event)) return;
    setTimeout(() => {
      if (modal.parentElement) {
        numInput.focus();
        numInput.select();
      }
    }, 50);
  });
  [numInput].concat($buttons).forEach((ctrElt, i, arr) => {
    ctrElt.on('keydown', event => {
      var nextElt;
      var key = (0, _keyboard.keyboardEventToKeyBindingIdent)(event);

      if (key === 'tab') {
        event.preventDefault();
        nextElt = arr[(i + 1) % arr.length];

        if (nextElt.$input) {
          nextElt.$input.focus();
          nextElt.$input.select();
        } else {
          nextElt.focus();
        }
      } else if (key === 'enter') {
        setTimeout(ok, 100);
      } else if (key === 'escape') {
        cancel();
      }
    });
  });
  setTimeout(() => {
    numInput.focus();
    numInput.select();
  }, 100);
}

var GoToCommand = {
  name: "goto",
  exec: openGoToDialog,
  bindKey: {
    win: "Ctrl-G",
    mac: 'Command-G'
  }
};
exports.GoToCommand = GoToCommand;
};

moduleFactories["node_modules/absol-brace/BraceExternal/FBraceEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/BraceExternal/FBraceEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BCore = _interopRequireDefault(require("../components/BCore"));

var _Dom = require("absol/src/HTML5/Dom");

var _goto = require("./ext/goto");


var ace = window.ace || {};
var aceEdit = ace && ace.edit;

ace.edit = function () {
  return newExtendedEditor({
    element: arguments[0]
  });
};

function newExtendedEditor(props) {
  var element = props.element;

  if (typeof element === "string") {
    element = _BCore.default.$(element) || _BCore.default.$('#' + element);
  }

  if (!element || !(0, _Dom.isDomNode)(element)) {
    throw new Error("Could not file element in options!");
  }

  var editor = aceEdit.apply(ace, [element]);
  Object.defineProperties(editor, Object.getOwnPropertyDescriptors(FBraceEditor.prototype));
  FBraceEditor.call(editor, props);
  return editor;
}

function FBraceEditor(props) {
  //do not new this class
  if (!this || !this.isFBraceEditor) return newExtendedEditor(props);
  this.setOptions(Object.assign({
    enableBasicAutocompletion: true,
    enableSnippets: true,
    enableLiveAutocompletion: false
  }, props.option));
  this.commands.addCommand(_goto.GoToCommand);
  this.container.addEventListener('keydown', event => {
    if (event.key === 'Alt') event.preventDefault();
  });
}

FBraceEditor.prototype.isFBraceEditor = true;

FBraceEditor.prototype.$onLineCountChange = function () {// console.log(this);
};

FBraceEditor.prototype.getLineCount = function () {
  var session = this.getSession();
  return session.$rowLengthCache.length;
};

var _default = FBraceEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-brace/BraceExternal/FEditSession.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/BraceExternal/FEditSession.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function FEditSession() {}

FEditSession.prototype.gutterRenderer = {
  getWidth: function (session, lastLineNumber, config) {
    return session.getLineCount().toString().length * config.characterWidth;
  },
  getText: function (session, row) {
    return row + 1;
  }
};

FEditSession.prototype.getLineCount = function () {
  return this.$rowLengthCache.length;
};

var _default = FEditSession;
exports.default = _default;
};

moduleFactories["node_modules/absol-brace/BraceExternal/FBrace.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/BraceExternal/FBrace.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./ace.css");

var _FBraceEditor = _interopRequireDefault(require("./FBraceEditor"));

var _FEditSession = _interopRequireDefault(require("./FEditSession"));


var ace = window.ace || {};
Object.defineProperties(ace.EditSession.prototype, Object.getOwnPropertyDescriptors(_FEditSession.default.prototype));
var _default = ace;
exports.default = _default;
};

moduleFactories["node_modules/absol-brace/components/Icons.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/components/Icons.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MdArrawLeftBold = MdArrawLeftBold;
exports.MdArrawRighttBold = MdArrawRighttBold;

var _BCore = _interopRequireDefault(require("./BCore"));


var _ = _BCore.default._;

function MdArrawLeftBold() {
  return _(`<svg width="24" height="24" viewBox="0 0 24 24">
        <path d="M20,9V15H12V19.84L4.16,12L12,4.16V9H20Z" />
    </svg>`);
}

_BCore.default.install('md-arraw-left-bold', MdArrawLeftBold);

function MdArrawRighttBold() {
  return _(`<svg width="24" height="24" viewBox="0 0 24 24">
        <path d="M4,15V9H12V4.16L19.84,12L12,19.84V15H4Z" />
    </svg>`);
}

_BCore.default.install('md-arraw-right-bold', MdArrawRighttBold);
};

moduleFactories["node_modules/absol-diff/struct/Segment.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-diff/struct/Segment.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/**
 * 
 * @param {Number} start 
 * @param {Number} end 
 */
function Segment(start, end) {
  if (!(this instanceof Segment)) return new Segment(start, end);
  if (!(start <= end)) throw new Error("Invalid range [" + start + ', ' + end + ']');
  this.start = start;
  this.end = end;
}
/**
 * @param {Segment} other
 * @returns {Boolean}
 */


Segment.prototype.isOverlap = function (other) {
  if (this.start > other.end) return false;
  if (this.end < other.start) return false;
  return true;
};
/**
 * @returns {Number}
 */


Segment.prototype.length = function () {
  return this.end - this.start;
};
/**
 * @param {Segment} other
 * @returns {Segment}
 */


Segment.prototype.merge = function (other) {
  return new Segment(Math.min(this.start, other.start), Math.max(this.end, other.end));
};
/**
 * @param {Segment} other
 * @returns {Segment}
 */


Segment.prototype.betweenSegment = function (other) {
  if (this.start >= other.end) return new Segment(other.end, this.start);
  if (this.end <= other.start) return new Segment(this.end, other.start);
  return null;
};
/**
 * @returns {Segment}
 */


Segment.prototype.clone = function () {
  return new Segment(this.start, this.end);
};

var _default = Segment;
exports.default = _default;
};

moduleFactories["node_modules/absol-diff/struct/Trapezium.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-diff/struct/Trapezium.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Segment = _interopRequireDefault(require("./Segment"));


/**
 * 
 * @param {Segment} left 
 * @param {Segment} right 
 */
function Trapezium(left, right, color) {
  if (!(this instanceof Trapezium)) return new Trapezium(left, right, color);
  this.left = left;
  this.right = right;
  this.color = color;
}
/**
 *  @param {Trapezium} other
 * @returns {Trapezium} 
 */


Trapezium.prototype.merge = function (other) {
  return new Trapezium(this.left.merge(other.left), this.right.merge(other.right), this.color);
};
/**
 *  @param {Trapezium} other
 * @returns {Boolean} 
 */


Trapezium.prototype.isOverlap = function (other) {
  return this.right.isOverlap(other.right) && this.left.isOverlap(other.left);
};
/**
 * @returns {Number}
 */


Trapezium.prototype.square = function () {
  return (this.right.length() + this.left.length()) / 2;
};

Trapezium.prototype.clone - function () {
  return new Trapezium(this.left.clone(), this.right.clone(), this.color);
};
var _default = Trapezium;
exports.default = _default;
};

moduleFactories["node_modules/absol-brace/BraceDiff/diffworker.js.txt"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/BraceDiff/diffworker.js.txt ***/
module.exports = "!function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&\"object\"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:t}),2&n&&\"string\"!=typeof t)for(var i in t)e.d(r,i,function(e){return t[e]}.bind(null,i));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=0)}([function(t,e,n){t.exports=n(1)},function(t,e,n){\"use strict\";function r(t){return(r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t})(t)}function i(){this._azar_extendEvents=this._azar_extendEvents||{supported:{},prioritize:{},nonprioritize:{}},this.__azar_force=\"object\"===(\"undefined\"==typeof Node?\"undefined\":r(Node))?!(this instanceof Node):!(this&&\"object\"===r(this)&&\"number\"==typeof this.nodeType&&\"string\"==typeof this.nodeName)}function o(t){f.call(this),this.detach(),t&&this.attach(t),this.__azarResolveCallbacks={}}function a(t,e){if(!(this instanceof a))return new a(t,e);if(!(t<=e))throw new Error(\"Invalid range [\"+t+\", \"+e+\"]\");this.start=t,this.end=e}function s(t){var e,n=new RegExp([\"(\",v.source,\"+)|(\",y.source,\")|(\",\".\",\")\"].join(\"\"),\"g\"),r=[];do{if(e=n.exec(t)){var i=0;e[1]&&(i=m),e[2]&&(i=_),e[3]&&(i=b),r.push({range:g(e.index,n.lastIndex),value:e[0],score:i+i*e[0].length/1e6})}}while(e);return r}function l(t){var e,n=0;if(0===t.length)return n;for(e=0;e<t.length;e++)n=(n<<5)-n+t.charCodeAt(e),n|=0;return n}function h(t,e){for(var n=Array(t.length+1).fill(null).map(function(){return Array(e.length+1).fill(0)}),r=0;r<t.length;++r)for(var i=0;i<e.length;++i)n[r+1][i+1]=c(n[r][i+1],n[r+1][i]),t[r].value==e[i].value&&(n[r+1][i+1]=c(n[r+1][i+1],n[r][i]+e[i].score));for(var o=[],a=(r=t.length,i=e.length,0);0<r&&0<i&&0!=n[r][i];){for(;n[r][i]==n[r][i-1];)--i;for(;n[r][i]==n[r-1][i];)--r;a+=t[r-1].score,o.push({lToken:t[r-1],rToken:e[i-1]}),--i,--r}return{subExtraMatched:o=o.reverse(),isExtraMatched:o.length==t.length&&o.length==e.length,score:a}}function u(t,e,n){return this instanceof u?(this.left=t,this.right=e,void(this.color=n)):new u(t,e,n)}var c=Math.max,p=(Math.ceil,Math.min);n.r(e),i.prototype.defineEvent=function(t){if(t instanceof Array)for(var e=0;e<t.length;++e)this._azar_extendEvents.supported[t[e]]=!0;else this._azar_extendEvents.supported[t]=!0;return this},i.prototype.isSupportedEvent=function(t){return this.__azar_force||!!this._azar_extendEvents.supported[t]},i.prototype.emit=function(){this.fire.apply(this,arguments)},i.prototype.fire=function(t,e){var n=Array.prototype.slice.call(arguments,1);if(this.isSupportedEvent(t)){var r;if(this._azar_extendEvents.prioritize[t]){r=this._azar_extendEvents.prioritize[t].slice();for(var i=0;i<r.length;++i)try{r[i].wrappedCallback.apply(this,n)}catch(t){console.error(t)}}if(this._azar_extendEvents.nonprioritize[t]){r=this._azar_extendEvents.nonprioritize[t].slice();for(i=0;i<r.length;++i)try{r[i].wrappedCallback.apply(this,n)}catch(t){console.error(t)}}}else{if(!this.dispatchEvent)throw new Error(\"Not support event \"+t);var o=new Event(t);e&&Object.assign(o,e),this.dispatchEvent(o)}return this},i.prototype.eventEmittorOnWithTime=function(t,e,n,i){if(\"object\"==r(e)){for(var o in e)this.eventEmittorOnWithTime(t,o,e[o]);return this}if(\"object\"==r(n))return this.eventEmittorOnWithTime(t,e,n.callback,n.cap);for(var a=this._azar_extendEvents[i?\"prioritize\":\"nonprioritize\"][e]||[],s=-1,l=0;l<a.length;++l)if(a[l].wrappedCallback==n){s=l;break}if(0>s){var h={isOnce:t,eventName:e,callback:n,cap:!!i};h.wrappedCallback=t?function(t){h.callback.call(this,t),this.off(h.eventName,h.wrappedCallback,h.cap)}:h.callback,this.isSupportedEvent(e)||(this.addEventListener?this.addEventListener(e,h.wrappedCallback,!!i):this.attachEvent(\"on\"+e,n,!!i)),a.push(h),this._azar_extendEvents[i?\"prioritize\":\"nonprioritize\"][e]=a}else console.warn(\"dupplicate event\");return this},i.prototype.on=function(t,e,n){return this.eventEmittorOnWithTime(!1,t,e,n),this},i.prototype.once=function(t,e,n){return this.eventEmittorOnWithTime(!0,t,e,n),this},i.prototype.off=function(t,e,n){if(\"object\"==r(t)){for(var i in t)this.off(i,t[i]);return this}if(\"object\"==r(e))return this.off(t,e.callback,e.cap);for(var o,a=this._azar_extendEvents[n?\"prioritize\":\"nonprioritize\"][t]||[],s=[],l=0;l<a.length;++l)(o=a[l]).wrappedCallback==e?this.isSupportedEvent(t)||(this.removeEventListener?this.removeEventListener(o.eventName,o.wrappedCallback,!!o.call):this.detachEvent(\"on\"+o.eventName,o.wrappedCallback,!!o.call)):s.push(o);return this._azar_extendEvents[n?\"prioritize\":\"nonprioritize\"][t]=s,this},i.isMouseRight=function(t){var e=!1;return\"which\"in t?e=3==t.which:\"button\"in t&&(e=2==t.button),e},i.hitElement=function(t,e){for(var n=e.target;n;){if(n==t)return!0;n=n.parentElement}return!1},i.copyEvent=function(t,e){var n={};for(var r in Object.assign(n,t),n)\"function\"==typeof n[r]&&(n[r]=n[r].bind(t));return e&&Object.assign(n,e),n},i.eventProperties=[\"altKey\",\"bubbles\",\"button\",\"buttons\",\"cancelBubble\",\"cancelable\",\"clientX\",\"clientY\",\"composed\",\"ctrlKey\",\"currentTarget\",\"defaultPrevented\",\"deltaMode\",\"deltaX\",\"deltaY\",\"deltaZ\",\"detail\",\"eventPhase\",\"explicitOriginalTarget\",\"isTrusted\",\"layerX\",\"layerY\",\"metaKey\",\"movementX\",\"movementY\",\"mozInputSource\",\"mozPressure\",\"offsetX\",\"offsetY\",\"originalTarget\",\"pageX\",\"pageY\",\"rangeOffset\",\"rangeParent\",\"region\",\"relatedTarget\",\"returnValue\",\"screenX\",\"screenY\",\"shiftKey\",\"srcElement\",\"target\",\"timeStamp\",\"type\",\"deltaMode\",\"deltaX\",\"deltaY\",\"deltaZ\"];var f=i,d=function(){var t=\"qwertyuiopasdfghjklzxcvbnm\";return((t+=t.toUpperCase())+\"_0123456789\").split(\"\")}();o.prototype.attach=function(t){this.host=t,this.host.addEventListener?this.host.addEventListener(\"message\",this.__azarMessageListener.bind(this),!1):this.host.attachEvent?this.host.attachEvent(\"onmessage\",this.__azarMessageListener.bind(this)):this.host.onmessage=this.__azarMessageListener.bind(this),this.__IFrameBridge_resolve()},o.prototype.detach=function(){this.sync=new Promise(function(t){this.__IFrameBridge_resolve=t}.bind(this))},o.fromIFrame=function(t){var e=t.contentWindow||t.contentDocument;if(e)return new o(e);var n=new o,r=function(){var e=t.contentWindow||t.contentDocument;n.attach(e)};return t.addEventListener?t.addEventListener(\"load\",r):t.attachEvent(\"onload\",r),n},o.getInstance=function(){return o.shareInstance||(o.shareInstance=new o(self)),o.shareInstance},Object.defineProperties(o.prototype,Object.getOwnPropertyDescriptors(f.prototype)),o.prototype.constructor=o,o.isInIFrame=function(){return top!==self},o.prototype.__azarMessageListener=function(t){this.__azarHandleData(t.data)},o.prototype.__azarHandleData=function(t){if(t.type)if(\"INVOKE\"==t.type){var e=this.__azarRelfInvoke(t.name,t.params);e&&\"function\"==typeof e.then?e.then(function(e){this.__azarResolve(t.taskId,e)}.bind(this)):this.__azarResolve(t.taskId,e)}else\"INVOKE_RESULT\"==t.type?this.__azarResolveCallbacks[t.taskId]&&(this.__azarResolveCallbacks[t.taskId](t.result),delete this.__azarResolveCallbacks[t.taskId]):\"EMIT\"==t.type?this.fire.apply(this,t.params):this.fire(\"message\",t,this)},o.prototype.__azarResolve=function(t,e){this.host.postMessage({type:\"INVOKE_RESULT\",taskId:t,result:e})},o.prototype.__azarRelfInvoke=function(t,e){return\"function\"==typeof this[t]?this[t].apply(this,e):this[t]},o.prototype.emit=function(){var t=[];return t.push.apply(t,arguments),this.sync.then(function(){this.host.postMessage({type:\"EMIT\",params:t})}.bind(this)),this},o.prototype.invoke=function(t){var e=[];return e.push.apply(e,arguments),e.shift(),this.sync.then(function(){var n=function(t){0<t||(t=4);var e=d;return[e[Math.random()*(e.length-10)>>0]].concat(Array(t-1).fill(\"\").map(function(){return e[Math.random()*e.length>>0]})).join(\"\")}(32);return this.host.postMessage({type:\"INVOKE\",params:e,taskId:n,name:t}),new Promise(function(t){this.__azarResolveCallbacks[n]=t}.bind(this))}.bind(this))},a.prototype.isOverlap=function(t){return!(this.start>t.end||this.end<t.start)},a.prototype.length=function(){return this.end-this.start},a.prototype.merge=function(t){return new a(p(this.start,t.start),c(this.end,t.end))},a.prototype.betweenSegment=function(t){return this.start>=t.end?new a(t.end,this.start):this.end<=t.start?new a(this.end,t.start):null},a.prototype.clone=function(){return new a(this.start,this.end)};var g=a,v=/[\\_a-zA-Z0-9àáạảãâầấậẩẫăằắặẳẵÀÁẠẢÃÂẦẤẬẨẪĂẰẮẶẲẴèéẹẻẽêềếệểễÈÉẸẺẼÊỀẾỆỂỄìíịỉĩÌÍỊỈĨòóọỏõôồốộổỗơờớợởỡÒÓỌỎÕÔỒỐỘỔỖƠỜỚỢỞỠùúụủũưừứựửữÙÚỤỦŨƯỪỨỰỬỮỳýỵỷỹỲÝỴỶỸđĐ\\u0300\\u0301\\u0303\\u0309\\u0323\\u02C6\\u0306\\u031B]/,y=/\\s+/,m=1,b=.99,_=.01;u.prototype.merge=function(t){return new u(this.left.merge(t.left),this.right.merge(t.right),this.color)},u.prototype.isOverlap=function(t){return this.right.isOverlap(t.right)&&this.left.isOverlap(t.left)},u.prototype.square=function(){return(this.right.length()+this.left.length())/2},u.prototype.clone;var E=u,z=1,w=-1,k=o.getInstance();k.diffByLine=function(t,e){return function(t,e){function n(t,e){for(var n=0,r=0;r<t.length;++r)0<t[r].trim().length&&++n;return{index:e,text:t,value:l(t),score:0==n?.01:1+n/1e6}}var r=t.split(/\\r?\\n/),i=e.split(/\\r?\\n/),o={lLines:r,rLines:i},a=r.map(n),s=i.map(n),u=h(a,s).subExtraMatched.reduce(function(t,e){var n=t[t.length-1],r=E(g(e.lToken.index,e.lToken.index+1),g(e.rToken.index,e.rToken.index+1),z);if(n.isOverlap(r))n=n.merge(r),t[t.length-1]=n;else{var i=r.left.betweenSegment(n.left),o=r.right.betweenSegment(n.right);0<(n=E(i,o,w)).square()&&t.push(n),t.push(r)}return t},[E(g(0,0),g(0,0),z)]),c=u[u.length-1];return(c.left.end<a.length||c.right.end<s.length)&&u.push(E(g(c.left.end,a.length),g(c.right.end,s.length),w)),u=u.filter(function(t){return 0<t.square()}),o.trapeziumes=u,o}(t,e)},k.diffByWord=function(t,e){return function(t,e){if(t==e)return[E(g(0,t.length),g(0,e.length),z)];var n=h(s(t),s(e)).subExtraMatched.reduce(function(t,e){var n=t.last,r=n.left.betweenSegment(e.lToken.range),i=n.right.betweenSegment(e.rToken.range),o=new E(r,i);return 0<o.square()&&(o.color=w,t.result.push(o)),(o=new E(e.lToken.range,e.rToken.range)).color=z,t.result.push(o),t.last=o,t},{result:[],last:E(g(0,0),g(0,0))}),r=g(n.last.left.end,t.length),i=g(n.last.right.end,e.length),o=new E(r,i);return o.color=w,n.result.push(o),n.result.filter(function(t){return 0<t.square()}).reduce(function(n,r){if(r.color==z)n.push(r);else{var i,o=t.substring(r.left.start,r.left.end),a=e.substring(r.right.start,r.right.end),s=function(t,e){for(var n=0,r=0,i=0;r<t.length&&i<e.length&&t[r]==e[i];)++n,++r,++i;return n}(o,a),l=function(t,e){for(var n=0,r=t.length,i=e.length;0<r&&0<i&&(--i,t[--r]==e[i]);)++n;return n}(o,a);s+l<p(o.length,a.length)?(0<s&&((i=E(g(r.left.start,r.left.start+s),g(r.right.start,r.right.start+s))).color=z,n.push(i)),(i=E(g(r.left.start+s,r.left.end-l),g(r.right.start+s,r.right.end-l))).color=w,n.push(i),0<l&&((i=E(g(r.left.end-l,r.left.end),g(r.right.end-l,r.right.end))).color=z,n.push(i))):l>s?((i=E(g(r.left.start,r.left.end-l),g(r.right.start,r.right.end-l))).color=w,n.push(i),(i=E(g(r.left.end-l,r.left.end),g(r.right.end-l,r.right.end))).color=z,n.push(i)):(0<s&&((i=E(g(r.left.start,r.left.start+s),g(r.right.start,r.right.start+s))).color=z,n.push(i)),(i=E(g(r.left.start+s,r.left.end),g(r.right.start+s,r.right.end))).color=w,n.push(i))}return n},[]).reduce(function(t,e){if(0==t.length)return t.push(e),t;var n=t[t.length-1];if(n.color==e.color){var r=n.merge(e);r.color=n.color,t[t.length-1]=r}else t.push(e);return t},[])}(t,e)}}]);";

};

moduleFactories["node_modules/absol-brace/BraceDiff/BraceDiff.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/BraceDiff/BraceDiff.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FBrace = _interopRequireDefault(require("../BraceExternal/FBrace"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _BCore = _interopRequireDefault(require("../components/BCore"));

var _stringGenerate = require("absol/src/String/stringGenerate");

require("./diff.css");

require("../components/Icons");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Trapezium = _interopRequireDefault(require("absol-diff/struct/Trapezium"));

var _IFrameBridge = _interopRequireDefault(require("absol/src/Network/IFrameBridge"));

var _diffworkerJs = _interopRequireDefault(require("./diffworker.js.txt"));


const Range = _FBrace.default && _FBrace.default.acequire('ace/range').Range;

var $ = _BCore.default.$;
var _ = _BCore.default._;
/**
 * @typedef {Object} BraceDiffOption
 * @property {String} element selector query | HTML element
 * @property {BraceDiffOptionLeft} left
 * @property {BraceDiffOptionLeft} right
 * @property {IFrameBridge} diffWorker
 *  
 * 
 *  
 * @param {BraceDiffOption} props 
 */

function BraceDiff(props) {
  if (!(this instanceof BraceDiff)) return new BraceDiff(props);

  _EventEmitter.default.call(this);

  this.ready = false;
  this.props = props;
  this.props.left = this.props.left || {};
  this.props.right = this.props.right || {};
  this.editorLeft = null;
  this.editorRight = null;
  this.$element = null;
  this.diffWorker = props.diffWorker;

  if (!this.diffWorker) {
    var workerUrl = (URL || webkitURL).createObjectURL(new Blob([_diffworkerJs.default], {
      type: 'application/javascript'
    }));
    this.diffWorker = new _IFrameBridge.default(new Worker(workerUrl));
  }

  this.lastFocusEditor = null;
  this._changeTimeOut = false;

  this._attachedTo(props.element);
}

Object.defineProperties(BraceDiff.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
BraceDiff.prototype.constructor = BraceDiff;

BraceDiff.prototype._attachedTo = function (elt) {
  if (typeof elt == 'string') {
    elt = $(elt);

    if (elt) {
      this.edit(elt);
    } else {
      throw new Error('Can not find ' + elt);
    }
  } else if (_Dom.default.isDomNode(elt)) {
    $(elt);
    this.edit(elt);
  } else throw new Error('Invalid element');
};
/**
 * @param {Element} element
 */


BraceDiff.prototype.edit = function (element) {
  this.$element = element.addClass('brace-diff');

  this.$element.updateSize = function () {
    this.updateForegroundSize();
    this.updateGap(this);
  }.bind(this);

  _Dom.default.addToResizeSystem(this.$element);

  this.$leftPreCtn = _('.brace-diff-left-container').addTo(this.$element);
  this.$rightPreCtn = _('.brace-diff-right-container').addTo(this.$element);
  this.$middleToolCtn = _('.brace-diff-middle-tool-container').addTo(this.$element);
  this.$middleTool = _('.brace-diff-middle-tool').addTo(this.$middleToolCtn);
  this._leftPreId = (0, _stringGenerate.randomIdent)(20);
  this._rightPreId = (0, _stringGenerate.randomIdent)(20);
  this.$leftPre = _('pre.brace-diff-left#' + this._leftPreId).addTo(this.$leftPreCtn);
  this.$rightPre = _('pre.brace-diff-left#' + this._rightPreId).addTo(this.$rightPreCtn);
  this.editorLeft = _FBrace.default.edit(this.$leftPre);
  this.editorRight = _FBrace.default.edit(this.$rightPre);
  this.$foreGround = _('.brace-diff-foreground').addTo(this.$element);
  this.$canvas = _('svg').addTo(this.$foreGround);
  this.$poolGap = [];
  this.$activeGaps = [];
  this.$poolLeftArrowBtn = [];
  this.$poolRightArrowBtn = [];
  this.$activePickLeftBtn = [];
  this.$activePickRightBtn = [];
  this.updateForegroundSize();

  this._setupEditors();

  this.ready = true;
  this.emit('ready', {
    target: this
  }, this);
  return this;
};

BraceDiff.prototype._setupEditors = function () {
  var self = this;
  this.editorLeft.setOptions(Object.assign({}, this.props.option, this.props.left.option));
  this.editorRight.setOptions(Object.assign({}, this.props.option, this.props.right.option));
  this.editorLeft.$blockScrolling = Infinity;
  this.editorRight.$blockScrolling = Infinity;
  this.editorLeft.on('change', this.handleChange.bind(this));
  this.editorRight.on('change', this.handleChange.bind(this));

  if (this.props.left.value) {
    this.editorLeft.setValue(this.props.left.value, true);
  }

  if (this.props.right.value) {
    this.editorRight.setValue(this.props.right.value, true);
  }

  this.editorLeft.getSession().on('changeScrollTop', function (scroll) {
    self.updateGap();
  });
  this.editorRight.getSession().on('changeScrollTop', function (scroll) {
    self.updateGap();
  });
  this.editorLeft.on('focus', function (data) {
    self.lastFocusEditor = self.editorLeft;
  });
  this.editorRight.on('focus', function (data) {
    self.lastFocusEditor = self.editorRight;
  });
  if (this.props.right.focus) this.editorRight.focus();else this.editorLeft.focus();
};

BraceDiff.prototype.updateForegroundSize = function () {
  var bound = this.$foreGround.getBoundingClientRect();
  this.$canvas.attr({
    width: bound.width + 'px',
    height: bound.height + 'px'
  });
};
/**
 * @param {Trapeziume} trapeziume
 */


BraceDiff.prototype.pickLeft = function (trapeziume) {
  if (!this.diffData) return; //todo

  var newTextLines = this.diffData.lLines.slice(trapeziume.left.start, trapeziume.left.end);

  if (newTextLines.length == 0) {
    var removeRange;

    if (trapeziume.right.end >= this.diffData.rLines.length) {
      //remove to end
      removeRange = new Range(trapeziume.right.start - 1, Number.MAX_VALUE, trapeziume.right.end, 0);
    } else {
      removeRange = new Range(trapeziume.right.start, 0, trapeziume.right.end, 0);
    }

    this.editorRight.getSession().remove(removeRange);
  } else {
    var newText = newTextLines.join('\n');
    var replaceRange = new Range(trapeziume.right.start, 0, trapeziume.right.end - 1, Number.MAX_VALUE);

    if (trapeziume.right.start >= this.diffData.rLines.length) {
      newText = '\n' + newText; //newLine
    } else if (newText.length == 0 && trapeziume.right.start == trapeziume.right.end) {
      replaceRange = new Range(trapeziume.right.start, 0, trapeziume.right.end, 0);
      newText = '\n';
    }

    this.editorRight.getSession().replace(replaceRange, newText);
  }
};
/**
 * @param {Trapeziume} trapeziume
 */


BraceDiff.prototype.pickRight = function (trapeziume) {
  if (!this.diffData) return; //todo

  var newTextLines = this.diffData.rLines.slice(trapeziume.right.start, trapeziume.right.end);

  if (newTextLines.length == 0) {
    var removeRange;

    if (trapeziume.left.end >= this.diffData.lLines.length) {
      //remove to end
      removeRange = new Range(trapeziume.left.start - 1, Number.MAX_VALUE, trapeziume.left.end, 0);
    } else {
      removeRange = new Range(trapeziume.left.start, 0, trapeziume.left.end, 0);
    }

    this.editorLeft.getSession().remove(removeRange);
  } else {
    var replaceRange = new Range(trapeziume.left.start, 0, trapeziume.left.end - 1, Number.MAX_VALUE);
    var newText = newTextLines.join('\n');

    if (trapeziume.left.start >= this.diffData.lLines.length) {
      newText = '\n' + newText; //newLine
    } else if (newText.length == 0 && trapeziume.left.start == trapeziume.left.end) {
      replaceRange = new Range(trapeziume.left.start, 0, trapeziume.left.end, 0);
      newText = '\n';
    }

    this.editorLeft.getSession().replace(replaceRange, newText);
  }
};

BraceDiff.prototype.updateDiffLine = function (diffData) {
  this.diffData = diffData;
  this.iniGap();
  this.updateGap();
};

BraceDiff.prototype.getCurrentTrapeziume = function () {
  if (!this.diffData) return;
  var cursorLeftPos = this.editorLeft.getCursorPosition();
  var cursorRightPos = this.editorRight.getCursorPosition();
  var trapeziumes = this.diffData.trapeziumes;
  var trapeziume = null; // if (this.lastFocusEditor == this.editorRight) {
  //     for (var i = 0; i < trapeziumes.length; ++i) {
  //         if (trapeziume.right.start >= ){
  //         }
  //     }
  // }
  // else {
  // }

  return trapeziume;
};

BraceDiff.prototype._createLeftArrowBtn = function () {
  return _({
    tag: 'button',
    class: ['brace-diff-arrow', 'pick-right'],
    child: 'md-arraw-left-bold'
  });
};

BraceDiff.prototype._createRightArrowBtn = function () {
  return _({
    tag: 'button',
    class: ['brace-diff-arrow', 'pick-left'],
    child: 'md-arraw-right-bold'
  });
};

BraceDiff.prototype.iniGap = function () {
  if (!this.diffData) return;
  var diffData = this.diffData;
  var self = this;
  this.$activeGaps.forEach(function (elt) {
    elt.remove();
    self.$poolGap.push(elt);
  });
  this.$activePickLeftBtn.forEach(function (elt) {
    elt.remove();
    self.$poolLeftArrowBtn.push(elt);
  });
  this.$activePickRightBtn.forEach(function (elt) {
    elt.remove();
    self.$poolRightArrowBtn.push(elt);
  });
  this.$activeGaps = [];
  this.$activePickLeftBtn = [];
  this.$activePickRightBtn = [];
  diffData.trapeziumes.forEach(function (trp, i, trapeziumes) {
    if (trp.color == -1) {
      var $gap;

      if (self.$poolGap.length > 0) {
        $gap = self.$poolGap.pop();
      } else {
        $gap = _('shape.brace-diff-gap');
      }

      $gap.addTo(self.$canvas);
      self.$activeGaps.push($gap);
      trp.$gap = $gap; //left

      var $pickLeftBtn;
      var $pickRightBtn;

      if (self.$poolLeftArrowBtn.length > 0) {
        $pickLeftBtn = self.$poolLeftArrowBtn.pop();
      } else {
        $pickLeftBtn = self._createRightArrowBtn();
      }

      $pickLeftBtn.addTo(self.$middleTool);
      self.$activePickLeftBtn.push($pickLeftBtn);
      trp.$pickLeftBtn = $pickLeftBtn;

      $pickLeftBtn.onclick = function () {
        self.pickLeft(trp);
        $gap.remove();
        $pickLeftBtn.remove();
        $pickRightBtn.remove();
      }; //right


      if (self.$poolRightArrowBtn.length > 0) {
        $pickRightBtn = self.$poolRightArrowBtn.pop();
      } else {
        $pickRightBtn = self._createLeftArrowBtn();
      }

      $pickRightBtn.addTo(self.$middleTool);
      self.$activePickRightBtn.push($pickRightBtn);
      trp.$pickRightBtn = $pickRightBtn;

      $pickRightBtn.onclick = function () {
        self.pickRight(trp);
        $gap.remove();
        $pickLeftBtn.remove();
        $pickRightBtn.remove();
      };
    }
  });
};

BraceDiff.prototype.updateGap = function () {
  //donothing
  if (!this.diffData) return;
  var diffData = this.diffData;
  var self = this;
  var leftScrollTop = self.editorLeft.renderer.scrollTop;
  var rightScrollTop = self.editorRight.renderer.scrollTop;
  var lineHeight = this.editorLeft.renderer.lineHeight;
  var bound = this.$foreGround.getBoundingClientRect();
  var diffWidth = bound.width;
  var editorWidth = this.$leftPre.getBoundingClientRect().width;
  var editorDist = diffWidth - 2 * editorWidth;
  diffData.trapeziumes.forEach(function (trp) {
    if (trp.$gap) {
      trp.$gap.begin().moveTo(0, -leftScrollTop + trp.left.start * lineHeight).lineTo(editorWidth, -leftScrollTop + trp.left.start * lineHeight).curveTo(diffWidth - editorWidth, -rightScrollTop + trp.right.start * lineHeight, editorWidth + editorDist / 2, -leftScrollTop + trp.left.start * lineHeight, diffWidth - editorWidth - editorDist / 2, -rightScrollTop + trp.right.start * lineHeight).lineTo(diffWidth, -rightScrollTop + trp.right.start * lineHeight).lineTo(diffWidth, -rightScrollTop + trp.right.end * lineHeight).lineTo(diffWidth - editorWidth, -rightScrollTop + trp.right.end * lineHeight).curveTo(editorWidth, -leftScrollTop + trp.left.end * lineHeight, diffWidth - editorWidth - editorDist / 2, -rightScrollTop + trp.right.end * lineHeight, editorWidth + editorDist / 2, -leftScrollTop + trp.left.end * lineHeight).lineTo(0, -leftScrollTop + trp.left.end * lineHeight).closePath().end();
      trp.$pickLeftBtn.addStyle('top', (-leftScrollTop + trp.left.start * lineHeight + (-leftScrollTop + trp.left.end * lineHeight)) / 2 - 7 + 'px');
      trp.$pickRightBtn.addStyle('top', (-rightScrollTop + trp.right.start * lineHeight + (-rightScrollTop + trp.right.end * lineHeight)) / 2 - 7 + 'px');
    }
  });
};

BraceDiff.prototype.handleChange = function () {
  if (this._changeTimeOut) {
    clearTimeout(this._changeTimeOut);
  }

  var self = this;
  this._changeTimeOut = setTimeout(function () {
    var currentSession = Math.random();
    self._workSession = currentSession;
    if (self._inWorking) return;
    self._inWorking = true;
    self._changeTimeOut = false;
    var leftData = self.editorLeft.getValue();
    var rightData = self.editorRight.getValue();
    self.diffWorker.invoke('diffByLine', leftData, rightData).then(function (result) {
      self.updateDiffLine(result);
      self._inWorking = false;
      if (currentSession != self._workSession) self.handleChange();
    });
  }, 5);
};

BraceDiff.prototype.getEditors = function () {
  return [this.editorLeft, this.editorRight];
};

BraceDiff.prototype.destroy = function () {
  this.editorLeft.destroy();
  this.editorRight.destroy();
  this.destroyed = true;
};

var _default = BraceDiff;
exports.default = _default;
};

moduleFactories["node_modules/absol-brace/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FBrace = _interopRequireDefault(require("./BraceExternal/FBrace"));

var _BCore = _interopRequireDefault(require("./components/BCore"));

var _BraceDiff = _interopRequireDefault(require("./BraceDiff/BraceDiff"));

var _FBraceEditor = _interopRequireDefault(require("./BraceExternal/FBraceEditor"));


var AbsolBrace = {
  core: _BCore.default,
  ace: _FBrace.default,
  BraceDiff: _BraceDiff.default,
  BraceEditor: _FBraceEditor.default
};
var _default = AbsolBrace;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/CodeEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/CodeEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _absolBrace = _interopRequireDefault(require("absol-brace"));

require("../../css/codeeditor.css");


var _ = _FCore.default._;
var $ = _FCore.default.$;

function CodeEditor() {
  _BaseEditor.default.call(this);

  this.aceEditor = null;
  this._openningData = {
    type: 'txt',
    value: ''
  };
}

Object.defineProperties(CodeEditor.prototype, Object.getOwnPropertyDescriptors(_BaseEditor.default.prototype));
CodeEditor.prototype.constructor = CodeEditor;
CodeEditor.prototype.TYPE_MODE = {
  js: 'ace/mode/javascript',
  txt: 'ace/mode/plain_text',
  json: 'ace/mode/json',
  md: 'ace/mode/markdown',
  html: 'ace/mode/html',
  css: 'ace/mode/css',
  LICENSE: 'ace/mode/plain_text'
};

CodeEditor.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = _({
    tag: 'pre',
    class: 'as-code-editor'
  });
  this.aceEditor = _absolBrace.default.ace.edit(this.$view);
  return this.$view;
};
/**
 * @param {{type:String, value: String}} data
 */


CodeEditor.prototype.setData = function (data) {
  this._openningData = data;
  this.aceEditor.setValue(data.value);
  this.aceEditor.setOption('mode', this.TYPE_MODE[data.type] || this.TYPE_MODE.txt);
  this.aceEditor.setOptions({
    enableBasicAutocompletion: true,
    enableSnippets: true
  });
};

CodeEditor.prototype.getData = function () {
  var value = this.aceEditor.getValue();
  return Object.assign({}, this._openningData, {
    value: value
  });
};

var _default = CodeEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/cmds/FormEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/cmds/FormEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/**
 * @type {FMLauncher|*}
 */
var FormEditorCmd = {};

FormEditorCmd.closeAll = function () {
  var holder;
  var sync = Promise.resolve();
  var tabview = this.$mainTabview;

  for (var key in this.editorHolders) {
    holder = this.editorHolders[key];
    sync = sync.then(tabview.removeTab.bind(tabview, holder.tabframe.attr('id')));
  }

  ;
  return sync;
};

FormEditorCmd.closeSaved = function () {
  var holder;
  var sync = Promise.resolve();
  var tabview = this.$mainTabview;

  for (var key in this.editorHolders) {
    holder = this.editorHolders[key];
    if (!holder.tabframe.modified) sync = sync.then(tabview.removeTab.bind(tabview, holder.tabframe.attr('id')));
  }

  ;
  return sync;
};

FormEditorCmd.saveAllNClose = function () {
  var holder;
  var sync = Promise.resolve();
  var tabview = this.$mainTabview;
  var savePromise;

  for (var key in this.editorHolders) {
    holder = this.editorHolders[key];

    if (holder.tabframe.modified) {
      try {
        savePromise = holder.editor.execCmd('save');
        if (!savePromise || !savePromise.then) savePromise = Promise.resolve(savePromise);
      } catch (error) {
        savePromise = Promise.resolve();
      }
    } else savePromise = Promise.resolve();

    sync = Promise.all([sync, savePromise]).then(tabview.removeTab.bind(tabview, holder.tabframe.attr('id')));
  }

  ;
  return sync;
};

var _default = FormEditorCmd;
exports.default = _default;
};

moduleFactories["node_modules/absol-photoswipeviewer/PhotoSwipeFrag.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-photoswipeviewer/PhotoSwipeFrag.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./photoswipefrag.css");

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _absolAcomp = _interopRequireDefault(require("absol-acomp"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));


var _ = _absolAcomp.default._;
var $ = _absolAcomp.default.$;
/**
 * @typedef {Object}PSPhotoItem
 * @property {String} title
 * @property {String} src
 * @property {String} previewSrc
 * @property {Number} naturalWidth
 * @property {Number} naturalHeight
 * @property {Image} $image
 * @property {Promise} sync
 * @property {Number} scale
 * 
 */

function PhotoSwipeFrag() {
  _Fragment.default.call(this);
  /**
   * @type {PhotoSwipeFragItem}
   */


  this.currentPhotoItem = null;
  /**
   * @type {Array<PhotoSwipeFragItem>}
   */

  this.photoItems = [];
  this.sync = Promise.resolve();
  this.mode = -1;
  this.snap = -1; // this.ev_pan_mousefinish = this.ev_pan_mousefinish.bind(this);
  // this.ev_pan_mousemove = this.ev_pan_mousemove.bind(this);
  // this._mouseData = null;
}

Object.defineProperties(PhotoSwipeFrag.prototype, Object.getOwnPropertyDescriptors(_Fragment.default.prototype));
PhotoSwipeFrag.prototype.constructor = PhotoSwipeFrag;
PhotoSwipeFrag.prototype.SNAP_FIX_SIZE = 'SNAP_FIX_SIZE';
PhotoSwipeFrag.prototype.SNAP_ORIGIN_SIZE = 'SNAP_ORIGIN_SIZE';
PhotoSwipeFrag.prototype.MODE_PAN = 3;
PhotoSwipeFrag.prototype.MODE_ZOOM_IN = 4;
PhotoSwipeFrag.prototype.MODE_ZOOM_OUT = 5;
PhotoSwipeFrag.prototype.topbarBtnNames = ['download', 'fixsize', 'originsize', 'pan_tool', 'zoom_in', 'zoom_out'];
PhotoSwipeFrag.prototype.topbarDescriptors = {
  download: {
    cmd: 'download',
    title: 'Tải về',
    mticon: 'file_download'
  },
  fixsize: {
    mticon: 'fullscreen',
    title: 'Vừa màn hình',
    cmd: 'showFixSize'
  },
  originsize: {
    mticon: 'fullscreen_exit',
    title: 'Kích thước dốc',
    cmd: 'showOriginSize'
  },
  pan_tool: {
    mticon: 'pan_tool',
    title: 'Di chuyển',
    cmd: 'panTool'
  },
  zoom_in: {
    mticon: 'zoom_in',
    title: 'Phóng to',
    cmd: 'zoomInTool'
  },
  zoom_out: {
    mticon: 'zoom_out',
    title: 'Thu nhỏ',
    cmd: 'zoomOutTool'
  }
};

PhotoSwipeFrag.prototype.getView = function () {
  var self = this;
  if (this.$view) return this.$view;
  this.$view = _({
    class: 'ptswpf',
    child: [{
      tag: 'button',
      class: ['ptswpf-to-prev-image'],
      child: {
        tag: 'i',
        child: {
          text: 'keyboard_arrow_left'
        },
        class: 'material-icons'
      },
      on: {
        click: this.prev.bind(this)
      }
    }, {
      tag: 'button',
      class: ['ptswpf-to-next-image'],
      child: {
        tag: 'i',
        child: {
          text: 'keyboard_arrow_right'
        },
        class: 'material-icons'
      },
      on: {
        click: this.next.bind(this)
      }
    }, {
      class: 'ptswpf-top-bar',
      child: this.topbarBtnNames.map(function (name) {
        return {
          tag: 'button',
          class: 'ptswpf-action-' + name,
          props: {
            title: self.topbarDescriptors[name].title
          },
          on: {
            click: self[self.topbarDescriptors[name].cmd || 'noop'].bind(self)
          },
          child: {
            tag: 'i',
            child: {
              text: self.topbarDescriptors[name].mticon
            },
            class: 'material-icons'
          }
        };
      })
    }, '<a class="ptswpf-download-trigger" href="#" download target="_blank"></a>' // {
    //     class: 'ptswpf-image-ctn',
    //     child: {
    //         tag: 'img',
    //         class: 'ptswpf-image'
    //     },
    // }
    ]
  });
  this.$attachhook = _('attachhook').addTo(this.$view).on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
  });
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$downloadTrigger = $('.ptswpf-download-trigger', this.$view); // this.$view.on('mousedown', this.ev_mousedown);

  if (this.mode == -1) this.panTool();
  return this.$view;
};
/**
 * @param {PSPhotoItem} item
 */


PhotoSwipeFrag.prototype.push = function (item) {
  if (typeof item == 'string') {
    item = {
      src: item
    };
  }

  var newItem = new PhotoSwipeFragItem(this, item);
  this.photoItems.push(newItem);
  if (!this.currentPhotoItem) this.setCurrentItem(newItem);

  if (this.photoItems.length > 1) {
    this.$view.addClass('ptswpf-multi-image');
  }
};
/**
 * @param {String} src
 * @returns {PSPhotoItem}
 */


PhotoSwipeFrag.prototype.findItem = function (src) {
  for (var i = 0; i < this.photoItems.length; ++i) {
    if (this.photoItems[i].src == src) return this.photoItems[i];
  }

  return null;
};

PhotoSwipeFrag.prototype.noop = function () {};
/**
 * @param {PhotoSwipeFragItem} item
 */


PhotoSwipeFrag.prototype.setCurrentItem = function (item) {
  if (typeof item == 'string') {
    item = {
      src: item
    };
  }

  if (this.currentPhotoItem == item) return;

  if (this.currentPhotoItem) {
    this.currentPhotoItem.beginAnimateTimeout();
    this.currentPhotoItem.moveToLeft();
  }
  /**
   * @type {}
   */


  item = this.findItem(item.src) || new PhotoSwipeFragItem(this, item);
  item.load().then(item.autoSize.bind(item));
  this.currentPhotoItem = item;
  item.mode = this.mode;
};

PhotoSwipeFrag.prototype.showFixSize = function () {
  if (this.currentPhotoItem) {
    this.currentPhotoItem.beginAnimateTimeout();
    this.currentPhotoItem.fixSize();
  }
};

PhotoSwipeFrag.prototype.showOriginSize = function () {
  if (this.currentPhotoItem) {
    this.currentPhotoItem.beginAnimateTimeout();
    this.currentPhotoItem.originSize();
  }
};

PhotoSwipeFrag.prototype.download = function () {
  if (this.currentPhotoItem) {
    this.$downloadTrigger.href = this.currentPhotoItem.src;
    this.$downloadTrigger.click();
  }
};

PhotoSwipeFrag.prototype.updateSize = function () {
  var item = this.currentPhotoItem;
  if (!item) return;
};

PhotoSwipeFrag.prototype.panTool = function () {
  this.$view.addClass('ptswpf-mode-pan').removeClass('ptswpf-mode-zoom-in').removeClass('ptswpf-mode-zoom-out');
  this.mode = this.MODE_PAN;
  if (this.currentPhotoItem) this.currentPhotoItem.panTool();
};

PhotoSwipeFrag.prototype.zoomInTool = function () {
  this.$view.removeClass('ptswpf-mode-pan').addClass('ptswpf-mode-zoom-in').removeClass('ptswpf-mode-zoom-out');
  this.mode = this.MODE_ZOOM_IN;
  this.currentPhotoItem.zoomInTool();
};

PhotoSwipeFrag.prototype.zoomOutTool = function () {
  this.$view.removeClass('ptswpf-mode-pan').addClass('ptswpf-mode-zoom-out').removeClass('ptswpf-mode-zoom-in');
  this.mode = this.MODE_ZOOM_OUT;
  this.currentPhotoItem.zoomOutTool();
};

PhotoSwipeFrag.prototype.next = function () {
  var currentItem = this.currentPhotoItem;
  var currentItemIndex = this.photoItems.indexOf(currentItem);
  var nextItemIndex = (currentItemIndex + 1) % this.photoItems.length;
  var nextItem = this.photoItems[nextItemIndex];
  if (nextItem == currentItem) return;
  currentItem.beginAnimateTimeout();
  currentItem.autoSize();
  currentItem.moveToLeft();
  nextItem.load();
  nextItem.$image.addStyle('opacity', '0');
  nextItem.moveToRight();
  nextItem.beginAnimateTimeout();
  nextItem.moveToCenter();
  nextItem.sync.then(function () {
    nextItem.beginAnimateTimeout();
    nextItem.autoSize();
    nextItem.$image.removeStyle('opacity');
  });
  this.currentPhotoItem = nextItem;
};

PhotoSwipeFrag.prototype.prev = function () {
  var currentItem = this.currentPhotoItem;
  var currentItemIndex = this.photoItems.indexOf(currentItem);
  var prevItemIndex = (currentItemIndex + this.photoItems.length - 1) % this.photoItems.length;
  var prevItem = this.photoItems[prevItemIndex];
  if (prevItem == currentItem) return;
  currentItem.beginAnimateTimeout();
  currentItem.autoSize();
  currentItem.moveToRight();
  prevItem.load();
  prevItem.$image.addStyle('opacity', '0');
  prevItem.moveToLeft();
  prevItem.beginAnimateTimeout();
  prevItem.moveToCenter();
  prevItem.sync.then(function () {
    prevItem.beginAnimateTimeout();
    prevItem.autoSize();
    prevItem.$image.removeStyle('opacity');
  });
  this.currentPhotoItem = prevItem;
};

var loadingUrl = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHN0eWxlPSJtYXJnaW46IGF1dG87ICBkaXNwbGF5OiBibG9jazsgc2hhcGUtcmVuZGVyaW5nOiBhdXRvOyIgd2lkdGg9IjIwMHB4IiBoZWlnaHQ9IjIwMHB4IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUwIDUwKSI+ICA8ZyB0cmFuc2Zvcm09InNjYWxlKDAuNykiPiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTAgLTUwKSI+ICAgICAgPGcgdHJhbnNmb3JtPSJyb3RhdGUoMTI3LjU2MiA1MCA1MCkiPiAgICAgICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIiBkdXI9IjAuNzU3NTc1NzU3NTc1NzU3NnMiPjwvYW5pbWF0ZVRyYW5zZm9ybT4gICAgICAgIDxwYXRoIGZpbGwtb3BhY2l0eT0iMC44IiBmaWxsPSIjZTE1YjY0IiBkPSJNNTAgNTBMNTAgMEE1MCA1MCAwIDAgMSAxMDAgNTBaIj48L3BhdGg+ICAgICAgPC9nPiAgICAgIDxnIHRyYW5zZm9ybT0icm90YXRlKDk1LjY2ODQgNTAgNTApIj4gICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0icm90YXRlIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxLjAxMDEwMTAxMDEwMTAxMDJzIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICAgICAgICA8cGF0aCBmaWxsLW9wYWNpdHk9IjAuOCIgZmlsbD0iI2Y0N2U2MCIgZD0iTTUwIDUwTDUwIDBBNTAgNTAgMCAwIDEgMTAwIDUwWiIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgNTAgNTApIj48L3BhdGg+ICAgICAgPC9nPiAgICAgIDxnIHRyYW5zZm9ybT0icm90YXRlKDYzLjc3OTcgNTAgNTApIj4gICAgICAgIDxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0icm90YXRlIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxLjUxNTE1MTUxNTE1MTUxNTFzIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICAgICAgICA8cGF0aCBmaWxsLW9wYWNpdHk9IjAuOCIgZmlsbD0iI2Y4YjI2YSIgZD0iTTUwIDUwTDUwIDBBNTAgNTAgMCAwIDEgMTAwIDUwWiIgdHJhbnNmb3JtPSJyb3RhdGUoMTgwIDUwIDUwKSI+PC9wYXRoPiAgICAgIDwvZz4gICAgICA8ZyB0cmFuc2Zvcm09InJvdGF0ZSgzMS44ODk1IDUwIDUwKSI+ICAgICAgICA8YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iMCA1MCA1MDszNjAgNTAgNTAiIGtleVRpbWVzPSIwOzEiIGR1cj0iMy4wMzAzMDMwMzAzMDMwMzAzcyI+PC9hbmltYXRlVHJhbnNmb3JtPiAgICAgICAgPHBhdGggZmlsbC1vcGFjaXR5PSIwLjgiIGZpbGw9IiNhYmJkODEiIGQ9Ik01MCA1MEw1MCAwQTUwIDUwIDAgMCAxIDEwMCA1MFoiIHRyYW5zZm9ybT0icm90YXRlKDI3MCA1MCA1MCkiPjwvcGF0aD4gICAgICA8L2c+ICAgIDwvZz4gIDwvZz48L2c+PCEtLSBbbGRpb10gZ2VuZXJhdGVkIGJ5IGh0dHBzOi8vbG9hZGluZy5pby8gLS0+PC9zdmc+";
/**
 * 
 * @param {PhotoSwipeFrag} parent
 * @param {*} props 
 */

function PhotoSwipeFragItem(parent, props) {
  /**
   * @type {PhotoSwipeFrag}
   */
  this.parent = parent;
  /**
   * @type {String}
   */

  this.src = props.src;
  /**
   * @type {HTMLImageElement}
   */

  this.$image = null;
  /**
   * @type {HTMLElement}
   */

  this.$frame = null;
  this._animateTimeout = -1;
  this.naturalWidth = 1;
  this.naturalHeight = 1;
  /**
   * @type {String}
   */

  this.title = '';
  this.viewPosition = 0;
  this.sync = Promise.resolve();
  this.ev_updateSize = this.ev_updateSize.bind(this);
  this.ev_mousedown = this.ev_mousedown.bind(this);
  this.ev_pan_mousedown = this.ev_pan_mousedown.bind(this);
  this.ev_pan_mousemove = this.ev_pan_mousemove.bind(this);
  this.ev_pan_mousefinish = this.ev_pan_mousefinish.bind(this);
}

;

PhotoSwipeFragItem.prototype.ev_updateSize = function () {
  if (this.snap == this.SNAP_FIX_SIZE) {
    this.fixSize();
  }
};

PhotoSwipeFragItem.prototype.load = function () {
  var self = this;

  if (!this.$frame) {
    this.$frame = _('.ptswpf-frame').addTo(this.parent.$view).on(_BrowserDetector.default.isMobile ? 'pointerdown' : 'mousedown', this.ev_mousedown);
    this.$loadingImage = _('img.ptswpf-frame-loading-img').addTo(this.$frame);
    this.$loadingImage.src = loadingUrl;
    this.$attachhook = _('attachhook').addTo(this.$frame).on('error', function () {
      _Dom.default.addToResizeSystem(this);
    });
    this.$attachhook.updateSize = this.ev_updateSize;
    this.$image = _('img.ptswpf-image').addTo(this.$frame);
    this.$image.src = this.src;
    this.$image.draggable = false;
    this.sync = _Dom.default.waitImageLoaded(this.$image).then(function () {
      self.naturalHeight = self.$image.naturalHeight;
      self.naturalWidth = self.$image.naturalWidth;
      self.$loadingImage.remove();
    });
  }

  return this.sync;
};

PhotoSwipeFragItem.prototype.beginAnimateTimeout = function (duration) {
  if (duration === undefined) duration = 300;
  var self = this;

  if (this._animateTimeout > 0) {
    clearTimeout(this._animateTimeout);
    this._animateTimeout = -1;
  }

  this.$frame.addClass('ptswpf-move-animation');
  this._animateTimeout = setTimeout(function () {
    self.$frame.removeClass('ptswpf-move-animation');
    self._animateTimeout = -1;
  }, duration);
};

PhotoSwipeFragItem.prototype.getScaleToFix = function (width, height) {
  return Math.min(width / this.naturalWidth, height / this.naturalHeight);
};

PhotoSwipeFragItem.prototype.scale = function (s) {
  var nWidth = this.naturalWidth * this.scale;
  var nHeight = this.naturalHeight * this.scale;
  var frameBound = this.$frame.getBoundingClientRect();
  var nLeft = frameBound.width / 2 + dx - nWidth * ox;
  var nTop = frameBound.height / 2 + dy - nHeight * oy;
  var maxTop, minTop, maxLeft, minLeft;

  if (nHeight > frameBound.height) {
    maxTop = 0;
    minTop = frameBound.height - nHeight;
  } else {
    minTop = frameBound.height / 2 - nHeight / 2;
    maxTop = minTop;
  }

  if (nWidth > frameBound.width) {
    maxLeft = 0;
    minLeft = frameBound.width - nWidth;
  } else {
    minLeft = frameBound.width / 2 - nWidth / 2;
    maxLeft = minLeft;
  }

  nLeft = Math.min(Math.max(nLeft, minLeft), maxLeft);
  nTop = Math.min(Math.max(nTop, minTop), maxTop);
  if (hs < 1 && nWidth < this.naturalWidth && Math.max(nWidth, nHeight) < 10) return;
  this.$image.addStyle({
    width: nWidth + 'px',
    height: nHeight + 'px',
    left: 'calc(' + (nLeft - frameBound.width / 2) + 'px + 50%)',
    top: 'calc(' + (nTop - frameBound.height / 2) + 'px + 50%)'
  });
};

PhotoSwipeFragItem.prototype.SNAP_FIX_SIZE = 'SNAP_FIX_SIZE';
PhotoSwipeFragItem.prototype.SNAP_ORIGIN_SIZE = 'SNAP_ORIGIN_SIZE';
PhotoSwipeFragItem.prototype.MODE_PAN = 3;
PhotoSwipeFragItem.prototype.MODE_ZOOM_IN = 4;
PhotoSwipeFragItem.prototype.MODE_ZOOM_OUT = 5;

PhotoSwipeFragItem.prototype.originSize = function () {
  this.snap = this.SNAP_ORIGIN_SIZE;
  /**
   * @type {PSPhotoItem}
   */

  var imageBound = this.$image.getBoundingClientRect();
  this.$image.addStyle('left', 'calc(50% - ' + this.naturalWidth / 2 + 'px)');
  this.$image.addStyle('top', 'calc(50% - ' + this.naturalHeight / 2 + 'px)');
  this.$image.addStyle({
    width: this.naturalWidth + 'px',
    height: this.naturalHeight + 'px'
  });
  this.scale = 1;
};

PhotoSwipeFragItem.prototype.fixSize = function () {
  this.snap = this.SNAP_FIX_SIZE;
  /**
   * @type {PSPhotoItem}
   */

  var frameSize = this.$frame.getBoundingClientRect();
  var newWidth;
  var newHeight;

  if (frameSize.width / frameSize.height > this.naturalWidth / this.naturalHeight) {
    newHeight = frameSize.height;
    newWidth = newHeight * this.naturalWidth / this.naturalHeight;
  } else {
    newWidth = frameSize.width;
    newHeight = newWidth * this.naturalHeight / this.naturalWidth;
  }

  this.$image.addStyle('left', 'calc(50% - ' + newWidth / 2 + 'px)');
  this.$image.addStyle('top', 'calc(50% - ' + newHeight / 2 + 'px)');
  this.$image.addStyle({
    width: newWidth + 'px',
    height: newHeight + 'px'
  });
  this.scale = newWidth / this.naturalWidth;
};

PhotoSwipeFragItem.prototype.autoSize = function () {
  var frameSize = this.$frame.getBoundingClientRect();

  if (this.naturalHeight > frameSize.height || this.naturalWidth > frameSize.width) {
    this.fixSize();
  } else {
    this.originSize();
  }
};

PhotoSwipeFragItem.prototype.moveToLeft = function () {
  this.$frame.removeClass('ptswpf-frame-right').addClass('ptswpf-frame-left');
  this.viewPosition = -1;
};

PhotoSwipeFragItem.prototype.moveToRight = function () {
  this.$frame.removeClass('ptswpf-frame-left').addClass('ptswpf-frame-right');
  this.viewPosition = 1;
};

PhotoSwipeFragItem.prototype.moveToCenter = function () {
  this.$frame.removeClass('ptswpf-frame-left').removeClass('ptswpf-frame-right');
  this.viewPosition = 0;
};

PhotoSwipeFragItem.prototype.panTool = function () {
  this.mode = this.MODE_PAN;
};

PhotoSwipeFragItem.prototype.zoomInTool = function () {
  this.mode = this.MODE_ZOOM_IN;
};

PhotoSwipeFragItem.prototype.zoomOutTool = function () {
  this.mode = this.MODE_ZOOM_OUT;
};

PhotoSwipeFragItem.prototype.zoom = function (hs, ev) {
  var imgBound = this.$image.getBoundingClientRect();
  var frameSize = this.$frame.getBoundingClientRect();
  var ox = 0.5,
      oy = 0.5,
      dx = 0,
      dy = 0;

  if (event) {
    ox = (event.clientX - imgBound.left) / (imgBound.right - imgBound.left);
    oy = (event.clientY - imgBound.top) / (imgBound.bottom - imgBound.top);
    dx = event.clientX - (frameSize.left + frameSize.right) / 2;
    dy = event.clientY - (frameSize.top + frameSize.bottom) / 2;
  }

  if (hs == this.SNAP_FIX_SIZE) {
    this.scale = Math.min(frameSize.width / this.naturalWidth, frameSize.height / this.naturalHeight);
  } else if (hs == this.SNAP_ORIGIN_SIZE) {
    this.scale = 1;
  } else {
    this.scale *= hs;
  }

  var viewImg = this.$image;
  var nWidth = this.naturalWidth * this.scale;
  var nHeight = this.naturalHeight * this.scale;
  var nLeft = frameSize.width / 2 + dx - nWidth * ox;
  var nTop = frameSize.height / 2 + dy - nHeight * oy;
  var maxTop, minTop, maxLeft, minLeft;

  if (nHeight > frameSize.height) {
    maxTop = 0;
    minTop = frameSize.height - nHeight;
  } else {
    minTop = frameSize.height / 2 - nHeight / 2;
    maxTop = minTop;
  }

  if (nWidth > frameSize.width) {
    maxLeft = 0;
    minLeft = frameSize.width - nWidth;
  } else {
    minLeft = frameSize.width / 2 - nWidth / 2;
    maxLeft = minLeft;
  }

  nLeft = Math.min(Math.max(nLeft, minLeft), maxLeft);
  nTop = Math.min(Math.max(nTop, minTop), maxTop);
  if (hs < 1 && nWidth < this.naturalWidth && Math.max(nWidth, nHeight) < 10) return; // setTimeout(function () {

  this.$image.addStyle({
    width: nWidth + 'px',
    height: nHeight + 'px',
    left: 'calc(' + (nLeft - frameSize.width / 2) + 'px + 50%)',
    top: 'calc(' + (nTop - frameSize.height / 2) + 'px + 50%)'
  });
};

PhotoSwipeFragItem.prototype.ev_mousedown = function (event) {
  var bound = this.$frame.getBoundingClientRect();
  var imgBound = this.$image.getBoundingClientRect();
  this._mouseData = {
    bound: bound,
    imgBound: imgBound,
    imgBound: imgBound,
    clientX: event.clientX,
    clientY: event.clientY,
    offsetX: event.clientX - bound.left,
    offsetY: event.clientY - bound.top,
    imgOffsetX: event.clientX - imgBound.left,
    imgOffsetY: event.clientY - imgBound.top,
    imgOffsetXR: (event.clientX - imgBound.left) / imgBound.width
  };

  if (event.target.classList.contains('ptswpf-image')) {
    if (this.mode == this.MODE_PAN) {
      this.ev_pan_mousedown(event);
    } else if (this.mode == this.MODE_ZOOM_IN) {
      this.ev_zoomin_mousedown(event);
    } else if (this.mode == this.MODE_ZOOM_OUT) {
      this.ev_zoomout_mousedown(event);
    }
  }
};

PhotoSwipeFragItem.prototype.ev_pan_mousemove = function (event) {
  console.log(event.type);
  event.preventDefault();
  this.snap = -1;
  var bound = this.$frame.getBoundingClientRect();
  var newOffsetX = event.clientX - bound.left;
  var newOffsetY = event.clientY - bound.top;
  var dx = newOffsetX - this._mouseData.offsetX;
  var dy = newOffsetY - this._mouseData.offsetY;
  this.$image.addStyle({
    left: 'calc(' + (-this._mouseData.bound.width / 2 + this._mouseData.imgBound.left - this._mouseData.bound.left + dx) + 'px + 50%)',
    top: 'calc(' + (-this._mouseData.bound.height / 2 + this._mouseData.imgBound.top - this._mouseData.bound.top + dy) + 'px + 50%)'
  });
};

PhotoSwipeFragItem.prototype.ev_pan_mousefinish = function (event) {
  $(document.body).off(_BrowserDetector.default.isMobile ? 'pointermove' : 'mousemove', this.ev_pan_mousemove).off(_BrowserDetector.default.isMobile ? 'pointerleave' : 'mouseleave', this.ev_pan_mousefinish).off(_BrowserDetector.default.isMobile ? 'pointerup' : 'mouseup', this.ev_pan_mousefinish);
  var newStyle = {};
  var imgBound = this.$image.getBoundingClientRect();
  var bound = this.$frame.getBoundingClientRect();

  if (bound.width > imgBound.width) {
    newStyle.left = 'calc(50% - ' + imgBound.width / 2 + 'px)';
  } else if (imgBound.left > bound.left) {
    newStyle.left = 'calc(50% - ' + bound.width / 2 + 'px)';
  } else if (imgBound.right < bound.right) {
    newStyle.left = 'calc(' + (bound.width / 2 - imgBound.width) + 'px + 50%)';
  }

  if (bound.height > imgBound.height) {
    newStyle.top = 'calc(50% - ' + imgBound.height / 2 + 'px)';
  } else if (imgBound.top > bound.top) {
    newStyle.top = 'calc(50% - ' + bound.height / 2 + 'px)';
  } else if (imgBound.bottom < bound.bottom) {
    newStyle.top = 'calc(' + (bound.height / 2 - imgBound.height) + 'px + 50%)';
  }

  if (newStyle.left || newStyle.top) {
    this.beginAnimateTimeout();
    this.$image.addStyle(newStyle);
  }
};

PhotoSwipeFragItem.prototype.ev_pan_mousedown = function (event) {
  $(document.body).on(_BrowserDetector.default.isMobile ? 'pointermove' : 'mousemove', this.ev_pan_mousemove).on(_BrowserDetector.default.isMobile ? 'pointerleave' : 'mouseleave', this.ev_pan_mousefinish).on(_BrowserDetector.default.isMobile ? 'pointerup' : 'mouseup', this.ev_pan_mousefinish);
};

PhotoSwipeFragItem.prototype.ev_zoomin_mousedown = function (event) {
  this.beginAnimateTimeout();
  this.zoom(1.3, event);
};

PhotoSwipeFragItem.prototype.ev_zoomout_mousedown = function (event) {
  this.beginAnimateTimeout();
  this.zoom(1 / 1.3, event);
};

var _default = PhotoSwipeFrag;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/PhotoViewer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/PhotoViewer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PhotoSwipeFrag = _interopRequireDefault(require("absol-photoswipeviewer/PhotoSwipeFrag"));

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));


function PhotoViewer() {
  _BaseEditor.default.call(this);

  _PhotoSwipeFrag.default.call(this);
}

Object.assign(PhotoViewer.prototype, _PhotoSwipeFrag.default.prototype);

for (var prot in _BaseEditor.default.prototype) {
  if (_BaseEditor.default.prototype[prot] == _Context.default.prototype[prot]) continue;
  if (PhotoViewer.prototype[prot] != _Context.default.prototype[prot]) continue;
  PhotoViewer.prototype[prot] = _BaseEditor.default.prototype[prot];
}

PhotoViewer.prototype.constructor = PhotoViewer;

PhotoViewer.prototype.setData = function (data) {
  var self = this;

  if (data.images) {
    data.images.forEach(function (photoItem) {
      self.push(photoItem);
    });
  }
};

var _default = PhotoViewer;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/StatusBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/StatusBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/statusbar.css");

var _FCore = _interopRequireDefault(require("../core/FCore"));


/**
 *  Left: branch, sync, error, warning 
 *  Right: position(Ln x, Col y) , font-size, indent mode , language, status ,alert  
 */
var _ = _FCore.default._;
var $ = _FCore.default.$;

function StatusBar() {
  this.$leftCtn = $('.as-status-bar-left', this);
  this.$rightCtn = $('.as-status-bar-right', this);
}

StatusBar.tag = 'statusbar';

StatusBar.render = function () {
  return _({
    class: 'as-status-bar',
    child: ['.as-status-bar-left', '.as-status-bar-right']
  });
};

_FCore.default.install(StatusBar);

var _default = StatusBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/dom/SBIdentifierInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/dom/SBIdentifierInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.openIdentifierInputDialog = openIdentifierInputDialog;
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _utils = require("absol-acomp/js/utils");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _stringFormat = require("absol/src/String/stringFormat");

var _Follower = _interopRequireDefault(require("absol-acomp/js/Follower"));


/***
 * @augments HTMLInputElement
 * @augments AElement
 * @constructor
 */
function SBIdentifierInput() {
  this.addEventListener('change', this.eventHandler.change);
  this.on('keydown', this.eventHandler.keyDown);
  this.autoWidthBy();
  /***
   * @type {string}
   * @name identifierText
   * @memberOf SBIdentifierInput#
   */
}

SBIdentifierInput.tag = 'SBIdentifierInput';

SBIdentifierInput.render = function () {
  return (0, _FCore._)({
    tag: 'input',
    extendEvent: ['change', 'contextmenu'],
    class: 'sb-identifier-input',
    attr: {
      type: 'text',
      placeholder: 'ident...'
    },
    on: {
      contextmenu: function (event) {
        event.stopPropagation();
      }
    }
  });
};

SBIdentifierInput.prototype.autoWidthBy = function (value) {
  var cBound = this.getBoundingClientRect();
  value = value || this.value;
  var width = (0, _utils.measureText)(value, '14px arial').width;
  this.addStyle('width', Math.max(50, width + 10) + 'px');
  var nBound = this.getBoundingClientRect();
  if (cBound.width !== nBound.width) _ResizeSystem.default.update();
};

SBIdentifierInput.property = {};
SBIdentifierInput.property.identifierText = {
  get: function () {
    var newText = this.value.replace(/[^a-zA-Z0-9$_]/g, '').replace(/^[0-9]+/, '');
    newText = (0, _stringFormat.nonAccentVietnamese)(newText);
    return newText;
  },
  set: function (value) {
    value = value || '';
    value = value.replace(/[^a-zA-Z0-9$_]/g, '').replace(/^[0-9]+/, '');
    value = (0, _stringFormat.nonAccentVietnamese)(value);
    this.value = value;
    this.autoWidthBy();
  }
};
SBIdentifierInput.eventHandler = {};
/***
 * @this {SBIdentifierInput}
 * @param {KeyboardEvent} event
 */

SBIdentifierInput.eventHandler.keyDown = function (event) {
  if (event.key === ' ') {
    event.preventDefault();
    return;
  }

  if (event.key.length === 1 && !event.altKey && !event.ctrlKey) {
    this.autoWidthBy(this.value + event.key);
  }

  setTimeout(() => this.autoWidthBy(this.value), 10);
};

SBIdentifierInput.eventHandler.change = function (event) {
  var newText = this.identifierText;
  if (this.value !== newText) this.value = newText;
  this.autoWidthBy();
  this.emit('change', event);
};

var _default = SBIdentifierInput;
exports.default = _default;

function openIdentifierInputDialog(targetElt, initValue) {
  initValue = initValue || '';
  var inputElt = (0, _FCore._)({
    tag: SBIdentifierInput,
    props: {
      value: initValue
    }
  });
  var followerElt = (0, _FCore._)({
    tag: _Follower.default,
    class: ['sb-identifier-input-dialog', 'as-dropdown-box-common-style'],
    props: {
      followTarget: targetElt
    },
    child: [inputElt]
  });
  document.body.appendChild(followerElt);
  followerElt.updatePosition();
  inputElt.autoWidthBy();
  return new Promise(rs => {
    inputElt.focus();
    var resolved = false;
    inputElt.on('change', function () {
      if (resolved) return;
      resolved = true;
      followerElt.remove();
      rs(inputElt.identifierText);
    }).on('keydown', event => {
      if (resolved) return;

      if (event.key === 'Enter') {
        resolved = true;
        followerElt.remove();
        rs(inputElt.identifierText);
        event.preventDefault();
      } else if (event.key === 'Escape') {
        resolved = true;
        followerElt.remove();
        rs(initValue);
      }
    });
  });
}
};

moduleFactories["node_modules/absol-form/js/sclang/engine/SCParser.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/engine/SCParser.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "default", {
  enumerable: true,
  get: function () {
    return _SCParser.default;
  }
});

var _SCParser = _interopRequireDefault(require("absol/src/SCLang/SCParser"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
};

moduleFactories["node_modules/absol-form/js/sclang/dom/utils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/dom/utils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.openExpressionInputDialog = openExpressionInputDialog;
exports.openStatementInputDialog = openStatementInputDialog;
exports.type2text = type2text;

var _Follower = _interopRequireDefault(require("absol-acomp/js/Follower"));

var _FCore = require("../../core/FCore");

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));

var _FlexiconButton = _interopRequireDefault(require("absol-acomp/js/FlexiconButton"));

var _keyboard = require("absol/src/Input/keyboard");

var _SCParser = _interopRequireDefault(require("../engine/SCParser"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");


function openExpressionInputDialog(targetElt, initValue, astVerifyFunc) {
  return new Promise(resolve => {
    initValue = initValue || '';
    var timeout = -1;
    var currentAst = null;
    /***
     * @type {PreInput}
     */

    var input = (0, _FCore._)({
      tag: _PreInput.default.tag,
      on: {
        keydown: event => {
          if ((0, _keyboard.keyboardEventToKeyBindingIdent)(event) === 'enter') {
            submit();
          }
        },
        keyup: () => {
          okBtn.disabled = true;
          clearTimeout(timeout);
          timeout = setTimeout(verify, 500);
        }
      },
      props: {
        value: initValue
      }
    });
    var okBtn = (0, _FCore._)({
      tag: _FlexiconButton.default.tag,
      props: {
        icon: 'span.mdi.mdi-check-outline'
      }
    });
    var cancelBtn = (0, _FCore._)({
      tag: _FlexiconButton.default.tag,
      props: {
        icon: 'span.mdi.mdi-close-outline'
      }
    });
    var dialog = (0, _FCore._)({
      class: ['sc-expression-input-dialog', 'as-dropdown-box-common-style'],
      child: [input, okBtn, cancelBtn]
    });

    var verify = () => {
      var ok;

      var result = _SCParser.default.parse(input.value, 'exp');

      if (!result.error && result.ast) {
        if (astVerifyFunc) ok = astVerifyFunc(result.ast);else ok = true;
      } else {
        ok = false;
      }

      if (ok) {
        okBtn.disabled = false;
        currentAst = result.ast;
      } else {
        okBtn.disabled = true;
      }

      return ok;
    };

    var followerElt = (0, _FCore._)({
      tag: _Follower.default.tag,
      child: dialog
    });
    followerElt.addTo(document.body);
    followerElt.followTarget = targetElt;
    setTimeout(() => {
      input.focus();
      console.log([initValue, initValue.length]);
      input.select({
        start: 0,
        end: initValue.length
      });
    }, 100);

    var clickOut = event => {
      if ((0, _EventEmitter.hitElement)(dialog, event)) return;
      cancel();
    };

    setTimeout(() => {
      document.addEventListener('click', clickOut);
    }, 100);

    var finish = () => {
      followerElt.followTarget = null;
      followerElt.remove();
      document.removeEventListener('click', clickOut);
    };

    var submit = () => {
      if (!verify()) return;
      finish();
      resolve(currentAst);
    };

    var cancel = () => {
      finish();
      resolve(null);
    };

    okBtn.on('click', () => {
      submit();
    });
    cancelBtn.on('click', cancel);
  });
}

function openStatementInputDialog(targetElt, initValue, astVerifyFunc) {
  return new Promise(resolve => {
    var timeout = -1;
    var currentAst = null;
    /***
     * @type {PreInput}
     */

    var input = (0, _FCore._)({
      tag: _PreInput.default.tag,
      on: {
        keydown: event => {
          if ((0, _keyboard.keyboardEventToKeyBindingIdent)(event) === 'enter') {
            submit();
          }
        },
        keyup: () => {
          okBtn.disabled = true;
          clearTimeout(timeout);
          timeout = setTimeout(verify, 500);
        }
      }
    });
    var okBtn = (0, _FCore._)({
      tag: _FlexiconButton.default.tag,
      props: {
        icon: 'span.mdi.mdi-check-outline'
      }
    });
    var cancelBtn = (0, _FCore._)({
      tag: _FlexiconButton.default.tag,
      props: {
        icon: 'span.mdi.mdi-close-outline'
      }
    });
    var dialog = (0, _FCore._)({
      class: ['sc-statement-input-dialog', 'as-dropdown-box-common-style'],
      child: [input, okBtn, cancelBtn]
    });

    var verify = () => {
      var ok;
      var value = input.value.trim();

      var result = _SCParser.default.parse(value, 'statement');

      if (result.error && !value.endsWith(';')) {
        result = _SCParser.default.parse(value + ';', 'statement');
      }

      if (!result.error && result.ast) {
        if (astVerifyFunc) ok = astVerifyFunc(result.ast);else ok = true;
      } else {
        ok = false;
      }

      if (ok) {
        okBtn.disabled = false;
        currentAst = result.ast;
      } else {
        okBtn.disabled = true;
      }

      return ok;
    };

    var followerElt = (0, _FCore._)({
      tag: _Follower.default.tag,
      child: dialog
    });
    followerElt.addTo(document.body);
    followerElt.followTarget = targetElt;
    setTimeout(() => {
      input.focus();
    }, 100);

    var clickOut = event => {
      if ((0, _EventEmitter.hitElement)(dialog, event)) return;
      cancel();
    };

    setTimeout(() => {
      document.addEventListener('click', clickOut);
    }, 100);

    var finish = () => {
      followerElt.followTarget = null;
      followerElt.remove();
      document.removeEventListener('click', clickOut);
    };

    var submit = () => {
      if (!verify()) return;
      finish();
      resolve(currentAst);
    };

    var cancel = () => {
      finish();
      resolve(null);
    };

    okBtn.on('click', () => {
      submit();
    });
    cancelBtn.on('click', cancel);
  });
}

function type2text(ast) {
  return (0, _SCCodeGenerator.generateSCCode)(ast).replace('linktype', '').trim();
}
};

moduleFactories["node_modules/absol-form/js/flexformeditor/FlexFormEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/flexformeditor/FlexFormEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _PluginManager = _interopRequireDefault(require("../core/PluginManager"));

var _R = _interopRequireDefault(require("../R"));

var _FormPreview = _interopRequireDefault(require("../editor/FormPreview"));

var _FCore = _interopRequireWildcard(require("../core/FCore"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));

var _LayoutEditorCmd = _interopRequireDefault(require("../layouteditor/LayoutEditorCmd"));

var _utils = require("absol-acomp/js/utils");

var _FileSaver = require("absol/src/Network/FileSaver");

var _generator = require("absol/src/JSMaker/generator");

var _SBIdentifierInput = require("../sclang/dom/SBIdentifierInput");

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _utils2 = require("../sclang/dom/utils");

var _Snackbar = _interopRequireDefault(require("absol-acomp/js/Snackbar"));




/**
 * @type {FlexFormEditor||Object}
 */
var FlexFormEditorCmd = {};

FlexFormEditorCmd.save = function () {
  var tabHolder = this.formEditor.getEditorHolderByEditor(this);
  if (tabHolder) _PluginManager.default.exec(this, _R.default.PLUGINS.SAVE_CONTENT_DATA, tabHolder);
  this.notifySaved();
};

FlexFormEditorCmd.saveAs = function () {
  var tabHolder = this.formEditor.getEditorHolderByEditor(this);
  if (tabHolder) _PluginManager.default.exec(this, _R.default.PLUGINS.SAVE_AS_CONTENT_DATA, tabHolder);
  this.notifySaved();
};

FlexFormEditorCmd.saveAsSystem = function () {
  var tabHolder = this.formEditor.getEditorHolderByEditor(this);
  if (tabHolder) _PluginManager.default.exec(this, _R.default.PLUGINS.SAVE_AS_SYSTEM, tabHolder);
  this.notifySaved();
};

FlexFormEditorCmd.importFromJson = function () {
  var self = this;
  (0, _utils.openFileDialog)({
    accept: 'application/JSON'
  }).then(function (files) {
    if (!files || files.length === 0) return;
    var file = files[0];
    var reader = new FileReader();

    reader.onload = function () {
      try {
        var data = (0, _generator.replaceDateStringJSVariable)(JSON.parse(reader.result));

        if (data.app === _R.default.APP) {
          self.setData(data);
          self.notifyUnsaved();
        } else {
          console.error('Invalid data!');
        }
      } catch (error) {
        (0, _safeThrow.default)(error);
      }
    };

    reader.readAsText(file);
  });
};

FlexFormEditorCmd.export2Json = function () {
  var fileName = 'exported.json';
  var formEditor = this.getContext(_R.default.FORM_EDITOR);

  if (formEditor) {
    var tabHolder = formEditor.getEditorHolderByEditor(this);
    fileName = tabHolder.name.replace(/[\\\/\.\?]/g, '_') + '.json';
  }

  if (formEditor.options.downloadPrefixFileName) {
    fileName = formEditor.options.downloadPrefixFileName + fileName;
  }

  var text = JSON.stringify(Object.assign(this.getData(), {
    app: _R.default.APP,
    version: _R.default.VERSION
  }), null, '    ');
  var fileType = 'json';
  var blob = new Blob([text], {
    type: fileType,
    encoding: "UTF-8"
  });
  (0, _FileSaver.saveAs)(blob, fileName);
};

FlexFormEditorCmd.export2sharpEncode = function () {
  if (!window.EncodingClass) return;
  var fileName = 'exported.txt';
  var formEditor = this.getContext(_R.default.FORM_EDITOR);

  if (formEditor) {
    var tabHolder = formEditor.getEditorHolderByEditor(this);
    fileName = tabHolder.name.replace(/[\\\/\.\?]/g, '_') + '.txt';
  }

  if (formEditor.options.downloadPrefixFileName) {
    fileName = formEditor.options.downloadPrefixFileName + fileName;
  }

  var text = window.EncodingClass.string.fromVariable(Object.assign(this.getData(), {
    app: _R.default.APP,
    version: _R.default.VERSION
  }), null, '    ');
  (0, _FileSaver.saveTextAs)(text, fileName);
};

FlexFormEditorCmd.export2clipboard = function () {
  var fileName = 'exported.json';
  var formEditor = this.getContext(_R.default.FORM_EDITOR);

  if (formEditor) {
    var tabHolder = formEditor.getEditorHolderByEditor(this);
    fileName = tabHolder.name.replace(/[\\\/\.\?]/g, '_') + '.json';
  }

  if (formEditor.options.downloadPrefixFileName) {
    fileName = formEditor.options.downloadPrefixFileName + fileName;
  }

  var text = (0, _generator.generateJSVariable)(Object.assign(this.getData(), {
    app: _R.default.APP,
    version: _R.default.VERSION
  }), null, '    ');
  navigator.clipboard.writeText(text).then(() => {
    _Snackbar.default.show("Copied JS to clipboard");
  });
};

FlexFormEditorCmd.preview = function () {
  /**
   * @type {FormEditor}
   */
  var formEditor = this.getContext(_R.default.FORM_EDITOR);
  if (!formEditor) return;
  var tabHolder = formEditor.getEditorHolderByEditor(this);
  var currentTabIdent = tabHolder.ident;
  var previewTabIdent = currentTabIdent + '_preview';
  var previewEditor;
  var previewTabHolder = formEditor.getEditorHolderByIdent(previewTabIdent);
  if (previewTabHolder) previewEditor = previewTabHolder.editor;

  if (!previewEditor) {
    previewEditor = new _FormPreview.default();
    previewEditor.attach(this);
    var name = tabHolder.name + '(Preview)';
    var desc = tabHolder.desc;
    formEditor.openEditorTab(previewTabIdent, name, desc, previewEditor, {
      layoutEditor: this
    });
  } else {
    previewTabHolder.tabframe.requestActive();
  }

  var data = this.getData();
  previewEditor.setData(data);
}; //todo: save variable in context


var mqttClient;
var deviceIdSync;

FlexFormEditorCmd.linkToPhone = function () {};

FlexFormEditorCmd.remotePreview = function () {
  mqttClient = mqttClient || window.MQTT.connect('wss:absol.cf:9884');
  this.$remotePreviewBtn = this.$remotePreviewBtn || (0, _FCore.$)('button[data-cmd-name="remotePreview"]', this.$view);
  deviceIdSync = deviceIdSync || (0, _SBIdentifierInput.openIdentifierInputDialog)(this.$remotePreviewBtn, '').then(result => {
    if (!result) return null;
    this.$remotePreviewBtn.title = "Connect to client: " + result;
    return result;
  });
  deviceIdSync.then(result => {
    if (!result) {
      deviceIdSync = null;
      return;
    }

    var data = this.getData();
    mqttClient.publish('rfp/' + result, JSON.stringify({
      type: 'form',
      data: data
    }), err => {
      if (err) {
        _Toast.default.make({
          props: {
            variant: 'error',
            htitle: "Send data error",
            disappearTimeout: 4000
          },
          child: {
            style: {
              padding: '5px'
            },
            child: {
              text: err.message
            }
          }
        });
      }
    });
  });
};

var _default = FlexFormEditorCmd;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/ComponentOutline.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/ComponentOutline.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _R = _interopRequireDefault(require("../R"));

require("../../css/componentoutline.css");

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _FmFragment = _interopRequireDefault(require("../core/FmFragment"));

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _DropPanel = _interopRequireDefault(require("absol-acomp/js/DropPanel"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ExpTree = _interopRequireDefault(require("absol-acomp/js/ExpTree"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


var _ = _FCore.default._;
var $ = _FCore.default.$;

function ComponentOutline() {
  _BaseEditor.default.call(this);

  this.$view = null;
  /**
   * @type {LayoutEditor}
   */

  this.layoutEditor = null;
  this.$focusNode = undefined;
  this._lastPressTime = 0;
  this.$nodesById = {};
  this.$pool = [];
  this._savedStatus = {};
  this._selectedIds = {};

  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }
}

_OOP.default.mixClass(ComponentOutline, _BaseEditor.default);

ComponentOutline.prototype.onAttached = function () {
  this.layoutEditor = this.getContext(_R.default.LAYOUT_EDITOR);
};

ComponentOutline.prototype.ev_contextNode = function (node, event) {
  var comp = this.layoutEditor.findComponentsById(node.compId)[0];
  var self = this;
  var items = [{
    icon: 'span.mdi.mdi-delete-variant',
    text: 'Delete',
    cmd: 'delete',
    extendStyle: {
      color: 'red'
    }
  }];
  var anchorEditor = this.layoutEditor.anchorEditorsCtrl.findAnchorEditorByComponent(comp);

  if (anchorEditor) {
    anchorEditor.focus();
    this.updateComponentStatus();
  } else {
    this.layoutEditor.setActiveComponent(comp);
  }

  if (this.layoutEditor.anchorEditors.length === 1) {
    items = [{
      icon: 'span.mdi.mdi-arrow-collapse-up',
      text: 'Move To Top',
      cmd: 'move-to-top'
    }, {
      icon: 'span.mdi.mdi-arrow-up',
      text: 'Move Up',
      cmd: 'move-up'
    }, {
      icon: 'span.mdi.mdi-arrow-down',
      text: 'Move Down',
      cmd: 'move-down'
    }, {
      icon: 'span.mdi.mdi-arrow-collapse-down',
      text: 'Move To Bottom',
      cmd: 'move-to-bottom'
    }, '================='].concat(items);
  }

  if (comp.isLayout) {
    items = [{
      icon: 'span.mdi.mdi-square-edit-outline',
      text: comp.isFragmentView ? "Edit Fragment" : 'Edit Layout',
      cmd: comp.isFragmentView ? 'edit_fragment' : 'edit_layout',
      extendStyle: {
        color: 'blue'
      }
    }, '=============='].concat(items);
  }

  event.stopPropagation();
  event.showContextMenu({
    items: items,
    extendStyle: {
      fontSize: '12px'
    }
  }, function (event) {
    switch (event.menuItem.cmd) {
      case "delete":
        self.layoutEditor.execCmd('delete');
        break;

      case 'move-to-top':
        self.moveToTop(comp);
        break;

      case 'move-up':
        self.moveUp(comp);
        break;

      case 'move-down':
        self.moveDown(comp);
        break;

      case 'move-to-bottom':
        self.moveToBottom(comp);
        break;

      case 'edit_layout':
        self.layoutEditor.editLayout(comp);
        break;

      case 'edit_fragment':
        var toast = _Toast.default.make({
          props: {
            htitle: "TODO",
            message: "Edit form"
          }
        });

        setTimeout(toast.disappear.bind(toast), 2000);
        break;
    }

    setTimeout(self.$view.focus.bind(self.$view), 20);
  });
};

ComponentOutline.prototype.moveToTop = function (comp) {
  this.layoutEditor.moveToTopComponent(comp);
};

ComponentOutline.prototype.moveUp = function (comp) {
  this.layoutEditor.moveUpComponent(comp);
};

ComponentOutline.prototype.moveDown = function (comp) {
  this.layoutEditor.moveDownComponent(comp);
};

ComponentOutline.prototype.moveToBottom = function (comp) {
  this.layoutEditor.moveToBottomComponent(comp);
  this.updateComponentTree();
};

ComponentOutline.prototype.updateComponentTree = function () {
  var self = this;
  var id, elt;

  for (id in this.$nodesById) {
    elt = this.$nodesById[id];
    elt.selfRemove();
    this.$pool.push(elt);
  }

  var savedStatus = this._savedStatus;
  var pool = this.$pool;
  this.$nodesById = {};

  function visit(expTree, comp) {
    var status = 'none';

    if (comp.children.length > 0) {
      status = savedStatus[comp.attributes.id] === 'close' ? 'close' : 'open';
      expTree.clearChild();
      comp.children.forEach(function (child) {
        var subTree = pool.pop() || self._makeNode();

        expTree.addChild(subTree);
        visit(subTree, child);
      });
    }

    expTree.status = status;
    expTree.name = comp.attributes.name || comp.attributes.id;
    expTree.icon = comp.menuIcon;
    expTree.compId = comp.attributes.id;
    self.$nodesById[expTree.compId] = expTree;
    expTree.removeClass('as-component-outline-node-selected');
    expTree.removeClass('as-component-outline-node-focus');
  }

  if (!this.layoutEditor.rootLayout) return;
  this.$expTree = this.$pool.pop() || self._makeNode();
  visit(this.$expTree, this.layoutEditor.rootLayout);

  if (this.$view) {
    this.$view.addChild(this.$expTree);
    this.$view.show = true;
  }

  this.updateComponentStatus();
};

ComponentOutline.prototype._makeNode = function () {
  var savedStatus = this._savedStatus;

  var node = _({
    tag: _ExpTree.default.tag,
    extendEvent: ['contextmenu'],
    on: {
      statuschange: function () {
        savedStatus[this.compId] = this.status;
      }
    }
  });

  node.on('press', this.ev_PressNode.bind(this, node)).on('contextmenu', this.ev_contextNode.bind(this, node));
  return node;
};

ComponentOutline.prototype.ev_PressNode = function (node, event) {
  var id = node.compId;
  var comp = this.layoutEditor.findComponentsById(id);
  if (!comp) return;
  comp = comp[0];
  var parentLayout = this.layoutEditor.findNearestLayoutParent(comp.parent);
  var newEditingLayout = parentLayout || this.layoutEditor.editingLayout;

  if (event.altKey) {
    if (comp.isLayout) {
      newEditingLayout = comp;
    }
  }

  if (newEditingLayout !== this.layoutEditor.editingLayout) {
    this.layoutEditor.editLayout(newEditingLayout);
    this.layoutEditor.anchorEditorsCtrl.setActiveComponent();
  }

  if (event.altKey) return;

  if (event.shiftKey) {
    this.layoutEditor.anchorEditorsCtrl.toggleActiveComponent(comp);
  } else {
    this.layoutEditor.setActiveComponent(comp);
  }
};

ComponentOutline.prototype.updateComponentStatus = function () {
  var newSelectedIds = this.layoutEditor.anchorEditors.reduce(function (ac, ae) {
    var id = ae.component.attributes.id;

    if (ae.isFocus) {
      ac[id] = 'focus';
    } else {
      ac[id] = true;
    }

    return ac;
  }.bind(this), {});
  var oldSelectedIds = this._selectedIds;
  Object.keys(Object.assign({}, oldSelectedIds, newSelectedIds)).forEach(function (id) {
    var node = this.$nodesById[id];
    if (!node) return;

    if (newSelectedIds[id]) {
      node.addClass('as-component-outline-node-selected');

      if (newSelectedIds[id] === 'focus') {
        node.addClass('as-component-outline-node-focus');
      } else {
        node.removeClass('as-component-outline-node-focus');
      }
    } else {
      node.removeClass('as-component-outline-node-selected');
      node.removeClass('as-component-outline-node-focus');
    }
  }.bind(this));
  this._selectedIds = newSelectedIds;
};

ComponentOutline.prototype.createView = function () {
  this.$view = _({
    tag: _DropPanel.default.tag,
    props: {
      name: 'Layout',
      show: true
    },
    class: ['as-component-outline'],
    attr: {
      tabindex: '1'
    },
    on: {
      keydown: this.ev_keydown.bind(this)
    }
  });
  this.$attachhook = _('attachhook');
  this.$view.appendChild(this.$attachhook);
  this.$attachhook.on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdate();
  });

  this.$attachhook.requestUpdate = function () {
    this.$view.$body.addStyle('max-height', this.$view.parentElement.clientHeight - this.$view.$head.clientHeight + 'px');
  }.bind(this);

  if (this.$expTree) this.$view.addChild(this.$expTree);
};

ComponentOutline.prototype.ev_keydown = function (event) {
  return;
  var now = new Date().getTime();
  if (now - this._lastPressTime < 50) return;
  this._lastPressTime = now;

  switch (event.key) {
    case 'Down':
    case 'ArrowDown':
      if (this.$focusNode) this.selectNext(this.$focusNode.__comp__);
      break;

    case 'Up':
    case 'ArrowUp':
      if (this.$focusNode) this.selectPrev(this.$focusNode.__comp__);
      break;
  }

  this.layoutEditor.ev_cmdKeyDown(event);
  setTimeout(this.$view.focus.bind(this.$view), 10);
};

ComponentOutline.prototype.selectNext = function (component) {
  var prev = undefined;
  var self = this;
  $('exptree', this.$view, function (node) {
    if (node.__comp__ == component) {
      prev = node;
    } else if (prev) {
      self.layoutEditor.setActiveComponent(node.__comp__);
      node.$node.focus();
      return true;
    }
  });
};

ComponentOutline.prototype.selectPrev = function (component) {
  var prev = undefined;
  var self = this;
  $('exptree', this.$view, function (node) {
    if (node.__comp__ == component) {
      if (prev) {
        self.layoutEditor.setActiveComponent(prev.__comp__);
        prev.$node.focus();
        return true;
      }
    }

    prev = node;
  });
};

var _default = ComponentOutline;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/BlockOutline.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/BlockOutline.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../../core/BaseEditor"));

var _DropPanel = _interopRequireDefault(require("absol-acomp/js/DropPanel"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");


/***
 * @extends BaseEditor
 * @constructor
 */
function BlockOutline() {
  _BaseEditor.default.call(this);
}

_OOP.default.mixClass(BlockOutline, _BaseEditor.default);

BlockOutline.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    tag: _DropPanel.default.tag,
    props: {
      name: 'Blocks'
    }
  });
};

var _default = BlockOutline;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/flexformeditor/FlexFormOutline.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/flexformeditor/FlexFormOutline.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _FCore = require("../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ComponentOutline = _interopRequireDefault(require("../layouteditor/ComponentOutline"));

require("../../css/flexformoutline.css");

var _BlockOutline = _interopRequireDefault(require("../ciruiteditor/blockeditor/BlockOutline"));

var _R = _interopRequireDefault(require("../R"));


/***
 * @extends BaseEditor
 * @constructor
 */
function FlexFormOutline() {
  _BaseEditor.default.call(this);

  this.componentOutline = new _ComponentOutline.default();
  this.blockOutline = new _BlockOutline.default();
}

_OOP.default.mixClass(FlexFormOutline, _BaseEditor.default);

FlexFormOutline.prototype.onAttached = function () {
  this.componentOutline.attach(this);
  this.flexFormEditor = this.getContext(_R.default.FLEX_FORM_EDITOR);
};

FlexFormOutline.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    class: 'as-flex-form-outline',
    child: [this.componentOutline.getView()]
  });
};

FlexFormOutline.prototype.onStart = function () {
  this.blockOutline.start();
};

FlexFormOutline.prototype.onStop = function () {
  this.blockOutline.stop();
};

var _default = FlexFormOutline;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TextArea.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TextArea.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _TextInput = _interopRequireDefault(require("./TextInput"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _Assembler = require("../core/Assembler");


var _ = _FCore.default._;
/***
 * @extends TextInput
 * @constructor
 */

function TextArea() {
  _TextInput.default.call(this);
}

(0, _inheritComponentClass.default)(TextArea, _TextInput.default);
TextArea.prototype.tag = "TextArea";
TextArea.prototype.menuIcon = "span.mdi.mdi-form-textarea";

TextArea.prototype.render = function () {
  return _('textarea.absol-bscroller');
};

TextArea.prototype.attributeHandlers.value = Object.assign({}, _TextInput.default.prototype.attributeHandlers.value);
TextArea.prototype.attributeHandlers.placeHolder = Object.assign({}, _TextInput.default.prototype.attributeHandlers.placeHolder);
TextArea.prototype.attributeHandlers.value.descriptor = {
  type: "text",
  long: true,
  sign: "SimpleTextLong"
};
TextArea.prototype.attributeHandlers.placeHolder.descriptor = {
  type: "text",
  long: true,
  sign: "SimpleTextLong"
};
delete TextArea.prototype.attributeHandlers.textType;

_Assembler.AssemblerInstance.addClass(TextArea);

var _default = TextArea;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/NumberInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/NumberInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _utils = require("absol-acomp/js/utils");




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function NumberInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(NumberInput, _ScalableComponent.default);
NumberInput.prototype.tag = "NumberInput";
NumberInput.prototype.menuIcon = 'span.mdi.mdi-numeric-2-box-outline';
NumberInput.prototype.SUPPORT_ATTRIBUTE_NAMES = ['value'];
NumberInput.prototype.SUPPORT_EVENT_NAMES = ['change'];
NumberInput.prototype.attributes.floatFixed = 'auto';
Object.assign(NumberInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(NumberInput.prototype.styleHandlers, _InputStyleHandlers.default);
NumberInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    this.domElt.value = value;

    if (prev !== this.domElt.value) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: function () {
    return {
      type: "number",
      max: this.attributes.max,
      min: this.attributes.min
    };
  }
};
NumberInput.prototype.attributeHandlers.min = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = -Infinity;
    this.domElt.min = value;
  },
  get: function () {
    return this.domElt.min;
  },
  descriptor: function () {
    return {
      type: "number",
      nullable: true,
      defaultValue: -1e12
    };
  },
  export: function () {
    var value = this.attributes.min;
    if (value === -Infinity) return undefined;
    return value;
  }
};
NumberInput.prototype.attributeHandlers.max = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = Infinity;
    this.domElt.max = value;
  },
  get: function () {
    return this.domElt.max;
  },
  descriptor: function () {
    return {
      type: "number",
      nullable: true,
      defaultValue: 1e12
    };
  },
  export: function () {
    var value = this.attributes.max;
    if (value === Infinity) return undefined;
    return value;
  }
};
NumberInput.prototype.attributeHandlers.floatFixed = {
  set: function (value) {
    if (value !== 'auto' && !(value >= 0 && value < 20)) value = 'auto';
    this.domElt.floatFixed = value === 'auto' ? null : value;
    return value;
  },
  descriptor: {
    type: "enum",
    values: ['auto', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  },
  export: function () {
    var value = this.attributes.floatFixed;
    if (value !== 'auto' && !(value >= 0 && value < 20)) value = undefined;
    return value;
  }
};
NumberInput.prototype.attributeHandlers.step = {
  set: function (value) {
    this.domElt.step = value;
  },
  get: function () {
    return this.domElt.step;
  },
  descriptor: {
    type: 'number',
    min: 0
  },
  export: function () {
    var value = this.domElt.step;
    if (value === 1) return undefined;
    return value;
  }
};
NumberInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'number'
  }
};
NumberInput.prototype.pinHandlers.min = {
  receives: function (value) {
    this.attributes.min = value;
  },
  descriptor: {
    type: 'number'
  }
};
NumberInput.prototype.pinHandlers.max = {
  receives: function (value) {
    this.attributes.max = value;
  },
  descriptor: {
    type: 'number'
  }
};
NumberInput.prototype.pinHandlers.userModified = {
  get: function () {
    return true;
  }
};

NumberInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);
};

NumberInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  var self = this;
  this.domElt.on('change', function (event) {
    self.pinFire('userModified');
    self.pinFire('value');
    self.notifyChange();
  });
  this.view._debug = true;
};

NumberInput.prototype.render = function () {
  return _('numberinput');
};

NumberInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

_Assembler.AssemblerInstance.addClass(NumberInput);

var _default = NumberInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/handlers/SelectionHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/handlers/SelectionHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SelectionPinHandlers = exports.SelectionAttributeHandlers = void 0;

var _generator = require("absol/src/JSMaker/generator");

var SelectionAttributeHandlers = {};
exports.SelectionAttributeHandlers = SelectionAttributeHandlers;
var SelectionPinHandlers = {};
exports.SelectionPinHandlers = SelectionPinHandlers;
SelectionAttributeHandlers.items = {
  set: function (items) {
    items = items || [];
    if (!(items instanceof Array)) items = [];
    items = items.filter(it => !!it);
    var prevText;
    var textConnectionCount = this.pinOutCountOf('text');

    if (textConnectionCount > 0) {
      prevText = this.attributes.text; //optimize performance
    }

    var prevValue = this.domElt.value;
    this.domElt.items = items;

    if (!(0, _generator.isJSVariableEqual)(this.domElt.value, prevValue)) {
      this.pinFire('value');
    }

    if (textConnectionCount && this.attributes.text !== prevText) {
      this.pinFire('text');
    }

    var minWidth = this.domElt.style.getPropertyPriority('--list-min-width') || this.domElt.getComputedStyleValue('min-width');

    if (this.anchor && minWidth) {
      minWidth = parseInt(minWidth.replace('px', ''));
      if (parseInt(this.style.width) < minWidth) this.style.width = 'auto';
    }
  },
  get: function () {
    return this.domElt.items;
  },
  descriptor: {
    type: 'Selection',
    sign: 'ItemSelection'
  },
  export: function () {
    var copy = it => {
      var res = {
        text: it.text,
        value: it.value
      };

      if (it.items && it.items.length > 0) {
        res.items = it.items.map(copy);
      }
    };

    return this.domElt.items.map(copy);
  }
};
SelectionAttributeHandlers.enableSearch = {
  set: function (value) {
    this.domElt.enableSearch = !!value;
  },
  get: function () {
    return this.domElt.enableSearch;
  },
  descriptor: {
    sign: "SelectionEnableSearch",
    type: 'bool'
  },
  export: function () {
    return this.domElt.enableSearch || undefined;
  }
};
SelectionAttributeHandlers.searchable = {
  set: function (value) {
    this.attributes.enableSearch = value;
  },
  get: function () {
    return this.attributes.enableSearch;
  },
  descriptor: {
    sign: "SelectionEnableSearch",
    type: 'bool',
    hidden: true
  },
  export: function () {
    return undefined;
  }
};
SelectionPinHandlers.items = {
  receives: function (items) {
    this.attributes.items = items;
  },
  descriptor: {
    type: 'Selection'
  }
};
['list', 'treeList'].forEach(key => {
  SelectionAttributeHandlers[key] = {
    set: function (items) {
      this.attributes.items = items;
    },
    get: function () {
      return this.attributes.items;
    },
    descriptor: {
      type: 'Selection',
      hidden: true
    },
    export: function () {
      return undefined;
    }
  };
  SelectionPinHandlers[key] = SelectionPinHandlers.items;
});
};

moduleFactories["node_modules/absol-form/js/components/handlers/ComboBoxHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/handlers/ComboBoxHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ComboBoxPinHandlers = exports.ComboBoxAttributeHandlers = void 0;

var _SelectionHandlers = require("./SelectionHandlers");

var _generator = require("absol/src/JSMaker/generator");

var ComboBoxAttributeHandlers = Object.assign({}, _SelectionHandlers.SelectionAttributeHandlers);
exports.ComboBoxAttributeHandlers = ComboBoxAttributeHandlers;
var ComboBoxPinHandlers = Object.assign({}, _SelectionHandlers.SelectionPinHandlers);
exports.ComboBoxPinHandlers = ComboBoxPinHandlers;
ComboBoxAttributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    this.domElt.value = value;
    var prevText;
    var textConnectionCount = this.pinOutCountOf('text');

    if (textConnectionCount > 0) {
      prevText = this.attributes.text; //optimize performance
    }

    if (!(0, _generator.isJSVariableEqual)(this.value, prev)) {
      this.pinFire('value');
    }

    if (textConnectionCount && this.attributes.text !== prevText) {
      this.pinFire('text');
    }
  },
  get: function () {
    return this.domElt.value;
  },
  export: function () {
    return this.domElt.value;
  }
};
ComboBoxAttributeHandlers.text = {
  get: function () {
    var value = this.attributes.value; // var item;

    var items;

    if (this.domElt.findItemsByValue) {
      items = this.domElt.findItemsByValue(value);

      if (items && items.length > 0) {
        return items[0].item.text;
      }
    } else if (this.domElt.$holderItem && this.domElt.$holderItem.data) {
      return this.domElt.$holderItem.data.text;
    }

    var list;

    if (list) {
      for (var i = 0; i < list.length; ++i) {
        if ((0, _generator.isJSVariableEqual)(list[i].value, value)) {
          return list[i].text;
        }
      }

      return '';
    } else {
      return "";
    }
  },
  export: function () {
    return undefined;
  },
  descriptor: {
    type: 'string'
  }
};
ComboBoxAttributeHandlers.strictValue = {
  get: function () {
    return this.domElt.strictValue;
  },
  set: function (value) {
    var prev = this.domElt.value;
    var prevText;
    var textConnectionCount = this.pinOutCountOf('text');

    if (textConnectionCount > 0) {
      prevText = this.attributes.text; //optimize performance
    }

    this.domElt.strictValue = value;

    if (!(0, _generator.isJSVariableEqual)(this.domElt.value, prev)) {
      this.pinFire('value');
    }

    if (textConnectionCount && this.attributes.text !== prevText) {
      this.pinFire('text');
    }
  },
  export: function () {
    var res = this.domElt.strictValue;
    return res ? true : undefined;
  },
  descriptor: {
    type: 'bool'
  }
};
ComboBoxPinHandlers.text = {
  get: function () {
    return this.attributes.text;
  },
  descriptor: {
    type: 'string'
  }
};
ComboBoxPinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.attributes.value;
  },
  descriptor: {
    type: 'text|number'
  }
};
};

moduleFactories["node_modules/absol-form/js/components/ComboBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/ComboBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _MSelectMenu = _interopRequireDefault(require("absol-mobile/js/dom/MSelectMenu"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _ComboBoxHandlers = require("./handlers/ComboBoxHandlers");




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function ComboBox() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(ComboBox, _ScalableComponent.default);
ComboBox.prototype.tag = "ComboBox";
ComboBox.prototype.menuIcon = 'span.mdi.mdi-arrow-down-drop-circle-outline';
Object.assign(ComboBox.prototype.attributeHandlers, _InputAttributeHandlers.default, _ComboBoxHandlers.ComboBoxAttributeHandlers);
Object.assign(ComboBox.prototype.styleHandlers, _InputStyleHandlers.default);
ComboBox.prototype.styleHandlers.dropdownIcon = {
  set: function (value) {
    if (value) {
      this.domElt.addClass('as-keep-dropdown-icon');
    } else {
      this.domElt.removeClass('as-keep-dropdown-icon');
    }
  },
  get: function () {
    return this.domElt.hasClass('as-keep-dropdown-icon');
  },
  export: function () {
    return this.style.dropdownIcon || undefined;
  },
  descriptor: {
    type: 'bool'
  }
};
Object.assign(ComboBox.prototype.pinHandlers, _ComboBoxHandlers.ComboBoxPinHandlers); //
// ComboBox.prototype.pinHandlers.value = {
//     receives: function (value) {
//         this.attributes.value = value;
//     },
//     get: function () {
//         return this.domElt.value;
//     },
//     descriptor: {
//         type: 'text|number'
//     }
// };

ComboBox.prototype.pinHandlers.onClick = {
  get: function () {
    return {
      sender: this
    };
  }
};

ComboBox.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);
};

ComboBox.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  var self = this;
  this.domElt.on('minwidthchange', function (event) {
    if (!(self.style.width > event.value)) {
      self.setStyle('width', event.value);
    }
  }).on('change', function () {
    // self.attributes.value = this.value;
    self.pinFire('value');
    self.pinFire('text');
    self.notifyChange();
  }).on('click', function (event) {
    if (this.readOnly) self.pinFire('onClick');
  });
};

ComboBox.prototype.render = function () {
  return _(_BrowserDetector.default.isMobile ? _MSelectMenu.default.tag : 'selectmenu');
};

ComboBox.prototype.measureMinSize = function () {
  var minWidthStyle = this.domElt ? parseFloat(this.domElt.getComputedStyleValue('min-width').replace('px')) : 24;
  return {
    width: Math.max(minWidthStyle, 24),
    height: 25
  };
};

ComboBox.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    value: {
      configurable: true,
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('value', value);
      },
      get: function () {
        return thisC.getAttribute('value');
      }
    },
    list: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.getAttribute('list');
      },
      set: function (value) {
        thisC.setAttribute('list', value);
      }
    }
  });
  return {
    set: function (value) {
      Object.assign(subObj, value);
    },
    get: function () {
      return subObj;
    }
  };
};

ComboBox.prototype.verify = function () {
  if (!this.attributes.required) return {
    completed: true
  };
  var value = this.attributes.value;

  if (value === null) {
    return {
      completed: false,
      comp: this
    };
  }
};

_Assembler.AssemblerInstance.addClass(ComboBox);

var _default = ComboBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/ContentScalelessComponent.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/ContentScalelessComponent.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/component.css");

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("./inheritComponentClass"));


var _ = _FCore.default._;
var $ = _FCore.default.$;
/***
 * @extends ScalableComponent
 * @constructor
 */

function ContentScalelessComponent() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(ContentScalelessComponent, _ScalableComponent.default);
ContentScalelessComponent.prototype.tag = "ContentScalelessComponent";
ContentScalelessComponent.prototype.BOX_ALIGN_CLASSES = {
  lefttop: 'as-align-left-top',
  centertop: 'as-align-center-top',
  righttop: 'as-align-right-top',
  leftcenter: 'as-align-left-center',
  centercenter: 'as-align-center-center',
  rightcenter: 'as-align-right-center',
  leftbottom: 'as-align-left-bottom',
  centerbottom: 'as-align-center-bottom',
  rightbottom: 'as-align-right-bottom'
};
ContentScalelessComponent.prototype.styleHandlers.boxAlign = {
  set: function (value) {
    var accepts = Object.keys(this.BOX_ALIGN_CLASSES);
    if (accepts.indexOf(value) < 0) value = 'lefttop';
    var lastClass = this.BOX_ALIGN_CLASSES[this.style.boxAlign];
    if (lastClass) this.view.removeClass(lastClass);
    this.domElt.addClass(this.BOX_ALIGN_CLASSES[value]);
    return value;
  },
  descriptor: {
    type: 'boxAlign'
  }
};

ContentScalelessComponent.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.style.boxAlign = 'lefttop';
};

ContentScalelessComponent.prototype.render = function () {
  this.$content = this.renderContent();
  this.$cell = _({
    class: 'as-component-content-scaleless-cell',
    child: this.$content
  });
  return _({
    class: 'as-component-content-scaleless',
    child: this.$cell
  });
};

ContentScalelessComponent.prototype.renderContent = function () {
  throw new Error('Not Implement!');
};

ContentScalelessComponent.prototype.getAcceptsStyleNames = function () {
  return _ScalableComponent.default.prototype.getAcceptsStyleNames.call(this).concat(['boxAlign']);
};

ContentScalelessComponent.prototype.measureMinSize = function () {
  if (!this.$content) return {
    width: 69,
    height: 30
  };
  var bound = this.$content.getBoundingClientRect();
  return {
    width: bound.width,
    height: bound.height
  };
};

var _default = ContentScalelessComponent;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/Checkbox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/Checkbox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/component.css");

var _ContentScalelessComponent = _interopRequireDefault(require("../core/ContentScalelessComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




var _ = _FCore.default._;
var $ = _FCore.default.$;
/***
 * @extends ContentScalelessComponent
 * @constructor
 */

function CheckBox() {
  _ContentScalelessComponent.default.call(this);

  this._firedValue = undefined;
}

(0, _inheritComponentClass.default)(CheckBox, _ContentScalelessComponent.default);
CheckBox.prototype.tag = "CheckBox";
CheckBox.prototype.menuIcon = "span.mdi.mdi-checkbox-outline.mdi-check-box-outline";

CheckBox.prototype.onCreate = function () {
  _ContentScalelessComponent.default.prototype.onCreate.call(this);

  this.style.width = 18;
  this.style.height = 18;
  this.style.vAlign = 'top';
  this.style.hAlign = 'left';
  this.style.textHAlign = 'center';
  this.style.textVAlign = 'center';
  this.attributes.checked = false;
};

CheckBox.prototype.onCreated = function () {
  _ContentScalelessComponent.default.prototype.onCreated.call(this);

  this.$content.on('change', function () {
    if (this._firedValue !== this.$content.checked) {
      this._firedValue = this.$content.checked;
      this.pinFire('checked');
    }

    this.notifyChange();
  }.bind(this));
};

CheckBox.prototype.renderContent = function () {
  return _('checkboxbutton');
};

CheckBox.prototype.measureMinSize = function () {
  return {
    width: 18,
    height: 18
  };
};

CheckBox.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    set: function (value) {
      return thisC.setAttribute('checked', !!value);
    },
    get: function () {
      return thisC.getAttribute('checked');
    }
  };
};

CheckBox.prototype.attributeHandlers.checked = {
  set: function (value) {
    var prev = this.$content.checked;
    this.$content.checked = !!value;

    if (this.$content.checked !== prev) {
      this.notifyChange();
    }

    if (this._firedValue !== this.$content.checked) {
      this._firedValue = this.$content.checked;
      this.pinFire('checked');
    }
  },
  get: function () {
    return this.$content.checked;
  },
  descriptor: {
    type: "bool",
    sign: "NotDependentBool"
  },
  export: function () {
    return this.$content.checked || undefined;
  }
};
Object.assign(CheckBox.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(CheckBox.prototype.styleHandlers, _InputStyleHandlers.default);
CheckBox.prototype.attributeHandlers.disabled = {
  set: function (value) {
    this.$content.disabled = value;
  },
  get: function () {
    return this.$content.disabled;
  },
  descriptor: {
    type: "bool"
  },
  export: function () {
    return this.$content.disabled || undefined;
  }
};
CheckBox.prototype.pinHandlers.checked = {
  receives: function (value) {
    this.attributes.checked = !!value;
  },
  get: function () {
    return this.$content.checked;
  },
  descriptor: {
    type: "bool"
  }
};
CheckBox.prototype.pinHandlers.disabled = {
  receives: function (value) {
    this.attributes.disabled = !!value;
  },
  get: function () {
    return this.$content.disabled;
  },
  descriptor: {
    type: "bool"
  }
};

_Assembler.AssemblerInstance.addClass(CheckBox);

var _default = CheckBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/Radio.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/Radio.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/component.css");

var _ContentScalelessComponent = _interopRequireDefault(require("../core/ContentScalelessComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _Checkbox = _interopRequireDefault(require("./Checkbox"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");




var _ = _FCore.default._;
var $ = _FCore.default.$;

function Radio() {
  _ContentScalelessComponent.default.call(this);
}

(0, _inheritComponentClass.default)(Radio, _ContentScalelessComponent.default);
Radio.prototype.tag = "Radio";
Radio.prototype.menuIcon = "span.mdi.mdi-radiobox-marked";
Object.assign(Radio.prototype.attributeHandlers, _InputAttributeHandlers.default);
Radio.prototype.attributeHandlers.checked = {
  set: function (value) {
    var prev = this.$content.checked;
    this.$content.checked = !!value;

    if (prev !== this.$content.checked && this.fragment) {
      this.fragment.emittor.emit('radio.' + this.attributes.name, {
        target: this,
        checked: this.$content.checked,
        value: this.attributes.value
      });
    }
  },
  get: function () {
    return this.$content.checked;
  },
  descriptor: {
    type: "bool"
  }
}; // after fragment complete created, do not change groupName, it make the disembark work incorrectly

Radio.prototype.attributeHandlers.groupName = {
  set: function (value) {
    var ref = arguments[arguments.length - 1];
    var prev = ref.get();
    value = (value || '') + '';
    if (this.fragment) this.$content.name = this.fragment.id + value;else this.$content.name = value;

    this._assignToFragment(prev, value);

    if (value !== prev) this.unbindDataInFragment();
    ref.set(value);
    if (value !== prev) this.bindDataToFragment();
    return value;
  },
  descriptor: {
    type: "text",
    regex: /[a-zA-Z0-9_\-]+/,
    sign: "RadioGroupIndent",
    independence: true
  },
  export: function () {
    var value = this.attributes.groupName || '';
    if (value === '') return undefined;
    return value;
  }
};
Radio.prototype.attributeHandlers.value = {
  set: function (value) {
    this.$content.value = value;
  },
  get: function () {
    return this.$content.value;
  },
  descriptor: {
    type: "text",
    sign: "RadioValue",
    independence: true
  }
};
Radio.prototype.attributeHandlers.disabled = _Checkbox.default.prototype.attributeHandlers.disabled;

Radio.prototype.onCreate = function () {
  _ContentScalelessComponent.default.prototype.onCreate.call(this);

  this.style.width = 18;
  this.style.height = 18;
  this.style.vAlign = 'top';
  this.style.hAlign = 'left';
  this.style.textHAlign = 'center';
  this.style.textVAlign = 'center';
  this.attributes.checked = false;
  this.attributes.value = '';
  this.attributes.groupName = 'Radio_group_' + this.constructor.count;
};

Radio.prototype.onCreated = function () {
  _ContentScalelessComponent.default.prototype.onCreated.call(this);

  this.$content.on('change', function () {
    if (this.fragment) {
      this.fragment.emittor.emit('radio.' + this.attributes.groupName, {
        target: this,
        checked: this.$content.checked,
        value: this.attributes.value
      });
      this.notifyChange();
    }
  }.bind(this));
};

Radio.prototype.renderContent = function () {
  return _('radiobutton');
};

Radio.prototype.notifyChange = function () {
  var bounded;

  if (this.attributes.dataBinding && this.fragment) {
    bounded = this.fragment.boundProps[this.attributes.name];

    if (bounded) {
      if (bounded === this || bounded.indexOf && bounded.indexOf(this) >= 0) {
        this.fragment.notifyPropsChange({
          name: this.attributes.groupName
        });
      }
    }
  }
};

Radio.prototype.setStyleWidth = function (value) {
  value = value >= 18 ? value : 18;
  return _ContentScalelessComponent.default.prototype.setStyleWidth.call(this, value);
};

Radio.prototype.setStyleHeight = function (value) {
  value = value >= 18 ? value : 18;
  return _ContentScalelessComponent.default.prototype.setStyleHeight.call(this, value);
};

Radio.prototype.setAttributeGroupName = function (value) {
  this.$content.attr('name', value);
  return value;
};

Radio.prototype.getAcceptsEventNames = function () {
  return _ContentScalelessComponent.default.prototype.getAcceptsEventNames.call(this).concat(['change']);
};

Radio.prototype.measureMinSize = function () {
  return {
    width: 18,
    height: 18
  };
};

Radio.prototype._assignToFragment = function (oldGName, newGName) {
  if (!this.fragment) return;
  this.fragment.__radio_assigned__ = this.fragment.__radio_assigned__ || {};
  var assigned = this.fragment.__radio_assigned__;
  var list = assigned[oldGName];
  var idx = -1;

  if (list) {
    idx = list.indexOf(this);
  }

  if (idx >= 0) {
    list.splice(idx, 1);
  }

  list = assigned[newGName];

  if (!list) {
    list = [];
    assigned[newGName] = list;
  }

  list.push(this);
};

Radio.prototype.bindDataToFragment = function () {
  if (!this.fragment) return;
  var obj = this.fragment.props;
  var assigned = this.fragment.__radio_assigned__;
  if (!assigned) return;
  var groupName = this.attributes.groupName;
  var list = assigned[groupName];
  if (!list) return; // not assigned yet

  if (!obj.hasOwnProperty(groupName)) {
    Object.defineProperty(obj, groupName, {
      enumerable: !this.attributes.disembark,
      configurable: true,
      set: function (value) {
        var tempList = list.slice();
        var radio;

        for (var i = 0; i < list.length; ++i) {
          radio = tempList[i];

          if (radio.attributes.value === value) {
            radio.attributes.checked = false;
          }
        }
      },
      get: function () {
        var tempList = list.slice();
        var radio;

        for (var i = 0; i < list.length; ++i) {
          radio = tempList[i];

          if (radio.attributes.checked) {
            return radio.attributes.value;
          }
        }
      }
    });
  }
};

Radio.prototype.unbindDataInFragment = function () {
  if (!this.fragment) return;
  var obj = this.fragment.props;
  var assigned = this.fragment.__radio_assigned__;
  if (!assigned) return;
  var groupName = this.attributes.groupName;
  var list = assigned[groupName];
  if (!list) return; // not assigned yet

  if (list.length === 1 && list[0] === this) {
    delete obj[groupName];
  }
};

_Assembler.AssemblerInstance.addClass(Radio);

var _default = Radio;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/Label.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/Label.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

require("../../css/component.css");

var _ContentScalelessComponent = _interopRequireDefault(require("../core/ContentScalelessComponent"));

var _Text = _interopRequireDefault(require("./Text"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TextStyleHandlers = _interopRequireDefault(require("./handlers/TextStyleHandlers"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _Assembler = require("../core/Assembler");


var _ = _FCore.default._;
var $ = _FCore.default.$;
/***
 * @extends ContentScalelessComponent
 * @constructor
 */

function Label() {
  _ContentScalelessComponent.default.call(this);
}

(0, _inheritComponentClass.default)(Label, _ContentScalelessComponent.default);
Object.assign(Label.prototype.styleHandlers, _TextStyleHandlers.default);
Label.prototype.attributeHandlers.text = {
  set: function (value) {
    value = (value || '') + '';
    this.$content.clearChild().addChild(_({
      text: value
    }));
    return value;
  },
  descriptor: {
    type: "text",
    long: false,
    sign: "innerText"
  }
};
Label.prototype.tag = "Label";
Label.prototype.menuIcon = 'span.mdi.mdi-label-outline';

Label.prototype.onCreate = function () {
  _ContentScalelessComponent.default.prototype.onCreate.call(this);

  this.attributes.text = this.attributes.name;
  this.style.height = 'auto';
  this.style.font = undefined;
  this.style.fontStyle = undefined;
  this.style.textSize = 0;
  this.style.textColor = 'black';
  this.attributes.dataBinding = false;
};

Label.prototype.renderContent = function () {
  return _('label');
};

Label.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    get: function () {
      return thisC.getAttribute('text');
    },
    set: function (value) {
      thisC.setAttribute('text', value);
    }
  };
};

Label.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.text = value + '';
  },
  descriptor: {
    type: 'text'
  }
};

_Assembler.AssemblerInstance.addClass(Label);

var _default = Label;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/anchors/LinearAnchor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/anchors/LinearAnchor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _FViewable = _interopRequireDefault(require("../core/FViewable"));

require("../../css/linearanchor.css");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _makeMapStyleHandler = _interopRequireDefault(require("./makeMapStyleHandler"));

var _utils = require("../core/utils");


var _ = _FCore.default._;
var $ = _FCore.default.$;
/**
 * AnchorBox only has one child node
 * @extends FViewable
 */

function LinearAnchor() {
  _FViewable.default.call(this);

  this.style.left = 0;
  this.style.right = 0;
  this.style.top = 0;
  this.style.bottom = 0;
  this.width = 0;
  this.height = 0;
  this.childNode = null; //for quick binding render

  this.viewBinding = {};
  this.onCreate();
  this.domElt = this.render();
  this.onCreated();
}

(0, _inheritComponentClass.default)(LinearAnchor, _FViewable.default);
LinearAnchor.prototype.TOP_CLASS_NAME = 'as-linear-anchor-box';

LinearAnchor.prototype.onCreate = function () {
  /* NOOP */
};

LinearAnchor.prototype.onCreated = function () {
  for (var key in this.viewBinding) {
    this[key] = $(this.viewBinding[key], this.view);
  }
};

LinearAnchor.prototype.compStyleHandlers = {};
LinearAnchor.prototype.compStyleHandlers.height = {
  /***
   * @this BaseComponent
   * @param value
   * @returns {string}
   */
  set: function (value) {
    var ref = arguments[arguments.length - 1];
    var currentValue = ref.get();
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var current = (0, _utils.parseMeasureValue)(currentValue) || {
      value: 'auto',
      unit: null
    };
    value = this.implicitMeasureSizeValue(value, unit, "height", current.unit);

    if (value === 'auto') {
      this.anchor.domElt.addClass('as-height-auto');
    } else {
      this.anchor.domElt.removeClass('as-height-auto');
    }

    var styleValue = value >= 0 ? value + 'px' : value;
    if (styleValue === 'match_parent') styleValue = '100%';
    this.anchor.domElt.addStyle('height', styleValue);
    this.domElt.removeStyle('height');
    ref.set(value);
    this.onSizeChange();
    return value;
  },

  /***
   * @this BaseComponent
   *
   * */
  get: function () {
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    var bound, parentBound;

    if (unit === 'px') {
      if (value !== 'number') {
        bound = this.domElt.getBoundingClientRect();
        return bound.height;
      } else {
        return value;
      }
    } else if (unit === '%') {
      if (typeof value === 'string' && value.match(/%$/)) return parseFloat(value.replace('%', ''));else {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return bound.height * 100 / parentBound.height;
      }
    } else return value;
  },
  descriptor: {
    type: 'measureSize',
    sign: 'LinearHeight',
    independence: true
  }
};
LinearAnchor.prototype.compStyleHandlers.width = {
  /***
   * @this BaseComponent
   * @param value
   * @returns {*}
   */
  set: function (value) {
    var ref = arguments[arguments.length - 1];
    var unit = arguments.length > 2 ? arguments[1] : undefined;
    var currentValue = ref.get();
    var current = (0, _utils.parseMeasureValue)(currentValue) || {
      value: 'auto',
      unit: null
    };
    value = this.implicitMeasureSizeValue(value, unit, 'width', current.unit);

    if (value === 'auto') {
      this.anchor.domElt.addClass('as-width-auto');
    } else {
      this.anchor.domElt.removeClass('as-width-auto');
    }

    var styleValue = value >= 0 ? value + 'px' : value;
    if (styleValue === 'match_parent') styleValue = '100%';
    this.anchor.domElt.addStyle('width', styleValue);
    this.domElt.removeStyle('width');
    ref.set(value);
    this.onSizeChange();
    return value;
  },
  get: function () {
    var unit = arguments.length > 1 ? arguments[0] : undefined;
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    var bound, parentBound;

    if (unit === 'px') {
      if (value !== 'number') {
        bound = this.domElt.getBoundingClientRect();
        return bound.width;
      } else {
        return value;
      }
    } else if (unit === '%') {
      if (typeof value === 'string' && value.match(/%$/)) return parseFloat(value.replace('%', ''));else {
        bound = this.domElt.getBoundingClientRect();
        parentBound = this.parent.domElt.getBoundingClientRect();
        return bound.width * 100 / parentBound.width;
      }
    } else return value;
  },
  descriptor: {
    type: 'measureSize',
    sign: 'LinearWidth',
    independence: true
  }
};
LinearAnchor.prototype.compStyleHandlers.hidden = {
  set: function (value) {
    value = !!value;
    if (value) this.anchor.domElt.addClass('as-display-hidden');else this.anchor.domElt.removeClass('as-display-hidden');
    this.domElt.removeClass('as-display-hidden');
    return value;
  },
  descriptor: {
    type: 'bool'
  }
};
['left', 'right', 'top', 'bottom', 'width', 'height', 'hidden'].forEach(function (name) {
  LinearAnchor.prototype.styleHandlers[name] = (0, _makeMapStyleHandler.default)(name);
});
['left', 'right', 'top', 'bottom'].forEach(function (name) {
  LinearAnchor.prototype.compStyleHandlers[name] = {
    /***
     * @this BaseComponent
     * @param value
     * @returns {string|number}
     */
    set: function (value) {
      var ref = arguments[arguments.length - 1];
      var unit = arguments.length > 2 ? arguments[1] : undefined;
      var currentValue = ref.get();
      var current = (0, _utils.parseMeasureValue)(currentValue) || {
        value: 'auto',
        unit: null
      };
      value = this.implicitMeasureSizeValue(value, unit, "width", current.unit);
      var styleValue = typeof value === "number" ? value + 'px' : value;
      this.anchor.domElt.addStyle('padding-' + name, styleValue);
      return value;
    },

    /**
     * @this BaseComponent
     * @returns {number|*}
     */
    get: function () {
      var unit = arguments.length > 1 ? arguments[0] : undefined;
      var ref = arguments[arguments.length - 1];
      var value = ref.get();
      return this.explicitMeasureSizeValue(value, unit, "width");
    },
    export: function (ref) {
      var value = ref.get();
      if (value === 0 || value === '0%') return undefined;
      return value;
    },
    descriptor: {
      type: 'measurePosition',
      min: -Infinity,
      max: Infinity,
      dependency: ['width'],
      sign: 'Linear' + name.substr(0, 1).toUpperCase() + name.substr(1),
      independence: true
    }
  };
});

LinearAnchor.prototype.render = function () {
  var layout = {
    class: ['as-anchor-box', this.TOP_CLASS_NAME]
  };
  return _(layout);
};
/**
 * @param {BaseComponent} child
 */


LinearAnchor.prototype.attachChild = function (child) {
  if (this.childNode) {
    this.childNode.view.remove();
    this.childNode = null;
    this.childNode.anchor = null;
  }

  if (child.anchor) throw new Error("Detach anchorBox first");
  this.childNode = child;
  child.anchor = this;
  this.childNode.style.width = this.childNode.style.width || 0;
  this.childNode.style.height = this.childNode.style.height || 0;
  this.childNode.style.left = this.childNode.style.left || 0;
  this.childNode.style.right = this.childNode.style.right || 0;
  this.childNode.style.top = this.childNode.style.top || 0;
  this.childNode.style.bottom = this.childNode.style.bottom || 0;
  this.style.left = this.childNode.style.left;
  this.style.right = this.childNode.style.right;
  this.style.top = this.childNode.style.top;
  this.style.bottom = this.childNode.style.bottom;
  this.domElt.addChild(child.view);
  this.view.attr('data-anchor-of', child.tag);
  this.style.loadAttributeHandlers(this.styleHandlers);
  child.style.loadAttributeHandlers(Object.assign({}, child.styleHandlers, this.compStyleHandlers));
  child.onAnchorAttached();
};

LinearAnchor.prototype.detachChild = function () {
  if (this.childNode) {
    this.childNode.view.remove();
    this.childNode.onAnchorDetached();
    this.childNode.anchor = null;
    this.childNode = null;
  } else throw new Error("Nothing to detach");
};

Object.defineProperty(LinearAnchor.prototype, 'view', {
  get: function () {
    return this.domElt;
  }
});
var _default = LinearAnchor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/anchoreditors/LinearAnchorEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/anchoreditors/LinearAnchorEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.LinearAnchorEditorCmdDescriptors = exports.LinearAnchorEditorCmdTree = exports.default = void 0;

var _BaseAnchorEditorCmd = _interopRequireDefault(require("./BaseAnchorEditorCmd"));


/**
 * @type {import('./LinearAnchorEditor').default}
 */
var LinearAnchorEditorCmd = Object.assign({}, _BaseAnchorEditorCmd.default);
;

LinearAnchorEditorCmd.equaliseWidth = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var widthValue = this.component.getStyle('width', 'px');

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    if (editor == this) continue;
    editor.equaliseWidth(widthValue);
  }

  this.layoutEditor.commitHistory('move', 'Equalise Width');
};

LinearAnchorEditorCmd.equaliseHeight = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;
  var heightValue = this.component.getStyle('height', 'px');

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    if (editor == this) continue;
    editor.equaliseHeight(heightValue);
  }

  this.layoutEditor.commitHistory('move', 'Equalise Height');
};

LinearAnchorEditorCmd.verticalAlignTop = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    editor.verticalAlignTop();
  }

  this.layoutEditor.commitHistory('move', 'Vertical Align Top');
};

LinearAnchorEditorCmd.verticalAlignCenter = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    editor.verticalAlignCenter();
  }

  this.layoutEditor.commitHistory('move', 'Vertical Align Center');
};

LinearAnchorEditorCmd.verticalAlignBottom = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    editor.verticalAlignBottom();
  }

  this.layoutEditor.commitHistory('move', 'Vertical Align Bottom');
};

LinearAnchorEditorCmd.horizontalAlignLeft = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    editor.horizontalAlignLeft();
  }

  this.layoutEditor.commitHistory('move', 'Horizontal Align Left');
};

LinearAnchorEditorCmd.horizontalAlignCenter = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    editor.horizontalAlignCenter();
  }

  this.layoutEditor.commitHistory('move', 'Horizontal Align Center');
};

LinearAnchorEditorCmd.horizontalAlignRight = function () {
  var editors = this.layoutEditor.anchorEditors;
  var editor;

  for (var i = 0; i < editors.length; ++i) {
    var editor = editors[i];
    editor.horizontalAlignRight();
  }

  this.layoutEditor.commitHistory('move', 'Horizontal Align Right');
};

var _default = LinearAnchorEditorCmd;
exports.default = _default;
var LinearAnchorEditorCmdTree = [[['horizontalAlignLeft', 'horizontalAlignCenter', 'horizontalAlignRight', 'equaliseWidth'], ['verticalAlignTop', 'verticalAlignCenter', 'verticalAlignBottom', 'equaliseHeight']]];
exports.LinearAnchorEditorCmdTree = LinearAnchorEditorCmdTree;
var LinearAnchorEditorCmdDescriptors = {
  equaliseWidth: {
    type: 'trigger',
    icon: 'span.mdi.mdi-arrow-expand-horizontal',
    desc: 'Equalise Width'
  },
  equaliseHeight: {
    type: 'trigger',
    icon: 'span.mdi.mdi-arrow-expand-vertical',
    desc: 'Equalise Height'
  },
  verticalAlignTop: {
    type: 'trigger',
    icon: 'span.mdi.mdi-format-vertical-align-top',
    desc: 'Vertical Align Top'
  },
  verticalAlignCenter: {
    type: 'trigger',
    icon: 'span.mdi.mdi-format-vertical-align-center',
    desc: 'Vertical Align Center'
  },
  verticalAlignBottom: {
    type: 'trigger',
    icon: 'span.mdi.mdi-format-vertical-align-bottom',
    desc: 'Vertical Align Bottom'
  },
  horizontalAlignLeft: {
    type: 'trigger',
    icon: 'span.mdi.mdi-format-horizontal-align-left',
    desc: 'Horizontal Align Left'
  },
  horizontalAlignCenter: {
    type: 'trigger',
    icon: 'span.mdi.mdi-format-horizontal-align-center',
    desc: 'Horizontal Align Center'
  },
  horizontalAlignRight: {
    type: 'trigger',
    icon: 'span.mdi.mdi-format-horizontal-align-right',
    desc: 'Horizontal Align Right'
  }
};
exports.LinearAnchorEditorCmdDescriptors = LinearAnchorEditorCmdDescriptors;
};

moduleFactories["node_modules/absol-form/js/layouteditor/anchoreditors/LinearAnchorEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/anchoreditors/LinearAnchorEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../../core/FCore"));

require("../../../css/anchoreditor.css");

require("../../dom/Icons");

var _BaseAnchorEditor = _interopRequireDefault(require("../../core/BaseAnchorEditor"));

var _LinearAnchorEditorCmd = _interopRequireWildcard(require("./LinearAnchorEditorCmd"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));




var _ = _FCore.default._;
var $ = _FCore.default.$;
/**
 * @extends BaseAnchorEditor
 * @param {LayoutEditor} layoutEditor
 */

function LinearAnchorEditor(layoutEditor) {
  _BaseAnchorEditor.default.call(this, layoutEditor);

  this.cmdRunner.assign(_LinearAnchorEditorCmd.default);
  var self = this;
  this.$modal = _({
    style: {
      zIndex: '10000000',
      left: '1px',
      right: '1px',
      top: '1px',
      bottom: '1px',
      position: 'fixed'
    }
  });
  this.$marginBox = _('resizebox').on('click', this.focusMarginBox.bind(this)).on('beginmove', this.ev_beginMove.bind(this, true)).on('moving', this.ev_movingMargin.bind(this, true)).on('endmove', this.ev_endMove.bind(this, true));
  this.$resizeBox = _('resizebox').on('mousedown', this.focus.bind(this)).on('beginmove', this.ev_beginMove.bind(this, true)).on('moving', this.ev_moving.bind(this, true)).on('endmove', this.ev_endMove.bind(this, true)).on('click', function (ev) {
    self.emit('click', ev, true);
  }).on('dblclick', this.ev_dblClick);
  this.$resizeBox.defineEvent('contextmenu');
  this.$resizeBox.on('contextmenu', this.ev_contextMenu.bind(this));
  this.movingData = null;
  this.isFocus = false;
}

_OOP.default.mixClass(LinearAnchorEditor, _BaseAnchorEditor.default);

LinearAnchorEditor.prototype.ev_contextMenu = function (event) {
  var self = this;
  var items = [];

  function makeItem(name) {
    if (name === null) return '=====';
    var cmdDescriptor = _LinearAnchorEditorCmd.LinearAnchorEditorCmdDescriptors[name];
    var res = {
      icon: cmdDescriptor.icon,
      text: cmdDescriptor.desc,
      cmd: name
    };

    if (cmdDescriptor.bindKey && cmdDescriptor.bindKey.win) {
      res.key = cmdDescriptor.bindKey.win;
    }

    return res;
  }

  items = ['horizontalAlignLeft', 'horizontalAlignCenter', 'horizontalAlignRight'].concat(this.layoutEditor.anchorEditors.length > 1 ? [] : ['equaliseWidth']).concat([null, 'verticalAlignTop', 'verticalAlignCenter', 'verticalAlignBottom']).concat(this.layoutEditor.anchorEditors.length > 1 ? [] : ['equaliseHeight']).concat([null]).map(makeItem);

  if (this.layoutEditor.anchorEditors.length === 1 && this.layoutEditor.anchorEditors[0].component.isLayout) {
    items.push({
      icon: 'span.mdi.mdi-square-edit-outline[style="color:blue"]',
      text: 'Edit Layout',
      cmd: this.execCmd.bind(this, 'layoutEdit')
    });
  }

  items.push({
    icon: 'span.mdi.mdi-delete-variant[style="color:red"]',
    text: 'Delete',
    cmd: 'delete'
  });
  event.showContextMenu({
    items: items,
    extendStyle: {
      fontSize: '12px'
    }
  }, function (event) {
    var cmd = event.menuItem.cmd;

    if (typeof cmd == 'function') {
      cmd();
      self.layoutEditor.notifyDataChange();
    } else if (typeof cmd == 'string') {
      self.layoutEditor.execCmd(cmd);
    }

    self.layoutEditor.getView().focus();
  }); // event.stopPropagation();
};

LinearAnchorEditor.prototype.focusMarginBox = function () {
  if (!this.component) return;

  if (this.isFocus) {// this.$resizeBox.removeClass('as-focus');// this is feature, not bug
    // this.$marginBox.addClass('as-focus');
  } else {
    // this.$marginBox.addClass('as-focus');
    this.$resizeBox.addClass('as-focus');
    this.isFocus = true;
    var editor;

    for (var i = 0; i < this.layoutEditor.anchorEditors.length; ++i) {
      editor = this.layoutEditor.anchorEditors[i];
      if (editor == this) continue;
      editor.blur();
    }

    this.emit('focus', {
      type: 'focus',
      target: this
    }, this);
  }
};

LinearAnchorEditor.prototype.focus = function () {
  if (!this.component) return;
  this.$resizeBox.addClass('as-focus');
  this.$marginBox.removeClass('as-focus');
  if (this.isFocus) return;
  this.isFocus = true;
  var editor;

  for (var i = 0; i < this.layoutEditor.anchorEditors.length; ++i) {
    editor = this.layoutEditor.anchorEditors[i];
    if (editor == this) continue;
    editor.blur();
  }

  this.emit('focus', {
    type: 'focus',
    target: this
  }, this);
};

LinearAnchorEditor.prototype.blur = function () {
  if (!this.isFocus) return;
  this.isFocus = false;
  this.$resizeBox.removeClass('as-focus');
  this.emit('blur', {
    type: 'blur',
    target: this
  }, this);
};

LinearAnchorEditor.prototype.update = function () {
  if (this.component) {
    var styleDescriptors = this.component.getStyleDescriptors();

    if (styleDescriptors.top || styleDescriptors.bottom || styleDescriptors.left || styleDescriptors.right) {
      this.$marginBox.addTo(this.layoutEditor.$foreground);
    } else {
      this.$marginBox.selfRemove();
    }

    this.$resizeBox.addTo(this.layoutEditor.$foreground);
    this.$resizeBox.canMove = !!(styleDescriptors.top || styleDescriptors.bottom || styleDescriptors.left || styleDescriptors.right);
    this.$resizeBox.canResize = !!(styleDescriptors.width || styleDescriptors.height);
    this.$marginBox.canClick = !!(styleDescriptors.top || styleDescriptors.bottom || styleDescriptors.left || styleDescriptors.right);
    this.$marginBox.canResize = true;
    this.updatePosition();
  } else {
    this.$resizeBox.remove();
    this.$marginBox.remove();
  }
};

LinearAnchorEditor.prototype.updatePosition = function () {
  if (this.component) {
    var bound = this.layoutEditor.$foreground.getBoundingClientRect();
    var compBound = this.component.view.getBoundingClientRect();
    this.$resizeBox.addStyle({
      left: (compBound.left - bound.left) / this.layoutEditor._softScale + 'px',
      top: (compBound.top - bound.top) / this.layoutEditor._softScale + 'px',
      width: compBound.width / this.layoutEditor._softScale + 'px',
      height: compBound.height / this.layoutEditor._softScale + 'px'
    });
    this.$marginBox.addStyle({
      left: (compBound.left - bound.left) / this.layoutEditor._softScale - this.component.getStyle('left', 'px') + 'px',
      top: (compBound.top - bound.top) / this.layoutEditor._softScale - this.component.getStyle('top', 'px') + 'px',
      width: compBound.width / this.layoutEditor._softScale + this.component.getStyle('left', 'px') + this.component.getStyle('right', 'px') + 'px',
      height: compBound.height / this.layoutEditor._softScale + this.component.getStyle('top', 'px') + this.component.getStyle('bottom', 'px') + 'px'
    });
    this.layoutEditor.boundViewCtrl.update();
  }
};

LinearAnchorEditor.prototype.ev_beginMove = function (userAction, event) {
  var bound = this.layoutEditor.$foreground.getBoundingClientRect();
  this.movingData = {
    x0: (event.clientX - bound.left) / this.layoutEditor._softScale,
    y0: (event.clientY - bound.top) / this.layoutEditor._softScale,
    dx: 0,
    dy: 0,
    option: event.option,
    styleDescriptors: this.component.getStyleDescriptors(),
    style0: Object.assign({}, this.component.style, {
      left: this.component.getStyle('left', 'px'),
      right: this.component.getStyle('right', 'px'),
      top: this.component.getStyle('top', 'px'),
      bottom: this.component.getStyle('bottom', 'px'),
      width: this.component.getStyle('width', 'px'),
      height: this.component.getStyle('height', 'px')
    }),
    comp: this.component,
    isChange: false
  };

  if (userAction) {
    this.emit('beginmove', {
      type: 'beginmove',
      target: this,
      originEvent: event,
      repeatEvent: event
    }, this);
    this.$modal.addTo(document.body);
    this.layoutEditor.rulerCtrl.viewMouseDrag(this.movingData.dx, this.movingData.dy);
    this.layoutEditor.selectCtrl.calcSelectBoundStyle();
  }
};

LinearAnchorEditor.prototype.ev_moving = function (userAction, event) {
  var movingData = this.movingData;
  var bound = this.layoutEditor.$foreground.getBoundingClientRect();
  var x = (event.clientX - bound.left) / this.layoutEditor._softScale;
  var y = (event.clientY - bound.top) / this.layoutEditor._softScale;
  movingData.dx = x - movingData.x0;
  movingData.dy = y - movingData.y0;
  var positionIsChange = false;

  if (movingData.styleDescriptors.left && !movingData.styleDescriptors.left.disabled && (movingData.option.left || movingData.option.body)) {
    movingData.comp.setStyle('left', Math.max(0, movingData.style0.left + movingData.dx), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.right && !movingData.styleDescriptors.right.disabled && (movingData.option.right || movingData.option.body)) {
    movingData.comp.setStyle('right', Math.max(0, movingData.style0.right - movingData.dx), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.width && !movingData.styleDescriptors.width.disabled) {
    if (movingData.option.left) {
      if (!!movingData.styleDescriptors.left.disabled && !!movingData.styleDescriptors.right.disabled) {
        movingData.comp.setStyle('width', Math.max(movingData.comp.measureMinSize().width, movingData.style0.width - movingData.dx * 2), 'px');
      } else {
        movingData.comp.setStyle('width', Math.max(movingData.style0.width - movingData.dx), 'px');
      }

      positionIsChange = true;
    }

    if (movingData.option.right) {
      if (movingData.styleDescriptors.left && !!movingData.styleDescriptors.left.disabled && !!movingData.styleDescriptors.right.disabled) {
        movingData.comp.setStyle('width', Math.max(movingData.comp.measureMinSize().width, movingData.style0.width + movingData.dx * 2), 'px'); //center align
      } else {
        movingData.comp.setStyle('width', Math.max(movingData.comp.measureMinSize().width, movingData.style0.width + movingData.dx), 'px');
      }

      positionIsChange = true;
    }
  }

  if (movingData.styleDescriptors.top && !movingData.styleDescriptors.top.disabled && (movingData.option.top || movingData.option.body)) {
    movingData.comp.setStyle('top', Math.max(0, movingData.style0.top + movingData.dy), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.bottom && !movingData.styleDescriptors.bottom.disabled && (movingData.option.bottom || movingData.option.body)) {
    movingData.comp.setStyle('bottom', Math.max(0, movingData.style0.bottom - movingData.dy), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.height && !movingData.styleDescriptors.height.disabled) {
    if (movingData.option.top) {
      if (movingData.styleDescriptors.top && !!movingData.styleDescriptors.top.disabled && !!movingData.styleDescriptors.bottom.disabled) {
        movingData.comp.setStyle('height', Math.max(movingData.comp.measureMinSize().height, movingData.style0.height - movingData.dy * 2), 'px');
      } else {
        movingData.comp.setStyle('height', Math.max(movingData.comp.measureMinSize().height, movingData.style0.height - movingData.dy), 'px');
      }

      positionIsChange = true;
    }

    if (movingData.option.bottom) {
      if (movingData.styleDescriptors.top && !!movingData.styleDescriptors.top.disabled && !!movingData.styleDescriptors.bottom.disabled) {
        movingData.comp.setStyle('height', Math.max(movingData.comp.measureMinSize().height, movingData.style0.height + movingData.dy * 2), 'px');
      } else {
        movingData.comp.setStyle('height', Math.max(movingData.comp.measureMinSize().height, movingData.style0.height + movingData.dy), 'px');
      }

      positionIsChange = true;
    }
  }

  this.updatePosition();

  if (positionIsChange) {
    this.emit("reposition", {
      type: 'reposition',
      component: movingData.comp,
      movingData: movingData,
      originEvent: event,
      repeatEvent: event
    }, this);
    movingData.isChange = true;

    _ResizeSystem.default.updateDown(movingData.comp.view);
  }

  if (userAction) {
    this.emit('moving', {
      taget: this,
      type: 'moving',
      originEvent: event,
      repeatEvent: event,
      target: this
    }, this);
    this.layoutEditor.rulerCtrl.viewMouseDrag(this.movingData.dx, this.movingData.dy);
    this.layoutEditor.selectCtrl.calcSelectBoundStyle();
  }
};

LinearAnchorEditor.prototype.ev_movingMargin = function (userAction, event) {
  var movingData = this.movingData;
  var bound = this.layoutEditor.$foreground.getBoundingClientRect();
  var x = (event.clientX - bound.left) / this.layoutEditor._softScale;
  var y = (event.clientY - bound.top) / this.layoutEditor._softScale;
  movingData.dx = x - movingData.x0;
  movingData.dy = y - movingData.y0;
  var positionIsChange = false;

  if (movingData.styleDescriptors.bottom && event.option.bottom) {
    movingData.comp.setStyle('bottom', Math.max(0, movingData.style0.bottom + movingData.dy), 'px');
    positionIsChange = true;
  }

  if (movingData.styleDescriptors.right && event.option.right) {
    movingData.comp.setStyle('right', Math.max(0, movingData.style0.right + movingData.dx), 'px');
    positionIsChange = true;
  }

  this.updatePosition();

  if (positionIsChange) {
    this.emit("reposition", {
      type: 'reposition',
      component: movingData.comp,
      movingData: movingData,
      originEvent: event
    }, this);
    movingData.isChange = true;
  }

  if (userAction) {
    this.emit('moving', {
      taget: this,
      type: 'moving',
      originEvent: event,
      target: this
    }, this);
    this.layoutEditor.rulerCtrl.viewMouseDrag(this.movingData.dx, this.movingData.dy);
    this.layoutEditor.selectCtrl.calcSelectBoundStyle();
  }
};

LinearAnchorEditor.prototype.ev_endMove = function (userAction, event) {
  if (this.movingData.isChange) {
    this.emit('change', {
      type: 'change',
      target: this,
      component: this.movingData.comp,
      originEvent: event
    }, this);
  }

  this.movingData = undefined;

  if (userAction) {
    this.emit('endmove', {
      taget: this,
      type: 'moving',
      originEvent: event,
      target: this
    }, this);
    setTimeout(this.$modal.selfRemove.bind(this.$modal), 100);
    this.layoutEditor.rulerCtrl.viewMouseDrag(null);
  }
};

LinearAnchorEditor.prototype.alignHorizontalCenter = function (centerValue) {
  // right - left
  if (!this.component) return;
  var currentHAlign = this.component.getStyle('hAlign');
  var cRight = this.component.getStyle('right');
  var cLeft = this.component.getStyle('left');
  var newLeft = (cRight + cLeft - centerValue) / 2;
  var newRight = (cRight + cLeft + centerValue) / 2;

  switch (currentHAlign) {
    case 'right':
      this.component.setStyle('right', newRight);
      break;

    case 'fixed':
      this.component.setStyle('left', newLeft);
      this.component.setStyle('right', newRight);
      break;

    case 'left':
      this.component.setStyle('left', newLeft);
      break;

    case 'center':
      //noway to align center
      break;
  }

  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.equaliseWidth = function (widthValue) {
  if (!this.component) return;
  this.component.setStyle('width', widthValue, 'px');
  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.equaliseHeight = function (heightValue) {
  if (!this.component) return;
  this.component.setStyle('height', heightValue, 'px');
  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.verticalAlignTop = function () {
  if (!this.component) return;
  var styleBot = this.component.getStyle('top', 'px') + this.component.getStyle('bottom', 'px');
  this.component.setStyle('top', 0, 'px');
  this.component.setStyle('bottom', styleBot, 'px');
  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.verticalAlignCenter = function () {
  if (!this.component) return;
  var styleTopBot = (this.component.getStyle('top', 'px') + this.component.getStyle('bottom', 'px')) / 2;
  this.component.setStyle('top', styleTopBot, 'px');
  this.component.setStyle('bottom', styleTopBot, 'px');
  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.verticalAlignBottom = function () {
  if (!this.component) return;
  var styleTop = this.component.getStyle('top', 'px') + this.component.getStyle('bottom', 'px');
  this.component.setStyle('top', styleTop, 'px');
  this.component.setStyle('bottom', 0, 'px');
  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.horizontalAlignRight = function () {
  if (!this.component) return;
  var styleLeft = this.component.getStyle('left', 'px') + this.component.getStyle('right', 'px');
  this.component.setStyle('left', styleLeft, 'px');
  this.component.setStyle('right', 0, 'px');
  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.horizontalAlignLeft = function () {
  if (!this.component) return;
  var styleRight = this.component.getStyle('left', 'px') + this.component.getStyle('right', 'px');
  this.component.setStyle('right', styleRight, 'px');
  this.component.setStyle('left', 0, 'px');
  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.horizontalAlignCenter = function () {
  if (!this.component) return;
  var styleLeftRight = (this.component.getStyle('left', 'px') + this.component.getStyle('right', 'px')) / 2;
  this.component.setStyle('left', styleLeftRight, 'px');
  this.component.setStyle('right', styleLeftRight, 'px');
  this.updatePosition();
  this.layoutEditor.selectCtrl.calcSelectBoundStyle();
};

LinearAnchorEditor.prototype.getCmdGroupTree = function () {
  return _LinearAnchorEditorCmd.LinearAnchorEditorCmdTree;
};

LinearAnchorEditor.prototype.getCmdDescriptor = function (name) {
  return _LinearAnchorEditorCmd.LinearAnchorEditorCmdDescriptors[name];
};

LinearAnchorEditor.prototype.execCmd = function () {
  return this.cmdRunner.invoke.apply(this.cmdRunner, arguments);
};

var _default = LinearAnchorEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouts/LinearLayout.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouts/LinearLayout.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _BaseLayout = _interopRequireDefault(require("../core/BaseLayout"));

var _LinearAnchor = _interopRequireDefault(require("../anchors/LinearAnchor"));

var _LinearAnchorEditor = _interopRequireDefault(require("../layouteditor/anchoreditors/LinearAnchorEditor"));

var _Assembler = require("../core/Assembler");

var _utils = require("../core/utils");

var _utils2 = require("absol-acomp/js/utils");


var _ = _FCore.default._;

function LinearLayout() {
  _BaseLayout.default.call(this);
}

Object.defineProperties(LinearLayout.prototype, Object.getOwnPropertyDescriptors(_BaseLayout.default.prototype));
LinearLayout.prototype.constructor = LinearLayout;
LinearLayout.prototype.tag = 'LinearLayout';
LinearLayout.prototype.menuIcon = 'span.mdi.mdi-post-outline';
LinearLayout.prototype.TOP_CLASS_NAME = 'as-linear-layout';
LinearLayout.prototype.SUPPORT_STYLE_NAMES = ['width', 'height']; //, 'left', 'right', 'top', 'bottom'];

LinearLayout.prototype.AnchorClass = _LinearAnchor.default;
LinearLayout.prototype.AnchorEditorClass = _LinearAnchorEditor.default;
LinearLayout.prototype.style.paddingLeft = 0;
LinearLayout.prototype.style.paddingRight = 0;
LinearLayout.prototype.style.paddingTop = 0;
LinearLayout.prototype.style.paddingBottom = 0;
LinearLayout.prototype.styleHandlers.overflowY = {
  set: function (value) {
    if (['visible', 'hidden', 'auto'].indexOf(value) < 0) value = 'visible';
    this.domElt.addStyle('overflowY', value);
    return value;
  },
  export: function (ref) {
    var value = ref.get();
    if (value === 'visible' || !value) return undefined;
    return value;
  },
  descriptor: {
    type: 'enum',
    values: ['visible', 'hidden', 'auto']
  }
};
LinearLayout.prototype.styleHandlers.paddingLeft = {
  set: function (value) {},
  get: function () {},
  descriptor: {
    type: 'measurePosition'
  }
};
LinearLayout.prototype.styleHandlers.paddingRight = {
  set: function (value) {},
  get: function () {},
  descriptor: {
    type: 'measurePosition'
  }
};
['left', 'right', 'top', 'bottom'].forEach(pos => {
  LinearLayout.prototype.styleHandlers['padding' + pos[0].toUpperCase() + pos.substring(1)] = {
    /***
     * @this BaseComponent
     * @param value
     * @returns {*}
     */
    set: function (value) {
      var ref = arguments[arguments.length - 1];
      var unit = arguments.length > 2 ? arguments[1] : undefined;
      var currentValue = ref.get();
      var current = (0, _utils.parseMeasureValue)(currentValue) || {
        value: 'auto',
        unit: null
      };
      value = this.implicitMeasureSizeValue(value, unit, 'width', current.unit);

      if (value === 'auto') {
        this.domElt.removeStyle('padding-' + pos);
      } else if (value === 'match_parent') {
        this.domElt.addStyle('padding-' + pos, '100%');
      } else if ((0, _utils2.isRealNumber)(value)) {
        this.domElt.addStyle('padding-' + pos, value + 'px');
      } else this.domElt.addStyle('padding-' + pos, value);

      return value;
    },
    get: function () {
      var unit = arguments.length > 1 ? arguments[0] : undefined;
      var ref = arguments[arguments.length - 1];
      var value = ref.get();
      var parentBound;

      if (unit === 'px') {
        if (value !== 'number') {
          return parseFloat(this.domElt.getComputedStyleValue('padding-' + pos).replace('px', ''));
        } else {
          return value;
        }
      } else if (unit === '%') {
        if (typeof value === 'string' && value.match(/%$/)) return parseFloat(value.replace('%', ''));else {
          parentBound = this.parent.domElt.getBoundingClientRect();
          return parseFloat(this.domElt.getComputedStyleValue('padding-' + pos).replace('px', '')) * 100 / parentBound.width;
        }
      } else return value;
    },
    descriptor: {
      type: 'measurePosition',
      sign: 'padding_' + pos
    }
  };
});

LinearLayout.prototype.onCreate = function () {
  _BaseLayout.default.prototype.onCreate.apply(this, arguments);

  this.style.overflowY = false;
};

LinearLayout.prototype.render = function () {
  return _({
    class: this.TOP_CLASS_NAME
  });
};

LinearLayout.prototype.onAddChild = function (child, index) {
  var anchor = new _LinearAnchor.default();
  anchor.attachChild(child);

  if (index == -1 || !this.view.childNodes[index]) {
    this.view.addChild(anchor.view);
  } else {
    this.view.addChildBefore(anchor.view, this.view.childNodes[index]);
  }

  var childrenTags = this.children.reduce((ac, child) => {
    ac[child.tag] = true;
    return ac;
  }, {});
  childrenTags = Object.keys(childrenTags);
  childrenTags.sort();
  childrenTags = childrenTags.join('-');
  this.domElt.attr('data-has-tags', childrenTags);
};

LinearLayout.prototype.onRemoveChild = function (child, index) {
  var anchor = child.anchor;
  anchor.detachChild();
  anchor.view.remove();
};
/**
 *
 * @returns {{width:Number, height:Number}}
 */


LinearLayout.prototype.measureMinSize = function () {
  //todo
  var width = 0;
  var height = 0;
  var cW;
  var cH;
  var child;

  for (var i = 0; i < this.children.length; ++i) {
    child = this.children[i];
    var minSize = child.measureMinSize();
    cW = child.style.left + minSize.width + child.style.right;
    cH = child.style.top + minSize.height + child.style.bottom;
    width = Math.min(cW, width);
    height += cH;
  }

  return {
    width: width,
    height: height
  };
};

LinearLayout.prototype.addChildByPosition = function (child, posX, posY) {
  var bound = this.view.getBoundingClientRect();
  var at = undefined;
  var y;

  for (var i = 0; i < this.children.length; ++i) {
    y = this.children[i].view.getBoundingClientRect().bottom - bound.top;

    if (y >= posY) {
      at = this.children[i];
      break;
    }
  }

  if (at) {
    this.addChildBefore(child, at);
  } else {
    this.addChild(child);
  }
};

_Assembler.AssemblerInstance.addClass(LinearLayout);

var _default = LinearLayout;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/anchors/ChainAnchor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/anchors/ChainAnchor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _FViewable = _interopRequireDefault(require("../core/FViewable"));

var _LinearAnchor = _interopRequireDefault(require("./LinearAnchor"));

require("../../css/chainanchor.css");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _makeMapStyleHandler = _interopRequireDefault(require("./makeMapStyleHandler"));


var _ = _FCore.default._;
var $ = _FCore.default.$;
/***
 * @extends LinearAnchor
 * @constructor
 */

function ChainAnchor() {
  _FViewable.default.call(this);

  this.style.left = 0;
  this.style.right = 0;
  this.style.top = 0;
  this.style.bottom = 0;
  this.style.vAlign = 'top';
  this.childNode = null; //for quick binding render

  this.viewBinding = {};
  this.onCreate();
  this.domElt = this.render();
  this.onCreated();
}

(0, _inheritComponentClass.default)(ChainAnchor, _LinearAnchor.default);
ChainAnchor.prototype.TOP_CLASS_NAME = 'as-chain-anchor-box';
ChainAnchor.prototype.VALIGN_CLASS_NAMES = {
  top: 'as-valign-top',
  center: 'as-valign-center',
  bottom: 'as-valign-bottom'
};
ChainAnchor.prototype.VALIGN_ACCEPTS_VALUES = ['top', 'center', 'bottom'];
['left', 'right', 'top', 'bottom', 'width', 'height', 'vAlign', 'hidden'].forEach(function (name) {
  ChainAnchor.prototype.styleHandlers[name] = (0, _makeMapStyleHandler.default)(name);
});
ChainAnchor.prototype.compStyleHandlers.vAlign = {
  set: function (value) {
    var currentValue = arguments[arguments.length - 1].get();
    if (this.anchor.VALIGN_ACCEPTS_VALUES.indexOf(value) < 0) value = this.anchor.VALIGN_ACCEPTS_VALUES[0];

    if (this.anchor.VALIGN_CLASS_NAMES[currentValue]) {
      this.anchor.domElt.removeClass(this.anchor.VALIGN_CLASS_NAMES[currentValue]);
    }

    this.anchor.domElt.addClass(this.anchor.VALIGN_CLASS_NAMES[value]);
    return value;
  },
  descriptor: function () {
    return {
      type: 'enum',
      values: this.anchor.VALIGN_ACCEPTS_VALUES,
      disabled: false,
      sign: 'ChainAnchor_VAlign',
      independence: true
    };
  }
};

ChainAnchor.prototype.render = function () {
  var layout = {
    class: ['as-anchor-box', this.TOP_CLASS_NAME]
  };
  return _(layout);
};
/**
 * @param {BaseComponent} child
 */


ChainAnchor.prototype.attachChild = function (child) {
  if (this.childNode) {
    this.childNode.view.remove();
    this.childNode = null;
    this.childNode.anchor = null;
  }

  if (child.anchor) throw new Error("Detach anchorBox first");
  this.childNode = child;
  child.anchor = this;
  this.childNode.style.width = this.childNode.style.width || 0;
  this.childNode.style.height = this.childNode.style.height || 0;
  this.childNode.style.left = this.childNode.style.left || 0;
  this.childNode.style.right = this.childNode.style.right || 0;
  this.childNode.style.top = this.childNode.style.top || 0;
  this.childNode.style.bottom = this.childNode.style.bottom || 0;
  this.childNode.style.vAlign = this.childNode.style.vAlign || 'top';
  this.style.left = this.childNode.style.left;
  this.style.right = this.childNode.style.right;
  this.style.top = this.childNode.style.top;
  this.style.bottom = this.childNode.style.bottom;
  this.style.vAlign = this.childNode.style.vAlign;
  this.view.addChild(child.view);
  this.view.attr('data-anchor-of', child.tag);
  this.style.loadAttributeHandlers(this.styleHandlers);
  child.style.loadAttributeHandlers(Object.assign({}, child.styleHandlers, this.compStyleHandlers));
  child.onAnchorAttached();
};

var _default = ChainAnchor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouts/ChainLayout.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouts/ChainLayout.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _LinearAnchorEditor = _interopRequireDefault(require("../layouteditor/anchoreditors/LinearAnchorEditor"));

var _ChainAnchor = _interopRequireDefault(require("../anchors/ChainAnchor"));

var _LinearLayout = _interopRequireDefault(require("./LinearLayout"));

var _BaseLayout = _interopRequireDefault(require("../core/BaseLayout"));

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


var _ = _FCore.default._;

function ChainLayout() {
  _LinearLayout.default.call(this);
}

(0, _inheritComponentClass.default)(ChainLayout, _LinearLayout.default);
ChainLayout.prototype.tag = 'ChainLayout';
ChainLayout.prototype.menuIcon = 'span.mdi.mdi-id-card';
ChainLayout.prototype.TOP_CLASS_NAME = 'as-chain-layout';
ChainLayout.prototype.AnchorEditorClass = _LinearAnchorEditor.default;
ChainLayout.prototype.AnchorClass = _ChainAnchor.default;
ChainLayout.prototype.styleHandlers.overflowX = {
  set: function (value) {
    if (['visible', 'hidden', 'auto'].indexOf(value) < 0) value = 'visible';
    this.view.addStyle('overflowX', value);
    return value;
  },
  descriptor: {
    type: 'enum',
    values: ['visible', 'hidden', 'auto']
  },
  export: function (ref) {
    var value = ref.get();
    if (value === 'auto') return undefined;
    return value;
  }
};
ChainLayout.prototype.styleHandlers.hAlignItem = {
  set: function (value) {
    if (['left', 'center', 'right'].indexOf(value) <= 0) value = 'left';

    if (value === 'left') {
      this.domElt.removeClass('as-h-align-item-right').removeClass('as-h-align-item-center');
    } else if (value === 'center') {
      this.domElt.addClass('as-h-align-item-center').removeClass('as-h-align-item-right');
    } else {
      this.domElt.removeClass('as-h-align-item-center').addClass('as-h-align-item-right');
    }

    return value;
  },
  descriptor: {
    type: 'enum',
    values: ['left', 'center', 'right']
  },
  export: function (ref) {
    var value = ref.get();
    if (value === 'left') return undefined;
    return value;
  }
};

ChainLayout.prototype.measureMinSize = function () {
  var width = 0;
  var height = 0;
  var child;

  for (var i = 0; i < this.children.length; ++i) {
    child = this.children[i];
    var minSize = child.measureMinSize();
    width = Math.max(width, child.style.left + minSize.width + child.style.right);
    height = Math.max(height, child.style.top + minSize.height + child.style.bottom);
  }

  return {
    width: width,
    height: height
  };
};

ChainLayout.prototype.render = function () {
  return _({
    class: this.TOP_CLASS_NAME
  });
};

ChainLayout.prototype.onAddChild = function (child, index) {
  var anchor = new _ChainAnchor.default();
  anchor.attachChild(child);

  if (index == -1 || !this.view.childNodes[index]) {
    this.view.addChild(anchor.view);
  } else {
    this.view.addChildBefore(anchor.view, this.view.childNodes[index]);
  }

  var childrenTags = this.children.reduce((ac, child) => {
    ac[child.tag] = true;
    return ac;
  }, {});
  childrenTags = Object.keys(childrenTags);
  childrenTags.sort();
  childrenTags = childrenTags.join('-');
  this.domElt.attr('data-has-tags', childrenTags);
};

ChainLayout.prototype.addChildByPosition = function (child, posX, posY) {
  var bound = this.view.getBoundingClientRect();
  var at = undefined;
  var x;

  for (var i = 0; i < this.children.length; ++i) {
    x = this.children[i].view.getBoundingClientRect().right - bound.left;

    if (x >= posX) {
      at = this.children[i];
      break;
    }
  }

  if (at) {
    this.addChildBefore(child, at);
  } else {
    this.addChild(child);
  }
};

_Assembler.AssemblerInstance.addClass(ChainLayout);

var _default = ChainLayout;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TimeInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TimeInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _datetime = require("absol/src/Time/datetime");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function TimeInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(TimeInput, _ScalableComponent.default);
TimeInput.prototype.tag = "TimeInput";
TimeInput.prototype.menuIcon = "span.mdi.mdi-clock-outline";
Object.assign(TimeInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(TimeInput.prototype.styleHandlers, _InputStyleHandlers.default);
TimeInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.dayOffset;
    this.domElt.dayOffset = value;

    if (this.domElt.dayOffset !== value) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.dayOffset;
  },
  descriptor: {
    type: 'number',
    min: 0,
    max: _datetime.MILLIS_PER_DAY - 1
  }
};
TimeInput.prototype.attributeHandlers.format = {
  set: function (value) {
    this.domElt.format = value;
  },
  get: function () {
    return this.domElt.format;
  },
  export: function () {
    if (this.domElt.format === 'hh:mm a') return undefined;
    return this.domElt.format;
  },
  descriptor: {
    type: 'enum',
    values: ['hh:mm a', 'HH:mm']
  }
};
TimeInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.domElt.dayOffset;
  },
  descriptor: {
    type: 'number'
  }
};

TimeInput.prototype.render = function () {
  return _('timeinput');
};

TimeInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.value = null;
  this.attributes.format = 'hh:mm a';
  this.style.width = 130;
  this.style.height = 30;
};

TimeInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('change', function () {
    this.pinFire('value');
    this.notifyChange();
  }.bind(this));
};

TimeInput.prototype.getAcceptsEventNames = function () {
  return _ScalableComponent.default.prototype.getAcceptsEventNames.call(this).concat(['change']);
};

TimeInput.prototype.measureMinSize = function () {
  return {
    width: 75,
    height: 16
  };
};

TimeInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

_Assembler.AssemblerInstance.addClass(TimeInput);

var _default = TimeInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/handlers/MultiselectComboBoxHandlers.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/handlers/MultiselectComboBoxHandlers.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MultiselectComboBoxPinHandlers = exports.MultiselectComboBoxAttributeHandlers = void 0;

var _SelectionHandlers = require("./SelectionHandlers");

var _generator = require("absol/src/JSMaker/generator");

var MultiselectComboBoxAttributeHandlers = Object.assign({}, _SelectionHandlers.SelectionAttributeHandlers);
exports.MultiselectComboBoxAttributeHandlers = MultiselectComboBoxAttributeHandlers;
var MultiselectComboBoxPinHandlers = Object.assign({}, _SelectionHandlers.SelectionPinHandlers);
exports.MultiselectComboBoxPinHandlers = MultiselectComboBoxPinHandlers;
MultiselectComboBoxAttributeHandlers.values = {
  set: function (values) {
    var prev = (0, _generator.copyJSVariable)(this.domElt.values);
    this.domElt.values = values;
    var cur = this.domElt.values;
    var changed = prev.length !== cur.length;
    var pDict;

    if (!changed) {
      pDict = prev.reduce(function (ac, cr) {
        ac[cr] = true;
        return ac;
      }, {});
      changed = cur.some(function (val) {
        return !pDict[val];
      });
    }

    if (changed) {
      this.pinFire('values');
      this.pinFire('text');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.values;
  },
  export: function () {
    return this.domElt.values;
  },
  descriptor: {
    type: 'string[]|number[]'
  }
};
MultiselectComboBoxAttributeHandlers.text = {
  get: function () {
    var elt = this.domElt;

    if (elt.findItemsByValues) {
      return elt.findItemsByValues(elt.values).map(it => it.text).join(', ');
    }

    return elt.values.map(value => {
      var res = value + '';
      var holders;

      if (elt.findItemsByValue) {
        holders = elt.findItemsByValue(value);

        if (holders && holders.length > 0) {
          res = holders[0].item.text;
        }
      }

      return res;
    }).join(', ');
  },
  export: function () {
    return undefined;
  },
  descriptor: {
    type: 'string'
  }
};
MultiselectComboBoxAttributeHandlers.strictValue = {
  get: function () {
    return this.domElt.strictValue;
  },
  set: function (value) {
    var prev = (0, _generator.copyJSVariable)(this.domElt.value);
    this.domElt.strictValue = value;

    if (!(0, _generator.isJSVariableEqual)(this.domElt.values, prev)) {
      this.pinFire('value');
    }
  },
  export: function () {
    var res = this.domElt.strictValue;
    return res ? true : undefined;
  },
  descriptor: {
    type: 'bool'
  }
};
MultiselectComboBoxPinHandlers.values = {
  receives: function (value) {
    this.attributes.values = value;
  },
  get: function () {
    return this.attributes.values;
  }
};
MultiselectComboBoxPinHandlers.text = {
  get: function () {
    return this.attributes.text;
  }
};
};

moduleFactories["node_modules/absol-form/js/components/MultiselectComboBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/MultiselectComboBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../core/FCore");

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _ComboBox = _interopRequireDefault(require("./ComboBox"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _MultiCheckMenu = _interopRequireDefault(require("absol-acomp/js/MultiCheckMenu"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _MMultiCheckMenu = _interopRequireDefault(require("absol-mobile/js/dom/MMultiCheckMenu"));

var _MultiselectComboBoxHandlers = require("./handlers/MultiselectComboBoxHandlers");




function valueListCmp(a, b) {
  var dictA = a.reduce(function (ac, cr) {
    ac[cr] = cr;
    return ac;
  }, {});
  return a.length === b.length && b.every(function (it) {
    return dictA[it] === it;
  });
}
/***
 * @extends ScalableComponent
 * @constructor
 */


function MultiselectComboBox() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(MultiselectComboBox, _ScalableComponent.default);
MultiselectComboBox.prototype.style.height = 'auto';
MultiselectComboBox.prototype.tag = 'MultiselectComboBox';
MultiselectComboBox.prototype.menuIcon = 'span.mdi.mdi-format-list-checkbox';

MultiselectComboBox.prototype.render = function () {
  var tag = _BrowserDetector.default.isMobile ? _MMultiCheckMenu.default.tag : _MultiCheckMenu.default.tag;
  return (0, _FCore._)({
    tag: tag
  });
};

MultiselectComboBox.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.style.height = 'auto';
  this.style.width = 100;
};

MultiselectComboBox.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  var self = this;

  if (!this.domElt.domSignal) {
    this.domElt.$domSignal = (0, _FCore._)('attachhook').addTo(this.domElt);
    this.domElt.domSignal = new _DomSignal.default(this.domElt.$domSignal);
  }
  /***
   * @type DomSignal
   */


  this.domSignal = this.domElt.domSignal;
  this.domSignal.on('pinFireAll', this.pinFireAll.bind(this));
  this.domElt.on('change', function () {
    self.pinFire('values');
    self.pinFire('text');
    self.notifyChange();
  });
};

Object.assign(MultiselectComboBox.prototype.attributeHandlers, _InputAttributeHandlers.default, _MultiselectComboBoxHandlers.MultiselectComboBoxAttributeHandlers);
Object.assign(MultiselectComboBox.prototype.pinHandlers, _MultiselectComboBoxHandlers.MultiselectComboBoxPinHandlers);
Object.assign(MultiselectComboBox.prototype.styleHandlers, _InputStyleHandlers.default);

MultiselectComboBox.prototype.measureMinSize = function () {
  var minWidthStyle = this.domElt ? parseFloat(this.domElt.getComputedStyleValue('min-width').replace('px')) : 24;
  return {
    width: Math.max(minWidthStyle, 24),
    height: 30
  };
};

MultiselectComboBox.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    values: {
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('values', value);
      },
      get: function () {
        return thisC.getAttribute('values');
      }
    },
    list: {
      enumerable: false,
      get: function () {
        return thisC.getAttribute('list');
      },
      set: function (value) {
        thisC.setAttribute('list', value);
      }
    }
  });
  return {
    set: function (value) {
      Object.assign(subObj, value);
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(MultiselectComboBox);

_Assembler.AssemblerInstance.addClass('MultiselectCombobox', MultiselectComboBox);

var _default = MultiselectComboBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TreeComboBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TreeComboBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _ComboBox = _interopRequireDefault(require("./ComboBox"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _ComboBoxHandlers = require("./handlers/ComboBoxHandlers");




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function TreeComboBox() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(TreeComboBox, _ScalableComponent.default);
TreeComboBox.prototype.tag = "TreeComboBox";
TreeComboBox.prototype.menuIcon = ['<svg style="width:22px;height:22px" viewBox="0 0 24 24" width="24" height="24">', '<g transform="scale(0.5, 0.5) translate(10, 10)">', '<path fill="currentColor" d="M3,3H9V7H3V3M15,10H21V14H15V10M15,17H21V21H15V17M13,13H7V18H13V20H7L5,20V9H7V11H13V13Z" />', '</g>', '<path fill="currentColor" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4" />', '</svg>'].join('\n');
Object.assign(TreeComboBox.prototype.attributeHandlers, _InputAttributeHandlers.default, _ComboBoxHandlers.ComboBoxAttributeHandlers);
Object.assign(TreeComboBox.prototype.pinHandlers, _ComboBoxHandlers.ComboBoxPinHandlers);
Object.assign(TreeComboBox.prototype.styleHandlers, _InputStyleHandlers.default);

TreeComboBox.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);
};

TreeComboBox.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  var self = this;
  this.domElt.on('change', function () {
    self.pinFire('value');
    self.pinFire('text');
    self.notifyChange();
  });
};

TreeComboBox.prototype.render = function () {
  return _('selecttreemenu');
};

TreeComboBox.prototype.measureMinSize = function () {
  var minWidthStyle = this.domElt ? parseFloat(this.domElt.getComputedStyleValue('min-width').replace('px')) : 24;
  return {
    width: Math.max(minWidthStyle, 24),
    height: 25
  };
};

TreeComboBox.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    value: {
      configurable: true,
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('value', value);
      },
      get: function () {
        return thisC.getAttribute('value');
      }
    },
    treeList: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.list;
      },
      set: function (value) {
        thisC.attributes.list = value;
      }
    },
    list: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.list;
      },
      set: function (value) {
        thisC.attributes.list = value;
      }
    }
  });
  return {
    set: function (value) {
      Object.assign(subObj, value);
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(TreeComboBox);

var _default = TreeComboBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TrackBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TrackBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../core/FCore");

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




function TrackBar() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(TrackBar, _ScalableComponent.default);
TrackBar.prototype.tag = 'TrackBar';
TrackBar.prototype.menuIcon = 'span.mdi.mdi-source-commit.mdi-rotate-90';
Object.assign(TrackBar.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(TrackBar.prototype.styleHandlers, _InputStyleHandlers.default);
TrackBar.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    this.domElt.value = value;

    if (this.domElt.value !== prev) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'number',
    max: 1,
    min: 0,
    floatFixed: 2
  }
};
TrackBar.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'number',
    max: 1,
    min: 0,
    floatFixed: 2
  }
};

TrackBar.prototype.render = function () {
  return (0, _FCore._)('trackbar');
};

TrackBar.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.apply(this, arguments);

  this.style.height = 18;
};

TrackBar.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.apply(this, arguments);

  this.domElt.on('change', function () {
    this.pinFire('value');
    this.notifyChange();
  }.bind(this));
};

TrackBar.prototype.measureMinSize = function () {
  return {
    width: 40,
    height: 18
  };
};

TrackBar.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

_Assembler.AssemblerInstance.addClass(TrackBar);

var _default = TrackBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TrackBarInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TrackBarInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../core/FCore");

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _TrackBar = _interopRequireDefault(require("./TrackBar"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




function TrackBarInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(TrackBarInput, _ScalableComponent.default);
TrackBarInput.prototype.tag = 'TrackBarInput';
TrackBarInput.prototype.menuIcon = 'span.mdi.mdi-source-commit.mdi-rotate-90';

TrackBarInput.prototype.render = function () {
  return (0, _FCore._)('trackbarinput');
};

Object.assign(TrackBarInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(TrackBarInput.prototype.styleHandlers, _InputStyleHandlers.default);
TrackBarInput.prototype.attributeHandlers.value = {
  set: _TrackBar.default.prototype.attributeHandlers.value.set,
  get: _TrackBar.default.prototype.attributeHandlers.value.get,
  descriptor: function () {
    return {
      type: 'number',
      max: this.domElt.rightValue,
      min: this.domElt.leftValue,
      floatFixed: 2,
      dependency: ['leftValue', 'rightValue']
    };
  }
};
TrackBarInput.prototype.attributeHandlers.leftValue = {
  set: function (value) {
    this.domElt.leftValue = value;
  },
  get: function () {
    return this.domElt.leftValue;
  },
  descriptor: function () {
    return {
      type: 'number',
      max: this.domElt.rightValue,
      floatFixed: 2,
      dependency: ['rightValue', 'value']
    };
  }
};
TrackBarInput.prototype.attributeHandlers.rightValue = {
  set: function (value) {
    this.domElt.rightValue = value;
  },
  get: function () {
    return this.domElt.rightValue;
  },
  descriptor: function () {
    return {
      type: 'number',
      min: this.domElt.leftValue,
      floatFixed: 2,
      dependency: ['leftValue', 'value']
    };
  }
};
TrackBarInput.prototype.attributeHandlers.unit = {
  set: function (value) {
    this.domElt.unit = value;
  },
  get: function () {
    return this.domElt.unit;
  },
  descriptor: function () {
    return {
      type: 'text'
    };
  }
};
TrackBarInput.prototype.pinHandlers.value = Object.assign({}, _TrackBar.default.prototype.pinHandlers.value, {
  descriptor: function () {
    return {
      type: 'number',
      max: this.domElt.rightValue,
      min: this.domElt.leftValue,
      floatFixed: 2
    };
  }
});

TrackBarInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.apply(this, arguments);

  this.style.height = 26;
};

TrackBarInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.apply(this, arguments);

  this.domElt.on('change', function () {
    this.pinFire('value');
    this.notifyChange();
  }.bind(this));
};

TrackBarInput.prototype.measureMinSize = function () {
  return {
    width: 40,
    height: 26
  };
};

_Assembler.AssemblerInstance.addClass(TrackBarInput);

var _default = TrackBarInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TableInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TableInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _TableEditor = _interopRequireDefault(require("absol-sheet/js/fragment/TableEditor"));

var _FCore = require("../core/FCore");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _Assembler = require("../core/Assembler");


/***
 * @extends ScalableComponent
 * @constructor
 */
function TableInput() {
  this.editor = new _TableEditor.default();

  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(TableInput, _ScalableComponent.default);
TableInput.prototype.tag = 'TableInput';
TableInput.prototype.menuIcon = 'span.mdi.mdi-table-edit';

TableInput.prototype.render = function () {
  return this.editor.getView();
};

TableInput.prototype.focusIncompleteCell = function () {
  if (this._incompleteCell) this.editor.focusIncompleteCell();
};
/***
 *
 * @return {FmVerifyInfo}
 */


TableInput.prototype.verify = function () {
  /***
   *
   * @type {FmVerifyInfo}
   */
  var result = {
    comp: this,
    completed: true
  };

  if (this.editor.tableData) {
    this._incompleteCell = this.editor.tableData.findFirsIncompleteCell();

    if (this._incompleteCell) {
      result.completed = false;
      result.incompleteCell = this._incompleteCell;
      this.pinFire('incomplete');
    } else {}
  }

  return result;
};

TableInput.prototype.styleHandlers.maxHeight = {
  set: function (value) {
    if (!(value > 0 && value < Infinity)) value = null;

    if (value) {
      this.domElt.addStyle('max-height', value + 'px');
    } else {
      this.domElt.removeStyle('max-height');
    }

    return value;
  },
  export: function () {
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    if (value) return value;
    return undefined;
  },
  descriptor: {
    type: 'LengthInPixel'
  }
};

TableInput.prototype.getAcceptsStyleNames = function () {
  return _ScalableComponent.default.prototype.getAcceptsStyleNames.call(this).concat(['maxHeight']);
};

TableInput.prototype.attributeHandlers.propertyNames = {
  set: function (value) {
    this._dataFlushed = false;

    this._requestUpdateContent();

    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];

    if (this._dataFlushed) {
      return this.editor.tableData.propertyNames;
    } else {
      return ref.get();
    }
  }
};
TableInput.prototype.attributeHandlers.propertyDescriptors = {
  set: function (value) {
    this._dataFlushed = false;

    this._requestUpdateContent();

    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];

    if (this._dataFlushed) {
      return this.editor.tableData.propertyDescriptors;
    } else {
      return ref.get();
    }
  }
};
TableInput.prototype.attributeHandlers.config = {
  set: function (value) {
    this._dataFlushed = false;

    this._requestUpdateContent();

    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];

    if (this._dataFlushed) {
      return this.editor.tableData.config;
    } else {
      return ref.get();
    }
  },
  export: function () {
    return Object.assign({}, this.attributes.config);
  }
};
TableInput.prototype.attributeHandlers.records = {
  set: function (value) {
    value = value || [];
    this._dataFlushed = false;

    this._requestUpdateContent();

    return value;
  },
  get: function () {
    var ref = arguments[arguments.length - 1];

    if (this._dataFlushed) {
      return this.editor.tableData.records;
    } else {
      return ref.get();
    }
  }
};
TableInput.prototype.pinHandlers.records = {
  receives: function (value) {
    this.attributes.records = value;
  },
  get: function () {
    return this.attributes.records;
  },
  descriptor: {
    type: 'object[]'
  }
};
TableInput.prototype.pinHandlers.verify = {
  /***
   * @this TableInput
   * @param value
   */
  receives: function (value) {
    if (value) this.verify();
  },
  descriptor: {
    type: 'bool'
  }
};
TableInput.prototype.pinHandlers.incomplete = {
  get: function () {
    return this._incompleteCell;
  },
  descriptor: {
    type: 'bool'
  }
};
TableInput.prototype.pinHandlers.focusIncompleteCell = {
  /***
   * @this TableInput
   * @param value
   */
  receives: function (value) {
    if (value) {
      this.editor.focusIncompleteCell();
    }
  },
  descriptor: {
    type: 'bool'
  }
};
TableInput.prototype.attributeHandlers.readOnly = {
  set: function (value) {
    this.editor.opt.readOnly = !!value;
  },
  get: function () {
    return this.editor.opt.readOnly;
  },
  export: function () {
    return this.editor.opt.readOnly ? true : undefined;
  },
  descriptor: {
    type: 'bool'
  }
};
TableInput.prototype.attributeHandlers.disabled = {
  set: function (value) {
    this.editor.opt.readOnly = !!value;
  },
  get: function () {
    return this.editor.opt.readOnly;
  },
  export: function () {
    return this.editor.opt.readOnly ? true : undefined;
  },
  descriptor: {
    type: 'bool',
    hidden: true
  }
};

TableInput.prototype.onCreated = function () {
  this.$domSignal = (0, _FCore._)('attachhook.as-dom-signal');
  this.view.appendChild(this.$domSignal);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('requestUpdateContent', this._updateContent.bind(this));
  this._dataFlushed = true;
  this.attributes.records = [];
  this.attributes.propertyDescriptors = {
    "done": {
      "type": "text",
      "text": "example"
    }
  };
  this.attributes.propertyNames = ['done'];
  this.editor.on('change', function () {
    this.pinFire('records');
    this.notifyChange();
  }.bind(this));
};

TableInput.prototype._verifyTableData = function () {
  if (!this.attributes.propertyNames || !(this.attributes.propertyNames instanceof Array) || !this.attributes.propertyDescriptors || !this.attributes.records || !this.attributes.records) return false;
  return true;
};

TableInput.prototype._updateContent = function () {
  if (this._verifyTableData()) {
    var prevRecords = this.editor.records;
    this.editor.fragment = this.fragment;
    this.editor.setData({
      propertyNames: this.attributes.propertyNames,
      propertyDescriptors: this.attributes.propertyDescriptors,
      records: this.attributes.records,
      config: this.attributes.config
    });
    this._dataFlushed = true;

    if (prevRecords !== this.editor.records) {
      this.pinFire('records');
      this.notifyChange();
    }
  }
};

TableInput.prototype._requestUpdateContent = function () {
  this.domSignal.emit('requestUpdateContent');
};

TableInput.prototype.createDataBindingDescriptor = function () {
  var thisTI = this;
  var props = {};
  Object.defineProperties(props, {
    propertyNames: {
      enumerable: true,
      set: function (pnA) {
        thisTI.setAttribute('propertyNames', pnA);
      },
      get: function () {
        return thisTI.getAttribute('propertyNames');
      }
    },
    propertyDescriptors: {
      enumerable: true,
      set: function (pdO) {
        thisTI.setAttribute('propertyDescriptors', pdO);
      },
      get: function () {
        return thisTI.getAttribute('propertyDescriptors');
      }
    },
    records: {
      enumerable: true,
      set: function (records) {
        thisTI.setAttribute('records', records);
      },
      get: function () {
        return thisTI.getAttribute('records');
      }
    }
  });
  return {
    enumerable: true,
    set: function (value) {
      Object.assign(props, value);
    },
    get: function () {
      return props;
    }
  };
};

_Assembler.AssemblerInstance.addClass(TableInput);

var _default = TableInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/FileInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/FileInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

require("../../css/imagefileinput.css");

var _utils = require("absol-acomp/js/utils");

var _Assembler = require("../core/Assembler");

var _FileInputBox = _interopRequireDefault(require("absol-acomp/js/FileInputBox"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function FileInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(FileInput, _ScalableComponent.default);
FileInput.prototype.tag = "FileInput";
FileInput.prototype.menuIcon = "span.mdi.mdi-file-plus";
FileInput.prototype.attributes.allowUpload = true;
FileInput.prototype.attributes.removable = true;
FileInput.prototype.attributes.downloadable = true;

FileInput.prototype.render = function () {
  return _({
    tag: _FileInputBox.default.tag
  });
};

FileInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    this.domElt.value = value;

    if (prev !== this.domElt.value) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: "FileSource",
    sign: 'FileSource'
  },
  export: function () {
    return this.value || undefined;
  }
};
FileInput.prototype.attributeHandlers.fileName = {
  set: function (value) {
    value = value || null;
    this.domElt.fileName = value;
  },
  get: function () {
    return this.domElt.fileName;
  },
  descriptor: {
    type: 'text'
  },
  export: function () {}
};
FileInput.prototype.pinHandlers.value = {
  get: function () {
    return this.attributes.value;
  },
  descriptor: {
    type: "FileSource"
  }
};
FileInput.prototype.attributeHandlers.allowUpload = {
  set: function (value) {
    this.domElt.allowUpload = value;
  },
  get: function () {
    return this.domElt.allowUpload;
  },
  descriptor: {
    type: 'bool'
  },
  export: function () {
    return this.domElt.allowUpload ? undefined : false;
  }
};
FileInput.prototype.attributeHandlers.removable = {
  set: function (value) {
    this.domElt.removable = value;
  },
  get: function () {
    return this.domElt.removable;
  },
  descriptor: {
    type: 'bool'
  },
  export: function () {
    return this.domElt.removable ? undefined : false;
  }
};
FileInput.prototype.attributeHandlers.downloadable = {
  set: function (value) {
    this.domElt.downloadable = value;
  },
  get: function () {
    return this.domElt.downloadable;
  },
  descriptor: {
    type: 'bool'
  },
  export: function () {
    return this.domElt.downloadable ? undefined : false;
  }
};
FileInput.prototype.attributeHandlers.accept = {
  set: function (value) {
    this.domElt.accept = value;
  },
  get: function () {
    return this.domElt.accept;
  },
  descriptor: {
    type: 'text'
  },
  export: function () {
    return this.domElt.accept || undefined;
  }
};
FileInput.prototype.attributeHandlers.directUpload = {
  descriptor: {
    type: 'bool'
  }
};

FileInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('change', function () {
    this.pinFire('value');
    this.notifyChange();
  }.bind(this));
  this.domElt.$input.on('click', function (event) {
    event.preventDefault();
    this.openFileDialog();
  }.bind(this));
};

FileInput.prototype.openFileDialog = function () {
  if (!this.attributes.directUpload && window.contentModule && window.contentModule.chooseFile) {
    window.contentModule.chooseFile({
      accept: this.attributes.accept
    }).then(function (result) {
      if (result && result.length > 0) result = result[0];

      if (result) {
        this.attributes.value = result;
      }
    }.bind(this));
  } else {
    (0, _utils.openFileDialog)({
      accept: this.attributes.accept
    }).then(function (files) {
      if (files && files.length > 0) {
        this.attributes.value = files[0];
      }
    }.bind(this));
  }
};

FileInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.attributes.value = value;
    },
    get: function () {
      return thisC.attributes.value;
    }
  };
};

_Assembler.AssemblerInstance.addClass(FileInput);

var _default = FileInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/ImageFileInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/ImageFileInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

require("../../css/imagefileinput.css");

var _utils = require("absol-acomp/js/utils");

var _Assembler = require("../core/Assembler");

var _FileInput = _interopRequireDefault(require("./FileInput"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function ImageFileInput() {
  _ScalableComponent.default.call(this);

  this._imageSrc = undefined;
}

(0, _inheritComponentClass.default)(ImageFileInput, _ScalableComponent.default);
ImageFileInput.prototype.tag = "ImageFileInput";
ImageFileInput.prototype.menuIcon = "span.mdi.mdi-image-plus";
ImageFileInput.prototype._defaultBackgroundImg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiICB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+CiAgIDxwYXRoIGZpbGw9IiNhYWFhYWEiIGQ9Ik01LDNBMiwyIDAgMCwwIDMsNVYxOUEyLDIgMCAwLDAgNSwyMUgxNC4wOUMxNC4wMywyMC42NyAxNCwyMC4zNCAxNCwyMEMxNCwxOS4zMiAxNC4xMiwxOC42NCAxNC4zNSwxOEg1TDguNSwxMy41TDExLDE2LjVMMTQuNSwxMkwxNi43MywxNC45N0MxNy43LDE0LjM0IDE4Ljg0LDE0IDIwLDE0QzIwLjM0LDE0IDIwLjY3LDE0LjAzIDIxLDE0LjA5VjVDMjEsMy44OSAyMC4xLDMgMTksM0g1TTE5LDE2VjE5SDE2VjIxSDE5VjI0SDIxVjIxSDI0VjE5SDIxVjE2SDE5WiIgLz4KPC9zdmc+';
ImageFileInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var ref = arguments[arguments.length - 1];
    var prev = ref.get();

    if (typeof value === 'string') {
      this._imageSrc = value;
    } else if (value instanceof File || value instanceof Blob) {
      this._imageSrc = URL.createObjectURL(value);
    } else if (value && value.url) {
      this._imageSrc = value.url;
    } else {
      this._imageSrc = undefined;
      value = null;
    }

    if (this._imageSrc) {
      this.$img.addStyle('backgroundImage', 'url(' + this._imageSrc + ')');
      this.domElt.addClass('as-has-file');
    } else {
      this.$img.addStyle('backgroundImage', 'url(' + this._defaultBackgroundImg + ')');
      this.domElt.removeClass('as-has-file');
    }

    ref.set(value); //set before send to pin

    if (!value !== !prev || value && prev && value !== prev) {
      this.pinFire('value');
      this.notifyChange();
    }

    return value;
  },
  descriptor: {
    type: "ImageSource",
    sign: 'ImageSource'
  },
  export: function () {
    return this._imageSrc;
  }
};
ImageFileInput.prototype.attributeHandlers.readonly = {
  set: function (value) {
    return !!value;
  },
  descriptor: {
    type: 'bool'
  },
  export: function () {
    return arguments[arguments.length - 1].get() || undefined;
  }
};
ImageFileInput.prototype.styleHandlers.previewSize = {
  set: function (value) {
    if (!['contain', 'cover'].includes(value)) value = 'contain';
    if (value === 'contain') this.$img.removeStyle('backgroundSize');else this.$img.addStyle('backgroundSize', value);
    return value;
  },
  export: function () {
    var value = arguments[arguments.length - 1];
    return value === 'contain' ? undefined : value;
  },
  descriptor: {
    type: 'enum',
    values: ['contain', 'cover']
  }
};
ImageFileInput.prototype.attributeHandlers.directUpload = _FileInput.default.prototype.attributeHandlers.directUpload;
ImageFileInput.prototype.pinHandlers.value = {
  get: function () {
    return this.attributes.value;
  },
  descriptor: {
    type: "ImageFile"
  }
};

ImageFileInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.readonly = false;
  this.style.previewSize = 'contain';
  this.attributes.value = null;
};

ImageFileInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('click', this.openImageFileDialog.bind(this));
};

ImageFileInput.prototype.openImageFileDialog = function () {
  if (!this.attributes.directUpload && window.contentModule && window.contentModule.chooseFile) {
    window.contentModule.chooseFile({
      type: "image_file"
    }).then(function (result) {
      if (result && result.length > 0) result = result[0];

      if (result) {
        this.attributes.value = result;
      }
    }.bind(this));
  } else {
    (0, _utils.openFileDialog)({
      accept: 'image/*'
    }).then(function (files) {
      if (files && files.length > 0) {
        this.attributes.value = files[0];
      }
    }.bind(this));
  }
};

ImageFileInput.prototype.render = function () {
  var res = _({
    class: 'asf-image-file-input',
    child: [{
      class: 'asf-image-file-input-img',
      style: {
        backgroundImage: 'url(' + this._defaultBackgroundImg + ')'
      }
    }]
  });

  this.$img = (0, _FCore.$)('.asf-image-file-input-img', res);
  return res;
};

ImageFileInput.prototype.getAcceptsStyleNames = function () {
  return _ScalableComponent.default.prototype.getAcceptsStyleNames.call(this).concat(['previewSize']);
};

ImageFileInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

_Assembler.AssemblerInstance.addClass(ImageFileInput);

var _default = ImageFileInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/Image.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/Image.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


var _ = _FCore.default._;
/**
 * @extends ScalableComponent
 * @constructor
 */

function Image() {
  _ScalableComponent.default.call(this);

  this.naturalWidth = 0;
  this.naturalHeight = 0;
  this.loadedSync = Promise.resolve([0, 0]);
}

(0, _inheritComponentClass.default)(Image, _ScalableComponent.default);
Image.prototype.tag = "Image";
Image.prototype.menuIcon = "span.mdi.mdi-image-outline";
Image.prototype.attributeHandlers.src = {
  set: function (value) {
    this.domElt.src = value;
  },
  get: function () {
    return this.domElt.src;
  },
  descriptor: {
    type: "text",
    long: true,
    sign: 'SimpleUrl'
  }
};
Image.prototype.attributeHandlers.naturalSize = {
  descriptor: function () {
    return {
      type: 'const',
      value: this.loadedSync.then(function (wh) {
        return wh.join(' x ');
      })
    };
  }
};
Image.prototype.pinHandlers.src = {
  receives: function (value) {
    this.attributes.src = value;
  }
};

Image.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.src = '';
};

Image.prototype.render = function () {
  return _('img');
};

Image.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.setAttribute('src', value);
    },
    get: function () {
      return thisC.getAttribute('src');
    }
  };
};

_Assembler.AssemblerInstance.addClass(Image);

var _default = Image;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/Table.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/Table.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _stringGenerate = require("absol/src/String/stringGenerate");


var _ = _FCore.default._;
var $ = _FCore.default.$;

function Table() {
  _ScalableComponent.default.call(this);
}

Object.defineProperties(Table.prototype, Object.getOwnPropertyDescriptors(_ScalableComponent.default.prototype));
Table.prototype.constructor = Table;
Table.prototype.tag = "Table";
Table.prototype.menuIcon = "span.mdi.mdi-table-large";

Table.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.header = this.attributes.header || [(0, _stringGenerate.randomPhrase)(10), (0, _stringGenerate.randomPhrase)(10), (0, _stringGenerate.randomPhrase)(10)];
  this.attributes.body = this.attributes.body || [[(0, _stringGenerate.randomPhrase)(10), (0, _stringGenerate.randomPhrase)(10), (0, _stringGenerate.randomPhrase)(10)], [(0, _stringGenerate.randomPhrase)(10), (0, _stringGenerate.randomPhrase)(10), (0, _stringGenerate.randomPhrase)(10)], [(0, _stringGenerate.randomPhrase)(10), (0, _stringGenerate.randomPhrase)(10), (0, _stringGenerate.randomPhrase)(10)]];
  this.style.height = 100;
  this.style.width = 300;
}; // Table.prototype.onCreated = function () {
//     ScalableComponent.prototype.onCreate.call(this);
// }


Table.prototype.render = function () {
  this.$table = _({
    tag: 'table',
    class: 'as-inner-table',
    child: ['thead', 'tbody']
  });
  return _({
    tag: 'tablescroller',
    child: this.$table,
    props: {
      fixedCol: 0
    }
  });
};

Table.prototype.setStyle = function () {
  var res = _ScalableComponent.default.prototype.setStyle.apply(this, arguments);

  return res;
};

Table.prototype.getAttributeHeaderDescriptor = function () {
  return {
    type: "array"
  };
};

Table.prototype.getAttributeBodyDescriptor = function () {
  return {
    type: "array2d"
  };
};

Table.prototype.getAttributeFixedColDescriptor = function () {
  return {
    type: "number",
    min: 0,
    max: Infinity
  };
};

Table.prototype.setAttributeHeader = function (header) {
  if (!(header.length > 0)) {
    header = ["Data Error"];
  }

  var headerElt = $('thead', this.$table).clearChild();
  headerElt.clearChild();

  var rowElt = _('tr');

  var cellElt;

  for (var i = 0; i < header.length; ++i) {
    cellElt = _({
      tag: 'th',
      child: {
        text: header[i] + ''
      }
    });
    rowElt.addChild(cellElt);
  }

  headerElt.addChild(rowElt);

  this.view._updateContent();

  return header;
};

Table.prototype.setAttributeBody = function (body) {
  if (!(body.length > 0)) {
    body = [["Data Error"]];
  }

  var bodyElt = $('tbody', this.$table).clearChild();
  var rowElt; // var cellElt;

  var row, cell;

  for (var i = 0; i < body.length; ++i) {
    row = body[i];
    rowElt = _('tr').addTo(bodyElt);

    for (var j = 0; j < row.length; ++j) {
      cell = row[j];

      _({
        tag: 'td',
        child: {
          text: cell + ''
        }
      }).addTo(rowElt);
    }
  }

  this.view._updateContent();

  return body;
};

Table.prototype.setAttributeFixedCol = function (value) {
  if (value >= 0) {} else {
    value = 0;
  }

  this.view.fixedCol = value;
  return value;
};

var _default = Table;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/Button.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/Button.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _TextStyleHandlers = _interopRequireDefault(require("./handlers/TextStyleHandlers"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function Button() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(Button, _ScalableComponent.default);
Button.prototype.tag = "Button";
Button.prototype.menuIcon = "span.mdi.mdi-alpha-b-box";
Object.assign(Button.prototype.styleHandlers, _TextStyleHandlers.default);
Object.assign(Button.prototype.attributeHandlers, _InputAttributeHandlers.default);
Button.prototype.attributeHandlers.text = {
  set: function (value) {
    this.domElt.text = value;
  },
  get: function () {
    return this.domElt.text;
  },
  descriptor: {
    type: "text",
    sign: 'SimpleText'
  }
};
Button.prototype.attributeHandlers.icon = {
  set: function (value) {
    this.domElt.icon = value;
  },
  get: function () {
    return this.domElt.icon;
  },
  descriptor: {
    type: "icon",
    sign: "SimpleIcon"
  }
};
Button.prototype.attributeHandlers.disabled = {
  set: function (value) {
    this.domElt.disabled = !!value;
  },
  get: function () {
    return this.domElt.disabled;
  },
  descriptor: {
    type: 'bool'
  }
};
Button.prototype.pinHandlers.signal = {
  get: function () {
    return true;
  },
  descriptor: {
    type: "bool"
  }
};
Button.prototype.pinHandlers.disabled = {
  receives: function (value) {
    this.attributes.disabled = value;
  },
  descriptor: {
    type: "bool"
  }
};
Button.prototype.colorThemeList = ['default', 'primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark', 'link'];
Button.prototype.styleHandlers.colorTheme = {
  set: function (value) {
    if (this.colorThemeList.indexOf(value) < 0) value = this.colorThemeList[0];
    var currentValue = arguments[arguments.length - 1].get();
    this.domElt.removeClass(currentValue || 'default').addClass(value);
    return value;
  },
  descriptor: {
    type: 'enum',
    values: Button.prototype.colorThemeList
  }
};

Button.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.text = this.attributes.name;
  this.attributes.icon = 'span.mdi.mdi-format-font';
  this.style.colorTheme = 'default';
  this.style.font = 'none';
};

Button.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  var self = this;
  this.domElt.on('click', function (event) {
    self.emit('click', {
      type: 'click',
      target: this,
      originEvent: event.originEvent || event
    }, self);
    self.pinFire('signal');
  });
};

Button.prototype.render = function () {
  return _('flexiconbutton');
};

Button.prototype.getAcceptsEventNames = function () {
  return _ScalableComponent.default.prototype.getAcceptsEventNames.call(this).concat(['click']);
};

Button.prototype.measureMinSize = function () {
  var fontSize = this.domElt && this.domElt.getFontSize() || 14;
  return {
    width: fontSize * 2 + 2,
    height: fontSize * 2 + 2
  };
};

_Assembler.AssemblerInstance.addClass(Button);

var _default = Button;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/ArrayOfFragment.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/ArrayOfFragment.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _FCore = require("../core/FCore");

var _Assembler = require("../core/Assembler");

require("../../css/arrayoffragment.css");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


/***
 * @extends ScalableComponent
 * @constructor
 */
function ArrayOfFragment() {
  _ScalableComponent.default.call(this);

  this.fragments = [];

  this._makeArray();
}

(0, _inheritComponentClass.default)(ArrayOfFragment, _ScalableComponent.default);
ArrayOfFragment.prototype.tag = "ArrayOfFragment";
ArrayOfFragment.prototype.menuIcon = "span.mdi.mdi-tray-full";
ArrayOfFragment.prototype.styleHandlers.itemSpacing = {
  set: function (value) {
    this.domElt.addStyle('--as-aof-item-spacing', value + 'px');
    return value;
  },
  descriptor: {
    type: 'measureSize',
    units: ['px']
  },
  export: function () {
    var ref = arguments[arguments.length - 1];
    var value = ref.get();
    if (value === 10) return undefined;
    return value;
  }
};

ArrayOfFragment.prototype.render = function () {
  return (0, _FCore._)({
    class: 'as-array-of-fragment'
  });
};

ArrayOfFragment.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.style.itemSpacing = 10;
};

ArrayOfFragment.prototype.attributeHandlers.itemFragmentClass = {
  descriptor: {
    type: 'fragmentClass'
  }
};
ArrayOfFragment.prototype.attributeHandlers.disabled = {
  set: function (value) {
    if (value) this.domElt.addClass('as-disabled');else this.domElt.removeClass('as-disabled');
  },
  get: function () {
    return this.domElt.containsClass('as-disabled');
  },
  descriptor: {
    type: 'bool'
  }
};

ArrayOfFragment.prototype._clearAllFragment = function () {
  this.domElt.clearChild();
};

ArrayOfFragment.prototype._makeArray = function () {
  if (this._dataArr) return;
  var self = this;
  this._dataArr = [];

  this._dataArr.push = function () {
    this.splice.apply(this, [this.length, this.length].concat(Array.prototype.slice.apply(arguments)));
    return arguments.length;
  };

  var oUnShift = this._dataArr.unshift;

  this._dataArr.unshift = function () {
    var newItems = Array.prototype.slice.call(arguments);
    self.notifyChange();
    return oUnShift.apply(this._array, newItems);
  };

  this._dataArr.pop = function () {
    if (this.length <= 0) return undefined;
    var res = this[this.length - 1];
    this.slice(this.length - 1, this.length);
    self.notifyChange();
    return res;
  };

  this._dataArr.shift = function () {
    if (this.length <= 0) return undefined;
    var res = this[0];
    this.slice(0, 1);
    self.notifyChange();
    return res;
  };

  this._dataArr.splice = function () {
    var start;
    var end;
    var addedItems;
    if (arguments.length < 1) start = 0;else start = arguments[0];
    if (arguments.length < 2) end = this.length;else end = arguments[1];
    if (start < 0) start = this.length - start;
    if (end < 0) end = this.length - end;
    start = Math.max(0, start);
    end = Math.max(start, end);
    if (arguments.length > 2) addedItems = Array.prototype.slice.call(arguments, 2);else addedItems = [];
    var className = self.getAttribute('itemFragmentClass');
    var newFragments = addedItems.map(function (item) {
      var frag = _Assembler.AssemblerInstance.buildFragment({
        class: className
      });

      frag.props = item;
      return frag;
    });
    var endElt = self.fragments[end] && self.fragments[end].domElt;
    var removedFragments = self.fragments.splice.apply(self.fragments, [start, end].concat(newFragments));
    removedFragments.forEach(function (frg) {
      self.fragment.removeChild(frg);
      frg.domElt.remove();
    });
    newFragments.forEach(function (frg) {
      if (endElt) self.domElt.addChildBefore(frg.domElt, endElt);else self.domElt.addChild(frg.domElt);
      self.fragment.addChild(frg);
    });
    var newBindItems = newFragments.map(function (frg) {
      return frg.props;
    });
    self.notifyChange();
    return Array.prototype.splice.apply(this, [start, end].concat(newBindItems));
  };
};

ArrayOfFragment.prototype.createDataBindingDescriptor = function () {
  var self = this;
  return {
    set: function (value) {
      value = value || [];
      if (!value.slice) value = [];

      self._dataArr.splice.apply(self._dataArr, [0, self._dataArr.length].concat(value));
    },
    get: function () {
      return self._dataArr;
    }
  };
};

var _default = ArrayOfFragment;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/EditableArrayOfFragment.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/EditableArrayOfFragment.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../core/FCore");

var _Assembler = require("../core/Assembler");

var _ArrayOfFragment = _interopRequireDefault(require("./ArrayOfFragment"));

var _FlexiconButton = _interopRequireDefault(require("absol-acomp/js/FlexiconButton"));

require("../../css/editablearrayoffragment.css");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


/***
 * @extends ArrayOfFragment
 * @constructor
 */
function EditableArrayOfFragment() {
  _ArrayOfFragment.default.call(this);

  this.fragments = [];

  this._makeArray();
}

(0, _inheritComponentClass.default)(EditableArrayOfFragment, _ArrayOfFragment.default);
EditableArrayOfFragment.prototype.tag = "EditableArrayOfFragment";
EditableArrayOfFragment.prototype.menuIcon = "span.mdi.mdi-tray-full";

EditableArrayOfFragment.prototype.render = function () {
  return (0, _FCore._)({
    class: 'as-editable-array-of-fragment',
    child: ['.as-editable-array-of-fragment-item-list', {
      class: 'as-editable-array-of-fragment-bottom',
      child: [{
        tag: _FlexiconButton.default.tag,
        props: {
          text: 'LanguageModule' in window ? LanguageModule.text('txt_add') : 'Add'
        }
      }]
    }]
  });
};

EditableArrayOfFragment.prototype.onCreated = function () {
  this.$list = (0, _FCore.$)('.as-editable-array-of-fragment-item-list', this.domElt);
  this.$addBtn = (0, _FCore.$)('.as-editable-array-of-fragment-bottom .as-flexicon-button', this.domElt).on('click', this.addNewRow.bind(this));

  _ArrayOfFragment.default.prototype.onCreated.call(this);
};

EditableArrayOfFragment.prototype.getAttributeItemFragmentClassDescriptor = function () {
  return {
    type: 'fragmentClass'
  };
};

EditableArrayOfFragment.prototype._makeArray = function () {
  if (this._dataArr) return;
  var self = this;
  this._dataArr = [];

  this._dataArr.push = function () {
    this.splice.apply(this, [this.length, this.length].concat(Array.prototype.slice.apply(arguments)));
    self.notifyChange();
    return arguments.length;
  };

  var oUnShift = this._dataArr.unshift;

  this._dataArr.unshift = function () {
    var newItems = Array.prototype.slice.call(arguments);
    self.notifyChange();
    return oUnShift.apply(this._array, newItems);
  };

  this._dataArr.pop = function () {
    if (this.length <= 0) return undefined;
    var res = this[this.length - 1];
    this.slice(this.length - 1, this.length);
    self.notifyChange();
    return res;
  };

  this._dataArr.shift = function () {
    if (this.length <= 0) return undefined;
    var res = this[0];
    this.slice(0, 1);
    self.notifyChange();
    return res;
  };

  this._dataArr.splice = function () {
    var start;
    var deleteCount;
    var addedItems;
    if (arguments.length < 1) start = 0;else start = arguments[0];
    if (start < 0) start = this.length - start;
    start = Math.max(0, start);
    if (arguments.length < 2) deleteCount = this.length - start;else deleteCount = arguments[1];
    if (deleteCount < 0) deleteCount = 0;
    deleteCount = Math.min(deleteCount, this.length - start);
    if (arguments.length > 2) addedItems = Array.prototype.slice.call(arguments, 2);else addedItems = [];
    var className = self.getAttribute('itemFragmentClass');
    var newFragments = addedItems.map(function (item) {
      var frag = _Assembler.AssemblerInstance.buildFragment({
        class: className
      });

      frag.props = item;
      return frag;
    });
    var endCtnElt = self.fragments[start + deleteCount] && self.fragments[start + deleteCount].domElt.parentElement;
    var removedFragments = self.fragments.splice.apply(self.fragments, [start, deleteCount].concat(newFragments));
    removedFragments.forEach(function (frg) {
      self.fragment.removeChild(frg);
      frg.domElt.parentElement.remove();
    });
    newFragments.forEach(function (frg) {
      self.fragment.addChild(frg);
      var itemCtn = (0, _FCore._)({
        class: 'as-editable-array-of-fragment-item',
        child: [frg.domElt, {
          class: ['as-editable-array-of-fragment-remove-btn-ctn'],
          child: {
            tag: 'button',
            class: 'as-from-tool-button',
            child: 'span.mdi.mdi-delete',
            on: {
              click: function () {
                var eventData = {};
                eventData.type = 'cmd_remove_row';

                var idx = self._dataArr.indexOf(frg.props);

                eventData.rowIdx = idx;
                eventData.accepted = true;

                eventData.accept = function (isAccepted) {
                  this.accepted = isAccepted;
                };

                self.emit(eventData.type, eventData, self);

                if (eventData.accepted && eventData.accepted.then) {
                  eventData.accepted.then(function (isAccept) {
                    if (isAccept) {
                      if (idx >= 0) self._dataArr.splice(idx, 1);
                    }
                  });
                } else if (eventData.accepted) {
                  if (idx >= 0) self._dataArr.splice(idx, 1);
                }
              }
            }
          }
        }]
      });
      if (endCtnElt) self.$list.addChildBefore(itemCtn, endCtnElt);else self.$list.addChild(itemCtn);
    });
    var newBindItems = newFragments.map(function (frg) {
      return frg.props;
    });
    self.notifyChange();
    return Array.prototype.splice.apply(this, [start, deleteCount].concat(newBindItems));
  };
};

EditableArrayOfFragment.prototype.createDataBindingDescriptor = function () {
  var self = this;
  return {
    set: function (value) {
      value = value || [];
      if (!value.slice) value = [];

      self._dataArr.splice.apply(self._dataArr, [0, self._dataArr.length].concat(value));
    },
    get: function () {
      return self._dataArr;
    }
  };
};

EditableArrayOfFragment.prototype.addNewRow = function () {
  var eventData = {};
  eventData.type = 'cmd_insert_row';
  eventData.rowIdx = this._dataArr.length;
  eventData.result = {};

  eventData.resolve = function (result) {
    this.result = result;
  };

  var self = this;
  self.emit(eventData.type, eventData, self);

  if (eventData.result) {
    if (eventData.result.then) {
      eventData.result.then(function (result) {
        if (result) {
          self._dataArr.push(result);
        }
      });
    } else {
      self._dataArr.push(eventData.result);
    }
  }
};

_Assembler.AssemblerInstance.addClass(EditableArrayOfFragment);

var _default = EditableArrayOfFragment;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/core/BaseShape.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/core/BaseShape.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

require("../../css/component.css");

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _inheritComponentClass = _interopRequireDefault(require("./inheritComponentClass"));


var _ = _Svg.default.ShareInstance._;
var $ = _Svg.default.ShareInstance.$;

function BaseShape() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(BaseShape, _ScalableComponent.default);
BaseShape.prototype.tag = "BaseShape";
BaseShape.prototype.style.fillColor = 'red';
BaseShape.prototype.style.strokeColor = 'blue';
BaseShape.prototype.style.strokeWidth = 1;
BaseShape.prototype.style.width = 30;
BaseShape.prototype.style.height = 30;

BaseShape.prototype.onDomCreated = function () {
  this.$content = $('.as-base-shape-content', this.domElt);
};

BaseShape.prototype.render = function () {
  return _({
    tag: 'svg',
    class: 'as-base-shape',
    child: [this.renderContent().addClass('as-base-shape-content'), {
      tag: 'attachhook',
      on: {
        attached: this.updateShape.bind(this)
      }
    }]
  });
};

BaseShape.prototype.renderContent = function () {
  throw new Error('Not Implement!');
};

BaseShape.prototype.onSizeChange = function () {
  this.updateShape();
};

BaseShape.prototype.updateShape = function () {//not implement
};

BaseShape.prototype.styleHandlers.fillColor = {
  set: function (value) {
    var color = undefined;

    if (!(color instanceof _Color.default)) {
      try {
        color = _Color.default.parse(value);
      } catch (error) {
        color = undefined;
      }
    }

    color = color || new _Color.default([0, 0, 0, 0]);
    value = color.toString();
    this.$content.addStyle('fill', value);
    return value;
  },
  descriptor: {
    type: 'color',
    sign: 'FillColor'
  }
};
BaseShape.prototype.styleHandlers.strokeColor = {
  set: function (value) {
    var color = undefined;

    if (!(color instanceof _Color.default)) {
      try {
        color = _Color.default.parse(value);
      } catch (error) {
        color = undefined;
      }
    }

    color = color || new _Color.default([0, 0, 0, 0]);
    value = color.toString();
    this.$content.addStyle('stroke', value);
    return value;
  },
  descriptor: {
    type: 'color',
    sign: 'StrokeColor'
  }
};
BaseShape.prototype.styleHandlers.strokeWidth = {
  set: function (value) {
    var ref = arguments[arguments.length - 1];
    this.$content.addStyle('strokeWidth', value + '');
    ref.set(value);
    this.updateShape();
    return value;
  },
  descriptor: {
    type: 'number'
  }
};
var _default = BaseShape;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/shapes/Ellipse.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/shapes/Ellipse.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _BaseShape = _interopRequireDefault(require("../core/BaseShape"));

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


var _ = _Svg.default.ShareInstance._;
var $ = _Svg.default.ShareInstance.$;
/***
 * @extends BaseShape
 * @constructor
 */

function Ellipse() {
  _BaseShape.default.call(this);
}

(0, _inheritComponentClass.default)(Ellipse, _BaseShape.default);
Ellipse.prototype.tag = "Ellipse";
Ellipse.prototype.menuIcon = "span.mdi.mdi-ellipse-outline";

Ellipse.prototype.renderContent = function () {
  return _('ellipse');
};

Ellipse.prototype.setStyleStrokeWidth = function (value) {
  value = _BaseShape.default.prototype.setStyleStrokeWidth.call(this, value);
  if (this.$content) this.$content.addStyle('strokeWidth', value + '');
  this.updateShape();
  return value;
};

Ellipse.prototype.updateShape = function () {
  if (!this.domElt) return;
  var bound = this.view.getBoundingClientRect();
  this.$content.addStyle({
    cx: bound.width / 2 + '',
    cy: bound.height / 2 + '',
    rx: Math.max(bound.width - this.style.strokeWidth - 0.1, 0) / 2 + '',
    // prevent miss some pixel
    ry: Math.max(bound.height - this.style.strokeWidth - 0.1, 0) / 2 + ''
  });
};

_Assembler.AssemblerInstance.addClass(Ellipse);

var _default = Ellipse;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/shapes/Rectangle.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/shapes/Rectangle.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _BaseShape = _interopRequireDefault(require("../core/BaseShape"));

var _Ellipse = _interopRequireDefault(require("./Ellipse"));

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


var _ = _Svg.default.ShareInstance._;
var $ = _Svg.default.ShareInstance.$;

function Rectangle() {
  _BaseShape.default.call(this);
}

(0, _inheritComponentClass.default)(Rectangle, _BaseShape.default);
Rectangle.prototype.tag = "Rectangle";
Rectangle.prototype.menuIcon = "span.mdi.mdi-rectangle-outline";

_BaseShape.default.prototype.onCreate = function () {
  _BaseShape.default.prototype.onCreate.call(this);

  this.style.roundCornerX = 0;
  this.style.roundCornerY = 0;
};

Rectangle.prototype.renderContent = function () {
  return _('rect');
};

Rectangle.prototype.setStyleRoundCornerX = function (value) {
  if (!(value >= 0)) value = 0;

  if (this.$content) {
    this.$content.attr('rx', value === 0 ? undefined : value + '');
  }

  return value;
};

Rectangle.prototype.setStyleRoundCornerY = function (value) {
  if (!(value >= 0)) value = 0;
  if (this.$content) this.$content.attr('ry', value === 0 ? undefined : value + '');
  return value;
};

Rectangle.prototype.getStyleRoundCornerXDescriptor = function () {
  return {
    type: 'number',
    min: 0,
    max: Infinity,
    sign: 'ShapeRoundCornerX'
  };
};

Rectangle.prototype.getStyleRoundCornerYDescriptor = function () {
  return {
    type: 'number',
    min: 0,
    max: Infinity,
    sign: 'ShapeRoundCornerY'
  };
};

Rectangle.prototype.updateShape = function () {
  var bound = this.view.getBoundingClientRect();
  this.$content.attr({
    x: (this.style.strokeWidth + 0.1) / 2,
    y: (this.style.strokeWidth + 0.1) / 2,
    width: Math.max(0, bound.width - this.style.strokeWidth - 0.1) + '',
    height: Math.max(0, bound.height - this.style.strokeWidth - 0.1) + ''
  });
};

_Assembler.AssemblerInstance.addClass(Rectangle);

var _default = Rectangle;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/DateTimeInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/DateTimeInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _FCore = require("../core/FCore");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _datetime = require("absol/src/Time/datetime");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




function removeTimeFormat(format) {
  if (!format) return null;
  return format.replace(/[hH].+$/g, '');
}
/***
 * @extends ScalableComponent
 * @constructor
 */


function DateTimeInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(DateTimeInput, _ScalableComponent.default);
DateTimeInput.prototype.tag = 'DateTimeInput';
DateTimeInput.prototype.menuIcon = 'span.mdi.mdi-calendar-clock';

DateTimeInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.style.width = 174;
  this.style.height = 30;
  this.attributes.format = 'dd/MM/yyyy hh:mm a';
};

Object.assign(DateTimeInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(DateTimeInput.prototype.styleHandlers, _InputStyleHandlers.default);
DateTimeInput.prototype.attributeHandlers.format = {
  set: function (value) {
    this.$datetimeInput.format = value;
    if (this.$dateInput) this.$dateInput.format = removeTimeFormat(value);
  },
  get: function () {
    return this.domElt.format;
  },
  descriptor: {
    type: 'DateTimeFormat'
  },
  export: function () {
    var value = this.format;
    if (value === 'dd/MM/yyyy hh:mm a') return undefined;
    return value;
  }
};
DateTimeInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.$datetimeInput.value;
    this.$datetimeInput.value = value;

    if (this.$dateInput) {
      this.$dateInput.value = this.$datetimeInput.value ? (0, _datetime.beginOfDay)(this.$datetimeInput.value) : null;
    }

    var cur = this.domElt.value;

    if (!prev !== !cur || prev && cur && prev.getTime() === cur.getTime()) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'DateTime'
  },
  export: function () {
    return this.value || undefined;
  }
};
DateTimeInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.attributes.value;
  },
  descriptor: {
    type: "Date"
  }
};
DateTimeInput.prototype.attributeHandlers.dateOnly = {
  set: function (value) {
    value = !!value;
    var isDateOnly = this.$dateInput === this.domElt;
    if (isDateOnly === value) return;
    var oldElt = this.domElt;
    var prentElt = oldElt.parentElement;
    var newElt;

    if (value) {
      if (!this.$dateInput) {
        this.$dateInput = (0, _FCore._)({
          tag: 'dateinput',
          class: 'as-base-component',
          on: {
            change: function () {
              this.$datetimeInput.value = this.$dateInput.value;
              this.pinFire('value');
              this.notifyChange();
            }.bind(this)
          }
        });
      }

      newElt = this.$dateInput;

      if (this.$datetimeInput.value) {
        newElt.value = (0, _datetime.beginOfDay)(this.$datetimeInput.value);
      } else {
        newElt.value = null;
      }
    } else {
      newElt = this.$datetimeInput;
    }

    var style = Object.assign({}, this.style);

    if (prentElt) {
      oldElt.selfReplace(newElt);
    }

    this.domElt = newElt;
    Object.assign(this.style, style);
    this.pinFire('value');
    this.notifyChange();
  },
  get: function () {
    return this.$dateInput === this.domElt;
  },
  descriptor: {
    type: 'bool'
  }
};

DateTimeInput.prototype.onCreated = function () {
  this.$dateInput = null;
  this.$datetimeInput.on('change', function () {
    this.pinFire('value');
    this.notifyChange();
  }.bind(this));
};

DateTimeInput.prototype.render = function () {
  this.$datetimeInput = (0, _FCore._)({
    tag: 'datetimeinput'
  });
  return this.$datetimeInput;
};

DateTimeInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.attributes.value = value;
    },
    get: function () {
      return thisC.attributes.value;
    }
  };
};

_Assembler.AssemblerInstance.addClass(DateTimeInput);

var _default = DateTimeInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/Time24Input.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/Time24Input.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _datetime = require("absol/src/Time/datetime");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function Time24Input() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(Time24Input, _ScalableComponent.default); //5p

Time24Input.prototype.tag = "Time24Input";
Time24Input.prototype.menuIcon = "span.mdi.mdi-clock-end";
Object.assign(Time24Input.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(Time24Input.prototype.attributeHandlers, _InputStyleHandlers.default);
Time24Input.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    this.domElt.value = value;

    if (this.domElt.value !== value) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'number',
    min: 0,
    max: _datetime.MILLIS_PER_DAY - 1
  }
};
Time24Input.prototype.attributeHandlers.offset = {
  set: function (value) {
    this.domElt.dayOffset = value;
  },
  get: function () {
    return this.domElt.dayOffset;
  },
  descriptor: {
    type: 'number',
    min: 0,
    max: _datetime.MILLIS_PER_DAY - 1
  }
};
Time24Input.prototype.attributeHandlers.format = {
  set: function (value) {
    this.domElt.format = value;
  },
  get: function () {
    return this.domElt.format;
  },
  export: function () {
    if (this.domElt.format === 'hh:mm a') return undefined;
    return this.domElt.format;
  },
  descriptor: {
    type: 'enum',
    values: ['hh:mm a', 'HH:mm']
  }
};
Time24Input.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.attributes.value;
  },
  descriptor: {
    type: 'number'
  }
};
Time24Input.prototype.pinHandlers.offset = {
  receives: function (value) {
    this.attributes.offset = value;
  },
  descriptor: {
    type: 'number'
  }
};

Time24Input.prototype.render = function () {
  return _('time24input');
};

Time24Input.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.value = null;
  this.attributes.format = 'HH:mm';
  this.style.width = 160;
  this.style.height = 30;
};

Time24Input.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('change', function () {
    this.pinFire('value');
    this.notifyChange();
  }.bind(this));
};

Time24Input.prototype.getAcceptsEventNames = function () {
  return _ScalableComponent.default.prototype.getAcceptsEventNames.call(this).concat(['change']);
};

Time24Input.prototype.measureMinSize = function () {
  return {
    width: 75,
    height: 16
  };
};

Time24Input.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

_Assembler.AssemblerInstance.addClass(Time24Input);

var _default = Time24Input;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TimeRange24Input.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TimeRange24Input.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../core/FCore");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _Assembler = require("../core/Assembler");

var _datetime = require("absol/src/Time/datetime");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _InputAttributeHandlers = _interopRequireDefault(require("./handlers/InputAttributeHandlers"));


/***
 * @extends ScalableComponent
 * @constructor
 */
function TimeRange24Input() {
  _ScalableComponent.default.apply(this, arguments);
}

(0, _inheritComponentClass.default)(TimeRange24Input, _ScalableComponent.default);
TimeRange24Input.prototype.tag = 'TimeRange24Input';
TimeRange24Input.prototype.menuIcon = 'span.mdi.mdi-timelapse';

TimeRange24Input.prototype.render = function () {
  return (0, _FCore._)('timerange24input');
};

TimeRange24Input.prototype.measureMinSize = function () {
  return {
    height: 30,
    width: 318
  };
};

TimeRange24Input.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.apply(this, arguments);

  var self = this;
  this.domElt.on('change', function (event) {
    if (self.pinHandlers[event.property]) self.pinFire(event.property);
    self.pinFire('value');
    self.notifyChange();
  });
};

Object.assign(TimeRange24Input.prototype.styleHandlers, _InputStyleHandlers.default);
Object.assign(TimeRange24Input.prototype.attributeHandlers, _InputAttributeHandlers.default);
TimeRange24Input.prototype.attributeHandlers.dayOffset = {
  set: function (value) {
    var prev = this.domElt.dayOffset;
    this.domElt.dayOffset = value;

    if (prev !== this.domElt.dayOffset) {
      this.pinFire('dayOffset');
      this.pinFire('value');
    }
  },
  get: function () {
    return this.domElt.dayOffset;
  },
  descriptor: {
    type: 'number',
    min: 0,
    max: _datetime.MILLIS_PER_DAY
  }
};
TimeRange24Input.prototype.attributeHandlers.duration = {
  set: function (value) {
    var prev = this.domElt.duration;
    this.domElt.duration = value;

    if (prev !== this.domElt.duration) {
      this.pinFire('duration');
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.duration;
  },
  descriptor: {
    type: 'number',
    min: 0,
    max: _datetime.MILLIS_PER_DAY
  }
};
TimeRange24Input.prototype.attributeHandlers.notNull = {
  set: function (value) {
    this.domElt.notNull = !!value;
  },
  get: function () {
    return this.domElt.notNull;
  },
  export: function () {
    if (this.domElt.notNull) return undefined;
    return this.domElt.notNull;
  },
  descriptor: {
    type: 'bool'
  }
};
TimeRange24Input.prototype.pinHandlers.duration = {
  get: function () {
    return this.attributes.duration;
  },
  receives: function (value) {
    this.attributes.duration = value;
  },
  descriptor: {
    type: 'number'
  }
};
TimeRange24Input.prototype.pinHandlers.dayOffset = {
  get: function () {
    return this.attributes.dayOffset;
  },
  receives: function (value) {
    this.attributes.dayOffset = value;
  },
  descriptor: {
    type: 'number'
  }
};
TimeRange24Input.prototype.pinHandlers.value = {
  get: function () {
    return {
      dayOffset: this.attributes.dayOffset,
      duration: this.attributes.duration
    };
  },
  receives: function (value) {
    value = value || {};

    if ('dayOffset' in value) {
      this.attributes.dayOffset = value.dayOffset;
    }

    if ('duration' in value) {
      this.attributes.duration = value.duration;
    }
  },
  descriptor: {
    type: 'object'
  }
}; //mock attribute

['minStart', 'maxStart', 'minEnd', 'maxEnd', 'minDuration', 'maxDuration'].forEach(name => {
  TimeRange24Input.prototype.attributeHandlers[name] = {
    descriptor: {
      type: 'number'
    }
  };
  TimeRange24Input.prototype.pinHandlers[name] = {
    receives: function (value) {
      this.attributes[name] = value;
    }
  };
});

TimeRange24Input.prototype.createDataBindingDescriptor = function () {
  var self = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    dayOffset: {
      set: function (value) {
        self.attributes.dayOffset = value;
      },
      get: function () {
        return self.attributes.dayOffset;
      },
      configurable: true,
      enumerable: true
    },
    duration: {
      set: function (value) {
        self.attributes.duration = value;
      },
      get: function () {
        return self.attributes.duration;
      },
      configurable: true,
      enumerable: true
    }
  });
  return {
    set: function (props) {
      props = props || {};
      if ('dayOffset' in props) subObj.dayOffset = props.dayOffset;
      if ('duration' in props) subObj.duration = props.duration;
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(TimeRange24Input);

var _default = TimeRange24Input;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/MultiSelectTreeComboBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/MultiSelectTreeComboBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _FCore = require("../core/FCore");

var _MultiCheckTreeMenu = _interopRequireDefault(require("absol-acomp/js/MultiCheckTreeMenu"));

var _InputAttributeHandlers = _interopRequireDefault(require("./handlers/InputAttributeHandlers"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _MultiselectComboBoxHandlers = require("./handlers/MultiselectComboBoxHandlers");

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _MultiCheckTreeMenu2 = _interopRequireDefault(require("absol-acomp/js/multichecktreemenu/MultiCheckTreeMenu"));


/***
 * @extends ScalableComponent
 * @constructor
 */
function MultiSelectTreeComboBox() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(MultiSelectTreeComboBox, _ScalableComponent.default);
MultiSelectTreeComboBox.prototype.style.height = 'auto';
MultiSelectTreeComboBox.prototype.tag = 'MultiSelectTreeComboBox';

MultiSelectTreeComboBox.prototype.render = function () {
  return (0, _FCore._)({
    tag: _BrowserDetector.default.isMobile ? _MultiCheckTreeMenu2.default : _MultiCheckTreeMenu.default
  });
};

MultiSelectTreeComboBox.prototype.onCreated = function () {
  this.domElt.on('change', function () {
    this.pinFire('values');
    this.pinFire('text');
    this.notifyChange();
  }.bind(this));
};

Object.assign(MultiSelectTreeComboBox.prototype.attributeHandlers, _InputAttributeHandlers.default, _MultiselectComboBoxHandlers.MultiselectComboBoxAttributeHandlers);
Object.assign(MultiSelectTreeComboBox.prototype.styleHandlers, _InputStyleHandlers.default);
Object.assign(MultiSelectTreeComboBox.prototype.pinHandlers, _MultiselectComboBoxHandlers.MultiselectComboBoxPinHandlers);
MultiSelectTreeComboBox.prototype.attributeHandlers.leafOnly = {
  set: function (value) {
    this.domElt.leafOnly = !!value;
  },
  get: function () {
    return this.domElt.leafOnly;
  },
  export: function () {
    return this.domElt.leafOnly || undefined;
  },
  descriptor: {
    type: 'bool'
  }
};
MultiSelectTreeComboBox.prototype.attributeHandlers.values = {
  set: function (values) {
    var prev = this.domElt.values;
    this.domElt.values = values || [];
    var cur = this.domElt.values;
    var changed = prev.length !== cur.length;
    var pDict;

    if (!changed) {
      pDict = prev.reduce(function (ac, cr) {
        ac[cr] = true;
        return ac;
      }, {});
      changed = cur.some(function (val) {
        return !pDict[val];
      });
    }

    if (changed) {
      this.pinFire('values');
      this.pinFire('text');
    }
  },
  get: function () {
    return this.domElt.values;
  },
  descriptor: {
    type: 'string[]|number[]'
  }
};
MultiSelectTreeComboBox.prototype.pinHandlers.values = {
  receives: function (values) {
    this.attributes.values = values || [];
  },
  get: function () {
    return this.attributes.values;
  },
  descriptor: {
    type: 'string[]|number[]'
  }
};
MultiSelectTreeComboBox.prototype.pinHandlers.list = {
  receives: function (items) {
    this.attributes.items = items;
  },
  descriptor: {
    type: 'CheckTreeList'
  }
};
MultiSelectTreeComboBox.prototype.pinHandlers.treeList = MultiSelectTreeComboBox.prototype.pinHandlers.list;

MultiSelectTreeComboBox.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    values: {
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('values', value);
      },
      get: function () {
        return thisC.getAttribute('values');
      }
    },
    list: {
      enumerable: false,
      get: function () {
        return thisC.getAttribute('list');
      },
      set: function (value) {
        thisC.setAttribute('list', value);
      }
    },
    treeList: {
      enumerable: false,
      get: function () {
        return thisC.getAttribute('list');
      },
      set: function (value) {
        thisC.setAttribute('list', value);
      }
    }
  });
  return {
    set: function (value) {
      Object.assign(subObj, value);
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(MultiSelectTreeComboBox);

_Assembler.AssemblerInstance.addClass('MultiCheckTreeComboBox', MultiSelectTreeComboBox);

var _default = MultiSelectTreeComboBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/SelectListText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/SelectListText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _showdown = _interopRequireDefault(require("showdown"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _TextStyleHandlers = _interopRequireDefault(require("./handlers/TextStyleHandlers"));

var _Assembler = require("../core/Assembler");

var _Text = _interopRequireDefault(require("./Text"));


var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function SelectListText() {
  _ScalableComponent.default.call(this);

  this._items = [];
  this._value = null;
  this._itemByValue = {};
}

(0, _inheritComponentClass.default)(SelectListText, _ScalableComponent.default);
SelectListText.prototype.tag = "SelectListText";
SelectListText.prototype.menuIcon = "span.mdi.mdi-format-color-text";
SelectListText.prototype.attributeHandlers.items = {
  /***
   * @this SelectListText
   * @param items
   */
  set: function (items) {
    items = items || [];
    this._items = items;
    this._itemByValue = {};
    var dict = this._itemByValue;
    items.forEach(function visit(item) {
      dict[item.value] = item;
      if (item.items && item.items.length > 0) item.items.forEach(visit);
    });

    this._updateText();
  },
  get: function () {
    return this._items;
  },
  descriptor: {
    type: 'SelectList'
  }
};
SelectListText.prototype.attributeHandlers.treeList = {
  set: function (value) {
    this.attributes.items = value;
  },
  get: function () {
    return this.attributes.items;
  },
  descriptor: {
    type: 'SelectList'
  }
};
SelectListText.prototype.attributeHandlers.list = SelectListText.prototype.attributeHandlers.treeList;
SelectListText.prototype.attributeHandlers.value = {
  set: function (value) {
    if (this._value !== value) {
      this._value = value;

      this._updateText();

      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    if (!this._itemByValue[this._value] && this._items.length > 0 && this.attributes.strictValue) {
      return this._items[0].value;
    }

    return this._value;
  }
};
Object.assign(SelectListText.prototype.styleHandlers, _TextStyleHandlers.default);
SelectListText.prototype.pinHandlers.value = {
  get: function () {
    return this.attributes.value;
  },
  receives: function (value) {
    this.attributes.value = value;
  },
  descriptor: {
    type: 'number|text'
  }
};
SelectListText.prototype.pinHandlers.text = {
  get: function () {
    return this.attributes.value;
  },
  descriptor: {
    type: 'text'
  }
};
SelectListText.prototype.pinHandlers.items = {
  receives: function (value) {
    this.attributes.items = value;
  },
  descriptor: {
    type: 'SelectList'
  }
};
SelectListText.prototype.pinHandlers.treeList = SelectListText.prototype.pinHandlers.items;
SelectListText.prototype.pinHandlers.list = SelectListText.prototype.pinHandlers.items;
SelectListText.prototype.pinHandlers.onClick = {
  get: function () {
    return true;
  }
};

SelectListText.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.text = this.attributes.name;
  this.attributes.textDecode = 'none';
  this.style.font = undefined;
  this.style.fontStyle = undefined;
  this.style.textSize = 0;
  this.style.textAlign = 'left';
  this.style.textColor = 'black';
  this.style.font = 'unset';
};

SelectListText.prototype._updateText = function () {
  var item = this._itemByValue[this.attributes.value];
  var prevText = this.domElt.firstChild.firstChild.data;

  if (item) {
    this.domElt.firstChild.firstChild.data = item.text;
  } else {
    this.domElt.firstChild.firstChild.data = '';
  }

  if (prevText !== this.domElt.firstChild.firstChild.data) {
    this.pinFire('text');
    this.notifyChange();
  } // this.attributes.text = this.attributes.text + '';

};

SelectListText.prototype.render = function () {
  return _({
    class: 'as-select-list-text',
    child: {
      tag: 'span',
      child: {
        text: ''
      }
    }
  }).on('click', function () {
    this.pinFire('onClick');
  }.bind(this));
};

SelectListText.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    value: {
      configurable: true,
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('value', value);
      },
      get: function () {
        return thisC.getAttribute('value');
      }
    },
    items: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    },
    list: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    },
    treeList: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    }
  });
  return {
    set: function (value) {
      if (typeof value === "object") {
        Object.assign(subObj, value);
      } else {
        subObj.value = value;
      }
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(SelectListText);

var _default = SelectListText;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/CKEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/CKEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _FCore = require("../core/FCore");

var _Assembler = require("../core/Assembler");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _CKPlaceholder = _interopRequireDefault(require("absol-acomp/js/ckeditor/CKPlaceholder"));


/***
 * @extends ScalableComponent
 * @constructor
 */
function CKEditor() {
  _ScalableComponent.default.call(this);

  this.style.width = 600;
  this.style.height = 'auto';
  this.editior = null;
  this._pendingData = null;
}

(0, _inheritComponentClass.default)(CKEditor, _ScalableComponent.default);
CKEditor.prototype.menuIcon = 'span.mdi.mdi-file-word-box';
CKEditor.prototype.tag = 'CKEditor';

CKEditor.prototype.render = function () {
  this.placeHolderElt = (0, _FCore._)({
    tag: _CKPlaceholder.default.tag,
    on: {
      editorcreated: this.ev_editorCreated.bind(this),
      change: function () {
        this.pinFire('data');
        this.notifyChange();
      }.bind(this),
      editorready: function () {
        _ResizeSystem.default.update();
      }
    }
  });
  return (0, _FCore._)({
    class: 'as-ckeditor-wrapper',
    child: this.placeHolderElt
  });
};

CKEditor.prototype.style.height = 500;

CKEditor.prototype.onCreated = function () {
  this.placeHolderElt.requestUpdateSize = this.requestUpdateSize.bind(this);

  _ResizeSystem.default.add(this.placeHolderElt);
};

CKEditor.prototype.ev_editorCreated = function () {
  this.editor = this.placeHolderElt.editor;
  this.editor.on('instanceReady', this.requestUpdateSize.bind(this));
};

CKEditor.prototype.requestUpdateSize = function () {
  if (this.editor) {
    var b = this.domElt.getBoundingClientRect();

    try {
      this.editor.resize(typeof this.style.width === "number" ? this.style.width : null, typeof this.style.height === "number" ? this.style.height : b.height);
    } catch (err) {}
  }
};

CKEditor.prototype.attributes.toolbar = 'SIMPLE';
CKEditor.prototype.pinHandlers.data = {
  get: function () {
    return this.attributes.data;
  },
  receives: function (value) {
    this.attributes.data = value;
  },
  descriptor: {
    type: 'text'
  }
};
CKEditor.prototype.attributeHandlers.data = {
  set: function (value) {
    var prevData = this.placeHolderElt.data;
    this.placeHolderElt.data = value;

    if (value !== prevData) {
      this.pinFire('data');
      this.notifyChange();
    }
  },
  get: function () {
    return this.placeHolderElt.data;
  },
  descriptor: {
    type: 'text'
  }
};
CKEditor.prototype.attributeHandlers.toolbar = {
  set: function (value) {
    this.placeHolderElt.config = this.placeHolderElt.config || {};
    this.placeHolderElt.config.toolbar = value;
  },
  descriptor: {
    type: 'enum',
    values: ['SIMPLE', 'ADVANCE']
  }
};

CKEditor.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.attributes.data = value;
    },
    get: function () {
      return thisC.attributes.data;
    }
  };
};

_Assembler.AssemblerInstance.addClass(CKEditor);

var _default = CKEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/CKTemplateEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/CKTemplateEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseCKTemplate = parseCKTemplate;
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _CKEditor = _interopRequireDefault(require("./CKEditor"));

var _base = require("absol/src/Converter/base64");

var _utils = require("absol-acomp/js/utils");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _FCore = require("../core/FCore");

var _CKPlaceholder = _interopRequireDefault(require("absol-acomp/js/ckeditor/CKPlaceholder"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));


function parseCKTemplate(data, replacements) {
  var replaceF = replacements;

  if (typeof replacements !== "function") {
    replaceF = function (variable) {
      return replacements[variable] || '{{' + variable + '}}';
    };
  }

  return data.replace(/\{\{([a-zA-Z_$]([a-zA-Z_$0-9]*))(\.([a-zA-Z_$]([a-zA-Z_$0-9]*)))*\}\}/g, function (all) {
    var variable = all.substr(2, all.length - 2);
    return replaceF(variable) || '{{' + variable + '}}';
  }.bind(this));
}
/***
 * @extends CKEditor
 * @constructor
 */


function CKTemplateEditor() {
  _CKEditor.default.call(this);
}

(0, _inheritComponentClass.default)(CKTemplateEditor, _CKEditor.default);
CKTemplateEditor.prototype.menuIcon = 'span.mdi.mdi-file-word-box-outline';
CKTemplateEditor.prototype.tag = 'CKTemplateEditor';

CKTemplateEditor.prototype.render = function () {
  this.placeHolderElt = (0, _FCore._)({
    tag: _CKPlaceholder.default.tag,
    on: {
      editorcreated: this.ev_editorCreated.bind(this),
      change: function () {
        this.pinFire('data');
        this.notifyChange();
      }.bind(this),
      editorready: function () {
        _ResizeSystem.default.update();
      },
      command: function (event) {
        if (event.command === 'insert_expression') this.pinFire('requestExpression');
      }.bind(this)
    },
    props: {
      extensions: ['expression']
    }
  });
  return (0, _FCore._)({
    class: 'as-ckeditor-wrapper',
    child: this.placeHolderElt
  });
};

CKTemplateEditor.prototype.pinHandlers.requestExpression = {
  get: function () {
    return this.placeHolderElt.getSelectedExpression();
  },
  descriptor: {
    type: 'bool'
  }
};
CKTemplateEditor.prototype.pinHandlers.insertExpression = {
  receives: function (value) {
    if (!this.editor) return;
    if (value) this.placeHolderElt.insertExpression(value);
  },
  descriptor: {
    type: '{text:string, value:string}'
  }
};
CKTemplateEditor.prototype.pinHandlers.previewHTML = {
  get: function () {
    return this.placeHolderElt.rawData;
  },
  descriptor: {
    type: 'text'
  }
};

_Assembler.AssemblerInstance.addClass(CKTemplateEditor);

var _default = CKTemplateEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TreeLeafComboBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TreeLeafComboBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _ComboBox = _interopRequireDefault(require("./ComboBox"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _SelectTreeLeafMenu = _interopRequireDefault(require("absol-acomp/js/SelectTreeLeafMenu"));

var _TreeComboBox = _interopRequireDefault(require("./TreeComboBox"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _ComboBoxHandlers = require("./handlers/ComboBoxHandlers");




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function TreeLeafComboBox() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(TreeLeafComboBox, _ScalableComponent.default);
TreeLeafComboBox.prototype.tag = "TreeLeafComboBox";
TreeLeafComboBox.prototype.menuIcon = ['<svg style="width:22px;height:22px" viewBox="0 0 24 24" width="24" height="24">', '<g transform="scale(0.5, 0.5) translate(10, 10)">', '<path fill="currentColor" d="M3,3H9V7H3V3M15,10H21V14H15V10M15,17H21V21H15V17M13,13H7V18H13V20H7L5,20V9H7V11H13V13Z" />', '</g>', '<path fill="currentColor" d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4" />', '</svg>'].join('\n');
Object.assign(TreeLeafComboBox.prototype.attributeHandlers, _InputAttributeHandlers.default, _ComboBoxHandlers.ComboBoxAttributeHandlers);
Object.assign(TreeLeafComboBox.prototype.styleHandlers, _InputStyleHandlers.default);
Object.assign(TreeLeafComboBox.prototype.pinHandlers, _ComboBoxHandlers.ComboBoxPinHandlers);

TreeLeafComboBox.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  var self = this;
  this.view.on('change', function () {
    self.pinFire('value');
    self.pinFire('text');
    self.notifyChange();
  });
};

TreeLeafComboBox.prototype.render = function () {
  return _(_SelectTreeLeafMenu.default.tag);
};

TreeLeafComboBox.prototype.measureMinSize = function () {
  var minWidthStyle = this.domElt ? parseFloat(this.domElt.getComputedStyleValue('min-width').replace('px')) : 24;
  return {
    width: Math.max(minWidthStyle, 24),
    height: 25
  };
};

TreeLeafComboBox.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    value: {
      configurable: true,
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('value', value);
      },
      get: function () {
        return thisC.getAttribute('value');
      }
    },
    treeList: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.list;
      },
      set: function (value) {
        thisC.attributes.list = value;
      }
    },
    list: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.list;
      },
      set: function (value) {
        thisC.attributes.list = value;
      }
    }
  });
  return {
    set: function (value) {
      Object.assign(subObj, value);
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(TreeLeafComboBox);

var _default = TreeLeafComboBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/MultiSelectTreeLeafComboBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/MultiSelectTreeLeafComboBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _FCore = require("../core/FCore");

var _MultiCheckTreeLeafMenu = _interopRequireDefault(require("absol-acomp/js/MultiCheckTreeLeafMenu"));

var _InputAttributeHandlers = _interopRequireDefault(require("./handlers/InputAttributeHandlers"));

var _ComboBox = _interopRequireDefault(require("./ComboBox"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _MultiselectComboBoxHandlers = require("./handlers/MultiselectComboBoxHandlers");


/***
 * @extends ScalableComponent
 * @constructor
 */
function MultiSelectTreeLeafComboBox() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(MultiSelectTreeLeafComboBox, _ScalableComponent.default);
MultiSelectTreeLeafComboBox.prototype.style.height = 'auto';
MultiSelectTreeLeafComboBox.prototype.tag = 'MultiSelectTreeLeafComboBox';

MultiSelectTreeLeafComboBox.prototype.render = function () {
  return (0, _FCore._)({
    tag: _MultiCheckTreeLeafMenu.default.tag
  });
};

MultiSelectTreeLeafComboBox.prototype.onCreated = function () {
  this.domElt.on('change', function () {
    this.pinFire('values');
    this.pinFire('text');
    this.notifyChange();
  }.bind(this));
};

Object.assign(MultiSelectTreeLeafComboBox.prototype.attributeHandlers, _InputAttributeHandlers.default, _MultiselectComboBoxHandlers.MultiselectComboBoxAttributeHandlers);
Object.assign(MultiSelectTreeLeafComboBox.prototype.styleHandlers, _InputStyleHandlers.default);
Object.assign(MultiSelectTreeLeafComboBox.prototype.pinHandlers, _MultiselectComboBoxHandlers.MultiselectComboBoxPinHandlers);

MultiSelectTreeLeafComboBox.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    values: {
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('values', value);
      },
      get: function () {
        return thisC.getAttribute('values');
      }
    },
    treeList: {
      enumerable: false,
      get: function () {
        return thisC.getAttribute('list');
      },
      set: function (value) {
        thisC.setAttribute('list', value);
      }
    }
  });
  return {
    set: function (value) {
      Object.assign(subObj, value);
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(MultiSelectTreeLeafComboBox);

var _default = MultiSelectTreeLeafComboBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/WeekInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/WeekInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _datetime = require("absol/src/Time/datetime");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _DateInput = _interopRequireDefault(require("./DateInput"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function WeekInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(WeekInput, _ScalableComponent.default);
WeekInput.prototype.tag = "WeekInput";
WeekInput.prototype.menuIcon = "span.mdi.mdi-calendar-week";
WeekInput.prototype.SUPPORT_EVENT_NAMES = ['change'];
Object.assign(WeekInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(WeekInput.prototype.styleHandlers, _InputStyleHandlers.default);
WeekInput.prototype.attributes.format = 'Tuần ww, yyyy';
WeekInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    if (value instanceof Date) this.domElt.value = value;else if (typeof value == 'string' || typeof value == "number") {
      value = new Date(value);
      this.domElt.value = value;
    } else {
      value = null;
      this.domElt.value = null;
    }
    var cur = this.domElt.value;

    if (!!prev !== !!cur || prev && cur && (0, _datetime.compareDate)(prev, cur) !== 0) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.view.value;
  },
  descriptor: {
    type: 'date',
    nullable: true,
    defaultValue: (0, _datetime.beginOfDay)(new Date()),
    sign: 'SimpleDate'
  }
};
WeekInput.prototype.attributeHandlers.format = {
  set: function (value) {
    this.domElt.format = value || 'Tuần ww, yyyy';
  },
  get: function () {
    return this.domElt.format;
  },
  descriptor: {
    type: 'enum',
    values: ['Tuần ww, yyyy', 'Week ww, yyyy']
  },
  export: function () {
    var val = this.attributes.format;
    if (val === 'Tuần ww, yyyy') return null;
    return val || null;
  }
};
WeekInput.prototype.attributeHandlers.notNull = _DateInput.default.prototype.attributeHandlers.notNull;
WeekInput.prototype.pinHandlers.min = {
  receives: function (value) {
    this.domElt.min = value;
  },
  descriptor: {
    type: "Date"
  }
};
WeekInput.prototype.pinHandlers.max = {
  receives: function (value) {
    this.domElt.max = value;
  },
  descriptor: {
    type: "Date"
  }
};
WeekInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: "Date"
  }
};

WeekInput.prototype.render = function () {
  return _('dateinput');
};

WeekInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.value = null;
  this.style.width = 100;
  this.style.height = 30;
};

WeekInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('change', this.ev_inputChange.bind(this));
};

WeekInput.prototype.measureMinSize = function () {
  return {
    width: 75,
    height: 16
  };
};

WeekInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.attributes.value = value;
    },
    get: function () {
      return thisC.attributes.value;
    }
  };
};

WeekInput.prototype.ev_inputChange = function () {
  this.pinFire('value');
  this.notifyChange();
};

_Assembler.AssemblerInstance.addClass(WeekInput);

var _default = WeekInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/FileListInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/FileListInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../core/FCore"));

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _InputAttributeHandlers = _interopRequireDefault(require("./handlers/InputAttributeHandlers"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




/***
 * @extends ScalableComponent
 * @constructor
 */
function FileListInput() {
  _ScalableComponent.default.call(this);

  this._prevFiles = [];
}

(0, _inheritComponentClass.default)(FileListInput, _ScalableComponent.default);
FileListInput.prototype.tag = 'FileListInput';
FileListInput.prototype.menuIcon = 'span.mdi.mdi-file-multiple-outline';
Object.assign(FileListInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(FileListInput.prototype.styleHandlers, _InputStyleHandlers.default);

FileListInput.prototype.render = function () {
  var self = this;
  var elt = (0, _FCore._)({
    tag: 'filelistinput',
    props: {
      droppable: false
    },
    on: {
      change: function () {
        self.pinFire('files');
        self.notifyChange();
      }
    }
  });
  elt.$addedFile.on('click', function (event) {
    if (window.contentModule && window.contentModule.chooseFile && !self.attributes.useSystemDialog) {
      event.preventDefault();
      window.contentModule.chooseFile({
        accept: this.attributes.accept
      }).then(function (result) {
        if (result) {
          if (result instanceof Array) {
            result.forEach(it => {
              elt.add(it);
            });
          } else if (result) {
            elt.add(result);
          } else {
            return;
          }

          self.pinFire('files');
          self.notifyChange();
        }
      });
    }
  });
  return elt;
};

FileListInput.prototype.style.height = 100;
FileListInput.prototype.style.width = 100;
FileListInput.prototype.attributeHandlers.files = {
  set: function (files) {
    files = files || [];
    var changed = this._prevFiles.length !== files.length;

    if (!changed) {
      for (var i = 0; i < this._prevFiles.length && !changed; ++i) {
        if (files[i] === this._prevFiles[i]) changed = true;
      }
    }

    this._prevFiles = files.slice();

    if (changed) {
      this.domElt.files = files;
      this.pinFire('files');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.files;
  },
  descriptor: {
    type: 'file[]'
  }
};
FileListInput.prototype.attributeHandlers.multiple = {
  set: function (value) {
    this.domElt.multiple = !!value;
  },
  get: function () {
    return this.domElt.multiple;
  },
  descriptor: {
    type: 'boolean'
  }
};
FileListInput.prototype.attributeHandlers.useSystemDialog = {
  set: function (value) {
    value = !!value;
    this.domElt.droppable = value;
    return value;
  },
  descriptor: {
    type: 'boolean'
  }
};
FileListInput.prototype.pinHandlers.files = {
  get: function () {
    return this.attributes.files;
  },
  receives: function (files) {
    this.attributes.files = files;
  },
  descriptor: {
    type: 'file[]'
  }
};

FileListInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.attributes.files = value;
    },
    get: function () {
      return thisC.attributes.files;
    }
  };
};

_Assembler.AssemblerInstance.addClass(FileListInput);

var _default = FileListInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/DateInYearInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/DateInYearInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _datetime = require("absol/src/Time/datetime");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function DateInYearInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(DateInYearInput, _ScalableComponent.default);
DateInYearInput.prototype.tag = "DateInYearInput";
DateInYearInput.prototype.menuIcon = "span.mdi.mdi-calendar-today";
DateInYearInput.prototype.SUPPORT_EVENT_NAMES = ['change'];
Object.assign(DateInYearInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(DateInYearInput.prototype.styleHandlers, _InputStyleHandlers.default);
DateInYearInput.prototype.attributeHandlers.notNull = {
  set: function (value) {
    this.domElt.notNull = !!value;
  },
  get: function () {
    return this.domElt.notNull;
  },
  export: function () {
    return this.domElt.notNull || undefined;
  },
  descriptor: {
    type: 'bool',
    sign: 'value_not_null'
  }
};
DateInYearInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    if (value instanceof Date) this.domElt.value = {
      month: value.getMonth(),
      date: value.getDate()
    };else if (typeof value == 'string' || typeof value == "number") {
      value = new Date(value);
      this.domElt.value = {
        month: value.getMonth(),
        date: value.getDate()
      };
    }

    if (typeof value === 'object') {
      this.domElt.value = value;
    } else {
      value = null;
      this.domElt.value = null;
    }

    var cur = this.domElt.value;

    if (!prev !== !cur || prev && cur && (prev.month !== cur.month || prev.date !== cur.date)) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.view.value;
  },
  descriptor: {
    type: 'DateMonth',
    nullable: true,
    defaultValue: (0, _datetime.beginOfDay)(new Date()),
    sign: 'DateMonth_value'
  }
};
DateInYearInput.prototype.attributeHandlers.format = {
  set: function (value) {
    this.domElt.format = value || 'dd/MM';
  },
  get: function () {
    return this.domElt.format;
  },
  descriptor: {
    type: 'enum',
    values: ['dd/MM', 'MM/dd', 'MMM-dd', 'dd tháng MM']
  }
};
DateInYearInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: "DateMonth"
  }
};

DateInYearInput.prototype.render = function () {
  return _('dateinyearinput');
};

DateInYearInput.prototype.style.width = 100;
DateInYearInput.prototype.style.height = 30;

DateInYearInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.value = null;
};

DateInYearInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('change', this.ev_inputChange.bind(this));
};

DateInYearInput.prototype.getAcceptsEventNames = function () {
  return _ScalableComponent.default.prototype.getAcceptsEventNames.call(this).concat(['change']);
};

DateInYearInput.prototype.measureMinSize = function () {
  return {
    width: 75,
    height: 16
  };
};

DateInYearInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

DateInYearInput.prototype.ev_inputChange = function () {
  this.pinFire('value');
  this.notifyChange();
};

_Assembler.AssemblerInstance.addClass(DateInYearInput);

var _default = DateInYearInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/DualComboBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/DualComboBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _ComboBox = _interopRequireDefault(require("./ComboBox"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function DualComboBox() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(DualComboBox, _ScalableComponent.default);
DualComboBox.prototype.tag = "DualComboBox";
DualComboBox.prototype.menuIcon = 'span.mdi.mdi-chevron-double-down';
Object.assign(DualComboBox.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(DualComboBox.prototype.styleHandlers, _InputStyleHandlers.default);
DualComboBox.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = (this.domElt.value || [null, null]).join('/');
    this.domElt.value = value;
    var cur = (this.domElt.value || [null, null]).join('/');

    if (prev !== cur) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.domElt.value;
  }
};
DualComboBox.prototype.attributeHandlers.searchable = _ComboBox.default.prototype.attributeHandlers.searchable;
DualComboBox.prototype.attributeHandlers.enableSearch = _ComboBox.default.prototype.attributeHandlers.enableSearch;
DualComboBox.prototype.attributeHandlers.strictValue = _ComboBox.default.prototype.attributeHandlers.strictValue;
DualComboBox.prototype.attributeHandlers.treeList = Object.assign({}, _ComboBox.default.prototype.attributeHandlers.list, {
  set: function (items) {
    var prev = (this.domElt.value || [null, null]).join('/');
    this.domElt.items = items;
    var cur = (this.domElt.value || [null, null]).join('/');

    if (prev !== cur) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  descriptor: {
    type: 'SelectTreeList'
  },
  export: function () {
    var treeList = this.domElt.items;
    return treeList.map(function copyItem(item) {
      var newItem = {
        value: item.value,
        text: item.text
      };
      if (item.items && item.items.length) newItem.items = item.items.map(copyItem);
      return newItem;
    });
  }
});
DualComboBox.prototype.pinHandlers.treeList = {
  receives: function (value) {
    this.attributes.treeList = value;
  },
  descriptor: {
    type: 'SelectTreeList'
  }
};
DualComboBox.prototype.pinHandlers.value = _ComboBox.default.prototype.pinHandlers.value;

DualComboBox.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);
};

DualComboBox.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  var self = this;

  if (!this.domElt.domSignal) {
    this.domElt.$domSignal = _('attachhook').addTo(this.domElt);
    this.domElt.domSignal = new _DomSignal.default(this.domElt.$domSignal);
  }

  this.domSignal = this.domElt.domSignal;
  this.domSignal.on('pinFireAll', this.pinFireAll.bind(this));
  this.view.on('change', function () {
    self.pinFire('value');
    self.notifyChange();
  });
};

DualComboBox.prototype.render = function () {
  return _('dualselectmenu');
};

DualComboBox.prototype.measureMinSize = function () {
  var minWidthStyle = this.domElt ? parseFloat(this.domElt.getComputedStyleValue('min-width').replace('px')) : 24;
  return {
    width: Math.max(minWidthStyle, 24),
    height: 25
  };
};

DualComboBox.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    value: {
      configurable: true,
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('value', value);
      },
      get: function () {
        return thisC.getAttribute('value');
      }
    },
    treeList: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.getAttribute('treeList');
      },
      set: function (value) {
        thisC.setAttribute('treeList', value);
      }
    }
  });
  return {
    set: function (value) {
      Object.assign(subObj, value);
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(DualComboBox);

var _default = DualComboBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/CKInlineShortTemplate.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/CKInlineShortTemplate.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../core/FCore");

var _Assembler = require("../core/Assembler");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _CKTemplateEditor = _interopRequireDefault(require("./CKTemplateEditor"));

var _CKInlineShortText = _interopRequireDefault(require("absol-acomp/js/ckeditor/CKInlineShortText"));


/***
 * @extends ScalableComponent
 * @constructor
 */
function CKInlineShortTemplate() {
  _CKTemplateEditor.default.call(this);
}

(0, _inheritComponentClass.default)(CKInlineShortTemplate, _CKTemplateEditor.default);
CKInlineShortTemplate.prototype.menuIcon = 'span.mdi.mdi-file-word-box';
CKInlineShortTemplate.prototype.tag = 'CKInlineShortTemplate';

CKInlineShortTemplate.prototype.render = function () {
  this.placeHolderElt = (0, _FCore._)({
    tag: _CKInlineShortText.default.tag,
    style: {
      width: '100%',
      height: '100%'
    },
    on: {
      editorcreated: this.ev_editorCreated.bind(this),
      change: function () {
        this.pinFire('data');
        this.notifyChange();
      }.bind(this),
      editorready: function () {
        _ResizeSystem.default.update();
      },
      command: function (event) {
        if (event.command === 'insert_expression') this.pinFire('requestExpression');
      }.bind(this)
    },
    props: {
      extensions: ['expression']
    }
  });
  return (0, _FCore._)({
    class: 'as-ckeditor-wrapper',
    child: this.placeHolderElt
  });
};

CKInlineShortTemplate.prototype.style.height = 30;

_Assembler.AssemblerInstance.addClass(CKInlineShortTemplate);

var _default = CKInlineShortTemplate;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/LocationInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/LocationInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _FCore = require("../core/FCore");

var _InputAttributeHandlers = _interopRequireDefault(require("./handlers/InputAttributeHandlers"));

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));


/***
 * @extends ScalableComponent
 * @constructor
 */
function LocationInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(LocationInput, _ScalableComponent.default);
LocationInput.prototype.menuIcon = 'span.mdi.mdi-map-marker';
LocationInput.prototype.tag = 'LocationInput';
LocationInput.prototype.style.width = 232;
LocationInput.prototype.style.height = 30;
Object.assign(LocationInput.prototype.styleHandlers, _InputStyleHandlers.default);
Object.assign(LocationInput.prototype.attributeHandlers, _InputAttributeHandlers.default);

LocationInput.prototype.onCreated = function () {
  this.domElt.on('change', function () {
    this.pinFire('value');
    this.notifyChange();
  }.bind(this));
};

LocationInput.prototype.render = function () {
  return (0, _FCore._)({
    tag: 'locationinput'
  });
};

LocationInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    if (prev === value) return;
    this.domElt.value = value;
    this.pinFire('value');
    this.notifyChange();
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'LatLng'
  }
};
Object.assign(LocationInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
LocationInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.attributes.value;
  },
  descriptor: {
    type: 'LatLng'
  } //{latitude: number, longitude: number}

};

LocationInput.prototype.measureMinSize = function () {
  return {
    width: 232,
    height: 30
  };
};

LocationInput.prototype.createDataBindingDescriptor = function () {
  var self = this;
  return {
    set: function (value) {
      self.attributes.value = value;
    },
    get: function () {
      return self.attributes.value;
    }
  };
};

_Assembler.AssemblerInstance.addClass(LocationInput);

var _default = LocationInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/LocationView.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/LocationView.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _FCore = require("../core/FCore");


/***
 * @extends ScalableComponent
 * @constructor
 */
function LocationView() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(LocationView, _ScalableComponent.default);
LocationView.prototype.menuIcon = 'span.mdi.mdi-map-legend';
LocationView.prototype.tag = 'LocationView';
LocationView.prototype.style.width = 300;
LocationView.prototype.style.height = 200;

LocationView.prototype.render = function () {
  return (0, _FCore._)({
    tag: 'locationview'
  });
};

LocationView.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    if (!value && !prev === !value) return;
    if (prev && value && typeof prev.latitude === "number" && typeof prev.longitude === "number" && prev.latitude === value.latitude && prev.longitude === value.longitude) return;
    this.domElt.value = value;
    this.notifyChange();
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'LatLng'
  }
};
LocationView.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  descriptor: {
    type: 'LatLng'
  }
};

LocationView.prototype.measureMinSize = function () {
  return {
    width: 232,
    height: 30
  };
};

LocationView.prototype.createDataBindingDescriptor = function () {
  var self = this;
  return {
    set: function (value) {
      self.attributes.value = value;
    },
    get: function () {
      return self.attributes.value;
    }
  };
};

_Assembler.AssemblerInstance.addClass(LocationView);

var _default = LocationView;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/MultiSelectListText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/MultiSelectListText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _TextStyleHandlers = _interopRequireDefault(require("./handlers/TextStyleHandlers"));

var _Assembler = require("../core/Assembler");


var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function MultiSelectListText() {
  _ScalableComponent.default.call(this);

  this._items = [];
  this._value = null;
  this._itemByValue = {};
}

(0, _inheritComponentClass.default)(MultiSelectListText, _ScalableComponent.default);
MultiSelectListText.prototype.tag = "MultiSelectListText";
MultiSelectListText.prototype.menuIcon = "span.mdi.mdi-format-color-text";
MultiSelectListText.prototype.attributeHandlers.items = {
  /***
   * @this MultiSelectListText
   * @param items
   */
  set: function (items) {
    items = items || [];
    this._items = items;
    this._itemByValue = {};
    var dict = this._itemByValue;
    items.forEach(function visit(item) {
      dict[item.value] = item;
      if (item.items && item.items.length > 0) item.items.forEach(visit);
    });

    this._updateText();
  },
  get: function () {
    return this._items;
  },
  descriptor: {
    type: 'SelectList'
  }
};
MultiSelectListText.prototype.attributeHandlers.treeList = {
  set: function (value) {
    this.attributes.items = value;
  },
  get: function () {
    return this.attributes.items;
  },
  descriptor: {
    type: 'SelectList'
  }
};
MultiSelectListText.prototype.attributeHandlers.list = MultiSelectListText.prototype.attributeHandlers.treeList;
MultiSelectListText.prototype.attributeHandlers.values = {
  set: function (values) {
    if (this._values !== values) {
      this._values = values;

      this._updateText();

      this.pinFire('values');
      this.notifyChange();
    }
  },
  get: function () {
    return this._values;
  }
};
Object.assign(MultiSelectListText.prototype.styleHandlers, _TextStyleHandlers.default);
MultiSelectListText.prototype.pinHandlers.values = {
  get: function () {
    return this.attributes.values;
  },
  receives: function (values) {
    this.attributes.values = values;
  },
  descriptor: {
    type: 'number|text'
  }
};
MultiSelectListText.prototype.pinHandlers.text = {
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'text'
  }
};
MultiSelectListText.prototype.pinHandlers.items = {
  receives: function (value) {
    this.attributes.items = value;
  },
  descriptor: {
    type: 'SelectList'
  }
};
MultiSelectListText.prototype.pinHandlers.treeList = MultiSelectListText.prototype.pinHandlers.items;
MultiSelectListText.prototype.pinHandlers.list = MultiSelectListText.prototype.pinHandlers.items;

MultiSelectListText.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.text = this.attributes.name;
  this.attributes.textDecode = 'none';
  this.style.font = undefined;
  this.style.fontStyle = undefined;
  this.style.textSize = 0;
  this.style.textAlign = 'left';
  this.style.textColor = 'black';
  this.style.font = 'unset';
};

MultiSelectListText.prototype._updateText = function () {
  var values = this.attributes.values || [];
  var items = values.map(function (value) {
    return this._itemByValue[value];
  }.bind(this)).filter(function (item) {
    return !!item;
  });
  var newText = items.map(function (item) {
    return item.text;
  }).join('; ');
  var prevText = this.domElt.value;
  this.domElt.value = newText;

  if (prevText !== this.domElt.value) {
    this.pinFire('text');
    this.notifyChange();
  } // this.attributes.text = this.attributes.text + '';

};

MultiSelectListText.prototype.render = function () {
  return _('input[type="text"][readonly="true"].as-select-list-text');
};

MultiSelectListText.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    values: {
      configurable: true,
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('values', value);
      },
      get: function () {
        return thisC.getAttribute('values');
      }
    },
    items: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    },
    list: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    },
    treeList: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    }
  });
  return {
    set: function (value) {
      if (typeof value === "object") {
        Object.assign(subObj, value);
      } else {
        subObj.value = value;
      }
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(MultiSelectListText);

var _default = MultiSelectListText;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/DualSelectListText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/DualSelectListText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _showdown = _interopRequireDefault(require("showdown"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _TextStyleHandlers = _interopRequireDefault(require("./handlers/TextStyleHandlers"));

var _Assembler = require("../core/Assembler");

var _Text = _interopRequireDefault(require("./Text"));

var _SelectListText = _interopRequireDefault(require("./SelectListText"));


var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function DualSelectListText() {
  _ScalableComponent.default.call(this);

  this._items = [];
  this._value = null;
  this._itemByValue = {};
}

(0, _inheritComponentClass.default)(DualSelectListText, _ScalableComponent.default);
DualSelectListText.prototype.tag = "DualSelectListText";
DualSelectListText.prototype.menuIcon = "span.mdi.mdi-format-color-text";
DualSelectListText.prototype.attributeHandlers.items = {
  /***
   * @this DualSelectListText
   * @param items
   */
  set: function (items) {
    items = items || [];
    this._items = items;
    this._itemByValue = {};
    var dict = this._itemByValue;

    function makeVisit(pre) {
      return function (item) {
        dict[pre + item.value] = item;
        if (item.items && item.items.length > 0) item.items.forEach(makeVisit(pre + item.value + '/'));
      };
    }

    items.forEach(makeVisit(''));

    this._updateText();
  },
  get: function () {
    return this._items;
  },
  descriptor: {
    type: 'SelectList'
  }
};
DualSelectListText.prototype.attributeHandlers.treeList = {
  set: function (value) {
    this.attributes.items = value;
  },
  get: function () {
    return this.attributes.items;
  },
  descriptor: {
    type: 'SelectList'
  }
};
DualSelectListText.prototype.attributeHandlers.list = DualSelectListText.prototype.attributeHandlers.treeList;
DualSelectListText.prototype.attributeHandlers.value = {
  set: function (value) {
    if (this._value !== value) {
      this._value = value;

      this._updateText();

      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    if (!this._itemByValue[this._value] && this._items.length > 0 && this.attributes.strictValue) {
      return this._items[0].value;
    }

    return this._value;
  }
};
Object.assign(DualSelectListText.prototype.styleHandlers, _TextStyleHandlers.default);
DualSelectListText.prototype.pinHandlers.value = {
  get: function () {
    return this.attributes.value;
  },
  receives: function (value) {
    this.attributes.value = value;
  },
  descriptor: {
    type: 'number|text'
  }
};
DualSelectListText.prototype.pinHandlers.text = {
  get: function () {
    return this.domElt.firstChild.firstChild.data;
  },
  descriptor: {
    type: 'text'
  }
};
DualSelectListText.prototype.pinHandlers.items = {
  receives: function (value) {
    this.attributes.items = value;
  },
  descriptor: {
    type: 'SelectList'
  }
};
DualSelectListText.prototype.pinHandlers.treeList = DualSelectListText.prototype.pinHandlers.items;
DualSelectListText.prototype.pinHandlers.list = DualSelectListText.prototype.pinHandlers.items;

DualSelectListText.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.text = this.attributes.name;
  this.attributes.textDecode = 'none';
  this.style.font = undefined;
  this.style.fontStyle = undefined;
  this.style.textSize = 0;
  this.style.textAlign = 'left';
  this.style.textColor = 'black';
  this.style.font = 'unset';
};

DualSelectListText.prototype._updateText = function () {
  var value = this.attributes.value || [null, null];
  var prevText = this.domElt.firstChild.firstChild.data;
  var item = this._itemByValue[value[0]];
  var newText = '';
  if (item) newText += item.text;
  item = this._itemByValue[value.join('/')];
  if (item) newText += ', ' + item.text;
  this.domElt.firstChild.firstChild.data = newText;

  if (prevText !== this.domElt.firstChild.firstChild.data) {
    this.pinFire('text');
    this.notifyChange();
  }
};

DualSelectListText.prototype.render = _SelectListText.default.prototype.render;

DualSelectListText.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  var subObj = {};
  Object.defineProperties(subObj, {
    value: {
      configurable: true,
      enumerable: true,
      set: function (value) {
        thisC.setAttribute('value', value);
      },
      get: function () {
        return thisC.getAttribute('value');
      }
    },
    items: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    },
    list: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    },
    treeList: {
      enumerable: false,
      configurable: true,
      get: function () {
        return thisC.attributes.items;
      },
      set: function (value) {
        thisC.attributes.items = value;
      }
    }
  });
  return {
    set: function (value) {
      if (typeof value === "object") {
        Object.assign(subObj, value);
      } else {
        subObj.value = value;
      }
    },
    get: function () {
      return subObj;
    }
  };
};

_Assembler.AssemblerInstance.addClass(DualSelectListText);

var _default = DualSelectListText;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/ColorInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/ColorInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _ColorPickerButton = _interopRequireDefault(require("absol-colorpicker/components/ColorPickerButton"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function ColorInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(ColorInput, _ScalableComponent.default);
ColorInput.prototype.tag = "ColorInput";
ColorInput.prototype.menuIcon = "span.mdi.mdi-palette";
ColorInput.prototype.SUPPORT_EVENT_NAMES = ['change'];
Object.assign(ColorInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
ColorInput.prototype.attributes.mode = 'HEX6';
ColorInput.prototype.attributeHandlers.value = {
  set: function (value) {
    value = value || 'black';
    var same = false;

    try {
      var valueText = (_Color.default.parse(value + '') || '').toString('rgba');
      var oldText = (_Color.default.parse(this.domElt.value + '') || '').toString('rgba');
      same = valueText === oldText;
    } catch (err) {}

    if (same) return;
    this.domElt.value = value;
    this.pinFire('value');
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: 'Color',
    nullable: true,
    defaultValue: 'transparent',
    sign: 'ColorValue'
  }
};
ColorInput.prototype.attributeHandlers.mode = {
  set: function (value) {
    this.domElt.mode = value;
  },
  get: function () {
    return this.domElt.mode;
  },
  descriptor: {
    type: 'enum',
    values: ['HEX6', 'HEX8', 'RGB', 'RGBA', 'OBJECT']
  }
};
ColorInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.attributes.value;
  }
};

ColorInput.prototype.render = function () {
  return _(_ColorPickerButton.default);
};

ColorInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.value = null;
  this.style.width = 80;
  this.style.height = 30;
};

ColorInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('change', this.ev_inputChange.bind(this));
};

ColorInput.prototype.measureMinSize = function () {
  return {
    width: 75,
    height: 16
  };
};

ColorInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.setAttribute('value', value);
    },
    get: function () {
      return thisC.getAttribute('value');
    }
  };
};

ColorInput.prototype.ev_inputChange = function () {
  this.pinFire('value');
  this.notifyChange();
};

_Assembler.AssemblerInstance.addClass(ColorInput);

var _default = ColorInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/MonthInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/MonthInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _datetime = require("absol/src/Time/datetime");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _InputAttributeHandlers = _interopRequireWildcard(require("./handlers/InputAttributeHandlers"));

var _Assembler = require("../core/Assembler");

var _InputStyleHandlers = _interopRequireDefault(require("./handlers/InputStyleHandlers"));

var _DateInput = _interopRequireDefault(require("./DateInput"));




var _ = _FCore.default._;
/***
 * @extends ScalableComponent
 * @constructor
 */

function MonthInput() {
  _ScalableComponent.default.call(this);
}

(0, _inheritComponentClass.default)(MonthInput, _ScalableComponent.default);
MonthInput.prototype.tag = "MonthInput";
MonthInput.prototype.menuIcon = "span.mdi.mdi-calendar-month-outline";
MonthInput.prototype.SUPPORT_EVENT_NAMES = ['change'];
Object.assign(MonthInput.prototype.attributeHandlers, _InputAttributeHandlers.default);
Object.assign(MonthInput.prototype.styleHandlers, _InputStyleHandlers.default);
MonthInput.prototype.attributes.format = 'Tháng MM-yyyy';
MonthInput.prototype.attributeHandlers.value = {
  set: function (value) {
    var prev = this.domElt.value;
    if (value instanceof Date) this.domElt.value = value;else if (typeof value == 'string' || typeof value == "number") {
      value = new Date(value);
      this.domElt.value = value;
    } else {
      value = null;
      this.domElt.value = null;
    }
    var cur = this.domElt.value;

    if (!!prev !== !!cur || prev && cur && (0, _datetime.compareDate)(prev, cur) !== 0) {
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.view.value;
  },
  descriptor: {
    type: 'date',
    nullable: true,
    defaultValue: (0, _datetime.beginOfDay)(new Date()),
    sign: 'SimpleDate'
  }
};
MonthInput.prototype.attributeHandlers.format = {
  set: function (value) {
    this.domElt.format = value || 'Tháng MM-yyyy';
  },
  get: function () {
    return this.domElt.format;
  },
  descriptor: {
    type: 'enum',
    values: ['Tháng MM-yyyy', 'MM-yyyy']
  },
  export: function () {
    var val = this.attributes.format;
    if (val === 'Tháng MM-yyyy') return null;
    return val || null;
  }
};
MonthInput.prototype.attributeHandlers.notNull = _DateInput.default.prototype.attributeHandlers.notNull;
MonthInput.prototype.pinHandlers.min = {
  receives: function (value) {
    this.domElt.min = value;
  },
  descriptor: {
    type: "Date"
  }
};
MonthInput.prototype.pinHandlers.max = {
  receives: function (value) {
    this.domElt.max = value;
  },
  descriptor: {
    type: "Date"
  }
};
MonthInput.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this.domElt.value;
  },
  descriptor: {
    type: "Date"
  }
};

MonthInput.prototype.render = function () {
  return _('dateinput');
};

MonthInput.prototype.onCreate = function () {
  _ScalableComponent.default.prototype.onCreate.call(this);

  this.attributes.value = null;
  this.style.width = 100;
  this.style.height = 30;
};

MonthInput.prototype.onCreated = function () {
  _ScalableComponent.default.prototype.onCreated.call(this);

  this.domElt.on('change', this.ev_inputChange.bind(this));
};

MonthInput.prototype.measureMinSize = function () {
  return {
    width: 75,
    height: 16
  };
};

MonthInput.prototype.createDataBindingDescriptor = function () {
  var thisC = this;
  return {
    configurable: true,
    set: function (value) {
      thisC.attributes.value = value;
    },
    get: function () {
      return thisC.attributes.value;
    }
  };
};

MonthInput.prototype.ev_inputChange = function () {
  this.pinFire('value');
  this.notifyChange();
};

_Assembler.AssemblerInstance.addClass(MonthInput);

var _default = MonthInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/TreeTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/TreeTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScalableComponent = _interopRequireDefault(require("../core/ScalableComponent"));

var _FCore = require("../core/FCore");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _Assembler = require("../core/Assembler");

var _TreeTable = _interopRequireDefault(require("absol-acomp/js/treetable/TreeTable"));


/***
 * @extends ScalableComponent
 * @constructor
 */
function TreeTable() {
  _ScalableComponent.default.call(this);

  this._adapter = {};
}

(0, _inheritComponentClass.default)(TreeTable, _ScalableComponent.default);
TreeTable.prototype.tag = 'TreeTable';
TreeTable.prototype.menuIcon = 'span.mdi.mdi-table';

TreeTable.prototype.render = function () {
  return (0, _FCore._)({
    tag: _TreeTable.default
  });
};

TreeTable.prototype.attributes.propertyNames = ['sample_data'];
TreeTable.prototype.attributes.propertyDescriptors = {
  'sample_data': {
    type: 'text',
    text: 'Dữ liệu mẫu'
  }
};
TreeTable.prototype.attributes.records = [{}, {}];
TreeTable.prototype.attributeHandlers.propertyNames = {
  set: function (value, ref) {
    ref.set(value);

    this._updateContent();

    return value;
  }
};
TreeTable.prototype.attributeHandlers.propertyDescriptors = {
  set: function (value, ref) {
    ref.set(value);

    this._updateContent();

    return value;
  }
};
TreeTable.prototype.attributeHandlers.records = {
  set: function (value, ref) {
    value = value || [];
    ref.set(value);

    this._updateContent();

    return value;
  }
};
TreeTable.prototype.pinHandlers.records = {
  receives: function (value) {
    this.attributes.records = value;
  },
  descriptor: {
    type: 'object[]'
  }
};

TreeTable.prototype._updateContent = function () {
  var propertyDescriptors = this.attributes.propertyDescriptors;
  var propertyNames = this.attributes.propertyNames;
  var records = this.attributes.records;

  if (propertyDescriptors && propertyNames && records) {
    this.domElt.adapter = {
      type: 'struct',
      treeBy: this.attributes.treeBy || propertyNames[0],
      propertyNames: propertyNames,
      propertyDescriptors: propertyDescriptors,
      records: records
    };
  }
};

TreeTable.prototype.createDataBindingDescriptor = function () {
  var thisTI = this;
  var props = {};
  Object.defineProperties(props, {
    propertyNames: {
      enumerable: true,
      set: function (pnA) {
        thisTI.setAttribute('propertyNames', pnA);
      },
      get: function () {
        return thisTI.getAttribute('propertyNames');
      }
    },
    propertyDescriptors: {
      enumerable: true,
      set: function (pdO) {
        thisTI.setAttribute('propertyDescriptors', pdO);
      },
      get: function () {
        return thisTI.getAttribute('propertyDescriptors');
      }
    },
    records: {
      enumerable: true,
      set: function (records) {
        thisTI.setAttribute('records', records);
      },
      get: function () {
        return thisTI.getAttribute('records');
      }
    }
  });
  return {
    enumerable: true,
    set: function (value) {
      Object.assign(props, value);
    },
    get: function () {
      return props;
    }
  };
};

_Assembler.AssemblerInstance.addClass(TreeTable);

var _default = TreeTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/components/ComponentTreeList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/components/ComponentTreeList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _RelativeLayout = _interopRequireDefault(require("../layouts/RelativeLayout"));

var _LinearLayout = _interopRequireDefault(require("../layouts/LinearLayout"));

var _ChainLayout = _interopRequireDefault(require("../layouts/ChainLayout"));

var _DateInput = _interopRequireDefault(require("./DateInput"));

var _TimeInput = _interopRequireDefault(require("./TimeInput"));

var _TextArea = _interopRequireDefault(require("./TextArea"));

var _NumberInput = _interopRequireDefault(require("./NumberInput"));

var _ComboBox = _interopRequireDefault(require("./ComboBox"));

var _MultiselectComboBox = _interopRequireDefault(require("./MultiselectComboBox"));

var _TreeComboBox = _interopRequireDefault(require("./TreeComboBox"));

var _Checkbox = _interopRequireDefault(require("./Checkbox"));

var _TrackBar = _interopRequireDefault(require("./TrackBar"));

var _TrackBarInput = _interopRequireDefault(require("./TrackBarInput"));

var _TableInput = _interopRequireDefault(require("./TableInput"));

var _ImageFileInput = _interopRequireDefault(require("./ImageFileInput"));

var _Radio = _interopRequireDefault(require("./Radio"));

var _Label = _interopRequireDefault(require("./Label"));

var _Text = _interopRequireDefault(require("./Text"));

var _Image = _interopRequireDefault(require("./Image"));

var _Table = _interopRequireDefault(require("./Table"));

var _Button = _interopRequireDefault(require("./Button"));

var _ArrayOfFragment = _interopRequireDefault(require("./ArrayOfFragment"));

var _EditableArrayOfFragment = _interopRequireDefault(require("./EditableArrayOfFragment"));

var _Ellipse = _interopRequireDefault(require("../shapes/Ellipse"));

var _Rectangle = _interopRequireDefault(require("../shapes/Rectangle"));

var _DateTimeInput = _interopRequireDefault(require("./DateTimeInput"));

var _FileInput = _interopRequireDefault(require("./FileInput"));

var _TextInput = _interopRequireDefault(require("./TextInput"));

var _Time24Input = _interopRequireDefault(require("./Time24Input"));

var _TimeRange24Input = _interopRequireDefault(require("./TimeRange24Input"));

var _MultiSelectTreeComboBox = _interopRequireDefault(require("./MultiSelectTreeComboBox"));

var _SelectListText = _interopRequireDefault(require("./SelectListText"));

var _CKEditor = _interopRequireDefault(require("./CKEditor"));

var _CKTemplateEditor = _interopRequireDefault(require("./CKTemplateEditor"));

var _TreeLeafComboBox = _interopRequireDefault(require("./TreeLeafComboBox"));

var _MultiSelectTreeLeafComboBox = _interopRequireDefault(require("./MultiSelectTreeLeafComboBox"));

var _WeekInput = _interopRequireDefault(require("./WeekInput"));

var _FileListInput = _interopRequireDefault(require("./FileListInput"));

var _DateInYearInput = _interopRequireDefault(require("./DateInYearInput"));

var _DualComboBox = _interopRequireDefault(require("./DualComboBox"));

var _CKInlineShortTemplate = _interopRequireDefault(require("./CKInlineShortTemplate"));

var _LocationInput = _interopRequireDefault(require("./LocationInput"));

var _LocationView = _interopRequireDefault(require("./LocationView"));

var _MultiSelectListText = _interopRequireDefault(require("./MultiSelectListText"));

var _DualSelectListText = _interopRequireDefault(require("./DualSelectListText"));

var _ColorInput = _interopRequireDefault(require("./ColorInput"));

var _MonthInput = _interopRequireDefault(require("./MonthInput"));

var _TreeTable = _interopRequireDefault(require("./TreeTable"));


var ComponentTreeList = {
  text: "all",
  children: [{
    text: 'layout',
    children: [_RelativeLayout.default, _LinearLayout.default, _ChainLayout.default]
  }, {
    text: 'input',
    children: [_DateInput.default, _DateInYearInput.default, _TimeInput.default, _Time24Input.default, _TimeRange24Input.default, _DateTimeInput.default, _WeekInput.default, _MonthInput.default, _TextInput.default, _TextArea.default, _NumberInput.default, _ColorInput.default, _ComboBox.default, _MultiselectComboBox.default, _TreeComboBox.default, _TreeLeafComboBox.default, _MultiSelectTreeComboBox.default, _MultiSelectTreeLeafComboBox.default, _DualComboBox.default, _Radio.default, _Checkbox.default, _TrackBar.default, _TrackBarInput.default, _TableInput.default, _ImageFileInput.default, _FileInput.default, _FileListInput.default, _CKEditor.default, _CKTemplateEditor.default, _CKInlineShortTemplate.default, _LocationInput.default, _LocationView.default]
  }, {
    text: 'static',
    children: [_Label.default, _Text.default, _Image.default, _Table.default, _TreeTable.default, _SelectListText.default, _MultiSelectListText.default, _DualSelectListText.default]
  }, {
    text: 'trigger',
    children: [_Button.default]
  }, {
    text: 'mapping',
    children: [_ArrayOfFragment.default, _EditableArrayOfFragment.default]
  }, {
    text: 'shape',
    children: [_Ellipse.default, _Rectangle.default]
  }, {
    text: 'fragment',
    children: []
  }, {
    text: 'template',
    children: []
  }]
};
var _default = ComponentTreeList;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/ComponentPicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/ComponentPicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _RelativeLayout = _interopRequireDefault(require("../layouts/RelativeLayout"));

var _DateInput = _interopRequireDefault(require("../components/DateInput"));

var _TextInput = _interopRequireDefault(require("../components/TextInput"));

var _TextArea = _interopRequireDefault(require("../components/TextArea"));

var _NumberInput = _interopRequireDefault(require("../components/NumberInput"));

var _ComboBox = _interopRequireDefault(require("../components/ComboBox"));

var _Radio = _interopRequireDefault(require("../components/Radio"));

var _Checkbox = _interopRequireDefault(require("../components/Checkbox"));

var _Label = _interopRequireDefault(require("../components/Label"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

require("../../css/componentpicker.css");

var _Draggable = _interopRequireDefault(require("absol-acomp/js/Draggable"));

var _R = _interopRequireDefault(require("../R"));

var _PluginManager = _interopRequireDefault(require("../core/PluginManager"));

var _ComponentTreeList = _interopRequireDefault(require("../components/ComponentTreeList"));

var _CPUViewer = _interopRequireDefault(require("absol-acomp/js/CPUViewer"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


var _ = _FCore.default._;
var $ = _FCore.default.$;

function ComponentPicker() {
  _Context.default.call(this);

  _EventEmitter.default.call(this);

  this.$view = null;
  /**
   * @type {import('./LayoutEditor').default}
   */

  this.layoutEditor = null;
}

_OOP.default.mixClass(ComponentPicker, _Context.default, _EventEmitter.default);

ComponentPicker.prototype.onAttached = function () {
  this.layoutEditor = this.getContext(_R.default.LAYOUT_EDITOR);
};

ComponentPicker.prototype.getView = function () {
  if (this.$view) return this.$view;
  var self = this;

  function toggleGroup() {
    this.status = {
      open: 'close',
      close: 'open'
    }[this.status];
  }

  function makeExp(node) {
    if (typeof node === 'object') {
      return {
        tag: 'exptree',
        props: {
          name: node.text,
          status: 'close'
        },
        on: {
          press: toggleGroup
        },
        child: node.children ? node.children.map(makeExp) : []
      };
    } else if (typeof node === 'function') {
      return {
        tag: 'exptree',
        props: {
          name: node.prototype.tag,
          icon: node.prototype.menuIcon,
          componentConstructor: node
        }
      };
    } else {
      console.error('Invalid node ', node);
    }
  }

  this.$view = _({
    tag: 'tabframe',
    class: ['as-compopnent-picker', 'as-bscroller'],
    child: makeExp(_ComponentTreeList.default)
  });
  this.$all = $('exptree', this.$view);
  this.$all.status = 'open';
  var context = {
    self: this,
    toggleGroup: toggleGroup,
    $view: this.$view
  };

  _PluginManager.default.exec(this, _R.default.PLUGINS.COMPONENT_PICKER_VIEW, context); //todo: find and call


  _({
    tag: 'hanger',
    elt: this.$all,
    on: {
      predrag: this.ev_constructorPreDrag.bind(self),
      dragstart: self.ev_constructorBeginDrag.bind(self),
      drag: self.ev_constructorDrag.bind(self),
      dragend: self.ev_constructorEndDrag.bind(self)
    }
  });

  return this.$view;
};

ComponentPicker.prototype._findComponentConstructor = function (elt) {
  while (elt) {
    if (elt.componentConstructor) return elt.componentConstructor;
    elt = elt.parentElement;
  }

  return null;
};

ComponentPicker.prototype.ev_constructorPreDrag = function (event) {
  if (!this._findComponentConstructor(event.target)) {
    event.cancel();
  }
};

ComponentPicker.prototype.ev_constructorBeginDrag = function (event) {
  var constructor = this._findComponentConstructor(event.target);

  this._currentComponentConstructor = constructor;
  this.$modal = this.$modal || _('.as-compopnent-picker-foreground');
  this.$higne = this.$higne || _('.as-compopnent-picker-higne').addTo(this.$modal);
  this.$addBoxCtn = this.$addBoxCtn || _('.as-compopnent-picker-add-box-container').addTo(this.$higne);
  this.$addBox = this.$addBox || _({
    class: 'as-compopnent-picker-add-box',
    child: {
      class: 'as-compopnent-picker-add-box-plus',
      child: 'span.mdi.mdi-plus'
    }
  }).addTo(this.$addBoxCtn);
  if (this.$addBoxIcon) this.$addBoxIcon.remove();
  this.$addBoxIcon = _(constructor.prototype && constructor.prototype.menuIcon || 'span.mdi.mdi-select-place').addTo(this.$addBox);
  this.$modal.addTo(document.body);

  if (this.layoutEditor.rootLayout) {
    this._dragRect = this.layoutEditor.rootLayout.domElt.getBoundingClientRect();
  } else {
    this._dragRect = undefined;
  }
};

ComponentPicker.prototype.ev_constructorEndDrag = function (event) {
  if (!this.$modal) return; //quick fix, must fix in Draggable

  _CPUViewer.default.hold();

  this.$modal.remove();
  var constructor = this._currentComponentConstructor;
  var x = event.clientX;
  var y = event.clientY;
  var rect = this._dragRect;

  if (rect && rect.top <= y && rect.bottom >= y && rect.left <= x && rect.right >= x) {
    this.layoutEditor.addNewComponent(constructor, x - rect.left, y - rect.top);
  }

  _CPUViewer.default.release();
};

ComponentPicker.prototype.ev_constructorDrag = function (event) {
  this.$addBoxCtn.addStyle({
    left: event.clientX + 'px',
    top: event.clientY + 'px'
  });
  var x = event.clientX;
  var y = event.clientY;
  var rect = this._dragRect;

  if (rect && rect.top <= y && rect.bottom >= y && rect.left <= x && rect.right >= x) {
    this.$addBox.addClass('as-can-drop');
  } else {
    this.$addBox.removeClass('as-can-drop');
  }
};

var _default = ComponentPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/ciruiteditor/blockeditor/BlockPicker.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/ciruiteditor/blockeditor/BlockPicker.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _FCore = require("../../core/FCore");


/***
 * @augments Fragment
 * @augments EventEmitter
 * @constructor
 */
function BlockPicker() {
  _Fragment.default.call(this);

  _EventEmitter.default.call(this);
}

_OOP.default.mixClass(BlockPicker, _Fragment.default, _EventEmitter.default);

BlockPicker.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    tag: 'tabframe',
    class: 'as-block-picker'
  });
};

var _default = BlockPicker;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/flexformeditor/FlexFormComponentTool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/flexformeditor/FlexFormComponentTool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../core/FCore");

var _FrameView = _interopRequireDefault(require("absol-acomp/js/FrameView"));

var _ComponentPicker = _interopRequireDefault(require("../layouteditor/ComponentPicker"));

var _BlockPicker = _interopRequireDefault(require("../ciruiteditor/blockeditor/BlockPicker"));


function FlexFormComponentTool() {
  _BaseEditor.default.call(this);

  this.componentPicker = new _ComponentPicker.default();
  this.blockPicker = new _BlockPicker.default();
  this.subTools = [this.componentPicker, this.blockPicker];
  this._activatedToolIdx = -1;
}

_OOP.default.mixClass(FlexFormComponentTool, _BaseEditor.default);

FlexFormComponentTool.prototype.onAttached = function () {
  this.componentPicker.attach(this);
};

FlexFormComponentTool.prototype.createView = function () {
  this.$emptyTab = (0, _FCore._)('tabframe');
  this.$view = (0, _FCore._)({
    tag: _FrameView.default.tag,
    class: "as-flex-form-component-tool",
    child: [this.componentPicker.getView(), this.blockPicker.getView(), this.$emptyTab]
  });
  this.activeToolTab(0);
  this.componentPicker.getView().requestActive();
};

FlexFormComponentTool.prototype.onStart = function () {
  this.componentPicker.start();
};

FlexFormComponentTool.prototype.onStop = function () {
  this.componentPicker.stop();
};

FlexFormComponentTool.prototype.activeToolTab = function (idx) {
  if (this._activatedToolIdx === idx) return;
  this._activatedToolIdx = idx;

  if (this.subTools[this._activatedToolIdx]) {
    this.subTools[this._activatedToolIdx].getView().requestActive();
  } else {
    this.$emptyTab.requestActive();
  }
};

var _default = FlexFormComponentTool;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/flexformeditor/FlexFormEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/flexformeditor/FlexFormEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../core/FCore");

require("../../css/flexformeditor.css");

var _LayoutEditor = _interopRequireDefault(require("../layouteditor/LayoutEditor"));

var _BlockEditor = _interopRequireDefault(require("../ciruiteditor/blockeditor/BlockEditor"));

var _R = _interopRequireDefault(require("../R"));

var _utils = require("../core/utils");

var _CircuitDiagramEditor = _interopRequireDefault(require("../ciruiteditor/diagrameditor/CircuitDiagramEditor"));

var _FlexFormEditorCmd = _interopRequireDefault(require("./FlexFormEditorCmd"));

var _FlexFormOutline = _interopRequireDefault(require("./FlexFormOutline"));

var _FlexFormComponentTool = _interopRequireDefault(require("./FlexFormComponentTool"));

var _generator = require("absol/src/JSMaker/generator");


function FlexFormEditor() {
  _BaseEditor.default.call(this);

  this.cmdRunner.assign(_FlexFormEditorCmd.default);
  this._data = null;
  this._activatedEditorIdx = -1;
  this.setContext(_R.default.FLEX_FORM_EDITOR, this);
  this.layoutEditor = new _LayoutEditor.default();
  this.blockEditor = new _BlockEditor.default();
  this.diagramEditor = new _CircuitDiagramEditor.default();
  this.flexFormComponentTool = new _FlexFormComponentTool.default();
  /***
   *
   * @type {(LayoutEditor|BlockEditor|CircuitDiagramEditor)[]}
   */

  this.subEditors = [this.layoutEditor, this.blockEditor, this.diagramEditor];
  this.flexFormOutline = new _FlexFormOutline.default();
  this.setContext(_R.default.LAYOUT_EDITOR, this.layoutEditor);
  this.setContext(_R.default.DIAGRAM_EDITOR, this.diagramEditor);
  this.setContext(_R.default.BLOCK_EDITOR, this.blockEditor);
  this.setContext(_R.default.FLEX_FORM_OUTLINE, this.flexFormOutline);
  this.setContext(_R.default.COMPONENT_OUTLINE, this.flexFormOutline.componentOutline);
  this.setContext(_R.default.FLEX_FORM_COMPONENT_TOOL, this.flexFormComponentTool);
  this.setContext(_R.default.COMPONENT_PICKER, this.flexFormComponentTool.componentPicker);
}

_OOP.default.mixClass(FlexFormEditor, _BaseEditor.default);

FlexFormEditor.prototype.setData = function (data) {
  try {
    data = this.implicitData(data);
    this.getView();
    this._data = data || {};
    this.layoutEditor.setData(data.layout);
    this.blockEditor.setData(data.circuit.blocks);
    this.diagramEditor.setData(data.circuit.lines, data.circuit.diagram);
  } catch (err) {
    var dataBlob = new Blob(['data = ' + (0, _generator.generateJSVariable)(data)], {
      type: 'text/plain'
    });
    console.error("Error data", [URL.createObjectURL(dataBlob), data]);
    console.error(err);
  }
};

FlexFormEditor.prototype.getData = function () {
  this._data.layout = this.layoutEditor.getData();
  this._data.circuit.blocks = this.blockEditor.getData();
  this._data.circuit.lines = this.diagramEditor.getLineData();
  this._data.circuit.diagram = this.diagramEditor.getDiagramData();
  return this.explicitData(this._data);
};
/***
 * @typedef FDPermissions
 * @property {string} owner
 */

/***
 *
 * @typedef FDAttributes
 * @property {string} id
 * @property {string} name
 * @property {FDPermissions} permissions
 *
 * */

/***
 * @typedef FDStyle
 * @extends Object
 * * */

/***
 * @typedef ComponentData
 * @property {string} tag
 * @property {FDAttributes} attributes
 * @property {FDStyle} style
 * @property {ComponentData[]} children
 * */

/***
 * @typedef DiagramData
 * @property {string[]} includedBlocks
 * @property {{}} positions
 *
 */

/***
 * @typedef BlockData
 * @property {string} tag
 * @property {FDAttributes} attributes
 */

/***
 * @typedef LineData
 * @property {string} u
 * @property {string} uPin
 * @property {string} v
 * @property {string} vPin
 * @property {string} id
 * @property {FDPermissions} permissions
 */

/***
 * @typedef CircuitData
 * @property {BlockData[]} blocks
 * @property {LineData[]} lines
 * @property {DiagramData} diagram
 */

/***
 *
 * @typedef FormData
 * @property {string} app
 * @property {string} version
 * @property {ComponentData} layout
 * @property {CircuitData} circuit
 *
 *
 */


FlexFormEditor.prototype.implicitData = function (data) {
  data = (0, _generator.copyJSVariable)(data);
  var layout = data.layout || data;
  var version = '1.1.1';
  var circuit = data.circuit || {};
  circuit.blocks = circuit.blocks || [];
  circuit.lines = circuit.lines || [];
  circuit.diagram = circuit.diagram || {};
  circuit.diagram.includedBlocks = circuit.diagram.includedBlocks || [];
  circuit.diagram.positions = circuit.diagram.positions || {};
  circuit.blocks.forEach(function (block) {
    block.attributes.id = block.attributes.id || (0, _utils.randomUniqueIdent)();
    block.attributes.name = block.attributes.name || block.attributes.id;
  });
  var twoWayLines = [];
  circuit.lines.forEach(function (line) {
    line.id = line.id || (0, _utils.randomUniqueIdent)();

    if (line.twoWay) {
      delete line.twoWay;
      twoWayLines.push(Object.assign({}, line, {
        u: line.v,
        v: line.u,
        uPin: line.vPin,
        vPin: line.uPin
      }));
    }
  });
  circuit.lines.push.apply(circuit.lines, twoWayLines);
  var id2Name = {};
  var name2Id = {};
  var idList = {};

  function visit(node) {
    var name = node.attributes && node.attributes.name;
    var id = node.attributes && node.attributes.id; //auto fix tag

    if (!node.tag && !node.class) {
      if (node.attributes && node.attributes.body && 'args' in node.attributes) {
        node.tag = 'function';
        console.warn("Detect node without tag", 'fixed with tag = "function"');
      } else {
        console.warn("Detect node without tag, can not be fixed", node);
      }
    }

    if (!id) {
      if (!node.attributes) {
        node.attributes = {};
      }

      id = (0, _utils.randomUniqueIdent)();
      node.attributes.id = id;
    }

    if (idList[id]) {
      id = (0, _utils.randomUniqueIdent)();

      if (!node.attributes) {
        node.attributes = {};
      }

      node.attributes.id = id;
    }

    idList[id] = true;

    if (id && name) {
      id2Name[id] = name;
      name2Id[name] = id;
    }

    if (node.children) node.children.forEach(visit);
  }

  visit(layout);
  circuit.blocks.forEach(visit);
  circuit.blocks.forEach(function (block) {
    delete block.id; //fix invalid data
  });
  circuit.lines.forEach(function (line) {
    if (name2Id[line.u]) {
      line.u = name2Id[line.u];
    }

    if (name2Id[line.v]) {
      line.v = name2Id[line.v];
    }
  });
  circuit.lines = circuit.lines.filter(function (line) {
    if (!idList[line.u] || !idList[line.v]) {
      console.error("invalid line ", line);
    }

    return idList[line.u] && idList[line.v];
  });
  circuit.diagram.includedBlocks = circuit.diagram.includedBlocks.filter(function (id) {
    return idList[id];
  });
  return {
    app: _R.default.APP,
    version: version,
    layout: layout,
    circuit: circuit
  };
};

FlexFormEditor.prototype.explicitData = function (data) {
  data = (0, _generator.replaceDateStringJSVariable)(data);
  var id2Name = {};
  var nameList = {};

  function visit(node) {
    var name = node.attributes && node.attributes.name;
    var id = node.attributes && node.attributes.id;

    if (id && name && !nameList[name]) {
      nameList[name] = true;
      id2Name[id] = name;
    }

    if (node.children) node.children.forEach(visit);
  }

  visit(data.layout);
  data.circuit && data.circuit.blocks && data.circuit.blocks.forEach(visit);
  data.circuit && data.circuit.lines && data.circuit.lines.forEach(function (line) {
    if (id2Name[line.u]) line.u = id2Name[line.u];
    if (id2Name[line.v]) line.v = id2Name[line.v];
  });
  return data;
};

FlexFormEditor.prototype.createView = function () {
  this.$tabFrames = [(0, _FCore._)({
    tag: 'tabframe',
    child: this.layoutEditor.getView()
  }), (0, _FCore._)({
    tag: 'tabframe',
    child: this.blockEditor.getView()
  }), (0, _FCore._)({
    tag: 'tabframe',
    child: this.diagramEditor.getView()
  })];
  this.$view = (0, _FCore._)({
    class: 'as-flex-form-editor',
    child: [{
      class: 'as-flex-form-editor-right-tab',
      child: [{
        class: 'as-flex-form-editor-right-tab-top',
        child: [{
          tag: 'button',
          class: 'as-form-editor-vertical-tab-btn',
          child: ['span.mdi.mdi-view-quilt[style="color:rgb(30, 100, 255)"]', {
            text: 'Layout'
          }],
          on: {
            click: this.activeEditorTab.bind(this, 0)
          }
        }, {
          tag: 'button',
          class: 'as-form-editor-vertical-tab-btn',
          child: ['mdi-shape', {
            text: 'Blocks'
          }],
          on: {
            click: this.activeEditorTab.bind(this, 1)
          }
        }, {
          tag: 'button',
          class: 'as-form-editor-vertical-tab-btn',
          child: ['span.mdi.mdi-transit-connection-variant[style="color:rgb(255, 100, 50)"]', {
            text: 'Lines'
          }],
          on: {
            click: this.activeEditorTab.bind(this, 2)
          }
        }]
      }]
    }, {
      tag: 'frameview',
      class: 'as-flex-form-editor-frame-view',
      child: this.$tabFrames
    }]
  });
  this.$tabBtns = (0, _FCore.$$)('.as-flex-form-editor-right-tab-top > button', this.$view);
  this.$frameView = (0, _FCore.$)('.as-flex-form-editor-frame-view', this.$view); // console.log(this.$tabFrames[0]);

  this.activeEditorTab(0);
};

FlexFormEditor.prototype.activeEditorTab = function (idx) {
  if (this._activatedEditorIdx === idx) return;
  this._activatedEditorIdx = idx;

  for (var i = 0; i < this.$tabFrames.length; ++i) {
    if (i === idx) {
      this.$tabFrames[i].requestActive();

      if (!this.$tabBtns[i].hasClass('active')) {
        this.$tabBtns[i].addClass('active');

        if (this.state === "RUNNING") {
          this.subEditors[i].start();
        }
      }
    } else {
      if (this.$tabBtns[i].hasClass('active')) {
        this.$tabBtns[i].removeClass('active');
        if (this.state === "RUNNING") this.subEditors[i].pause();
      }
    }
  }

  this.flexFormComponentTool.activeToolTab(idx);
};

FlexFormEditor.prototype.onAttached = function () {
  this.flexFormComponentTool.attach(this);
  this.flexFormOutline.attach(this);
  this.layoutEditor.attach(this);
  this.blockEditor.attach(this);
  this.diagramEditor.attach(this);
};

FlexFormEditor.prototype.onStart = function () {
  /****
   *
   * @type {FormEditor}
   */
  this.formEditor = this.getContext(_R.default.FORM_EDITOR);
  this.selfHolder = this.formEditor.getEditorHolderByEditor(this);
  this.layoutEditor.start(true);
  this.blockEditor.start(true);
  this.diagramEditor.start(true);
  this.flexFormOutline.start();
  this.flexFormComponentTool.start();
};

FlexFormEditor.prototype.onResume = function () {
  if (this._activatedEditorIdx >= 0) {
    this.subEditors[this._activatedEditorIdx].resume();
  }
};

FlexFormEditor.prototype.onPause = function () {
  if (this._activatedEditorIdx >= 0) this.subEditors[this._activatedEditorIdx].pause();
};

FlexFormEditor.prototype.onStop = function () {
  this.layoutEditor.stop();
  this.blockEditor.stop();
  this.diagramEditor.stop();
  this.flexFormOutline.stop();
  this.flexFormComponentTool.stop();
};

FlexFormEditor.prototype.onDestroy = function () {
  this.layoutEditor.destroy();
  this.blockEditor.destroy();
  this.diagramEditor.destroy();
};

FlexFormEditor.prototype.getOutlineTool = function () {
  return this.flexFormOutline;
};

FlexFormEditor.prototype.getComponentTool = function () {
  return this.flexFormComponentTool;
};

FlexFormEditor.prototype.notifyUnsaved = function () {
  this.selfHolder.tabframe.modified = true;
};

FlexFormEditor.prototype.notifySaved = function () {
  this.selfHolder.tabframe.modified = false;
};

var _default = FlexFormEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/controller/FLUserInteractionController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/controller/FLUserInteractionController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../../core/FCore"));



/***
 *
 * @param {FMLauncher|FLauncher} launcher
 * @constructor
 */
function FLUserInteractionController(launcher) {
  this.launcher = launcher;
  this.ctrlKey = false;
  this.altKey = false;
  this.capsLockKey = false;
  this.shiftKey = false;
  this.clientX = 0;
  this.clientY = 0;
}

FLUserInteractionController.prototype.onCreateView = function () {
  this.launcher.$view.on('keydown', this.onEvent.bind(this)).on('keydown', this.onEvent.bind(this)).on('keyup', this.onEvent.bind(this)).on('mousemove', this.onEvent.bind(this)).on('mousedown', this.onEvent.bind(this)).on('mouseup', this.onEvent.bind(this));
  this.$keyCapsLock = (0, _FCore._)('span.mdi.mdi-apple-keyboard-caps').addStyle('opacity', '0.2');
  this.$keyShift = (0, _FCore._)('span.mdi.mdi-apple-keyboard-shift').addStyle('opacity', '0.2');
  this.$keyCtrl = (0, _FCore._)('span.mdi.mdi-apple-keyboard-command').addStyle('opacity', '0.2');
  this.$keyAlt = (0, _FCore._)('span.mdi.mdi-apple-keyboard-option').addStyle('opacity', '0.2');
  this.$statusItem = (0, _FCore._)({
    tag: 'span',
    class: ['as-status-bar-item', 'as-keyboard-status'],
    child: [{
      text: ' '
    }, 'span.mdi.mdi-keyboard-variant', this.$keyCapsLock, this.$keyShift, this.$keyCtrl, this.$keyAlt, {
      text: ' '
    }]
  });
  this.launcher.$statusBar.$rightCtn.addChild(this.$statusItem);
};
/***
 *
 * @param {MouseEvent|KeyboardEvent} event
 */


FLUserInteractionController.prototype.onEvent = function (event) {
  this.ctrlKey = event.ctrlKey;
  this.altKey = event.altKey;
  this.shiftKey = event.shiftKey;
  this.capsLockKey = event.getModifierState("CapsLock");

  if (event.clientX !== undefined) {
    this.clientX = event.clientX;
    this.clientY = event.clientY;
  }

  this.$keyShift.addStyle('opacity', this.shiftKey ? '1' : 0.1);
  this.$keyCtrl.addStyle('opacity', this.ctrlKey ? '1' : 0.1);
  this.$keyCapsLock.addStyle('opacity', this.capsLockKey ? '1' : 0.1);
  this.$keyAlt.addStyle('opacity', this.altKey ? '1' : 0.1);
};

var _default = FLUserInteractionController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/FMLauncher.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/FMLauncher.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Draggable = _interopRequireDefault(require("absol-acomp/js/Draggable"));

require("../../css/formeditor.css");

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _R = _interopRequireDefault(require("../R"));

var _FormPreview = _interopRequireDefault(require("../editor/FormPreview"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _ProjectExplorer = _interopRequireDefault(require("../fragment/ProjectExplorer"));

var _PluginManager = _interopRequireDefault(require("../core/PluginManager"));

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _CodeEditor = _interopRequireDefault(require("../editor/CodeEditor"));

var _FormEditorCmd = _interopRequireDefault(require("../cmds/FormEditorCmd"));

var _PhotoViewer = _interopRequireDefault(require("../editor/PhotoViewer"));

var _StatusBar = _interopRequireDefault(require("../dom/StatusBar"));

var _FlexFormEditor = _interopRequireDefault(require("../flexformeditor/FlexFormEditor"));

var _FLUserInteractionController = _interopRequireDefault(require("./controller/FLUserInteractionController"));

var _utils = require("absol-acomp/js/utils");


var _ = _FCore.default._;
var $ = _FCore.default.$;

function FMLauncher(options) {
  this.options = options || {};

  _BaseEditor.default.call(this);

  this.prefix = (0, _stringGenerate.randomIdent)(16) + "_";
  this.setContext(_R.default.FORM_EDITOR, this);
  this.setContext(_R.default.LAUNCHER, this);
  this.cmdRunner.assign(_FormEditorCmd.default);
  this.userInteractionCtrl = new _FLUserInteractionController.default(this);
  this.style = {
    leftSizeWidth: 16,
    //em
    leftSizeMinWidth: 10,
    rightSizeWidth: 23,
    //em
    rightSizeMinWidth: 15
  };
  this.projectExplorer = new _ProjectExplorer.default();
  this.editorHolders = {};
  this.activeEditorHolder = null;
  this.mFormPreview = new _FormPreview.default();
  this.$statusBar = _(_StatusBar.default.tag);
  this.setContext(_R.default.STATUS_BAR_ELT, this.$statusBar);
  this.setContext(_R.default.PROJECT_EXPLORER, this.projectExplorer);
  this.mFormPreview.attach(this);
  this.projectExplorer.attach(this);
}

Object.defineProperties(FMLauncher.prototype, Object.getOwnPropertyDescriptors(_BaseEditor.default.prototype));
FMLauncher.prototype.constructor = FMLauncher;
FMLauncher.prototype.CONFIG_STORE_KEY = "AS_FormEditor_config";
FMLauncher.prototype.SUPPORT_EDITOR = {
  form: _FlexFormEditor.default,
  image: _PhotoViewer.default,
  jpg: _PhotoViewer.default
};
Object.keys(_CodeEditor.default.prototype.TYPE_MODE).forEach(function (typeName) {
  FMLauncher.prototype.SUPPORT_EDITOR[typeName] = _CodeEditor.default;
});

FMLauncher.prototype.onStart = function () {
  this.projectExplorer.start();
};

FMLauncher.prototype.onStop = function () {
  this.projectExplorer.stop();
};

FMLauncher.prototype.onPause = function () {
  this.projectExplorer.pause();
  var self = this;
  this.runningEditorsIsPaused = Object.keys(this.editorHolders).filter(function (id) {
    var holder = self.editorHolders[id];

    if (holder.editor && holder.editor.state == 'RUNNING') {
      holder.editor.pause();
      return true;
    }
  });
};

FMLauncher.prototype.onResume = function () {
  this.projectExplorer.resume();
  var self = this;

  if (this.runningEditorsIsPaused) {
    this.runningEditorsIsPaused.forEach(function (id) {
      var holder = self.editorHolders[id];

      if (holder.editor && holder.editor.state.match('PAUSE')) {
        holder.editor.resume();
      }
    });
    this.runningEditorsIsPaused = [];
  }
};

FMLauncher.prototype.onDestroy = function () {};

FMLauncher.prototype.config = {
  leftSiteWidthPercent: 15
};

FMLauncher.prototype.loadConfig = function () {
  _BaseEditor.default.prototype.loadConfig.apply(this, arguments);

  if (!(0, _utils.isRealNumber)(this.config.leftSiteWidthPercent)) this.config.leftSiteWidthPercent = 15;
};

FMLauncher.prototype.openProject = function (name) {
  this.projectExplorer.openProject(name);
};

FMLauncher.prototype.openItem = function (type, ident, name, contentArguments, desc) {
  var self = this;

  if (this.editorHolders[ident]) {
    this.editorHolders[ident].tabframe.requestActive();
  } else {
    if (this.SUPPORT_EDITOR[type]) {
      var editor = new this.SUPPORT_EDITOR[type]();
      editor.attach(this);
      var accumulator = {
        type: type,
        contentArguments: contentArguments
      };
      this.openEditorTab(ident, name, desc, editor, accumulator);

      _PluginManager.default.exec(this, _R.default.PLUGINS.LOAD_CONTENT_DATA, accumulator);
    } else {
      throw new Error("The editor not support " + type + ' type!');
    }
  }

  return this.editorHolders[ident];
};

FMLauncher.prototype.openEditorTab = function (ident, name, desc, editor, accumulator) {
  var self = this;
  accumulator = accumulator || {};
  var componentTool = editor.getComponentTool && editor.getComponentTool();
  var outlineTool = editor.getOutlineTool && editor.getOutlineTool();

  var tabframe = _({
    tag: 'tabframe',
    attr: {
      name: name,
      desc: desc
    },
    child: editor.getView()
  });

  Object.assign(accumulator, {
    tabframe: tabframe,
    ident: ident,
    name: name,
    desc: desc,
    editor: editor,
    formEditor: this,
    componentTool: componentTool,
    outlineTool: outlineTool,
    sync: Promise.resolve(),
    waitFor: function (aw) {
      if (!aw.then) aw = Promise.resolve(aw);
      this.sync = Promise.all([this.sync, aw]);
    }
  });
  this.editorHolders[ident] = accumulator;
  this.$editorSpaceCtn.removeStyle('visibility');
  tabframe.on({
    inactive: function () {
      editor.pause();
      if (self.activeEditorHolder == accumulator) self.activeEditorHolder = null;
      if (componentTool) componentTool.getView().remove();
      if (outlineTool) outlineTool.getView().remove();
    },
    active: function () {
      editor.start();
      self.activeEditorHolder = accumulator;

      if (componentTool) {
        componentTool.getView().addTo(self.$componentTabFrame);
        self.$componentTabBtb.removeClass('as-hidden');
      } else {
        self.$componentTabBtb.addClass('as-hidden');
      }

      if (outlineTool) {
        outlineTool.getView().addTo(self.$outlineTabFrame);
        self.$outlineTabBtb.removeClass('as-hidden');
      } else {
        self.$outlineTabBtb.addClass('as-hidden');
      }

      if (self._lastToolTabIdent === 'tab-outline' && !outlineTool || self._lastToolTabIdent === 'tab-component' && !componentTool) {
        self.toggleToolTab('tab-explorer');
      }
    },
    remove: function () {
      self.editorHolders[ident].editor.destroy();
      self.editorHolders[ident] = undefined;
      delete self.editorHolders[ident];
      if (Object.keys(self.editorHolders).length == 0) self.$editorSpaceCtn.addStyle('visibility', 'hidden');

      if (self.activeEditorHolder == accumulator) {
        self.$componentTabBtb.addClass('as-hidden');
        self.$outlineTabBtb.addClass('as-hidden');
      }

      if (self._lastToolTabIdent !== 'tab-explorer') {
        self.toggleToolTab('tab-explorer');
      }
    }
  });
  this.$mainTabview.addChild(tabframe); // tabframe.requestActive();

  return accumulator;
};

FMLauncher.prototype.getEditorHolderByIdent = function (ident) {
  return this.editorHolders[ident];
};

FMLauncher.prototype.getEditorHolderByEditor = function (editor) {
  for (var ident in this.editorHolders) {
    if (this.editorHolders[ident].editor == editor) return this.editorHolders[ident];
  }

  return null;
};

FMLauncher.prototype.getAllEditorHolderByEditorClass = function (clazz) {
  var res = [];

  for (var ident in this.editorHolders) {
    if (this.editorHolders[ident].editor.constructor == clazz) res.push(this.editorHolders[ident]);
  }

  return res;
};

FMLauncher.prototype.createView = function () {
  var self = this;
  this.$view = _({
    class: 'as-form-editor',
    attr: {
      tabindex: '1'
    },
    child: [{
      class: 'as-form-editor-left-tab-bar',
      child: [{
        class: 'as-form-editor-left-tab-bar-top',
        child: [{
          tag: 'button',
          class: 'as-form-editor-vertical-tab-btn',
          id: this.prefix + 'button-tab-explorer',
          child: ['span.mdi.mdi-file-multiple', {
            tag: 'span',
            child: {
              text: 'Explorer'
            }
          }],
          on: {
            click: this.toggleToolTab.bind(this, 'tab-explorer')
          }
        }, {
          tag: 'button',
          id: this.prefix + 'button-tab-component',
          class: ['as-form-editor-vertical-tab-btn', 'as-hidden'],
          child: ['span.mdi.mdi-view-grid-outline', {
            tag: 'span',
            child: {
              text: 'Components'
            }
          }],
          on: {
            click: this.toggleToolTab.bind(this, 'tab-component')
          }
        }, {
          tag: 'button',
          class: ['as-form-editor-vertical-tab-btn', 'as-hidden'],
          id: this.prefix + 'button-tab-outline',
          child: ['span.mdi.mdi-view-list', {
            tag: 'span',
            child: {
              text: 'Outline'
            }
          }],
          on: {
            click: this.toggleToolTab.bind(this, 'tab-outline')
          }
        }]
      }]
    }, {
      class: 'as-form-editor-left-site-container',
      style: {
        width: 'calc(' + this.config.leftSiteWidthPercent + "% - 20px)"
      },
      child: {
        tag: 'frameview',
        class: ['xp-tiny', 'as-form-editor-left-site'],
        child: [{
          tag: 'tabframe',
          class: ['as-form-left-tool-site-tab'],
          attr: {
            name: 'Explorer',
            id: this.prefix + 'tab-explorer'
          },
          child: [{
            class: 'as-form-tool-site-header',
            child: {
              tag: 'span',
              child: {
                text: 'EXPLORER'
              }
            }
          }, this.projectExplorer.getView()]
        }, {
          tag: 'tabframe',
          class: ['as-form-left-tool-site-tab', 'absol-bscroller'],
          attr: {
            name: 'Component',
            id: this.prefix + 'tab-component'
          },
          child: [{
            class: 'as-form-tool-site-header',
            child: {
              tag: 'span',
              child: {
                text: 'COMPONENTS'
              }
            }
          }]
        }, {
          tag: 'tabframe',
          class: ['as-form-left-tool-site-tab'],
          attr: {
            name: 'Outline',
            id: this.prefix + 'tab-outline'
          },
          child: [{
            class: 'as-form-tool-site-header',
            child: {
              tag: 'span',
              child: {
                text: 'OUTLINE'
              }
            }
          }]
        }]
      }
    }, {
      class: 'as-form-editor-empty-space',
      style: {
        left: 'calc(' + this.config.leftSiteWidthPercent + "%)"
      },
      child: {
        tag: 'frame-ico',
        style: {
          width: '10em',
          height: '10em',
          '-webkit-filter': 'grayscale(100%)',
          filter: 'grayscale(100%)',
          opacity: '0.2',
          position: 'absolute',
          right: '1em',
          bottom: '1em'
        }
      }
    }, {
      class: 'as-form-editor-editor-space-container',
      style: {
        left: 'calc(' + this.config.leftSiteWidthPercent + "%)",
        visibility: 'hidden'
      },
      child: {
        tag: 'tabview',
        class: 'as-form-editor-main-tabview'
      }
    }, {
      class: ['as-form-editor-resizer', 'vertical', 'left-site'],
      style: {
        left: 'calc(' + this.config.leftSiteWidthPercent + "% - 0.2em)"
      }
    }, this.$statusBar],
    on: {
      keydown: this.ev_keydown.bind(this)
    }
  });
  this.$exploreTabBtb = $('#' + this.prefix + 'button-tab-explorer', this.$view);
  this.$componentTabBtb = $('#' + this.prefix + 'button-tab-component', this.$view);
  this.$outlineTabBtb = $('#' + this.prefix + 'button-tab-outline', this.$view);
  this.$quickToolBar = _({
    class: 'as-form-editor-quick-toolbar'
  });
  this.quickToolTabMenu = _({
    tag: 'button',
    child: 'span.mdi.mdi-dots-horizontal'
  }).addTo(this.$quickToolBar);

  _QuickMenu.default.toggleWhenClick(this.quickToolTabMenu, {
    onSelect: function (item) {
      var cmd = item.cmd;

      if (cmd) {
        self.execCmd(cmd);
      }
    },
    getMenuProps: function () {
      return {
        extendStyle: {
          'font-size': '14px'
        },
        items: [{
          text: "Close All",
          icon: 'span.mdi.mdi-close-box-multiple-outline',
          cmd: 'closeAll'
        }, {
          text: "Close Saved",
          icon: 'span.mdi.mdi-progress-close',
          cmd: 'closeSaved'
        }, {
          text: "Save All and Close",
          icon: 'span.mdi.mdi-content-save-all-outline',
          cmd: 'saveAllNClose'
        }]
      };
    }
  });

  this.$leftTabbar = $('.as-form-editor-left-tab-bar', this.$view);
  this.$mainTabview = $('.as-form-editor-main-tabview', this.$view);
  this.$mainTabview.appendChild(this.$quickToolBar);
  this.$exploreTabFrame = $('tabframe#' + this.prefix + 'tab-explorer', this.$view);
  this.$componentTabFrame = $('tabframe#' + this.prefix + 'tab-component', this.$view);
  this.$outlineTabFrame = $('tabframe#' + this.prefix + 'tab-outline', this.$view);
  this.$attachhook = _('attachook').addTo(this.$view).on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.updateSize = this.updateSize || self.ev_resize.bind(this);
  });
  this.$leftSiteCtn = $('.as-form-editor-left-site-container', this.$view);
  this.$rightSiteCtn = $('.as-form-editor-right-site-container', this.$view);
  this.$editorSpaceCtn = $('.as-form-editor-editor-space-container', this.$view);
  this.$emptySpace = $('.as-form-editor-empty-space', this.$view);
  this.$leftSiteResizer = (0, _Draggable.default)($('.as-form-editor-resizer.vertical.left-site', this.$view)).on('predrag', this.ev_preDragLeftResizer.bind(this)).on('enddrag', this.ev_endDragLeftResizer.bind(this)).on('drag', this.ev_dragLeftResizer.bind(this));
  this.$leftFrameView = $('frameview', this.$leftSiteCtn);
  this.$leftFrameView.activeFrameById(this.prefix + 'tab-component');
  this.$contextCaptor = _('contextcaptor').addTo(this.$view).attachTo(this.$view);
  this.toggleToolTab('tab-explorer');
  this.userInteractionCtrl.onCreateView();
  return this.$view;
};

FMLauncher.prototype.ev_resize = function () {};

FMLauncher.prototype.setLeftSiteWidthPercent = function (value) {
  if (!(0, _utils.isRealNumber)(value)) value = 8;

  if (value > 8) {
    this.config.leftSiteWidthPercent = value;
    this.saveConfig();

    if (this.$view) {
      this.$leftSiteCtn.addStyle('width', 'calc(' + this.config.leftSiteWidthPercent + "% - 20px)");
      this.$editorSpaceCtn.addStyle('left', this.config.leftSiteWidthPercent + '%');
      this.$emptySpace.addStyle('left', this.config.leftSiteWidthPercent + '%');

      if (this._dragLeftMovingData) {
        this.$leftSiteResizer.addStyle({
          left: 'calc(' + this.config.leftSiteWidthPercent + '% - 5em -20px)'
        });
      } else this.$leftSiteResizer.addStyle('left', 'calc(' + this.config.leftSiteWidthPercent + "% - 0.1em)");
    }
  }
};

FMLauncher.prototype.ev_preDragLeftResizer = function (event) {
  this.$leftSiteResizer.addStyle({
    width: '19em',
    left: 'calc(' + this.config.leftSiteWidthPercent + '% - 8em)'
  });
  this._dragLeftMovingData = {
    widthPercent: this.config.leftSiteWidthPercent,
    fontSize: this.$view.getFontSize(),
    bound: this.$view.getBoundingClientRect()
  };
};

FMLauncher.prototype.ev_endDragLeftResizer = function (event) {
  this._dragLeftMovingData = undefined;
  delete this._dragLeftMovingData;
  this.setLeftSiteWidthPercent(this.config.leftSiteWidthPercent);
  this.$leftSiteResizer.removeStyle('width');
  this.saveConfig();
};

FMLauncher.prototype.ev_dragLeftResizer = function (event) {
  this.setLeftSiteWidthPercent(this._dragLeftMovingData.widthPercent + event.moveDX / this._dragLeftMovingData.bound.width * 100);

  _Dom.default.updateResizeSystem();
};

FMLauncher.prototype.ev_keydown = function (event) {};

FMLauncher.prototype.ev_layoutEditorChange = function () {};

FMLauncher.prototype.toggleToolTab = function (ident) {
  if (this._lastToolTabIdent !== ident) {
    this.$leftFrameView.activeFrameById(this.prefix + ident);
    $('button', this.$leftTabbar, function (button) {
      if (button.id && button.id.indexOf(ident) >= 0) {
        button.addClass('active');
      } else {
        button.removeClass('active');
      }
    });
    this.$leftSiteResizer.removeStyle('display');

    if (!this._lastToolTabIdent) {
      this.$leftSiteCtn.removeStyle('visibility');
      this.$leftSiteCtn.addStyle('width', 'calc(' + this.config.leftSiteWidthPercent + "% - 20px)");
      this.$editorSpaceCtn.addStyle('left', this.config.leftSiteWidthPercent + '%');
      this.$emptySpace.addStyle('left', this.config.leftSiteWidthPercent + '%');
      window.dispatchEvent(new Event('resize'));
    }

    this._lastToolTabIdent = ident;
  } else {
    this._lastToolTabIdent = null;
    this.$leftFrameView.activeFrame(null);
    $('button', this.$leftTabbar, function (button) {
      button.removeClass('active');
    });
    this.$leftSiteResizer.addStyle('display', 'none');
    this.$leftSiteCtn.addStyle('visibility', 'hidden');
    this.$editorSpaceCtn.addStyle('left', '20px');
    this.$emptySpace.addStyle('left', '20px');
    window.dispatchEvent(new Event('resize'));
  }
};

var _default = FMLauncher;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/ListEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/ListEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

require("../../css/listeditor.css");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _utils = require("absol-acomp/js/utils");


var _ = _FCore.default._;
var $ = _FCore.default.$;

function ListEditor() {
  _Context.default.call(this);

  _EventEmitter.default.call(this);

  this._data = [];
  this._lashHashValue = -1.1;
}

Object.defineProperties(ListEditor.prototype, Object.getOwnPropertyDescriptors(_Context.default.prototype));
Object.defineProperties(ListEditor.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
ListEditor.prototype.constructor = ListEditor;

ListEditor.prototype.getView = function () {
  if (this.$view) return this.$view;
  var self = this;
  this.$view = _({
    tag: 'table',
    class: 'as-list-editor',
    child: [{
      tag: 'thead',
      child: [{
        tag: 'tr',
        child: [{
          tag: 'td',
          child: {
            text: 'Text'
          }
        }, {
          tag: 'td',
          child: {
            text: 'Value'
          }
        }, {
          tag: 'td'
        }]
      }]
    }, {
      tag: 'tbody',
      child: [{
        tag: 'tr',
        class: 'as-list-editor-add-row',
        child: {
          tag: 'td',
          attr: {
            colspan: '3'
          },
          child: ['span.mdi.mdi-plus', {
            tag: 'span',
            child: {
              text: 'Add new item'
            }
          }]
        }
      }]
    }]
  });
  this.$body = $('tbody', this.$view);
  this.$addRow = $('.as-list-editor-add-row', this.$view).on('click', function () {
    self.appendRowElement();
  });
  this.updateData();
  return this.$view;
};

ListEditor.prototype.updateData = function () {
  if (!this.$view) return;
  if (this._lashHashValue == this.getDataHash()) return;
  this.$body.clearChild();
  var self = this;
  this.$items = this._data.map(function (item) {
    return self.makeNewRow(item).addTo(self.$body);
  });
  this.$body.addChild(this.$addRow);
  this.checkEmpty();
  this.checkDuplicate();
};

ListEditor.prototype.makeNewRow = function (data) {
  var self = this;

  var itemRow = _({
    tag: 'tr',
    class: 'as-list-editor-row',
    child: [{
      tag: 'td',
      class: ['as-list-editor-cell'],
      child: [{
        tag: 'span',
        class: 'as-list-editor-text',
        attr: {
          contenteditable: 'true'
        },
        child: {
          text: data.text
        }
      }]
    }, {
      tag: 'td',
      class: ['as-list-editor-cell'],
      child: {
        tag: 'span',
        class: 'as-list-editor-value',
        attr: {
          contenteditable: 'true'
        },
        child: {
          text: '' + data.value
        }
      }
    }, {
      tag: 'td',
      child: {
        tag: 'button',
        class: 'as-list-editor-quick-menu-trigger',
        child: {
          tag: 'span',
          class: ['mdi', 'mdi-dots-vertical']
        }
      }
    }]
  });

  itemRow.__data__ = data;
  itemRow.$textInput = $('.as-list-editor-text', itemRow).on('keydown', function (event) {
    if (event.key == 'Enter') {
      event.preventDefault();
      this.blur();
    }
  }).on('blur', function () {
    var newText = itemRow.$textInput.innerText.trim();

    if (data.text != newText) {
      data.text = newText;

      if (self.checkEmpty() && self.checkDuplicate()) {
        self.notifyChange();
      }
    }
  });
  (0, _utils.contenteditableTextOnly)(itemRow.$textInput, function (text) {
    return text.replace(/[\r\n]/g, '');
  });

  if ((data.text + '').trim() == '') {
    itemRow.$textInput.parentNode.addClass('empty-cell');
  }

  itemRow.$valueInput = $('.as-list-editor-value', itemRow).on('keydown', function (event) {
    if (event.key == 'Enter') {
      event.preventDefault();
      this.blur();
    }
  }).on('blur', function () {
    var newValue = itemRow.$valueInput.innerText.trim();

    if (data.value != newValue) {
      data.value = newValue;

      if (self.checkEmpty() && self.checkDuplicate()) {
        self.notifyChange();
      }
    }
  });
  (0, _utils.contenteditableTextOnly)(itemRow.$valueInput, function (text) {
    return text.replace(/[\r\n]/g, '');
  });

  if ((data.value + '').trim() == '') {
    itemRow.$valueInput.parentNode.addClass('empty-cell');
  }

  itemRow.$menuTrigger = $('.as-list-editor-quick-menu-trigger', itemRow);
  itemRow.quickMenuData = _QuickMenu.default.toggleWhenClick(itemRow.$menuTrigger, {
    getMenuProps: function () {
      return {
        extendStyle: {
          'font-size': '12px'
        },
        items: [{
          icon: '.mdi.mdi-table-row-plus-before',
          text: 'Insert Row Before',
          cmd: 'insert-before'
        }, {
          icon: '.mdi.mdi-table-row-plus-after',
          text: 'Insert Row After',
          cmd: 'insert-after'
        }, {
          icon: '.mdi.mdi-table-row-remove',
          text: 'Remove',
          cmd: 'remove'
        }]
      };
    },
    onSelect: function (itemElt) {
      switch (itemElt.cmd) {
        case 'remove':
          self.removeRowByElt(itemRow);
          break;

        case 'insert-before':
          self.insertRowBeforeElt(itemRow);
          break;

        case 'insert-after':
          self.insertRowAfterElt(itemRow);
          break;
      }
    }
  });
  return itemRow;
};
/**
 * @returns {Boolean}
 */


ListEditor.prototype.checkDuplicate = function () {
  var res = true;
  var textDict = {};
  var valueDict = {};
  var rows = Array.apply(null, this.$body.childNodes);
  var row;

  for (var i = 0; i < rows.length; ++i) {
    row = rows[i];

    if (row.__data__ && (row.__data__.text + '').trim() != '') {
      if (textDict[row.__data__.text]) {
        row.$textInput.parentNode.addClass('duplicate-cell');
      } else {
        textDict[row.__data__.text] = true;
        row.$textInput.parentNode.removeClass('duplicate-cell');
      }
    }

    if (row.__data__ && (row.__data__.value + '').trim() != '') {
      if (valueDict[row.__data__.value]) {
        row.$valueInput.parentNode.addClass('duplicate-cell');
        res = false;
      } else {
        valueDict[row.__data__.value] = true;
        row.$valueInput.parentNode.removeClass('duplicate-cell');
      }
    }
  }

  ;
  return res;
};
/**
 * @returns {Boolean}
 */


ListEditor.prototype.checkEmpty = function () {
  var res = true;
  var rows = Array.apply(null, this.$body.childNodes);
  var row;

  for (var i = 0; i < rows.length; ++i) {
    row = rows[i];

    if (row.__data__) {
      if (!row.__data__.text || row.__data__.text.trim() == '') {
        res = false;
        row.$textInput.parentNode.addClass('empty-cell');
      } else {
        row.$textInput.parentNode.removeClass('empty-cell');
      }

      if (!row.__data__.value || row.__data__.value.trim() == '') {
        res = false;
        row.$valueInput.parentNode.addClass('empty-cell');
      } else {
        row.$valueInput.parentNode.removeClass('empty-cell');
      }
    }
  }

  ;
  return res;
};

ListEditor.prototype.removeRowByElt = function (rowElement) {
  rowElement.remove();
  this._data = this._data.filter(function (item) {
    return rowElement.__data__ != item;
  });

  if (this.checkEmpty() && this.checkDuplicate()) {
    this.notifyChange();
  }
};

ListEditor.prototype.removeRowByData = function (rowData) {
  this._data = this._data.filter(function (item) {
    return rowData != item;
  });
  if (this.$view) $('.as-list-editor-row', this.$view, function (elt) {
    if (elt.__data__ == rowData) elt.remove();
    return true;
  });

  if (this.checkEmpty() && this.checkDuplicate()) {
    this.notifyChange();
  }
};

ListEditor.prototype.insertRowBeforeElt = function (elt) {
  var itemData = {
    text: '',
    value: ''
  };
  var res = this.makeNewRow(itemData);
  this.$body.addChildBefore(res, elt);

  var index = this._data.indexOf(elt.__data__);

  this._data.splice(index, 0, itemData);

  return res;
};

ListEditor.prototype.insertRowAfterElt = function (elt) {
  var itemData = {
    text: '',
    value: ''
  };
  var res = this.makeNewRow(itemData);
  this.$body.addChildAfter(res, elt);

  var index = this._data.indexOf(elt.__data__);

  this._data.splice(index + 1, 0, itemData);

  return res;
};

ListEditor.prototype.appendRowElement = function () {
  var itemData = {
    text: '',
    value: ''
  };
  var res = this.makeNewRow(itemData);
  this.$body.addChildBefore(res, this.$addRow);

  this._data.push(itemData);

  if (this.checkEmpty() && this.checkDuplicate()) {
    this.notifyChange();
  }

  return res;
};

ListEditor.prototype.setData = function (items) {
  items = items || [];
  this._data = items;
  this.updateData();
};

ListEditor.prototype.getData = function () {
  return this._data; //todo
};
/**
 * @returns {Number}
 */


ListEditor.prototype.getDataHash = function () {
  return this.data2Hash(this._data || []);
};

ListEditor.prototype.data2Hash = function (data) {
  return data.reduce(function (hash, item, idx) {
    var c;
    var s = idx + ':' + item.text + ':' + item.value;

    for (var i = 0; i < s.length; ++i) {
      c = s.charCodeAt(i);
      hash = (hash << 5) - hash + c;
      hash |= 0;
    }

    return hash;
  }, 0);
};

ListEditor.prototype.notifyChange = function () {
  var currentHash = this.getDataHash();

  if (this._lashHashValue != currentHash) {
    this._lashHashValue = currentHash;
    this.emit('change', {
      target: this,
      hash: currentHash
    }, this);
  }
};

var _default = ListEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/editor/PropertyEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/editor/PropertyEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

require("../../css/propertyeditor.css");

var _stringFormat = require("absol/src/String/stringFormat");

var _datetime = require("absol/src/Time/datetime");

var _ListEditor = _interopRequireDefault(require("./ListEditor"));

var _GoogleFont = require("../font/GoogleFont");

require("../dom/FontIconInput");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _base = require("absol/src/Converter/base64");


// FontIconPicker
var _ = _FCore.default._;
var $ = _FCore.default.$;

function PropertyEditor() {
  _Context.default.call(this);

  _EventEmitter.default.call(this);

  this.dependents = {};
  this.$view = null;
  this.propertyHolders = {};
  /**
   * @type {import('../core/BaseComponent').default}
   */

  this.object = null;
  this.propertyNames = [];
  this.$needUpdate = []; // all element which had .as-need-update

  this.queuePools = {};
}

Object.defineProperties(PropertyEditor.prototype, Object.getOwnPropertyDescriptors(_Context.default.prototype));
Object.defineProperties(PropertyEditor.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
PropertyEditor.prototype.constructor = PropertyEditor;
PropertyEditor.prototype.pools = {}; //share object

PropertyEditor.prototype.onDestroy = function () {
  this.flushAllToPools();
};

PropertyEditor.prototype.edit = function (object) {
  this.object = object;
  this.loadAttributes();
};

PropertyEditor.prototype.setProperty = function (name, value) {
  return this.object[name] = value;
};

PropertyEditor.prototype.getProperty = function (name) {
  return this.object[name];
};

PropertyEditor.prototype.getPropertyDescriptor = function (name) {
  return {
    type: typeof this.object
  };
};

PropertyEditor.prototype.getPropertyNames = function () {
  return Object.keys(this.object);
};

PropertyEditor.prototype.flushAllToPools = function () {
  var self = this;
  Object.keys(this.queuePools).forEach(function (key) {
    self.pools[key] = self.pools[key] === undefined ? [] : self.pools[key];
    var all = self.queuePools[key].splice(0);
    self.pools[key].push.apply(self.pools[key], all);
  });
};

PropertyEditor.prototype.assignToPool = function (key, value) {
  this.queuePools[key] = this.queuePools[key] === undefined ? [] : this.queuePools[key];

  if (value.__pool_assign__) {
    console.warn("Pool: reassign object", key, value);
  } else {
    value.__pool_assign__ = true;
    this.queuePools[key].push(value);
  }
};

PropertyEditor.prototype.putOnceFromPool = function (key) {
  var res = null;

  if (this.pools[key] && this.pools[key].length > 0) {
    res = this.pools[key].pop();
  }

  if (res) res.__pool_assign__ = false;
  return res;
};

PropertyEditor.prototype.loadAttributes = function () {
  var self = this;
  this.flushAllToPools();
  self.$body.clearChild();
  this.clearAllDependents();
  this.propertyNames = [];
  this.$rows = [];
  this.$needUpdate = [];
  if (!this.object) return;
  this.propertyNames = this.getPropertyNames();
  this.propertyHolders = {};
  this.propertyNames.forEach(function (name) {
    var descriptor = self.getPropertyDescriptor(name) || {
      type: "NoDescriptor"
    };

    if (descriptor.dependency) {
      self.addDependents(name, descriptor.dependency);
    }

    var functionName = 'load' + (0, _stringFormat.camelCaseToPascalCase)(descriptor.type) + 'Property';

    var cell = _('td');

    if (!self[functionName]) {
      // throw new Error('Not support type' + descriptor.type + '!')
      functionName = 'loadNotSupportedProperty';
    }

    ;

    var rowElt = _({
      tag: 'tr',
      child: [{
        tag: 'td',
        child: {
          text: name
        }
      }, cell]
    });

    rowElt.addTo(self.$body);
    self.propertyHolders[name] = self[functionName](name, descriptor, cell, cell);
  });
};

PropertyEditor.prototype.loadNotSupportedProperty = function (name, descriptor, cell, cellElt) {
  cellElt.addChild(_({
    text: 'Not supported '
  })).addChild(_({
    tag: 'strong',
    child: {
      text: descriptor.type
    }
  }));
  return {};
};

PropertyEditor.prototype.loadEnumProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  var selectMenu = descriptor.sign ? this.putOnceFromPool(descriptor.sign) : null;

  if (selectMenu === null) {
    selectMenu = _({
      tag: 'selectmenu',
      props: {
        items: descriptor.values.map(function (value) {
          return {
            text: value + "",
            value: value
          };
        }),
        value: this.getProperty(name)
      },
      on: {
        change: function () {
          this.peditor.setProperty(name, this.value);
          this.peditor.notifyChange(name, this);
          this.peditor.notifyStopChange(name);
        }
      }
    });
  }

  if (descriptor.sign) this.assignToPool(descriptor.sign, selectMenu);
  selectMenu.value = this.getProperty(name);
  selectMenu.peditor = this;

  res.requestUpdate = function () {
    var value = self.getProperty(name);

    if (value != this.value) {
      selectMenu.value = value;
    }
  };

  cell.addChild(selectMenu);
  return res;
};

PropertyEditor.prototype.loadFontProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  var fontInput = descriptor.sign ? this.putOnceFromPool(descriptor.sign) : null;

  if (fontInput === null) {
    fontInput = _({
      tag: 'selectmenu',
      class: 'as-need-update',
      props: {
        items: [{
          text: 'None',
          value: undefined
        }].concat(_GoogleFont.FONT_ITEMS)
      },
      on: {
        change: function () {
          this.peditor.setProperty(name, this.value);
          this.peditor.notifyChange(name, this);
          this.peditor.notifyStopChange(name);
        }
      }
    });
  }

  if (descriptor.sign) this.assignToPool(descriptor.sign, fontInput);
  fontInput.value = this.getProperty(name);
  fontInput.peditor = this;
  res.elt = fontInput;
  cell.addChild(res.elt);

  res.requestUpdate = function () {
    var value = self.getProperty(name);

    if (value != fontInput.value) {
      fontInput.value = value;
    }
  };

  return res;
};

PropertyEditor.prototype.loadConstProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  res.elt = _({
    tag: 'strong',
    child: {
      text: '' + descriptor.value
    }
  });
  cell.addChild(res.elt);
  return res;
};

PropertyEditor.prototype.loadTextProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  res.elt = _({
    tag: descriptor.long ? 'textarea' : 'input',
    attr: {
      type: 'text'
    },
    on: {
      keyup: function () {
        self.setProperty(name, this.value);
        self.notifyChange(name, this);
      },
      change: function () {
        self.notifyStopChange(name);
      }
    }
  });
  cell.addChild(res.elt);

  res.requestUpdate = function () {
    var value = self.getProperty(name);

    if (value != this.value) {
      res.elt.value = value;
    }
  };

  res.requestUpdate();
  return res;
};

PropertyEditor.prototype.loadUniqueTextProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  res.elt = _({
    tag: descriptor.long ? 'textarea' : 'input',
    attr: {
      type: 'text'
    },
    on: {
      keyup: function () {
        if (descriptor.others[this.value]) {
          this.addStyle('border-color', '#f99');
          this.attr('title', 'This name is used!');
        } else {
          this.attr('title', null);
          this.removeStyle('border-color');
        }

        self.setProperty(name, this.value);
        self.notifyChange(name, this);
      },
      change: function () {
        if (descriptor.others[this.value]) {
          this.addStyle('border-color', '#f99');
          this.attr('title', 'This name is used!');
        } else {
          this.attr('title', null);
          this.removeStyle('border-color');
        }

        self.notifyStopChange(name);
      }
    }
  });
  cell.addChild(res.elt);

  res.requestUpdate = function () {
    var value = self.getProperty(name);

    if (value != this.value) {
      res.elt.value = value;
    }
  };

  res.requestUpdate();
  return res;
};

PropertyEditor.prototype.loadBoolProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  res.elt = _({
    tag: 'checkboxbutton',
    class: 'as-need-update',
    props: {
      checked: this.getProperty(name),
      notifyChange: function () {}
    },
    on: {
      change: function () {
        self.setProperty(name, this.checked);
        self.notifyChange(name, this);
        self.notifyStopChange(name);
      }
    }
  });

  res.requestUpdate = function () {
    var value = self.getProperty(name);

    if (value != res.elt.checked) {
      res.elt.checked = value;
    }
  };

  cell.addChild(res.elt);
  return res;
};

PropertyEditor.prototype.loadDateProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  res.calendarInput = _({
    tag: 'calendarinput',
    props: {
      disabled: descriptor.disabled,
      value: self.getProperty(name)
    },
    on: {
      change: function () {
        self.setProperty(name, this.value);
        self.notifyChange(name, this);
        res.nullCheckElt.checked = false;
        self.notifyStopChange(name);
      }
    }
  });
  cell.addChild(res.calendarInput);
  res.nullCheckElt = _({
    tag: 'checkbox',
    style: {
      marginLeft: '10px'
    },
    props: {
      text: 'NULL'
    },
    on: {
      change: function () {
        if (this.checked) {
          self.setProperty(name, null);
        } else {
          self.setProperty(name, (0, _datetime.beginOfDay)(new Date()));
        }

        self.notifyChange(name, this);
        self.notifyStopChange(name);
      }
    }
  });
  cell.addChild(res.nullCheckElt);

  res.requestUpdate = function () {
    var value = self.getProperty(name);

    if (!value) {
      res.calendarInput.value = null;
      res.nullCheckElt.checked = true;
    } else {
      res.calendarInput.value = value;
      res.nullCheckElt.checked = false;
    }

    res.calendarInput.disabled = self.getPropertyDescriptor(name).disabled;
  };

  return res;
};

PropertyEditor.prototype.loadNumberProperty = function (name, descriptor, cell) {
  var self = this;
  var numberInput = this.putOnceFromPool("NUMBER_INPUT"); //same with all sign

  if (numberInput === null) {
    numberInput = _({
      tag: 'numberinput',
      class: 'as-need-update',
      props: {},
      on: {
        change: function (event) {
          if (event.by == 'keyup') return;
          if (!descriptor.livePreview && event.by == 'long_press_button') return;
          this.peditor.setProperty(this._propertyName, this.value);
          this.peditor.notifyChange(this._propertyName, this);
          if (event.by != 'long_press_button') this.peditor.notifyStopChange(this._propertyName);
        }
      }
    });
  }

  if (descriptor.sign) this.assignToPool(descriptor.sign, numberInput);
  numberInput.min = typeof descriptor.min == 'number' ? descriptor.min : -Infinity;
  numberInput.max = typeof descriptor.max == 'number' ? descriptor.max : Infinity;
  numberInput.value = this.getProperty(name);
  numberInput.disabled = descriptor.disabled;
  numberInput._propertyName = name;
  numberInput.peditor = this;
  var res = {
    elt: numberInput
  };

  res.requestUpdate = function () {
    var value = self.getProperty(name);
    if (value === null) res.elt.value = descriptor.defaultValue;else res.elt.value = value;
    res.elt.disabled = self.getPropertyDescriptor(name).disabled;
  };

  cell.addChild(res.elt); //todo NULL

  return res;
};

PropertyEditor.prototype.loadIconProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {}; //todo: disabled

  res.elt = _({
    tag: 'fonticoninput',
    class: 'as-need-update',
    props: {
      value: self.getProperty(name),
      disabled: descriptor.disabled
    },
    on: {
      change: function (event) {
        self.setProperty(name, this.value);
        self.notifyStopChange(name, this);
      }
    }
  });
  cell.addChild(res.elt);

  res.requestUpdate = function () {
    res.elt.value = self.getProperty(name);
  };

  return res;
};

PropertyEditor.prototype.loadListProperty = function (name, descriptor, cell) {
  var self = this;
  var listEditor = new _ListEditor.default();
  var res = {};
  res.elt = listEditor.getView();
  cell.addChild(res.elt);
  listEditor.on('change', function () {
    self.setProperty(name, this.getData());
    self.notifyStopChange(name);
  });
  listEditor.start(); // res.

  listEditor.setData(this.getProperty(name));
  return res;
};

PropertyEditor.prototype.loadTextAlignProperty = function (name, descriptor, cell) {
  var self = this;
  var icons = {
    left: 'mdi-format-align-left',
    right: 'mdi-format-align-right',
    center: 'mdi-format-align-center'
  };
  var res = {};
  res.elt = _({
    tag: 'button',
    class: 'as-property-editor-text-align-input',
    child: 'span.mdi'
  });
  cell.addChild(res.elt);
  var $button = res.elt;
  var $icon = $('span.mdi', $button);
  var lasIconClass = icons[this.getProperty(name)] || icons.left;
  $icon.addClass(lasIconClass);

  res.requestUpdate = function () {
    $icon.removeClass(lasIconClass);
    lasIconClass = icons[self.getProperty(name)] || icons.left;
    $icon.addClass(lasIconClass);
  };

  var self = this;

  _QuickMenu.default.toggleWhenClick($button, {
    getMenuProps: function () {
      return {
        items: [{
          text: 'Left',
          icon: 'span.mdi.mdi-format-align-left',
          menuData: 'left'
        }, {
          text: 'Center',
          icon: 'span.mdi.mdi-format-align-center',
          menuData: 'center'
        }, {
          text: 'Right',
          icon: 'span.mdi.mdi-format-align-right',
          menuData: 'right'
        }]
      };
    },
    onSelect: function (item) {
      $icon.removeClass(lasIconClass);
      lasIconClass = icons[item.menuData];
      $icon.addClass(lasIconClass);
      self.setProperty(name, item.menuData);
      self.notifyStopChange(name);
    }
  });

  return res;
};

PropertyEditor.prototype.loadBoxAlignProperty = function (name, descriptor, cell) {
  var self = this;
  var icons = {
    lefttop: 'm0 0v24h24v-24zm1 1h22v22h-22zm2 2h10.3v2h-10.3v-2m0 4h14v2h-14v-2m0 4h9.9v2h-9.9v-2',
    centertop: 'm24 24v-24h-24v24zm-1-1h-22v-22h22zm-6.05-18h-9.9v-2h9.9v2m2.05 4h-14v-2h14v2m-1.85 4h-10.3v-2h10.3v2',
    righttop: 'm24 0v24h-24v-24zm-1 1h-22v22h22zm-2 2h-10.3v2h10.3v-2m0 4h-14v2h14v-2m0 4h-9.9v2h9.9v-2',
    leftcenter: 'm0 24v-24h24v24zm1-1h22v-22h-22zm2-6h10.3v-2h-10.3v2m0-4h14v-2h-14v2m0-4h9.9v-2h-9.9v2',
    centercenter: 'm0 24v-24h24v24zm1-1h22v-22h-22zm6.05-14h9.9v-2h-9.9v2m-2.05 4h14v-2h-14v2m1.85 4h10.3v-2h-10.3v2',
    rightcenter: 'm24 24v-24h-24v24zm-1-1h-22v-22h22zm-2-6h-10.3v-2h10.3v2m0-4h-14v-2h14v2m0-4h-9.9v-2h9.9v2',
    leftbottom: 'm0 24v-24h24v24zm1-1h22v-22h-22zm2-2h10.3v-2h-10.3v2m0-4h14v-2h-14v2m0-4h9.9v-2h-9.9v2',
    centerbottom: 'm24 0v24h-24v-24zm-1 1h-22v22h22zm-6.05 18h-9.9v2h9.9v-2m2.05-4h-14v2h14v-2m-1.85-4h-10.3v2h10.3v-2',
    rightbottom: 'm24 24v-24h-24v24zm-1-1h-22v-22h22zm-2-2h-10.3v-2h10.3v2m0-4h-14v-2h14v2m0-4h-9.9v-2h9.9v2'
  };

  function makeIcon(path) {
    var data = '<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\
                    <path d="' + path + '" style="stroke-width:0"/>\
                </svg>';
    return {
      tag: 'img',
      style: {
        'image-rendering': 'pixelated'
      },
      props: {
        src: 'data:image/svg+xml;base64,' + (0, _base.base64EncodeUnicode)(data)
      }
    };
  }

  var res = {};
  res.elt = _('button.as-property-editor-text-align-input', res);
  cell.addChild(res.elt);
  res.elt.addChild(_(makeIcon(icons[this.getProperty(name)] || icons.lefttop)));

  _QuickMenu.default.toggleWhenClick(res.elt, {
    getMenuProps: function () {
      return {
        items: [{
          text: 'Left-Top',
          icon: makeIcon(icons.lefttop),
          menuData: 'lefttop'
        }, {
          text: 'Center-Top',
          icon: makeIcon(icons.centertop),
          menuData: 'centertop'
        }, {
          text: 'Right-Top',
          icon: makeIcon(icons.righttop),
          menuData: 'righttop'
        }, {
          text: 'Left-Center',
          icon: makeIcon(icons.leftcenter),
          menuData: 'leftcenter'
        }, {
          text: 'Center-Center',
          icon: makeIcon(icons.centercenter),
          menuData: 'centercenter'
        }, {
          text: 'Right-Center',
          icon: makeIcon(icons.rightcenter),
          menuData: 'rightcenter'
        }, {
          text: 'Left-Botttom',
          icon: makeIcon(icons.leftbottom),
          menuData: 'leftbottom'
        }, {
          text: 'Center-Botttom',
          icon: makeIcon(icons.centerbottom),
          menuData: 'centerbottom'
        }, {
          text: 'Right-Botttom',
          icon: makeIcon(icons.rightbottom),
          menuData: 'rightbottom'
        }]
      };
    },
    onSelect: function (item) {
      res.elt.clearChild().addChild(_(makeIcon(icons[item.menuData])));
      self.setProperty(name, item.menuData);
      self.notifyStopChange(name);
    }
  });

  res.requestUpdate = function () {
    res.elt.clearChild().addChild(_(makeIcon(icons[self.getProperty(name)] || icons.lefttop)));
  };

  return res;
};

PropertyEditor.prototype.loadColorProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  res.elt = _({
    tag: 'colorpickerbutton',
    on: {
      change: function (event) {
        self.setProperty(name, '#' + event.value.toHex8());
        self.notifyChange(name);
      },
      stopchange: function (event) {
        self.notifyStopChange(name);
      }
    },
    props: {
      value: 'transparent',
      mode: 'OBJECT'
    }
  });
  cell.addChild(res.elt);

  res.requestUpdate = function () {
    res.elt.value = self.getProperty(name);
  };

  res.requestUpdate();
  return res;
};

PropertyEditor.prototype.loadMeasureSizeProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  cell.addStyle('white-space', 'nowrap');
  res.numberInputElt = _('numberinput').addStyle('margin-right', '5px');
  res.typeSelectElt = _({
    tag: 'selectmenu',
    style: {
      verticalAlign: 'middle'
    },
    props: {
      items: [{
        text: 'px',
        value: 'px'
      }, {
        text: '%',
        value: '%'
      }, {
        text: 'match_parent',
        value: 'match_parent'
      }, {
        text: 'auto',
        value: 'auto'
      }]
    }
  });
  cell.addChild(res.numberInputElt).addChild(res.typeSelectElt);
  res.numberInputElt.on('change', function (event) {
    if (event.by == 'keyup') return;

    switch (res.typeSelectElt.value) {
      case '%':
        self.setProperty(name, this.value + '%');
        break;

      case 'px':
        self.setProperty(name, this.value);
        break;
    }

    self.notifyChange(name);
    if (event.by != 'long_press_button') self.notifyStopChange(name);
  }).on('stopchange', function () {
    switch (res.typeSelectElt.value) {
      case '%':
        self.setProperty(name, this.value + '%');
        break;

      case 'px':
        self.setProperty(name, this.value);
        break;
    }

    self.notifyStopChange(name);
  });
  res.typeSelectElt.on('change', function (event) {
    if (this.value == 'match_parent' || this.value == 'auto') {
      self.setProperty(name, this.value);
      res.numberInputElt.disabled = true;
    } else {
      res.numberInputElt.disabled = false;
      var value = self.getProperty(name, this.value);
      res.numberInputElt.value = value;

      if (this.value == '%') {
        self.setProperty(name, value + '%');
      } else {
        self.setProperty(name, value);
      }
    }

    self.notifyChange(name);
    self.notifyStopChange(name);
  });

  res.requestUpdate = function () {
    var descriptor = self.getPropertyDescriptor(name);
    if (descriptor.disabled) res.numberInputElt.disabled = !!descriptor.disabled;
    var value = self.getProperty(name);

    if (typeof value == 'number') {
      res.numberInputElt.value = value;
      res.typeSelectElt.value = 'px';
    } else if (typeof value == 'string') {
      if (value.match(/\%$/)) {
        res.typeSelectElt.value = '%';
        res.numberInputElt.value = parseFloat(value.replace('%', ''));
        res.numberInputElt.disabled = false;
      } else if (value == 'match_parent' || value == 'auto') {
        res.numberInputElt.disabled = true;
        res.typeSelectElt.value = value;
      } else {
        console.error("Unknow typeof " + name, value);
      }
    }
  };

  res.requestUpdate();
  return res;
};

PropertyEditor.prototype.loadMeasurePositionProperty = function (name, descriptor, cell) {
  var self = this;
  var res = {};
  cell.addStyle('white-space', 'nowrap');
  res.numberInputElt = _('numberinput').addStyle('margin-right', '5px');
  res.typeSelectElt = _({
    tag: 'selectmenu',
    style: {
      verticalAlign: 'middle'
    },
    props: {
      items: [{
        text: 'px',
        value: 'px'
      }, {
        text: '%',
        value: '%'
      }]
    }
  });
  cell.addChild(res.numberInputElt).addChild(res.typeSelectElt);
  res.numberInputElt.on('change', function (event) {
    if (event.by == 'keyup') return;

    switch (res.typeSelectElt.value) {
      case '%':
        self.setProperty(name, this.value + '%');
        break;

      case 'px':
        self.setProperty(name, this.value);
        break;
    }

    self.notifyChange(name);
    if (event.by != 'long_press_button') self.notifyStopChange(name);
  }).on('stopchange', function () {
    switch (res.typeSelectElt.value) {
      case '%':
        self.setProperty(name, this.value + '%');
        break;

      case 'px':
        self.setProperty(name, this.value);
        break;
    }

    self.notifyStopChange(name);
  });
  res.typeSelectElt.on('change', function (event) {
    if (this.value == 'match_parent' || this.value == 'auto') {
      self.setProperty(name, this.value);
      res.numberInputElt.disabled = true;
    } else {
      res.numberInputElt.disabled = false;
      var value = self.getProperty(name, this.value);
      res.numberInputElt.value = value;

      if (this.value == '%') {
        self.setProperty(name, value + '%');
      } else {
        self.setProperty(name, value);
      }
    }

    self.notifyChange(name);
    self.notifyStopChange(name);
  });

  res.requestUpdate = function () {
    var descriptor = self.getPropertyDescriptor(name);
    res.numberInputElt.disabled = !!descriptor.disabled;
    var value;

    if (descriptor.disabled) {
      value = self.getProperty(name, res.typeSelectElt.value);
      res.numberInputElt.value = value; //set-back

      if (res.typeSelectElt.value == 'px') {
        self.setProperty(name, value);
      } else if (res.typeSelectElt.value == '%') {
        self.setProperty(name, value + '%');
      }
    } else {
      value = self.getProperty(name);

      if (typeof value == 'number') {
        res.numberInputElt.value = value;
        res.typeSelectElt.value = 'px';
      } else if (typeof value == 'string') {
        if (value.match(/\%$/)) {
          res.typeSelectElt.value = '%';
          res.numberInputElt.value = parseFloat(value.replace('%', ''));
        } else {
          console.error("Unknow typeof " + name, value);
        }
      }
    }
  };

  res.requestUpdate();
  return res;
};

PropertyEditor.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = _({
    class: 'as-property-editor',
    child: {
      tag: 'table',
      class: 'as-basic-table',
      child: [{
        tag: 'thead',
        child: [{
          tag: 'tr',
          child: [{
            tag: 'td',
            child: {
              text: "key"
            }
          }, {
            tag: 'td',
            attr: {
              colspan: '3'
            },
            child: {
              text: 'value'
            }
          }]
        }]
      }, {
        tag: 'tbody'
      }]
    }
  });
  this.$body = $('tbody', this.$view);
  return this.$view;
};

PropertyEditor.prototype.clearAllDependents = function () {
  for (var key in this.dependents) delete this.dependents[key];
};
/**
 * @param {String} propertyName
 * @param {Array<String>} dependencyProperties
 */


PropertyEditor.prototype.addDependents = function (propertyName, dependencyProperties) {
  var dependencyProperty;

  for (var i = 0; i < dependencyProperties.length; ++i) {
    dependencyProperty = dependencyProperties[i];
    this.dependents[dependencyProperty] = this.dependents[dependencyProperty] || {};
    this.dependents[dependencyProperty][propertyName] = true;
  }
};

PropertyEditor.prototype.updateDependentsOf = function (name, excludes) {
  excludes = excludes || {};
  excludes[name] = true;

  for (var dependentPropertyName in this.dependents[name]) {
    if (!excludes[dependentPropertyName] && this.propertyHolders[dependentPropertyName]) {
      excludes[dependentPropertyName] = true;

      if (this.propertyHolders[dependentPropertyName].requestUpdate) {
        this.propertyHolders[dependentPropertyName].requestUpdate();
      }

      this.updateDependentsOf(dependentPropertyName, excludes);
    }
  }
};

PropertyEditor.prototype.updatePropertyRecursive = function (name) {
  if (!this.propertyHolders[name]) return;
  if (this.propertyHolders[name].requestUpdate) this.propertyHolders[name].requestUpdate();
  this.updateDependentsOf(name);
};

PropertyEditor.prototype.notifyChange = function (name, from) {
  this.updateDependentsOf(name);
  this.emit('change', {
    type: 'change',
    target: this,
    from: from,
    name: name,
    object: this.object
  }, this);
};

PropertyEditor.prototype.notifyStopChange = function (name) {
  this.emit('stopchange', {
    type: 'stopchange',
    name: name,
    object: this.object
  }, this);
};

var _default = PropertyEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/propertyeditors/LayoutSizeEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/propertyeditors/LayoutSizeEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SizeBox = SizeBox;
exports.default = void 0;

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _FCore = _interopRequireDefault(require("../core/FCore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

require("../../css/layoutsizeeditor.css");

var _utils = require("absol-acomp/js/utils");


var _ = _FCore.default._;
var $ = _FCore.default.$;

function LayoutSizeEditor() {
  _Context.default.call(this);

  _EventEmitter.default.call(this);
}

Object.defineProperties(LayoutSizeEditor.prototype, Object.getOwnPropertyDescriptors(_Context.default.prototype));
Object.defineProperties(LayoutSizeEditor.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
LayoutSizeEditor.prototype.constructor = LayoutSizeEditor;

LayoutSizeEditor.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.$view = _({
    class: 'as-layout-size-editor',
    tag: 'sizebox',
    props: {
      boxTitle: 'Position'
    },
    child: {
      tag: 'sizebox',
      props: {
        boxTitle: 'marrgin'
      }
    }
  });
  ;
  return this.$view;
};

function SizeBox() {
  this.$left = _({
    tag: 'spaninput',
    elt: $('.as-size-box-editor-position-left>span.absol-span-input', this),
    props: {
      type: 'number'
    }
  });
  this.$right = _({
    tag: 'spaninput',
    elt: $('.as-size-box-editor-position-right>span.absol-span-input', this),
    props: {
      type: 'number'
    }
  });
  this.$top = _({
    tag: 'spaninput',
    elt: $('.as-size-box-editor-position-top span.absol-span-input', this),
    props: {
      type: 'number'
    }
  });
  this.$bottom = _({
    tag: 'spaninput',
    elt: $('.as-size-box-editor-position-bottom span.absol-span-input', this),
    props: {
      type: 'number'
    }
  });
  this.$center = $('.as-size-box-editor-position-center', this);
  this.$title = $('.as-size-box-editor-title', this);
}

SizeBox.prototype.addChild = function (elt) {
  this.$center.addChild(elt);
  return this;
};

SizeBox.property = {};
SizeBox.property.boxTitle = {
  set: function (value) {
    this.$title.innerHTML = value + '';
  },
  get: function () {
    return this.$title.innerHTML;
  }
};

SizeBox.render = function () {
  return _('<div class="as-size-box-editor">\
            <div class="as-size-box-editor-position-top">\
                <div><div class="as-size-box-editor-title">Title text</div></div>\
                <div><span  class="absol-span-input" contenteditable="true"></span></div>\
                <div></div>\
            </div>\
            <div class="as-size-box-editor-position-mid">\
                <div class="as-size-box-editor-position-left">\
                    <span class="absol-span-input" contenteditable="true"></span>\
                </div>\
                <div class="as-size-box-editor-position-center">\
                </div>\
                <div class="as-size-box-editor-position-right">\
                     <span class="absol-span-input" contenteditable="true"></span>\
                </div>\
            </div>\
            <div class="as-size-box-editor-position-bottom">\
                <div></div>\
                <div><span class="absol-span-input" contenteditable="true"></span></div>\
                <div></div>\
            </div>\
        </div>');
};

_FCore.default.install('sizebox', SizeBox);

var _default = LayoutSizeEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/frame/plugins.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/frame/plugins.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.lsWorkspace = lsWorkspace;
exports.writeFileBase64 = writeFileBase64;
exports.writeFile = writeFile;
exports.catWorkspace = catWorkspace;
exports.PluginProjectExplore = PluginProjectExplore;
exports.downloadFragmentData = downloadFragmentData;
exports.PluginLoadContentData = PluginLoadContentData;
exports.PluginSaveContentData = PluginSaveContentData;
exports.PluginBuildComponent = PluginBuildComponent;
exports.PluginComponentPickerView = PluginComponentPickerView;

var _XHR = _interopRequireDefault(require("absol/src/Network/XHR"));

var _CodeEditor = _interopRequireDefault(require("../editor/CodeEditor"));

var _base = require("absol/src/Converter/base64");

var _FCore = _interopRequireWildcard(require("../core/FCore"));

var _R = _interopRequireDefault(require("../R"));

var _ExpTree = _interopRequireDefault(require("absol-acomp/js/ExpTree"));

var _FmFragment = require("../core/FmFragment");

var _Assembler = require("../core/Assembler");

var _OnsScreenWindow = _interopRequireDefault(require("absol-acomp/js/OnsScreenWindow"));

var _generator = require("absol/src/JSMaker/generator");




var JSZip = window.JSZip;
var WORKSPACE_FOLDER = 'formeditor/workspace';
var extIcons = {
  form: 'span.mdi.mdi-card-bulleted-outline',
  jpg: 'span.mdi.mdi-file-image-outline',
  js: 'span.mdi.mdi-nodejs',
  json: 'span.mdi.mdi-json',
  html: 'span.mdi.mdi-xml',
  css: 'span.mdi.mdi-language-css3',
  gitignore: 'span.mdi.mdi-git',
  license: 'span.mdi.mdi-license',
  md: 'span.mdi.mdi-markdown-outline',
  "*": 'span.mdi.mdi-file-document-outline'
};

function openNewFormDialog() {
  var nameInput = (0, _FCore._)(`<input type="text"></input>`);
  var typeInput = (0, _FCore._)({
    tag: 'selectmenu',
    props: {
      items: [{
        text: 'RelativeLayout',
        value: 'RelativeLayout'
      }, {
        text: 'LinearLayout',
        value: 'LinearLayout'
      }, {
        text: 'ChainLayout',
        value: 'ChainLayout'
      }]
    }
  });
  var rows = [['Name', nameInput], ['Layout type', typeInput]];
  var okBtn = (0, _FCore._)({
    tag: 'button',
    style: {
      marginLeft: '20px'
    },
    child: {
      text: 'OK'
    }
  });
  var cancelBtn = (0, _FCore._)({
    tag: 'button',
    child: {
      text: 'Cancel'
    }
  });
  /***
   * @type {OnScreenWindow}
   */

  var windowElt = (0, _FCore._)({
    tag: _OnsScreenWindow.default.tag,
    style: {
      left: 'calc(50vw - 150px)',
      top: 'calc(40vh - 100px)',
      width: '300px',
      height: '135px'
    },
    props: {
      windowTitle: 'New Form',
      windowIcon: 'span.mdi.mdi-file-plus-outline'
    },
    child: [{
      style: {
        padding: '5px',
        width: '100%',
        boxSizing: 'border-box',
        display: 'table'
      },
      child: rows.map(function (row) {
        return {
          style: {
            display: 'table-row'
          },
          child: [`<label style="display: table-cell">${row[0]} </label>`, {
            style: {
              display: 'table-cell',
              paddingBottom: '10px'
            },
            child: row[1]
          }]
        };
      })
    }, {
      style: {
        textAlign: 'center'
      },
      child: [cancelBtn, okBtn]
    }]
  });
  var modal = (0, _FCore._)({
    tag: 'modal',
    style: {
      zIndex: 100000
    },
    child: windowElt
  });
  modal.addTo(document.body);
  return new Promise(function (rs, rj) {
    okBtn.on('click', function () {
      var name = nameInput.value;

      if (name.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) {
        modal.remove();
        rs({
          name: name,
          layoutType: typeInput.value
        });
      } else {
        nameInput.focus();
        nameInput.select();
      }
    });

    function onCancel() {
      modal.remove();
      rj();
    }

    cancelBtn.on('click', onCancel);
  });
}

function lsWorkspace(path) {
  return _XHR.default.postRepquest('https://absol.cf/shell_exec.php', JSON.stringify({
    cmd: 'ls -la -F "' + path + '"',
    cwd: WORKSPACE_FOLDER
  })).then(function (out) {
    return out.trim().split(/[\r\n]+/).slice(1).map(function (line) {
      var parts = line.split(/\s+/);
      var name = parts[8];
      var type = 'FILE';
      var ext = undefined;

      if (name[name.length - 1] == '/' || name[name.length - 1] == '\\') {
        type = "FOLDER";
        name = name.substr(0, name.length - 1);
      } else {
        ext = (name.split('.').pop() || '').toLowerCase();
      }

      return {
        type: type,
        name: name,
        fullPath: path + '/' + name,
        time: parts[5] + ' ' + parts[6],
        size: parseInt(parts[4]),
        owner: parts[2],
        ext: ext
      };
    }).filter(function (obj) {
      return obj.name.indexOf('.') != 0;
    });
  }).catch(function (error) {
    console.error(error);
  });
}

function writeFileBase64(path, b64) {
  return _XHR.default.postRepquest('https://absol.cf/shell_exec.php', JSON.stringify({
    cmd: 'echo \'' + b64 + '\'>' + path,
    cwd: WORKSPACE_FOLDER
  })).then(function (out) {
    console.log(out);
  });
}

function writeFile(path, text) {
  var b64 = (0, _base.base64EncodeUnicode)(text);
  return _XHR.default.postRepquest('https://absol.cf/shell_exec.php', JSON.stringify({
    cmd: 'echo \'' + b64 + '\' | base64 -d >' + path,
    cwd: WORKSPACE_FOLDER
  })).then(function (out) {
    console.log(out);
  });
}

function catWorkspace(path) {
  return _XHR.default.postRepquest('https://absol.cf/shell_exec.php', JSON.stringify({
    cmd: 'cat "' + path + '"',
    cwd: WORKSPACE_FOLDER
  }));
}

function PluginProjectExplore(context) {
  var _ = context._;
  var $ = context.$;
  var folder2icon = {
    form: {
      tag: 'img',
      props: {
        src: 'https://absol.cf/exticons/extra/folder-neon.svg'
      }
    },
    template: {
      tag: 'img',
      props: {
        src: 'https://absol.cf/exticons/extra/folder-svn.svg'
      }
    }
  };
  /**
   * @type {import('../fragment/ProjectExplorer').default}
   */

  var self = context.self;

  function contextMenuEventHandler(contentArguments, event) {
    var items = [];

    if (contentArguments.type === 'FILE') {
      items.push({
        text: 'Open',
        icon: 'span.mdi.mdi-menu-open',
        cmd: 'open'
      });
    } else if (contentArguments.name === 'form') {
      items.push({
        text: 'New Form',
        icon: 'span.mdi.mdi-plus',
        cmd: 'new_form'
      });
    }

    event.showContextMenu({
      items: items,
      extendStyle: {
        fontSize: '12px'
      }
    }, function (event) {
      switch (event.menuItem.cmd) {
        case 'open':
          self.openItem(contentArguments.ext, contentArguments.fullPath.replace(/[^a-zA-Z0-9\_]/g, '_'), contentArguments.name, contentArguments, contentArguments.fullPath);
          break;
      }
    });
  }

  context.loadExpTree = function () {
    function visit(rootElt, path) {
      lsWorkspace(path.join('/')).then(function (result) {
        result.forEach(function (it) {
          var res;

          if (it.type == 'FOLDER') {
            res = _({
              tag: 'exptree',
              props: {
                name: it.name,
                icon: folder2icon[it.name] || 'span.mdi.mdi-folder',
                status: 'close'
              },
              on: {
                statuschange: function () {
                  if (this.status == 'open') visit(res, path.concat([it.name]));
                }
              }
            });
          } else if (it.type == 'FILE') {
            res = _({
              tag: 'exptree',
              props: {
                name: it.name,
                icon: extIcons[it.ext] || extIcons['*']
              }
            });
            res.getNode().on('dblclick', function (event) {
              self.openItem(it.ext, it.fullPath.replace(/[^a-zA-Z0-9\_]/g, '_'), it.name, it, it.fullPath);
            });
          }

          res.getNode().defineEvent('contextmenu').on('contextmenu', contextMenuEventHandler.bind(res, it));
          res.addTo(rootElt);
        });
      });
      rootElt.clearChild();
    }

    var droppanel = self.$droppanel;
    visit(droppanel, [self.data.projectName]);
  };

  self.$newFormBtn = _({
    tag: 'button',
    child: 'span.mdi.mdi-file-plus-outline',
    on: {
      click: function () {
        openNewFormDialog().then(function (result) {
          var accumulator = {};
          accumulator.contentArguments = {};
          accumulator.contentArguments.fullPath = self.data.projectName + '/form/' + result.name + '.form';
          accumulator.name = result.name + '.form';
          accumulator.contentArguments.ext = 'form';
          accumulator.editor = {
            getData: function () {
              return {
                app: _R.default.APP,
                version: _R.default.VERSION,
                layout: {
                  tag: result.layoutType
                }
              };
            }
          };
          PluginSaveContentData(accumulator);
          setTimeout(context.loadExpTree.bind(context), 1000);
        });
      }
    }
  });
  self.$cmdCtn.addChildBefore(self.$newFormBtn, self.$cmdCtn.firstChild);
}

function downloadFragmentData(path) {
  return catWorkspace(path).then(function (out) {
    if (out[0] == '{') {
      // is json
      try {
        var data = (0, _generator.replaceDateStringJSVariable)(JSON.parse(out));
        return data;
      } catch (error) {
        console.error(error);
      }
    } else {
      return JSZip.loadAsync(out, {
        base64: true
      }).then(function (zip) {
        return zip.file('data.txt').async('text').then(function (text) {
          try {
            var data = (0, _generator.replaceDateStringJSVariable)(JSON.parse(text));
            return data;
          } catch (error) {
            console.error(error);
          }
        });
      });
    }
  });
}

function PluginLoadContentData(accumulator) {
  var sync;

  if (accumulator.contentArguments.ext == 'form') {
    sync = downloadFragmentData(accumulator.contentArguments.fullPath).then(function (data) {
      accumulator.editor.setData(data);
    });
  } else if (_CodeEditor.default.prototype.TYPE_MODE[accumulator.contentArguments.ext]) {
    sync = catWorkspace(accumulator.contentArguments.fullPath).then(function (out) {
      try {
        accumulator.editor.setData({
          value: out,
          type: accumulator.contentArguments.ext
        });
      } catch (error) {
        console.error(error);
      }
    });
  } else if (accumulator.contentArguments.ext == 'jpg') {
    accumulator.editor.setData({
      images: ['//absol.cf/' + WORKSPACE_FOLDER + '/' + accumulator.contentArguments.fullPath]
    });
    sync = Promise.resolve();
  }

  accumulator.waitFor(sync);
}

function PluginSaveContentData(accumulator) {
  if (accumulator.contentArguments.ext == 'form') {
    var data = accumulator.editor.getData();
    var FrgClass = (0, _FmFragment.makeFmFragmentClass)({
      tag: accumulator.name.replace('.form', ''),
      contentViewData: data
    });

    _Assembler.AssemblerInstance.addClass(FrgClass);

    var textData = JSON.stringify(data);
    var zip = new JSZip();
    zip.file('data.txt', textData);
    zip.generateAsync({
      type: 'base64'
    }).then(function (b64) {
      writeFileBase64(accumulator.contentArguments.fullPath, b64).then(function (out) {
        console.log("Save success: ", accumulator.contentArguments.fullPath);
      });
    });
  }
}

function PluginBuildComponent(context) {
  var data = context.data;

  if (data.tag == "LoginForm") {
    context.result = context.self.build({
      "tag": "RelativeLayout",
      "attributes": {
        "name": "PesionalInfor",
        "target": "",
        "formType": "SO_YEU_LY_LICH"
      },
      "style": {
        "hAlign": "left",
        "vAlign": "top",
        "left": 0,
        "right": 0,
        "top": -20.040624999999977,
        "bottom": 0,
        "height": 353.40625,
        "width": 960.1563,
        "backgroundImage": "",
        "backgroundColor": "#ffffff00"
      },
      "children": [{
        "tag": "Ellipse",
        "attributes": {
          "name": "Circle_0",
          "target": ""
        },
        "style": {
          "hAlign": "left",
          "vAlign": "top",
          "left": 36.0625,
          "right": 624.0938,
          "top": 18.40625,
          "bottom": 35,
          "height": 300,
          "width": 300,
          "boxAlign": "lefttop",
          "fillColor": "#ebe936ee",
          "strokeColor": "#e31919e0",
          "strokeWidth": 1
        }
      }, {
        "tag": "Ellipse",
        "attributes": {
          "name": "Ellipse_1",
          "target": ""
        },
        "style": {
          "hAlign": "left",
          "vAlign": "top",
          "left": 83.703125,
          "right": 820.453175,
          "top": 80.40625,
          "bottom": 217,
          "height": 56,
          "width": 56,
          "boxAlign": "lefttop",
          "fillColor": "white",
          "strokeColor": "black",
          "strokeWidth": 1
        }
      }, {
        "tag": "Ellipse",
        "attributes": {
          "name": "Ellipse_2",
          "target": ""
        },
        "style": {
          "hAlign": "left",
          "vAlign": "top",
          "left": 209,
          "right": 695.1563,
          "top": 79,
          "bottom": 218.40625,
          "height": 56,
          "width": 56,
          "boxAlign": "lefttop",
          "fillColor": "white",
          "strokeColor": "black",
          "strokeWidth": 1
        }
      }, {
        "tag": "Ellipse",
        "attributes": {
          "name": "Ellipse_3",
          "target": ""
        },
        "style": {
          "hAlign": "left",
          "vAlign": "top",
          "left": 91.703125,
          "right": 827.453175,
          "top": 94.40625,
          "bottom": 218,
          "height": 41,
          "width": 41,
          "boxAlign": "lefttop",
          "fillColor": "#000000ff",
          "strokeColor": "black",
          "strokeWidth": 0
        }
      }, {
        "tag": "Ellipse",
        "attributes": {
          "name": "Ellipse_9",
          "target": ""
        },
        "style": {
          "hAlign": "left",
          "vAlign": "top",
          "left": 216,
          "right": 703.1563,
          "top": 92,
          "bottom": 220.40625,
          "height": 41,
          "width": 41,
          "boxAlign": "lefttop",
          "fillColor": "#000000ff",
          "strokeColor": "black",
          "strokeWidth": 0
        }
      }, {
        "tag": "Rectangle",
        "attributes": {
          "name": "Rectangle_0",
          "target": ""
        },
        "style": {
          "hAlign": "left",
          "vAlign": "top",
          "left": 378.703125,
          "right": 348.453175,
          "top": 41.40625,
          "bottom": 163,
          "height": 149,
          "width": 233,
          "boxAlign": "lefttop",
          "fillColor": "#4fe01dc2",
          "strokeColor": "#3819b2c0",
          "strokeWidth": 11,
          "roundCornerX": 25,
          "roundCornerY": 0
        }
      }]
    });
    context.result.formType = 'LoginForm';

    context.result.getData = function () {
      return {
        tag: 'LoginForm',
        style: this.style,
        attributes: this.attributes
      };
    };
  }
}

function PluginComponentPickerView(context) {
  var allNode = (0, _FCore.$)('exptree', context.self.$view, function (node) {
    return node.name == "all";
  });
  var projectExplorer = context.self.getContext(_R.default.PROJECT_EXPLORER);
  var projectName = projectExplorer.data.projectName;
  var formNode = (0, _FCore._)({
    tag: _ExpTree.default.tag,
    props: {
      name: 'fragment',
      status: 'close'
    },
    on: {
      press: context.toggleGroup
    },
    child: []
  });
  allNode.addChild(formNode);
  lsWorkspace(projectName + '/' + 'form').then(function (res) {
    Promise.all(res.map(function (file) {
      var fragmentTag = file.name.replace(/\.form$/, '');
      return downloadFragmentData(projectName + '/' + 'form/' + file.name).then(function (fData) {
        var fragmentConstructor = (0, _FmFragment.makeFmFragmentClass)({
          tag: fragmentTag,
          contentViewData: fData
        });

        _Assembler.AssemblerInstance.addConstructor(fragmentConstructor);

        return (0, _FCore._)({
          tag: 'exptree',
          props: {
            name: fragmentTag,
            icon: 'span.mdi.mdi-terraform',
            componentConstructor: fragmentConstructor
          }
        });
      });
    })).then(function (eltList) {
      eltList.forEach(function (elt) {
        formNode.addChild(elt);
      });
    });
  });
  var templateNode = (0, _FCore._)({
    tag: _ExpTree.default.tag,
    props: {
      name: 'template',
      status: 'close'
    },
    on: {
      press: context.toggleGroup
    },
    child: []
  });
  allNode.addChild(templateNode);
  lsWorkspace(projectName + '/' + 'template').then(function (res) {
    Promise.all(res.map(function (file) {
      var templateName = file.name.replace(/\.ftl$/, '');
      return downloadFragmentData(projectName + '/' + 'template/' + file.name).then(function (fData) {
        return (0, _FCore._)({
          tag: 'exptree',
          props: {
            name: templateName,
            icon: 'span.mdi.mdi-terraform',
            componentConstructor: fData
          }
        });
      });
    })).then(function (eltList) {
      eltList.forEach(function (elt) {
        templateNode.addChild(elt);
      });
    });
  });
}
};

moduleFactories["node_modules/absol-form/js/blocks/CBFunction.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBFunction.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));


function CBFunction() {
  _BaseBlock.default.call(this);

  this.func = _noop.default;
  this.attributes.args = [];
  this.attributes.body = '';
  this.pinHandlers = Object.assign({}, CBFunction.prototype.pinHandlers);
  this.receivedArgValues = {};
  this.result = undefined;
}

(0, _inheritComponentClass.default)(CBFunction, _BaseBlock.default);
CBFunction.prototype.tag = 'function';
CBFunction.prototype.menuIcon = 'span.mdi.mdi-function';
CBFunction.prototype.attributeHandlers.body = {
  set: function (value, ref) {
    ref.set(value);

    if (value && this.attributes.args) {
      this.rebuildFunction();
    }

    return value;
  },
  descriptor: {
    type: 'text'
  }
};
CBFunction.prototype.attributeHandlers.args = {
  set: function (args, ref) {
    ref.set(args || []);
    this.rebuildFunction();
    return ref.get();
  },
  descriptor: {
    type: 'text[]'
  }
};
CBFunction.prototype.attributeHandlers.defaultArgs = {
  set: function (value) {
    Object.assign(this.receivedArgValues, value);
    return value;
  },
  descriptor: {
    type: 'object'
  }
};
CBFunction.prototype.pinHandlers.exec = {
  receives: function () {
    this.exec();
  },
  descriptor: {
    type: 'bool'
  }
};
CBFunction.prototype.pinHandlers.result = {
  get: function () {
    return this.result;
  }
};

CBFunction.prototype.rebuildFunction = function () {
  var self = this;

  try {
    this.pinHandlers = this.attributes.args.reduce(function (ac, cr) {
      ac[cr] = {
        receives: function (value) {
          if (value && value.then) {
            value.then(function () {
              self.receivedArgValues[cr] = value;
              self.exec();
            });
          } else {
            self.receivedArgValues[cr] = value;
            self.exec();
          }
        }
      };
      return ac;
    }, {});
    Object.assign(this.pinHandlers, CBFunction.prototype.pinHandlers);
    this.func = new Function([`return function(${this.attributes.args.join(', ')}){`, this.attributes.body, '}'].join('\n'))();
  } catch (error) {
    (0, _safeThrow.default)(error);
    this.func = _noop.default;
  }
};

CBFunction.prototype.exec = function () {
  var self = this;
  var receivedArgValues = this.receivedArgValues;
  var completeArg = true;
  var result;
  var args = this.attributes.args.map(function (name) {
    if (name in receivedArgValues) {
      return receivedArgValues[name];
    } else completeArg = false;
  });

  if (completeArg) {
    var task = this.fragment.newTask();

    try {
      result = this.func.apply(this, args);
    } catch (err) {
      task.finish();
      (0, _safeThrow.default)(err);
      console.error("Execute script error", this, err);
      return;
    }

    if (result && result.then) {
      result.then(function (result) {
        self.result = result;
        if (result !== undefined) self.pinFire('result');
        task.finish();
      }).catch(function (err) {
        (0, _safeThrow.default)(err);
        console.error("Execute script error", this, err);
      }.bind(this));
    } else {
      this.result = result;
      if (result !== undefined) this.pinFire('result');
      task.finish();
    }
  }
};

_Assembler.AssemblerInstance.addClass(CBFunction);

var _default = CBFunction;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBSnackBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBSnackBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _Assembler = require("../core/Assembler");

var _Snackbar = _interopRequireDefault(require("absol-acomp/js/Snackbar"));


/***
 * @extends BaseBlock
 * @constructor
 */
function CBSnackBar() {
  _BaseBlock.default.call(this);
}

(0, _inheritComponentClass.default)(CBSnackBar, _BaseBlock.default);
CBSnackBar.prototype.tag = "CBSnackBar";
CBSnackBar.prototype.pinHandlers.message = {
  receives: function (value) {
    var text;
    var typeV = typeof value;

    if (typeV === 'string' || typeV === 'number' || typeV === 'boolean' || value === undefined) {
      text = value + '';
    } else text = JSON.stringify(value);

    _Snackbar.default.show(text);
  },
  descriptor: {
    type: 'text'
  }
};

_Assembler.AssemblerInstance.addClass(CBSnackBar);

var _default = CBSnackBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBFileDownloader.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBFileDownloader.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _Assembler = require("../core/Assembler");

var _FileSaver = require("absol/src/Network/FileSaver");


/***
 * @extends BaseBlock
 * @constructor
 */
function CBFileDownloader() {
  _BaseBlock.default.call(this);
}

(0, _inheritComponentClass.default)(CBFileDownloader, _BaseBlock.default);
CBFileDownloader.prototype.tag = "CBFileDownloader";
CBFileDownloader.prototype.pinHandlers.data = {
  receives: function (value) {
    if (typeof value === 'string') {
      (0, _FileSaver.saveTextAs)(value, this.attributes.fileName);
    } else if (value instanceof File || value instanceof Blob) {
      (0, _FileSaver.saveAs)(value, this.attributes.fileName);
    } else {
      (0, _FileSaver.saveTextAs)(JSON.stringify(value, null, 4), this.attributes.fileName);
    }
  },
  descriptor: {
    type: 'text'
  }
};
CBFileDownloader.prototype.attributeHandlers.fileName = {
  descriptor: {
    type: 'text'
  }
};

_Assembler.AssemblerInstance.addClass(CBFileDownloader);

var _default = CBFileDownloader;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBEntry.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBEntry.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


function CBEntry() {
  _BaseBlock.default.call(this);
}

(0, _inheritComponentClass.default)(CBEntry, _BaseBlock.default);
CBEntry.prototype.tag = 'CBEntry';
CBEntry.prototype.menuIcon = 'span.mdi.mdi-ray-start-arrow';
CBEntry.prototype.autoStart = true;
CBEntry.prototype.pinHandlers.signal = {
  get: function () {
    return true;
  },
  descriptor: {
    type: "bool"
  }
};

CBEntry.prototype.exec = function () {
  this.pinFire('signal');
};

_Assembler.AssemblerInstance.addClass(CBEntry);

var _default = CBEntry;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBTimer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBTimer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


function CBTimer() {
  _BaseBlock.default.call(this);

  this._intervalId = -1;
  this.attributes.duration = 0;
  this['tick'] = this.tick.bind(this);
}

(0, _inheritComponentClass.default)(CBTimer, _BaseBlock.default);
CBTimer.prototype.tag = 'CBTimer';
CBTimer.prototype.pinHandlers.signal = {
  get: function () {
    return true;
  },
  descriptor: {
    type: "bool"
  }
};
CBTimer.prototype.attributeHandlers.duration = {
  set: function (value) {
    if (!(value > 0)) {
      value = 0;
    }

    if (this._intervalId >= 0) {
      clearInterval(this._intervalId);
      this._intervalId = -1;
    }

    if (value > 0) {
      this._intervalId = setInterval(this.tick, value);
    }

    return value;
  },
  descriptor: {
    type: 'number',
    min: 0
  }
};

CBTimer.prototype.tick = function () {
  if (this._intervalId >= 0 && this.fragment.state === 'STOP' || this.fragment.state === 'DIE') {
    clearInterval(this._intervalId);
    this._intervalId = -1;
  }

  this.pinFire('signal');
};

_Assembler.AssemblerInstance.addClass(CBTimer);

var _default = CBTimer;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBRadioGroup.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBRadioGroup.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _Assembler = require("../core/Assembler");


/***
 * @extends BaseBlock
 * @constructor
 */
function CBRadioGroup() {
  this._value = undefined; //not define yet

  this['ev_radio'] = this.ev_radio.bind(this);

  _BaseBlock.default.call(this);
}

(0, _inheritComponentClass.default)(CBRadioGroup, _BaseBlock.default);
CBRadioGroup.prototype.tag = "CBRadioGroup";
CBRadioGroup.prototype.attributeHandlers.groupName = {
  set: function (value) {
    var ref = arguments[arguments.length - 1];

    this._assignToFragment(ref.get(), value);

    return value;
  },
  descriptor: {
    type: 'text'
  }
};
CBRadioGroup.prototype.attributeHandlers.value = {
  set: function (value) {
    value = value || null;

    var prev = this._getValue(value);

    if (this.fragment) {
      this._value = this._setValue(value);
    } else {
      this._value = value;
    }

    if (prev !== value) this.pinFire('value');
  },
  get: function () {
    if (this.fragment) {
      this._value = this._getValue(value);
    }

    return this._value;
  },
  descriptor: {
    type: "text"
  }
};
CBRadioGroup.prototype.pinHandlers.value = {
  receives: function (value) {
    this.attributes.value = value;
  },
  get: function () {
    return this._value;
  },
  descriptor: {
    type: 'text'
  }
};

CBRadioGroup.prototype._getValue = function () {
  if (!this.fragment) return this._value;
  if (!this.fragment.__radio_assigned__) return null;
  var assigned = this.fragment.__radio_assigned__;
  var list = assigned[this.attributes.groupName];
  if (!list) return null;
  var radio;

  for (var i = 0; i < list.length; ++i) {
    radio = list[i];
    if (radio.attributes.checked) return radio.attributes.value;
  }

  return null;
};

CBRadioGroup.prototype._setValue = function (value) {
  if (!this.fragment) return this._value;
  if (!this.fragment.__radio_assigned__) return null;
  var assigned = this.fragment.__radio_assigned__;
  var list = assigned[this.attributes.groupName];
  if (!list) return null;
  if (value) value = value + '';
  var res = null;
  var radio;

  for (var i = 0; i < list.length; ++i) {
    radio = list[i];

    if (radio.attributes.value === value) {
      radio.attributes.checked = true;
      res = value;
    } else radio.attributes.checked = false;
  }

  return res;
};

CBRadioGroup.prototype.onAttached = function () {
  if (this._value !== undefined) this._setValue(this._value);
};

CBRadioGroup.prototype._assignToFragment = function (oldGName, newGName) {
  if (!this.fragment) return;
  this.fragment.emittor.off('radio.' + oldGName, this.ev_radio);
  this.fragment.emittor.on('radio.' + newGName, this.ev_radio);
};

CBRadioGroup.prototype.ev_radio = function (event) {
  this._value = event.value;
  this.pinFire('value', this._value);
};

_Assembler.AssemblerInstance.addClass(CBRadioGroup);

var _default = CBRadioGroup;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBPropsGate.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBPropsGate.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));


function CBPropsGate() {
  _BaseBlock.default.call(this);
}

(0, _inheritComponentClass.default)(CBPropsGate, _BaseBlock.default);
CBPropsGate.prototype.tag = 'CBPropsGate';
CBPropsGate.prototype.pinHandlers.props = {
  receives: function (value) {
    this.fragment.props = value;
  },
  get: function () {
    return this.fragment.props;
  },
  descriptor: {
    type: "object"
  }
};
CBPropsGate.prototype.pinHandlers.propsChangeInfo = {
  get: function () {
    return this.fragment._propsChangeInfo;
  },
  descriptor: {
    type: "object"
  }
};
CBPropsGate.prototype.pinHandlers.get = {
  receives: function () {
    this.pinFire('props');
  },
  descriptor: {
    type: "bool"
  }
};

_Assembler.AssemblerInstance.addClass(CBPropsGate);

var _default = CBPropsGate;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBYesNoQuestion.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBYesNoQuestion.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _YesNoQuestionDialog = _interopRequireDefault(require("absol-acomp/js/YesNoQuestionDialog"));

var _FCore = require("../core/FCore");


/***
 * @extends BaseBlock
 * @constructor
 */
function CBYesNoQuestion() {
  _BaseBlock.default.call(this);
}

(0, _inheritComponentClass.default)(CBYesNoQuestion, _BaseBlock.default);
CBYesNoQuestion.prototype.tag = 'CBYesNoQuestion';
CBYesNoQuestion.prototype.menuIcon = 'span.mdi.mdi-chat-question-outline';

CBYesNoQuestion.prototype.exec = function () {
  var self = this;

  if (window.ModalElement && window.ModalElement.question) {
    ModalElement.question({
      title: this.attributes.title,
      message: this.attributes.message,
      onclick: function (buttonIdx) {
        self.resolve(buttonIdx == 0);
      }
    });
  } else {
    this.executeBuildInModal();
  }
};

CBYesNoQuestion.prototype.executeBuildInModal = function () {
  var self = this;
  var modal = (0, _FCore._)({
    tag: 'modal',
    child: {
      tag: _YesNoQuestionDialog.default.tag,
      props: {
        dialogTitle: this.attributes.title,
        message: this.attributes.message
      },
      on: {
        action: function (event) {
          modal.remove();
          self.resolve(event.action === 'yes');
        }
      }
    }
  }).addTo(document.body);
};

CBYesNoQuestion.prototype.resolve = function (val) {
  this.result = val;
  this.pinFire('result');
};

CBYesNoQuestion.prototype.pinHandlers.signal = {
  receives: function (value) {
    if (value) this.exec();
  },
  descriptor: {
    type: "bool"
  }
};
CBYesNoQuestion.prototype.pinHandlers.question = {
  receives: function (questionText) {
    this.attributes.message = questionText;
    this.exec();
  }
};
CBYesNoQuestion.prototype.pinHandlers.result = {
  get: function () {
    return this.result;
  },
  descriptor: {
    type: 'bool'
  }
};

_Assembler.AssemblerInstance.addClass(CBYesNoQuestion);

var _default = CBYesNoQuestion;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBExtendProperty.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBExtendProperty.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _BaseBlock = _interopRequireDefault(require("../core/BaseBlock"));

var _Assembler = require("../core/Assembler");

var _BaseComponent = _interopRequireDefault(require("../core/BaseComponent"));


/***
 * @extends BaseBlock
 * @constructor
 */
function CBExtendProperty() {
  _BaseBlock.default.call(this);

  this.value = undefined;
  this.dataBindingDescriptor = this.createDataBindingDescriptor();
}

(0, _inheritComponentClass.default)(CBExtendProperty, _BaseBlock.default);
CBExtendProperty.prototype.tag = 'CBExtendProperty';
CBExtendProperty.prototype.menuIcon = 'span.mdi.mdi-source-commit-start';
CBExtendProperty.prototype.bindDataToFragment = _BaseComponent.default.prototype.bindDataToFragment;
CBExtendProperty.prototype.unbindDataToFragment = _BaseComponent.default.prototype.unbindDataToFragment;
CBExtendProperty.prototype.attributes.disembark = false;
CBExtendProperty.prototype.attributes.dataBinding = true;
CBExtendProperty.prototype.attributeHandlers.disembark = {
  set: function (value, ref) {
    value = !!value;
    ref.set(value);
    this.bindDataToFragment(value, true);
    return value;
  },
  descriptor: {
    type: 'bool'
  },
  export: function (ref) {
    return ref.get() || undefined;
  }
};

CBExtendProperty.prototype.createDataBindingDescriptor = function () {
  var self = this;
  return {
    set: function (value) {
      if (self.value !== value) {
        self.value = value;
        self.pinFire('value');
        this.notifyChange();
      }
    },
    get: function () {
      return self.value;
    }
  };
};

CBExtendProperty.prototype.pinHandlers.value = {
  receives: function (value) {
    if (this.value !== value) {
      this.value = value;
      this.pinFire('value');
      this.notifyChange();
    }
  },
  get: function () {
    return this.value;
  }
};
CBExtendProperty.prototype.notifyChange = _BaseComponent.default.prototype.notifyChange;

_Assembler.AssemblerInstance.addClass(CBExtendProperty);

var _default = CBExtendProperty;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBEntryCompleted.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBEntryCompleted.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _CBEntry = _interopRequireDefault(require("./CBEntry"));


/***
 * @extends BEEntry
 * @constructor
 */
function CBEntryCompleted() {
  _CBEntry.default.call(this);
}

(0, _inheritComponentClass.default)(CBEntryCompleted, _CBEntry.default);
CBEntryCompleted.prototype.tag = 'CBEntryCompleted';
CBEntryCompleted.prototype.menuIcon = 'span.mdi.mdi-database-arrow-right-outline';
CBEntryCompleted.prototype.autoStart = false;

_Assembler.AssemblerInstance.addClass(CBEntryCompleted);

var _default = CBEntryCompleted;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/CBExternalTrigger.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/CBExternalTrigger.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Assembler = require("../core/Assembler");

var _inheritComponentClass = _interopRequireDefault(require("../core/inheritComponentClass"));

var _CBEntry = _interopRequireDefault(require("./CBEntry"));


/***
 * @extends BEEntry
 * @constructor
 */
function CBExternalTrigger() {
  _CBEntry.default.call(this);
}

(0, _inheritComponentClass.default)(CBExternalTrigger, _CBEntry.default);
CBExternalTrigger.prototype.tag = 'CBExternalTrigger';
CBExternalTrigger.prototype.menuIcon = 'span.mdi.mdi-square-wave';
CBExternalTrigger.prototype.autoStart = false;

_Assembler.AssemblerInstance.addClass(CBExternalTrigger);

var _default = CBExternalTrigger;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/blocks/BlockTreeList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/blocks/BlockTreeList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../core/Assembler");

var _CBFunction = _interopRequireDefault(require("./CBFunction"));

var _CBSnackBar = _interopRequireDefault(require("./CBSnackBar"));

var _CBFileDownloader = _interopRequireDefault(require("./CBFileDownloader"));

var _CBEntry = _interopRequireDefault(require("./CBEntry"));

var _CBTimer = _interopRequireDefault(require("./CBTimer"));

var _CBRadioGroup = _interopRequireDefault(require("./CBRadioGroup"));

var _CBPropsGate = _interopRequireDefault(require("./CBPropsGate"));

var _CBCmpSwitch = _interopRequireDefault(require("./CBCmpSwitch"));

var _CBYesNoQuestion = _interopRequireDefault(require("./CBYesNoQuestion"));

var _CBExtendProperty = _interopRequireDefault(require("./CBExtendProperty"));

var _CBExtendConfig = _interopRequireDefault(require("./CBExtendConfig"));

var _CBEntryCompleted = _interopRequireDefault(require("./CBEntryCompleted"));

var _CBExternalTrigger = _interopRequireDefault(require("./CBExternalTrigger"));


var BlockTreeList = {
  text: 'all',
  children: [_CBEntry.default, _CBEntryCompleted.default, _CBFunction.default, _CBFileDownloader.default, _CBTimer.default, _CBRadioGroup.default, _CBPropsGate.default, _CBExtendProperty.default, _CBExtendConfig.default, _CBExternalTrigger.default, _CBCmpSwitch.default, {
    text: 'message',
    children: [_CBSnackBar.default, _CBYesNoQuestion.default]
  }]
};
var _default = BlockTreeList;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/controller/FLResizeController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/controller/FLResizeController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function FLResizeController(launcher) {
  this.launcher = launcher;
}

FLResizeController.prototype.onCreateView = function () {
  this.$siteLeft = this.launcher.$siteLeft;
  this.$resizerLeft = this.launcher.$resizerLeft;
  this.$resizerLeft.on({
    dragstart: this.ev_dragStart.bind(this),
    drag: this.ev_drag.bind(this),
    dragend: this.ev_dragEnd.bind(this)
  });
};

FLResizeController.prototype.onDocumentResize = function () {
  var newBound = this.launcher.$view.getBoundingClientRect();
  if (this.bound && newBound.width === this.bound.width && newBound.height === this.bound.height) return;
  this.bound = newBound;
  this.launcher.$view.addStyle({
    '--f-launcher-client-width': this.bound.width + 'px',
    '--f-launcher-client-height': this.bound.height + '0px'
  });
};

FLResizeController.prototype.ev_dragStart = function () {
  this._width0 = this.$siteLeft.getBoundingClientRect().width;
};

FLResizeController.prototype.ev_drag = function (event) {
  var dx = event.currentPoint.sub(event.startingPoint).x;
  this._cWidth = Math.min(this.bound.width - 200, Math.max(this._width0 + dx, 100));
  var newPercent = this._cWidth * 100 / this.bound.width;
  if (isNaN(newPercent)) newPercent = 15;
  this.launcher.$view.addStyle('--f-launcher-site-left-width-percent', newPercent + '');
  this.launcher.config.leftSiteWidthPercent = newPercent;
};

FLResizeController.prototype.ev_dragEnd = function (event) {
  this.launcher.saveConfig(true);
};

var _default = FLResizeController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/controller/FLAutoStateController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/controller/FLAutoStateController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {FLauncher} launcher
 * @constructor
 */
function FLAutoStateController(launcher) {
  this.launcher = launcher;
  this.trackedTabFrames = [];
  this['onTabFrameStateChange'] = this['onTabFrameStateChange'].bind(this);
  this.checkInv = -1;
  this.state = 'STANDBY';
}

FLAutoStateController.prototype.onViewAttached = function () {
  this.state = 'RUNNING';
  var p = this.launcher.$view.parentElement;

  while (p) {
    if (p.isSupportedEvent && p.isSupportedEvent('active') && p.isSupportedEvent('inactive')) {
      this.trackedTabFrames.push(p);
      p.on('active', this.onTabFrameStateChange).on('inactive', this.onTabFrameStateChange).on('remove', this.onTabFrameStateChange);
    }

    p = p.parentElement;
  }

  this.launcher.start(!this._checkIsActivated());
  this.checkInv = setInterval(() => {
    if (!this.launcher.$view.isDescendantOf(document.body)) {
      this._stopTracking();

      this.launcher.destroy();
    }
  }, 3000);
};

FLAutoStateController.prototype._stopTracking = function () {
  if (this.state !== 'RUNNING') return;

  if (this.checkInv > 0) {
    clearInterval(this.checkInv);
    this.checkInv = -1;
  }

  this.trackedTabFrames.forEach(p => {
    p.off('active', this.onTabFrameStateChange).off('inactive', this.onTabFrameStateChange).off('remove', this.onTabFrameStateChange);
  });
  this.trackedTabFrames = [];
};

FLAutoStateController.prototype._checkIsActivated = function () {
  return this.trackedTabFrames.length === 0 || this.trackedTabFrames.every(elt => {
    if (elt.parentElement.classList.contains('absol-tabview-container')) {
      return !elt.parentElement.classList.contains('absol-tabview-container-hidden');
    } else {
      return elt.parentElement.classList.contains('absol-active');
    }
  });
};

FLAutoStateController.prototype.onTabFrameStateChange = function () {
  if (!this.launcher.$view.isDescendantOf(document.body)) {
    this._stopTracking();

    this.launcher.destroy();
  } else {
    if (this._checkIsActivated()) this.launcher.start();else if (this.launcher.state === "RUNNING") this.launcher.pause();
  }
};

var _default = FLAutoStateController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/FExplorer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/FExplorer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _FCore = _interopRequireWildcard(require("../core/FCore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

require("../../css/explorer.css");

var _R = _interopRequireDefault(require("../R"));

var _ExpTree = _interopRequireDefault(require("absol-acomp/js/ExpTree"));

var _utils = require("absol-acomp/js/utils");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends Fragment
 * @constructor
 */
function FExplorer() {
  _Fragment.default.call(this);

  this.savedState = {};
}

_OOP.default.mixClass(FExplorer, _Fragment.default);

FExplorer.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    class: 'af-explore',
    child: [{
      class: 'af-explore-title-bar',
      child: {
        class: 'as-form-editor-quick-toolbar',
        child: [{
          tag: 'button',
          class: 'af-explore-header-menu',
          child: 'span.mdi.mdi-dots-horizontal'
        }]
      }
    }, {
      class: 'af-explore-body',
      child: []
    }]
  });
  this.$body = (0, _FCore.$)('.af-explore-body', this.$view);
  this.$headerMenuBtn = (0, _FCore.$)('.af-explore-header-menu', this.$view);

  _QuickMenu.default.toggleWhenClick(this.$headerMenuBtn, {
    getMenuProps: this.getHeaderActionContextMenuProps.bind(this),
    onSelect: this.onHeaderAction.bind(this),
    anchor: [2, 3, 9, 1, 0]
  });
};

FExplorer.prototype.onStart = function () {
  var classes = this.getContext(_R.default.CLASSES);
  if (!classes) return;
  this.startExploringFrg = new classes.StartExploringFragment();
  this.startExploringFrg.attach(this);
  this.$body.addChild(this.startExploringFrg.getView());
  this.startExploringFrg.start();
};

FExplorer.prototype.onDestroy = function () {
  this.startExploringFrg.destroy();
};

FExplorer.prototype.getExploreTree = function () {
  return [];
};

FExplorer.prototype.redrawExpTree = function () {
  var treeData = this.getExploreTree();
  if (!treeData) return;

  var visit = (treeData, parentElt) => {
    var props = Object.assign({}, treeData);
    var id = treeData.id;
    delete props.id;
    delete props.children;
    delete props.parent;
    var treeElt = (0, _FCore._)({
      tag: _ExpTree.default.tag,
      props: props,
      on: {
        statuschange: () => {
          this.savedState[id] = treeElt.status;
        }
      }
    });
    treeElt.getNode().defineEvent('contextmenu').on('contextmenu', event => {
      var menuProps = this.getActionContextMenuProps(treeData);
      event.showContextMenu(menuProps, event => {
        var item = (0, _utils.cleanMenuItemProperty)(event.menuItem);
        this.onTreeAction(treeData, item);
      });
    }).on('dblclick', event => {
      var toggleIco = treeElt.getNode().$toggleIcon;

      if (treeElt.status === 'close') {
        if (!(0, _EventEmitter.hitElement)(toggleIco, event)) {
          treeElt.status = 'open';
          treeElt.emit('statuschange', {});
        }
      } else if (treeElt.status === 'open') {
        if (!(0, _EventEmitter.hitElement)(toggleIco, event)) {
          treeElt.status = 'close';
          treeElt.emit('statuschange', {});
        }
      } else {}

      this.onTreeAction(treeData, {
        cmd: 'open'
      });
    });
    parentElt.addChild(treeElt);

    if (treeData.children && treeData.children.length > 0) {
      treeElt.status = this.savedState[id] === 'open' ? 'open' : 'close';
      treeData.children.forEach(it => visit(it, treeElt));
    }
  };

  var handleTreeData = treeData => {
    if (treeData && treeData.then) {
      treeData.then(handleTreeData);
    } else if (treeData instanceof Array) {
      this.$body.clearChild();
      treeData.forEach(node => visit(node, this.$body));
    } else {
      this.$body.clearChild();
      visit(treeData, this.$body);
    }
  };

  handleTreeData(treeData);
};

FExplorer.prototype.getActionContextMenuProps = function (treeData) {
  return {
    items: [{
      icon: 'span.mdi.mdi-folder-open',
      text: 'Open',
      cmd: 'open'
    }]
  };
};

FExplorer.prototype.onTreeAction = function (treeData, action) {
  console.log(treeData, action);
};

FExplorer.prototype.getHeaderActionContextMenuProps = function () {
  return {
    items: [{
      icon: 'span.mdi.mdi-exit-to-app',
      text: 'Close Package',
      cmd: 'close_package'
    }]
  };
};

FExplorer.prototype.onHeaderAction = function (action) {
  console.log(action);
};

var _default = FExplorer;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/FDataModel.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/FDataModel.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function FDataModel() {}

FDataModel.prototype.getExploreTree = function () {};

var _default = FDataModel;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/controller/FLTaskManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/controller/FLTaskManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function FLTaskManager(launcher) {
  this.launcher = launcher;
  /***
   *
   * @type {null| FLTask}
   */

  this.activatedTask = null;
  this.tasks = [];
}

FLTaskManager.prototype.newTask = function (clazz, bundle) {
  var task = new clazz(bundle);
  this.tasks.push(task);
  task.attach(this.launcher);
  task.attachView();
  this.onActiveTask(task);

  switch (this.launcher.state) {
    case "RUNNING":
      task.start();
      break;

    case "PAUSE":
      task.start(true);
      break;

    case "STANDBY":
      break;

    case "STOP":
      break;
  }
};

FLTaskManager.prototype.getTaskById = function (id) {
  return this.tasks.find(task => task.id === id);
};

FLTaskManager.prototype.onStart = function () {
  if (this.activatedTask) this.activatedTask.start(true);
};

FLTaskManager.prototype.onPause = function () {
  if (this.activatedTask) this.activatedTask.pause();
};

FLTaskManager.prototype.onResume = function () {
  if (this.activatedTask) {
    this.activatedTask.resume();
  }
};

FLTaskManager.prototype.onStop = function () {
  if (this.activatedTask) {
    this.activatedTask.stop();
  }
};

FLTaskManager.prototype.onDestroy = function () {
  this.tasks.forEach(task => {
    task.destroy();
  });
};

FLTaskManager.prototype.removeTask = function (task) {
  if (this.activatedTask === task) this.onInactiveTask(task);
  var idx = this.tasks.indexOf(task);

  if (idx >= 0) {
    this.tasks.splice(idx, 1);
  }
};

FLTaskManager.prototype.onCreateView = function () {// this.$tabView = this.launcher.$mainTabView;
};
/***
 *
 * @param {FLTask|*} task
 */


FLTaskManager.prototype.onActiveTask = function (task) {
  // console.log('active',task)
  this.activatedTask = task; //console.log(task.navigatorFragments)
  // this.launcher.$
};

FLTaskManager.prototype.onInactiveTask = function (task) {
  if (this.activatedTask === task) this.activatedTask = null;
};

var _default = FLTaskManager;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/FLauncher.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/FLauncher.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _generator = require("absol/src/JSMaker/generator");

require("../../css/launcher.css");

var _R = _interopRequireDefault(require("../R"));

var _FCore = require("../core/FCore");

var _StatusBar = _interopRequireDefault(require("../dom/StatusBar"));

var _FLUserInteractionController = _interopRequireDefault(require("./controller/FLUserInteractionController"));

var _utils = require("absol-acomp/js/utils");

var _FLResizeController = _interopRequireDefault(require("./controller/FLResizeController"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _FLAutoStateController = _interopRequireDefault(require("./controller/FLAutoStateController"));

var _Hanger = _interopRequireDefault(require("absol-acomp/js/Hanger"));

var _FExplorer = _interopRequireDefault(require("./FExplorer"));

var _FrameView = _interopRequireDefault(require("absol-acomp/js/FrameView"));

var _Frame = _interopRequireDefault(require("absol-acomp/js/Frame"));

var _FDataModel = _interopRequireDefault(require("./FDataModel"));

var _FLTaskManager = _interopRequireDefault(require("./controller/FLTaskManager"));

var _TabView = _interopRequireDefault(require("absol-acomp/js/TabView"));


/***
 * @typedef FLauncherOptionClass
 * @property {Function} Explorer
 * @property {Function} DataModel
 * @property {Function} StartExploringFragment
 *
 *
 */

/***
 * @typedef FLauncherOptions
 * @property {FLauncherOptionClass} classes?
 * @property {FDataModel} database?
 *
 */

/***
 * @extends BaseEditor
 * @param options
 * @constructor
 */
function FLauncher(options) {
  this.options = Object.assign({}, (0, _generator.copyJSVariable)(options));

  _BaseEditor.default.apply(this, arguments);

  this.userInteractionCtrl = new _FLUserInteractionController.default(this);
  this.resizeCtrl = new _FLResizeController.default(this);
  this.autoStateCtrl = new _FLAutoStateController.default(this);
  this.$statusBar = (0, _FCore._)(_StatusBar.default.tag);
  this.classes = Object.assign({}, this.classes, this.options.classes);
  var DataModelClass = this.classes.DataModel || _FDataModel.default;
  var ExplorerClass = this.classes.Explorer || _FExplorer.default;
  this.explorer = new ExplorerClass();
  this.dataModel = new DataModelClass();
  this.taskMng = new _FLTaskManager.default(this);
  this.setContext(_R.default.CLASSES, this.classes);
  this.setContext(_R.default.LAUNCHER, this);
  this.setContext(_R.default.PROJECT_EXPLORER, this.explorer);
  this.setContext(_R.default.STATUS_BAR_ELT, this.$statusBar);
  this.setContext(_R.default.DATA_MODEL, this.dataModel);
  this.explorer.attach(this);
}

_OOP.default.mixClass(FLauncher, _BaseEditor.default);

FLauncher.prototype.CONFIG_STORE_KEY = 'FLauncherConfig';
FLauncher.prototype.classes = {};

FLauncher.prototype.loadConfig = function () {
  _BaseEditor.default.prototype.loadConfig.apply(this, arguments);

  if (!(0, _utils.isRealNumber)(this.config.leftSiteWidthPercent)) this.config.leftSiteWidthPercent = 15;
};

FLauncher.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    class: 'af-launcher',
    style: {
      '--f-launcher-site-left-width-percent': this.config.leftSiteWidthPercent + ''
    },
    attr: {
      tabindex: '1'
    },
    child: [{
      class: 'af-launcher-header',
      child: []
    }, {
      class: 'af-launcher-body',
      child: [{
        class: 'af-launcher-site-left',
        child: [{
          class: 'af-launcher-tab-bar-left',
          child: [{
            class: 'af-launcher-tab-bar-left-top',
            child: [{
              tag: 'button',
              class: 'as-form-editor-vertical-tab-btn',
              attr: {
                'data-name': 'explore'
              },
              child: ['span.mdi.mdi-file-tree-outline', {
                text: 'Explorer'
              }]
            }]
          }]
        }, {
          tag: _FrameView.default.tag,
          class: 'af-launcher-frame-view-left',
          child: [{
            tag: _Frame.default.tag,
            class: 'af-launcher-frame-explorer',
            child: this.explorer.getView()
          }]
        }, {
          tag: _Hanger.default.tag,
          class: 'af-launcher-resizer-left'
        }]
      }, {
        class: 'af-launcher-site-middle',
        child: {
          tag: _TabView.default.tag,
          class: ['metro-flat', 'af-launcher-main-tab-view']
        }
      }, {
        class: 'af-launcher-site-right'
      }]
    }, {
      class: 'af-launcher-footer',
      child: [this.$statusBar]
    }]
  });
  this.$frameViewLeft = (0, _FCore.$)('.af-launcher-frame-view-left', this.$view);
  this.$mainTabView = (0, _FCore.$)('.af-launcher-main-tab-view', this.$view);
  this.$resizerLeft = (0, _FCore.$)('.af-launcher-resizer-left', this.$view);
  this.$siteLeft = (0, _FCore.$)('.af-launcher-site-left', this.$view);
  this.$frameExplorer = (0, _FCore.$)('.af-launcher-frame-explorer', this.$siteLeft);
  this.$tabBarLeft = (0, _FCore.$)('.af-launcher-tab-bar-left', this.$siteLeft);
  this.$frameExplorer.requestActive();
  this.$attachhook = (0, _FCore._)('attachhook').addTo(this.$view);
  this.$attachhook.requestUpdateSize = this.resizeCtrl.onDocumentResize.bind(this.resizeCtrl);
  this.$attachhook.once('attached', () => {
    _ResizeSystem.default.add(this.$attachhook);

    this.resizeCtrl.onDocumentResize();
    this.autoStateCtrl.onViewAttached();
  });
  this.resizeCtrl.onCreateView();
  this.userInteractionCtrl.onCreateView();
  this.taskMng.onCreateView();
};

FLauncher.prototype.onStart = function () {
  this.explorer.start(true);
  this.taskMng.onStart();
};

FLauncher.prototype.onResume = function () {
  this.explorer.resume();
  this.taskMng.onResume();
};

FLauncher.prototype.onPause = function () {
  this.explorer.pause();
  this.taskMng.onPause();
};

FLauncher.prototype.onStop = function () {
  this.explorer.stop();
  this.taskMng.onStop();
};

FLauncher.prototype.onDestroy = function () {
  this.taskMng.onDestroy(); // console.log('onDestroy', this.options.name);
};

FLauncher.prototype.newTask = function (clazz, bundle) {
  this.taskMng.newTask(clazz, bundle);
};

FLauncher.prototype.getTaskById = function (id) {
  return this.taskMng.getTaskById(id);
};

var _default = FLauncher;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/frame/BlocklyDataModel.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/frame/BlocklyDataModel.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FDataModel = _interopRequireDefault(require("../launcher/FDataModel"));

var _LoadingCubeModal = _interopRequireDefault(require("absol-acomp/js/LoadingCubeModal"));


/***
 * @extends FDataModel
 * @constructor
 */
function BlocklyDataModel() {
  _FDataModel.default.apply(this, arguments);

  this.runningTasks = [];
  this.cache = {};
  this.callTask = window.callTask || this.callTask;
  this.typeDescriptorsCache = null;
}

BlocklyDataModel.prototype.callTask = function (callee, args) {
  //for test only
  var txt = `return ${callee}(${args.map(arg => absol.generateJSVariable(arg)).join(', ')})`;
  return new Function(txt)();
};

BlocklyDataModel.prototype.getPackageTreeList = function () {
  var task;

  if (!this.cache['packageTree']) {
    task = this.newTask();
    this.cache['packageTree'] = Promise.all([data_module.loadSCLangNamespaceList(), data_module.loadSCLangNodeInfoList()]).then(res => {
      var namespaces = res[0];
      var nodes = res[1];
      var spDict = namespaces.reduce((ac, cr) => {
        ac[cr.id] = Object.assign({
          children: []
        }, cr);
        return ac;
      }, {});
      var nsIdList = namespaces.map(it => it.id);
      nsIdList.forEach(id => {
        var cr = spDict[id];
        var par = spDict[cr.parentid];
        if (par) par.children.push(cr);
      });
      nodes.forEach(node => {
        var par = spDict[node.namespaceid];
        if (par) par.children.push(node);
      });
      task.finish();
      return namespaces.filter(c => c.type === 0 && c.parentid === -1).map(c => spDict[c.id]);
    }).then(result => {
      task.finish();
      return result;
    });
  }

  return this.cache['packageTree'];
};

BlocklyDataModel.prototype.getExploreTree = function () {};

BlocklyDataModel.prototype.loadNodeById = function (id) {
  var task = this.newTask();
  return this.callTask('data_module.loadSCLangNodeById', [id]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.saveNewNameSpace = function (nameSpaceData, parentId) {
  var task = this.newTask();
  return this.callTask('hr.sclang.saveNewNamespace', [nameSpaceData, parentId]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.saveNewPackage = function (name, description) {
  var task = this.newTask();
  this.cache = {};
  return this.callTask('hr.sclang.saveNewPackage', [name, description]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.saveNewSubpackage = function (parentId, name, description) {
  var task = this.newTask();
  this.cache = {};
  return this.callTask('hr.sclang.saveNewSubpackage', [parentId, name, description]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.deletePackage = function (id) {
  var task = this.newTask();
  this.cache = {};
  return this.callTask('hr.sclang.deletePackage', [id]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.deletePackages = function (idList) {
  var task = this.newTask();
  this.cache = {};
  return this.callTask('hr.sclang.deletePackageList', [idList]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.saveNewNode = function (packageId, type, name, description) {
  var task = this.newTask();
  this.cache = {};
  return this.callTask('hr.sclang.saveNewNode', [packageId, type, name, description]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.deleteNode = function (id) {
  var task = this.newTask();
  this.cache = {};
  return this.callTask('hr.sclang.deleteNode', [id]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.getTypeDescriptors = function () {
  var task;

  if (!this.typeDescriptorsCache) {
    task = this.newTask();
    this.typeDescriptorsCache = this.callTask('contentModule.getTypeList', []).then(typeList => {
      var sync = typeList.map(id => this.callTask('contentModule.getTypeDescriptor', [id]));
      return Promise.all(sync).then(descriptorList => {
        return typeList.reduce((ac, cr, i) => {
          ac[cr] = descriptorList[i];
          return ac;
        }, {});
      });
    }).then(result => {
      task.finish();
      return result;
    });
  }

  return this.typeDescriptorsCache;
};

BlocklyDataModel.prototype.updateNode = function (id, modifiedData) {
  var task = this.newTask();
  return this.callTask('hr.sclang.updateNode', [id, modifiedData]).then(result => {
    task.finish();
    return result;
  });
};

BlocklyDataModel.prototype.newTask = function () {
  var task = {};

  task.finish = () => {
    var idx = this.runningTasks.indexOf(task);
    if (idx < 0) return;
    this.runningTasks.splice(idx, 1);

    if (this.runningTasks.length === 0) {
      if (window.ModalElement && window.ModalElement.close) {
        window.ModalElement.close();
      } else {
        _LoadingCubeModal.default.close(this._loadingToken);
      }
    }
  };

  if (this.runningTasks.length === 0) {
    if (window.ModalElement && window.ModalElement.show_loading) {
      window.ModalElement.show_loading();
    } else {
      this._loadingToken = _LoadingCubeModal.default.show();
    }
  }

  this.runningTasks.push(task);
  return task;
};

var _default = BlocklyDataModel;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/frame/BlocklyStartExploringFragment.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/frame/BlocklyStartExploringFragment.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FlexiconButton = _interopRequireDefault(require("absol-acomp/js/FlexiconButton"));

var _FCore = require("../core/FCore");

var _R = _interopRequireDefault(require("../R"));


/***
 * @extends Fragment
 * @constructor
 */
function BlocklyStartExploringFragment() {
  _Fragment.default.apply(this, arguments);
}

_OOP.default.mixClass(BlocklyStartExploringFragment, _Fragment.default);

BlocklyStartExploringFragment.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    class: '',
    child: [{
      // tag:''
      style: {
        padding: '10px 5px'
      },
      child: {
        text: 'You have not open a package'
      }
    }, {
      style: {
        textAlign: 'center'
      },
      child: {
        tag: _FlexiconButton.default.tag,
        props: {
          text: 'Open Package',
          icon: 'span.mdi.mdi-package-variant'
        },
        on: {
          click: () => {
            this.explorer.openPackageListDialog();
          }
        }
      }
    }, {
      // tag:''
      style: {
        padding: '10px 5px'
      },
      child: {
        text: 'Or'
      }
    }, {
      style: {
        textAlign: 'center'
      },
      child: {
        tag: _FlexiconButton.default.tag,
        props: {
          text: 'New Package',
          icon: 'span.mdi.mdi-package-variant-plus'
        }
      },
      on: {
        click: () => {
          this.explorer.openNewPackageDialog();
        }
      }
    }]
  });
};

BlocklyStartExploringFragment.prototype.onAttached = function () {
  /***
   *
   * @type {BlocklyDataModel}
   */
  this.dataModel = this.getContext(_R.default.DATA_MODEL);
  /***
   * @type {SCLauncher}
   */

  this.launcher = this.getContext(_R.default.LAUNCHER);
  /***
   * @type {SCExplorer}
   */

  this.explorer = this.getContext(_R.default.PROJECT_EXPLORER);
};

BlocklyStartExploringFragment.prototype.onStart = function () {
  this.dataModel.getPackageTreeList().then(list => {
    if (list.length === 0) {
      this.$view.childNodes[0].addStyle('display', 'none');
      this.$view.childNodes[1].addStyle('display', 'none');
      this.$view.childNodes[2].firstChild.data = "No package found!";
    } else {
      this.$view.childNodes[0].removeStyle('display');
      this.$view.childNodes[1].removeStyle('display');
    }
  });
};

var _default = BlocklyStartExploringFragment;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/launcher/controller/FLTask.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/launcher/controller/FLTask.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _GrandContext = _interopRequireDefault(require("absol/src/AppPattern/GrandContext"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TabFrame = _interopRequireDefault(require("absol-acomp/js/TabFrame"));

var _R = _interopRequireDefault(require("../../R"));

var _FCore = require("../../core/FCore");

var _utils = require("absol-acomp/js/utils");


/***
 * @extends {GrandContext}
 * @param bundle
 * @constructor
 */
function FLTask(bundle) {
  _GrandContext.default.apply(this);

  this.bundle = bundle;
  Object.defineProperty(this, 'id', {
    value: this.computeIdent(),
    enumerable: true
  });
  this.mainFragment = null;

  if (this.MainFragmentClass) {
    this.mainFragment = new this.MainFragmentClass();
    this.mainFragment.attach(this);
  }

  this.navigatorFragments = this.navigators.reduce((ac, cr) => {
    ac[cr.name] = new cr.FragmentClass();
    ac[cr.name].attach(this);
    return ac;
  }, {});
}

_OOP.default.mixClass(FLTask, _GrandContext.default);

FLTask.prototype.taksIcon = null;
FLTask.prototype.taskName = "NoName";

FLTask.prototype.onStart = function () {
  this.mainFragment.start(true);
  this.navigators.forEach(name => this.navigatorFragments[name].start(true));
};

FLTask.prototype.onResume = function () {
  this.mainFragment.resume();
  this.navigators.forEach(name => this.navigatorFragments[name].resume());
};

FLTask.prototype.onPause = function () {
  this.mainFragment.pause();
  this.navigators.forEach(name => this.navigatorFragments[name].pause());
};

FLTask.prototype.onStop = function () {
  this.mainFragment.stop();
  this.navigators.forEach(name => this.navigatorFragments[name].stop());
};

FLTask.prototype.onDestroy = function () {
  this.mainFragment.destroy();
  this.navigators.forEach(name => this.navigatorFragments[name].destroy());
};

FLTask.prototype.onAttached = function () {
  /***
   *
   * @type {FLauncher}
   */
  this.laucher = this.getContext(_R.default.LAUNCHER);
};

FLTask.prototype.computeIdent = function () {
  return (0, _utils.keyStringOf)(this.bundle);
};

FLTask.prototype.attachView = function () {
  this.$tab = (0, _FCore._)({
    tag: _TabFrame.default.tag,
    class: 'af-launcher-main-tab-frame',
    child: this.mainFragment.getView(),
    props: {
      name: this.taskName,
      tabIcon: this.taksIcon
    }
  });
  this.laucher.$mainTabView.addChild(this.$tab);
  this.$tab.on({
    active: () => {
      this.laucher.taskMng.onActiveTask(this);
      this.start();
    },
    inactive: () => {
      this.pause();
      this.laucher.taskMng.onInactiveTask(this);
    },
    remove: () => {
      this.destroy();
      this.laucher.taskMng.removeTask(this);
    }
  });
};

FLTask.prototype.requestActive = function () {
  this.$tab.requestActive();
};
/****
 *
 * @type {{name:string, icon:any, FragmentClass: Function, displayName}[]}
 */


FLTask.prototype.navigators = [];
FLTask.prototype.MainFragmentClass = null;
var _default = FLTask;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/assets/icon/sb-while-statement.svg"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/assets/icon/sb-while-statement.svg ***/
module.exports = "<svg width=\"24\" height=\"24\" version=\"1.1\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <g>\n  <path transform=\"translate(-9 -.5)\" d=\"m10 3.5v4h11.5v-4z\" color=\"#000000\" fill=\"#009700\" style=\"-inkscape-stroke:none\"/>\n  <path transform=\"translate(-11.5)\" d=\"m13 4h10\" fill=\"#00f700\"/>\n  <path d=\"m12.5 3c-5.2230106 0-9.5 4.2769894-9.5 9.5 0 5.223011 4.2769894 9.5 9.5 9.5 5.223011 0 9.5-4.276989 9.5-9.5 0-5.2230106-4.276989-9.5-9.5-9.5zm0 4c3.061252 0 5.5 2.4387477 5.5 5.5 0 3.061252-2.438748 5.5-5.5 5.5-3.0612523 0-5.5-2.438748-5.5-5.5 0-3.0612523 2.4387477-5.5 5.5-5.5z\" color=\"#000000\" fill=\"#00c400\" fill-rule=\"evenodd\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"-inkscape-stroke:none;paint-order:fill markers stroke\"/>\n  <path transform=\"translate(10 -.5)\" d=\"m2 3.5v4h11v-4z\" color=\"#000000\" fill=\"#d40000\" style=\"-inkscape-stroke:none\"/>\n  <path transform=\"translate(16.5,-10)\" d=\"m-5 10v10l5-5z\" fill=\"#72c400\" style=\"mix-blend-mode:normal\"/>\n </g>\n</svg>\n";

};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBBase.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBBase.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isBoundOfChild = isBoundOfChild;
exports.default = void 0;

var _FCore = require("../../core/FCore");

require("../../../css/clangblockly.css");

var _GCore = _interopRequireDefault(require("../../core/GCore"));

var _Turtle = _interopRequireDefault(require("absol-svg/js/controller/Turtle"));

var _sbWhileStatement = _interopRequireDefault(require("../../../assets/icon/sb-while-statement.svg"));


/***
 *
 * @param {AElement|HTMLElement} elt
 * @param {AElement|HTMLElement} ctnElt
 * @returns {boolean}
 */
function isBoundOfChild(elt, ctnElt) {
  if (!elt || !elt.tagName || elt.tagName.toLowerCase() !== 'path' || !elt.hasClass || !elt.hasClass('sb-block-bound')) return false;
  return elt.parentElement && elt.parentElement.parentElement && elt.parentElement.parentElement.parentElement === ctnElt;
}

function SBBase() {
  this._editor = null;
}

SBBase.prototype.astType = null;

SBBase.prototype.render = function () {
  this.$elt = (0, _FCore._)({
    class: 'sb-block',
    props: {
      sbBlock: this
    },
    child: [_GCore.default._({
      tag: 'svg',
      class: 'sb-block-img',
      child: [{
        tag: 'path',
        class: 'sb-block-bound'
      }]
    })]
  });
  if (this.astType) this.$elt.attr('data-ast-type', this.astType);
  this.$img = (0, _FCore.$)('.sb-block-img', this.$elt);
  this.$bound = (0, _FCore.$)('.sb-block-bound', this.$img);
};

SBBase.prototype.updateImg = function () {
  if (!this.$elt) return;
  this.bound = this.$elt.getBoundingClientRect();
  this.imgBound = this.$img.getBoundingClientRect();
  this.$img.attr('viewBox', [-10.5, -0.5, this.imgBound.width, this.imgBound.height].join(' '));
  this.$bound.attr('d', this.getBoundingPath());
};

SBBase.prototype.notifySizeChange = function () {
  var cr = this.$elt;
  var topElt;

  while (cr) {
    if (cr.sbBlock) topElt = cr;
    cr = cr.parentElement;
  }

  (0, _FCore.$)('.sb-block', cr, function (elt) {
    elt.sbBlock.updateImg();
  });
};

SBBase.prototype.notifyASTChange = function () {
  var parent = this.parent;

  while (parent) {
    parent.onChildAstChange(this);
    parent = parent.parent;
  }

  var editor = this.editor;
  if (editor) editor.notifyASTChange();
};

SBBase.prototype.onChildAstChange = function (targetBlock) {};

SBBase.prototype.getBoundingPath = function () {
  return new _Turtle.default().moveTo(0, 0).lineTo(this.bound.width - 1, 0).lineTo(this.bound.width - 1, this.bound.height - 1).lineTo(0, this.bound.height - 1).closePath().getPath();
};

SBBase.prototype.getVariables = function (ac) {
  var parent = this.parent;
  if (parent) return this.parent.getVariables(ac);
};

SBBase.prototype.getExpressionTypeSelection = function () {
  var res = [];
  var variables = this.getVariables();
  var variableArr = Object.keys(variables);
  variableArr.sort((a, b) => variables[a].order - variables[b].order);
  res.push({
    class: 'sb-menu-selection-title',
    child: {
      text: 'Libs'
    }
  });
  variableArr.reduce((ac, key) => {
    if (variables[key].type.type === 'object' && variables[key].isLib) ac.push({
      text: key,
      variable: variables[key]
    });
    return ac;
  }, res);
  res.push({
    class: 'sb-menu-selection-title',
    child: {
      text: 'Variable'
    }
  });
  variableArr.reduce((ac, key) => {
    if (variables[key].type.type === 'class' || variables[key].isLib) return ac;
    ac.push({
      text: key,
      variable: variables[key]
    });
    return ac;
  }, res);
  res.push({
    class: 'sb-menu-selection-title',
    child: {
      text: 'Class'
    }
  });
  variableArr.reduce((ac, key) => {
    if (variables[key].type.type !== 'class') return ac;
    ac.push({
      text: key,
      variable: variables[key]
    });
    return ac;
  }, res);
  res.push({
    tag: 'span',
    class: 'sb-menu-selection-title',
    child: {
      text: 'Literal'
    }
  }, {
    text: 'null',
    astType: 'NullLiteral'
  }, {
    text: 'boolean',
    astType: 'BooleanLiteral'
  }, {
    text: 'number',
    astType: 'NumericLiteral'
  }, {
    text: 'string',
    astType: 'StringLiteral'
  }, {
    tag: 'span',
    class: 'sb-menu-selection-title',
    child: {
      text: 'Expression'
    }
  }, {
    text: '[] + []',
    astType: 'BinaryExpression'
  }, {
    text: '- []',
    astType: 'UnaryExpression'
  }, {
    text: 'create array',
    astType: 'ArrayExpression'
  }, {
    text: 'create struct',
    astType: 'ObjectExpression'
  }, {
    text: 'new Object',
    astType: 'NewExpression'
  }, {
    text: 'object->property',
    astType: 'MemberExpression'
  }, {
    text: 'fx(...)',
    astType: 'CallExpression'
  }, '==========', {
    text: "Parse form text",
    cmd: 'parse_text',
    icon: 'span.mdi.mdi-form-textbox'
  }, {
    icon: 'span.mdi.mdi-puzzle-star-outline',
    text: 'Open Expression builder(TODO)',
    cmd: 'open_expression_builder'
  });
  return res;
};

SBBase.prototype.getStatementTypeSelection = function () {
  var items = [{
    text: 'Assign Statement',
    astType: 'AssignStatement',
    icon: 'span.mdi.mdi-equal'
  }, {
    text: 'Call function',
    astType: 'ExpressionStatement',
    icon: 'span.mdi.mdi-function'
  }, {
    text: 'If statement',
    astType: 'IfStatement',
    icon: 'span.mdi.mdi-help'
  }, {
    text: 'While loop',
    astType: 'WhileStatement',
    icon: _sbWhileStatement.default
  }, {
    text: 'For count loop',
    astType: 'ForCountStatement',
    icon: _sbWhileStatement.default
  }, {
    text: 'For of loop',
    astType: 'ForOfStatement',
    icon: _sbWhileStatement.default
  }, {
    text: 'For in loop',
    astType: 'ForInStatement',
    icon: _sbWhileStatement.default
  }, {
    text: 'ReturnStatement',
    astType: 'ReturnStatement',
    icon: 'span.mdi.mdi-location-exit'
  }];

  if (this.inLoop) {
    items.push({
      text: 'Break loop',
      astType: 'BreakStatement',
      icon: 'span.mdi.mdi-repeat-off'
    });
  }

  items.unshift({
    text: 'From Text',
    cmd: 'parse_text',
    icon: 'span.mdi.mdi-form-textbox'
  }, '===================');
  return items;
}; //****** CHILD  **********//


SBBase.prototype.remove = function () {
  var parent = this.parent;
  if (parent) parent.removeChild(this);
};

SBBase.prototype.removeChild = function (child) {
  throw new Error("Not implement!");
};
/***
 *
 * @param {"up" | "down"}direction
 * @return {boolean}
 */


SBBase.prototype.canMove = function (direction) {
  var parent = this.parent;
  if (parent) return parent.canMoveChild(this, direction);
  return false;
};
/***
 *
 * @param {SBBase|*} child
 * @param {"up" | "down"} direction
 * @return {boolean}
 */


SBBase.prototype.canMoveChild = function (child, direction) {
  return false;
};
/***
 *
 * @param {"up" | "down"}direction
 */


SBBase.prototype.move = function (direction) {
  var parent = this.parent;
  if (parent) parent.moveChild(this, direction);
};
/***
 *
 * @param {SBBase|*} child
 * @param {"up" | "down"} direction
 *
 */


SBBase.prototype.moveChild = function (child, direction) {};
/***
 *
 * @param {SBBase|*} child
 * @returns {boolean}
 */


SBBase.prototype.canAddChildBefore = function (child, bf) {
  return false;
};
/***
 *
 * @param {SBBase|*} child
 * @param {SBBase|*} bf
 */


SBBase.prototype.addChildBefore = function (child, bf) {};
/***
 *
 * @param {SBBase|*} child
 * @returns {boolean}
 */


SBBase.prototype.canAddChildAfter = function (child, at) {
  return false;
};
/***
 *
 * @param {SBBase|*} child
 */


SBBase.prototype.addChildAfter = function (child, at) {};

SBBase.prototype.getExpectedType = function () {
  return null;
};

SBBase.prototype.isCompleted = function () {
  return true;
};

Object.defineProperty(SBBase.prototype, 'elt', {
  get: function () {
    if (!this.$elt) {
      this.render();
    }

    return this.$elt;
  }
});
Object.defineProperty(SBBase.prototype, 'parent', {
  get: function () {
    if (!this.$elt) {
      return null;
    }

    var p = this.$elt.parentElement;

    while (p) {
      if (p.sbEditor) {
        this._editor = p.sbEditor;
        return null;
      }

      if (p.sbBlock) return p.sbBlock;
      p = p.parentElement;
    }

    return null;
  }
});
Object.defineProperty(SBBase.prototype, 'inLoop', {
  get: function () {
    var inLoop = false;
    var cr = this;

    while (cr && !inLoop) {
      if (cr.astType === 'FunctionDeclaration') break;
      if (cr.astType === 'ForCountStatement') inLoop = true;
      if (cr.astType === 'WhileStatement') inLoop = true;
      cr = cr.parent;
    }

    return inLoop;
  }
});
/***
 * @name editor
 * @memberOf SBBase#
 * @type {SCBlocklyEditor|null}
 */

Object.defineProperty(SBBase.prototype, 'editor', {
  get: function () {
    var parent = this.parent;
    if (this._editor) return this._editor;

    if (parent) {
      this._editor = parent.editor;
    }

    return this._editor;
  }
});
var _default = SBBase;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBClassManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBClassManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _getFunctionName = _interopRequireDefault(require("absol/src/String/getFunctionName"));


function SBClassManager() {
  this.classes = {};
  this.astType2Class = {};
}

SBClassManager.prototype.add = function (clazz) {
  var name = clazz.prototype.type || clazz.name || (0, _getFunctionName.default)(clazz);
  this.classes[name] = clazz;

  if (clazz.prototype.astType) {
    this.astType2Class[clazz.prototype.astType] = clazz;
  }
};

SBClassManager.prototype.get = function (name) {
  return this.classes[name] || this.astType2Class[name];
};

SBClassManager.prototype.getClassNames = function () {
  return Object.keys(this.classes);
};

var _default = new SBClassManager();

exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBTurtle.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBTurtle.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Turtle = _interopRequireDefault(require("absol-svg/js/controller/Turtle"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/***
 * @extends Turtle
 * @constructor
 */
function SBTurtle() {
  _Turtle.default.apply(this);
}

_OOP.default.mixClass(SBTurtle, _Turtle.default);
/***
 *
 * @returns {SBTurtle}
 */


SBTurtle.prototype.statementKnop = function () {
  if (this._tangent.x > 0) {
    return this.lineBy(3, 3).arcBy(5, 5, 0, 0, 0, 4, 0).lineBy(3, -3);
  } else {
    return this.lineBy(-3, 3).arcBy(5, 5, 0, 0, 1, -4, 0).lineBy(-3, -3);
  }
};
/***
 *
 * @returns {SBTurtle}
 */


SBTurtle.prototype.expKnop = function () {
  if (this._tangent.y > 0) {
    //(0, 0)||(0, 3)  (-8, -8) (-8, 5) => (-8, 15) (0, 4) (0, 9)
    return this.cubicBezierBy(0, 3, -8, -8, -8, 5).cubicBezierBy(0, 10, 8, -1, 8, 4);
  } else {
    //(0, 9)|| (0, 4)  (-8, 15)   (-8, 5)||(-8, -8) (0, 3) (0, 0)
    return this.cubicBezierBy(0, -5, -8, 6, -8, -4).cubicBezierBy(0, -13, 8, -2, 8, -5);
  }
};

SBTurtle.prototype.expBound = function (left, top, width, height) {
  return this.moveTo(left, top).hLineBy(width).vLineBy(height).hLineBy(-width).vLineTo(top + 17).expKnop().closePath();
};

var _default = SBTurtle;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));


/***
 * @extends SBBase
 * @constructor
 */
function SBExpression() {
  _SBBase.default.apply(this, arguments);
}

_OOP.default.mixClass(SBExpression, _SBBase.default);

SBExpression.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var right = bound.width - 1;
  var bottom = bound.height - 1;
  var turtle = new _SBTurtle.default().moveTo(0, 0).hLineTo(right).vLineTo(bottom).hLineTo(0).vLineTo(17).expKnop().closePath();
  return turtle.getPath();
};

var _default = SBExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBNumericLiteral.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBNumericLiteral.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _NumberInput = _interopRequireDefault(require("absol-acomp/js/numberinput/NumberInput"));

var _FCore = require("../../core/FCore");

var _SBExpression = _interopRequireDefault(require("./SBExpression"));


/***
 * @extends SBBase
 * @constructor
 */
function SBNumericLiteral() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: 'NumericLiteral',
    value: 0
  };
}

_OOP.default.mixClass(SBNumericLiteral, _SBBase.default);

SBNumericLiteral.prototype.astType = 'NumericLiteral';

SBNumericLiteral.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-numeric-literal',
    child: {
      tag: _NumberInput.default,
      class: 'as-width-auto',
      props: {
        value: this._ast.value
      }
    }
  });
  this.$number = (0, _FCore.$)(_NumberInput.default.tag, this.$elt).on('change', () => {
    this._ast.value = this.$number.value;
    this.notifyASTChange();
  });
};

SBNumericLiteral.prototype.getBoundingPath = _SBExpression.default.prototype.getBoundingPath;
Object.defineProperty(SBNumericLiteral.prototype, 'ast', {
  set: function (ast) {
    this._ast.value = typeof ast.value !== "number" ? 0 : ast.value;
    if (this.$number) this.$number.value = ast.value;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBNumericLiteral);

var _default = SBNumericLiteral;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/dom/SBTokenSelection.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/dom/SBTokenSelection.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

/***
 * @extends AElement
 * @constructor
 */
function SBTokenSelection() {
  this.$text = (0, _FCore.$)('.sb-token-text', this);
  this._text = '';
  this._displayText = '';
}

SBTokenSelection.tag = 'SBTokenSelection'.toLowerCase();

SBTokenSelection.render = function () {
  return (0, _FCore._)({
    class: 'sb-token-selection',
    extendEvent: 'contextmenu',
    child: [{
      tag: 'span',
      class: 'sb-token-text',
      child: {
        text: ''
      }
    }],
    on: {
      contextmenu: function (event) {
        event.stopPropagation();
      }
    }
  });
};

SBTokenSelection.property = {};
SBTokenSelection.property.text = {
  get: function () {
    return this._text;
  },
  set: function (text) {
    this._text = text || '';
    this.$text.firstChild.data = this._displayText || this._text;

    if (this._displayText !== this._text && this._displayText && this._text) {
      this.attr('title', this._text);
    } else {
      this.attr('title', null);
    }
  }
};
SBTokenSelection.property.displayText = {
  get: function () {
    return this._displayText;
  },
  set: function (value) {
    this._displayText = value || '';
    this.$text.firstChild.data = this._displayText || this._text;

    if (this._displayText !== this._text && this._displayText && this._text) {
      this.attr('title', this._text);
    } else {
      this.attr('title', null);
    }
  }
};
var _default = SBTokenSelection;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBAddExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBAddExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _FCore = require("../../core/FCore");


/**
 * @extends SBBase
 * @constructor
 */
function SBAddExpression(opt) {
  _SBBase.default.apply(this, arguments);

  this.opt = Object.assign({
    text: '+ Add Expression'
  }, opt);
}

_OOP.default.mixClass(SBAddExpression, _SBBase.default);

SBAddExpression.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  this.$elt.addClass('sb-add-expression');
  this.$text = (0, _FCore._)({
    tag: 'span',
    class: 'sb-inline-text',
    child: {
      text: this.opt.text
    }
  });
  this.$elt.addChild(this.$text);
};

SBAddExpression.prototype.getBoundingPath = function () {
  return _SBExpression.default.prototype.getBoundingPath.call(this);
};

var _default = SBAddExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/engine/utils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/engine/utils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.isExpressionAst = isExpressionAst;
exports.autoMigrateAst = autoMigrateAst;

function isExpressionAst(ast) {
  return ast.type && ast.type && (ast.type === 'Identifier' || ast.type.endsWith('Expression') || ast.type.endsWith('Literal'));
}

function autoMigrateAst(oldAst, newAst) {
  if (!oldAst) return newAst;

  if (newAst.type === 'MemberExpression' && !newAst.object && isExpressionAst(oldAst)) {
    newAst.object = oldAst;
  } else if (newAst.type === 'CallExpression' && !newAst.callee && (oldAst.type === 'Identifier' || oldAst.type === 'MemberExpression')) {
    newAst.callee = oldAst;
  } else if (newAst.type === 'UnaryExpression' && !newAst.argument && isExpressionAst(oldAst)) {
    newAst.argument = oldAst;
  } else if (newAst.type === 'BinaryExpression' && !newAst.left && isExpressionAst(oldAst)) {
    newAst.left = oldAst;
  } else if (newAst.type === 'ArrayExpression' && !newAst.elements && isExpressionAst(oldAst)) {
    newAst.elements = [oldAst];
  }

  return newAst;
}
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBBinaryExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBBinaryExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBTokenSelection = _interopRequireDefault(require("../dom/SBTokenSelection"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _utils = require("../dom/utils");

var _SBBase = require("./SBBase");

var _utils2 = require("../engine/utils");


/***
 * @extends SBExpression
 * @constructor
 */
function SBBinaryExpression() {
  _SBExpression.default.call(this);

  this._ast = {
    type: 'BinaryExpression',
    left: null,
    right: null,
    operator: {
      type: 'BinaryOperator',
      content: '+'
    }
  };
  this.addExpressionLeftBlock = new _SBAddExpression.default();
  this.addExpressionRightBlock = new _SBAddExpression.default();
  this.leftBlock = null;
  this.rightBlock = null;
  Object.defineProperty(this._ast, 'left', {
    get: () => this.leftBlock && this.leftBlock.ast || null
  });
  Object.defineProperty(this._ast, 'right', {
    get: () => this.rightBlock && this.rightBlock.ast || null
  });
}

_OOP.default.mixClass(SBBinaryExpression, _SBExpression.default);

SBBinaryExpression.prototype.astType = 'BinaryExpression';

SBBinaryExpression.prototype.render = function () {
  _SBExpression.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-binary-expression',
    child: [{
      class: ['sb-block-sub-ctn', 'sb-binary-expression-left-ctn'],
      child: [(this.leftBlock || this.addExpressionLeftBlock).elt]
    }, {
      tag: _SBTokenSelection.default,
      props: {
        text: this._ast.operator.content
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-binary-expression-right-ctn'],
      child: [(this.rightBlock || this.addExpressionRightBlock).elt]
    }]
  });
  this.$leftCtn = (0, _FCore.$)('.sb-binary-expression-left-ctn', this.$elt);
  this.$rightCtn = (0, _FCore.$)('.sb-binary-expression-right-ctn', this.$elt);
  this.$op = (0, _FCore.$)(_SBTokenSelection.default.tag, this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$op, {
    getMenuProps: () => {
      return {
        extendClasses: ['sb-quick-menu'],
        items: this.getOperatorSelection()
      };
    },
    onSelect: item => {
      if (item.op) {
        this._ast.operator.content = item.op;

        if (this.$op) {
          this.$op.text = item.op;
        }

        this.notifySizeChange();
        this.notifyASTChange();
      }
    }
  });

  this.leftQMN = _QuickMenu.default.toggleWhenClick(this.$leftCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addExpressionLeftBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$leftCtn);
      ok = ok || this.leftBlock && this.leftBlock.astType === 'Identifier';

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        this.leftBlock = new clazz();
        this.leftBlock.ast = ast;
        this.$leftCtn.clearChild().addChild(this.leftBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
        this.editor.selectTool.selectBlock(this.leftBlock);
      };

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.leftBlock && this.leftBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$leftCtn, '').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });
  this.rightQMN = _QuickMenu.default.toggleWhenClick(this.$rightCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addExpressionRightBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$rightCtn);
      ok = ok || this.rightBlock && this.rightBlock.astType === 'Identifier';

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        this.rightBlock = new clazz();
        this.rightBlock.ast = ast;
        this.$rightCtn.clearChild().addChild(this.rightBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
        this.editor.selectTool.selectBlock(this.rightBlock);
      };

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.rightBlock && this.rightBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$leftCtn, '').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });
};

SBBinaryExpression.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var leftBound = this.$leftCtn.getBoundingClientRect();
  var rightBound = this.$rightCtn.getBoundingClientRect();
  return new _SBTurtle.default().expBound(0, 0, bound.width - 1, bound.height - 1).expBound(leftBound.left - bound.left, leftBound.top - bound.top, leftBound.width, leftBound.height).expBound(rightBound.left - bound.left, rightBound.top - bound.top, rightBound.width, rightBound.height).getPath();
};

SBBinaryExpression.prototype.getOperatorSelection = function () {
  return ['+', '-', '*', '/', '%', '&&', '||', '==', '!=', '<', '>', '>=', '<='].map(op => ({
    text: op,
    op: op
  }));
};

SBBinaryExpression.prototype.removeChild = function (child) {
  if (child === this.leftBlock) {
    child.elt.selfReplace(this.addExpressionLeftBlock.elt);
  } else if (child === this.rightBlock) {
    child.elt.selfReplace(this.addExpressionRightBlock.elt);
  }
};

Object.defineProperty(SBBinaryExpression.prototype, 'ast', {
  set: function (ast) {
    if (ast.operator) {
      this._ast.operator.content = ast.operator.content;

      if (this.$op) {
        this.$op.text = ast.operator.content;
      }
    }

    var clazz;

    if (ast.left) {
      clazz = _SBClassManager.default.get(ast.left.type);
      this.leftBlock = new clazz();
      this.leftBlock.ast = ast.left;
      if (this.$leftCtn) this.$leftCtn.clearChild().addChild(this.leftBlock.elt);
    } else {
      this.leftBlock = null;
      if (this.$leftCtn) this.$leftCtn.clearChild().addChild(this.addExpressionLeftBlock.elt);
    }

    if (ast.right) {
      clazz = _SBClassManager.default.get(ast.right.type);
      this.rightBlock = new clazz();
      this.rightBlock.ast = ast.right;
      if (this.$leftCtn) this.$rightCtn.clearChild().addChild(this.rightBlock.elt);
    } else {
      this.rightBlock = null;
      if (this.$leftCtn) this.$rightCtn.clearChild().addChild(this.addExpressionRightBlock.elt);
    }
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBBinaryExpression);

var _default = SBBinaryExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBUnaryExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBUnaryExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBTokenSelection = _interopRequireDefault(require("../dom/SBTokenSelection"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SBBinaryExpression = _interopRequireDefault(require("./SBBinaryExpression"));

var _SBBase = require("./SBBase");

var _utils = require("../engine/utils");

var _utils2 = require("../dom/utils");


/***
 * @extends SBExpression
 * @constructor
 */
function SBUnaryExpression() {
  _SBExpression.default.call(this);

  this._ast = {
    type: 'UnaryExpression',
    argument: null,
    operator: {
      type: 'UnaryOperator',
      content: '+'
    }
  };
  this.addExpressionBlock = new _SBAddExpression.default();
  this.argumentBlock = null;
  Object.defineProperty(this._ast, 'argument', {
    get: () => this.argumentBlock && this.argumentBlock.ast || null
  });
}

_OOP.default.mixClass(SBUnaryExpression, _SBExpression.default);

SBUnaryExpression.prototype.astType = 'UnaryExpression';

SBUnaryExpression.prototype.render = function () {
  _SBExpression.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-unary-expression',
    child: [{
      tag: _SBTokenSelection.default,
      props: {
        text: this._ast.operator.content
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-unary-expression-argument-ctn'],
      child: [(this.argumentBlock || this.addExpressionBlock).elt]
    }]
  });
  this.$op = (0, _FCore.$)(_SBTokenSelection.default.tag, this.$elt);
  this.$argumentCtn = (0, _FCore.$)('.sb-unary-expression-argument-ctn', this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$op, {
    getMenuProps: () => {
      return {
        items: this.getOperatorSelection()
      };
    },
    onSelect: item => {
      if (item.op) {
        this._ast.operator.content = item.op;

        if (this.$op) {
          this.$op.text = item.op;
        }

        this.notifySizeChange();
        this.notifyASTChange();
      }
    }
  });

  this.argQMN = _QuickMenu.default.toggleWhenClick(this.$argumentCtn, {
    anchor: [0, 7, 3, 4, 8, 10],
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$argumentCtn);
      ok = ok || this.argumentBlock && this.argumentBlock.astType === 'Identifier';

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        extendClasses: ['sb-quick-menu'],
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        this.argumentBlock = new clazz();
        this.argumentBlock.ast = ast;
        this.$argumentCtn.clearChild().addChild(this.argumentBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
        this.editor.selectTool.selectBlock(this.argumentBlock);
      };

      if (item.astType) {
        handleAst((0, _utils.autoMigrateAst)(this.argumentBlock && this.argumentBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils2.openExpressionInputDialog)(this.$argumentCtn, '').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });
};

SBUnaryExpression.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var argBound = this.$argumentCtn.getBoundingClientRect();
  return new _SBTurtle.default().expBound(0, 0, bound.width - 1, bound.height - 1).expBound(argBound.left - bound.left, argBound.top - bound.top, argBound.width, argBound.height).getPath();
};

SBUnaryExpression.prototype.removeChild = function (child) {
  if (child === this.argumentBlock) {
    child.elt.selfReplace(this.addExpressionBlock.elt);
  }
};

SBUnaryExpression.prototype.getOperatorSelection = function () {
  return ['+', '-', '!'].map(op => ({
    text: op,
    op: op
  }));
};

Object.defineProperty(SBUnaryExpression.prototype, 'ast', {
  set: function (ast) {
    if (ast.operator) {
      this._ast.operator.content = ast.operator.content;
      if (this.$op) this.$op.text = ast.operator.content;
    }

    var clazz;

    if (ast.argument) {
      clazz = _SBClassManager.default.get(ast.argument.type);
      this.argumentBlock = new clazz();
      this.argumentBlock.ast = ast.argument;

      if (this.$argumentCtn) {
        this.$argumentCtn.clearChild().addChild(this.argumentBlock.elt);
      }
    }
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBUnaryExpression);

var _default = SBUnaryExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBIdentifier.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBIdentifier.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _SBTokenSelection = _interopRequireDefault(require("../dom/SBTokenSelection"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));


/***
 * @extends SBBase
 * @constructor
 */
function SBIdentifier() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: 'Identifier',
    name: ''
  };
}

_OOP.default.mixClass(SBIdentifier, _SBBase.default);

SBIdentifier.prototype.astType = 'Identifier';

SBIdentifier.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: ['sb-identifier'],
    child: [{
      tag: _SBTokenSelection.default,
      class: 'sb-identifier-name',
      props: {
        text: this._ast.name
      }
    }]
  });
  this.$name = (0, _FCore.$)('.sb-identifier-name', this.elt);
  if (false) _QuickMenu.default.toggleWhenClick(this.$name, {
    getMenuProps: () => {
      var variables = this.getVariables();
      var variableArr = Object.keys(variables);
      variableArr.sort((a, b) => variables[a].order - variables[b].order);
      var items = [];
      items.push({
        class: 'sb-menu-selection-title',
        child: {
          text: 'Variable'
        }
      });
      variableArr.reduce((ac, key) => {
        if (variables[key].type.type === 'class') return ac;
        ac.push({
          text: key,
          variable: variables[key]
        });
        return ac;
      }, items);
      items.push({
        class: 'sb-menu-selection-title',
        child: {
          text: 'Class'
        }
      });
      variableArr.reduce((ac, key) => {
        if (variables[key].type.type !== 'class') return ac;
        ac.push({
          text: key,
          variable: variables[key]
        });
        return ac;
      }, items);
      return {
        items: items
      };
    },
    onSelect: () => {}
  });
};

SBIdentifier.prototype.getBoundingPath = function () {
  var bound = this.bound;
  return new _SBTurtle.default().moveTo(0, 0).hLineTo(bound.width - 1).vLineTo(bound.height - 1).hLineTo(0).vLineTo(17).expKnop().closePath().getPath();
};

SBIdentifier.prototype.getExpectedType = function () {
  var variables = this.getVariables() || {};
  var name = this.ast.name;
  if (variables[name]) return variables[name].type;
  return null;
};

Object.defineProperty(SBIdentifier.prototype, 'ast', {
  set: function (ast) {
    if (this.$name) this.$name.text = (ast.name || '') + '';
    this._ast.name = (ast.name || '') + '';
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBIdentifier);

var _default = SBIdentifier;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBCallExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBCallExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = require("./SBBase");

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _utils = require("absol-acomp/js/utils");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SBIdentifier = _interopRequireDefault(require("./SBIdentifier"));

var _utils2 = require("../dom/utils");

var _utils3 = require("../engine/utils");


/***
 * @extends SBBase
 * @constructor
 */
function SBCallExpression() {
  _SBExpression.default.apply(this, arguments);

  this._ast = {
    type: this.astType
  };
  this.calleeBlock = null;
  this.addCalleeBlock = new _SBAddExpression.default({
    text: this.ADD_CALLEE_TXT
  });
  this.addArgumentExpressionBlocks = [];
  this.argumentExpressionBlocks = [];

  this._bindAst();
}

_OOP.default.mixClass(SBCallExpression, _SBExpression.default);

SBCallExpression.prototype.astType = 'CallExpression';
SBCallExpression.prototype.ADD_CALLEE_TXT = '+ Add Function';

SBCallExpression.prototype.render = function () {
  _SBExpression.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-call-expression',
    child: [{
      tag: 'button',
      class: 'sb-call-expression-option-btn',
      child: 'span.mdi.mdi-cog'
    }, {
      class: 'sb-call-expression-callee-row',
      child: [{
        tag: 'span',
        class: 'sb-inline-text'
      }, {
        class: 'sb-call-expression-callee-ctn',
        child: this.addCalleeBlock.elt
      }]
    }, {
      class: 'sb-call-expression-with-ctn',
      child: [{
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'with'
        }
      }, {
        class: 'sb-call-expression-argument-list-ctn',
        child: []
      }]
    }]
  });
  this.$calleeCtn = (0, _FCore.$)('.sb-call-expression-callee-ctn', this.$elt);
  this.$argumentListCtn = (0, _FCore.$)('.sb-call-expression-argument-list-ctn', this.$elt);
  this.$optionBtn = (0, _FCore.$)('.sb-call-expression-option-btn', this.$elt);
  this.$argumentRows = [];
  this.$argNames = [];

  this._renderArgumentRows(0);

  this._updateTextWidth();

  _QuickMenu.default.toggleWhenClick(this.$calleeCtn, {
    onClick: event => {
      var ok = false;
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$calleeCtn);
      ok = ok || this.calleeBlock && this.calleeBlock.astType === 'Identifier';
      ok = ok || (0, _EventEmitter.hitElement)(this.addCalleeBlock.elt, event);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getCalleeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        this.calleeBlock = new clazz();
        this.calleeBlock.ast = ast;
        this.$calleeCtn.clearChild().addChild(this.calleeBlock.elt);
        this.notifyASTChange();
        this.notifySizeChange();
        this.editor.selectTool.selectBlock(this.calleeBlock);
      };

      var clazz;

      if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.astType) {
        handleAst((0, _utils3.autoMigrateAst)(this.calleeBlock && this.calleeBlock.ast, {
          type: item.astType
        }));
      } else if (item.cmd === 'parse_text') {
        (0, _utils2.openExpressionInputDialog)(this.$calleeCtn, '', ast => ast.type === 'Identifier' || ast.type === 'MemberExpression').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      } else if (item.cmd === 'choose_from_package') {
        this.editor.openFunctionPickerDialog().then(ast => {
          if (ast) {
            handleAst(ast);
          }
        });
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$optionBtn, {
    getMenuProps: () => {
      var items = [{
        text: '+ Add argument',
        cmd: 'push_arg'
      }];

      if (this.argumentExpressionBlocks.length > 0) {
        items.push({
          text: '- Remove last argument',
          cmd: 'pop_arg'
        });
      }

      return {
        items: items
      };
    },
    onSelect: item => {
      switch (item.cmd) {
        case 'push_arg':
          this._renderArgumentRows(this.argumentExpressionBlocks.length + 1);

          break;

        case 'pop_arg':
          this._renderArgumentRows(this.argumentExpressionBlocks.length - 1);

          break;
      }

      this.notifySizeChange();
      this.notifyASTChange();
    }
  });
};

SBCallExpression.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var calleeBound = this.$calleeCtn.getBoundingClientRect();
  var rowBounds = this.$argumentRows.map(elt => elt.getBoundingClientRect());
  var turtle = new _SBTurtle.default().moveTo(0, 0).hLineTo(calleeBound.left - bound.left).vLineBy(8).expKnop();

  if (this.$argumentRows.length > 0) {
    turtle.vLineTo(rowBounds[0].top - bound.top);
    this.$argumentRows.forEach((rowElt, i, array) => {
      var valueBound = rowElt.$valueCtn.getBoundingClientRect();

      if (i === 0) {
        turtle.hLineTo(valueBound.left - bound.left);
      }

      turtle.vLineTo(valueBound.top + 8 - bound.top).expKnop();

      if (i + 1 === array.length) {
        turtle.vLineTo(valueBound.bottom - bound.top - 1);
      }
    });
  } else {
    turtle.vLineTo(bound.height - 1);
  }

  turtle.hLineTo(0).vLineTo(17).expKnop();
  turtle.closePath();
  return turtle.getPath();
};

SBCallExpression.prototype._bindAst = function () {
  this.elt;
  Object.defineProperty(this._ast, 'callee', {
    set: ast => {
      var clazz, block;

      if (ast) {
        clazz = _SBClassManager.default.get(ast.type);
        block = new clazz();
        block.ast = ast;
        this.calleeBlock = block;
      } else {
        this.calleeBlock = null;
        block = this.addCalleeBlock;
      }

      this.$calleeCtn.clearChild().addChild(block.elt);
    },
    get: () => this.calleeBlock && this.calleeBlock.ast || null,
    enumerable: true
  });
  Object.defineProperty(this._ast, 'arguments', {
    set: args => {
      args = args || [];

      this._renderArgumentRows(args.length);

      this.argumentExpressionBlocks = args.map(arg => {
        if (!arg) return null;

        var clazz = _SBClassManager.default.get(arg.type);

        var block = new clazz();
        block.ast = arg;
        return block;
      });
      this.argumentExpressionBlocks.forEach((blk, i) => {
        this.$argumentRows[i].$valueCtn.clearChild().addChild((this.argumentExpressionBlocks[i] || this.addArgumentExpressionBlocks[i]).elt);
      });
    },
    get: () => this.argumentExpressionBlocks.map(blk => blk && blk.ast || null),
    enumerable: true
  });
};

SBCallExpression.prototype._renderArgumentRows = function (n) {
  this.elt.attr('data-arguments-length', n + '');

  while (this.addArgumentExpressionBlocks.length < n) {
    this.addArgumentExpressionBlocks.push(new _SBAddExpression.default());
  }

  while (this.argumentExpressionBlocks.length < n) {
    this.argumentExpressionBlocks.push(null);
  }

  while (this.argumentExpressionBlocks.length > n) {
    this.argumentExpressionBlocks.pop();
  }

  var rowElt;

  while (this.$argumentRows.length < n) {
    rowElt = this._renderArgumentRow(this.$argumentRows.length);
    this.$argumentRows.push(rowElt);
    this.$argumentListCtn.addChild(rowElt);
  }

  while (this.$argumentRows.length > n) {
    rowElt = this.$argumentRows.pop();
    rowElt.remove();
  }

  this._updateTextWidth();
};

SBCallExpression.prototype._renderArgumentRow = function (i) {
  var paramName = 'args[' + i + ']';
  var rowElt = (0, _FCore._)({
    class: 'sb-call-expression-param',
    child: [{
      tag: 'span',
      class: 'sb-call-expression-param-name',
      child: {
        text: paramName
      }
    }, {
      class: 'sb-call-expression-param-value-ctn',
      child: this.addArgumentExpressionBlocks[i].elt
    }]
  });
  rowElt.$name = (0, _FCore.$)('.sb-call-expression-param-name', rowElt);
  rowElt.$valueCtn = (0, _FCore.$)('.sb-call-expression-param-value-ctn', rowElt);
  Object.defineProperty(rowElt, 'paramName', {
    set: value => {
      paramName = value || 'args[' + i + ']';
      rowElt.$name.firstChild.data = paramName;
    },
    get: () => {
      return paramName;
    }
  });

  _QuickMenu.default.toggleWhenClick(rowElt.$valueCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addArgumentExpressionBlocks[i].elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, rowElt.$valueCtn);
      ok = ok || this.argumentExpressionBlocks[i] && this.argumentExpressionBlocks[i] === 'Identifier';

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        this.argumentExpressionBlocks[i] = new clazz();
        this.argumentExpressionBlocks[i].ast = ast;
        rowElt.$valueCtn.clearChild().addChild(this.argumentExpressionBlocks[i].elt);
        this.notifySizeChange();
        this.notifyASTChange();
        this.editor.selectTool.selectBlock(this.argumentExpressionBlocks[i]);
      };

      var clazz;

      if (item.astType) {
        handleAst((0, _utils3.autoMigrateAst)(this.argumentExpressionBlocks[i] && this.argumentExpressionBlocks[i].ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils2.openExpressionInputDialog)(rowElt.$valueCtn, '').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });

  return rowElt;
};

SBCallExpression.prototype._updateTextWidth = function () {
  var texts = this.$argumentRows.map(elt => elt.$name.innerHTML);
  var width = texts.reduce((ac, text) => {
    return Math.max(ac, (0, _utils.measureText)(text, '14px arial').width + 15);
  }, 50);
  this.$elt.addStyle('--argument-text-width', width + 'px');
};

SBCallExpression.prototype.getCalleeSelection = function () {
  var variables = Object.values(this.getVariables()).map(variable => {
    return {
      text: variable.id.name,
      variable: variable
    };
  });
  variables.push('==========');
  variables.push({
    text: 'object->property',
    astType: 'MemberExpression'
  });
  variables.push({
    text: "Parse form text",
    cmd: 'parse_text',
    icon: 'span.mdi.mdi-form-textbox'
  });
  variables.unshift('=======');
  variables.unshift({
    text: "Choose from packages",
    cmd: 'choose_from_package',
    icon: 'span.mdi.mdi-file-tree'
  });
  return variables;
};

SBCallExpression.prototype.removeChild = function (child) {
  var idx;

  if (child === this.calleeBlock) {
    this.$calleeCtn.clearChild().addChild(this.addCalleeBlock.elt);
  } else {
    idx = this.argumentExpressionBlocks.indexOf(child);

    if (idx >= 0) {
      this.$argumentRows[idx].$valueCtn.clearChild().addChild(this.addArgumentExpressionBlocks[idx].elt);
      this.argumentExpressionBlocks[idx] = null;
    }
  }
};

SBCallExpression.prototype.onChildAstChange = function () {
  this._updateArgumentNames();
};

SBCallExpression.prototype._updateArgumentNames = function () {
  var calleeExpectType = null;
  if (this.calleeBlock) calleeExpectType = this.calleeBlock.getExpectedType();
  var argsDesc = calleeExpectType && calleeExpectType.args || [];
  this.$argumentRows.forEach((rowElt, i) => {
    var desc = argsDesc[i];

    if (desc) {
      rowElt.paramName = desc.name;
    } else {
      rowElt.paramName = null;
    }
  });

  this._updateTextWidth();

  this.notifySizeChange();
};

Object.defineProperty(SBCallExpression.prototype, 'ast', {
  set: function (ast) {
    this._ast.callee = ast.callee;
    this._ast.arguments = ast.arguments;
    if (this.editor) this._updateArgumentNames();else {
      setTimeout(() => this._updateArgumentNames(), 100);
    }
  },
  get: function () {
    return this._ast;
  },
  enumerable: true,
  configurable: true
});

_SBClassManager.default.add(SBCallExpression);

var _default = SBCallExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBCallExpressionStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBCallExpressionStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBCallExpression = _interopRequireDefault(require("./SBCallExpression"));

var _generator = require("absol/src/JSMaker/generator");


/***
 * @extends SBCallExpression
 * @constructor
 */
function SBCallExpressionStatement() {
  _SBCallExpression.default.apply(this, arguments);

  this._ast.type = _SBCallExpression.default.prototype.astType;
  this._statementAst = {
    type: 'ExpressionStatement',
    expression: this._ast
  };
}

_OOP.default.mixClass(SBCallExpressionStatement, _SBCallExpression.default);

SBCallExpressionStatement.prototype.astType = 'ExpressionStatement';

SBCallExpressionStatement.prototype.render = function () {
  _SBCallExpression.default.prototype.render.call(this);

  this.$elt.addClass('sb-call-expression-statement');
};

SBCallExpressionStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var calleeBound = this.$calleeCtn.getBoundingClientRect();
  var rowBounds = this.$argumentRows.map(elt => elt.getBoundingClientRect());
  var turtle = new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().hLineTo(calleeBound.left - bound.left).vLineBy(8).expKnop();

  if (this.$argumentRows.length > 0) {
    turtle.vLineTo(rowBounds[0].top - bound.top);
    this.$argumentRows.forEach((rowElt, i, array) => {
      var valueBound = rowElt.$valueCtn.getBoundingClientRect();

      if (i === 0) {
        turtle.hLineTo(valueBound.left - bound.left);
      }

      turtle.vLineTo(valueBound.top + 8 - bound.top).expKnop();

      if (i + 1 === array.length) {
        turtle.vLineTo(valueBound.bottom - bound.top - 1);
      }
    });
  } else {
    turtle.vLineTo(bound.height - 1);
  }

  turtle.hLineTo(28).statementKnop().hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).closePath();
  return turtle.getPath();
};

Object.defineProperty(SBCallExpressionStatement.prototype, 'ast', {
  set: function (ast) {
    var copyExpression;

    if (ast.expression) {
      copyExpression = (0, _generator.copyJSVariable)(ast.expression);
      this._ast.callee = copyExpression.callee;
      this._ast.arguments = copyExpression.arguments;
    }

    setTimeout(() => this._updateArgumentNames(), 100);
  },
  get: function () {
    return this._statementAst;
  }
});

_SBClassManager.default.add(SBCallExpressionStatement);

var _default = SBCallExpressionStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));


/***
 * @extends SBBase
 * @constructor
 */
function SBStatement() {
  _SBBase.default.apply(this, arguments);
}

_OOP.default.mixClass(SBStatement, _SBBase.default);

SBStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var right = bound.width - 1;
  var bottom = bound.height - 1;
  var turtle = new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().lineTo(right, 0).lineTo(right, bottom).lineTo(28, bottom).statementKnop().lineTo(8, bound.height - 1).arcBy(8, 8, 0, 0, 1, -8, -8).closePath();
  return turtle.getPath();
};

var _default = SBStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBAddStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBAddStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _FCore = require("../../core/FCore");

var _SBStatement = _interopRequireDefault(require("./SBStatement"));


/**
 * @extends SBBase
 * @constructor
 */
function SBAddStatement() {
  _SBBase.default.apply(this, arguments);
}

_OOP.default.mixClass(SBAddStatement, _SBBase.default);

SBAddStatement.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  this.$elt.addClass('sb-add-statement');
  this.$text = (0, _FCore._)({
    tag: 'span',
    child: {
      text: "+ Add Statement"
    }
  });
  this.$elt.addChild(this.$text);
};

SBAddStatement.prototype.getBoundingPath = function () {
  return _SBStatement.default.prototype.getBoundingPath.call(this);
};

var _default = SBAddStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBIfChainStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBIfChainStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _SBStatement = _interopRequireDefault(require("./SBStatement"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBAddStatement = _interopRequireDefault(require("./SBAddStatement"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _utils = require("../dom/utils");

var _Snackbar = _interopRequireDefault(require("absol-acomp/js/Snackbar"));




/***
 * @extends SBStatement
 * @constructor
 */
function SBIfChainStatement() {
  _SBStatement.default.apply(this, arguments);

  this._ast = {
    type: 'IfStatement',
    test: null,
    consequent: null,
    alternate: null
  };
  this._astByLevel = [];
  this.addTestBlocks = [new _SBAddExpression.default()];
  this.addDoStatementBlocks = [];
  this.testBlocks = [null];
  this.doBlocks = [];
  this.elseBlock = null;
  this.addElseStatementBlock = null;

  this._astBinding(this._ast, 0);

  this.render();
}

_OOP.default.mixClass(SBIfChainStatement, _SBStatement.default);

SBIfChainStatement.prototype.astType = 'IfStatement';

SBIfChainStatement.prototype._astBinding = function (ast, i) {
  while (this._astByLevel.length > i) this._astByLevel.pop();

  while (this._astByLevel.length < i) this._astByLevel.push(null);

  this._astByLevel.push(ast);

  Object.defineProperty(ast, 'test', {
    get: () => this.testBlocks[i] && this.testBlocks[i].ast || null,
    set: ast => {
      this._renderDepth(i + 1, !!this.elseBlock);

      var clazz;

      if (ast) {
        clazz = _SBClassManager.default.get(ast.type);
        this.testBlocks[i] = new clazz();
        this.testBlocks[i].ast = ast;
        this.$testes[i].$subCtn.clearChild().addChild(this.testBlocks[i].elt);
      } else {
        this.testBlocks[i] = null;
        this.$testes[i].$subCtn.clearChild().addChild(this.addTestBlocks[i].elt);
      }
    },
    enumerable: true
  });
  Object.defineProperty(ast, 'consequent', {
    set: ast => {
      this._renderDepth(i + 1, !!this.elseBlock);

      var statements = [];

      if (ast) {
        if (ast.type === 'BlockStatement') {
          statements = ast.body || [];
        } else {
          statements = [ast];
        }
      }

      this.doBlocks[i] = statements.map(subAst => {
        var clazz = _SBClassManager.default.get(subAst.type);

        var block = new clazz();
        block.ast = subAst;
        return block;
      });
      var statementElements = this.doBlocks[i].map(blk => blk.elt);
      statementElements.push(this.addDoStatementBlocks[i].elt);
      this.$does[i].$subCtn.clearChild(statementElements).addChild(statementElements);
    },
    get: () => ({
      type: 'BlockStatement',
      body: this.doBlocks[i].map(blk => blk.ast)
    }),
    enumerable: true
  });
  var elseIfAst = null;
  Object.defineProperty(ast, 'alternate', {
    set: ast => {
      if (!ast) {
        elseIfAst = null;

        this._renderDepth(i + 1, false);

        while (this._astByLevel.length > i + 1) this._astByLevel.pop();

        return;
      }

      if (ast.type === 'IfStatement') {
        elseIfAst = {
          type: 'IfStatement'
        };

        this._astBinding(elseIfAst, i + 1);

        elseIfAst.test = ast.test;
        elseIfAst.consequent = ast.consequent;
        elseIfAst.alternate = ast.alternate;
      } else {
        if (ast.type !== 'BlockStatement') {
          ast = {
            type: 'BlockStatement',
            body: [ast]
          };
        }

        this._renderDepth(i + 1, true);

        while (this._astByLevel.length > i + 1) this._astByLevel.pop();

        this.elseBlock = ast.body.map(subAst => {
          var clazz = _SBClassManager.default.get(subAst.type);

          var block = new clazz();
          block.ast = subAst;
          return block;
        });
        var statementElements = this.elseBlock.map(blk => blk.elt);
        this.$else.$subCtn.clearChild().addChild(statementElements).addChild(this.addElseStatementBlock.elt);
      }
    },
    get: () => {
      if (elseIfAst) return elseIfAst;

      if (this.elseBlock) {
        return {
          type: 'BlockStatement',
          body: this.elseBlock.map(blk => blk.ast)
        };
      }

      return null;
    },
    enumerable: true
  });
};

SBIfChainStatement.prototype._renderDepth = function (n, hasElse) {
  while (this.addDoStatementBlocks.length < n) {
    this.addDoStatementBlocks.push(this._makeAddDoStatementBlock(this.addDoStatementBlocks.length));
  }

  while (this.addTestBlocks.length < n) {
    this.addTestBlocks.push(new _SBAddExpression.default());
  }

  while (this.testBlocks.length < n) this.testBlocks.push(null);

  while (this.testBlocks.length > n) this.testBlocks.pop();

  while (this.doBlocks.length < n) this.doBlocks.push([]);

  while (this.doBlocks.length > n) this.doBlocks.pop();

  if (this.$else) this.$else.remove();
  var rowElt;

  while (this.$testes.length > n) {
    rowElt = this.$testes.pop();
    rowElt.remove();
    rowElt = this.$does.pop();
    rowElt.remove();
  }

  var i;

  while (this.$testes.length < n) {
    i = this.$testes.length;
    rowElt = this._makeTestExpressionRow(i);
    this.$testes.push(rowElt);
    this.$elt.addChild(rowElt);
    rowElt = (0, _FCore._)({
      class: 'sb-if-statement-do',
      child: [{
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'then'
        }
      }, {
        class: ['sb-block-sub-ctn'],
        child: [this.addDoStatementBlocks[i].elt]
      }]
    });
    rowElt.$subCtn = (0, _FCore.$)('.sb-block-sub-ctn', rowElt);
    this.$does.push(rowElt);
    this.$elt.addChild(rowElt);
  }

  if (hasElse) {
    if (!this.$else) {
      this.addElseStatementBlock = new _SBAddStatement.default();
      this.$else = (0, _FCore._)({
        class: 'sb-if-statement-else',
        child: [{
          tag: 'span',
          class: 'sb-inline-text',
          child: {
            text: 'else'
          }
        }, {
          class: ['sb-block-sub-ctn'],
          child: [this.addElseStatementBlock.elt]
        }]
      });
      this.$else.$subCtn = (0, _FCore.$)('.sb-block-sub-ctn', this.$else);

      _QuickMenu.default.toggleWhenClick(this.addElseStatementBlock.elt, {
        getMenuProps: () => {
          return {
            items: this.getStatementTypeSelection()
          };
        },
        onSelect: item => {
          var handleAst = ast => {
            clazz = _SBClassManager.default.get(ast.type);
            block = new clazz();
            block.ast = ast;
            this.$else.$subCtn.addChildBefore(block.elt, this.addElseStatementBlock.elt);
            this.elseBlock.push(block);
            this.notifySizeChange();
            this.notifyASTChange();
          };

          var clazz, block;

          if (item.astType) {
            handleAst({
              type: item.astType
            });
          } else if (item.cmd === 'parse_text') {
            (0, _utils.openStatementInputDialog)(this.addElseStatementBlock.elt, '', ast => ast.type !== 'BreakStatement' || this.inLoop).then(ast => {
              if (ast) handleAst(ast);
            });
          }
        }
      });
    }

    this.$else.$subCtn.clearChild().addChild(this.addElseStatementBlock.elt);
    this.elseBlock = [];
    this.$elt.addChild(this.$else);
  } else {
    if (this.$else) this.$else.remove();
    this.elseBlock = null;
  }
};

SBIfChainStatement.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: ['sb-if-statement'],
    child: [{
      tag: 'button',
      class: 'sb-if-statement-option-btn',
      child: 'span.mdi.mdi-cog'
    }]
  });
  this.$else = null;
  this.$testes = [];
  this.$does = [];

  this._renderDepth(1, false);

  this.$optionBtn = (0, _FCore.$)('.sb-if-statement-option-btn', this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$optionBtn, {
    getMenuProps: () => {
      var items = [{
        text: '+ Add else if',
        cmd: 'else_if'
      }];

      if (!this.elseBlock) {
        items.push({
          text: '+ Add else',
          cmd: 'else'
        });
      } else {
        items.push({
          text: '- Remove else',
          cmd: 'remove_else'
        });
      }

      if (this._astByLevel.length > 1) {
        items.push({
          text: '- Remove else if',
          cmd: 'remove_else_if'
        });
      }

      return {
        items: items
      };
    },
    onSelect: item => {
      var n = this._astByLevel.length;

      switch (item.cmd) {
        case 'else_if':
          this._astByLevel[n - 1].alternate = {
            type: 'IfStatement',
            consequent: null,
            alternate: null
          };
          break;

        case 'else':
          this._astByLevel[n - 1].alternate = {
            type: 'BlockStatement',
            body: []
          };
          break;

        case 'remove_else':
          this._astByLevel[n - 1].alternate = null;
          break;

        case 'remove_else_if':
          this._astByLevel[n - 2].alternate = JSON.parse(JSON.stringify(this._astByLevel[n - 1].alternate)) || null;
          break;
      }

      this.notifySizeChange();
      this.notifyASTChange();
    }
  });
};

SBIfChainStatement.prototype._makeTestExpressionRow = function (i) {
  var testBlock = this.addTestBlocks[i];
  var elt = (0, _FCore._)({
    class: i === 0 ? 'sb-if-statement-if' : 'sb-if-statement-else-if',
    child: [{
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: i === 0 ? 'if' : 'else if'
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-if-statement-test-ctn'],
      child: testBlock.elt
    }]
  });
  var subCtn = (0, _FCore.$)('.sb-if-statement-test-ctn', elt);
  elt.$subCtn = subCtn;

  _QuickMenu.default.toggleWhenClick(subCtn, {
    onClick: event => {
      if (!(0, _EventEmitter.hitElement)(testBlock.elt, event) && this.testBlocks[i].astType !== 'Identifier' && !(0, _SBBase.isBoundOfChild)(event.target, subCtn)) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        this.testBlocks[i] = new clazz();
        this.testBlocks[i].ast = ast;
        subCtn.clearChild().addChild(this.testBlocks[i].elt);
        this.notifyASTChange();
        this.notifySizeChange();
      };

      var clazz;

      if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.astType) {
        handleAst(Object.assign({
          type: item.astType
        }));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(subCtn, '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });

  return elt;
};

SBIfChainStatement.prototype._makeAddDoStatementBlock = function (i) {
  var block = new _SBAddStatement.default();

  _QuickMenu.default.toggleWhenClick(block.elt, {
    getMenuProps: () => ({
      items: this.getStatementTypeSelection()
    }),
    onSelect: item => {
      var handleAst = ast => {
        var subCtn = this.$does[i].$subCtn;

        var clazz = _SBClassManager.default.get(ast.type);

        var block = new clazz();
        block.ast = ast;
        var blocks = this.doBlocks[i];

        if (blocks.length > 0) {
          subCtn.addChildAfter(block.elt, blocks[blocks.length - 1].elt);
        } else {
          subCtn.addChildBefore(block.elt, subCtn.firstChild);
        }

        this.doBlocks[i].push(block);
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openStatementInputDialog)(block.elt, '', ast => ast.type !== 'BreakStatement' || this.inLoop).then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });

  return block;
};

SBIfChainStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var turtle = new _SBTurtle.default();
  var children = Array.prototype.slice.call(this.$elt.childNodes, 2);
  turtle.moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop();
  var expLeft;
  children.forEach(child => {
    child.$subCtn = child.$subCtn || (0, _FCore.$)('.sb-block-sub-ctn', child);
    var cBound = child.$subCtn.getBoundingClientRect();

    if (child.hasClass('sb-if-statement-if') || child.hasClass('sb-if-statement-else-if')) {
      expLeft = cBound.left - bound.left;
      turtle.hLineTo(cBound.left - bound.left).vLineBy(8).expKnop().vLineTo(cBound.bottom - bound.top);
    } else {
      if (child.hasClass('sb-if-statement-else')) {
        turtle.hLineTo(expLeft).vLineTo(cBound.top - bound.top);
      }

      turtle.hLineTo(cBound.left - bound.left + 28).statementKnop().hLineTo(cBound.left - bound.left + 8).arcBy(8, 8, 0, 0, 0, -8, 8).vLineTo(cBound.bottom - bound.top - 8).arcBy(8, 8, 0, 0, 0, 8, 8);
    }
  });
  turtle.hLineTo(expLeft);
  turtle.vLineTo(bound.height - 1).hLineTo(28).statementKnop().hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).closePath();
  return turtle.getPath();
};

SBIfChainStatement.prototype.removeChild = function (child) {
  var found = false;
  found = found || this.testBlocks.slice().some((blk, i) => {
    if (blk !== child) return false;
    this.testBlocks[i].elt.selfReplace(this.addTestBlocks[i].elt);
    this.testBlocks[i] = null;
    return true;
  });
  found = found || this.doBlocks.some(blocks => {
    var idx = blocks.indexOf(child);
    if (idx < 0) return false;
    child.elt.remove();
    blocks.splice(idx, 1);
    return true;
  });
  var idx;

  if (!found && this.elseBlock) {
    idx = this.elseBlock.indexOf(child);

    if (idx >= 0) {
      child.elt.remove();
      this.elseBlock.splice(idx, 1);
    }
  }
};

SBIfChainStatement.prototype.canMoveChild = function (child, direction) {
  var idx;
  var arr = this.doBlocks.find(blocks => {
    var idx = blocks.indexOf(child);
    return idx >= 0;
  });
  if (!arr) return false;
  idx = arr.indexOf(child);
  if (direction === "up") return idx > 0;
  if (direction === "down") return idx + 1 < arr.length;
};

SBIfChainStatement.prototype.moveChild = function (child, direction) {
  var idx;
  var arr = this.doBlocks.find(blocks => {
    var idx = blocks.indexOf(child);
    return idx >= 0;
  });
  if (!arr) return;
  idx = arr.indexOf(child);
  var ctn = child.elt.parentElement;
  var at;

  if (direction === 'up' && idx > 0) {
    at = arr[idx - 1];
    arr.splice(idx, 1);
    arr.splice(idx - 1, 0, child);
    ctn.addChildBefore(child.elt, at.elt);
  } else if (direction === 'down' && idx + 1 < arr.length) {
    at = arr[idx + 1];
    arr.splice(idx, 1);
    arr.splice(idx + 1, 0, child);
    ctn.addChildAfter(child.elt, at.elt);
  }
};

SBIfChainStatement.prototype.canAddChildBefore = function (child, bf) {
  var astType = child.astType || child.type;
  if (astType === 'BreakStatement' && !this.inLoop) return false;
  if (astType.endsWith('Statement')) return !bf || this.testBlocks.indexOf(bf) !== 0;
  if (!astType.endsWith('Expression') && astType !== 'Identifier') return false;
  var emptyTestIdx = this.testBlocks.indexOf(null);
  if (emptyTestIdx === -1) emptyTestIdx = this.testBlocks.indexOf(undefined);
  if (emptyTestIdx === -1) return false;
  var idx;

  if (bf) {
    idx = this.testBlocks.indexOf(bf);

    for (var i = 0; i < this.doBlocks.length && idx === -1; ++i) {
      if (this.doBlocks[i].indexOf(bf) >= 0) idx = i + 0.5;
    }

    if (idx === -1 && this.elseBlock && this.elseBlock.indexOf(bf) >= 0) idx = this.doBlocks.length;
    if (idx === -1) return false;
    if (emptyTestIdx < idx) return true;
  } else {
    return true;
  }

  return false;
};

SBIfChainStatement.prototype.addChildBefore = function (child, bf) {
  var astType = child.astType;
  var idx, jdx;
  var emptyTestIdx;
  var i;

  if (astType === 'Identifier' || astType.endsWith('Expression')) {
    emptyTestIdx = this.testBlocks.indexOf(null);
    if (emptyTestIdx < 0) emptyTestIdx = this.testBlocks.indexOf(undefined);

    if (emptyTestIdx === -1) {
      throw {
        child: child,
        before: bf,
        message: 'Can not find empty test to add'
      };
    }

    if (bf) {
      idx = this.testBlocks.indexOf(bf);

      for (i = 0; i < this.doBlocks.length && idx === -1; ++i) {
        if (this.doBlocks[i].indexOf(bf) >= 0) idx = i + 1;
      }

      if (emptyTestIdx < idx) {
        this.testBlocks[emptyTestIdx] = child;
        this.$testes[emptyTestIdx].$subCtn.clearChild().addChild(child.elt);
      }
    } else {
      this.testBlocks[emptyTestIdx] = child;
      this.$testes[emptyTestIdx].$subCtn.clearChild().addChild(child.elt);
    }
  } else if (astType.endsWith('Statement')) {
    idx = this.testBlocks.indexOf(bf);

    if (!bf) {
      for (i = 0; i < this.doBlocks.length; ++i) {
        if (this.doBlocks[i].length === 0) {
          this.doBlocks[i].push(child);
          this.$does[i].$subCtn.addChildBefore(child.elt, this.addDoStatementBlocks[i].elt);
          break;
        }
      }

      if (i === this.doBlocks.length) {
        if (this.elseBlock) {
          this.elseBlock.push(child);
          this.$else.$subCtn.addChildBefore(child.elt, this.addElseStatementBlock.elt);
        } else {
          this.doBlocks[0].push(child);
          this.$does[0].$subCtn.addChildBefore(child.elt, this.addDoStatementBlocks[0].elt);
        }
      }
    } else if (idx > 0) {
      this.doBlocks[idx - 1].push(child);
      this.$does[idx - 1].$subCtn.addChildBefore(child.elt, this.addDoStatementBlocks[idx - 1].elt);
    } else {
      for (i = 0; i < this.doBlocks.length && idx === -1; ++i) {
        idx = this.doBlocks[i].indexOf(bf);

        if (idx >= 0) {
          this.doBlocks[i].splice(idx, 0, child);
          this.$does[i].$subCtn.addChildBefore(child.elt, bf.elt);
        }
      }
    }
  } else {
    throw {
      child: child,
      before: bf,
      message: 'Can not add child type ' + astType
    };
  }
};

SBIfChainStatement.prototype.canAddChildAfter = function (child, at) {
  return false;
  var astType = child.astType || child.type;
  if (astType === 'BreakStatement' && !this.inLoop) return false;
  if (astType.endsWith('Statement')) return true;
  if (!astType.endsWith('Expression') && astType !== 'Identifier') return false;
  var emptyTestIdx = this.testBlocks.slice().reverse().indexOf(null);
  if (emptyTestIdx === -1) emptyTestIdx = this.testBlocks.slice().reverse().indexOf(undefined);
  var idx, i;

  if (at) {
    idx = this.testBlocks.indexOf(at);

    for (i = 0; i < this.doBlocks.length && idx === -1; ++i) {
      if (this.doBlocks[i].indexOf(at) >= 0) idx = i + 0.5;
    }

    if (idx === -1) return false;
    if (emptyTestIdx > idx) return true;
  } else return true;

  return false;
};

SBIfChainStatement.prototype.addChildAfter = function (child, at) {
  //todo
  _Snackbar.default.show("Chức năng này đang làm ....");

  return;
  var astType = child.astType;
  var emptyTestIdx;

  if (astType === 'Identifier' || astType.endsWith('Expression') || astType.endsWith('Literal')) {
    emptyTestIdx = this.testBlocks.indexOf(null);
    if (emptyTestIdx < 0) emptyTestIdx = this.testBlocks.indexOf(undefined);

    if (at) {} else {
      this.testBlocks[emptyTestIdx] = child;
      this.$testes[emptyTestIdx].$subCtn.clearChild().addChild(child.elt);
    }
  } else {}
};

Object.defineProperty(SBIfChainStatement.prototype, 'ast', {
  set: function (ast) {
    Object.assign(this._ast, ast);
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBIfChainStatement);

var _default = SBIfChainStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/dom/SBStringInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/dom/SBStringInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../../core/FCore"));



/***
 * @extends {AElement}
 * @constructor
 */
function SBStringInput() {
  this.$content = (0, _FCore.$)('.sb-string-input-content', this).on('keydown', () => {
    setTimeout(this._updateSize.bind(this), 0);
    setTimeout(this._updateSize.bind(this), 100);
  });
  this.$content.on('change', event => this.emit('change', event, this));
  /***
   * @type {string}
   * @name value
   * @memberOf SBStringInput#
   */
}

SBStringInput.tag = 'SBStringInput';

SBStringInput.render = function () {
  return (0, _FCore._)({
    extendEvent: ['updatesize', 'change'],
    class: 'sb-string-input',
    child: {
      tag: 'preinput',
      class: 'sb-string-input-content'
    }
  });
};

SBStringInput.prototype._updateSize = function () {
  var bound = this.$content.getBoundingClientRect();
  var temp, tempCt;

  if (bound.width === 0) {
    tempCt = (0, _FCore._)({
      tag: 'pre',
      class: ['as-preinput', 'sb-string-input-content'],
      style: {
        position: 'static'
      },
      child: [{
        text: this.value
      }, 'br']
    });
    temp = (0, _FCore._)({
      class: 'sb-string-input',
      style: {
        position: 'fixed',
        top: 0,
        left: 0,
        visibility: 'hidden',
        opacity: 0,
        overflow: 'visibility',
        zIndex: 100000,
        background: 'red'
      },
      child: tempCt
    }).addTo(document.body);
    bound = tempCt.getBoundingClientRect();
    temp.remove();
  }

  this.addStyle({
    width: bound.width + 'px',
    height: bound.height + 'px'
  });
  this.emit('updatesize', {
    type: 'updatesize'
  });
};

SBStringInput.property = {};
SBStringInput.property.value = {
  set: function (value) {
    this.$content.value = value;

    this._updateSize();
  },
  get: function () {
    return this.$content.value;
  }
};

_FCore.default.install(SBStringInput);

var _default = SBStringInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBStringLiteral.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBStringLiteral.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _FCore = require("../../core/FCore");

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _SBStringInput = _interopRequireDefault(require("../dom/SBStringInput"));


/***
 * @extends SBBase
 * @constructor
 */
function SBStringLiteral() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: 'StringLiteral',
    value: ""
  };
}

_OOP.default.mixClass(SBStringLiteral, _SBBase.default);

SBStringLiteral.prototype.getBoundingPath = _SBExpression.default.prototype.getBoundingPath;
SBStringLiteral.prototype.astType = 'StringLiteral';

SBStringLiteral.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-string-literal',
    child: ['span.mdi.mdi-format-quote-open.sb-inline-text', {
      tag: _SBStringInput.default,
      props: {
        value: this._ast.value
      }
    }, 'span.mdi.mdi-format-quote-close.sb-inline-text']
  });
  this.$value = (0, _FCore.$)(_SBStringInput.default.tag, this.$elt).on('change', () => {
    this._ast.value = this.$value.value;
    this.notifyASTChange();
  }).on('updatesize', () => {
    this.notifySizeChange();
  });
};

Object.defineProperty(SBStringLiteral.prototype, 'ast', {
  set: function (ast) {
    this._ast.value = typeof ast.value !== 'string' ? "" : ast.value;
    if (this.$value) this.$value.value = ast.value;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBStringLiteral);

var _default = SBStringLiteral;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBWhileStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBWhileStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../../css/clangblockly.css");

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _FCore = require("../../core/FCore");

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _SBAddStatement = _interopRequireDefault(require("./SBAddStatement"));

var _utils = require("../dom/utils");




/***
 * @extends SBBase
 * @constructor
 */
function SBWhileStatement() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: 'WhileStatement'
  };
  this.testBlock = null;
  this.doBlocks = [];
  this.addTestBlock = new _SBAddExpression.default();
  this.addStatementBlock = new _SBAddStatement.default();
  Object.defineProperty(this._ast, 'test', {
    get: () => this.testBlock && this.testBlock.ast || null,
    set: ast => {
      var clazz;

      if (ast) {
        clazz = _SBClassManager.default.get(ast.type);
        this.testBlock = new clazz();
        this.testBlock.ast = ast;
      } else {
        this.testBlock = null;
      }

      if (this.$testCtn) {
        this.$testCtn.clearChild();
        if (this.testBlock) this.$testCtn.addChild(this.testBlock.elt);
      }
    },
    enumerable: true
  });
  Object.defineProperty(this._ast, 'body', {
    enumerable: true,
    set: ast => {
      if (!ast) {
        ast = {
          type: 'BlockStatement',
          body: []
        };
      } else if (ast.type !== 'BlockStatement') {
        ast = {
          type: 'BlockStatement',
          body: [ast]
        };
      }

      this.doBlocks = ast.body.map(sAst => {
        var clazz = _SBClassManager.default.get(sAst.type);

        var block = new clazz();
        block.ast = sAst;
        return block;
      });

      if (this.$doCtn) {
        this.$doCtn.clearChild().addChild(this.doBlocks.map(blk => blk.elt)).addChild(this.addStatementBlock.elt);
      }
    },
    get: () => ({
      type: 'BlockStatement',
      body: this.doBlocks.map(blk => blk.ast)
    })
  });
}

_OOP.default.mixClass(SBWhileStatement, _SBBase.default);

SBWhileStatement.prototype.astType = 'WhileStatement';

SBWhileStatement.prototype.render = function () {
  _SBBase.default.prototype.render.call(this, arguments);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-while-statement',
    child: [{
      class: 'sb-while-statement-test',
      child: [{
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'While'
        }
      }, {
        class: 'sb-block-sub-ctn'
      }]
    }, {
      class: 'sb-while-statement-do',
      child: [{
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'do'
        }
      }, {
        class: 'sb-block-sub-ctn'
      }]
    }]
  });
  this.$testCtn = (0, _FCore.$)('.sb-while-statement-test>.sb-block-sub-ctn', this.$elt);
  this.$doCtn = (0, _FCore.$)('.sb-while-statement-do>.sb-block-sub-ctn', this.$elt);

  if (this.testBlock) {
    this.$testCtn.addChild(this.testBlock.elt);
  } else {
    this.$testCtn.addChild(this.addTestBlock.elt);
  }

  this.$doCtn.addChild(this.doBlocks.map(blk => blk.elt)).addChild(this.addStatementBlock.elt);

  _QuickMenu.default.toggleWhenClick(this.$testCtn, {
    onClick: event => {
      var ok = false;
      ok = ok || !this.testBlock;
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$testCtn);
      ok = ok || this.testBlock && this.testBlock.astType === 'Identifier';
      if (!ok) event.cancel();
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        this._ast.test = ast;
        this.notifyASTChange();
        this.notifySizeChange();
      };

      if (item.variable) {
        handleAst(item.variable.id);
      } else if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$testCtn, '').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.addStatementBlock.elt, {
    getMenuProps: () => ({
      items: this.getStatementTypeSelection()
    }),
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        var block = new clazz();

        if (this.doBlocks.length > 0) {
          this.$doCtn.addChildAfter(block.elt, this.doBlocks[this.doBlocks.length - 1].elt);
        } else {
          this.$doCtn.addChildBefore(block.elt, this.$doCtn.firstChild);
        }

        this.doBlocks.push(block);
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.addStatementBlock.elt, '').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });
};

SBWhileStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var testBound = this.$testCtn.getBoundingClientRect();
  var doBound = this.$doCtn.getBoundingClientRect();
  var turtle = new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().hLineTo(testBound.left - bound.left).vLineBy(8).expKnop().vLineTo(testBound.bottom - bound.top).hLineTo(doBound.left - bound.left + 28).statementKnop().hLineTo(doBound.left - bound.left + 8).arcBy(8, 8, 0, 0, 0, -8, 8).vLineTo(doBound.bottom - bound.top - 8).arcBy(8, 8, 0, 0, 0, 8, 8).hLineTo(bound.right - bound.left).vLineTo(bound.height - 1).hLineTo(28).statementKnop().hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).closePath();
  return turtle.getPath();
};

SBWhileStatement.prototype.removeDoChild = function (child) {
  var idx = this.doBlocks.indexOf(child);
  if (idx < 0) return;
  this.doBlocks.splice(idx, 1);
  child.elt.remove();
};

SBWhileStatement.prototype.removeChild = function (child) {
  //todo: remove test expression
  this.removeDoChild(child);
};

SBWhileStatement.prototype.canMoveChild = function (child, direction) {
  var idx = this.doBlocks.indexOf(child);
  if (idx < 0) return false;

  if (direction === 'up') {
    return idx > 0;
  } else if (direction === 'down') {
    return idx + 1 < this.doBlocks.length;
  }

  return false;
};

SBWhileStatement.prototype.moveChild = function (child, direction) {
  var idx = this.doBlocks.indexOf(child);
  var at;

  if (direction === 'up' && idx > 0) {
    at = this.doBlocks[idx - 1];
    this.doBlocks.splice(idx, 1);
    this.doBlocks.splice(idx - 1, 0, child);
    child.elt.selfRemove();
    this.$doCtn.addChildBefore(child.elt, at.elt);
  } else if (direction === 'down' && idx + 1 < this.doBlocks.length) {
    at = this.doBlocks[idx + 1];
    this.doBlocks.splice(idx, 1);
    this.doBlocks.splice(idx + 1, 0, child);
    child.elt.selfRemove();
    this.$doCtn.addChildAfter(child.elt, at.elt);
  }
};

Object.defineProperty(SBWhileStatement.prototype, 'ast', {
  set: function (ast) {
    this._ast.test = ast.test;
    this._ast.body = ast.body;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBWhileStatement);

var _default = SBWhileStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBNewExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBNewExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBCallExpression = _interopRequireDefault(require("./SBCallExpression"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));


function SBNewExpression() {
  _SBCallExpression.default.apply(this, arguments);
}

_OOP.default.mixClass(SBNewExpression, _SBCallExpression.default);

SBNewExpression.prototype.astType = 'NewExpression';

_SBClassManager.default.add(SBNewExpression);

var _default = SBNewExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/SCStaticDescriptors.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/SCStaticDescriptors.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.SCLiteralType2GlobalClassName = exports.SCGlobalDescriptor = void 0;
var GlobalProperties = {};
var SCGlobalDescriptor = {
  type: 'object',
  typeId: 'Global',
  properties: GlobalProperties
};
exports.SCGlobalDescriptor = SCGlobalDescriptor;
GlobalProperties.Date = {
  typeId: 'Date',
  type: 'class',
  args: [{
    name: 'milliseconds',
    type: 'number'
  }],
  //default
  overrides: [// []
  ],
  proto: {
    getDate: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getDay: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getFullYear: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getHours: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getMilliseconds: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getMinutes: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getMonth: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getSeconds: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getTime: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getTimezoneOffset: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },

    /*** UTC **/
    getUTCDate: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCDay: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCFullYear: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCHours: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCMilliseconds: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCMinutes: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCMonth: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCSeconds: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCTime: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    getUTCTimezoneOffset: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },

    /*** set ******/
    setDate: {
      type: 'function',
      args: [{
        name: 'date',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    setFullYear: {
      type: 'function',
      args: [{
        name: 'year',
        type: 'number'
      }, {
        name: 'month',
        type: 'number',
        optional: true
      }, {
        name: 'date',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setHours: {
      type: 'function',
      args: [{
        name: 'hours',
        type: 'number'
      }, {
        name: 'min',
        type: 'number',
        optional: true
      }, {
        name: 'sec',
        type: 'number',
        optional: true
      }, {
        name: 'ms',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setMilliseconds: {
      type: 'function',
      args: [{
        name: 'ms',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    setMinutes: {
      type: 'function',
      args: [{
        name: 'min',
        type: 'number'
      }, {
        name: 'sec',
        type: 'number',
        optional: true
      }, {
        name: 'ms',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setMonth: {
      type: 'function',
      args: [{
        name: 'month',
        type: 'number'
      }, {
        name: 'date',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setSeconds: {
      type: 'function',
      args: [{
        name: 'sec',
        type: 'number'
      }, {
        name: 'ms',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setTime: {
      type: 'function',
      args: [{
        name: 'time',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },

    /*** utc ****/
    setUTCDate: {
      type: 'function',
      args: [{
        name: 'date',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    setUTCFullYear: {
      type: 'function',
      args: [{
        name: 'year',
        type: 'number'
      }, {
        name: 'month',
        type: 'number',
        optional: true
      }, {
        name: 'date',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setUTCHours: {
      type: 'function',
      args: [{
        name: 'hours',
        type: 'number'
      }, {
        name: 'min',
        type: 'number',
        optional: true
      }, {
        name: 'sec',
        type: 'number',
        optional: true
      }, {
        name: 'ms',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setUTCMilliseconds: {
      type: 'function',
      args: [{
        name: 'ms',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    setUTCMinutes: {
      type: 'function',
      args: [{
        name: 'min',
        type: 'number'
      }, {
        name: 'sec',
        type: 'number',
        optional: true
      }, {
        name: 'ms',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setUTCMonth: {
      type: 'function',
      args: [{
        name: 'month',
        type: 'number'
      }, {
        name: 'date',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setUTCSeconds: {
      type: 'function',
      args: [{
        name: 'sec',
        type: 'number'
      }, {
        name: 'ms',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'number'
      }
    },
    setUTCTime: {
      type: 'function',
      args: [{
        name: 'time',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    toString: {
      type: 'function',
      args: []
    }
  }
};
GlobalProperties.Math = {
  typeId: 'Math',
  type: 'object',
  properties: {
    E: {
      type: 'number'
    },
    LN2: {
      type: 'number'
    },
    LN10: {
      type: 'number'
    },
    LOG2E: {
      type: 'number'
    },
    LOG10E: {
      type: 'number'
    },
    PI: {
      type: 'number'
    },
    SQRT1_2: {
      type: 'number'
    },
    SQRT2: {
      type: 'number'
    },
    abs: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    acos: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    asin: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    atan: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    atan2: {
      type: 'function',
      args: [{
        name: 'y',
        type: 'number'
      }, {
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    ceil: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    cos: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    exp: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    floor: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    log: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    min: {
      type: 'function',
      args: [{
        name: '...args',
        type: 'number[]'
      }],
      returns: {
        type: 'number'
      }
    },
    max: {
      type: 'function',
      args: [{
        name: '...args',
        type: 'number[]'
      }],
      returns: {
        type: 'number'
      }
    },
    pow: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }, {
        name: 'y',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    random: {
      type: 'function',
      args: [],
      returns: {
        type: 'number'
      }
    },
    round: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    sin: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    sqrt: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    tan: {
      type: 'function',
      args: [{
        name: 'x',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    }
  }
};
GlobalProperties.Number = {
  typeId: 'Number',
  type: 'class',
  proto: {
    toFixed: {
      type: 'function',
      args: [{
        name: 'fractionDigits',
        type: 'number'
      }],
      returns: {
        type: 'string'
      }
    },
    toString: {
      type: 'function',
      args: []
    }
  }
};
GlobalProperties.Object = {
  typeId: 'Object',
  type: 'class',
  proto: {
    toString: {
      type: 'function',
      args: []
    }
  }
};
GlobalProperties.Array = {
  typeId: 'Array',
  type: 'class',
  proto: {
    length: {
      type: 'number'
    },
    pop: {
      type: 'function',
      args: [],
      returns: {
        type: 'any'
      }
    },
    shift: {
      type: 'function',
      args: [],
      returns: {
        type: 'any'
      }
    },
    push: {
      type: 'function',
      args: [{
        name: '...items',
        type: 'array',
        of: 'any'
      }],
      returns: {
        type: 'number'
      }
    },
    unshift: {
      type: 'function',
      args: [{
        name: '...items',
        type: 'array',
        of: 'any'
      }],
      returns: {
        type: 'number'
      }
    },
    concat: {
      type: 'function',
      args: [{
        name: 'items',
        type: 'array',
        of: 'any'
      } //todo:  overloading
      ],
      returns: {
        type: 'array',
        of: 'any'
      }
    },
    join: {
      type: 'function',
      args: [{
        name: 'separator',
        type: 'string',
        optional: true
      }],
      returns: {
        type: 'string'
      }
    },
    reverse: {
      type: 'function',
      args: [],
      returns: {
        type: 'array',
        of: 'any'
      }
    },
    slice: {
      type: 'function',
      args: [{
        name: 'start',
        type: 'number',
        optional: true
      }, {
        name: 'end',
        type: 'number',
        optional: true
      }],
      returns: {
        type: 'array',
        of: 'any'
      }
    },
    sort: {
      type: 'function',
      args: [{
        name: 'compareFn',
        optional: true,
        type: 'function',
        args: [{
          name: 'a',
          type: 'any'
        }, {
          name: 'b',
          type: 'any'
        }]
      }],
      returns: 'this'
    },
    splice: {
      type: 'function',
      args: [{
        name: 'start',
        type: 'number',
        optional: true
      }, {
        name: 'end',
        type: 'number',
        optional: true
      }, {
        name: '...addItems',
        type: 'array',
        of: 'any'
      }],
      returns: {
        type: 'array',
        of: 'any'
      }
    },
    indexOf: {
      type: 'function',
      args: [{
        name: 'searchElement',
        type: 'any'
      }, {
        name: 'fromIndex',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    lastIndexOf: {
      type: 'function',
      args: [{
        name: 'searchElement',
        type: 'any'
      }, {
        name: 'fromIndex',
        type: 'number'
      }],
      returns: {
        type: 'number'
      }
    },
    every: {
      type: 'function',
      args: [{
        name: 'predicate',
        type: 'function',
        args: [{
          name: 'value',
          type: 'any'
        }, {
          name: 'index',
          type: 'number'
        }, {
          name: 'array',
          type: 'array',
          of: 'any'
        }]
      }],
      returns: {
        type: 'boolean'
      }
    },
    some: {
      type: 'function',
      args: [{
        name: 'predicate',
        type: 'function',
        args: [{
          name: 'value',
          type: 'any'
        }, {
          name: 'index',
          type: 'number'
        }, {
          name: 'array',
          type: 'array',
          of: 'any'
        }],
        returns: {
          type: 'boolean'
        }
      }],
      returns: {
        type: 'boolean'
      }
    },
    forEach: {
      type: 'function',
      args: [{
        name: 'callbackfn',
        type: 'function',
        args: [{
          name: 'value',
          type: 'any'
        }, {
          name: 'index',
          type: 'number'
        }, {
          name: 'array',
          type: 'array',
          of: 'any'
        }]
      }]
    },
    map: {
      type: 'function',
      args: [{
        name: 'callbackfn',
        type: 'function',
        args: [{
          name: 'value',
          type: 'any'
        }, {
          name: 'index',
          type: 'number'
        }, {
          name: 'array',
          type: 'array',
          of: 'any'
        }],
        returns: {
          type: 'any'
        }
      }]
    },
    filter: {
      type: 'function',
      args: [{
        name: 'predicate',
        type: 'function',
        args: [{
          name: 'value',
          type: 'any'
        }, {
          name: 'index',
          type: 'number'
        }, {
          name: 'array',
          type: 'array',
          of: 'any'
        }],
        returns: {
          type: 'boolean'
        }
      }],
      returns: {
        type: 'boolean'
      }
    },
    reduce: {
      type: 'function',
      args: [{
        name: 'callbackfn',
        type: 'function',
        args: [{
          name: 'previousValue',
          type: 'any'
        }, {
          name: 'value',
          type: 'any'
        }, {
          name: 'index',
          type: 'number'
        }, {
          name: 'array',
          type: 'array',
          of: 'any'
        }],
        returns: {
          type: 'any'
        }
      }, {
        name: 'initValue',
        type: 'any',
        optional: true
      }],
      returns: {
        type: 'any'
      }
    },
    reduceRight: {
      type: 'function',
      args: [{
        name: 'callbackfn',
        type: 'function',
        args: [{
          name: 'previousValue',
          type: 'any'
        }, {
          name: 'value',
          type: 'any'
        }, {
          name: 'index',
          type: 'number'
        }, {
          name: 'array',
          type: 'array',
          of: 'any'
        }],
        returns: {
          type: 'any'
        }
      }, {
        name: 'initValue',
        type: 'any',
        optional: true
      }],
      returns: {
        type: 'any'
      }
    }
  }
};
GlobalProperties.Boolean = {
  typeId: 'Boolean',
  type: 'class',
  proto: {
    toString: {
      type: 'function',
      args: [],
      returns: {
        type: 'string'
      }
    }
  }
};
var SCLiteralType2GlobalClassName = {
  number: 'Number',
  array: 'Array',
  string: 'String',
  object: 'Object',
  boolean: 'Boolean',
  datetime: 'Date',
  date: 'Date',
  enum: 'Number'
};
exports.SCLiteralType2GlobalClassName = SCLiteralType2GlobalClassName;
Object.keys(SCLiteralType2GlobalClassName).forEach(key => {
  GlobalProperties[key] = {
    type: SCLiteralType2GlobalClassName[key],
    typeId: key
  };
});
};

moduleFactories["node_modules/absol-form/js/sclang/editor/SCTypeManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/SCTypeManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _generator = require("absol/src/JSMaker/generator");

var _SCStaticDescriptors = require("./SCStaticDescriptors");

var _utils = require("absol-acomp/js/utils");

var _stringUtils = require("absol/src/String/stringUtils");

function TypeManager() {
  this.typeDescriptors = {};
  this.addTypeDescriptors(_SCStaticDescriptors.SCGlobalDescriptor);
}

TypeManager.prototype.addTypeDescriptors = function (descriptors) {
  var typeDescriptors = this.typeDescriptors;

  var cleanUpObj = data => {
    Object.keys(data).forEach(key => {
      if (data[key] === undefined || data[key] === null) delete data[key];
    });
    return data;
  };

  var visitors = {
    function: data => {
      var desc = Object.assign({}, data, {
        args: data.args.map(arg => accept('*', arg)),
        returns: accept('*', data.returns)
      });
      return declareNewType(desc);
    },
    class: data => {
      var res = Object.assign({}, data, {
        proto: accept('dict', data.proto)
      });
      return declareNewType(res);
    },
    struct: data => {
      var res = Object.assign({}, data, {
        type: 'object',
        properties: accept(data.properties instanceof Array ? 'list' : 'dict', data.properties)
      });
      return declareNewType(res);
    },
    object: data => {
      var res = Object.assign({}, data, {
        properties: accept(data.properties instanceof Array ? 'list' : 'dict', data.properties)
      });
      return declareNewType(res);
    },
    dict: data => {
      return Object.keys(data).reduce((ac, key) => {
        ac[key] = accept('*', data[key]);
        return ac;
      }, {});
    },
    string: data => {
      if (typeof data.typeId === 'string' || typeof data.typeId === "number") {
        var res = Object.assign(data);
        return declareNewType(res);
      } else return data;
    },
    list: data => {
      return data.map(it => accept('*', it));
    },
    '*': data => {
      if (!data) return data;
      if (data instanceof Array) return accept('list', data);
      if (data.type && visitors[data.type]) return accept(data.type, data);

      if (data.type && (typeof data.type === 'number' || typeof data.type === "string")) {
        if (data.typeId) return declareNewType(data);
        return data;
      }

      if (typeof data === "object") {
        return accept('dict', data);
      }

      return data;
    }
  };

  var declareNewType = data => {
    cleanUpObj(data);
    var name = data.name;
    delete data.name;

    if (!data.typeId) {
      data.typeId = (0, _utils.keyStringOf)(data);
      data.typeId = (0, _stringUtils.stringHashCode)(data.typeId) + '' + (0, _stringUtils.stringHashCode)(data.typeId.split('').reverse().join(''));

      if (!typeDescriptors[data.typeId]) {
        typeDescriptors[data.typeId] = data;
      }
    } else {
      typeDescriptors[data.typeId] = data;
    }

    var res = {
      type: data.typeId
    };
    if (name) res.name = name;
    return res;
  };

  var accept = (rule, data) => {
    return visitors[rule](data);
  };

  accept('*', descriptors);
  return this;
};

TypeManager.prototype.getTypeDescriptor = function (id) {
  var descriptors = this.typeDescriptors;
  var descriptor = descriptors[id];
  if (!descriptor) return null;
  return Object.assign({
    typeId: id
  }, descriptor);
};

TypeManager.prototype.detectTypeDescriptorOf = function (o) {
  var tO;

  if (!o) {
    return null;
  }

  var result = null;
  tO = typeof o;

  if (tO === "string" || tO === 'number') {
    if (this.typeDescriptors[o]) {
      result = (0, _generator.copyJSVariable)(this.typeDescriptors[o]);
      result.typeId = o;

      if (_SCStaticDescriptors.SCLiteralType2GlobalClassName[result.superType]) {
        result.className = _SCStaticDescriptors.SCLiteralType2GlobalClassName[result.superType];
        Object.assign(result, (0, _generator.copyJSVariable)(this.typeDescriptors[_SCStaticDescriptors.SCLiteralType2GlobalClassName[result.superType]]));
      }
    } else if (this.typeDescriptors[o]) {
      result = (0, _generator.copyJSVariable)(this.typeDescriptors[o]);

      if (this.typeDescriptors[o].type === 'class') {
        result.className = o;
      } else {
        result.varariableName = o;
      }
    }
  } else if (typeof o === 'object') {
    if (o.type === 'GenericType' && o.id) {
      result = this.detectTypeDescriptorOf(o.id.name);
    } else if (o.type === 'object') {
      result = o;
    }
  }

  return result;
};
/***
 * @returns {TypeManager}
 */


TypeManager.prototype.clone = function () {
  var newInstance = new TypeManager();
  this.addTypeDescriptors(this.typeDescriptors);
  return newInstance;
};

var SCTypeManager = new TypeManager();
var _default = SCTypeManager;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBMemberChainExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBMemberChainExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _SBIdentifierInput = require("../dom/SBIdentifierInput");

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _generator = require("absol/src/JSMaker/generator");

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SBIdentifier = _interopRequireDefault(require("./SBIdentifier"));

var _SBTokenSelection = _interopRequireDefault(require("../dom/SBTokenSelection"));

var _SBBase = require("./SBBase");

var _SCTypeManager = _interopRequireDefault(require("../editor/SCTypeManager"));

var _utils = require("../engine/utils");

var _utils2 = require("../dom/utils");

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");


function PropertyHolder(block, ast, computed) {
  this._ast = ast;
  this.block = block;
  this.computed = computed;
  this.$elt = (0, _FCore._)({
    class: 'sb-member-chain-expression-property-ctn',
    child: {
      text: 'property'
    }
  });
  this.addExpressionBlock = new _SBAddExpression.default();
  this.expressionBlock = null;
  var clazz;

  if (ast) {
    clazz = _SBClassManager.default.get(ast.type);
    this.expressionBlock = new clazz();
    this.expressionBlock.ast = ast;
  }

  this.render();
}

PropertyHolder.prototype.genBoundingPath = function (turtle) {
  if (!this.computed) return;
  var subBound = this.$subCtn.getBoundingClientRect();
  var bound = this.block.bound;
  turtle.moveTo(subBound.left - bound.left, subBound.top - bound.top).hLineBy(subBound.width).vLineBy(subBound.height).hLineBy(-subBound.width).vLineBy(-subBound.height + 17).expKnop().closePath();
};

PropertyHolder.prototype.render = function () {
  this.$elt.clearChild();

  if (this.computed) {
    this.$elt.addClass('sb-computed');
    this.$subCtn = (0, _FCore._)({
      class: 'sb-block-sub-ctn',
      child: this.expressionBlock ? this.expressionBlock.elt : this.addExpressionBlock.elt
    });
    this.$elt.addChild(this.$subCtn);

    _QuickMenu.default.toggleWhenClick(this.$elt, {
      onClick: event => {
        var ok = false;
        ok = ok || this.expressionBlock && this.expressionBlock.astType === 'Identifier';
        ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$subCtn);
        ok = ok || (0, _EventEmitter.hitElement)(this.addExpressionBlock.elt, event);
        if (!ok) event.cancel();
      },
      getMenuProps: () => {
        return {
          items: this.block.getExpressionTypeSelection()
        };
      },
      onSelect: item => {
        var handleAst = ast => {
          var clazz = _SBClassManager.default.get(ast.type);

          this.expressionBlock = new clazz();
          this.$subCtn.clearChild().addChild(this.expressionBlock.elt);
          this.expressionBlock.ast = ast;
          this.block.editor.selectTool.selectBlock(this.expressionBlock);
          this.block.notifyASTChange();
          this.block.notifySizeChange();
          this.block.editor.selectTool.selectBlock(this.expressionBlock);
        };

        if (item.variable) {
          handleAst(Object.assign({
            type: 'Identifier'
          }, item.variable.id));
        } else if (item.astType) {
          handleAst((0, _utils.autoMigrateAst)(this.expressionBlock && this.expressionBlock.ast, {
            type: item.astType
          }));
        } else if (item.cmd === 'parse_text') {
          (0, _utils2.openExpressionInputDialog)(this.$subCtn, this.expressionBlock ? (0, _SCCodeGenerator.generateSCCode)(this.expressionBlock.ast) : '').then(ast => {
            if (ast) handleAst(ast);
          });
        }
      }
    });
  } else {
    this.$elt.removeClass('sb-computed');
    this.$elt.addChild((0, _FCore._)('span.mdi.mdi-chevron-right'));
    this.$identSelection = (0, _FCore._)({
      tag: _SBTokenSelection.default
    });

    if (this._ast) {
      this.$identSelection.text = this._ast.name;
      this.$identSelection.displayText = this._ast.displayName;
    }

    this.$elt.addChild(this.$identSelection);

    _QuickMenu.default.toggleWhenClick(this.$identSelection, {
      getMenuProps: () => {
        var items = [];
        var pItems = [];
        var methodItems = [];
        var holders = this.block.holders;
        var holderIdx = holders.indexOf(this);
        var objectType = holders[holderIdx - 1].getExpectedType();
        var objectTypeDesc = this.block.editor.typeMng.detectTypeDescriptorOf(objectType);
        var keys;

        if (objectTypeDesc) {
          if (objectTypeDesc.type === 'class' && objectTypeDesc.proto) {
            keys = Object.keys(objectTypeDesc.proto);
            keys.sort();
            keys.reduce((items, key) => {
              var it = objectTypeDesc.proto[key];

              if (it.type === 'function') {
                methodItems.push({
                  text: key,
                  pType: it,
                  ident: {
                    name: key
                  }
                });
              } else {
                pItems.push({
                  text: key,
                  pType: it,
                  ident: {
                    name: key
                  }
                });
              }
            }, items);
          } else if (objectTypeDesc.type === 'object' && objectTypeDesc.properties) {
            if (objectTypeDesc.properties instanceof Array) {
              pItems = objectTypeDesc.properties.map(it => ({
                text: it.displayName || it.name,
                ident: {
                  name: it.name,
                  displayName: it.displayName
                },
                pType: it
              }));
            } else {
              pItems = Object.keys(objectTypeDesc.properties).map(key => {
                var it = objectTypeDesc.properties[key];
                return {
                  text: it.displayName || it.name || key,
                  ident: {
                    name: it.name || key,
                    displayName: it.displayName
                  },
                  pType: it
                };
              });
            }
          }
        }

        if (pItems.length > 0) {
          pItems.unshift({
            class: 'sb-menu-selection-title',
            child: {
              text: 'properties'
            }
          });
          items = items.concat(pItems);
        }

        if (methodItems.length > 0) {
          methodItems.unshift({
            class: 'sb-menu-selection-title',
            child: {
              text: 'methods'
            }
          });
          items = items.concat(methodItems);
        }

        items.push({
          text: "*",
          cmd: 'input'
        });
        return {
          items: items
        };
      },
      onSelect: item => {
        if (item.cmd === 'input') {
          (0, _SBIdentifierInput.openIdentifierInputDialog)(this.$elt, this.$identSelection.text).then(value => {
            if (value !== this.$identSelection.text) {
              this.$identSelection.text = value;
              this.block.notifySizeChange();
              this.block.notifyASTChange();
            }
          });
        } else if (item.ident) {
          this.$identSelection.text = item.ident.name;
          this.$identSelection.displayText = item.ident.displayName;
          this.block.notifySizeChange();
          this.block.notifyASTChange();
        }
      }
    });
  }
};

PropertyHolder.prototype.getExpectedType = function () {
  if (this.computed) return null;
  var ast = this.ast;
  if (!ast || ast.type !== 'Identifier' || !ast.name) return null;
  var holders = this.block.holders;
  var holderIdx = holders.indexOf(this);
  var prevType = holders[holderIdx - 1] && holders[holderIdx - 1].getExpectedType();
  var prevTypeDesc = this.block.editor.typeMng.detectTypeDescriptorOf(prevType);
  if (!prevType || !prevTypeDesc) return null;
  var currentProperty;

  if (prevTypeDesc.type === 'class') {
    currentProperty = prevTypeDesc.proto[ast.name] || null;
  } else if (prevTypeDesc.type === 'object') {
    if (prevTypeDesc.properties instanceof Array) currentProperty = prevTypeDesc.properties.find(p => p.name === ast.name);else currentProperty = prevTypeDesc.properties[ast.name] || null;
  }

  if (currentProperty) return currentProperty.type;
  return null;
};

Object.defineProperty(PropertyHolder.prototype, 'ast', {
  get: function () {
    var res = null;

    if (this.computed) {
      if (this.expressionBlock) {
        res = this.expressionBlock.ast;
      }
    } else {
      if (this.$identSelection.text.length > 0) {
        res = {
          type: 'Identifier',
          name: this.$identSelection.text
        };

        if (this.$identSelection.displayText) {
          res.displayName = this.$identSelection.displayText;
        }
      }
    }

    return res;
  }
});

function ObjectHolder(block, ast) {
  this._ast = ast;
  this.block = block;
  this.$elt = (0, _FCore._)({
    class: 'sb-member-chain-expression-object-ctn',
    child: {
      class: 'sb-sub-ctn'
    }
  });
  this.$subCtn = (0, _FCore.$)('.sb-sub-ctn', this.$elt);
  this.addExpressionBlock = new _SBAddExpression.default();
  this.expressionBlock = null;
  var clazz;

  if (ast) {
    clazz = _SBClassManager.default.get(ast.type);
    this.expressionBlock = new clazz();
    this.expressionBlock.ast = ast;
  }

  this.render();

  _QuickMenu.default.toggleWhenClick(this.$elt, {
    onClick: event => {
      var ok = false;
      ok = ok || this.expressionBlock && this.expressionBlock.astType === 'Identifier';
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$subCtn);
      ok = ok || (0, _EventEmitter.hitElement)(this.addExpressionBlock.elt, event);
      if (!ok) event.cancel();
    },
    getMenuProps: () => {
      return {
        items: this.block.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        this.expressionBlock = new clazz();
        this.$subCtn.clearChild().addChild(this.expressionBlock.elt);
        this.expressionBlock.ast = ast;
        this.block.notifyASTChange();
        this.block.notifySizeChange();
        this.block.editor.selectTool.selectBlock(this.expressionBlock);
      };

      if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.astType) {
        handleAst((0, _utils.autoMigrateAst)(this.expressionBlock && this.expressionBlock.ast, {
          type: item.astType
        }));
      } else {
        (0, _utils2.openExpressionInputDialog)(this.$subCtn, this.expressionBlock ? (0, _SCCodeGenerator.generateSCCode)(this.expressionBlock.ast) : '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });
}
/***
 *
 * @param {SBTurtle} turtle
 */


ObjectHolder.prototype.genBoundingPath = function (turtle) {
  var subBound = this.$subCtn.getBoundingClientRect();
  var bound = this.block.bound;
  turtle.moveTo(subBound.left - bound.left, subBound.top - bound.top).hLineBy(subBound.width).vLineBy(subBound.height).hLineBy(-subBound.width).vLineBy(-subBound.height + 17).expKnop().closePath();
};

ObjectHolder.prototype.render = function () {
  this.$subCtn.clearChild();

  if (this.expressionBlock) {
    this.$subCtn.addChild(this.expressionBlock.elt);
  } else {
    this.$subCtn.addChild(this.addExpressionBlock.elt);
  }
};

ObjectHolder.prototype.getExpectedType = function () {
  var res = null;

  if (this.expressionBlock) {
    res = this.expressionBlock.getExpectedType();

    if (!res && this.expressionBlock.astType === 'Identifier') {
      if (_SCTypeManager.default.detectTypeDescriptorOf(this.expressionBlock.ast.name)) res = this.expressionBlock.ast.name;
    }
  }

  return res;
};

Object.defineProperty(ObjectHolder.prototype, 'ast', {
  get: function () {
    if (this.expressionBlock) return this.expressionBlock.ast;
    return null;
  }
});
/***
 * @extends SBExpression
 * @constructor
 */

function SBMemberChainExpression() {
  _SBExpression.default.apply(this, arguments);

  this._ast = {
    type: 'MemberExpression'
  };
  /***
   *
   * @type {Array<ObjectHolder|PropertyHolder>}
   * @private
   */

  this.holders = [new ObjectHolder(this, null), new PropertyHolder(this, null, false)];
  Object.defineProperties(this._ast, {
    computed: {
      get: () => this.holders[this.holders.length - 1].computed,
      enumerable: true
    },
    object: {
      enumerable: true,
      get: () => this.holders.slice(0, this.holders.length - 1).reduce((ac, holder, i, arr) => {
        if (ac === 'init') return holder.ast;
        return {
          type: 'MemberExpression',
          computed: holder.computed,
          object: ac,
          property: holder.ast
        };
      }, 'init')
    },
    property: {
      enumerable: true,
      get: () => this.holders[this.holders.length - 1].ast
    }
  });
}

_OOP.default.mixClass(SBMemberChainExpression, _SBExpression.default);

SBMemberChainExpression.prototype.astType = 'MemberExpression';

SBMemberChainExpression.prototype._applyAst = function (ast) {
  var elt = this.elt;
  this.holders.forEach(holder => holder.$elt.remove());

  var makeChain = (node, arr) => {
    arr = arr || [];
    arr.unshift();
    arr.unshift(new PropertyHolder(this, node.property, node.computed));

    if (node.object && node.object.type === 'MemberExpression') {
      makeChain(node.object, arr);
    } else {
      arr.unshift(new ObjectHolder(this, node.object));
    }

    return arr;
  };

  this.holders = makeChain(ast);
  this.holders.forEach(holder => elt.addChild(holder.$elt));
};

SBMemberChainExpression.prototype.render = function () {
  _SBExpression.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-member-chain-expression',
    child: [{
      tag: 'button',
      class: 'sb-member-chain-expression-option-btn',
      child: 'span.mdi.mdi-cog'
    }, this.holders[0].$elt, this.holders[1].$elt]
  });
  this.$optionBtn = (0, _FCore.$)('.sb-member-chain-expression-option-btn', this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$optionBtn, {
    getMenuProps: () => {
      var items = [{
        text: '+ Add Expression',
        cmd: 'add_expression'
      }, {
        text: '+ Add Identifier',
        cmd: 'add_ident'
      }];
      if (this.holders.length > 2) items.push({
        text: '- Remove last',
        cmd: 'pop'
      });
      if (this.holders[this.holders.length - 1].computed) items.unshift({
        text: '*  Change to  identifier',
        cmd: 'to_ident'
      });else items.unshift({
        text: '*  Change to  expression',
        cmd: 'to_expression'
      });
      return {
        items: items
      };
    },
    onSelect: item => {
      var holder;

      switch (item.cmd) {
        case 'add_expression':
          holder = new PropertyHolder(this, null, true);
          this.$elt.addChild(holder.$elt);
          this.holders.push(holder);
          break;

        case 'add_ident':
          holder = new PropertyHolder(this, null, false);
          this.$elt.addChild(holder.$elt);
          this.holders.push(holder);
          break;

        case 'pop':
          holder = this.holders.pop();
          holder.$elt.remove();
          break;

        case 'to_ident':
          holder = this.holders.pop();
          holder.$elt.remove();
          holder = new PropertyHolder(this, null, false);
          this.$elt.addChild(holder.$elt);
          this.holders.push(holder);
          break;

        case 'to_expression':
          holder = this.holders.pop();
          holder.$elt.remove();
          holder = new PropertyHolder(this, null, true);
          this.$elt.addChild(holder.$elt);
          this.holders.push(holder);
          break;
      }

      this.notifySizeChange();
      this.notifyASTChange();
    }
  });
};

SBMemberChainExpression.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var right = bound.width - 1;
  var bottom = bound.height - 1;
  var turtle = new _SBTurtle.default().moveTo(0, 0).hLineTo(right).vLineTo(bottom).hLineTo(0).vLineTo(17).expKnop().closePath();
  this.holders.forEach(holder => holder.genBoundingPath(turtle));
  return turtle.getPath();
};

SBMemberChainExpression.prototype.getExpectedType = function () {
  if (!this.editor) return null;
  var holders = this.holders;
  if (holders[holders.length - 1]) return holders[holders.length - 1].getExpectedType();
  return null;
};

SBMemberChainExpression.prototype.removeChild = function (child) {
  this.holders.forEach(holder => {
    if (holder.expressionBlock === child) {
      holder.expressionBlock = null;
      holder.render();
    }
  });
};

Object.defineProperty(SBMemberChainExpression.prototype, 'ast', {
  set: function (ast) {
    ast = (0, _generator.copyJSVariable)(ast);

    this._applyAst(ast); // setTimeout(() => {
    //     console.log('exp', this.getExpectedType())
    // }, 1000)

  },
  get: function () {
    return this._ast;
  },
  enumerable: true
});

_SBClassManager.default.add(SBMemberChainExpression);

var _default = SBMemberChainExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBArgumentDeclaration.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBArgumentDeclaration.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBStatement = _interopRequireDefault(require("./SBStatement"));

var _FCore = require("../../core/FCore");

var _SBIdentifierInput = _interopRequireDefault(require("../dom/SBIdentifierInput"));

var _SBTokenSelection = _interopRequireDefault(require("../dom/SBTokenSelection"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _SCParser = _interopRequireDefault(require("absol/src/SCLang/SCParser"));

var _utils = require("../dom/utils");

var _generator = require("absol/src/JSMaker/generator");


/***
 * @extends SBStatement
 * @constructor
 */
function SBArgumentDeclaration() {
  _SBStatement.default.apply(this, arguments);

  this._ast = {
    type: 'ArgumentDeclaration'
  };
  this.$name = (0, _FCore._)({
    tag: _SBIdentifierInput.default,
    props: {// value: this._ast.id.name
    }
  });
  this.$type = (0, _FCore._)({
    tag: _SBTokenSelection.default,
    props: {
      text: 'any' // text: type2text(this._ast.typeAnnotation.typeAnnotation)

    }
  });
  this.$of = (0, _FCore._)({
    tag: _SBTokenSelection.default,
    class: 'sb-argument-declaration-of',
    props: {// text: type2text(this._ast.typeAnnotation.typeAnnotation)
    }
  });
  this.$domSignal = (0, _FCore._)('attachhook');
  this.domSignal = new _DomSignal.default(this.$domSignal).on('update', this.updateTypeDisplayName.bind(this));

  this._astBinding();

  setTimeout(() => {
    console.log(this, this.ast);
  }, 100);
}

_OOP.default.mixClass(SBArgumentDeclaration, _SBStatement.default);

SBArgumentDeclaration.prototype.astType = 'ArgumentDeclaration';

SBArgumentDeclaration.prototype.render = function () {
  _SBStatement.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-argument-declaration',
    child: [this.$name, {
      tag: 'span',
      class: ['sb-inline-text'],
      child: {
        text: ' : '
      }
    }, this.$type, {
      tag: 'span',
      class: ['sb-inline-text', 'sb-argument-declaration-of-text'],
      child: {
        text: ' of '
      }
    }, this.$of, this.$domSignal]
  });
  this.$id = (0, _FCore.$)(_SBIdentifierInput.default.tag, this.$elt);
  this.$id.on('change', () => {
    this._ast.id.name = this.$id.identifierText;
    this.notifyASTChange();
  }).on('keyup', () => {
    this._ast.id.name = this.$id.identifierText;
  });
  this.$type = (0, _FCore.$)(_SBTokenSelection.default.tag, this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$type, {
    getMenuProps: () => {
      return {
        items: this.getTypeItemSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var typeAnnotation = {
          type: 'TypeAnnotation',
          typeAnnotation: ast
        };

        if (item.value === 'Array') {
          typeAnnotation.typeAnnotation.typeParameters = [{
            type: 'GenericType',
            id: {
              type: 'Identifier',
              name: 'any'
            }
          }];
        }

        this._ast.typeAnnotation = typeAnnotation;
        this.domSignal.emit('update');
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.cmd === 'chose_type') {
        this.editor.typeSelectionDialog.openForResult((0, _utils.type2text)(this._ast.typeAnnotation.typeAnnotation)).then(result => {
          if (result !== null) {
            handleAst({
              type: 'LinkedType',
              address: _SCParser.default.parse(result + '', 'exp').ast
            });
            this.notifyASTChange();
          }
        });
      } else {
        handleAst({
          type: 'GenericType',
          id: {
            type: 'Identifier',
            name: item.value
          }
        });
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$of, {
    getMenuProps: () => {
      return {
        items: this.getTypeItemSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var typeAnnotation = (0, _generator.copyJSVariable)(this._ast.typeAnnotation);
        typeAnnotation.typeAnnotation.typeParameters = [ast];
        this._ast.typeAnnotation = typeAnnotation;
        this.domSignal.emit('update');
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.cmd === 'chose_type') {
        this.editor.typeSelectionDialog.openForResult((0, _utils.type2text)(this._ast.typeAnnotation.typeAnnotation)).then(result => {
          if (result !== null) {
            handleAst({
              type: 'LinkedType',
              address: _SCParser.default.parse(result + '', 'exp').ast
            });
            this.notifyASTChange();
          }
        });
      } else {
        handleAst({
          type: 'GenericType',
          id: {
            type: 'Identifier',
            name: item.value
          }
        });
      }
    }
  });
};

SBArgumentDeclaration.prototype._astBinding = function () {
  var typeAnnotation = {
    type: 'TypeAnnotation',
    typeAnnotation: {
      type: 'GenericType',
      id: {
        type: 'Identifier',
        name: 'any'
      }
    }
  };
  var id = {
    type: 'Identifier',
    name: ''
  };
  Object.defineProperties(this._ast, {
    id: {
      set: value => {
        value = value || {
          type: 'Identifier',
          name: ''
        };
        id = value;
        this.$name.identifierText = value && value.name || '';
      },
      get: () => {
        return id;
      },
      enumerable: true
    },
    typeAnnotation: {
      set: value => {
        value = value || {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'GenericType',
            id: {
              type: 'Identifier',
              name: 'any'
            }
          }
        };

        if (value.typeAnnotation && value.typeAnnotation.typeParameters && value.typeAnnotation.typeParameters && value.typeAnnotation.typeParameters.length > 0) {
          this.elt.addClass('sb-has-type-parameters');
          this.$of.text = (0, _utils.type2text)(value.typeAnnotation.typeParameters[0]);
        } else {
          this.elt.removeClass('sb-has-type-parameters');
        }

        this.$type.text = (0, _utils.type2text)(value.typeAnnotation);
        typeAnnotation = value;
        this.domSignal.emit('update');
      },
      get: () => {
        return typeAnnotation;
      },
      enumerable: true
    }
  });
};

SBArgumentDeclaration.prototype.getTypeItemSelection = function () {
  return [{
    text: 'number',
    value: 'number'
  }, {
    text: 'string',
    value: 'string'
  }, {
    text: 'Date',
    value: 'Date'
  }, {
    text: 'Array',
    value: 'Array'
  }, {
    text: 'any',
    value: 'any'
  }, '=================', {
    text: 'Chọn kiểu dữ liệu',
    cmd: 'chose_type'
  }];
};

SBArgumentDeclaration.prototype.updateTypeDisplayName = function () {
  var editor = this.editor;
  var fullTypeName = (0, _utils.type2text)(this._ast.typeAnnotation.typeAnnotation);
  var typeName = (fullTypeName.match(/[^<]+/) || [''])[0];
  var ofName = (fullTypeName.match(/<([^>]+)/) || ['', ''])[1].trim();
  var isJSType = ['number', 'string', 'Date', 'any'].indexOf(typeName) >= 0;
  var typeDescriptor;

  if (isJSType) {
    this.$type.text = typeName;
  } else {
    typeDescriptor = editor.getTypeDescriptor(typeName);
    this.$type.text = typeDescriptor && typeDescriptor.displayName || typeName;
  }

  isJSType = ['number', 'string', 'Date', 'any'].indexOf(ofName) >= 0;

  if (isJSType) {
    this.$of.text = ofName;
  } else {
    typeDescriptor = editor.getTypeDescriptor(ofName);
    this.$of.text = typeDescriptor && typeDescriptor.displayName || ofName;
  }

  this.notifySizeChange();
};

Object.defineProperty(SBArgumentDeclaration.prototype, 'ast', {
  set: function (ast) {
    this._ast.id = ast.id; //todo: other type

    this._ast.typeAnnotation = ast.typeAnnotation || {
      type: 'TypeAnnotation',
      typeAnnotation: {
        type: 'GenericType',
        id: {
          type: 'Identifier',
          name: 'any'
        }
      }
    };
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBArgumentDeclaration);

var _default = SBArgumentDeclaration;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBVariableDeclaration.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBVariableDeclaration.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBStatement = _interopRequireDefault(require("./SBStatement"));

var _FCore = require("../../core/FCore");

var _SBIdentifierInput = _interopRequireDefault(require("../dom/SBIdentifierInput"));

var _SBTokenSelection = _interopRequireDefault(require("../dom/SBTokenSelection"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _utils = require("../dom/utils");

var _SCParser = _interopRequireDefault(require("absol/src/SCLang/SCParser"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SBBase = require("./SBBase");

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");

var _utils2 = require("../engine/utils");


/***
 * @extends SBStatement
 * @constructor
 */
function SBVariableDeclaration() {
  this._ast = {
    type: 'VariableDeclaration',
    id: {
      type: 'Identifier',
      name: ''
    },
    typeAnnotation: {
      type: 'TypeAnnotation',
      typeAnnotation: {
        type: 'GenericType',
        id: {
          type: 'Identifier',
          name: 'any'
        }
      }
    }
  };
  this.$domSignal = (0, _FCore._)('attachhook');
  this.domSignal = new _DomSignal.default(this.$domSignal).on('update', this.updateTypeDisplayName.bind(this));
  this.addExpressionBlock = new _SBAddExpression.default();
  this.initBlock = null;

  this._astBinding();
}

_OOP.default.mixClass(SBVariableDeclaration, _SBStatement.default);

SBVariableDeclaration.prototype.astType = 'VariableDeclaration';

SBVariableDeclaration.prototype.render = function () {
  _SBStatement.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-variable-declaration',
    child: [{
      class: 'sb-variable-declaration-left',
      child: [{
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'var'
        }
      }, {
        tag: _SBIdentifierInput.default
      }, {
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: ' : '
        }
      }, {
        tag: _SBTokenSelection.default,
        props: {
          text: (0, _utils.type2text)(this._ast.typeAnnotation.typeAnnotation)
        }
      }, {
        tag: 'button',
        class: 'sb-option-btn',
        child: 'span.mdi.mdi-cog'
      }]
    }, {
      class: 'sb-variable-declaration-right',
      child: [this.addExpressionBlock.elt]
    }]
  });
  this.$left = (0, _FCore.$)('.sb-variable-declaration-left', this.$elt);
  this.$rightCtn = (0, _FCore.$)('.sb-variable-declaration-right', this.$elt);
  this.$optionBtn = (0, _FCore.$)('.sb-option-btn', this.$elt);
  this.$type = (0, _FCore.$)(_SBTokenSelection.default.tag, this.$elt);
  this.$id = (0, _FCore.$)(_SBIdentifierInput.default.tag, this.$elt);
  this.$id.value = this._ast.id.name;
  this.$id.on('change', () => {
    this._ast.id.name = this.$id.identifierText;
    this.notifyASTChange();
  }).on('keyup', () => {
    this._ast.id.name = this.$id.identifierText;
  });

  _QuickMenu.default.toggleWhenClick(this.$type, {
    getMenuProps: () => {
      return {
        items: this.getTypeItemSelection()
      };
    },
    onSelect: item => {
      if (item.cmd) {
        this.editor.typeSelectionDialog.openForResult((0, _utils.type2text)(this._ast.typeAnnotation.typeAnnotation)).then(result => {
          if (result !== null) {
            this._ast.typeAnnotation.typeAnnotation = {
              type: 'LinkedType',
              address: _SCParser.default.parse('' + result, 'exp').ast
            };
            this.domSignal.emit('update');
            this.notifyASTChange();
          }
        });
      } else {
        this.$type.text = item.text;
        this._ast.typeAnnotation.typeAnnotation = {
          type: 'GenericType',
          id: {
            type: 'Identifier',
            name: item.value
          }
        };
        this.domSignal.emit('update');
        this.notifyASTChange();
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$optionBtn, {
    getMenuProps: () => {
      var items = [];

      if (this.$elt.hasClass('sb-has-init')) {
        items.push({
          text: '- Remove init value',
          cmd: 'remove_init_value'
        });
      } else {
        items.push({
          text: '- Add init value',
          cmd: 'add_init_value'
        });
      }

      return {
        items: items
      };
    },
    onSelect: item => {
      if (item.cmd === 'add_init_value') {
        this.$elt.addClass('sb-has-init');
      } else {
        this._ast.init = null;
      }

      this.notifySizeChange();
      this.notifyASTChange();
    }
  });

  this.rightQMN = _QuickMenu.default.toggleWhenClick(this.$rightCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$rightCtn);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        this.initBlock = new clazz();
        this.$rightCtn.clearChild().addChild(this.initBlock.elt);
        this.initBlock.ast = ast;
        this.notifySizeChange();
        this.notifyASTChange();
      };

      var initValue;

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.initBlock && this.initBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        initValue = this.initBlock ? (0, _SCCodeGenerator.generateSCCode)(this.initBlock.ast) : '';
        (0, _utils.openExpressionInputDialog)(this.$rightCtn, initValue).then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });
};

SBVariableDeclaration.prototype._astBinding = function () {
  var typeAnnotation = {
    type: 'TypeAnnotation',
    typeAnnotation: {
      type: 'GenericType',
      id: {
        type: 'Identifier',
        name: 'any'
      }
    }
  };
  Object.defineProperties(this._ast, {
    init: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.initBlock = new clazz();
          this.elt.addClass('sb-has-init');
          this.$rightCtn.clearChild().addChild(this.initBlock.elt);
          this.initBlock.ast = ast;
        } else {
          this.initBlock = null;
          this.$rightCtn.clearChild().addChild(this.addExpressionBlock.elt);
          this.elt.removeClass('sb-has-init');
        }
      },
      get: () => {
        return this.initBlock ? this.initBlock.ast : null;
      }
    },
    typeAnnotation: {
      enumerable: true,
      set: value => {
        value = value || {
          type: 'TypeAnnotation',
          typeAnnotation: {
            type: 'GenericType',
            id: {
              type: 'Identifier',
              name: 'any'
            }
          }
        };
        this.$type.text = (0, _utils.type2text)(value.typeAnnotation);
        typeAnnotation = value;
        this.domSignal.emit('update');
      },
      get: () => {
        return typeAnnotation;
      }
    }
  });
};

SBVariableDeclaration.prototype.updateTypeDisplayName = function () {
  var editor = this.editor;
  var fullTypeName = (0, _utils.type2text)(this._ast.typeAnnotation.typeAnnotation);
  var typeName = (fullTypeName.match(/[^<]+/) || [''])[0];
  var ofName = (fullTypeName.match(/<([^>]+)/) || ['', ''])[1].trim();
  var isJSType = ['number', 'string', 'Date', 'any'].indexOf(typeName) >= 0;
  var typeDescriptor;

  if (isJSType) {
    this.$type.text = typeName;
  } else {
    typeDescriptor = editor.getTypeDescriptor(typeName);
    this.$type.text = typeDescriptor && typeDescriptor.displayName || typeName;
  }

  isJSType = ['number', 'string', 'Date', 'any'].indexOf(ofName) >= 0; // if (isJSType) {
  //     this.$of.text = ofName;
  // }
  // else {
  //     typeDescriptor = editor.getTypeDescriptor(ofName);
  //     this.$of.text = (typeDescriptor && typeDescriptor.displayName) || ofName;
  // }

  this.notifySizeChange();
};

SBVariableDeclaration.prototype.removeChild = function (child) {
  if (child !== this.initBlock) return;
  this.initBlock = null;
  this.$rightCtn.clearChild().addChild(this.addExpressionBlock.elt);
};

SBVariableDeclaration.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var bottom = bound.height - 1;
  var leftBound = this.$left.getBoundingClientRect();
  var right = leftBound.right - bound.left;
  var turtle = new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().lineTo(right, 0);

  if (this.$elt.hasClass('sb-has-init')) {
    turtle.vLineBy(8).expKnop();
  }

  turtle.lineTo(right, bottom).lineTo(28, bottom).statementKnop().lineTo(8, bound.height - 1).arcBy(8, 8, 0, 0, 1, -8, -8).closePath();
  return turtle.getPath();
};

SBVariableDeclaration.prototype.getTypeItemSelection = function () {
  return [{
    text: 'number',
    value: 'number'
  }, {
    text: 'string',
    value: 'string'
  }, {
    text: 'Date',
    value: 'Date'
  }, {
    text: 'any',
    value: 'any'
  }, '=============', {
    text: 'Chon kiểu dữ liệu',
    cmd: 'chose_type'
  }];
};

Object.defineProperty(SBVariableDeclaration.prototype, 'ast', {
  set: function (ast) {
    this._ast.id.name = ast.id.name;
    if (this.$id) this.$id.identifierText = ast.id.name; //todo: other type

    this._ast.typeAnnotation = ast.typeAnnotation || {
      type: 'TypeAnnotation',
      typeAnnotation: {
        type: 'GenericType',
        id: {
          type: 'Identifier',
          name: 'any'
        }
      }
    };
    this._ast.init = ast.init || null;
    this.domSignal.emit('update');
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBVariableDeclaration);

var _default = SBVariableDeclaration;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBAddArgumentDeclaration.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBAddArgumentDeclaration.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _SBStatement = _interopRequireDefault(require("./SBStatement"));


/**
 * @extends SBBase
 * @constructor
 */
function SBAddArgumentDeclaration() {
  _SBBase.default.apply(this, arguments);
}

_OOP.default.mixClass(SBAddArgumentDeclaration, _SBBase.default);

SBAddArgumentDeclaration.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  this.$elt.addClass('sb-add-argument-declaration');
  this.$text = (0, _FCore._)({
    tag: 'span',
    child: {
      text: "+ Add ArgumentDeclaration "
    }
  });
  this.$elt.addChild(this.$text);
};

SBAddArgumentDeclaration.prototype.getBoundingPath = function () {
  return _SBStatement.default.prototype.getBoundingPath.call(this);
};

var _default = SBAddArgumentDeclaration;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBAddVariableDeclaration.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBAddVariableDeclaration.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBStatement = _interopRequireDefault(require("./SBStatement"));

var _FCore = require("../../core/FCore");


/**
 * @extends SBBase
 * @constructor
 */
function SBAddVariableDeclaration() {
  _SBBase.default.apply(this, arguments);
}

_OOP.default.mixClass(SBAddVariableDeclaration, _SBBase.default);

SBAddVariableDeclaration.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  this.$elt.addClass('sb-add-variable-declaration');
  this.$text = (0, _FCore._)({
    tag: 'span',
    child: {
      text: "+ Declare variable"
    }
  });
  this.$elt.addChild(this.$text);
};

SBAddVariableDeclaration.prototype.getBoundingPath = function () {
  return _SBStatement.default.prototype.getBoundingPath.call(this);
};

var _default = SBAddVariableDeclaration;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBFunctionDeclaration.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBFunctionDeclaration.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _FCore = require("../../core/FCore");

var _SBAddStatement = _interopRequireDefault(require("./SBAddStatement"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBArgumentDeclaration = _interopRequireDefault(require("./SBArgumentDeclaration"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _SBVariableDeclaration = _interopRequireDefault(require("./SBVariableDeclaration"));

var _SBAddArgumentDeclaration = _interopRequireDefault(require("./SBAddArgumentDeclaration"));

var _SBAddVariableDeclaration = _interopRequireDefault(require("./SBAddVariableDeclaration"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBIdentifierInput = _interopRequireDefault(require("../dom/SBIdentifierInput"));

var _utils = require("../dom/utils");

var _SCProgramInstance = require("absol/src/SCLang/SCProgramInstance");

var _Array = require("absol/src/DataStructure/Array");




/***
 * @extends SBBase
 * @constructor
 */
function SBFunctionDeclaration() {
  _SBBase.default.apply(this, arguments);

  this.addArgumentDeclarationBlock = new _SBAddArgumentDeclaration.default();
  this.argumentDeclarationBlocks = [];
  this.addVariableDeclarationBlock = new _SBAddVariableDeclaration.default();
  this.variableDeclarationBlocks = [];
  this.addStatementBlock = new _SBAddStatement.default();
  this.statementBlocks = []; // this.returnTypeBlock = null;

  this.returnExpressionBlock = null;
  this.addReturnExpression = new _SBAddExpression.default();
  this.$nameInput = (0, _FCore._)({
    tag: _SBIdentifierInput.default,
    class: 'sb-identifier-input'
  });
  this._functionType = 'procedure';
  this._returnStatementAst = {
    type: 'ReturnStatement'
  };
  this._ast = {
    type: 'FunctionDeclaration',
    id: {
      type: 'Identifier',
      name: 'NoName'
    },
    params: [],
    body: {
      type: 'BlockStatement',
      body: []
    }
  };
  Object.defineProperty(this._ast.body, 'body', {
    enumerable: true,
    get: () => {
      var body = this.variableDeclarationBlocks.concat(this.statementBlocks).map(blk => blk.ast);

      if (this._functionType === 'function') {
        body.push(this._returnStatementAst);
      }

      return body;
    },
    set: body => {
      if (this.$bodyCtn) {
        this.variableDeclarationBlocks.forEach(blk => blk.elt.remove());
        this.statementBlocks.forEach(blk => blk.elt.remove());
      }

      body = body || [];
      var variableDeclarations = body.filter(it => it.type === 'VariableDeclaration');
      this.variableDeclarationBlocks = variableDeclarations.map(it => {
        var newBlock = new _SBVariableDeclaration.default();

        if (this.$bodyCtn) {
          this.$bodyCtn.addChildBefore(newBlock.elt, this.addVariableDeclarationBlock.elt);
        }

        newBlock.ast = it;
        return newBlock;
      });
      var statements = body.filter(it => it.type !== 'VariableDeclaration');
      var returnStatement;

      if (statements.length > 0 && statements[statements.length - 1].type === 'ReturnStatement') {
        returnStatement = statements.pop();
      }

      this.statementBlocks = statements.map(it => {
        var clazz = _SBClassManager.default.get(it.type);

        var newBlock = new clazz();

        if (this.$bodyCtn) {
          this.$bodyCtn.addChildBefore(newBlock.elt, this.addStatementBlock.elt);
        }

        newBlock.ast = it;
        return newBlock;
      });
      var returned = body.some(function checkReturn(it) {
        if (!it) return false;
        if (it instanceof Array) return it.some(checkReturn);
        if (typeof it !== "object") return false;
        if (it.type === 'ReturnStatement') return !!it.argument;
        return Object.values(it).some(checkReturn);
      });

      if (returned) {
        this.functionType = 'function';
        if (returnStatement) this._returnStatementAst.argument = returnStatement.argument;
      } else {
        this.functionType = 'procedure';
        this._returnStatementAst.argument = null;
      }
    }
  });
  Object.defineProperty(this._ast.id, 'name', {
    enumerable: true,
    get: () => {
      return this.$nameInput.identifierText;
    },
    set: name => {
      this.$nameInput.value = name;
      this.$nameInput.autoWidthBy();
    }
  });
  Object.defineProperty(this._ast, 'params', {
    get: () => this.argumentDeclarationBlocks.map(blk => blk.ast),
    set: params => {
      if (this.$paramCtn) {
        this.argumentDeclarationBlocks.forEach(blk => blk.elt.remove());
      }

      this.argumentDeclarationBlocks = (params || []).map(it => {
        var newBlock = new _SBArgumentDeclaration.default();
        if (this.$paramCtn) this.$paramCtn.addChildBefore(newBlock.elt, this.addArgumentDeclarationBlock.elt);
        newBlock.ast = it;
        return newBlock;
      });
    }
  });
  Object.defineProperty(this._returnStatementAst, 'argument', {
    set: ast => {
      var clazz;

      if (ast) {
        clazz = _SBClassManager.default.get(ast.type);
        this.returnExpressionBlock = new clazz();
        this.returnExpressionBlock.ast = ast;
        this.$returnCtn.clearChild().addChild(this.returnExpressionBlock.elt);
      } else {
        this.$returnCtn.clearChild().addChild(this.addReturnExpression.elt);
      }
    },
    get: () => {
      return this.returnExpressionBlock && this.returnExpressionBlock.ast || null;
    },
    enumerable: true
  });
}

_OOP.default.mixClass(SBFunctionDeclaration, _SBBase.default);

SBFunctionDeclaration.prototype.astType = 'FunctionDeclaration';

SBFunctionDeclaration.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-function',
    attr: {
      'data-function-type': this._functionType
    },
    child: [{
      class: 'sb-function-head',
      child: [{
        class: 'sb-function-head-left',
        child: [{
          tag: 'button',
          class: 'sb-function-option-btn',
          child: 'span.mdi.mdi-cog'
        }, {
          tag: 'span',
          class: ['sb-inline-text', 'sb-function-type']
        }, this.$nameInput, {
          tag: 'span',
          class: 'sb-inline-text',
          child: {
            text: 'with: '
          }
        }]
      }, {
        class: ['sb-block-sub-ctn', 'sb-function-argument-ctn'],
        child: [this.addArgumentDeclarationBlock.elt]
      }]
    }, {
      class: ['sb-block-sub-ctn', 'sb-function-statement-body-ctn'],
      child: [this.addVariableDeclarationBlock.elt, this.addStatementBlock.elt]
    }, {
      class: ['sb-function-statement-return-row'],
      child: [{
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'return'
        }
      }, {
        class: 'sb-block-sub-ctn',
        child: (this.returnExpressionBlock || this.addReturnExpression).elt
      }]
    }]
  });
  this.$bodyCtn = (0, _FCore.$)('.sb-function-statement-body-ctn', this.$elt);
  this.$paramCtn = (0, _FCore.$)('.sb-function-argument-ctn', this.$elt);
  this.addArgumentDeclarationBlock.elt.on('click', () => {
    var block = this.addArgumentDeclaration();
    this.editor.selectTool.selectBlock(block);
  });
  this.addVariableDeclarationBlock.elt.on('click', () => {
    var block = this.addVariableDeclaration();
    this.notifySizeChange();
    this.notifyASTChange();
    this.editor.selectTool.selectBlock(block);
  });
  this.$optionBtn = (0, _FCore.$)('.sb-function-option-btn', this.$elt);
  this.$returnCtn = (0, _FCore.$)('.sb-function-statement-return-row > .sb-block-sub-ctn', this.$elt);

  _QuickMenu.default.toggleWhenClick(this.addStatementBlock.elt, {
    getMenuProps: () => {
      return {
        items: this.getStatementTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var block;

        if (ast.type === 'VariableDeclaration') {
          block = this.addVariableDeclaration(ast);
        } else {
          block = this.addStatement(ast);
        }

        this.editor.selectTool.selectBlock(block);
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openStatementInputDialog)(this.addStatementBlock.elt, '', ast => {
          return ast.type !== 'BreakStatement';
        }).then(ast => {
          if (ast) {
            handleAst(ast);
          }
        });
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$optionBtn, {
    getMenuProps: () => {
      return {
        items: [{
          text: 'procedure',
          value: 'procedure'
        }, {
          text: 'function',
          value: 'function'
        }]
      };
    },
    onSelect: item => {
      this.functionType = item.value;
      this.notifySizeChange();
      this.notifyASTChange();
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$returnCtn, {
    onClick: event => {
      var ok = false;
      ok = ok || !this.returnExpressionBlock;
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$returnCtn);
      if (this.returnExpressionBlock && this.returnExpressionBlock.astType === 'Identifier') ok = true;
      if (!ok) event.cancel();
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        this.returnExpressionBlock = new clazz();
        this.returnExpressionBlock.ast = ast;
        this.$returnCtn.clearChild().addChild(this.returnExpressionBlock.elt);
        this.notifyASTChange();
        this.notifySizeChange();
      };

      if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$returnCtn).then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });

  this.$nameInput.on('change', () => {
    this.notifySizeChange();
    this.notifyASTChange();
  });
};

SBFunctionDeclaration.prototype.removeChild = function (child) {
  var idx = this.statementBlocks.indexOf(child);

  if (idx >= 0) {
    child.elt.remove();
    this.statementBlocks.splice(idx, 1);
    return;
  }

  idx = this.variableDeclarationBlocks.indexOf(child);

  if (idx >= 0) {
    child.elt.remove();
    this.variableDeclarationBlocks.splice(idx, 1);
    return;
  }

  idx = this.argumentDeclarationBlocks.indexOf(child);

  if (idx >= 0) {
    child.elt.remove();
    this.argumentDeclarationBlocks.splice(idx, 1);
    return;
  }

  if (this.returnExpressionBlock === child) {
    child.elt.selfReplace(this.addReturnExpression.elt);
    this.returnExpressionBlock = null; // return;
  }
};

SBFunctionDeclaration.prototype.canAddChildBefore = function (child, bf) {
  var astType = child.astType || child.type;
  if (astType === 'BreakStatement') return false;

  if (astType === 'VariableDeclaration') {
    return !bf || bf.astType !== 'ArgumentDeclaration';
  } else if (astType === 'ArgumentDeclaration') {
    if (!bf || bf.astType === 'ArgumentDeclaration') return true;
  } else if (astType.endsWith('Statement')) {
    if (!bf) return true;
    if (bf.astType.endsWith('Statement')) return true;
  }

  return false;
};

SBFunctionDeclaration.prototype.addChildBefore = function (child, bf) {
  var ast = child.astType ? child.ast : child;
  var idx;

  if (ast.type === 'VariableDeclaration') {
    idx = this.variableDeclarationBlocks.indexOf(bf);

    if (idx < 0) {
      this.variableDeclarationBlocks.push(child);
      this.$bodyCtn.addChildBefore(child.elt, this.addVariableDeclarationBlock.elt);
    } else {
      this.variableDeclarationBlocks.splice(idx, 0, child);
      this.$bodyCtn.addChildBefore(child.elt, bf.elt);
    }
  } else if (ast.type === 'ArgumentDeclaration') {
    if (!bf || bf.astType !== 'ArgumentDeclaration') {
      this.argumentDeclarationBlocks.push(child);
      this.$paramCtn.addChildBefore(child.elt, this.addArgumentDeclarationBlock.elt);
    } else {
      idx = this.argumentDeclarationBlocks.indexOf(bf);

      if (idx >= 0) {
        this.argumentDeclarationBlocks.splice(idx, 0, child);
        this.$paramCtn.addChildBefore(child.elt, bf.elt);
      } else {
        throw {
          before: bf,
          message: 'Can not add child',
          child: child
        };
      }
    }
  } else if (ast.type.endsWith('Statement')) {
    if (!bf) {
      this.statementBlocks.push(child);
      this.$bodyCtn.addChildBefore(child.elt, this.addStatementBlock.elt);
    } else {
      idx = this.statementBlocks.indexOf(bf);

      if (idx >= 0) {
        this.statementBlocks.splice(idx, 0, child);
        this.$bodyCtn.addChildBefore(child.elt, bf.elt);
      } else {
        throw {
          before: bf,
          message: 'Can not add child',
          child: child
        };
      }
    }
  }
};

SBFunctionDeclaration.prototype.canAddChildAfter = function (child, at) {
  var astType = child.astType || child.type;
  if (astType === 'BreakStatement') return false;

  if (astType.endsWith('Statement')) {
    return true;
  } else if (astType.endsWith('ArgumentDeclaration')) {
    if (!at || at.astType === 'ArgumentDeclaration') return true;
  } else if (astType === 'VariableDeclaration') {
    if (!at || !at.astType.endsWith('Statement')) return true;
  }

  return false;
};

SBFunctionDeclaration.prototype.addChildAfter = function (child, at) {
  var ast = child.astType ? child.ast : child;
  var idx;

  if (ast.type === 'VariableDeclaration') {
    if (!at || at.parent === this && at.astType === 'ArgumentDeclaration') {
      this.variableDeclarationBlocks.unshift(child);
      this.$bodyCtn.addChildBefore(child.elt, this.$bodyCtn.firstChild);
    } else {
      idx = this.variableDeclarationBlocks.indexOf(at);

      if (idx >= 0) {
        this.variableDeclarationBlocks.splice(idx + 1, 0, child);
        this.$bodyCtn.addChildAfter(child.elt, at.elt);
      } else {
        throw {
          after: at,
          message: 'Can not add child',
          child: child
        };
      }
    }
  } else if (ast.type === 'ArgumentDeclaration') {
    if (!at) {
      this.argumentDeclarationBlocks.unshift(child);
      this.$paramCtn.addChildBefore(child.elt, this.$paramCtn.firstChild);
    } else {
      idx = this.argumentDeclarationBlocks.indexOf(at);

      if (idx >= 0) {
        this.argumentDeclarationBlocks.splice(idx + 1, 0, child);
        this.$paramCtn.addChildAfter(child.elt, at.elt);
      } else {
        throw {
          after: at,
          message: 'Can not add child',
          child: child
        };
      }
    }
  } else if (ast.type.endsWith('Statement')) {
    if (!at) {
      this.statementBlocks.unshift(child);
      this.$bodyCtn.addChildAfter(child.elt, this.addVariableDeclarationBlock.elt);
    } else {
      idx = this.statementBlocks.indexOf(at);

      if (idx >= 0) {
        this.statementBlocks.splice(idx + 1, 0, child);
        this.$bodyCtn.addChildAfter(child.elt, at.elt);
      } else if (at.parent === this) {
        this.statementBlocks.unshift(child);
        this.$bodyCtn.addChildAfter(child.elt, this.addVariableDeclarationBlock.elt);
      } else {
        throw {
          after: at,
          message: 'Can not add child',
          child: child
        };
      }
    }
  }
};

SBFunctionDeclaration.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var bodyBound = this.$bodyCtn.getBoundingClientRect();
  var paramBound = this.$paramCtn.getBoundingClientRect();
  var returnBound = this.$returnCtn.getBoundingClientRect();
  var turtle = new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().hLineTo(paramBound.right - bound.left).vLineTo(paramBound.top - bound.top).hLineBy(-paramBound.width + 28).statementKnop().hLineTo(paramBound.left - bound.left + 8).arcBy(8, 8, 0, 0, 0, -8, 8).vLineBy(paramBound.height - 16).arcBy(8, 8, 0, 0, 0, 8, 8).hLineTo(paramBound.right - bound.left).vLineTo(bodyBound.top - bound.top).hLineTo(bodyBound.left - bound.left + 28).statementKnop().hLineTo(bodyBound.left - bound.left + 8).arcBy(8, 8, 0, 0, 0, -8, 8).vLineBy(bodyBound.height - 16).arcBy(8, 8, 0, 0, 0, 8, 8);

  if (this.$elt.attr('data-function-type') === "function") {
    turtle.hLineTo(returnBound.left - bound.left).vLineBy(8).expKnop();
  } else {
    turtle.hLineTo(bound.width);
  }

  turtle.vLineTo(bound.height).hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).closePath();
  return turtle.getPath();
};

SBFunctionDeclaration.prototype.getVariables = function (ac) {
  if (!ac) {
    ac = {};
    Object.defineProperty(ac, '__length__', {
      writable: true,
      enumerable: false,
      value: 0
    });
  }

  var libKeys = (0, _Array.arrayUnique)(Object.keys(_SCProgramInstance.SCStaticLibScope.data).concat(Object.keys(_SCProgramInstance.SCDynamicLibScope.data)));
  var typeMng = this.editor.typeMng;
  libKeys.reduce((ac, cr) => {
    var desc = typeMng.detectTypeDescriptorOf(cr) || {
      type: 'any'
    };
    if (desc.type !== 'object' && desc.type !== 'class') return ac;
    var id = {
      type: 'Identifier',
      name: cr
    };
    ac[cr] = {
      id: id,
      order: ac.__length__++,
      type: desc,
      isLib: true
    };
    return ac;
  }, ac);

  this._ast.params.reduce((ac, cr) => {
    var id = cr.id;
    if (id.name.trim().length > 0) ac[id.name] = {
      id: id,
      type: (0, _utils.type2text)(cr.typeAnnotation.typeAnnotation),
      //cr.typeAnnotation.typeAnnotation,
      order: ac.__length__++
    };
    return ac;
  }, ac);

  this._ast.body.body.reduce((ac, cr) => {
    if (cr.type !== 'VariableDeclaration') return ac;
    var id = cr.id;
    if (id.name.trim().length > 0) ac[id.name] = {
      id: id,
      type: (0, _utils.type2text)(cr.typeAnnotation.typeAnnotation),
      order: ac.__length__++
    };
    return ac;
  }, ac);

  return ac;
};

Object.defineProperty(SBFunctionDeclaration.prototype, 'ast', {
  set: function (ast) {
    this._ast.id.name = ast.id.name;
    this._ast.params = ast.params;
    this._ast.body.body = ast.body.body;
  },
  get: function () {
    return this._ast;
  }
});
Object.defineProperty(SBFunctionDeclaration.prototype, 'functionType', {
  set: function (value) {
    if (value !== 'function') {
      value = 'procedure';
    }

    this._functionType = value;
    if (this.$elt) this.$elt.attr('data-function-type', value);
  },
  get: function () {
    return this._functionType;
  }
});

SBFunctionDeclaration.prototype.addArgumentDeclaration = function () {
  var newBlock = new _SBArgumentDeclaration.default();
  this.argumentDeclarationBlocks.push(newBlock);
  this.$paramCtn.addChildBefore(newBlock.elt, this.addArgumentDeclarationBlock.elt);
  this.notifySizeChange();
  (0, _FCore.$)('input', newBlock.elt, elt => {
    elt.focus();
    return true;
  });
  this.notifyASTChange();
  return newBlock;
};

SBFunctionDeclaration.prototype.addVariableDeclaration = function (ast) {
  var newBlock = new _SBVariableDeclaration.default();
  this.variableDeclarationBlocks.push(newBlock);

  if (ast && ast.type === 'VariableDeclaration') {
    newBlock.ast = ast;
  }

  this.$bodyCtn.addChildBefore(newBlock.elt, this.addVariableDeclarationBlock.elt);
  return newBlock;
};

SBFunctionDeclaration.prototype.addStatement = function (o) {
  var clazz;

  if (typeof o === "string") {
    clazz = _SBClassManager.default.get(o);
  } else {
    clazz = _SBClassManager.default.get(o.type);
  }

  if (!clazz) return;
  var newBlock = new clazz();
  this.statementBlocks.push(newBlock);
  this.$bodyCtn.addChildBefore(newBlock.elt, this.addStatementBlock.elt);
  if (o && o.type) newBlock.ast = o;
  return newBlock;
};

SBFunctionDeclaration.prototype.canMoveChild = function (child, direction) {
  var arr, idx;
  idx = this.argumentDeclarationBlocks.indexOf(child);

  if (idx >= 0) {
    arr = this.argumentDeclarationBlocks;
  } else {
    idx = this.variableDeclarationBlocks.indexOf(child);

    if (idx >= 0) {
      arr = this.variableDeclarationBlocks;
    } else {
      idx = this.statementBlocks.indexOf(child);
      if (idx >= 0) arr = this.statementBlocks;
    }
  }

  if (idx < 0) return false;

  if (direction === "up") {
    return idx > 0;
  } else if (direction === 'down') {
    return idx < arr.length - 1;
  }

  return false;
};

SBFunctionDeclaration.prototype.moveChild = function (child, direction) {
  var arr, idx, ctn;
  idx = this.argumentDeclarationBlocks.indexOf(child);

  if (idx >= 0) {
    arr = this.argumentDeclarationBlocks;
    ctn = this.$paramCtn;
  } else {
    idx = this.variableDeclarationBlocks.indexOf(child);

    if (idx >= 0) {
      arr = this.variableDeclarationBlocks;
      ctn = this.$bodyCtn;
    } else {
      idx = this.statementBlocks.indexOf(child);

      if (idx >= 0) {
        arr = this.statementBlocks;
        ctn = this.$bodyCtn;
      }
    }
  }

  if (idx < 0) return;
  var at, bf;

  if (direction === "up" && idx > 0) {
    bf = arr[idx - 1];
    arr.splice(idx, 1);
    arr.splice(idx - 1, 0, child);
    child.elt.selfRemove();
    ctn.addChildBefore(child.elt, bf.elt);
  } else if (direction === 'down' && idx < idx < arr.length - 1) {
    at = arr[idx + 1];
    arr.splice(idx, 1);
    arr.splice(idx + 1, 0, child);
    child.elt.selfRemove();
    ctn.addChildAfter(child.elt, at.elt);
  }
};

_SBClassManager.default.add(SBFunctionDeclaration);

var _default = SBFunctionDeclaration;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBVariable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBVariable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBTokenSelection = _interopRequireDefault(require("../dom/SBTokenSelection"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _SBIdentifier = _interopRequireDefault(require("./SBIdentifier"));


/***
 * @extends SBIdentifier
 * @constructor
 */
function SBVariable() {
  _SBIdentifier.default.apply(this, arguments);
}

_OOP.default.mixClass(SBVariable, _SBIdentifier.default);

SBVariable.prototype.render = function () {
  _SBIdentifier.default.prototype.render.call(this);

  this.quickMenu = _QuickMenu.default.toggleWhenClick(this.$name, {
    getMenuProps: () => {
      return {
        items: this.getVariableMenuItems()
      };
    },
    onSelect: this.onSelectVariableMenuItem.bind(this)
  });
};

SBVariable.prototype.getVariableMenuItems = function () {
  return Object.values(this.getVariables()).map(variable => {
    return {
      variable: variable,
      text: variable.id.name
    };
  });
};

SBVariable.prototype.onSelectVariableMenuItem = function (item) {
  if (item.value) {
    this.$name.text = item.text;
    this.notifySizeChange();
  } else {
    //run command
    console.log(item);
  }
};

var _default = SBVariable;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBAddReferent.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBAddReferent.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _SBExpression = _interopRequireDefault(require("./SBExpression"));


/***
 * @extends SBBase
 * @constructor
 */
function SBAddReferent() {
  _SBBase.default.apply(this, arguments);
}

_OOP.default.mixClass(SBAddReferent, _SBBase.default);

SBAddReferent.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-add-referent',
    child: {
      tag: 'span',
      class: 'sb-inner-text',
      child: {
        text: '+ Add Reference Variable'
      }
    }
  });
};

SBAddReferent.prototype.getBoundingPath = _SBExpression.default.prototype.getBoundingPath;
var _default = SBAddReferent;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBForCountStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBForCountStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _FCore = require("../../core/FCore");

var _SBVariable = _interopRequireDefault(require("./SBVariable"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBAddStatement = _interopRequireDefault(require("./SBAddStatement"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SBAddReferent = _interopRequireDefault(require("./SBAddReferent"));

var _utils = require("../dom/utils");

var _SBWhileStatement = _interopRequireDefault(require("./SBWhileStatement"));

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");

var _SCTypeManager = _interopRequireDefault(require("../editor/SCTypeManager"));

var _SCProgramInstance = require("absol/src/SCLang/SCProgramInstance");

var _utils2 = require("../engine/utils");




/***
 * @extends SBBase
 * @constructor
 */
function SBForCountStatement() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: "ForCountStatement"
  };
  Object.defineProperties(this._ast, {
    for: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.forBlock = new clazz();
          this.forBlock.ast = ast;

          if (this.$forCtn) {
            this.$forCtn.clearChild().addChild(this.forBlock.elt);
          }
        } else if (this.forBlock) {
          this.forBlock = null;

          if (this.$forCtn) {
            this.$forCtn.clearChild().addChild(this.addForIdentBlock.elt);
          }
        }
      },
      get: () => this.forBlock ? this.forBlock.ast : null
    },
    from: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.fromBlock = new clazz();
          this.fromBlock.ast = ast;

          if (this.$fromCtn) {
            this.$fromCtn.clearChild().addChild(this.fromBlock.elt);
          }
        } else if (this.forBlock) {
          this.fromBlock = null;

          if (this.$fromCtn) {
            this.$fromCtn.clearChild().addChild(this.addFromExpressionBlock.elt);
          }
        }
      },
      get: () => this.fromBlock ? this.fromBlock.ast : null
    },
    to: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.toBlock = new clazz();
          this.toBlock.ast = ast;

          if (this.$toCtn) {
            this.$toCtn.clearChild().addChild(this.toBlock.elt);
          }
        } else if (this.forBlock) {
          this.toBlock = null;

          if (this.$toCtn) {
            this.$toCtn.clearChild().addChild(this.addToExpressionBlock.elt);
          }
        }
      },
      get: () => this.toBlock ? this.toBlock.ast : null
    },
    body: {
      enumerable: true,
      set: ast => {
        if (!ast) {
          ast = {
            type: 'BlockStatement',
            body: []
          };
        } else if (ast.type !== 'BlockStatement') {
          ast = {
            type: 'BlockStatement',
            body: [ast]
          };
        }

        this.doBlocks = ast.body.map(sAst => {
          var clazz = _SBClassManager.default.get(sAst.type);

          var block = new clazz();
          block.ast = sAst;
          return block;
        });

        if (this.elt) {
          //call getter
          this.$doCtn.clearChild().addChild(this.doBlocks.map(blk => blk.elt)).addChild(this.addStatementBlock.elt);
        }
      },
      get: () => ({
        type: 'BlockStatement',
        body: this.doBlocks.map(blk => blk.ast)
      })
    }
  });
  this.addForIdentBlock = new _SBAddReferent.default();
  this.addFromExpressionBlock = new _SBAddExpression.default();
  this.addToExpressionBlock = new _SBAddExpression.default();
  this.addStatementBlock = new _SBAddStatement.default();
  this.forBlock = null;
  this.fromBlock = null;
  this.toBlock = null;
  this.doBlocks = [];
}

_OOP.default.mixClass(SBForCountStatement, _SBBase.default);

SBForCountStatement.prototype.astType = 'ForCountStatement';

SBForCountStatement.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-for-count-statement',
    child: [{
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'for count'
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-count-statement-for-ctn'],
      child: this.forBlock ? this.forBlock.elt : this.addForIdentBlock.elt
    }, {
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'from'
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-count-statement-from-ctn'],
      child: this.fromBlock ? this.fromBlock.elt : this.addFromExpressionBlock.elt
    }, {
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'to'
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-count-statement-to-ctn'],
      child: this.toBlock ? this.toBlock.elt : this.addToExpressionBlock.elt
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-count-statement-body-ctn'],
      child: [this.addStatementBlock.elt]
    }]
  });
  this.$forCtn = (0, _FCore.$)('.sb-for-count-statement-for-ctn', this.$elt);
  this.$fromCtn = (0, _FCore.$)('.sb-for-count-statement-from-ctn', this.$elt);
  this.$toCtn = (0, _FCore.$)('.sb-for-count-statement-to-ctn', this.$elt);
  this.$bodyCtn = (0, _FCore.$)('.sb-for-count-statement-body-ctn', this.$elt);
  this.$doCtn = this.$bodyCtn;

  _QuickMenu.default.toggleWhenClick(this.$forCtn, {
    getMenuProps: () => {
      return {
        items: this.getLocalVariableSelection()
      };
    },
    onSelect: item => {
      var clazz;

      if (item.variable) {
        clazz = _SBClassManager.default.get('Identifier');
        this.forBlock = new clazz();
        this.forBlock.ast = item.variable.id;
        this.$forCtn.clearChild().addChild(this.forBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$fromCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addFromExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$fromCtn);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        this.fromBlock = new clazz();
        this.fromBlock.ast = ast;
        this.$fromCtn.clearChild().addChild(this.fromBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.fromBlock && this.fromBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$fromCtn, this.fromBlock ? (0, _SCCodeGenerator.generateSCCode)(this.forBlock.ast) : '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$toCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addToExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$toCtn);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        this.toBlock = new clazz();
        this.$toCtn.clearChild().addChild(this.toBlock.elt);
        this.toBlock.ast = ast;
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.toBlock && this.toBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$toCtn, this.toBlock ? (0, _SCCodeGenerator.generateSCCode)(this.toBlock.ast) : '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.addStatementBlock.elt, {
    getMenuProps: () => ({
      items: this.getStatementTypeSelection()
    }),
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        var block = new clazz();
        block.ast = ast;
        this.$doCtn.addChildBefore(block.elt, this.addStatementBlock.elt);
        this.doBlocks.push(block);
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openStatementInputDialog)(this.addStatementBlock.elt, '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });
};

SBForCountStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var forBound = this.$forCtn.getBoundingClientRect();
  var bodyBound = this.$bodyCtn.getBoundingClientRect();
  var fromBound = this.$fromCtn.getBoundingClientRect();
  var toBound = this.$toCtn.getBoundingClientRect();
  return new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().hLineTo(bound.width - 1).vLineTo(bodyBound.top - bound.top).hLineTo(bodyBound.left - bound.left + 28).statementKnop().hLineTo(bodyBound.left - bound.left + 8).arcBy(8, 8, 0, 0, 0, -8, 8).vLineBy(bodyBound.height - 16).arcBy(8, 8, 0, 0, 0, 8, 8).hLineTo(bound.width).vLineTo(bound.height).hLineTo(28).statementKnop().hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).closePath().expBound(forBound.left - bound.left, forBound.top - bound.top, forBound.width, forBound.height).expBound(fromBound.left - bound.left, fromBound.top - bound.top, fromBound.width, fromBound.height).expBound(toBound.left - bound.left, toBound.top - bound.top, toBound.width, toBound.height).getPath();
};

SBForCountStatement.prototype.getLocalVariableSelection = function () {
  var variables = this.getVariables();
  var res = [];
  Object.keys(variables).filter(name => {
    var va = variables[name];

    if (va.type === 'any' || va.type === 'number') {
      return true;
    }

    if (_SCProgramInstance.SCStaticLibScope.findScope(name) || _SCProgramInstance.SCDynamicLibScope.findScope(name)) return false;
    if (va.type && va.type.type === 'GenericType' && (va.type.id.name === 'number' || va.type.id.name === 'any')) return true;

    var desc = _SCTypeManager.default.detectTypeDescriptorOf(va.type);

    if (desc && desc.type === 'number') return true;
    return false;
  }).forEach(key => {
    res.push({
      text: key,
      variable: variables[key]
    });
  });
  return res;
};

SBForCountStatement.prototype.removeDoChild = _SBWhileStatement.default.prototype.removeDoChild;
SBForCountStatement.prototype.canMoveChild = _SBWhileStatement.default.prototype.canMoveChild;
SBForCountStatement.prototype.moveChild = _SBWhileStatement.default.prototype.moveChild;
SBForCountStatement.prototype.removeChild = _SBWhileStatement.default.prototype.removeChild;

SBForCountStatement.prototype.removeChild = function (child) {
  this.removeDoChild(child);

  if (child === this.fromBlock) {
    this.fromBlock = null;
    this.$fromCtn.clearChild().addChild(this.addFromExpressionBlock.elt);
  } else if (child === this.forBlock) {
    this.forBlock = null;
    this.$forCtn.clearChild().addChild(this.addForIdentBlock.elt);
  } else if (child === this.toBlock) {
    this.toBlock = null;
    this.$toCtn.clearChild().addChild(this.addToExpressionBlock.elt);
  }
};

Object.defineProperty(SBForCountStatement.prototype, 'ast', {
  set: function (ast) {
    ast = ast || {};
    this._ast.for = ast.for;
    this._ast.from = ast.from;
    this._ast.to = ast.to;
    this._ast.body = ast.body;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBForCountStatement);

var _default = SBForCountStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBAssignStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBAssignStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _SBStatement = _interopRequireDefault(require("./SBStatement"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _SBAddReferent = _interopRequireDefault(require("./SBAddReferent"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _utils = require("../dom/utils");

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");

var _utils2 = require("../engine/utils");




var verifyLeftAst = ast => {
  return ast.type === "Identifier" || ast.type === 'MemberExpression';
};
/***
 * @extends SBStatement
 * @constructor
 */


function SBAssignStatement() {
  _SBStatement.default.apply(this, arguments);

  this._ast = {
    type: 'AssignStatement',
    left: null,
    right: null
  };
  this.addReferentBlock = new _SBAddReferent.default();
  this.addExpressionBlock = new _SBAddExpression.default();
  this.leftBlock = null;
  this.rightBlock = null;
  Object.defineProperty(this._ast, 'left', {
    get: () => this.leftBlock && this.leftBlock.ast || null
  });
  Object.defineProperty(this._ast, 'right', {
    get: () => this.rightBlock && this.rightBlock.ast || null
  });
}

_OOP.default.mixClass(SBAssignStatement, _SBStatement.default);

SBAssignStatement.prototype.astType = 'AssignStatement';

SBAssignStatement.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: ['sb-block', 'sb-assign-statement'],
    child: [{
      class: 'sb-assign-statement-front',
      child: [{
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'set'
        }
      }, {
        tag: 'span',
        class: ['sb-block-sub-ctn', 'sb-assign-statement-left-ctn'],
        child: [(this.leftBlock || this.addReferentBlock).elt]
      }, {
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'to'
        }
      }]
    }, {
      class: ['sb-block-sub-ctn', 'sb-assign-statement-right-ctn'],
      child: [(this.rightBlock || this.addExpressionBlock).elt]
    }]
  });
  this.$leftCtn = (0, _FCore.$)('.sb-assign-statement-left-ctn', this.$elt);
  this.$rightCtn = (0, _FCore.$)('.sb-assign-statement-right-ctn', this.$elt);
  this.leftQMN = _QuickMenu.default.toggleWhenClick(this.$leftCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addReferentBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$leftCtn);
      ok = ok || this.leftBlock && this.leftBlock.ast.type === 'Identifier';
      if (!ok) event.cancel();
    },
    getMenuProps: () => {
      return {
        items: this.getVariableSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        this.leftBlock = new clazz();
        this.$leftCtn.clearChild().addChild(this.leftBlock.elt);
        this.leftBlock.ast = ast;
        this.notifySizeChange();
        this.notifyASTChange();
        this.editor.selectTool.selectBlock(this.leftBlock);
      };

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.leftBlock && this.leftBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst({
          type: 'Identifier',
          name: item.variable
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$leftCtn, '', verifyLeftAst).then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });
  this.rightQMN = _QuickMenu.default.toggleWhenClick(this.$rightCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$rightCtn);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        clazz = _SBClassManager.default.get(ast.type);
        this.rightBlock = new clazz();
        this.rightBlock.ast = ast;
        this.$rightCtn.clearChild().addChild(this.rightBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
        this.editor.selectTool.selectBlock(this.rightBlock);
      };

      var initValue;
      var clazz;

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.rightBlock && this.rightBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        initValue = this.rightBlock ? (0, _SCCodeGenerator.generateSCCode)(this.rightBlock.ast) : '';
        (0, _utils.openExpressionInputDialog)(this.$rightCtn, initValue).then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });
};

SBAssignStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var leftBound = this.$leftCtn.getBoundingClientRect();
  var rightBound = this.$rightCtn.getBoundingClientRect();
  var right = rightBound.left - bound.left;
  var bottom = bound.height - 1;
  var turtle = new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().lineTo(right, 0).vLineBy(8).expKnop().lineTo(right, bottom).lineTo(28, bottom).statementKnop().lineTo(8, bound.height - 1).arcBy(8, 8, 0, 0, 1, -8, -8).closePath().expBound(leftBound.left - bound.left, leftBound.top - bound.top, leftBound.width, leftBound.height);
  return turtle.getPath();
};

SBAssignStatement.prototype.removeChild = function (child) {
  if (child === this.leftBlock) {
    child.elt.selfReplace(this.addReferentBlock.elt);
    this.leftBlock = null;
  } else if (child === this.rightBlock) {
    child.elt.selfReplace(this.addExpressionBlock.elt);
    this.rightBlock = null;
  }
};

SBAssignStatement.prototype.canAddChildBefore = function (child, bf) {
  var astType = child.astType || child.type;
  var isRef = astType === 'Identifier' || astType === 'MemberExpression';
  var isExpression = astType === 'Identifier' || astType.endsWith('Literal') || astType.endsWith('Expression');

  if (bf) {
    if (bf === this.rightBlock && isRef) return true;
  } else {
    if (!this.leftBlock && isRef) return true;
    if (!this.rightBlock && isExpression) return true;
  }

  return false;
};

SBAssignStatement.prototype.addChildBefore = function (child, bf) {
  var astType = child.astType;
  var isRef = astType === 'Identifier' || astType === 'MemberExpression';
  var isExpression = astType === 'Identifier' || astType.endsWith('Literal') || astType.endsWith('Expression');

  if (bf) {
    if (bf === this.rightBlock && isRef) {
      this.leftBlock = child;
      this.$leftCtn.clearChild().addChild(child.elt);
    }
  } else {
    if (!this.leftBlock && isRef) {
      this.leftBlock = child;
      this.$leftCtn.clearChild().addChild(child.elt);
    } else if (!this.rightBlock && isExpression) {
      this.rightBlock = child;
      this.$rightCtn.clearChild().addChild(child.elt);
    }
  }
};

SBAssignStatement.prototype.canAddChildAfter = function (child, at) {
  var astType = child.astType || child.type;
  var isRef = astType === 'Identifier' || astType === 'MemberExpression';
  var isExpression = astType === 'Identifier' || astType.endsWith('Literal') || astType.endsWith('Expression');

  if (at) {
    if (at === this.leftBlock && isExpression) return true;
  } else {
    if (!this.leftBlock && isRef) return true;
    if (!this.rightBlock && isExpression) return true;
  }

  return false;
};

SBAssignStatement.prototype.addChildAfter = function (child, at) {
  var astType = child.astType || child.type;
  var isRef = astType === 'Identifier' || astType === 'MemberExpression';
  var isExpression = astType === 'Identifier' || astType.endsWith('Literal') || astType.endsWith('Expression');

  if (at) {
    if (at === this.leftBlock && isExpression) {
      this.rightBlock = child;
      this.$rightCtn.clearChild().addChild(child.elt);
    }
  } else {
    if (!this.rightBlock && isExpression) {
      this.rightBlock = child;
      this.$rightCtn.clearChild().addChild(child.elt);
    } else if (!this.leftBlock && isRef) {
      this.leftBlock = child;
      this.$leftCtn.clearChild().addChild(child.elt);
    }
  }
};

SBAssignStatement.prototype.getVariableSelection = function () {
  var variables = this.getVariables();
  var keys = Object.keys(variables);
  keys.sort((a, b) => variables[a].order - variables[b].order);
  var res = keys.map(key => ({
    text: key,
    variable: key
  }));
  res.push('===========', {
    text: 'Object->property',
    astType: 'MemberExpression'
  }, {
    text: "Parse form text",
    cmd: 'parse_text',
    icon: 'span.mdi.mdi-form-textbox'
  });
  return res;
};

Object.defineProperty(SBAssignStatement.prototype, 'ast', {
  set: function (ast) {
    var clazz;

    if (ast.left) {
      clazz = _SBClassManager.default.get(ast.left.type);
      this.leftBlock = new clazz();
      this.leftBlock.ast = ast.left;
      if (this.$leftCtn) this.$leftCtn.clearChild().addChild(this.leftBlock.elt);
    } else {
      this.leftBlock = null;
      if (this.$leftCtn) this.$leftCtn.clearChild().addChild(this.addReferentBlock.elt);
    }

    if (ast.right) {
      clazz = _SBClassManager.default.get(ast.right.type);
      this.rightBlock = new clazz();
      this.rightBlock.ast = ast.right;
      if (this.$rightCtn) this.$rightCtn.clearChild().addChild(this.rightBlock.elt);
    } else {
      if (this.$rightCtn) this.$rightCtn.clearChild().addChild(this.addExpressionBlock.elt);
    }
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBAssignStatement);

var _default = SBAssignStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBBreakStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBBreakStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBStatement = _interopRequireDefault(require("./SBStatement"));

var _FCore = require("../../core/FCore");

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));


/***
 * @extends SBStatement
 * @constructor
 */
function SBBreakStatement() {
  this._ast = {
    type: 'BreakStatement'
  };
}

_OOP.default.mixClass(SBBreakStatement, _SBStatement.default);

SBBreakStatement.prototype.astType = 'BreakStatement';

SBBreakStatement.prototype.render = function () {
  _SBStatement.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-break-statement',
    child: [{
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'break'
      }
    }]
  });
};

Object.defineProperty(SBBreakStatement.prototype, 'ast', {
  set: function (ast) {},
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBBreakStatement);

var _default = SBBreakStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBBooleanLiteral.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBBooleanLiteral.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _NumberInput = _interopRequireDefault(require("absol-acomp/js/numberinput/NumberInput"));

var _FCore = require("../../core/FCore");

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _SBTokenSelection = _interopRequireDefault(require("../dom/SBTokenSelection"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));


/***
 * @extends SBBase
 * @constructor
 */
function SBBooleanLiteral() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: 'BooleanLiteral',
    value: false
  };
  var value = false;
  Object.defineProperty(this._ast, 'value', {
    enumerable: true,
    set: _value => {
      value = !!_value;

      if (this.$elt) {
        this.$elt.attr('data-value', value ? 'true' : 'false');
        this.$value.text = value ? 'true' : 'false';
      }
    },
    get: () => {
      return value;
    }
  });
}

_OOP.default.mixClass(SBBooleanLiteral, _SBBase.default);

SBBooleanLiteral.prototype.astType = 'BooleanLiteral';

SBBooleanLiteral.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-boolean-literal',
    child: {
      tag: _SBTokenSelection.default,
      props: {
        text: this._ast.value ? 'true' : 'false'
      }
    }
  });
  this.$value = (0, _FCore.$)(_SBTokenSelection.default.tag, this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$value, {
    getMenuProps: () => {
      return {
        items: [{
          text: 'true',
          value: true
        }, {
          text: 'false',
          value: false
        }]
      };
    },
    onSelect: item => {
      if (item.value !== this._ast.value) {
        this._ast.value = item.value;
        this.notifySizeChange();
        this.notifyASTChange();
      }
    }
  });
};

SBBooleanLiteral.prototype.getBoundingPath = _SBExpression.default.prototype.getBoundingPath;
Object.defineProperty(SBBooleanLiteral.prototype, 'ast', {
  set: function (ast) {
    this._ast.value = !!ast.value;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBBooleanLiteral);

var _default = SBBooleanLiteral;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBArrayExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBArrayExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _SBBase = require("./SBBase");

var _utils = require("../dom/utils");

var _utils2 = require("../engine/utils");

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");


/***
 * @extends {SBExpression}
 * @constructor
 */
function SBArrayExpression() {
  _SBExpression.default.apply(this, arguments);

  this._ast = {
    type: "ArrayExpression"
  };
  this.addElementBlock = new _SBAddExpression.default();
  this.elementBlocks = [];
  Object.defineProperty(this._ast, 'elements', {
    enumerable: true,
    set: astArr => {
      astArr = astArr || [];
      astArr = astArr.filter(astArr => !!astArr);

      if (astArr.length === 0) {
        this.elt.addClass('sb-empty');
      } else {
        this.elt.removeClass('sb-empty');
      }

      this.$elementCtn.clearChild();
      this.elementBlocks = astArr.map((eAst, i) => {
        var clazz = _SBClassManager.default.get(eAst.type);

        var block = new clazz();
        block.ast = eAst;
        return block;
      });
      var domElements = this.elementBlocks.map((blk, i) => this._makeWrapper(blk).attr('data-idx', i + ''));
      this.$elementCtn.addChild(domElements);
      this.$elementCtn.addChild(this.$addItemWrapper);
    },
    get: () => {
      return this.elementBlocks.map(blk => blk ? blk.ast : null);
    }
  });
}

_OOP.default.mixClass(SBArrayExpression, _SBExpression.default);

SBArrayExpression.prototype.astType = 'ArrayExpression';

SBArrayExpression.prototype.render = function () {
  _SBExpression.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: ['sb-array-expression', 'sb-empty'],
    child: [{
      tag: 'span',
      class: ['sb-array-expression-text', 'sb-inline-text']
    }, {
      class: 'sb-array-expression-element-ctn',
      child: [{
        class: ['sb-array-element-wrapper', 'sb-array-add-item-wrapper'],
        attr: {
          'data-idx': '*'
        },
        child: {
          class: 'sb-sub-ctn',
          child: this.addElementBlock.elt
        }
      }]
    }]
  });
  this.$elementCtn = (0, _FCore.$)('.sb-array-expression-element-ctn', this.$elt);
  this.$addItemWrapper = (0, _FCore.$)('.sb-array-add-item-wrapper', this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$addItemWrapper, {
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        var block = new clazz();

        var wrapperElt = this._makeWrapper(block);

        wrapperElt.attr('data-idx', this.$elementCtn.childNodes.length + '');
        this.$elementCtn.addChildBefore(wrapperElt, this.$addItemWrapper);
        block.ast = ast;
        this.elementBlocks.push(block);
        this.notifySizeChange();
        this.notifyASTChange();
        this.editor.selectTool.selectBlock(block);
      };

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$addItemWrapper, '').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });
};

SBArrayExpression.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var bottom = bound.height - 1;
  var addBound = this.addElementBlock.elt.getBoundingClientRect();
  var turtle = new _SBTurtle.default().moveTo(0, 0).hLineTo(addBound.left - bound.left);
  Array.prototype.forEach.call(this.$elementCtn.childNodes, elt => {
    elt.$subCtn = (0, _FCore.$)('.sb-sub-ctn', elt);
    var sBound = elt.$subCtn.getBoundingClientRect();
    turtle.vLineTo(sBound.top + 8 - bound.top).expKnop();
  });
  turtle.vLineTo(bottom).hLineTo(0).vLineTo(17).expKnop().closePath();
  return turtle.getPath();
};

SBArrayExpression.prototype.removeChild = function (child) {
  var idx = this.elementBlocks.indexOf(child);
  if (idx < 0) return;
  this.elementBlocks.splice(idx, 1);
  this.$elementCtn.childNodes[idx].remove();

  for (var i = idx; i < this.elementBlocks.length; ++i) {
    this.$elementCtn.childNodes[i].attr('data-idx', i + '');
  }
};

SBArrayExpression.prototype.canMoveChild = function (child, direction) {
  console.log(this.elementBlocks);
  var idx = this.elementBlocks.indexOf(child);
  if (idx < 0) return false;
  return idx > 0 && direction === 'up' || idx < this.elementBlocks.length - 1 && direction === "down";
};

SBArrayExpression.prototype.moveChild = function (child, direction) {
  var idx = this.elementBlocks.indexOf(child);
  if (idx < 0) return;
  var wrapper;

  if (idx > 0 && direction === 'up') {
    this.elementBlocks.splice(idx, 1);
    this.elementBlocks.splice(idx - 1, 0, child);
    wrapper = this.$elementCtn.childNodes[idx];
    wrapper.selfRemove();
    this.$elementCtn.addChildBefore(wrapper, this.$elementCtn.childNodes[idx - 1]);
    this.$elementCtn.childNodes[idx - 1].attr('data-idx', idx - 1 + '');
    this.$elementCtn.childNodes[idx].attr('data-idx', idx + '');
  } else if (idx < this.elementBlocks.length - 1 && direction === "down") {
    this.elementBlocks.splice(idx, 1);
    this.elementBlocks.splice(idx + 1, 0, child);
    wrapper = this.$elementCtn.childNodes[idx];
    wrapper.selfRemove();
    this.$elementCtn.addChildAfter(wrapper, this.$elementCtn.childNodes[idx]);
    this.$elementCtn.childNodes[idx].attr('data-idx', idx + '');
    this.$elementCtn.childNodes[idx + 1].attr('data-idx', idx + 1 + '');
  }
};

SBArrayExpression.prototype.canAddChildBefore = function (child, bf) {
  if (!bf) return true;
  var astType = child.astType || child.type;
  return (astType.endsWith('Expression') || astType.endsWith('Literal') || astType === 'Identifier') && this.elementBlocks.indexOf(bf) >= 0;
};

SBArrayExpression.prototype.addChildBefore = function (child, bf) {
  var astType = child.astType;
  if (!astType.endsWith('Expression') && !astType.endsWith('Literal') && astType !== 'Identifier') return;
  var idx;
  var bfElt;

  if (bf) {
    idx = this.elementBlocks.indexOf(bf);
    if (idx < 0) return;
    this.elementBlocks.splice(idx, 0, child);
    bfElt = this.$elementCtn.childNodes[idx];
  } else {
    idx = this.elementBlocks.length;
    this.elementBlocks.push(child);
    bfElt = this.$elementCtn.lastChild;
  }

  this.$elementCtn.addChildBefore(this._makeWrapper(child), bfElt);

  for (var i = idx; i < this.elementBlocks.length; ++i) {
    this.$elementCtn.childNodes[i].attr('data-idx', i + '');
  }
};

SBArrayExpression.prototype._makeWrapper = function (child) {
  var subCtn = (0, _FCore._)({
    class: 'sb-sub-ctn',
    child: child.elt
  });
  var wrapper = (0, _FCore._)({
    class: ['sb-array-element-wrapper'],
    child: subCtn
  });

  _QuickMenu.default.toggleWhenClick(subCtn, {
    onClick: event => {
      var ok = (0, _SBBase.isBoundOfChild)(event.target, subCtn);
      console.log(ok);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var idx = this.elementBlocks.indexOf(child);

      var handleAst = ast => {
        if (idx < 0) return;
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        var block = new clazz();
        child = block;
        this.elementBlocks[idx] = child;
        subCtn.clearChild().addChild(child.elt);
        block.ast = ast;
        this.notifySizeChange();
        this.notifyASTChange();
        this.editor.selectTool.selectBlock(block);
      };

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(child.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$addItemWrapper, this.elementBlocks[idx] ? (0, _SCCodeGenerator.generateSCCode)(this.elementBlocks[idx].ast) : '').then(ast => {
          if (!ast) return;
          handleAst(ast);
        });
      }
    }
  });

  return wrapper;
};

SBArrayExpression.prototype.canAddChildAfter = function (child, at) {
  if (!at) return true;
  var astType = child.astType || child.type;
  return (astType.endsWith('Expression') || astType.endsWith('Literal') || astType === 'Identifier') && this.elementBlocks.indexOf(at) >= 0;
};

SBArrayExpression.prototype.addChildAfter = function (child, at) {
  var astType = child.astType || child.type;
  if (!astType.endsWith('Expression') && !astType.endsWith('Literal') && astType !== 'Identifier') return;
  var idx;
  var atElt;

  if (at) {
    idx = this.elementBlocks.indexOf(at);
    if (idx < 0) return;
    atElt = this.$elementCtn.childNodes[idx];
    this.elementBlocks.splice(idx + 1, 0, child);
  } else {
    atElt = null;
    idx = -1;
    this.elementBlocks.unshift(child);
  }

  this.$elementCtn.addChildAfter(this._makeWrapper(child), atElt);

  for (var i = idx + 1; i < this.elementBlocks.length; ++i) {
    this.$elementCtn.childNodes[i].attr('data-idx', i + '');
  }
};

Object.defineProperty(SBArrayExpression.prototype, 'ast', {
  enumerable: true,
  configurable: true,
  set: function (ast) {
    this._ast.elements = ast && ast.elements;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBArrayExpression);

var _default = SBArrayExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBObjectProperty.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBObjectProperty.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBIdentifierInput = _interopRequireDefault(require("../dom/SBIdentifierInput"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _SBStringInput = _interopRequireDefault(require("../dom/SBStringInput"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _utils = require("../dom/utils");




/***
 * @extends SBBase
 * @constructor
 */
function SBObjectProperty() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: 'ObjectProperty'
  };
  Object.defineProperties(this._ast, {
    key: {
      enumerable: true,
      set: ast => {
        ast = ast || {
          type: 'Identifier',
          name: ''
        };

        if (ast.type === 'Identifier') {
          this.elt.attr('data-key-type', 'Identifier');
          this.$identifierKey.identifierText = ast.name;
        } else {
          this.elt.attr('data-key-type', 'StringLiteral');
          this.$stringKey.value = (ast.value || '') + '';
        }
      },
      get: () => {
        if (this.elt.attr('data-key-type') === 'StringLiteral') {
          return {
            type: 'StringLiteral',
            value: this.$stringKey.value
          };
        } else {
          return {
            type: 'Identifier',
            name: this.$identifierKey.identifierText
          };
        }
      }
    },
    value: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.valueBlock = new clazz();
          this.valueBlock.ast = ast;
          this.$subCtn.clearChild().addChild(this.valueBlock.elt);
        } else {
          this.valueBlock = null;
          this.$subCtn.clearChild().addChild(this.addExpressionBlock.elt);
        }
      },
      get: () => {
        if (this.valueBlock) return this.valueBlock.ast;
        return null;
      }
    }
  });
  this.addExpressionBlock = new _SBAddExpression.default();
  this.valueBlock = null;
}

_OOP.default.mixClass(SBObjectProperty, _SBBase.default);

SBObjectProperty.prototype.astType = 'ObjectProperty';

SBObjectProperty.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    attr: {
      'data-key-type': 'Identifier'
    },
    class: 'sb-object-property',
    child: [{
      class: 'sb-object-property-key',
      child: [{
        tag: 'button',
        class: 'sb-option-btn',
        child: 'span.mdi.mdi-cog'
      }, {
        tag: _SBIdentifierInput.default
      }, 'span.mdi.mdi-format-quote-open', {
        tag: _SBStringInput.default
      }, 'span.mdi.mdi-format-quote-close', {
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: ' :'
        }
      }]
    }, {
      class: 'sb-sub-ctn',
      child: this.addExpressionBlock.elt
    }]
  });
  this.$subCtn = (0, _FCore.$)('.sb-sub-ctn', this.$elt);
  this.$optionBtn = (0, _FCore.$)('.sb-option-btn', this.$elt);
  this.$stringKey = (0, _FCore.$)(_SBStringInput.default.tag, this.$elt).on('updatesize', this.notifySizeChange.bind(this));
  /***
   *
   * @type {SBIdentifierInput}
   */

  this.$identifierKey = (0, _FCore.$)(_SBIdentifierInput.default.tag, this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$optionBtn, {
    getMenuProps: () => {
      var items = [];

      if (this.$elt.attr('data-key-type') === 'StringLiteral') {
        items.push({
          text: 'Identifier as key',
          keyType: 'Identifier',
          icon: 'span.mdi.mdi-swap-horizontal'
        });
      } else {
        items.push({
          text: 'String as key',
          keyType: 'StringLiteral',
          icon: 'span.mdi.mdi-swap-horizontal'
        });
      }

      return {
        items: items
      };
    },
    onSelect: item => {
      var prevKey;

      if (item.keyType === 'Identifier') {
        prevKey = this.$stringKey.value; // console.log(prevKey);
        // prevKey = this.
      } else if (item.keyType === 'StringLiteral') {
        prevKey = this.$identifierKey.identifierText; // console.log(prevKey);
      }

      if (item.keyType) {
        this.$elt.attr('data-key-type', item.keyType);
        this.notifySizeChange();
        this.notifyASTChange();
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$subCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$subCtn);
      if (!ok) event.cancel();
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        // console.log(ast);
        var clazz = _SBClassManager.default.get(ast.type);

        this.valueBlock = new clazz();
        this.valueBlock.ast = ast;
        this.$subCtn.clearChild().addChild(this.valueBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$subCtn, '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });
};

SBObjectProperty.prototype.getBoundingPath = function () {
  var bound = this.$elt.getBoundingClientRect();
  var sBound = this.$subCtn.getBoundingClientRect();
  var turtle = new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().hLineTo(sBound.left - bound.left).vLineBy(8).expKnop().vLineTo(bound.height - 1).hLineTo(28).statementKnop().hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).vLineTo(17).closePath();
  return turtle.getPath();
};

SBObjectProperty.prototype.removeChild = function (child) {
  if (this.valueBlock === child) {
    this.valueBlock = null;
    this.$subCtn.clearChild().addChild(this.addExpressionBlock.elt);
  }
};

Object.defineProperty(SBObjectProperty.prototype, 'ast', {
  set: function (ast) {
    this._ast.key = ast.key;
    this._ast.value = ast.value;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBObjectProperty);

var _default = SBObjectProperty;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBAddObjectProperty.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBAddObjectProperty.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBStatement = _interopRequireDefault(require("./SBStatement"));

var _FCore = require("../../core/FCore");


/**
 * @extends SBBase
 * @constructor
 */
function SBAddObjectProperty() {
  _SBBase.default.apply(this, arguments);
}

_OOP.default.mixClass(SBAddObjectProperty, _SBBase.default);

SBAddObjectProperty.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  this.$elt.addClass('sb-add-object-property');
  this.$text = (0, _FCore._)({
    tag: 'span',
    child: {
      text: "+ Add Property"
    }
  });
  this.$elt.addChild(this.$text);
};

SBAddObjectProperty.prototype.getBoundingPath = function () {
  return _SBStatement.default.prototype.getBoundingPath.call(this);
};

var _default = SBAddObjectProperty;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBObjectExpression.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBObjectExpression.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBExpression = _interopRequireDefault(require("./SBExpression"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../core/FCore");

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBObjectProperty = _interopRequireDefault(require("./SBObjectProperty"));

var _SBAddObjectProperty = _interopRequireDefault(require("./SBAddObjectProperty"));


/***
 * @extends {SBExpression}
 * @constructor
 */
function SBObjectExpression() {
  _SBExpression.default.apply(this, arguments);

  this._ast = {
    type: "ObjectExpression"
  };
  this.propertyBlocks = [];
  this.addPropertyBlock = new _SBAddObjectProperty.default();
  Object.defineProperty(this._ast, 'properties', {
    enumerable: true,
    set: astArr => {
      astArr = astArr || [];
      this.propertyBlocks = astArr.map(eAst => {
        var block = new _SBObjectProperty.default();
        block.ast = eAst;
        return block;
      });

      if (this.elt) {
        this.$subCtn.clearChild().addChild(this.propertyBlocks.map(blk => blk.elt)).addChild(this.addPropertyBlock.elt);
      }
    },
    get: () => {
      return this.propertyBlocks.map(blk => blk.ast);
    }
  });
}

_OOP.default.mixClass(SBObjectExpression, _SBExpression.default);

SBObjectExpression.prototype.astType = 'ObjectExpression';

SBObjectExpression.prototype.render = function () {
  _SBExpression.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: ['sb-object-expression'],
    child: [{
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: '{'
      }
    }, {
      class: 'sb-sub-ctn',
      child: [this.addPropertyBlock.elt]
    }, {
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: '}'
      }
    }]
  });
  this.$subCtn = (0, _FCore.$)('.sb-sub-ctn', this.$elt);
  this.addPropertyBlock.elt.on('click', () => {
    var blk = new _SBObjectProperty.default();
    this.propertyBlocks.push(blk);
    this.$subCtn.addChildBefore(blk.elt, this.addPropertyBlock.elt);
    this.notifySizeChange();
    this.notifyASTChange();
    blk.$identifierKey.focus();
  });
};

SBObjectExpression.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var bottom = bound.height - 1;
  var subBound = this.$subCtn.getBoundingClientRect();
  var turtle = new _SBTurtle.default().moveTo(0, 0).hLineTo(subBound.left + 38 - bound.left).vLineTo(subBound.top - bound.top).hLineTo(subBound.left + 28 - bound.left).statementKnop().hLineTo(subBound.left + 8 - bound.left).arcBy(8, 8, 0, 0, 0, -8, 8).vLineBy(subBound.height - 16).arcBy(8, 8, 0, 0, 0, 8, 8).hLineTo(subBound.left + 18 - bound.left).statementKnop().hLineTo(subBound.left + 38 - bound.left).vLineTo(bottom).hLineTo(0).vLineTo(17).expKnop().closePath();
  return turtle.getPath();
};

SBObjectExpression.prototype.removeChild = function (child) {
  var idx = this.propertyBlocks.indexOf(child);
  if (idx < 0) return;
  this.propertyBlocks.splice(idx, 1);
  child.elt.selfRemove();
};

SBObjectExpression.prototype.canMoveChild = function (child, direction) {
  var idx = this.propertyBlocks.indexOf(child);
  if (idx < 0) return false;
  return idx > 0 && direction === "up" || idx < this.propertyBlocks.length - 1 && direction === "down";
};

SBObjectExpression.prototype.moveChild = function (child, direction) {
  var idx = this.propertyBlocks.indexOf(child);
  if (idx < 0) return false;

  if (idx > 0 && direction === "up") {
    this.propertyBlocks.splice(idx, 1);
    this.propertyBlocks.splice(idx - 1, 0, child);
    child.elt.selfRemove();
    this.$subCtn.addChildBefore(child.elt, this.propertyBlocks[idx].elt);
  } else if (idx < this.propertyBlocks.length - 1 || direction === "down") {
    this.propertyBlocks.splice(idx, 1);
    this.propertyBlocks.splice(idx + 1, 0, child);
    child.elt.selfRemove();
    this.$subCtn.addChildAfter(child.elt, this.propertyBlocks[idx].elt);
  }
};

Object.defineProperty(SBObjectExpression.prototype, 'ast', {
  enumerable: true,
  configurable: true,
  set: function (ast) {
    this._ast.properties = ast.properties;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBObjectExpression);

var _default = SBObjectExpression;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBReturnStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBReturnStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _SBStatement = _interopRequireDefault(require("./SBStatement"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _utils = require("../dom/utils");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));




/***
 * @extends SBStatement
 * @constructor
 */
function SBReturnStatement() {
  _SBStatement.default.apply(this, arguments);

  this._ast = {
    type: 'ReturnStatement',
    argument: null
  };
  this.addExpressionBlock = new _SBAddExpression.default();
  this.argumentBlock = null;
  Object.defineProperty(this._ast, 'argument', {
    get: () => {
      var c = this.parent;

      while (c) {
        if (c.astType === 'FunctionDeclaration') break;
        c = c.parent;
      }

      if (c && c.astType === 'FunctionDeclaration' && c.functionType === 'procedure') return null;
      return this.argumentBlock && this.argumentBlock.ast || null;
    },
    set: ast => {
      var clazz, blk;

      if (ast) {
        clazz = _SBClassManager.default.get(ast.type);
        blk = new clazz();
        blk.ast = ast;
      } else {
        blk = null;
      }

      this.argumentBlock = blk;

      if (this.$elt) {
        if (blk) {
          this.$argumentCtn.clearChild().addChild(blk.elt);
        } else {
          this.$argumentCtn.clearChild().addChild(this.addExpressionBlock.elt);
        }
      }
    }
  });
}

_OOP.default.mixClass(SBReturnStatement, _SBStatement.default);

SBReturnStatement.prototype.astType = 'ReturnStatement';

SBReturnStatement.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: ['sb-block', 'sb-return-statement'],
    child: [{
      class: 'sb-return-statement-left',
      child: [{
        tag: 'span',
        class: 'sb-inline-text',
        child: {
          text: 'return '
        }
      }]
    }, {
      class: ['sb-block-sub-ctn', 'sb-return-statement-argument-ctn'],
      child: [(this.argumentBlock || this.addExpressionBlock).elt]
    }]
  });
  this.$argumentCtn = (0, _FCore.$)('.sb-return-statement-argument-ctn', this.$elt);

  _QuickMenu.default.toggleWhenClick(this.$argumentCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$argumentCtn);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        clazz = _SBClassManager.default.get(ast.type);
        this.argumentBlock = new clazz();
        this.$argumentCtn.clearChild().addChild(this.argumentBlock.elt);
        this.argumentBlock.ast = ast;
        this.notifySizeChange();
        this.notifyASTChange();
      };

      var clazz;

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$argumentCtn, '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });
};

SBReturnStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var rightBound = this.$argumentCtn.getBoundingClientRect();
  var right = rightBound.width > 0 ? rightBound.left - bound.left : bound.right - 1;
  var bottom = bound.height - 1;
  var turtle = new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).hLineTo(18).statementKnop().hLineTo(right);

  if (rightBound.width > 0) {
    turtle.vLineBy(8).expKnop();
  }

  turtle.vLineTo(bottom).hLineTo(28).statementKnop().hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).closePath();
  return turtle.getPath();
};

SBReturnStatement.prototype.removeChild = function (child) {
  if (child === this.argumentBlock) {
    child.elt.selfReplace(this.addExpressionBlock.elt);
    this.argumentBlock = null;
  }
};

Object.defineProperty(SBReturnStatement.prototype, 'ast', {
  set: function (ast) {
    this._ast.argument = ast.argument;
  },
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBReturnStatement);

var _default = SBReturnStatement;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBNullLiteral.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBNullLiteral.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBBase = _interopRequireDefault(require("./SBBase"));

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _NumberInput = _interopRequireDefault(require("absol-acomp/js/numberinput/NumberInput"));

var _FCore = require("../../core/FCore");

var _SBExpression = _interopRequireDefault(require("./SBExpression"));


/***
 * @extends SBBase
 * @constructor
 */
function SBNullLiteral() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: 'NullLiteral'
  };
}

_OOP.default.mixClass(SBNullLiteral, _SBBase.default);

SBNullLiteral.prototype.astType = 'NullLiteral';

SBNullLiteral.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-null-literal',
    child: {
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'null'
      }
    }
  });
};

SBNullLiteral.prototype.getBoundingPath = _SBExpression.default.prototype.getBoundingPath;
Object.defineProperty(SBNullLiteral.prototype, 'ast', {
  set: function (ast) {},
  get: function () {
    return this._ast;
  }
});

_SBClassManager.default.add(SBNullLiteral);

var _default = SBNullLiteral;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBForOfStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBForOfStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _FCore = require("../../core/FCore");

var _SBAddReferent = _interopRequireDefault(require("./SBAddReferent"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBAddStatement = _interopRequireDefault(require("./SBAddStatement"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBWhileStatement = _interopRequireDefault(require("./SBWhileStatement"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _SCProgramInstance = require("absol/src/SCLang/SCProgramInstance");

var _utils = require("../dom/utils");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");

var _utils2 = require("../engine/utils");




/***
 * @extends SBBase
 * @constructor
 */
function SBForOfStatement() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: this.astType
  };
  this.forBlock = null;
  this.ofBlock = null;
  this.doBlocks = [];
  this.addForIdentBlock = new _SBAddReferent.default();
  this.addOfExpressionBlock = new _SBAddExpression.default();
  this.addStatementBlock = new _SBAddStatement.default();

  this._astBinding();
}

_OOP.default.mixClass(SBForOfStatement, _SBBase.default);

SBForOfStatement.prototype.astType = 'ForOfStatement';
SBForOfStatement.prototype.removeDoChild = _SBWhileStatement.default.prototype.removeDoChild;
SBForOfStatement.prototype.canMoveChild = _SBWhileStatement.default.prototype.canMoveChild;
SBForOfStatement.prototype.moveChild = _SBWhileStatement.default.prototype.moveChild;
SBForOfStatement.prototype.removeChild = _SBWhileStatement.default.prototype.removeChild;

SBForOfStatement.prototype.removeChild = function (child) {
  this.removeDoChild(child);

  if (child === this.forBlock) {
    this.forBlock = null;
    this.$forCtn.clearChild().addChild(this.addForIdentBlock.elt);
  } else if (child === this.ofBlock) {
    this.ofBlock = null;
    this.$ofCtn.clearChild().addChild(this.addOfExpressionBlock.elt);
  }
};

SBForOfStatement.prototype.getLocalVariableSelection = function () {
  var variables = this.getVariables();
  var res = [];
  Object.keys(variables).filter(name => {
    var va = variables[name];

    if (va.type === 'any' || va.type === 'number') {
      return true;
    }

    if (va.type && va.type.type === 'GenericType' && (va.type.id.name === 'number' || va.type.id.name === 'any')) return true;
    if (_SCProgramInstance.SCStaticLibScope.findScope(name) || _SCProgramInstance.SCDynamicLibScope.findScope(name)) return false;
    return true; // var desc = SCTypeManager.detectTypeDescriptorOf(va.type);
  }).forEach(key => {
    res.push({
      text: key,
      variable: variables[key]
    });
  });
  return res;
};

SBForOfStatement.prototype._astBinding = function () {
  Object.defineProperties(this._ast, {
    for: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.forBlock = new clazz();
          this.forBlock.ast = ast;

          if (this.$forCtn) {
            this.$forCtn.clearChild().addChild(this.forBlock.elt);
          }
        } else if (this.forBlock) {
          this.forBlock = null;

          if (this.$forCtn) {
            this.$forCtn.clearChild().addChild(this.addForIdentBlock.elt);
          }
        }
      },
      get: () => this.forBlock ? this.forBlock.ast : null
    },
    of: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.ofBlock = new clazz();
          this.ofBlock.ast = ast;

          if (this.$ofCtn) {
            this.$ofCtn.clearChild().addChild(this.ofBlock.elt);
          }
        } else if (this.forBlock) {
          this.ofBlock = null;

          if (this.$ofCtn) {
            this.$ofCtn.clearChild().addChild(this.addOfExpressionBlock.elt);
          }
        }
      },
      get: () => this.ofBlock ? this.ofBlock.ast : null
    },
    body: {
      enumerable: true,
      set: ast => {
        if (!ast) {
          ast = {
            type: 'BlockStatement',
            body: []
          };
        } else if (ast.type !== 'BlockStatement') {
          ast = {
            type: 'BlockStatement',
            body: [ast]
          };
        }

        this.doBlocks = ast.body.map(sAst => {
          var clazz = _SBClassManager.default.get(sAst.type);

          var block = new clazz();
          block.ast = sAst;
          return block;
        });

        if (this.elt) {
          //call getter
          this.$doCtn.clearChild().addChild(this.doBlocks.map(blk => blk.elt)).addChild(this.addStatementBlock.elt);
        }
      },
      get: () => ({
        type: 'BlockStatement',
        body: this.doBlocks.map(blk => blk.ast)
      })
    }
  });
};

SBForOfStatement.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-for-of-statement',
    child: [{
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'for item'
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-of-statement-for-ctn'],
      child: this.forBlock ? this.forBlock.elt : this.addForIdentBlock.elt
    }, {
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'of'
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-of-statement-of-ctn'],
      child: this.ofBlock ? this.ofBlock.elt : this.addOfExpressionBlock.elt
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-of-statement-body-ctn'],
      child: [this.addStatementBlock.elt]
    }]
  });
  this.$forCtn = (0, _FCore.$)('.sb-for-of-statement-for-ctn', this.$elt);
  this.$ofCtn = (0, _FCore.$)('.sb-for-of-statement-of-ctn', this.$elt);
  this.$bodyCtn = (0, _FCore.$)('.sb-for-of-statement-body-ctn', this.$elt);
  this.$doCtn = this.$bodyCtn;

  _QuickMenu.default.toggleWhenClick(this.$forCtn, {
    getMenuProps: () => {
      return {
        items: this.getLocalVariableSelection()
      };
    },
    onSelect: item => {
      var clazz;

      if (item.variable) {
        clazz = _SBClassManager.default.get('Identifier');
        this.forBlock = new clazz();
        this.forBlock.ast = item.variable.id;
        this.$forCtn.clearChild().addChild(this.forBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$ofCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addOfExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$ofCtn);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        this.ofBlock = new clazz();
        this.$ofCtn.clearChild().addChild(this.ofBlock.elt);
        this.ofBlock.ast = ast;
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.ofBlock && this.ofBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$ofCtn, this.ofBlock ? (0, _SCCodeGenerator.generateSCCode)(this.ofBlock.ast) : '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.addStatementBlock.elt, {
    getMenuProps: () => ({
      items: this.getStatementTypeSelection()
    }),
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        var block = new clazz();
        block.ast = ast;
        this.$doCtn.addChildBefore(block.elt, this.addStatementBlock.elt);
        this.doBlocks.push(block);
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openStatementInputDialog)(this.addStatementBlock.elt, '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });
};

SBForOfStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var forBound = this.$forCtn.getBoundingClientRect();
  var bodyBound = this.$bodyCtn.getBoundingClientRect();
  var ofBound = this.$ofCtn.getBoundingClientRect();
  return new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().hLineTo(bound.width - 1).vLineTo(bodyBound.top - bound.top).hLineTo(bodyBound.left - bound.left + 28).statementKnop().hLineTo(bodyBound.left - bound.left + 8).arcBy(8, 8, 0, 0, 0, -8, 8).vLineBy(bodyBound.height - 16).arcBy(8, 8, 0, 0, 0, 8, 8).hLineTo(bound.width).vLineTo(bound.height).hLineTo(28).statementKnop().hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).closePath().expBound(forBound.left - bound.left, forBound.top - bound.top, forBound.width, forBound.height).expBound(ofBound.left - bound.left, ofBound.top - bound.top, ofBound.width, ofBound.height).getPath();
};

Object.defineProperty(SBForOfStatement.prototype, 'ast', {
  set: function (ast) {
    this.ast.for = ast.for;
    this.ast.of = ast.of;
    this.ast.body = ast.body;
  },
  get: function () {
    return this._ast;
  }
});
var _default = SBForOfStatement;
exports.default = _default;

_SBClassManager.default.add(SBForOfStatement);
};

moduleFactories["node_modules/absol-form/js/sclang/blockly/SBForInStatement.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/blockly/SBForInStatement.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SBClassManager = _interopRequireDefault(require("./SBClassManager"));

var _SBBase = _interopRequireWildcard(require("./SBBase"));

var _FCore = require("../../core/FCore");

var _SBAddReferent = _interopRequireDefault(require("./SBAddReferent"));

var _SBAddExpression = _interopRequireDefault(require("./SBAddExpression"));

var _SBAddStatement = _interopRequireDefault(require("./SBAddStatement"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _SBTurtle = _interopRequireDefault(require("./SBTurtle"));

var _SBWhileStatement = _interopRequireDefault(require("./SBWhileStatement"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _utils = require("../dom/utils");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");

var _SBForOfStatement = _interopRequireDefault(require("./SBForOfStatement"));

var _utils2 = require("../engine/utils");




/***
 * @extends SBBase
 * @constructor
 */
function SBForInStatement() {
  _SBBase.default.apply(this, arguments);

  this._ast = {
    type: this.astType
  };
  this.forBlock = null;
  this.inBlock = null;
  this.doBlocks = [];
  this.addForIdentBlock = new _SBAddReferent.default();
  this.addOfExpressionBlock = new _SBAddExpression.default();
  this.addStatementBlock = new _SBAddStatement.default();

  this._astBinding();
}

_OOP.default.mixClass(SBForInStatement, _SBBase.default);

SBForInStatement.prototype.astType = 'ForInStatement';
SBForInStatement.prototype.removeDoChild = _SBWhileStatement.default.prototype.removeDoChild;
SBForInStatement.prototype.canMoveChild = _SBWhileStatement.default.prototype.canMoveChild;
SBForInStatement.prototype.moveChild = _SBWhileStatement.default.prototype.moveChild;
SBForInStatement.prototype.removeChild = _SBWhileStatement.default.prototype.removeChild;

SBForInStatement.prototype.removeChild = function (child) {
  this.removeDoChild(child);

  if (child === this.forBlock) {
    this.forBlock = null;
    this.$forCtn.clearChild().addChild(this.addForIdentBlock.elt);
  } else if (child === this.inBlock) {
    this.inBlock = null;
    this.$inCtn.clearChild().addChild(this.addOfExpressionBlock.elt);
  }
};

SBForInStatement.prototype.getLocalVariableSelection = _SBForOfStatement.default.prototype.getLocalVariableSelection;

SBForInStatement.prototype._astBinding = function () {
  Object.defineProperties(this._ast, {
    for: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.forBlock = new clazz();
          this.forBlock.ast = ast;

          if (this.$forCtn) {
            this.$forCtn.clearChild().addChild(this.forBlock.elt);
          }
        } else if (this.forBlock) {
          this.forBlock = null;

          if (this.$forCtn) {
            this.$forCtn.clearChild().addChild(this.addForIdentBlock.elt);
          }
        }
      },
      get: () => this.forBlock ? this.forBlock.ast : null
    },
    in: {
      enumerable: true,
      set: ast => {
        var clazz;

        if (ast) {
          clazz = _SBClassManager.default.get(ast.type);
          this.inBlock = new clazz();
          this.inBlock.ast = ast;

          if (this.$inCtn) {
            this.$inCtn.clearChild().addChild(this.inBlock.elt);
          }
        } else if (this.forBlock) {
          this.inBlock = null;

          if (this.$inCtn) {
            this.$inCtn.clearChild().addChild(this.addOfExpressionBlock.elt);
          }
        }
      },
      get: () => this.inBlock ? this.inBlock.ast : null
    },
    body: {
      enumerable: true,
      set: ast => {
        if (!ast) {
          ast = {
            type: 'BlockStatement',
            body: []
          };
        } else if (ast.type !== 'BlockStatement') {
          ast = {
            type: 'BlockStatement',
            body: [ast]
          };
        }

        this.doBlocks = ast.body.map(sAst => {
          var clazz = _SBClassManager.default.get(sAst.type);

          var block = new clazz();
          block.ast = sAst;
          return block;
        });

        if (this.elt) {
          //call getter
          this.$doCtn.clearChild().addChild(this.doBlocks.map(blk => blk.elt)).addChild(this.addStatementBlock.elt);
        }
      },
      get: () => ({
        type: 'BlockStatement',
        body: this.doBlocks.map(blk => blk.ast)
      })
    }
  });
};

SBForInStatement.prototype.render = function () {
  _SBBase.default.prototype.render.call(this);

  (0, _FCore._)({
    elt: this.$elt,
    class: 'sb-for-in-statement',
    child: [{
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'for key'
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-in-statement-for-ctn'],
      child: this.forBlock ? this.forBlock.elt : this.addForIdentBlock.elt
    }, {
      tag: 'span',
      class: 'sb-inline-text',
      child: {
        text: 'in'
      }
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-in-statement-in-ctn'],
      child: this.inBlock ? this.inBlock.elt : this.addOfExpressionBlock.elt
    }, {
      class: ['sb-block-sub-ctn', 'sb-for-in-statement-body-ctn'],
      child: [this.addStatementBlock.elt]
    }]
  });
  this.$forCtn = (0, _FCore.$)('.sb-for-in-statement-for-ctn', this.$elt);
  this.$inCtn = (0, _FCore.$)('.sb-for-in-statement-in-ctn', this.$elt);
  this.$bodyCtn = (0, _FCore.$)('.sb-for-in-statement-body-ctn', this.$elt);
  this.$doCtn = this.$bodyCtn;

  _QuickMenu.default.toggleWhenClick(this.$forCtn, {
    getMenuProps: () => {
      return {
        items: this.getLocalVariableSelection()
      };
    },
    onSelect: item => {
      var clazz;

      if (item.variable) {
        clazz = _SBClassManager.default.get('Identifier');
        this.forBlock = new clazz();
        this.forBlock.ast = item.variable.id;
        this.$forCtn.clearChild().addChild(this.forBlock.elt);
        this.notifySizeChange();
        this.notifyASTChange();
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.$inCtn, {
    onClick: event => {
      var ok = (0, _EventEmitter.hitElement)(this.addOfExpressionBlock.elt, event);
      ok = ok || (0, _SBBase.isBoundOfChild)(event.target, this.$inCtn);

      if (!ok) {
        event.cancel();
      }
    },
    getMenuProps: () => {
      return {
        items: this.getExpressionTypeSelection()
      };
    },
    onSelect: item => {
      var handleAst = ast => {
        var clazz;
        clazz = _SBClassManager.default.get(ast.type);
        this.inBlock = new clazz();
        this.$inCtn.clearChild().addChild(this.inBlock.elt);
        this.inBlock.ast = ast;
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst((0, _utils2.autoMigrateAst)(this.inBlock && this.inBlock.ast, {
          type: item.astType
        }));
      } else if (item.variable) {
        handleAst(Object.assign({
          type: 'Identifier'
        }, item.variable.id));
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openExpressionInputDialog)(this.$inCtn, this.inBlock ? (0, _SCCodeGenerator.generateSCCode)(this.inBlock.ast) : '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });

  _QuickMenu.default.toggleWhenClick(this.addStatementBlock.elt, {
    getMenuProps: () => ({
      items: this.getStatementTypeSelection()
    }),
    onSelect: item => {
      var handleAst = ast => {
        var clazz = _SBClassManager.default.get(ast.type);

        var block = new clazz();
        block.ast = ast;
        this.$doCtn.addChildBefore(block.elt, this.addStatementBlock.elt);
        this.doBlocks.push(block);
        this.notifySizeChange();
        this.notifyASTChange();
      };

      if (item.astType) {
        handleAst({
          type: item.astType
        });
      } else if (item.cmd === 'parse_text') {
        (0, _utils.openStatementInputDialog)(this.addStatementBlock.elt, '').then(ast => {
          if (ast) handleAst(ast);
        });
      }
    }
  });
};

SBForInStatement.prototype.getBoundingPath = function () {
  var bound = this.bound;
  var forBound = this.$forCtn.getBoundingClientRect();
  var bodyBound = this.$bodyCtn.getBoundingClientRect();
  var ofBound = this.$inCtn.getBoundingClientRect();
  return new _SBTurtle.default().moveTo(0, 8).arcTo(8, 8, 0, 0, 1, 8, 0).lineTo(18, 0).statementKnop().hLineTo(bound.width - 1).vLineTo(bodyBound.top - bound.top).hLineTo(bodyBound.left - bound.left + 28).statementKnop().hLineTo(bodyBound.left - bound.left + 8).arcBy(8, 8, 0, 0, 0, -8, 8).vLineBy(bodyBound.height - 16).arcBy(8, 8, 0, 0, 0, 8, 8).hLineTo(bound.width).vLineTo(bound.height).hLineTo(28).statementKnop().hLineTo(8).arcBy(8, 8, 0, 0, 1, -8, -8).closePath().expBound(forBound.left - bound.left, forBound.top - bound.top, forBound.width, forBound.height).expBound(ofBound.left - bound.left, ofBound.top - bound.top, ofBound.width, ofBound.height).getPath();
};

Object.defineProperty(SBForInStatement.prototype, 'ast', {
  set: function (ast) {
    this.ast.for = ast.for;
    this.ast.in = ast.in;
    this.ast.body = ast.body;
  },
  get: function () {
    return this._ast;
  }
});
var _default = SBForInStatement;
exports.default = _default;

_SBClassManager.default.add(SBForInStatement);
};

moduleFactories["node_modules/absol-form/js/sclang/editor/ACESCLangMode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/ACESCLangMode.js ***/
"use strict";

var _SCProgramInstance = require("absol/src/SCLang/SCProgramInstance");

if ('ace' in window) {
  ace.define('ace/mode/sclang', ['require', 'exports', 'ace/lib/oop', 'ace/mode/text', 'ace/mode/custom_highlight_rules'], (acequire, exports) => {
    const oop = acequire('ace/lib/oop');
    const TextMode = acequire('ace/mode/text').Mode;
    const SCLangHighlightRules = acequire('ace/mode/sclang_highlight_rules').SCLangHighlightRules;

    let Mode = function () {
      // this ensures that all your highlight rules are set for your custom mode
      this.HighlightRules = SCLangHighlightRules;
    };

    oop.inherits(Mode, TextMode); // ACE's way of doing inheritance

    exports.Mode = Mode; // eslint-disable-line no-param-reassign
  }); // This is where we really create the highlighting rules

  ace.define('ace/mode/sclang_highlight_rules', ['require', 'exports', 'ace/lib/oop', 'ace/mode/text_highlight_rules'], (acequire, exports) => {
    "use strict";

    var oop = acequire('ace/lib/oop');
    var DocCommentHighlightRules = acequire("./doc_comment_highlight_rules").DocCommentHighlightRules;
    var TextHighlightRules = acequire("./text_highlight_rules").TextHighlightRules; // TODO: Unicode escape sequences

    var identifierRe = "[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*";

    var SCLangHighlightRules = function (options) {
      // see: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects
      console.log(_SCProgramInstance.SCStaticLibScope);
      var keywordMapper = this.createKeywordMapper({
        "variable.language": Object.keys(_SCProgramInstance.SCStaticLibScope.data).concat(Object.keys(_SCProgramInstance.SCDynamicLibScope)).join('|'),
        // Pseudo
        "keyword": "const|yield|import|get|set|async|await|" + "break|case|catch|continue|default|delete|do|else|finally|linktype|for|from|to|function|" + "if|in|of|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|" + // invalid or reserved
        "__parent__|__count__|escape|unescape|with|__proto__|" + "class|enum|extends|super|export|implements|private|public|interface|package|protected|static|constructor",
        "storage.type": "const|let|var|function",
        "constant.language": "null|Infinity|NaN|undefined",
        "support.function": "alert",
        "constant.language.boolean": "true|false"
      }, "identifier"); // keywords which can be followed by regular expressions

      var kwBeforeRe = "case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void";
      var escapedRe = "\\\\(?:x[0-9a-fA-F]{2}|" + // hex
      "u[0-9a-fA-F]{4}|" + // unicode
      "u{[0-9a-fA-F]{1,6}}|" + // es6 unicode
      "[0-2][0-7]{0,2}|" + // oct
      "3[0-7][0-7]?|" + // oct
      "[4-7][0-7]?|" + //oct
      ".)"; // regexp must not have capturing parentheses. Use (?:) instead.
      // regexps are ordered -> the first match is used

      this.$rules = {
        "no_regex": [DocCommentHighlightRules.getStartRule("doc-start"), comments("no_regex"), {
          token: "string",
          regex: "'(?=.)",
          next: "qstring"
        }, {
          token: "string",
          regex: '"(?=.)',
          next: "qqstring"
        }, {
          token: "constant.numeric",
          // hexadecimal, octal and binary
          regex: /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/
        }, {
          token: "constant.numeric",
          // decimal integers and floats
          regex: /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/
        }, {
          // Sound.prototype.play =
          token: ["storage.type", "punctuation.operator", "support.function", "punctuation.operator", "entity.name.function", "text", "keyword.operator"],
          regex: "(" + identifierRe + ")(\\.)(prototype)(\\.)(" + identifierRe + ")(\\s*)(=)",
          next: "function_arguments"
        }, {
          // Sound.play = function() {  }
          token: ["storage.type", "punctuation.operator", "entity.name.function", "text", "keyword.operator", "text", "storage.type", "text", "paren.lparen"],
          regex: "(" + identifierRe + ")(\\.)(" + identifierRe + ")(\\s*)(=)(\\s*)(function\\*?)(\\s*)(\\()",
          next: "function_arguments"
        }, {
          // play = function() {  }
          token: ["entity.name.function", "text", "keyword.operator", "text", "storage.type", "text", "paren.lparen"],
          regex: "(" + identifierRe + ")(\\s*)(=)(\\s*)(function\\*?)(\\s*)(\\()",
          next: "function_arguments"
        }, {
          // Sound.play = function play() {  }
          token: ["storage.type", "punctuation.operator", "entity.name.function", "text", "keyword.operator", "text", "storage.type", "text", "entity.name.function", "text", "paren.lparen"],
          regex: "(" + identifierRe + ")(\\.)(" + identifierRe + ")(\\s*)(=)(\\s*)(function\\*?)(\\s+)(\\w+)(\\s*)(\\()",
          next: "function_arguments"
        }, {
          // function myFunc(arg) { }
          token: ["storage.type", "text", "entity.name.function", "text", "paren.lparen"],
          regex: "(function\\*?)(\\s+)(" + identifierRe + ")(\\s*)(\\()",
          next: "function_arguments"
        }, {
          // foobar: function() { }
          token: ["entity.name.function", "text", "punctuation.operator", "text", "storage.type", "text", "paren.lparen"],
          regex: "(" + identifierRe + ")(\\s*)(:)(\\s*)(function\\*?)(\\s*)(\\()",
          next: "function_arguments"
        }, {
          // : function() { } (this is for issues with 'foo': function() { })
          token: ["text", "text", "storage.type", "text", "paren.lparen"],
          regex: "(:)(\\s*)(function\\*?)(\\s*)(\\()",
          next: "function_arguments"
        }, {
          // from "module-path" (this is the only case where 'from' should be a keyword)
          token: "keyword",
          regex: "from(?=\\s*('|\"))"
        }, {
          token: "keyword",
          regex: "(?:" + kwBeforeRe + ")\\b",
          next: "start"
        }, {
          token: "support.constant",
          regex: /that\b/
        }, {
          token: ["storage.type", "punctuation.operator", "support.function.firebug"],
          regex: /(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/
        }, {
          token: keywordMapper,
          regex: identifierRe
        }, {
          token: "punctuation.operator",
          regex: /[.](?![.])/,
          next: "property"
        }, {
          token: "storage.type",
          regex: /=>/,
          next: "start"
        }, {
          token: "keyword.operator",
          regex: /--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?:|[!$%&*+\-~\/^]=?/,
          next: "start"
        }, {
          token: "punctuation.operator",
          regex: /[?:,;.]/,
          next: "start"
        }, {
          token: "paren.lparen",
          regex: /[\[({]/,
          next: "start"
        }, {
          token: "paren.rparen",
          regex: /[\])}]/
        }, {
          token: "comment",
          regex: /^#!.*$/
        }],
        property: [{
          token: "text",
          regex: "\\s+"
        }, {
          // Sound.play = function play() {  }
          token: ["storage.type", "punctuation.operator", "entity.name.function", "text", "keyword.operator", "text", "storage.type", "text", "entity.name.function", "text", "paren.lparen"],
          regex: "(" + identifierRe + ")(\\.)(" + identifierRe + ")(\\s*)(=)(\\s*)(function\\*?)(?:(\\s+)(\\w+))?(\\s*)(\\()",
          next: "function_arguments"
        }, {
          token: "punctuation.operator",
          regex: /[.](?![.])/
        }, {
          token: "support.function",
          regex: /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|lter|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward|rEach)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/
        }, {
          token: "support.function.dom",
          regex: /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/
        }, {
          token: "support.constant",
          regex: /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/
        }, {
          token: "identifier",
          regex: identifierRe
        }, {
          regex: "",
          token: "empty",
          next: "no_regex"
        }],
        // regular expressions are only allowed after certain tokens. This
        // makes sure we don't mix up regexps with the divison operator
        "start": [DocCommentHighlightRules.getStartRule("doc-start"), comments("start"), {
          token: "string.regexp",
          regex: "\\/",
          next: "regex"
        }, {
          token: "text",
          regex: "\\s+|^$",
          next: "start"
        }, {
          // immediately return to the start mode without matching
          // anything
          token: "empty",
          regex: "",
          next: "no_regex"
        }],
        "regex": [{
          // escapes
          token: "regexp.keyword.operator",
          regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
        }, {
          // flag
          token: "string.regexp",
          regex: "/[sxngimy]*",
          next: "no_regex"
        }, {
          // invalid operators
          token: "invalid",
          regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/
        }, {
          // operators
          token: "constant.language.escape",
          regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/
        }, {
          token: "constant.language.delimiter",
          regex: /\|/
        }, {
          token: "constant.language.escape",
          regex: /\[\^?/,
          next: "regex_character_class"
        }, {
          token: "empty",
          regex: "$",
          next: "no_regex"
        }, {
          defaultToken: "string.regexp"
        }],
        "regex_character_class": [{
          token: "regexp.charclass.keyword.operator",
          regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"
        }, {
          token: "constant.language.escape",
          regex: "]",
          next: "regex"
        }, {
          token: "constant.language.escape",
          regex: "-"
        }, {
          token: "empty",
          regex: "$",
          next: "no_regex"
        }, {
          defaultToken: "string.regexp.charachterclass"
        }],
        "default_parameter": [{
          token: "string",
          regex: "'(?=.)",
          push: [{
            token: "string",
            regex: "'|$",
            next: "pop"
          }, {
            include: "qstring"
          }]
        }, {
          token: "string",
          regex: '"(?=.)',
          push: [{
            token: "string",
            regex: '"|$',
            next: "pop"
          }, {
            include: "qqstring"
          }]
        }, {
          token: "constant.language",
          regex: "null|Infinity|NaN|undefined"
        }, {
          token: "constant.numeric",
          // hexadecimal, octal and binary
          regex: /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\b/
        }, {
          token: "constant.numeric",
          // decimal integers and floats
          regex: /(?:\d\d*(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+\b)?/
        }, {
          token: "punctuation.operator",
          regex: ",",
          next: "function_arguments"
        }, {
          token: "text",
          regex: "\\s+"
        }, {
          token: "punctuation.operator",
          regex: "$"
        }, {
          token: "empty",
          regex: "",
          next: "no_regex"
        }],
        "function_arguments": [comments("function_arguments"), {
          token: "variable.parameter",
          regex: identifierRe
        }, {
          token: "punctuation.operator",
          regex: ","
        }, {
          token: "text",
          regex: "\\s+"
        }, {
          token: "punctuation.operator",
          regex: "$"
        }, {
          token: "empty",
          regex: "",
          next: "no_regex"
        }],
        "qqstring": [{
          token: "constant.language.escape",
          regex: escapedRe
        }, {
          token: "string",
          regex: "\\\\$",
          consumeLineEnd: true
        }, {
          token: "string",
          regex: '"|$',
          next: "no_regex"
        }, {
          defaultToken: "string"
        }],
        "qstring": [{
          token: "constant.language.escape",
          regex: escapedRe
        }, {
          token: "string",
          regex: "\\\\$",
          consumeLineEnd: true
        }, {
          token: "string",
          regex: "'|$",
          next: "no_regex"
        }, {
          defaultToken: "string"
        }]
      };

      if (!options || !options.noES6) {
        this.$rules.no_regex.unshift({
          regex: "[{}]",
          onMatch: function (val, state, stack) {
            this.next = val == "{" ? this.nextState : "";

            if (val == "{" && stack.length) {
              stack.unshift("start", state);
            } else if (val == "}" && stack.length) {
              stack.shift();
              this.next = stack.shift();
              if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) return "paren.quasi.end";
            }

            return val == "{" ? "paren.lparen" : "paren.rparen";
          },
          nextState: "start"
        }, {
          token: "string.quasi.start",
          regex: /`/,
          push: [{
            token: "constant.language.escape",
            regex: escapedRe
          }, {
            token: "paren.quasi.start",
            regex: /\${/,
            push: "start"
          }, {
            token: "string.quasi.end",
            regex: /`/,
            next: "pop"
          }, {
            defaultToken: "string.quasi"
          }]
        }, {
          token: ["variable.parameter", "text"],
          regex: "(" + identifierRe + ")(\\s*)(?=\\=>)"
        }, {
          token: "paren.lparen",
          regex: "(\\()(?=.+\\s*=>)",
          next: "function_arguments"
        }, {
          token: "variable.language",
          regex: "(?:(?:(?:Weak)?(?:Set|Map))|Promise)\\b"
        });
        this.$rules["function_arguments"].unshift({
          token: "keyword.operator",
          regex: "=",
          next: "default_parameter"
        }, {
          token: "keyword.operator",
          regex: "\\.{3}"
        });
        this.$rules["property"].unshift({
          token: "support.function",
          regex: "(findIndex|repeat|startsWith|endsWith|includes|isSafeInteger|trunc|cbrt|log2|log10|sign|then|catch|" + "finally|resolve|reject|race|any|all|allSettled|keys|entries|isInteger)\\b(?=\\()"
        }, {
          token: "constant.language",
          regex: "(?:MAX_SAFE_INTEGER|MIN_SAFE_INTEGER|EPSILON)\\b"
        });
        if (!options || options.jsx != false) JSX.call(this);
      }

      this.embedRules(DocCommentHighlightRules, "doc-", [DocCommentHighlightRules.getEndRule("no_regex")]);
      this.normalizeRules();
    };

    oop.inherits(SCLangHighlightRules, TextHighlightRules);

    function JSX() {
      var tagRegex = identifierRe.replace("\\d", "\\d\\-");
      var jsxTag = {
        onMatch: function (val, state, stack) {
          var offset = val.charAt(1) == "/" ? 2 : 1;

          if (offset == 1) {
            if (state != this.nextState) stack.unshift(this.next, this.nextState, 0);else stack.unshift(this.next);
            stack[2]++;
          } else if (offset == 2) {
            if (state == this.nextState) {
              stack[1]--;

              if (!stack[1] || stack[1] < 0) {
                stack.shift();
                stack.shift();
              }
            }
          }

          return [{
            type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml",
            value: val.slice(0, offset)
          }, {
            type: "meta.tag.tag-name.xml",
            value: val.substr(offset)
          }];
        },
        regex: "</?" + tagRegex + "",
        next: "jsxAttributes",
        nextState: "jsx"
      };
      this.$rules.start.unshift(jsxTag);
      var jsxJsRule = {
        regex: "{",
        token: "paren.quasi.start",
        push: "start"
      };
      this.$rules.jsx = [jsxJsRule, jsxTag, {
        include: "reference"
      }, {
        defaultToken: "string"
      }];
      this.$rules.jsxAttributes = [{
        token: "meta.tag.punctuation.tag-close.xml",
        regex: "/?>",
        onMatch: function (value, currentState, stack) {
          if (currentState == stack[0]) stack.shift();

          if (value.length == 2) {
            if (stack[0] == this.nextState) stack[1]--;

            if (!stack[1] || stack[1] < 0) {
              stack.splice(0, 2);
            }
          }

          this.next = stack[0] || "start";
          return [{
            type: this.token,
            value: value
          }];
        },
        nextState: "jsx"
      }, jsxJsRule, comments("jsxAttributes"), {
        token: "entity.other.attribute-name.xml",
        regex: tagRegex
      }, {
        token: "keyword.operator.attribute-equals.xml",
        regex: "="
      }, {
        token: "text.tag-whitespace.xml",
        regex: "\\s+"
      }, {
        token: "string.attribute-value.xml",
        regex: "'",
        stateName: "jsx_attr_q",
        push: [{
          token: "string.attribute-value.xml",
          regex: "'",
          next: "pop"
        }, {
          include: "reference"
        }, {
          defaultToken: "string.attribute-value.xml"
        }]
      }, {
        token: "string.attribute-value.xml",
        regex: '"',
        stateName: "jsx_attr_qq",
        push: [{
          token: "string.attribute-value.xml",
          regex: '"',
          next: "pop"
        }, {
          include: "reference"
        }, {
          defaultToken: "string.attribute-value.xml"
        }]
      }, jsxTag];
      this.$rules.reference = [{
        token: "constant.language.escape.reference.xml",
        regex: "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"
      }];
    }

    function comments(next) {
      return [{
        token: "comment",
        // multi line comment
        regex: /\/\*/,
        next: [DocCommentHighlightRules.getTagRule(), {
          token: "comment",
          regex: "\\*\\/",
          next: next || "pop"
        }, {
          defaultToken: "comment",
          caseInsensitive: true
        }]
      }, {
        token: "comment",
        regex: "\\/\\/",
        next: [DocCommentHighlightRules.getTagRule(), {
          token: "comment",
          regex: "$|^",
          next: next || "pop"
        }, {
          defaultToken: "comment",
          caseInsensitive: true
        }]
      }];
    }

    exports.SCLangHighlightRules = SCLangHighlightRules;
  });
}
};

moduleFactories["node_modules/absol-form/js/sclang/editor/SCBlocklyEditorCmd.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/SCBlocklyEditorCmd.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _R = _interopRequireDefault(require("../../R"));

var _FileSaver = require("absol/src/Network/FileSaver");

var _utils = require("absol-acomp/js/utils");

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));

var _Modal = _interopRequireDefault(require("absol-acomp/js/Modal"));

var _FCore = require("../../core/FCore");

var _Snackbar = _interopRequireDefault(require("absol-acomp/js/Snackbar"));

var _SCCodeGenerator = require("absol/src/SCLang/SCCodeGenerator");

var _MessageDialog = _interopRequireDefault(require("absol-acomp/js/MessageDialog"));

var _SCParser = _interopRequireDefault(require("absol/src/SCLang/SCParser"));


var SCBlocklyEditorCmd = {};
/***
 * @this {SCBlocklyEditor}
 */

SCBlocklyEditorCmd.delete = function () {
  var blocks = this.selectTool.selectedBlocks.slice();
  this.selectTool.deselectAll();
  blocks.forEach(blk => {
    blk.remove();
  });
  if (this.rootNode) this.rootNode.notifySizeChange();
  this.notifyASTChange();
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.save = function () {
  var task = this.getContext(_R.default.TASK);
  if (task) task.save();
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.export2Json = function () {
  var data = this.getAST();
  var json = JSON.stringify(data, null, 4);
  var name = "export.json";
  var task = this.getContext(_R.default.TASK);
  if (task) name = task.taskName;
  (0, _FileSaver.saveTextAs)(json, name + '.json');
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.importFromFile = function () {
  (0, _utils.openFileDialog)({
    accept: 'application/JSON'
  }).then(result => {
    var file;

    if (result && result.length > 0) {
      file = result[0];
      var reader = new FileReader();

      reader.onload = () => {
        try {
          var data = JSON.parse(reader.result.toString()); //todo: verify data

          this.setAST(data);
          this.notifyASTChange();
        } catch (error) {
          (0, _safeThrow.default)(error);
        }
      };

      reader.readAsText(file);
    }
  });
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.moveUp = function () {
  var blocks = this.selectTool.selectedBlocks;
  if (blocks.length !== 1) return;
  blocks[0].move('up');
  if (this.rootNode) this.rootNode.notifySizeChange();
  this.notifyASTChange();
  this.notifyCmdDescriptorsChange();
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.moveDown = function () {
  var blocks = this.selectTool.selectedBlocks;
  if (blocks.length !== 1) return;
  blocks[0].move('down');
  if (this.rootNode) this.rootNode.notifySizeChange();
  this.notifyASTChange();
  this.notifyCmdDescriptorsChange();
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.copy = function () {
  this.clipboard.copy();
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.cut = function () {
  this.clipboard.cut();
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.viewClipboard = function () {
  this.clipboard.viewContent();
};
/***
 * @this {SCBlocklyEditor}
 * @param place
 */


SCBlocklyEditorCmd.pasteSCBlock = function (place) {
  switch (place) {
    case 'IN':
      this.clipboard.pasteIn();
      break;

    case 'BEFORE':
      this.clipboard.pasteBefore();
      break;

    case 'AFTER':
      this.clipboard.pasteAfter();
      break;
  }

  if (this.rootNode) this.rootNode.notifySizeChange();
  this.notifyASTChange();
  this.notifyCmdDescriptorsChange();
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.scrollIntoBlock = function () {
  this.viewportCtrl.reset();
};
/***
 * @this {SCBlocklyEditor}
 */


SCBlocklyEditorCmd.editAsSCLang = function () {
  if (!window['ace']) {
    _Snackbar.default.show("Could not find ACE module!");
  }
  /***
   * @type {MessageDialog}
   */


  var dialog = (0, _FCore._)({
    tag: _MessageDialog.default.tag,
    class: 'sb-sc-lang-editor-dialog',
    child: ['.sb-sc-lang-editor-dialog-editor-ctn', {
      class: 'sb-sc-lang-editor-dialog-error-message'
    }, {
      class: 'sb-sc-lang-editor-dialog-footer'
    }],
    props: {
      dialogTitle: "SCLang Editor",
      dialogActions: [{
        name: 'ok',
        text: 'OK'
      }, {
        name: 'cancel',
        text: 'CANCEL'
      }]
    },
    on: {
      action: event => {
        modal.remove();
        clearTimeout(verifyTimeout);

        if (event.action.name === 'ok' && currentAst) {
          this.setAST(currentAst);
          this.notifyASTChange();
        }
      }
    }
  });
  var errorMessage = (0, _FCore.$)('.sb-sc-lang-editor-dialog-error-message', dialog);
  var okBtn = dialog.$actionBtns[0];
  okBtn.disabled = true;
  var currentAst = null;

  var verify = () => {
    if (!modal.parentElement) return;
    var code = editor.getValue();
    var rows = code.split('\n');

    var ist = _SCParser.default.parse(code, 'function_declare');

    var errorText = '';
    var error = ist.error;
    var token, charIdx, rowIdx;

    if (error) {
      ast = null;
      okBtn.disabled = true;

      switch (error.type) {
        case 'unexpected':
          errorText = `<span style="color:red">${error.message}</span>`;
          token = ist.tokens[error.tokenIdx];
          charIdx = token.start;
          rowIdx = 0;

          while (rowIdx < rows.length) {
            if (charIdx <= rows[rowIdx].length) {
              errorText = `<strong>Line ${rowIdx + 1}:</strong> ` + errorText;
              errorText += '<br>';
              errorText += `<div style="color:blue">${rows[rowIdx]}</div>`;
              errorText += `<div style=" --text-color:red" class="as-blink-text">${' '.repeat(charIdx)}^</div>`;
              break;
            }

            charIdx -= rows[rowIdx].length + 1; //by \n

            rowIdx++;
          }

          break;

        default:
          errorText = `<span style="color:red">${error.message}</span>`;
          break;
      }
    } else {
      okBtn.disabled = false;
      currentAst = ist.ast;
    }

    errorMessage.innerHTML = errorText;
  };

  var editorCt = (0, _FCore.$)('.sb-sc-lang-editor-dialog-editor-ctn', dialog);
  var modal = (0, _FCore._)({
    tag: _Modal.default.tag,
    child: dialog
  });
  modal.addTo(document.body);
  var editor = ace.edit(editorCt);
  editor.getSession().setMode("ace/mode/sclang");
  editor.setOptions({
    enableBasicAutocompletion: true,
    enableLiveAutocompletion: true,
    behavioursEnabled: true
  });
  var verifyTimeout = -1;
  editor.on("change", function (e) {
    clearTimeout(verifyTimeout);
    setTimeout(verify, 800);
  });
  var ast = this.getAST();
  var code = (0, _SCCodeGenerator.generateSCCode)(ast);
  editor.setValue(code, true);
};

var _default = SCBlocklyEditorCmd;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/tool/SCBESelectTool.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/tool/SCBESelectTool.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../../core/FCore");

var _utils = require("absol-acomp/js/utils");

var findBlock = elt => {
  while (elt) {
    if (elt.sbBlock) return elt.sbBlock;
    elt = elt.parentElement;
  }

  return null;
};

function SCBESelectTool(editor) {
  this.editor = editor;
  Object.keys(SCBESelectTool.prototype).forEach(key => {
    if (key.startsWith('ev_')) this[key] = this[key].bind(this);
  });
  this.selectedBlocks = [];
}

SCBESelectTool.prototype.onCreateView = function () {
  this.editor.$content.on('click', this.ev_click);
  this.editor.$content.defineEvent('contextmenu').on('contextmenu', this.ev_contextMenu);
};

SCBESelectTool.prototype.deselectAll = function () {
  this.selectedBlocks.forEach(block => {
    block.elt.removeClass('as-last-selected').removeClass('as-selected');
  });
  this.selectedBlocks.splice(0, this.selectedBlocks.length);
  this.editor.notifyCmdDescriptorsChange();
};

SCBESelectTool.prototype.deselectHiddenBlock = function () {
  var blocks = this.selectedBlocks.slice();
  blocks.forEach(blk => {
    if (!blk.$elt || blk.$elt.getBoundingClientRect().height === 0) this.selectBlock(blk, "remove");
  });
};
/***
 *
 * @param {SBBase|null} block
 * @param {"normal"|"append"|"remove"|"toggle"=}selectMode
 */


SCBESelectTool.prototype.selectBlock = function (block, selectMode) {
  if (!block) {
    this.deselectAll();
    return;
  }

  var idx = this.selectedBlocks.indexOf(block);

  switch (selectMode) {
    case "append":
      if (idx >= 0) this.selectedBlocks.splice(idx, 1);
      this.selectedBlocks.push(block);
      block.elt.addClass('as-selected');
      break;

    case "remove":
      if (idx >= 0) {
        this.selectedBlocks.splice(idx, 1);
        block.elt.removeClass('as-selected').removeClass('as-last-selected');
      }

      break;

    case "toggle":
      if (idx >= 0) this.selectBlock(block, "remove");else this.selectBlock(block, 'append');
      return;

    default:
      this.selectedBlocks.forEach(block => block.elt.removeClass('as-selected').removeClass('as-last-selected'));
      this.selectedBlocks.splice(0, this.selectedBlocks.length);
      this.selectedBlocks.push(block);
      block.elt.addClass('as-selected');
  }

  this.selectedBlocks.forEach((block, i, arr) => {
    if (i + 1 < arr.length) {
      block.elt.removeClass('as-last-selected');
    } else {
      block.elt.addClass('as-last-selected');
    }
  });
  this.editor.notifyCmdDescriptorsChange();
};

SCBESelectTool.prototype.ev_click = function (event) {
  var block = findBlock(event.target);
  if (block && block.astType) this.selectBlock(block);
};

SCBESelectTool.prototype.ev_contextMenu = function (event) {
  var block = findBlock(event.target);

  if (block && block.astType) {
    this.selectBlock(block);
    event.showContextMenu(this.editor.getContextMenuPropsOfBlock(block), event => {
      this.editor.onContextMenuOfBlock(block, (0, _utils.cleanMenuItemProperty)(event.menuItem));
    });
  }
};

var _default = SCBESelectTool;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/dialog/SCTypeSelectionDialog.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/dialog/SCTypeSelectionDialog.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FCore = require("../../../core/FCore");

var _Searcher = _interopRequireDefault(require("absol-acomp/js/Searcher"));

var _Follower = _interopRequireDefault(require("absol-acomp/js/Follower"));

var _TOCList = _interopRequireDefault(require("absol-acomp/js/TOCList"));

var _TOCItem = _interopRequireDefault(require("absol-acomp/js/TOCItem"));

var _search = require("absol-acomp/js/list/search");

var _MessageDialog = _interopRequireDefault(require("absol-acomp/js/MessageDialog"));

var _utils = require("absol-acomp/js/utils");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));


/***
 * @extends Fragment
 * @param {SCBlocklyEditor} editor
 * @constructor
 */
function SCTypeSelectionDialog(editor) {
  _Fragment.default.call(this);

  _EventEmitter.default.call(this);

  this.editor = editor;
  this.$itemById = {};
  this.searchItems = [];
  this.$cache = {};
}

_OOP.default.mixClass(SCTypeSelectionDialog, _Fragment.default, _EventEmitter.default);

SCTypeSelectionDialog.prototype.type2icon = {
  'object': 'span.mdi.mdi-terraform',
  'number': 'span.mdi.mdi-numeric',
  'enum': 'span.mdi.mdi-circle-small',
  '{enum}': 'span.mdi.mdi-dots-triangle',
  'file': 'span.mdi.mdi-file-outline',
  'file[]': 'span.mdi.mdi-file-multiple-outline',
  'string': 'span.mdi.mdi-format-color-text',
  date: 'span.mdi.mdi-calendar-outline',
  datetime: 'span.mdi.mdi-calendar-clock',
  bool: 'span.mdi.mdi-check-box-outline',
  html: 'span.mdi.mdi-xml',
  color: 'span.mdi.mdi-palette',
  image: 'span.mdi.mdi-image-outline',
  'enum<pair>': 'span.mdi.mdi-music-note-whole-dotted',
  treetable: 'span.mdi.mdi-file-tree-outline'
};
SCTypeSelectionDialog.prototype.type2order = {
  'object': 100,
  'treetable': 101,
  'number': 0,
  'enum': 10,
  '{enum}': 11,
  'file': 7,
  'file[]': 8,
  'string': 2,
  date: 4,
  datetime: 5,
  bool: 3,
  html: 13,
  color: 9,
  image: 6,
  'enum<pair>': 12
};

SCTypeSelectionDialog.prototype.onStart = function () {
  this.getView();
  var descriptors = this.editor.typeMng.typeDescriptors;

  var findSupperType = type => {
    var counter = 100;

    while (counter--) {
      if (descriptors[type] && this.type2icon[descriptors[type].type]) {
        type = descriptors[type].type;
        if (this.type2icon[type]) break;
      } else break;
    }

    return type;
  };

  this.$itemById = {};
  var keys = Object.keys(descriptors).filter(key => {
    var dst = descriptors[key];
    if (parseInt(dst.typeId) + '' !== key) return false;
    if (dst.type === 'class') return false;
    return true;
  });
  this.$items = keys.map(key => {
    var dst = descriptors[key];
    var type = findSupperType(dst.type);
    var isArray = false;

    if (type === 'array') {
      type = findSupperType(dst.of);
      isArray = true;
    } // if (!this.type2icon[type]) console.log(dst.type, type)


    var itemElt = (0, _FCore._)({
      tag: _TOCItem.default,
      class: isArray ? 'sc-is-array' : [],
      attr: {
        "data-original-type": type,
        "data-is-array": isArray ? 'true' : 'false'
      },
      props: {
        name: dst.displayName,
        icon: this.type2icon[type] || this.type2icon['*'],
        descriptor: Object.assign({
          originalType: type,
          isArray: isArray,
          typeId: key
        }, dst)
      },
      on: {
        click: () => {
          this.selectedTypeId = key;
        },
        dblclick: () => {
          this.selectedTypeId = key;
          this.notifyResolve(this.selectedTypeId);
        }
      }
    });
    this.$itemById[key] = itemElt;
    return itemElt;
  });
  this.$items.sort((a, b) => {
    var aType = a.descriptor.originalType;
    var bType = b.descriptor.originalType;

    if (isNaN(this.type2order[aType] - this.type2order[bType])) {
      console.log(a.descriptor, b.descriptor);
    }

    if (aType !== bType) {
      return this.type2order[aType] - this.type2order[bType];
    } else if (a.descriptor.isArray !== b.descriptor.isArray) {
      if (a.descriptor.isArray) return 1;
      return -1;
    } else if (a.descriptor.displayName > b.descriptor.displayName) {
      return 1;
    } else if (a.descriptor.displayName < b.descriptor.displayName) {
      return -1;
    } else return 0;
  });
  this.$list.clearChild().addChild(this.$items);
  this.searchItems = this.$items.map(elt => ({
    text: elt.descriptor.displayName,
    value: elt.descriptor.typeId
  }));
  (0, _search.prepareSearchForList)(this.searchItems);
  this.$okBtn.disabled = this.selectedTypeId === null;
};

SCTypeSelectionDialog.prototype.onResume = function () {
  this.$modal.addTo(document.body);
  this.scrollIntoSelected();
};

SCTypeSelectionDialog.prototype.onPause = function () {
  this.$modal.remove();
};

SCTypeSelectionDialog.prototype.scrollIntoSelected = function () {
  if (!this.$itemById) return;
  var itemElt = this.$itemById[this._selectedTypeId];
  if (itemElt && itemElt.isDescendantOf(this.$view)) (0, _utils.vScrollIntoView)(itemElt);
};

SCTypeSelectionDialog.prototype.createView = function () {
  /***
   * @type {Follower}
   */
  this.$view = (0, _FCore._)({
    tag: _MessageDialog.default,
    class: ['as-message-dialog', 'sc-type-selection-dialog'],
    child: [{
      tag: _Searcher.default.tag
    }, {
      class: 'as-message-dialog-list-ctn',
      child: {
        tag: _TOCList.default.tag,
        class: 'as-message-dialog-list'
      }
    }],
    props: {
      dialogActions: [{
        text: 'OK',
        cmd: 'ok',
        class: 'as-message-dialog-ok-btn'
      }, {
        text: 'Cancel',
        cmd: 'cancel'
      }]
    },
    on: {
      action: event => {
        if (event.action.cmd === 'ok') {
          this.notifyResolve(this.selectedTypeId);
        } else {
          this.notifyResolve(null);
        }
      }
    }
  });
  this.$okBtn = (0, _FCore.$)('.as-message-dialog-ok-btn', this.$view);
  this.$list = (0, _FCore.$)('.as-message-dialog-list', this.$view);
  this.$searchInput = (0, _FCore.$)(_Searcher.default.tag, this.$view).on('stoptyping', this.ev_search.bind(this));
  this.$modal = (0, _FCore._)({
    tag: 'modal',
    child: this.$view
  });
};

SCTypeSelectionDialog.prototype.ev_search = function () {
  var query = this.$searchInput.value.trim().replace(/\s+/, ' ');

  if (!query) {
    this.$list.clearChild().addChild(this.$items);
    return;
  }

  var newList;
  var itemEltList;
  itemEltList = this.$cache[query];

  if (!itemEltList) {
    newList = (0, _search.searchListByText)(query, this.searchItems);
    itemEltList = newList.map(item => this.$itemById[item.value]);
    this.$cache[query] = itemEltList;
  }

  this.$list.clearChild().addChild(itemEltList);
};

Object.defineProperty(SCTypeSelectionDialog.prototype, 'selectedTypeId', {
  set: function (value) {
    var prevId = this._selectedTypeId;
    this._selectedTypeId = value;
    if (!this.$itemById) return;
    var itemElt = this.$itemById[prevId];
    if (itemElt) itemElt.removeClass('sc-selected');
    itemElt = this.$itemById[value];

    if (itemElt) {
      itemElt.addClass('sc-selected');
      this.$okBtn.disabled = false;
    } else {
      this.$okBtn.disabled = true;
    }

    this.scrollIntoSelected();
  },
  get: function () {
    if (this.$itemById && this.$itemById[this._selectedTypeId]) return this._selectedTypeId;
    return null;
  }
});

SCTypeSelectionDialog.prototype.notifyResolve = function (value) {
  this.emit('resolve', {
    value: value
  });
};

SCTypeSelectionDialog.prototype.openForResult = function (initValue) {
  if (arguments.length === 0) initValue = null;
  return new Promise(rs => {
    if (this._prevResolveCallback) {
      this._prevResolveCallback({
        value: null
      });

      this._prevResolveCallback = null;
    }

    var callback = event => {
      this.pause();
      this.off('resolve', callback);
      rs(event.value);
    };

    this._prevResolveCallback = callback;
    this.on('resolve', callback);
    this.start();
    this.selectedTypeId = initValue;
  });
};

var _default = SCTypeSelectionDialog;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/tool/SCBEViewportController.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/tool/SCBEViewportController.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));


/***
 *
 * @param {SCBlocklyEditor} editor
 * @constructor
 */
function SCBEViewportController(editor) {
  this.editor = editor;
  Object.keys(SCBEViewportController.prototype).filter(key => key.startsWith('ev_')).forEach(key => this[key] = this[key].bind(this));
  this.OXY = new _Vec.default(0, 0);
  this.overOffset = new _Vec.default(0, 0);
}

SCBEViewportController.prototype.onCreateView = function () {
  this.$content = this.editor.$content.on('scroll', this.updateScrollbar.bind(this));
  this.$body = this.editor.$body.on('wheel', this.ev_wheel).on('dragstart', this.ev_dragStart);
  this.$vscrollbar = this.editor.$vscrollbar;
  this.$hscrollbar = this.editor.$hscrollbar;
  this.$vscrollbar.on('active', () => {
    this._isScrollActivated = true;
  }).on('inactive', () => {
    this._isScrollActivated = false;
    this.updateScrollbar();
  }).on('scroll', () => {
    var top = this.$vscrollbar.innerOffset - this.overOffset.y;
    this.OXY = new _Vec.default(this.OXY.x, -top);
    this.$content.addStyle({
      top: this.OXY.y + 'px'
    });
    this.$content.emit('scroll');
  });
  this.$hscrollbar.on('active', () => {
    this._isScrollActivated = true;
  }).on('inactive', () => {
    this._isScrollActivated = false;
    this.updateScrollbar();
  }).on('scroll', () => {
    var left = this.$hscrollbar.innerOffset - this.overOffset.x;
    this.OXY = new _Vec.default(-left, this.OXY.x);
    this.$content.addStyle({
      left: this.OXY.x + 'px'
    });
    this.$content.emit('scroll');
  });
};

SCBEViewportController.prototype.ev_wheel = function (event) {
  event.preventDefault();
  var dx = 0;
  var dy = 0;

  if (event.shiftKey) {
    dx = -event.deltaY;
  } else {
    dy = -event.deltaY;
  }

  this.OXY = this.OXY.add(new _Vec.default(dx, dy));
  this.$content.addStyle({
    left: this.OXY.x + 'px',
    top: this.OXY.y + 'px'
  });
  this.$content.emit('scroll');
};

SCBEViewportController.prototype.ev_dragStart = function (event) {
  if (event.target === this.$body) {
    this.$body.on('drag', this.ev_drag).on('dragend', this.ev_dragEnd);
  }
};

SCBEViewportController.prototype.ev_dragEnd = function (event) {
  this.$body.off('drag', this.ev_drag).off('dragend', this.ev_dragEnd);
  this.OXY = this.OXY.add(event.currentPoint.sub(event.startingPoint));
};

SCBEViewportController.prototype.ev_drag = function (event) {
  var newXY = this.OXY.add(event.currentPoint.sub(event.startingPoint));
  this.$content.addStyle({
    left: newXY.x + 'px',
    top: newXY.y + 'px'
  });
  this.$content.emit('scroll');
};

SCBEViewportController.prototype.reset = function () {
  this.OXY = new _Vec.default(0, 0);

  if (this.$content) {
    this.$content.addStyle('transition', 'all 0.2s');
    setTimeout(() => {
      this.$content.addStyle({
        left: '0',
        top: '0'
      });
      this.updateScrollbar();
    }, 1);
    setTimeout(() => {
      this.$content.removeStyle('transition');
      this.updateScrollbar();
    }, 210);
  }
};

SCBEViewportController.prototype.updateScrollbar = function () {
  if (this._isScrollActivated) return;

  var outerBound = _Rectangle.default.fromClientRect(this.$body.getBoundingClientRect());

  var innerBound = this.$content.firstChild ? _Rectangle.default.fromClientRect(this.$content.firstChild.getBoundingClientRect()) : null;

  if (innerBound) {
    innerBound.x -= 4;
    innerBound.y -= 9;
    innerBound.width += 14;
    innerBound.height += 19;
  } else {
    innerBound = outerBound;
  }

  var scrollingRect = innerBound.merge(outerBound);
  this.overOffset = innerBound.A().sub(scrollingRect.A());
  var scrollingOffset = outerBound.A().sub(scrollingRect.A());
  this.$vscrollbar.innerHeight = scrollingRect.height;
  this.$vscrollbar.outerHeight = outerBound.height;
  this.$vscrollbar.innerOffset = scrollingOffset.y;
  this.$hscrollbar.innerWidth = scrollingRect.width;
  this.$hscrollbar.outerWidth = outerBound.width;
  this.$hscrollbar.innerOffset = scrollingOffset.x;

  if (scrollingRect.height > outerBound.height) {
    this.$hscrollbar.addStyle('right', '10px');
  } else {
    this.$hscrollbar.removeStyle('right');
  }

  if (scrollingRect.width > outerBound.width) {
    this.$vscrollbar.addStyle('bottom', '10px');
  } else {
    this.$vscrollbar.removeStyle('bottom');
  }
};

SCBEViewportController.prototype.updateSize = function () {
  this.updateScrollbar();
};

var _default = SCBEViewportController;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/tool/SCBEClipboard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/tool/SCBEClipboard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Modal = _interopRequireDefault(require("absol-acomp/js/Modal"));

var _FCore = require("../../../core/FCore");

var _MessageDialog = _interopRequireDefault(require("absol-acomp/js/MessageDialog"));

var _SBClassManager = _interopRequireDefault(require("../../blockly/SBClassManager"));


/***
 *
 * @param {SCBlocklyEditor} editor
 * @constructor
 */
function SCBEClipboard(editor) {
  this.editor = editor;
}

SCBEClipboard.prototype.version = 0;
SCBEClipboard.prototype.storageKey = 'SCBClipboardData';

SCBEClipboard.prototype.copy = function () {
  var blocks = this.editor.selectTool.selectedBlocks;
  if (blocks.length === 0) return;
  var ast = blocks[blocks.length - 1].ast;
  var json = JSON.stringify({
    descriptor: 'Blockly Clipboard',
    version: this.version,
    ast: ast
  });
  localStorage.setItem(this.storageKey, json);
  this.editor.notifyCmdDescriptorsChange();
};

SCBEClipboard.prototype.cut = function () {
  var blocks = this.editor.selectTool.selectedBlocks.slice();
  this.editor.selectTool.deselectAll();
  if (blocks.length === 0) return;
  var ast = blocks[blocks.length - 1].ast;
  var json = JSON.stringify({
    descriptor: 'Blockly Clipboard',
    version: this.version,
    ast: ast
  });
  localStorage.setItem(this.storageKey, json);
  blocks[blocks.length - 1].remove();
  this.editor.notifyASTChange();
  this.editor.rootNode.notifySizeChange();
  this.editor.notifyCmdDescriptorsChange();
};

SCBEClipboard.prototype.getAst = function () {
  if (this._astCache !== undefined) return this._astCache;
  setTimeout(() => {
    this._astCache = undefined;
  }, 300);
  this._astCache = null;
  var raw, data;

  try {
    raw = localStorage.getItem(this.storageKey);

    if (raw) {
      data = JSON.parse(raw);

      if (data && data.version === this.version) {
        this._astCache = data.ast;
      }
    }
  } catch (err) {}

  return this._astCache;
};

SCBEClipboard.prototype.viewContent = function () {
  var ast = this.getAst();
  var blockElt;
  var clazz, block;

  if (ast) {
    clazz = _SBClassManager.default.get(ast.type);
    block = new clazz();
    blockElt = block.elt;
    block.ast = ast;
  } else {
    blockElt = (0, _FCore._)({
      text: "Clipboard is empty!"
    });
  }

  var content = (0, _FCore._)({
    class: ['sb-blockly-clipboard-content', 'as-bscroller'],
    child: blockElt
  });
  var dialog = (0, _FCore._)({
    tag: _MessageDialog.default,
    class: ['sb-blockly-clipboard-dialog'],
    child: [content],
    props: {
      dialogTitle: 'Clipboard',
      dialogActions: [{
        name: 'ok',
        text: "OK"
      }]
    },
    on: {
      action: event => {
        modal.selfRemove();
      }
    }
  });
  var modal = (0, _FCore._)({
    tag: _Modal.default,
    child: [dialog]
  });
  modal.addTo(document.body);

  if (block) {
    block.notifySizeChange();
  }
};

SCBEClipboard.prototype.pasteIn = function () {
  var ast = this.getAst();

  var clazz = _SBClassManager.default.get(ast.type);

  var block = new clazz();
  var parentBlock = this.editor.selectTool.selectedBlocks[this.editor.selectTool.selectedBlocks.length - 1] || this.editor.rootNode;
  block.ast = ast;
  parentBlock.addChildBefore(block, null);
  this.editor.selectTool.selectBlock(block, 'normal');
};

SCBEClipboard.prototype.pasteBefore = function () {
  var ast = this.getAst();
  var selectedBlock = this.editor.selectTool.selectedBlocks[this.editor.selectTool.selectedBlocks.length - 1];
  if (!selectedBlock) return;

  var clazz = _SBClassManager.default.get(ast.type);

  var block = new clazz();
  var parentBlock = selectedBlock.parent;
  block.ast = ast;
  parentBlock.addChildBefore(block, selectedBlock);
  this.editor.selectTool.selectBlock(block, 'normal');
};

SCBEClipboard.prototype.pasteAfter = function () {
  var ast = this.getAst();
  var selectedBlock = this.editor.selectTool.selectedBlocks[this.editor.selectTool.selectedBlocks.length - 1];
  if (!selectedBlock) return;

  var clazz = _SBClassManager.default.get(ast.type);

  var block = new clazz();
  var parentBlock = selectedBlock.parent;
  block.ast = ast;
  parentBlock.addChildAfter(block, selectedBlock);
  this.editor.selectTool.selectBlock(block, 'normal');
};

var _default = SCBEClipboard;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/SCBlocklyEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/SCBlocklyEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = require("../../core/FCore");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

require("../blockly/SBNumericLiteral");

require("../blockly/SBUnaryExpression");

require("../blockly/SBCallExpressionStatement");

require("../blockly/SBIfChainStatement");

require("../blockly/SBStringLiteral");

require("../blockly/SBWhileStatement");

require("../blockly/SBCallExpression");

require("../blockly/SBNewExpression");

require("../blockly/SBMemberChainExpression");

require("../blockly/SBFunctionDeclaration");

var _SBForCountStatement = _interopRequireDefault(require("../blockly/SBForCountStatement"));

require("../blockly/SBVariable");

require("../blockly/SBVariableDeclaration");

require("../blockly/SBIdentifier");

require("../blockly/SBAssignStatement");

require("../blockly/SBBreakStatement");

require("../blockly/SBBooleanLiteral");

require("../blockly/SBArrayExpression");

require("../blockly/SBObjectExpression");

require("../blockly/SBReturnStatement");

require("../blockly/SBNullLiteral");

require("../blockly/SBForOfStatement");

require("../blockly/SBForInStatement");

require("./ACESCLangMode");

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _utils = require("absol-acomp/js/utils");

var _BaseEditor = _interopRequireDefault(require("../../core/BaseEditor"));

var _SCBlocklyEditorCmd = _interopRequireDefault(require("./SCBlocklyEditorCmd"));

var _SCBESelectTool = _interopRequireDefault(require("./tool/SCBESelectTool"));

var _CMDTool = _interopRequireDefault(require("../../fragment/CMDTool"));

var _R = _interopRequireDefault(require("../../R"));

var _CmdDescriptors = _interopRequireDefault(require("../../cmds/CmdDescriptors"));

var _SCTypeSelectionDialog = _interopRequireDefault(require("./dialog/SCTypeSelectionDialog"));

var _generator = require("absol/src/JSMaker/generator");

var _SCTypeManager = _interopRequireDefault(require("./SCTypeManager"));

var _SBClassManager = _interopRequireDefault(require("../blockly/SBClassManager"));

var _Modal = _interopRequireDefault(require("absol-acomp/js/Modal"));

var _MessageDialog = _interopRequireDefault(require("absol-acomp/js/MessageDialog"));

var _ExpTree = require("absol-acomp/js/ExpTree");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _SCBEViewportController = _interopRequireDefault(require("./tool/SCBEViewportController"));

var _Hanger = _interopRequireDefault(require("absol-acomp/js/Hanger"));

var _SCBEClipboard = _interopRequireDefault(require("./tool/SCBEClipboard"));

var _Scroller = require("absol-acomp/js/Scroller");


/***
 * @augments EventEmitter
 * @extends Fragment
 * @constructor
 * @augments {{}=} opt
 */
function SCBlocklyEditor(opt) {
  opt = opt || {};

  _BaseEditor.default.call(this);

  this.clipboard = new _SCBEClipboard.default(this);
  this.cmdRunner.assign(_SCBlocklyEditorCmd.default);
  this.rootNode = null;
  this.style = Object.assign(new _Attributes.default(this), opt.style);
  this.opt = opt;
  this.selectTool = new _SCBESelectTool.default(this);
  this.cmdTool = new _CMDTool.default();
  this.cmdTool.bindWithEditor(this);
  this.viewportCtrl = new _SCBEViewportController.default(this);
  this.typeMng = _SCTypeManager.default;
  this.typeSelectionDialog = new _SCTypeSelectionDialog.default(this);
}

_OOP.default.mixClass(SCBlocklyEditor, _BaseEditor.default);

SCBlocklyEditor.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    attr: {
      tabindex: '1'
    },
    class: 'sb-blockly-editor',
    child: [{
      class: 'sb-blockly-editor-header',
      child: this.cmdTool.getView()
    }, {
      tag: _Hanger.default,
      class: 'sb-blockly-editor-body',
      child: [{
        class: 'sb-blockly-editor-content'
      }, {
        tag: _Scroller.VScrollbar,
        class: 'sb-blockly-editor-v-scrollbar'
      }, {
        tag: _Scroller.HScrollbar,
        class: 'sb-blockly-editor-h-scrollbar'
      }]
    }],
    props: {
      sbEditor: this
    }
  });
  if (this.opt.readOnly) this.$view.addStyle('pointer-events', 'none');
  this.$body = (0, _FCore.$)('.sb-blockly-editor-body', this.$view);
  this.$content = (0, _FCore.$)('.sb-blockly-editor-content', this.$view);
  this.$vscrollbar = (0, _FCore.$)('.sb-blockly-editor-v-scrollbar', this.$view);
  this.$hscrollbar = (0, _FCore.$)('.sb-blockly-editor-h-scrollbar', this.$view);
  this.$attachhook = (0, _FCore._)('attachhook').addTo(this.$view);

  this.$attachhook.requestUpdateSize = () => {
    this.viewportCtrl.updateSize();
    if (this.rootNode) this.rootNode.notifySizeChange();
  };

  this.$attachhook.on('attached', function () {
    this.requestUpdateSize();

    _ResizeSystem.default.add(this);
  });
  var style = this.style;
  this.style.loadAttributeHandlers(this.styleHandlers);
  Object.assign(this.style, style);
  this.selectTool.onCreateView();
  this.viewportCtrl.onCreateView(); // this.
};

SCBlocklyEditor.prototype.setAST = function (ast) {
  if (!ast) return;

  if (ast.type !== 'FunctionDeclaration') {
    throw new Error("SCBlocklyEditor only support FunctionDeclaration!");
  }

  this.rootNode = null;
  var clazz = ast ? _SBClassManager.default.get(ast.type) : null;

  if (clazz) {
    this.rootNode = new clazz();
  }

  if (this.$content) {
    this.$content.clearChild();

    if (this.rootNode) {
      this.$content.addChild(this.rootNode.elt);
      this.rootNode.ast = ast;
      this.rootNode.notifySizeChange();
    }
  }
};

SCBlocklyEditor.prototype.getAST = function () {
  return JSON.parse(JSON.stringify(this.rootNode.ast));
};

SCBlocklyEditor.prototype.notifyASTChange = function () {
  this.selectTool.deselectHiddenBlock();
  this.emit('ast_change');
};

SCBlocklyEditor.prototype.addTypeDescriptors = function (descriptors) {
  this.typeMng.addTypeDescriptors(descriptors);
};

SCBlocklyEditor.prototype.getTypeDescriptor = function (typeId) {
  return this.typeMng.getTypeDescriptor(typeId);
};

SCBlocklyEditor.prototype.getCmdGroupTree = function () {
  return [['save'], ['importFromFile', 'export2Json', 'editAsSCLang'], ['moveUp', 'moveDown', 'delete'], ['copy', 'cut', 'viewClipboard', 'pasteSCBlock'], ['scrollIntoBlock']];
};

SCBlocklyEditor.prototype.getCmdDescriptor = function (name) {
  var descriptor = _CmdDescriptors.default[name];
  var ast, block;
  var res = Object.assign({
    type: 'trigger',
    desc: 'command: ' + name,
    icon: 'span.mdi.mdi-apple-keyboard-command'
  }, descriptor);
  var selectedBlocks = this.selectTool.selectedBlocks;

  if (name === 'delete' || name === 'copy') {
    if (selectedBlocks.length === 0) res.disabled = true;
  } else if (name === 'moveUp') {
    if (selectedBlocks.length !== 1) res.disabled = true;else if (!selectedBlocks[0].canMove('up')) res.disabled = true;
  } else if (name === 'moveDown') {
    if (selectedBlocks.length !== 1) res.disabled = true;else if (!selectedBlocks[0].canMove('down')) res.disabled = true;
  } else if (name === 'pasteSCBlock') {
    ast = this.clipboard.getAst();
    block = this.selectTool.selectedBlocks[this.selectTool.selectedBlocks.length - 1] || this.rootNode;
    res.items = [];

    if (this.clipboard && ast && block) {
      if (block.canAddChildBefore(ast, null)) {
        res.items.push({
          text: 'Paste In',
          icon: 'span.mdi.mdi-content-paste',
          args: ['IN']
        });
      }

      if (block.parent) {
        if (block.parent.canAddChildBefore(ast, block)) {
          res.items.push({
            text: 'Paste Before',
            icon: 'span.mdi.mdi-content-paste',
            args: ['BEFORE']
          });
        }

        if (block.parent.canAddChildAfter(ast, block)) {
          res.items.push({
            text: 'Paste After',
            icon: 'span.mdi.mdi-content-paste',
            args: ['AFTER']
          });
        }
      }
    } // console.log(res.items)


    if (res.items.length === 0) res.disabled = true;
  }

  return res;
};

SCBlocklyEditor.prototype.styleHandlers = {};
SCBlocklyEditor.prototype.styleHandlers.height = {
  set: function (value) {
    if (value === 'auto-grow') {
      this.$view.removeStyle('height');
      this.$view.addClass('as-grow-height');
    } else if (typeof value === "string") {
      this.$view.addStyle('height', value);
    } else if ((0, _utils.isRealNumber)(value)) {
      this.$view.addStyle('height', value + 'px');
    } else {
      this.$view.removeStyle('height');
      this.$view.addClass('sb-grow-height');
    }

    return value;
  }
};

SCBlocklyEditor.prototype.openFunctionPickerDialog = function () {
  return new Promise(rs => {
    var finish = fullPath => {
      modal.remove();
      var value = null;

      if (fullPath) {
        value = fullPath.reduce((ac, cr) => {
          if (ac) {
            return {
              type: 'MemberExpression',
              object: ac,
              property: {
                type: 'Identifier',
                name: cr.name
              },
              computed: false
            };
          } else {
            return {
              type: 'Identifier',
              name: cr.name
            };
          }
        }, null);
      }

      rs(value);
    };
    /***
     *
     * @type {BlocklyDataModel}
     */


    var dataModel = this.getContext(_R.default.DATA_MODEL);
    var treeCtn = (0, _FCore._)({
      style: {
        maxHeight: 'calc(80vh - 200px)',
        overflow: 'auto'
      }
    });
    var activeTree = null;
    var selectedFullPath = null;
    dataModel.getPackageTreeList().then(list => {
      var visit = (path, pElt, nodeInfo) => {
        var icon;

        if (nodeInfo.type === 0) {
          icon = 'span.mdi.mdi-package-variant';
        } else if (nodeInfo.type + '' === '129') {
          icon = 'span.mdi.mdi-function-variant';
        }

        var nodeElt = (0, _FCore._)({
          tag: _ExpTree.ExpTree.tag,
          props: {
            name: nodeInfo.name,
            icon: icon
          }
        });

        if (nodeInfo.type + '' === '129') {
          nodeElt.on('press', () => {
            if (activeTree) activeTree.active = false;
            activeTree = nodeElt;
            activeTree.active = true;
            selectedFullPath = path.concat([nodeInfo]);
            dialog.$actionBtns[0].disabled = false;
          });
          nodeElt.getNode().on('dblclick', () => {
            if (activeTree) activeTree.active = false;
            activeTree = nodeElt;
            activeTree.active = true;
            finish(path.concat([nodeInfo]));
          });
        } else if (nodeInfo.type === 0) {
          nodeElt.getNode().on('click', event => {
            if (!(0, _EventEmitter.hitElement)(nodeElt.getNode().$toggleIcon, event)) {
              if (nodeElt.status === 'close') {
                nodeElt.status = 'open';
              } else if (nodeElt.status === 'open') {
                nodeElt.status = 'close';
              }
            }
          });
        }

        pElt.addChild(nodeElt);

        if (nodeInfo.children && nodeInfo.children.length > 0) {
          nodeElt.status = 'close';
          nodeInfo.children.forEach(it => visit(path.concat([nodeInfo]), nodeElt, it));
        }
      };

      list.forEach(it => visit([], treeCtn, it));
    }); // console.log(this.typeMng.globalDescriptors)

    var dialog = (0, _FCore._)({
      tag: _MessageDialog.default.tag,
      child: [treeCtn],
      props: {
        dialogTitle: 'Choose Function',
        dialogActions: [{
          text: 'OK',
          name: 'ok'
        }, {
          text: 'Cancel',
          name: 'cancel'
        }]
      },
      on: {
        action: event => {
          if (event.action.name === 'cancel') finish(null);else finish(selectedFullPath);
        }
      }
    });
    dialog.$actionBtns[0].disabled = true;
    var modal = (0, _FCore._)({
      tag: _Modal.default.tag,
      child: [dialog]
    }).addTo(document.body);
  });
};

SCBlocklyEditor.prototype.getContextMenuPropsOfBlock = function (block) {
  var items = [];
  ['moveUp', 'moveDown', 'delete'].forEach(cmd => {
    var desc = this.getCmdDescriptor(cmd);

    if (!desc.disabled) {
      items.push({
        text: desc.desc,
        icon: desc.icon,
        cmd: cmd
      });
    }
  });
  return {
    items: items
  };
};

SCBlocklyEditor.prototype.onContextMenuOfBlock = function (block, action) {
  if (['moveUp', 'moveDown', 'delete'].indexOf(action.cmd) >= 0) {
    this.execCmd(action.cmd);
  }
};

var _default = SCBlocklyEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/SCBlocklyTask.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/SCBlocklyTask.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _FLTask = _interopRequireDefault(require("../../launcher/controller/FLTask"));

var _R = _interopRequireDefault(require("../../R"));

var _SCBlocklyEditor = _interopRequireDefault(require("./SCBlocklyEditor"));

var _SCTypeManager = _interopRequireDefault(require("./SCTypeManager"));


/***
 * @extends FLTask
 * @constructor
 */
function SCBlocklyTask() {
  _FLTask.default.apply(this, arguments);
  /***
   * @type {SCBlocklyEditor}
   * @name mainFragment
   * @memberOf SCBlocklyTask#
   */


  this.setContext(_R.default.TASK, this);
  this.taskName = this.bundle.nodeInfo.name;
}

_OOP.default.mixClass(SCBlocklyTask, _FLTask.default);

SCBlocklyTask.prototype.taksIcon = 'span.mdi.mdi-function-variant';

SCBlocklyTask.prototype.onAttached = function () {
  _FLTask.default.prototype.onAttached.call(this);
  /***
   * @type {BlocklyDataModel}
   */


  this.dataModel = this.getContext(_R.default.DATA_MODEL);
  /***
   *
   * @type {EventEmitter}
   */

  this.notificationCenter = this.getContext(_R.default.NOTIFICATION_CENTER);
};

SCBlocklyTask.prototype.onStart = function () {
  _FLTask.default.prototype.onStart.call(this);

  this.mainFragment.on('ast_change', () => {
    this.$tab.modified = true;
  });
  var typeSync = this.dataModel.getTypeDescriptors().then(result => {
    Object.keys(result).forEach(key => {
      if (!('typeId' in result[key])) result[key].typeId = key;
    });

    _SCTypeManager.default.addTypeDescriptors(result);
  });
  this.dataModel.loadNodeById(this.bundle.nodeInfo.id).then(result => {
    var ast = result && result.content && result.content.ast;
    ast = ast || {
      type: "FunctionDeclaration",
      id: {
        type: "Identifier",
        name: this.bundle.nodeInfo.name
      },
      params: [],
      body: {
        type: "BlockStatement",
        body: []
      }
    };
    typeSync.then(() => {
      this.mainFragment.setAST(ast);
    });
  });
};

SCBlocklyTask.prototype.MainFragmentClass = _SCBlocklyEditor.default;

SCBlocklyTask.prototype.computeIdent = function () {
  return 'SCBlocklyTask_' + this.bundle.nodeInfo.id;
};

SCBlocklyTask.prototype.save = function () {
  this.$tab.modified = false;
  var content = {
    content: {
      ast: this.mainFragment.getAST()
    }
  };
  this.dataModel.updateNode(this.bundle.nodeInfo.id, content);
  this.notificationCenter.emit('node_content_change', {
    type: 'node_content_change',
    content: content,
    nodeInfo: this.bundle.nodeInfo
  });
};

var _default = SCBlocklyTask;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/SCExplorer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/SCExplorer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FExplorer = _interopRequireDefault(require("../../launcher/FExplorer"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _MessageDialog = _interopRequireDefault(require("absol-acomp/js/MessageDialog"));

var _FCore = _interopRequireWildcard(require("../../core/FCore"));

var _Modal = _interopRequireDefault(require("absol-acomp/js/Modal"));

var _R = _interopRequireDefault(require("../../R"));

var _Icons = require("absol-acomp/js/Icons");

var _ExpTree = require("absol-acomp/js/ExpTree");

var _generator = require("absol/src/JSMaker/generator");

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));

var _utils = require("absol-acomp/js/utils");

var _SCBlocklyTask = _interopRequireDefault(require("./SCBlocklyTask"));

var _Text = _interopRequireDefault(require("../../components/Text"));




/***
 * @extends FExplorer
 * @constructor
 */
function SCExplorer() {
  _FExplorer.default.apply(this, arguments);

  this.attachedPackageIdList = [];
  this.packageInfoById = {};
  this.nodeInfoById = {};
}

_OOP.default.mixClass(SCExplorer, _FExplorer.default);

SCExplorer.prototype.onAttached = function () {
  /**
   *
   * @type {BlocklyDataModel}
   */
  this.dataModel = this.getContext(_R.default.DATA_MODEL);
  /***
   *
   * @type {SCLauncher}
   */

  this.launcher = this.getContext(_R.default.LAUNCHER);
};

SCExplorer.prototype.attachPackage = function (id) {
  if (this.attachedPackageIdList.indexOf(id) >= 0) return;
  this.attachedPackageIdList.push(id);
  this.redrawExpTree();
  this.$headerMenuBtn.removeStyle('display');
};

SCExplorer.prototype.detachPackage = function (id) {
  var idx = this.attachedPackageIdList.indexOf(id);
  if (idx < 0) return;
  this.attachedPackageIdList.splice(idx, 1);

  if (this.attachedPackageIdList.length > 0) {
    this.redrawExpTree();
    this.$headerMenuBtn.removeStyle('display');
  } else {
    this.$body.clearChild().addChild(this.startExploringFrg.getView());
    this.$headerMenuBtn.addStyle('display', 'none');
  }
};

SCExplorer.prototype.detachAllPackage = function () {
  this.attachedPackageIdList.splice(0, this.attachedPackageIdList.length);
  this.$body.clearChild().addChild(this.startExploringFrg.getView());
  this.$headerMenuBtn.addStyle('display', 'none');
};

SCExplorer.prototype.getExploreTree = function () {
  var cmp = (a, b) => {
    if (a.info.type !== b.info.type) {
      return parseInt(a.info.type) - parseInt(b.info.type);
    }

    if (a.name < b.name) return -1;
    if (a.name > b.name) return 1;
    return 0;
  };

  return this.dataModel.getPackageTreeList().then(treeList => treeList.filter(tree => this.attachedPackageIdList.indexOf(tree.id) >= 0)).then(treeList => {
    treeList = (0, _generator.copyJSVariable)(treeList);
    this.packageInfoById = {};
    this.nodeInfoById = {};

    var visit = (parent, node) => {
      var res = {
        info: node,
        name: node.name,
        id: node.id,
        parent: parent
      };

      if (node.type === 0) {
        this.packageInfoById[node.id] = node;
        res.icon = 'span.mdi.mdi-package-variant';
      } else if (node.type + '' === '129') {
        this.nodeInfoById[node.id] = node;
        res.icon = 'span.mdi.mdi-function-variant';
      }

      if (node.children && node.children.length >= 0) {
        res.children = node.children.map(it => visit(res, it));
        res.children.sort(cmp);
      }

      return res;
    };

    var res = treeList.map(it => visit(null, it));
    res.sort(cmp);
    return res;
  });
};

SCExplorer.prototype.openIdentInputDialog = function (options) {
  options = Object.assign({
    title: 'New Package',
    field: 'Name'
  }, options);
  return new Promise((resolve, reject) => {
    var nameInput = (0, _FCore._)({
      tag: 'input',
      class: 'as-text-input',
      attr: {
        type: 'text'
      }
    });
    var errorText = (0, _FCore._)({
      tag: 'span',
      style: {
        color: 'red',
        fontSize: '0.8em'
      },
      child: {
        text: ''
      }
    });
    /***
     * @type {MessageDialog}
     */

    var dialog = (0, _FCore._)({
      tag: _MessageDialog.default.tag,
      style: {
        fontSize: '14px'
      },
      props: {
        dialogTitle: options.title,
        dialogIcon: 'span.mdi.mdi-package-variant-plus',
        dialogActions: [{
          text: 'OK',
          name: 'ok'
        }, {
          text: 'Cancel',
          name: 'cancel'
        }]
      },
      child: {
        class: 'as-table-grid',
        style: {
          whiteSpace: 'nowrap'
        },
        child: [{
          class: 'as-table-grid-row',
          child: [{
            class: 'as-table-grid-cell',
            child: {
              tag: 'label',
              child: {
                text: options.fieldName || 'Name'
              },
              style: {
                paddingRight: '10px'
              }
            }
          }, {
            class: 'as-table-grid-cell',
            child: nameInput
          }]
        }, {
          class: 'as-table-grid-row',
          child: [{
            class: 'as-table-grid-cell'
          }, {
            class: 'as-table-grid-cell',
            child: errorText
          }]
        }]
      }
    });
    var okBtn = dialog.$actionBtns[0];
    okBtn.disabled = true;

    var verify = () => {
      var name = nameInput.value;

      if (name.match(/^[a-zA-Z_$]([a-zA-Z_$0-9]*)$/)) {
        errorText.firstChild.data = '';
        okBtn.disabled = false;
        return true;
      } else {
        errorText.firstChild.data = 'Invalid name!';
        okBtn.disabled = true;
        return false;
      }
    };

    nameInput.on('keyup', verify);
    var modal = (0, _FCore._)({
      tag: _Modal.default.tag,
      child: [dialog]
    }).addTo(document.body);
    setTimeout(() => {
      nameInput.focus();
    }, 100);
    dialog.on('action', event => {
      var name;

      if (event.action.name === 'ok') {
        name = nameInput.value;

        if (verify()) {
          resolve(name);
        }
      } else if (event.action.name === 'cancel') {
        reject();
      }

      modal.remove();
    });
  });
};

SCExplorer.prototype.openNewPackageDialog = function () {
  var handleResult = name => {
    this.dataModel.saveNewPackage(name, '').then(result => {
      console.log(result);
    }, err => {
      console.error(err);
    });
  };

  return this.openIdentInputDialog({
    title: 'New Package',
    fieldName: 'Name'
  }).then(handleResult, () => {});
};

SCExplorer.prototype.openPackageListDialog = function () {
  var packageListElt = (0, _FCore._)({
    style: {
      width: '500px',
      maxWidth: 'calc(100vw - 100px)',
      overflowY: 'auto',
      maxHeight: 'calc(100vh - 200px)',
      minHeight: '30vh',
      border: '1px solid #ddd'
    },
    child: {
      child: {
        tag: _Icons.SpinnerIco.tag
      }
    }
  });
  var dialog = (0, _FCore._)({
    tag: _MessageDialog.default.tag,
    props: {
      dialogTitle: 'Open Package',
      dialogActions: [{
        text: 'OK',
        name: 'ok'
      }, {
        text: 'Cancel',
        name: 'cancel'
      }]
    },
    child: [packageListElt],
    on: {
      action: event => {
        if (event.action.name === 'ok' && selectedId >= 0) {
          this.launcher.attachPackage(selectedId);
        }

        modal.remove();
      }
    }
  });
  var modal = (0, _FCore._)({
    tag: _Modal.default.tag,
    style: {
      zIndex: '90001'
    },
    child: [dialog]
  }).addTo(document.body);
  dialog.$actionBtns[0].disabled = true;
  var itemElementDict = {};
  var selectedId = -1;

  var selectItem = id => {
    dialog.$actionBtns[0].disabled = false;
    var elt = itemElementDict[selectedId];

    if (elt) {
      elt.active = false;
    }

    selectedId = id;
    elt = itemElementDict[selectedId];
    elt.active = true;
  };

  var drawList = () => this.dataModel.getPackageTreeList().then(list => {
    packageListElt.clearChild();
    list.forEach(packageInfo => {
      var pElt = (0, _FCore._)({
        tag: _ExpTree.ExpTree.tag,
        props: {
          name: packageInfo.name,
          icon: 'span.mdi.mdi-package-variant'
        },
        on: {
          dblclick: () => {},
          click: () => {
            selectItem(packageInfo.id);
          }
        }
      });
      itemElementDict[packageInfo.id] = pElt;
      packageListElt.addChild(pElt);
      pElt.getNode().defineEvent('contextmenu').on('contextmenu', event => {
        event.showContextMenu({
          items: [{
            text: 'delete',
            icon: 'span.mdi.mdi-delete',
            cmd: 'delete'
          }]
        }, event => {
          switch (event.menuItem.cmd) {
            case 'delete':
              this.openDeletePackageDialog(packageInfo).then(deleted => {
                if (deleted) drawList();
              });
              break;
          }
        });
      });
    });
  });

  drawList();
};

SCExplorer.prototype.createView = function () {
  _FExplorer.default.prototype.createView.call(this);

  if (this.$headerMenuBtn) this.$headerMenuBtn.addStyle('display', 'none');
};

SCExplorer.prototype.getActionContextMenuProps = function (treeData) {
  var items = [];

  if (treeData.info.type === 0) {
    items.push({
      text: 'New Subpackage',
      icon: 'span.mdi.mdi-package-variant-plus',
      cmd: 'new_subpackage'
    });
    if (treeData.parent) items.push({
      text: 'Delete',
      cmd: 'delete_subpackage',
      icon: 'span.mdi.mdi-delete'
    });
    items.push({
      text: 'New Function',
      icon: 'span.mdi.mdi-function-variant',
      cmd: 'new_function'
    });
  } else if (treeData.info.type + '' === '129') {
    items.push({
      text: 'Delete',
      cmd: 'delete_node',
      icon: 'span.mdi.mdi-delete'
    });
  }

  return {
    items: items
  };
};

SCExplorer.prototype.getHeaderActionContextMenuProps = function () {
  var items = [];

  if (this.attachedPackageIdList.length === 1) {
    items.push({
      text: 'Close Package',
      cmd: 'close_all_package',
      icon: 'span.mdi.mdi-location-exit'
    });
    items.push({
      text: 'Attach Package',
      cmd: 'attach_package',
      icon: 'span.mdi.mdi-shape-circle-plus'
    });
  } else if (this.attachedPackageIdList.length > 1) {
    items.push({
      text: 'Close Al Packages',
      cmd: 'close_all_package',
      icon: 'span.mdi.mdi-location-exit'
    });
    items.push({
      text: 'Attach Package',
      cmd: 'attach_package',
      icon: 'span.mdi.mdi-shape-circle-plus'
    });
  }

  if (this.attachedPackageIdList.length > 0) {
    items.push('================');
    items.push({
      text: 'Expand All',
      cmd: 'expand_all',
      icon: 'span.mdi.mdi-arrow-expand-vertical'
    });
    items.push({
      text: 'Collapse All',
      cmd: 'collapse_all',
      icon: 'span.mdi.mdi-format-vertical-align-center'
    });
  }

  return {
    items: items
  };
};

SCExplorer.prototype.onTreeAction = function (treeData, action) {
  switch (action.cmd) {
    case 'new_subpackage':
      this.openNewSubpackageDialog(treeData.info);
      break;

    case 'delete_subpackage':
      this.openDeleteSubpackageDialog(treeData.info);
      break;

    case 'new_function':
      this.openNewFunctionDialog(treeData.info);
      break;

    case 'delete_node':
      this.openDeleteNodeDialog(treeData.info);
      break;

    case 'open':
      if (treeData.info.type + '' === '129') this.openFunction(treeData.info);
  }
};

SCExplorer.prototype.onHeaderAction = function (action) {
  switch (action.cmd) {
    case 'close_all_package':
      this.detachAllPackage();
      break;

    case 'attach_package':
      this.openPackageListDialog();
      break;

    case 'expand_all':
      (0, _FCore.$)(_ExpTree.ExpTree.tag, this.$body, elt => {
        if (elt.status === 'close') {
          elt.status = 'open';
          elt.emit('statuschange', {});
        }
      });
      break;

    case 'collapse_all':
      (0, _FCore.$)(_ExpTree.ExpTree.tag, this.$body, elt => {
        if (elt.status === 'open') {
          elt.status = 'close';
          elt.emit('statuschange', {});
        }
      });
      break;
  }
};

SCExplorer.prototype.openNewSubpackageDialog = function (parentPackageInfo) {
  var handleResult = result => {
    return this.dataModel.saveNewSubpackage(parentPackageInfo.id, result, '').then(() => {
      this.redrawExpTree();
    });
  };

  this.openIdentInputDialog({
    title: 'New Subpackage'
  }).then(handleResult, _noop.default);
};

SCExplorer.prototype.openDeletePackageDialog = function (packageInfo) {
  return (0, _utils.openYesNoQuestionDialog)('Delete Package', `[${packageInfo.id}]${packageInfo.name}`).then(result => {
    if (result) {
      return this.dataModel.deletePackage(packageInfo.id).then(() => true);
    } else {
      return false;
    }
  });
};

SCExplorer.prototype.openDeleteSubpackageDialog = function (packageInfo) {
  var path = [];
  var p = packageInfo;

  while (p) {
    path.unshift(p.name);
    p = this.packageInfoById[p.parentid];
  }

  (0, _utils.openYesNoQuestionDialog)('Delete Subpackage', path.join('/')).then(result => {
    var ids = {};

    var visit = pI => {
      ids[pI.id] = true;
      if (pI.children) pI.children.forEach(visit);
    };

    visit(packageInfo);
    this.dataModel.deletePackages(Object.keys(ids)).then(() => this.redrawExpTree());
  });
};

SCExplorer.prototype.openNewFunctionDialog = function (packageInfo) {
  var handleResult = name => {
    this.dataModel.saveNewNode(packageInfo.id, 129, name, '').then(res => {
      this.redrawExpTree();
      this.openFunction({
        name: name,
        id: res.id,
        namespace: packageInfo.id,
        type: 129
      });
    });
  };

  this.openIdentInputDialog({
    title: 'New Function',
    fieldName: 'Function Name'
  }).then(handleResult, _noop.default);
};

SCExplorer.prototype.openDeleteNodeDialog = function (nodeInfo) {
  var handleResult = result => {
    if (result) {
      this.dataModel.deleteNode(nodeInfo.id).then(() => {
        this.redrawExpTree();
      });
    }
  };

  var path = [];
  var p = nodeInfo;

  while (p) {
    path.unshift(p.name);
    p = this.packageInfoById[p.parentid || p.namespaceid];
  }

  (0, _utils.openYesNoQuestionDialog)('Delete Function', path.join('/')).then(handleResult, _noop.default);
};

SCExplorer.prototype.openFunction = function (nodeInfo) {
  var task = this.launcher.getTaskById('SCBlocklyTask_' + nodeInfo.id);

  if (task) {
    task.requestActive();
  } else {
    this.launcher.newTask(_SCBlocklyTask.default, {
      nodeInfo: nodeInfo
    });
  }
};

var _default = SCExplorer;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/editor/SCLauncher.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/editor/SCLauncher.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FLauncher = _interopRequireDefault(require("../../launcher/FLauncher"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _BlocklyDataModel = _interopRequireDefault(require("../../frame/BlocklyDataModel"));

var _BlocklyStartExploringFragment = _interopRequireDefault(require("../../frame/BlocklyStartExploringFragment"));

var _SCExplorer = _interopRequireDefault(require("./SCExplorer"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _R = _interopRequireDefault(require("../../R"));


/***
 * @extends FLauncher
 * @param options
 * @constructor
 */
function SCLauncher(options) {
  _FLauncher.default.apply(this, arguments);

  this.notificationCenter = options.notificationCenter || new _EventEmitter.default();
  this.setContext(_R.default.NOTIFICATION_CENTER, this.notificationCenter);
}

_OOP.default.mixClass(SCLauncher, _FLauncher.default);

SCLauncher.prototype.classes = {
  DataModel: _BlocklyDataModel.default,
  StartExploringFragment: _BlocklyStartExploringFragment.default,
  Explorer: _SCExplorer.default
};

SCLauncher.prototype.attachPackage = function (id) {
  this.explorer.attachPackage(id);
};

var _default = SCLauncher;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/layouteditor/RemoteFormPreview.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/layouteditor/RemoteFormPreview.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseEditor = _interopRequireDefault(require("../core/BaseEditor"));

var _FCore = _interopRequireWildcard(require("../core/FCore"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _FmFragment = require("../core/FmFragment");

var _Assembler = require("../core/Assembler");

require("../../css/remoteformpreview.css");




function RemoteFormPreview() {
  _BaseEditor.default.call(this);

  this.id = location.search.replace(/^\?/, '').split('&').reduce((ac, txt) => {
    var p = txt.split('=');
    var key = p[0].trim();
    var value = (p[1] || '').trim();
    ac[key] = value;
    return ac;
  }, {
    client_id: 0
  }).client_id || 'D' + Math.floor(Math.random() * 1000) + '';
}

_OOP.default.mixClass(RemoteFormPreview, _BaseEditor.default);

RemoteFormPreview.prototype.createView = function () {
  this.$view = (0, _FCore._)({
    class: 'af-remote-form-preview',
    child: [{
      class: 'af-remote-form-preview-header',
      child: ['span.mdi.mdi-cellphone-play', {
        text: 'ID: ' + this.id
      }]
    }, {
      class: 'af-remote-form-preview-body'
    }]
  });
  this.$body = (0, _FCore.$)('.af-remote-form-preview-body', this.$view);
};

RemoteFormPreview.prototype.onStart = function () {
  if (!window.MQTT) {
    _Toast.default.make({
      props: {
        variant: 'error',
        htitle: "Can not start",
        disappearTimeout: 4000
      },
      child: {
        style: {
          padding: '5px'
        },
        child: {
          text: 'Can not fount MQTT library!'
        }
      }
    });

    return;
  }

  this.prepareMQTT();
};

RemoteFormPreview.prototype.prepareMQTT = function () {
  var client = window.MQTT.connect('wss:absol.cf:9884');
  this.mqttClient = client;
  window.mqttClient = client;
  client.on('connect', () => {
    client.subscribe('rfp/' + this.id, err => {
      if (!err) {
        _Toast.default.make({
          props: {
            variant: 'success',
            htitle: "Connect with id = " + this.id,
            disappearTimeout: 14000
          },
          child: {
            style: {
              padding: '5px'
            },
            child: {
              text: 'Subscribe channel ' + 'rfp/' + this.id
            }
          }
        });
      }
    });
  });
  client.on('message', (topic, payload) => {
    try {
      var message = JSON.parse(payload.toString());

      if (message.type === 'form') {
        var clazz = (0, _FmFragment.makeFmFragmentClass)({
          tag: 'TestFragment',
          contentViewData: message.data
        });

        _Assembler.AssemblerInstance.addClass(clazz);

        this.$body.clearChild();

        var frg = _Assembler.AssemblerInstance.build({
          class: 'TestFragment'
        });

        this.$body.addChild(frg.domElt);
        frg.start();
      }
    } catch (e) {
      console.error(e);
    }
  });
};

RemoteFormPreview.prototype.onStop = function () {};

var _default = RemoteFormPreview;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("absol/src/polyfill");

require("./css/base.css");

require("./css/layouteditor.css");

var _RelativeAnchor = _interopRequireDefault(require("./js/anchors/RelativeAnchor"));

var _TextInput = _interopRequireDefault(require("./js/components/TextInput"));

var _RelativeLayout = _interopRequireDefault(require("./js/layouts/RelativeLayout"));

var _Assembler = _interopRequireWildcard(require("./js/core/Assembler"));

var _DateInput = _interopRequireDefault(require("./js/components/DateInput"));

var _BaseComponent = _interopRequireDefault(require("./js/core/BaseComponent"));

var _LayoutEditor = _interopRequireDefault(require("./js/layouteditor/LayoutEditor"));

var _FCore = _interopRequireDefault(require("./js/core/FCore"));

var _FMLauncher = _interopRequireDefault(require("./js/launcher/FMLauncher"));

var _AllPropertyEditor = _interopRequireDefault(require("./js/editor/AllPropertyEditor"));

var _AttributeEditor = _interopRequireDefault(require("./js/editor/AttributeEditor"));

var _ComponentOutline = _interopRequireDefault(require("./js/layouteditor/ComponentOutline"));

var _ComponentPicker = _interopRequireDefault(require("./js/layouteditor/ComponentPicker"));

var _ListEditor = _interopRequireDefault(require("./js/editor/ListEditor"));

var _PropertyEditor = _interopRequireDefault(require("./js/editor/PropertyEditor"));

var _StyleEditor = _interopRequireDefault(require("./js/editor/StyleEditor"));

var _ContentScalelessComponent = _interopRequireDefault(require("./js/core/ContentScalelessComponent"));

var _ScalableComponent = _interopRequireDefault(require("./js/core/ScalableComponent"));

var _FModel = _interopRequireDefault(require("./js/core/FModel"));

var _FNode = _interopRequireWildcard(require("./js/core/FNode"));

var _FViewable = _interopRequireDefault(require("./js/core/FViewable"));

var _Button = _interopRequireDefault(require("./js/components/Button"));

var _Checkbox = _interopRequireDefault(require("./js/components/Checkbox"));

var _ComboBox = _interopRequireDefault(require("./js/components/ComboBox"));

var _Image = _interopRequireDefault(require("./js/components/Image"));

var _Label = _interopRequireDefault(require("./js/components/Label"));

var _NumberInput = _interopRequireDefault(require("./js/components/NumberInput"));

var _Radio = _interopRequireDefault(require("./js/components/Radio"));

var _Table = _interopRequireDefault(require("./js/components/Table"));

var _Text = _interopRequireDefault(require("./js/components/Text"));

var _TextArea = _interopRequireDefault(require("./js/components/TextArea"));

var _RelativeAnchorEditor = _interopRequireDefault(require("./js/layouteditor/anchoreditors/RelativeAnchorEditor"));

var _LayoutSizeEditor = _interopRequireDefault(require("./js/propertyeditors/LayoutSizeEditor"));

var _PluginManager = _interopRequireDefault(require("./js/core/PluginManager"));

var _R = _interopRequireDefault(require("./js/R"));

var framePlugins = _interopRequireWildcard(require("./js/frame/plugins"));

var _LayoutEditorCmd = _interopRequireDefault(require("./js/layouteditor/LayoutEditorCmd"));

var _FormPreviewCmd = _interopRequireWildcard(require("./js/cmds/FormPreviewCmd"));

var _FormEditorPreconfig = _interopRequireDefault(require("./js/FormEditorPreconfig"));

var _FmFragment = _interopRequireWildcard(require("./js/core/FmFragment"));

var _inheritComponentClass = _interopRequireDefault(require("./js/core/inheritComponentClass"));

var _BlockTreeList = _interopRequireDefault(require("./js/blocks/BlockTreeList"));

var _GCore = _interopRequireDefault(require("./js/core/GCore"));

var _CircuitDiagramEditor = _interopRequireDefault(require("./js/ciruiteditor/diagrameditor/CircuitDiagramEditor"));

var _CKTemplateEditor = require("./js/components/CKTemplateEditor");

var _FLauncher = _interopRequireDefault(require("./js/launcher/FLauncher"));

var _BlocklyDataModel = _interopRequireDefault(require("./js/frame/BlocklyDataModel"));

var _BlocklyStartExploringFragment = _interopRequireDefault(require("./js/frame/BlocklyStartExploringFragment"));

var _SCLauncher = _interopRequireDefault(require("./js/sclang/editor/SCLauncher"));

var _RemoteFormPreview = _interopRequireDefault(require("./js/layouteditor/RemoteFormPreview"));




var _default = {
  FormEditorPreconfig: _FormEditorPreconfig.default,
  framePlugin: framePlugins,
  blocklyPlugin: {
    'BlocklyDataModel': _BlocklyDataModel.default,
    'BlocklyStartExploringFragment': _BlocklyStartExploringFragment.default
  },
  R: _R.default,
  AllPropertyEditor: _AllPropertyEditor.default,
  AttributeEditor: _AttributeEditor.default,
  AnchorEditor: _RelativeAnchorEditor.default,
  ComponentOutline: _ComponentOutline.default,
  ComponentPicker: _ComponentPicker.default,
  ListEditor: _ListEditor.default,
  PropertyEditor: _PropertyEditor.default,
  StyleEditor: _StyleEditor.default,
  LayoutSizeEditor: _LayoutSizeEditor.default,
  LayoutEditorCmd: _LayoutEditorCmd.default,
  FormPreviewCmd: _FormPreviewCmd.default,
  FormPreviewCmdDescriptors: _FormPreviewCmd.FormPreviewCmdDescriptors,
  PluginManager: _PluginManager.default,
  FViewable: _FViewable.default,
  FNode: _FNode.default,
  FModel: _FModel.default,
  FormEditor: _FMLauncher.default,
  LayoutEditor: _LayoutEditor.default,
  ScalableComponent: _ScalableComponent.default,
  ContentScalelessComponent: _ContentScalelessComponent.default,
  RelativeAnchor: _RelativeAnchor.default,
  BaseComponent: _BaseComponent.default,
  RelativeLayout: _RelativeLayout.default,
  TextInput: _TextInput.default,
  DateInput: _DateInput.default,
  Button: _Button.default,
  CheckBox: _Checkbox.default,
  ComboBox: _ComboBox.default,
  Image: _Image.default,
  Label: _Label.default,
  NumberInput: _NumberInput.default,
  Radio: _Radio.default,
  Table: _Table.default,
  Text: _Text.default,
  TextArea: _TextArea.default,
  Assembler: _Assembler.default,
  core: _FCore.default,
  coreSvg: _GCore.default,
  FmFragment: _FmFragment.default,
  makeFmFragmentConstructor: _FmFragment.makeFmFragmentClass,
  makeFmFragmentClass: _FmFragment.makeFmFragmentClass,
  AssemblerInstance: _Assembler.AssemblerInstance,
  findComponentsByName: _Assembler.findComponentByName,
  findComponent: _Assembler.findComponent,
  findComponentsById: _Assembler.findComponentById,
  traversal: _FNode.traversal,
  inheritComponentClass: _inheritComponentClass.default,
  BlockTreeList: _BlockTreeList.default,
  CircuitDiagramEditor: _CircuitDiagramEditor.default,
  parseCKTemplate: _CKTemplateEditor.parseCKTemplate,
  'FLauncher': _FLauncher.default,
  'RemoteFormPreview': _RemoteFormPreview.default,
  'SCLauncher': _SCLauncher.default
};
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/sc/TokenizeInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/sc/TokenizeInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../../core/FCore"));

var _SCParser = _interopRequireDefault(require("../../sclang/engine/SCParser"));

require("../../../css/tokenizeinput.css");

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));




/***
 * @extends AElement
 * @constructor
 */
function TokenizeInput() {
  this._readOnly = true;
  this._value = '';
  this.on('keydown', this.eventHandler.keydown).on('mousedown', this.eventHandler.mousedown).on('mouseup', this.eventHandler.mouseup).on('focus', this.eventHandler.focus);
  this.$highlightingElts = [];
}

TokenizeInput.tag = 'TokenizeInput'.toLowerCase();

TokenizeInput.render = function () {
  return (0, _FCore._)({
    class: 'as-tokenize-input',
    attr: {
      contenteditable: 'true'
    }
  });
};

TokenizeInput.property = {};
TokenizeInput.property.value = {
  set: function (value) {
    value = (value || '') + '';
    this._value = value;

    var tokens = _SCParser.default.tokenizer.tokenize(value);

    tokens = tokens.reduce(function (ac, cr) {
      var last = ac[ac.length - 1];

      if (last && last.content[0] === '{' && last.content[last.content.length - 1] !== '}') {
        last.content += cr.content;
        last.end = cr.end;
        last.type = 'constance';
      } else {
        ac.push(cr);
      }

      return ac;
    }, []);
    var tokenEltArr = tokens.map(function (token) {
      return (0, _FCore._)({
        tag: 'span',
        class: ['as-token', 'as-type-' + token.type],
        child: {
          text: token.content
        },
        props: {
          token: token
        }
      });
    });
    this.clearChild();
    this.addChild(tokenEltArr);
  },
  get: function () {
    return this._value;
  }
};
TokenizeInput.property.readOnly = {
  set: function (value) {
    value = value || true;
    this._readOnly = value;

    if (value) {
      this.addClass('as-read-only');
    } else {
      this.removeClass('as-read-only');
    }
  },
  get: function () {
    return this._readOnly;
  }
};
/***
 * @memberOf TokenizeInput#
 * @type {{}}
 */

TokenizeInput.eventHandler = {};

TokenizeInput.eventHandler.keydown = function (event) {
  if (this._readOnly) {
    if (event.key === 'Delete' || event.key === 'Backspace' || event.key === 'Enter' || event.key.length === 1) {
      event.preventDefault();
      return;
    }
  }

  setTimeout(this.updateHighlight.bind(this), 1); // console.log(event.key)
};

TokenizeInput.prototype.getSelectPosition = _PreInput.default.prototype.getSelectPosition;
TokenizeInput.prototype.getPosition = _PreInput.default.prototype.getPosition;
TokenizeInput.prototype.stringOf = _PreInput.default.prototype.stringOf;

TokenizeInput.prototype.updateHighlight = function () {
  this.$highlightingElts.forEach(function (elt) {
    elt.removeClass('as-highlight');
  });
  this.$highlightingElts = [];
  var selPos = this.getSelectPosition();
  if (!selPos) return;
  var startElt, endElt, i, elt, token;
  var c, pos;

  if (selPos.start === selPos.end) {
    c = this._value[selPos.start];
    pos = selPos.start;

    if (c !== '(' && c !== ')') {
      c = this._value[selPos.start - 1];
      pos = selPos.start - 1;
    }

    if (c === '(' || c === ')') {
      if (c === '(') {
        for (i = 0; i < this.childNodes.length; ++i) {
          elt = this.childNodes[i];
          token = elt.token;

          if (token.start <= pos && token.end > pos) {
            startElt = elt;
          } else if (startElt && token.content === ')') {
            endElt = elt;
            break;
          }
        }
      } else {
        for (i = this.childNodes.length - 1; i >= 0; --i) {
          elt = this.childNodes[i];
          token = elt.token;

          if (token.start <= pos && token.end > pos) {
            endElt = elt;
          } else if (endElt && token.content === '(') {
            startElt = elt;
            break;
          }
        }
      }

      if (startElt && endElt) {
        startElt.addClass('as-highlight');
        endElt.addClass('as-highlight');
        this.$highlightingElts = [startElt, endElt];
      }
    }
  }
};

TokenizeInput.eventHandler.focus = function () {
  setTimeout(this.updateHighlight.bind(this), 1);
};

TokenizeInput.eventHandler.blur = function () {
  setTimeout(this.updateHighlight.bind(this), 1);
};

TokenizeInput.eventHandler.mousedown = function () {
  setTimeout(this.updateHighlight.bind(this), 1);
};

TokenizeInput.eventHandler.mouseup = function () {
  setTimeout(this.updateHighlight.bind(this), 1);
};

_FCore.default.install(TokenizeInput);

var _default = TokenizeInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/sc/SCExpressionInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/sc/SCExpressionInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FCore = _interopRequireWildcard(require("../../core/FCore"));

require("../../../css/scexpressioninput.css");

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _SCParser = _interopRequireDefault(require("../../sclang/engine/SCParser"));

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));

var _Text = _interopRequireDefault(require("../../components/Text"));




/***
 * @extends AElement
 * @constructor
 */
function SCExpressionInput() {
  this._stopChangeTO = -1;
  this.on('stopchange', this.highlightError.bind(this));
  this.$content = (0, _FCore.$)('.as-sc-expression-input-content', this).on('keydown', this.eventHandler.keydown).on('cut', this.eventHandler.cut).on('blur', this.eventHandler.blur).on('focus', this.eventHandler.focus).on('paste', this.eventHandler.paste);
  this.$domSignal = (0, _FCore._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('redrawTokens', this.redrawTokens.bind(this));
  this.lastSelectedPostion = null;
  /****
   * @name value
   * @type {string}
   * @memberOf SCExpressionInput#
   */
}

SCExpressionInput.tag = 'SCExpressionInput'.toLowerCase();

SCExpressionInput.render = function () {
  return (0, _FCore._)({
    extendEvent: ['stopchange'],
    class: ['as-sc-expression-input'],
    child: [{
      class: 'as-sc-expression-input-icon-ctn',
      child: ['span.mdi.mdi-function-variant', 'span.mdi.mdi-alert-circle']
    }, {
      class: 'as-sc-expression-input-content',
      attr: {
        contenteditable: "true"
      }
    }]
  });
};

SCExpressionInput.prototype.tokenize = function (source) {
  return [];
};

SCExpressionInput.prototype.getSelectPosition = _PreInput.default.prototype.getSelectPosition;
SCExpressionInput.prototype.getPosition = _PreInput.default.prototype.getPosition;
SCExpressionInput.prototype.stringOf = _PreInput.default.prototype.stringOf;

SCExpressionInput.prototype.tokenOf = function (elt) {};

SCExpressionInput.prototype.delayNotifyStopChange = function () {
  if (this._stopChangeTO > 0) {
    clearTimeout(this._stopChangeTO);
  }

  this._stopChangeTO = setTimeout(function () {
    this._stopChangeTO = -1;
    this.emit('stopchange', {}, this);
  }.bind(this), 200);
};

SCExpressionInput.prototype.makeTokenElt = function (token) {
  return (0, _FCore._)({
    tag: 'span',
    class: ['as-token'],
    attr: {
      'data-type': token.type
    },
    child: {
      text: token.content
    }
  });
};

SCExpressionInput.prototype.tokenOf = function (elt) {
  if (!elt.classList.contains('as-token')) return null;
  var res = {};
  res.type = elt.getAttribute('data-type');
  res.content = elt.firstChild && elt.firstChild.data;
  if (res.type && res.content) return res;
  return null;
};

SCExpressionInput.prototype.highlightError = function () {
  var value = this.value.trim();

  var it = _SCParser.default.parse(value, 'exp');

  var i,
      notSkipCount = 0;
  var tokenErrorIdx = -1;

  if (value && it.error) {
    this.addClass('as-error');
    this.attr('title', it.error.message);
    tokenErrorIdx = it.error.tokenIdx;
  } else {
    this.removeClass('as-error');
  }

  for (i = 0; i < this.$content.childNodes.length; ++i) {
    if (this.$content.childNodes[i].classList.contains('as-token') && this.$content.childNodes[i].getAttribute('data-type') !== 'skip') {
      if (notSkipCount === tokenErrorIdx) {
        this.$content.childNodes[i].classList.add('as-unexpected-token');
      } else {
        this.$content.childNodes[i].classList.remove('as-unexpected-token');
      }

      notSkipCount++;
    }
  }
};

SCExpressionInput.prototype.clearErrorHighlight = function () {
  for (var i = 0; i < this.$content.childNodes.length; ++i) {
    if (this.$content.childNodes[i].classList.contains('as-token') && this.$content.childNodes[i].getAttribute('data-type') !== 'skip') {
      this.$content.childNodes[i].classList.remove('as-unexpected-token');
    }
  }
};

SCExpressionInput.prototype.setSelectedPosition = function (pos) {
  //when tokenized
  var start;
  var end;

  if (typeof pos === "number") {
    start = pos;
    end = pos;
  } else {
    start = pos.start;
    end = pos.end;
  }

  var curOffset = 0;
  var elt;
  var childNodes = this.$content.childNodes;
  var content;
  var i;
  var sel = window.getSelection();
  var range = document.createRange();
  var d1 = true,
      d2 = true;

  for (i = 0; i < childNodes.length && d1 && d2; ++i) {
    elt = childNodes[i];
    content = elt.firstChild && elt.firstChild.data || '';

    if (d1 && curOffset <= start && (curOffset + content.length > start || i + 1 === childNodes.length)) {
      range.setStart(elt.firstChild || elt, start - curOffset);
      d1 = false;
    }

    if (d2 && curOffset <= end && (curOffset + content.length > end || i + 1 === childNodes.length)) {
      range.setEnd(elt.firstChild || elt, end - curOffset);
      d2 = false;
    }

    curOffset += content.length;
  }

  sel.removeAllRanges();
  sel.addRange(range);
  this.lastSelectedPostion = {
    start: start,
    end: end,
    direction: 'forward'
  };
};

SCExpressionInput.prototype.insertText = function (text) {
  var lastPos = this.lastSelectedPostion;
  var value;

  if (this.lastSelectedPostion) {
    value = this.value;
    this.value = value.substring(0, lastPos.start) + text + value.substring(lastPos.end);
    this.lastSelectedPostion = Object.assign({
      direction: 'forward',
      start: lastPos.start + text.length,
      end: lastPos.start + text.length
    });

    if (document.activeElement === this.$content) {
      this.setSelectedPosition(this.lastSelectedPostion);
    }
  } else this.appendText(text);

  this.delayNotifyStopChange();
};

SCExpressionInput.prototype.appendText = function (text) {
  var newValue = this.value + text;
  this.value = newValue;

  if (document.activeElement === this.$content) {
    this.setSelectedPosition(newValue.length);
  }

  this.delayNotifyStopChange();
};

SCExpressionInput.prototype.redrawTokens = function () {
  var selectedPos = this.getSelectPosition();
  var value = this.value;

  var tokens = _SCParser.default.tokenizer.tokenize(value);

  var tokenEltChain = Array.prototype.slice.call(this.$content.childNodes);

  while (tokenEltChain[tokenEltChain.length - 1] && tokenEltChain[tokenEltChain.length - 1].tagName === 'BR') {
    tokenEltChain.pop();
  }

  var leftPassed = 0;

  while (leftPassed < tokenEltChain.length && leftPassed < tokens.length) {
    if (!tokenEltChain[leftPassed].firstChild || !tokenEltChain[leftPassed].classList.contains('as-token') || tokens[leftPassed].content !== tokenEltChain[leftPassed].firstChild.data) break;

    if (!tokenEltChain[leftPassed].token || tokenEltChain[leftPassed].getAttribute('data-type') !== tokens[leftPassed].type) {
      tokenEltChain[leftPassed].setAttribute('data-type', tokens[leftPassed].type);
    }

    leftPassed++;
  }

  var rightPassed = 0;

  while (rightPassed < tokenEltChain.length && rightPassed < tokens.length) {
    if (!tokenEltChain[tokenEltChain.length - 1 - rightPassed].firstChild || !tokenEltChain[tokenEltChain.length - 1 - rightPassed].classList.contains('as-token') || tokens[tokens.length - 1 - rightPassed].content !== tokenEltChain[tokenEltChain.length - 1 - rightPassed].firstChild.data) break;

    if (tokenEltChain[tokenEltChain.length - 1 - rightPassed].getAttribute('data-type') !== tokens[tokens.length - 1 - rightPassed].type) {
      tokenEltChain[tokenEltChain.length - 1 - rightPassed].setAttribute('data-type', tokens[tokens.length - 1 - rightPassed].type);
    }

    rightPassed++;
  }

  var beforeToken;

  if (leftPassed + rightPassed < Math.max(tokenEltChain.length, tokens.length)) {
    beforeToken = tokenEltChain[tokenEltChain.length - rightPassed];
    tokenEltChain.splice(leftPassed, tokenEltChain.length - leftPassed - rightPassed).forEach(function (elt) {
      elt.remove();
    });
    tokens.slice(leftPassed, tokens.length - rightPassed).forEach(function (token) {
      var tokenElt = this.makeTokenElt(token);

      if (beforeToken) {
        this.$content.addChildBefore(tokenElt, beforeToken);
      } else {
        this.$content.addChild(tokenElt);
      }
    }.bind(this));
  }

  if (selectedPos) this.setSelectedPosition(selectedPos);
};

SCExpressionInput.property = {};
SCExpressionInput.property.value = {
  get: function () {
    return this.stringOf(this.$content);
  },
  set: function (value) {
    var tokens = _SCParser.default.tokenizer.tokenize(value || '');

    this.$content.clearChild().addChild(tokens.map(function (token) {
      return this.makeTokenElt(token);
    }.bind(this)));
    this.lastSelectedPostion = null;
  }
};
/***
 * @memberOf SCExpressionInput#
 * @type {{}}
 */

SCExpressionInput.eventHandler = {};
/***
 *
 * @param {KeyboardEvent} event
 */

SCExpressionInput.eventHandler.keydown = function (event) {
  if (event.key === 'Enter') {
    event.preventDefault();
  } else if (event.ctrlKey && event.key === 'X' || !event.ctrlKey && event.key.length === 1 || event.key === 'Delete' || event.key === 'Backspace') {
    this.domSignal.emit('redrawTokens');
  }

  this.delayNotifyStopChange();
};
/***
 *
 * @param {MouseEvent} event
 */


SCExpressionInput.eventHandler.mousedown = function (event) {};

SCExpressionInput.eventHandler.paste = function (event) {
  let paste = (event.clipboardData || window.clipboardData).getData('text');
  paste = paste.replace(/[\r\n]+/g, ' ');
  event.preventDefault();
  var pos = this.getSelectPosition();
  if (!pos || !paste) return;
  var value = this.value;
  var newValue = value.substring(0, pos.start) + paste + value.substring(pos.end);
  this.value = newValue;
  this.setSelectedPosition(pos.start + paste.length);
  this.highlightError();
};

SCExpressionInput.eventHandler.cut = function (event) {
  this.domSignal.emit('redrawTokens');
  this.delayNotifyStopChange();
};
/***
 * @this SCExpressionInput
 */


SCExpressionInput.eventHandler.blur = function () {
  this.highlightError();
};
/***
 * @this SCExpressionInput
 */


SCExpressionInput.eventHandler.focus = function () {
  this.clearErrorHighlight();
  setTimeout(function () {
    this.lastSelectedPostion = this.getSelectPosition();
  }.bind(this), 100);
};

_FCore.default.install(SCExpressionInput);

var _default = SCExpressionInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/dom/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/dom/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = install;
exports.publicCreators = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _CDENode = _interopRequireDefault(require("./circuit/CDENode"));

var _TokenizeInput = _interopRequireDefault(require("./sc/TokenizeInput"));

var _SCExpressionInput = _interopRequireDefault(require("./sc/SCExpressionInput"));


var publicCreators = [_CDENode.default, _TokenizeInput.default, _SCExpressionInput.default];
/***
 *
 * @param {Dom} core
 */

exports.publicCreators = publicCreators;

function install(core) {
  return core.install(publicCreators);
}
};

moduleFactories["node_modules/absol/src/SCLang/SCExpressionCaller.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol/src/SCLang/SCExpressionCaller.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.evalSCExpression = evalSCExpression;
exports.default = void 0;

var _SCOperators = require("./SCOperators");

var _SCParser = _interopRequireDefault(require("./SCParser"));


/***
 *
 * @param {{}} ast
 * @param {{}}env
 * @constructor
 */
function SCExpressionCaller(ast, env) {
  this.ast = ast;
  this.env = Object.assign({}, env);

  if (env instanceof Array) {
    env.reduce(function (ac, subEnv) {
      Object.assign(ac, subEnv);
      return ac;
    });
  } else {
    Object.assign(this.env, env);
  }
}

SCExpressionCaller.prototype.exec = function () {
  return this.accept(this.ast);
};

SCExpressionCaller.prototype.accept = function (node) {
  var vf = this.visitor[node.type];

  if (vf) {
    return vf(node, this);
  } else {
    console.error("Node error:", node);
  }
};

SCExpressionCaller.prototype.visitor = {
  NumericLiteral: function (node, caller) {
    return node.value;
  },
  StringLiteral: function (node, caller) {
    return node.value;
  },
  BinaryExpression: function (node, caller) {
    var leftValue = caller.accept(node.left);
    var rightValue = caller.accept(node.right);
    var fun = caller.binaryOperator2Function[node.operator.content];
    return fun(leftValue, rightValue);
  },
  UnaryExpression: function (node, caller) {
    var fun = caller.unaryOperator2Function[node.operator.content];
    var arg = caller.accept(node.argument);
    return fun(arg);
  },
  Identifier: function (node, caller) {
    return caller.env[node.name];
  },
  CallExpression: function (node, caller) {
    var calleeFunction = caller.accept(node.callee);
    var argumentValues = node.arguments.map(function (exp) {
      return caller.accept(exp);
    });
    return calleeFunction.apply(null, argumentValues);
  },
  MemberExpression: function (node, caller) {
    var object = caller.accept(node.object);
    var key = node.property.name;
    var res = object[key];
    if (typeof res === "function") return res.bind(object);
    return res;
  }
};
SCExpressionCaller.prototype.binaryOperator2Function = {
  '+': _SCOperators.ADD,
  '-': _SCOperators.SUB,
  '*': _SCOperators.MUL,
  '/': _SCOperators.DIV
};
SCExpressionCaller.prototype.unaryOperator2Function = {
  '+': _SCOperators.POSITIVE,
  '-': _SCOperators.NEGATIVE
};

function evalSCExpression(code, env) {
  var parsed = _SCParser.default.parse(code, 'exp');

  var caller;

  if (parsed.ast) {
    caller = new SCExpressionCaller(parsed.ast, env);
    return caller.exec();
  } else {
    throw parsed.error;
  }
}

var _default = SCExpressionCaller;
exports.default = _default;
};

moduleFactories["node_modules/absol-form/js/sclang/engine/SCExpressionCaller.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/engine/SCExpressionCaller.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
var _exportNames = {};
Object.defineProperty(exports, "default", {
  enumerable: true,
  get: function () {
    return _SCExpressionCaller.default;
  }
});

var _SCExpressionCaller = _interopRequireWildcard(require("absol/src/SCLang/SCExpressionCaller"));

Object.keys(_SCExpressionCaller).forEach(function (key) {
  if (key === "default" || key === "__esModule") return;
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
  if (key in exports && exports[key] === _SCExpressionCaller[key]) return;
  Object.defineProperty(exports, key, {
    enumerable: true,
    get: function () {
      return _SCExpressionCaller[key];
    }
  });
});


function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
};

moduleFactories["node_modules/absol-form/js/sclang/engine/SCProgramInstance.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/js/sclang/engine/SCProgramInstance.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
Object.defineProperty(exports, "default", {
  enumerable: true,
  get: function () {
    return _SCProgramInstance.default;
  }
});

var _SCProgramInstance = _interopRequireWildcard(require("absol/src/SCLang/SCProgramInstance"));

var ExcelFx = _interopRequireWildcard(require("absol-sheet/js/fx/ExcelFx"));

var _utils = require("absol-acomp/js/utils");

var _SCTypeManager = _interopRequireDefault(require("../editor/SCTypeManager"));




var std = {
  isRealNumber: _utils.isRealNumber,
  isNaturalNumber: _utils.isNaturalNumber
};

std.delay = function (mil) {
  return new Promise(rs => {
    setTimeout(rs, mil);
  });
};

Object.keys(ExcelFx).reduce((ac, key) => {
  Object.defineProperty(ac, key, {
    enumerable: true,
    writable: false,
    value: ExcelFx[key]
  });
  return ac;
}, std);

_SCProgramInstance.SCStaticLibScope.declareConst('std', std, true, 'std');

_SCProgramInstance.SCStaticLibScope.declareConst('Date', Date, true, 'Date');

_SCProgramInstance.SCStaticLibScope.declareConst('Math', Math, true, 'Math');

_SCProgramInstance.SCStaticLibScope.declareConst('Date', Date, true, 'Math');

_SCProgramInstance.SCStaticLibScope.declareConst('Object', Object, true, 'Math');

_SCProgramInstance.SCStaticLibScope.declareConst('Array', Array, true, 'Math');

var descriptors = {};

function argsOf(func) {
  var res = [];
  var txt, matched;
  txt = func + '';
  matched = txt.match(/^\s*function[^(]*\(([^)]*)\)/);

  if (matched) {
    res = matched[1].split(',').map(function (x) {
      return x.trim();
    }).filter(function (x) {
      return !!x;
    }).map(function (name) {
      name = name + '';
      var optional = false;

      if (name.indexOf('=') >= 0) {
        name = name.split('=').shift().trim();
        optional = true;
      }

      var desc = {
        type: 'any',
        name: name
      };
      if (optional) desc.optional = true;
      return desc;
    });
  }

  return res;
}

function visit(target, path) {
  var res = {
    typeId: path.join('.')
  };

  if (target === undefined) {
    delete res.typeId;
    res.type = 'null';
  } else if (target === null) {
    delete res.typeId;
    res.type = 'null';
  } else if (typeof target === "object") {
    res.type = 'object';
    res.properties = Object.keys(target).map(function (key) {
      var p = visit(target[key], path.concat([key]));
      p.name = key;
      return p;
    });
  } else if (typeof target === "function") {
    res.type = 'function';
    res.args = argsOf(target);
  }

  return res;
}

descriptors['std'] = visit(std, ['std']);

_SCTypeManager.default.addTypeDescriptors(descriptors);
};

moduleFactories["node_modules/absol-brace/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-brace/dev.js ***/
"use strict";

var _ = _interopRequireDefault(require("."));


global.AbsolBrace = _.default;
};

moduleFactories["node_modules/absol-form/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-form/dev.js ***/
"use strict";

require("absol/src/absol");

require("absol-acomp/dev");

require("absol-colorpicker/dev");

require("absol-svg/dev");

var _ = _interopRequireDefault(require("."));

var _XLoader = _interopRequireDefault(require("absol/src/Network/XLoader"));

var _install = _interopRequireDefault(require("./js/dom/install"));

var _SCParser = _interopRequireDefault(require("./js/sclang/engine/SCParser"));

var _SCExpressionCaller = _interopRequireWildcard(require("./js/sclang/engine/SCExpressionCaller"));

var _SCProgramInstance = _interopRequireDefault(require("./js/sclang/engine/SCProgramInstance"));

var _SCBlocklyEditor = _interopRequireDefault(require("./js/sclang/editor/SCBlocklyEditor"));

require("absol-brace/dev");

var _SCGrammar = _interopRequireDefault(require("absol/src/SCLang/SCGrammar"));

var _SCTypeManager = _interopRequireDefault(require("./js/sclang/editor/SCTypeManager"));




(0, _install.default)(absol.coreDom);
window.absol.form = _.default;
window.absol.XLoader = _XLoader.default;
absol.sclang = absol.sclang || {};
Object.assign(absol.sclang, {
  SCParser: _SCParser.default,
  SCExpressionCaller: _SCExpressionCaller.default,
  SCGrammar: _SCGrammar.default,
  evalSCExpression: _SCExpressionCaller.evalSCExpression,
  SCProgramInstance: _SCProgramInstance.default,
  "SCBlocklyEditor": _SCBlocklyEditor.default,
  "SCTypeManager": _SCTypeManager.default
});
};

moduleFactories["node_modules/brace/ext/static_highlight.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/brace/ext/static_highlight.js ***/
"use strict";

ace.define("ace/ext/static_highlight", ["require", "exports", "module", "ace/edit_session", "ace/layer/text", "ace/config", "ace/lib/dom"], function (acequire, exports, module) {
  "use strict";

  var EditSession = acequire("../edit_session").EditSession;
  var TextLayer = acequire("../layer/text").Text;
  var baseStyles = ".ace_static_highlight {\
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;\
font-size: 12px;\
white-space: pre-wrap\
}\
.ace_static_highlight .ace_gutter {\
width: 2em;\
text-align: right;\
padding: 0 3px 0 0;\
margin-right: 3px;\
}\
.ace_static_highlight.ace_show_gutter .ace_line {\
padding-left: 2.6em;\
}\
.ace_static_highlight .ace_line { position: relative; }\
.ace_static_highlight .ace_gutter-cell {\
-moz-user-select: -moz-none;\
-khtml-user-select: none;\
-webkit-user-select: none;\
user-select: none;\
top: 0;\
bottom: 0;\
left: 0;\
position: absolute;\
}\
.ace_static_highlight .ace_gutter-cell:before {\
content: counter(ace_line, decimal);\
counter-increment: ace_line;\
}\
.ace_static_highlight {\
counter-reset: ace_line;\
}\
";
  var config = acequire("../config");
  var dom = acequire("../lib/dom");

  var SimpleTextLayer = function () {
    this.config = {};
  };

  SimpleTextLayer.prototype = TextLayer.prototype;

  var highlight = function (el, opts, callback) {
    var m = el.className.match(/lang-(\w+)/);
    var mode = opts.mode || m && "ace/mode/" + m[1];
    if (!mode) return false;
    var theme = opts.theme || "ace/theme/textmate";
    var data = "";
    var nodes = [];

    if (el.firstElementChild) {
      var textLen = 0;

      for (var i = 0; i < el.childNodes.length; i++) {
        var ch = el.childNodes[i];

        if (ch.nodeType == 3) {
          textLen += ch.data.length;
          data += ch.data;
        } else {
          nodes.push(textLen, ch);
        }
      }
    } else {
      data = dom.getInnerText(el);
      if (opts.trim) data = data.trim();
    }

    highlight.render(data, mode, theme, opts.firstLineNumber, !opts.showGutter, function (highlighted) {
      dom.importCssString(highlighted.css, "ace_highlight");
      el.innerHTML = highlighted.html;
      var container = el.firstChild.firstChild;

      for (var i = 0; i < nodes.length; i += 2) {
        var pos = highlighted.session.doc.indexToPosition(nodes[i]);
        var node = nodes[i + 1];
        var lineEl = container.children[pos.row];
        lineEl && lineEl.appendChild(node);
      }

      callback && callback();
    });
  };

  highlight.render = function (input, mode, theme, lineStart, disableGutter, callback) {
    var waiting = 1;
    var modeCache = EditSession.prototype.$modes;

    if (typeof theme == "string") {
      waiting++;
      config.loadModule(['theme', theme], function (m) {
        theme = m;
        --waiting || done();
      });
    }

    var modeOptions;

    if (mode && typeof mode === "object" && !mode.getTokenizer) {
      modeOptions = mode;
      mode = modeOptions.path;
    }

    if (typeof mode == "string") {
      waiting++;
      config.loadModule(['mode', mode], function (m) {
        if (!modeCache[mode] || modeOptions) modeCache[mode] = new m.Mode(modeOptions);
        mode = modeCache[mode];
        --waiting || done();
      });
    }

    function done() {
      var result = highlight.renderSync(input, mode, theme, lineStart, disableGutter);
      return callback ? callback(result) : result;
    }

    return --waiting || done();
  };

  highlight.renderSync = function (input, mode, theme, lineStart, disableGutter) {
    lineStart = parseInt(lineStart || 1, 10);
    var session = new EditSession("");
    session.setUseWorker(false);
    session.setMode(mode);
    var textLayer = new SimpleTextLayer();
    textLayer.setSession(session);
    session.setValue(input);
    var stringBuilder = [];
    var length = session.getLength();

    for (var ix = 0; ix < length; ix++) {
      stringBuilder.push("<div class='ace_line'>");
      if (!disableGutter) stringBuilder.push("<span class='ace_gutter ace_gutter-cell' unselectable='on'>" +
      /*(ix + lineStart) + */
      "</span>");
      textLayer.$renderLine(stringBuilder, ix, true, false);
      stringBuilder.push("\n</div>");
    }

    var html = "<div class='" + theme.cssClass + "'>" + "<div class='ace_static_highlight" + (disableGutter ? "" : " ace_show_gutter") + "' style='counter-reset:ace_line " + (lineStart - 1) + "'>" + stringBuilder.join("") + "</div>" + "</div>";
    textLayer.destroy();
    return {
      css: baseStyles + theme.cssText,
      html: html,
      session: session
    };
  };

  module.exports = highlight;
  module.exports.highlight = highlight;
});

(function () {
  ace.acequire(["ace/ext/static_highlight"], function () {});
})();
};

moduleFactories["node_modules/absol-card/js/dom/Core.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/Core.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _AComp = _interopRequireDefault(require("absol-acomp/AComp"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _install = _interopRequireDefault(require("absol-mobile/js/dom/install"));


var Core = new _Dom.default();
Core.install(_AComp.default.core);
(0, _install.default)(Core);
var _default = Core;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/utils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/utils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createDefaultTaskCardQuickMenu = createDefaultTaskCardQuickMenu;
exports.verifyQuickMenuProperty = verifyQuickMenuProperty;
exports.repeatEvents = repeatEvents;

function createDefaultTaskCardQuickMenu() {
  return {
    props: {
      extendClasses: 'cd-context-menu',
      items: [{
        text: 'Trạng thái',
        extendClasses: "bsc-quickmenu",
        icon: {
          tag: "i",
          class: "material-icons",
          child: {
            text: "info"
          }
        },
        cmd: 'status'
      }, {
        text: 'Di chuyển',
        extendClasses: "bsc-quickmenu",
        icon: {
          tag: "i",
          class: "material-icons",
          child: {
            text: "open_with"
          }
        },
        cmd: 'move'
      }, {
        text: 'Sửa',
        extendClasses: "bsc-quickmenu",
        icon: {
          tag: "i",
          class: "material-icons",
          child: {
            text: "mode_edit"
          }
        },
        cmd: 'edit'
      }, {
        text: 'Xóa',
        extendClasses: "bsc-quickmenu red",
        icon: {
          tag: "i",
          class: "material-icons",
          child: {
            text: "delete"
          }
        },
        cmd: 'delete'
      }, {
        text: 'Lưu trữ',
        extendClasses: "bsc-quickmenu",
        icon: {
          tag: "i",
          class: "material-icons",
          child: {
            text: "turned_in_not"
          }
        },
        cmd: 'store'
      }]
    },
    onSelect: function (item) {// console.log('cmd: ', item.cmd);
    }
  };
}

function verifyQuickMenuProperty(qmenu) {
  if (qmenu) {
    if (!qmenu.props || !qmenu.props.items) {
      throw new Error("Invalid quickmenu, quickmenu.props.items not found!");
    }

    if (!qmenu.onSelect || typeof qmenu.onSelect != "function") {
      throw new Error("Invalid callback, quickmenu.onSelect is not a function");
    }
  }
}

function repeatEvents(_this, eventMap) {
  _this.defineEvent(Object.keys(eventMap));

  Object.keys(eventMap).forEach(function (name) {
    _this.on(eventMap[name], function (event) {
      this.emit(name, Object.assign({}, event, {
        type: name,
        target: this
      }), this);
    });
  });
}
};

moduleFactories["node_modules/absol-card/js/dom/status2Icon.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/status2Icon.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var TLStatusIconMap = {
  pin: 'span.mdi.mdi-pin',
  important: 'span.mdi.mdi-alert-circle',
  delay: 'span.mdi.mdi-clock-alert-outline',
  phone: 'span.mdi.mdi-phone',
  meeting: 'span.tl-card-flag.mdi.mdi-account-multiple',
  priority: function (value) {
    var className;

    if (value >= 0) {
      className = value < 10 ? 'mdi-numeric-' + value + '-box' : 'mdi-numeric-9-plus-box';
      return 'span.mdi.' + className;
    }

    return 'span';
  }
};
var _default = TLStatusIconMap;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/TLCard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/TLCard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireDefault(require("../dom/Core"));

var _BoardTable = require("absol-acomp/js/BoardTable");

require("../../css/tlcard.css");

var _utils = require("./utils");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _status2Icon = _interopRequireDefault(require("../dom/status2Icon"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _datetime = require("absol/src/Time/datetime");


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends AElement
 * @constructor
 */

function TLCard() {
  var thisC = this;
  this.$title = $('.tl-card-title', this);
  this.$body = $('.tl-card-body', this);
  var thisB = this;
  this._quickmenuAdapter = {
    getMenuProps: function () {
      if (thisB._quickmenu.getMenuProps) {
        return thisB._quickmenu.getMenuProps();
      }

      return thisB._quickmenu.props;
    },
    onSelect: function () {
      if (typeof thisB._quickmenu.onSelect == 'function') thisB._quickmenu.onSelect.apply(thisB, arguments);
    }
  };
  this.$contextBtn = $('.tl-card-context-btn', this);
  this._quickmenuHolder = null;
  this._quickmenu = null;
  this.quickmenu = (0, _utils.createDefaultTaskCardQuickMenu)();
  this.$priority = $('.tl-card-priority', this);
  this._priority = -1;
  this.$statusCtn = $('.tl-card-status-ctn', this);
  this._status = [];
  this.status = [];

  _OOP.default.drillProperty(this, this, 'name', 'title');

  _('attachhook').on('attached', function () {
    this.remove();
    thisC.updateAutoStyleValue();
  }).addTo(this);

  this.addEventListener('click', this.eventHandler.cardNativeClick);
}

TLCard.tag = "TLCard".toLowerCase();

TLCard.render = function () {
  return _({
    tag: 'board',
    class: ['tl-card', _BoardTable.DRAG_ZONE_CLASS_NAME],
    extendEvent: ['click'],
    child: [{
      class: ['tl-card-header'],
      child: [{
        tag: 'div',
        class: 'tl-card-title',
        child: []
      }, {
        class: 'tl-card-context-btn-ctn',
        child: [{
          tag: 'button',
          class: ['tl-card-context-btn', 'tl-transparent-btn'],
          child: 'span.mdi.mdi-dots-horizontal'
        }]
      }]
    }, {
      class: 'tl-card-body'
    }, {
      class: 'tl-card-footer',
      child: ['span.mdi.tl-card-priority.tl-card-footer-icon', {
        class: 'tl-card-status-ctn'
      }]
    }]
  }, true);
};

['addChild', 'findChildBefore', 'findChildAfter', 'removeChild', 'clearChild', 'addChildBefore', 'addChildAfter'].forEach(function (name) {
  TLCard.prototype[name] = function () {
    this.$body[name].apply(this.$body, arguments);
  };
});

TLCard.prototype.updateAutoStyleValue = function () {
  var backgroundColorStyle = this.getComputedStyleValue('background-color');
  var backgroundColor;

  try {
    backgroundColor = _Color.default.parse(backgroundColorStyle);
  } catch (error) {
    backgroundColor = _Color.default.parse('white');
  }

  var contractColor = backgroundColor.getContrastYIQ();
  var hsba = contractColor.toHSBA().slice();
  hsba[2] = 0.5 * 0.3 + hsba[2] * 0.7;

  var lowContractColor = _Color.default.fromHSB(hsba[0], hsba[1], hsba[2]);

  this.addStyle('--background-yiq-color', contractColor.toString('hex6'));
  this.addStyle('--background-low-yiq-color', lowContractColor.toString('hex6'));
};

TLCard.prototype.addStyle = function () {
  if (arguments[0] === 'background-color' || arguments[0] === 'background' || arguments[0] === 'backgroundColor') {
    _AElement.default.prototype.addStyle.apply(this, arguments);

    this.updateAutoStyleValue();
    return this;
  } else {
    return _AElement.default.prototype.addStyle.apply(this, arguments);
  }
};
/***
 * @memberOf TLCard#
 * @type {{}}
 */


TLCard.eventHandler = {};
/***
 * @this TLCard
 * @param event
 */

TLCard.eventHandler.cardNativeClick = function (event) {
  if (!(0, _EventEmitter.hitElement)(this.$contextBtn, event)) {
    this.emit('click', event, this);
  }
};

TLCard.property = {};
/***
 *
 * @type {{}|TLCard}
 */

TLCard.property.title = {
  set: function (value) {
    this.$title.clearChild();

    if (value === null || value === undefined) {
      this._title = null;
    }

    this._title = value;

    if (value !== null) {
      if (typeof value === 'string' || typeof value === "number") {
        this.$title.addChild(_({
          text: value
        }));
      } else if (value instanceof Date) {
        this.$title.addChild(_({
          text: (0, _datetime.formatDateTime)(value, 'dd/MM/yyyy hh:mm a')
        }));
      } else if (value instanceof Array) {
        this.$title.addChild(value.map(o => _(o)));
      } else {
        this.$title.addChild(_(value));
      }
    }
  },
  get: function () {
    return this._title || null;
  }
};
TLCard.property.quickmenu = {
  set: function (value) {
    value = value || null;

    if (value) {
      this.addClass('tl-has-context-menu');
    } else {
      this.removeClass('tl-has-context-menu');
    }

    if (value) {
      if (!this._quickmenuHolder) this._quickmenuHolder = _QuickMenu.default.toggleWhenClick(this.$contextBtn, this._quickmenuAdapter);
    } else {
      if (this._quickmenuHolder) {
        this._quickmenuHolder.remove();

        this._quickmenuHolder = null;
      }
    }

    this._quickmenu = value;
  },
  get: function () {
    return this._quickmenu;
  }
};
TLCard.property.isLoading = {
  set: function (value) {
    value = value || false;
    if (this._isLoading === value) return;
    this._isLoading = value;

    if (!this.$loadingIconCtn && value) {
      this.$loadingIconCtn = _({
        class: 'tl-card-loading-icon-ctn',
        child: 'spinnericon.tl-card-loading-icon'
      });
    }

    if (value) {
      this.appendChild(this.$loadingIconCtn);
    } else {
      if (this.$loadingIconCtn) this.$loadingIconCtn.remove();
    }
  },
  get: function () {
    return this._isLoading;
  }
};
/***
 *
 * @type {{}|TLCard}
 */

TLCard.property.priority = {
  set: function (value) {
    if (typeof value !== "number") value = -1;
    var className;

    if (this._priority >= 0) {
      className = this._priority < 10 ? 'mdi-numeric-' + this._priority + '-box' : 'mdi-numeric-9-plus-box';
      this.$priority.removeClass(className);

      if (value < 0) {
        this.removeClass('tl-has-priority');
      }
    } else {
      if (value > 0) {
        this.addClass('tl-has-priority');
      }
    }

    this._priority = value;

    if (this._priority >= 0) {
      className = this._priority < 10 ? 'mdi-numeric-' + this._priority + '-box' : 'mdi-numeric-9-plus-box';
      this.$priority.addClass(className);
    }
  },
  get: function () {
    return this._priority;
  }
};
TLCard.property.status = {
  set: function (status) {
    status = status || '';

    if (status.match) {
      //is string
      status = status.match(/[^\s,.]+/g);
    }

    if (status.reduce) {
      status = Object.keys(status.reduce(function (ac, cr) {
        ac[cr] = true;
        return ac;
      }, {}));
    } else {
      status = [];
    }

    if (status.length !== this._status.length) {
      if (status.length > 0) {
        this.addClass('tl-has-status');
      } else {
        this.removeClass('tl-has-status');
      }
    }

    this._status = status;
    this.$statusCtn.clearChild();

    for (var i = 0; i < status.length; ++i) {
      if (_status2Icon.default[status[i]]) {
        this.$statusCtn.addChild(_(_status2Icon.default[status[i]]).addClass('tl-card-footer-icon'));
      }
    }
  },
  get: function () {
    return this._status;
  }
};
TLCard.property.star = {
  get: function () {
    return this.hasClass('tl-card-has-star');
  },
  set: function (value) {
    if (value) {
      this.addClass('tl-card-has-star');
    } else {
      this.removeClass('tl-card-has-star');
    }
  }
};

_Core.default.install(TLCard);

var _default = TLCard;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/RepresentativeBoard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/RepresentativeBoard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.createDefaultBoardQuickMenu = createDefaultBoardQuickMenu;
exports.default = void 0;

require("../../css/boardcard.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _TLCard = _interopRequireDefault(require("./TLCard"));


var _ = _Core.default._;
var $ = _Core.default.$;

function createDefaultBoardQuickMenu() {
  return {
    props: {
      extendClasses: 'cd-context-menu',
      items: [{
        text: 'Sửa',
        extendClasses: "bsc-quickmenu",
        icon: {
          tag: "i",
          class: "material-icons",
          child: {
            text: "mode_edit"
          }
        }
      }, {
        text: 'Xóa',
        extendClasses: "bsc-quickmenu red",
        icon: {
          tag: "i",
          class: "material-icons",
          child: {
            text: "delete"
          }
        }
      }]
    }
  };
}
/***
 * @extends TLCard
 * @constructor
 */


function RepresentativeBoard() {}

RepresentativeBoard.tag = 'RepresentativeBoard'.toLowerCase();

RepresentativeBoard.render = function () {
  return _({
    tag: 'tlcard',
    class: 'cd-representative-board'
  }, true);
};

_Core.default.install(RepresentativeBoard);

var _default = RepresentativeBoard;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/TLBoardTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/TLBoardTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireDefault(require("../dom/Core"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

require("../../css/tlboardtable.css");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TLCard = _interopRequireDefault(require("./TLCard"));

var _TLList = _interopRequireDefault(require("./TLList"));

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _MHSnapScroller = _interopRequireDefault(require("absol-mobile/js/dom/MHSnapScroller"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));




var _ = _Core.default._;
var $ = _Core.default.$;

_Core.default.install(_MHSnapScroller.default);

var isIPhone = _BrowserDetector.default.isSafari && _BrowserDetector.default.isMobile;
/***
 * @extends AElement
 * @constructor
 */

function TLBoardTable() {
  this.$bodyFriends = [];
  var thisBT = this;
  this.$staticItems = [];
  this._title = '';
  this.$title = $('.tl-board-table-title', this);
  this.$titleText = this.$title.firstChild;
  /***
   *
   * @type {BoardTable}
   */

  this.$body = $('boardtable.tl-board-table-body', this).on('orderchange', this.eventHandler.bodyChange);
  var screenSize = (0, _Dom.getScreenSize)(); // if (isIPhone && screenSize.width < screenSize.height) {
  //     _({
  //         tag: MHSnapScroller.tag,
  //         elt: this.$body
  //     })
  // }

  this.$addBtn = _({
    class: ['tl-board-table-add-btn'],
    child: {
      text: '[ADD_TXT]'
    }
  }).on('click', this.eventHandler.clickAdd);
  /***
   *
   * @type {Text}
   */

  this.$addBtnText = this.$addBtn.firstChild;
  this.$body.addChild(this.$addBtn);
  this.$attachhook = _('attachhook').addTo(this);
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$attachhook.on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdateSize();
    thisBT.updateAutoStyleValue();
  });

  _OOP.default.drillProperty(this, this, 'name', 'title');
}

TLBoardTable.tag = "TLBoardTable".toLowerCase();

TLBoardTable.render = function () {
  return _({
    id: (0, _stringGenerate.randomIdent)(16),
    class: ['tl-board-table', 'cd-header-hidden'],
    extendEvent: ['change', 'pressadd'],
    child: [{
      class: 'tl-board-table-header',
      child: [{
        tag: 'span',
        class: 'tl-board-table-title',
        child: {
          text: ""
        }
      }]
    }, {
      tag: 'boardtable',
      class: 'tl-board-table-body'
    }]
  });
};

TLBoardTable.prototype.updateAutoStyleValue = function () {
  var backgroundColorStyle = this.getComputedStyleValue('background-color');
  var backgroundColor;

  try {
    backgroundColor = _Color.default.parse(backgroundColorStyle);
  } catch (error) {
    backgroundColor = _Color.default.parse('white');
  }

  var contractColor = backgroundColor.getContrastYIQ();
  var hsba = contractColor.toHSBA().slice();
  hsba[2] = 0.5 * 0.3 + hsba[2] * 0.7;

  var lowContractColor = _Color.default.fromHSB(hsba[0], hsba[1], hsba[2]);

  this.addStyle('--background-yiq-color', contractColor.toString('hex6'));
  this.addStyle('--background-low-yiq-color', lowContractColor.toString('hex6'));
};

TLBoardTable.prototype.addStyle = function () {
  if (arguments[0] === 'background-color' || arguments[0] === 'background' || arguments[0] === 'backgroundColor') {
    _AElement.default.prototype.addStyle.apply(this, arguments);

    this.updateAutoStyleValue();
    return this;
  } else {
    return _AElement.default.prototype.addStyle.apply(this, arguments);
  }
};
/***
 *
 * @param {boolean} bothStatic
 * @returns {T[]}
 */


TLBoardTable.prototype.getAllItems = function (bothStatic) {
  return Array.prototype.filter.call(this.$body.childNodes, function (e) {
    // return e !== addBtn;
    return e.containsClass(bothStatic ? 'tl-board-table-item' : 'as-board');
  });
};

TLBoardTable.prototype.getAllItem = TLBoardTable.prototype.getAllItems;
/***
 *
 * @param {TLCard|TLList} itemElt
 * @param {boolean} staticItem
 * @returns {TLBoardTable}
 */

TLBoardTable.prototype.addItem = function (itemElt, staticItem) {
  if (staticItem) {
    itemElt.removeClass('as-board');
  }

  itemElt.addClass('tl-board-table-item');
  this.$body.addChildBefore(itemElt, this.$addBtn);
  this.$bodyFriends.push(itemElt.$body);
  itemElt.$body.friends = this.$bodyFriends;
  return this;
};

TLBoardTable.prototype.removeItem = function (itemElt) {
  this.$body.removeChild(itemElt);
  itemElt.removeClass('tl-board-table-item');
  var friendIdx = this.$bodyFriends.indexOf(itemElt.$body);

  if (friendIdx >= 0) {
    this.$bodyFriends.splice(friendIdx, 1);
  }
};

TLBoardTable.prototype.clearItem = function () {
  var items = this.getAllItems(true);

  for (var i = 0; i < items.length; ++i) {
    this.$body.removeChild(items[i]);
  }

  this.$bodyFriends = [];
  return this;
};

TLBoardTable.prototype.updateSize = function () {
  if (!this.isDescendantOf(document.body)) return;
  var bound = this.$body.getBoundingClientRect();

  if (bound.height === 0) {
    requestAnimationFrame(this.updateSize.bind(this));
  } else {
    this.addStyle({
      '--tl-board-table-body-width': bound.width + 'px',
      '--tl-board-table-body-height': bound.height + 'px'
    });
  }
};

TLBoardTable.property = {};
TLBoardTable.property.title = {
  set: function (value) {
    this.$title.clearChild();
    this._title = value || '';

    if (this._title) {
      this.$titleText.data = this._title;
      this.removeClass('cd-header-hidden');
    } else {
      this.addClass('cd-header-hidden');
    }

    this.updateSize();
  },
  get: function () {
    return this.$titleText.data;
  }
};
TLBoardTable.property.addText = {
  set: function (text) {
    this.$addBtnText.data = text || '';
  },
  get: function () {
    return this.$addBtnText.data;
  }
};
TLBoardTable.property.hasAddBtn = {
  set: function (value) {
    if (value) this.addClass('tl-has-add-btn');else this.removeClass('tl-has-add-btn');
  },
  get: function () {
    return this.containsClass('tl-has-add-btn');
  }
};
TLBoardTable.eventHandler = {};

TLBoardTable.eventHandler.clickAdd = function () {
  setTimeout(function () {
    this.emit('pressadd', {
      type: 'pressadd',
      target: this
    }, this);
  }.bind(this), 500);
};

TLBoardTable.eventHandler.bodyChange = function (event) {
  setTimeout(function () {
    this.emit('change', Object.assign({}, event, {
      target: this,
      type: "change"
    }), this);
  }.bind(this), 500);
  this.updateSize();
};

_Core.default.install(TLBoardTable);

var _default = TLBoardTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/TLList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/TLList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/tl.css");

require("../../css/tllist.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _BoardTable = _interopRequireWildcard(require("absol-acomp/js/BoardTable"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _RepresentativeBoard = require("./RepresentativeBoard");

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _TLCard = _interopRequireDefault(require("./TLCard"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));

var _TLBoardTable = _interopRequireDefault(require("./TLBoardTable"));

var _datetime = require("absol/src/Time/datetime");




var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends AElement
 * @constructor
 */

function TLList() {
  var thisTL = this;
  this.$title = $('.tl-list-title', this);
  this.$contextBtn = $('.tl-list-context-btn', this);
  /***
   *
   * @type {BoardTable}
   */

  this.$body = $('.tl-list-body', this).on('orderchange', this.eventHandler.bodyOrderChange).on('itemleave', this.eventHandler.itemleaveBody).on('itementer', this.eventHandler.itementerBody).on('dragitemstart', this.eventHandler.bodyDragItemStart).on('dragitemend', this.eventHandler.bodyDragItemEnd);
  this.$addItemBtn = $('.tl-list-add-item-btn', this).on('click', this.eventHandler.clickAddItem);
  /***
   *
   * @type {ChildNode|Text}
   */

  this.$addItemnBtnText = this.$addItemBtn.firstChild;
  var thisG = this;
  this._quickmenuAdapter = {
    getMenuProps: function () {
      if (thisG._quickmenu.getMenuProps) return thisG._quickmenu.getMenuProps();
      return thisG._quickmenu.props;
    },
    onSelect: function () {
      if (typeof thisG._quickmenu.onSelect == 'function') thisG._quickmenu.onSelect.apply(this, arguments);
    }
  };
  this.addItemText = "[ADD_ITEM_TXT]";
  this.quickmenu = (0, _RepresentativeBoard.createDefaultBoardQuickMenu)();
  this.$tail = $('.tl-list-tail', this);

  _OOP.default.drillProperty(this, this, 'name', 'title');

  _('attachhook').on('attached', function () {
    this.remove();
    thisTL.updateAutoStyleValue();
  }).addTo(this);
  /***
   * default = true
   * @name hasAddBtn
   * @memberOf TLList#
   */

}

TLList.tag = 'TLList'.toLowerCase();

TLList.render = function () {
  return _({
    tag: 'board',
    extendEvent: ['pressadditem', 'pressseemore', 'itemorderchange', 'itementer', 'itemleave', 'dragitemstart', 'dragitemend'],
    class: ['tl-list', _BoardTable.EFFECT_ZONE_CLASS_NAME, 'cd-board-group', 'tl-has-add-btn'],
    child: [{
      class: ['tl-list-header', _BoardTable.DRAG_ZONE_CLASS_NAME],
      child: [{
        tag: 'span',
        class: ['tl-list-title'],
        child: [{
          text: ''
        }]
      }, {
        class: ['tl-list-context-btn-ctn', _BoardTable.FREE_ZONE_CLASS_NAME],
        child: [{
          tag: 'button',
          class: ['tl-list-context-btn', 'tl-transparent-btn'],
          child: 'span.mdi.mdi-dots-horizontal'
        }]
      }]
    }, {
      class: ['tl-list-add-item-btn-ctn'],
      child: {
        class: 'tl-list-add-item-btn',
        child: {
          text: ''
        }
      }
    }, {
      tag: 'boardtable',
      class: ['tl-list-body',
      /*'cd-list-board-body', 'cd-board-group-body', */
      'as-bscroller'],
      props: {
        friends: 'boardtable.tl-list-body'
      },
      child: {
        class: 'tl-list-tail'
      }
    }]
  });
};

TLList.prototype.updateAutoStyleValue = function () {
  var backgroundColorStyle = this.getComputedStyleValue('background-color');
  var backgroundColor;

  try {
    backgroundColor = _Color.default.parse(backgroundColorStyle);
  } catch (error) {
    backgroundColor = _Color.default.parse('white');
  }

  var contractColor = backgroundColor.getContrastYIQ();
  var hsba = contractColor.toHSBA().slice();
  hsba[2] = 0.5 * 0.3 + hsba[2] * 0.7;

  var lowContractColor = _Color.default.fromHSB(hsba[0], hsba[1], hsba[2]);

  this.addStyle('--background-yiq-color', contractColor.toString('hex6'));
  this.addStyle('--background-low-yiq-color', lowContractColor.toString('hex6'));

  if (lowContractColor.rgba[0] < 0.5) {
    this.removeStyle('as-dark');
  } else {
    this.addClass('as-dark');
  }
};

TLList.prototype.addStyle = function () {
  if (arguments[0] === 'background-color' || arguments[0] === 'background' || arguments[0] === 'backgroundColor') {
    _AElement.default.prototype.addStyle.apply(this, arguments);

    this.updateAutoStyleValue();
    return this;
  } else {
    return _AElement.default.prototype.addStyle.apply(this, arguments);
  }
};
/***
 *
 * @param {TLCard} item
 * @returns {TLList}
 */


TLList.prototype.addItem = function (item) {
  this.$body.addChildBefore(item, this.$tail);
  return this;
};
/***
 *
 * @param {TLCard} item
 * @returns {TLList}
 */


TLList.prototype.removeItem = function (item) {
  this.$body.removeChild(item);
  return this;
};

TLList.prototype.clearItem = function () {
  var items = this.getAllItems();

  for (var i = 0; i < items.length; ++i) {
    this.$body.removeChild(items[i]);
  }

  return this;
};

TLList.prototype.getAllItems = function () {
  var tailElt = this.$tail;
  return Array.prototype.filter.call(this.$body.childNodes, function (e) {
    // return e !== tailElt;
    return e.containsClass('as-board');
  });
};

TLList.property = {};
TLList.property.title = {
  set: function (value) {
    this.$title.clearChild();

    if (value === null || value === undefined) {
      this._title = null;
    }

    this._title = value;

    if (value !== null) {
      if (typeof value === 'string' || typeof value === "number") {
        this.$title.addChild(_({
          text: value
        }));
      } else if (value instanceof Date) {
        this.$title.addChild(_({
          text: (0, _datetime.formatDateTime)(value, 'dd/MM/yyyy hh:mm a')
        }));
      } else if (value instanceof Array) {
        this.$title.addChild(value.map(o => _(o)));
      } else {
        this.$title.addChild(_(value));
      }
    }
  },
  get: function () {
    return this._title;
  }
};
TLList.property.addItemText = {
  set: function (text) {
    this.$addItemnBtnText.data = text || '';
  },
  get: function () {
    return this.$addItemnBtnText.data;
  }
};
TLList.property.hasAddBtn = {
  set: function (value) {
    if (value) this.addClass('tl-has-add-btn');else this.removeClass('tl-has-add-btn');
  },
  get: function () {
    return this.containsClass('tl-has-add-btn');
  }
};
TLList.property.quickmenu = {
  set: function (value) {
    value = value || null;

    if (value) {
      this.addClass('tl-has-context-menu');
      if (!this._quickmenuHolder) this._quickmenuHolder = _QuickMenu.default.toggleWhenClick(this.$contextBtn, this._quickmenuAdapter);
    } else {
      if (this._quickmenuHolder) {
        this._quickmenuHolder.remove();

        this._quickmenuHolder = null;
      }

      this.removeClass('tl-has-context-menu');
    }

    this._quickmenu = value;
  },
  get: function () {
    return this._quickmenu;
  }
};
TLList.property.seeMoreText = {
  set: function (value) {
    if (value && !this.$seeMoreText) {
      this.$seeMoreText = _({
        tag: 'i',
        child: {
          text: "Xem thêm"
        },
        on: {
          click: this.eventHandler.clickSeeMore
        }
      });
    }

    if (value) {
      if (!this.$seeMoreText.parentElement) {
        this.$tail.addChild(this.$seeMoreText);
      }

      this._seeMoreText = value + '';
      this.$seeMoreText.firstChild.data = this._seeMoreText;
    } else {
      this._seeMoreText = '';
      if (this.$seeMoreText) this.$seeMoreText.remove();
    }
  },
  get: function () {
    return this._seeMoreText;
  }
};
TLList.eventHandler = {};

TLList.eventHandler.clickAddItem = function (event) {
  setTimeout(function () {
    this.emit('pressadditem', Object.assign({}, event, {
      type: 'pressadditem',
      target: this
    }), this);
  }.bind(this), 500);
};

TLList.eventHandler.clickSeeMore = function (event) {
  setTimeout(function () {
    this.emit('pressseemore', Object.assign({
      type: 'pressseemore',
      target: this
    }), this);
  }.bind(this), 500);
};

TLList.eventHandler.itementerBody = function (event) {
  setTimeout(function () {
    this.emit('itementer', Object.assign({}, event, {
      type: 'itementer',
      target: this
    }), this);
  }.bind(this), 500);
};

TLList.eventHandler.itemleaveBody = function (event) {
  setTimeout(function () {
    this.emit('itemleave', Object.assign({}, event, {
      type: 'itemleave',
      target: this
    }), this);
  }.bind(this), 500);
};

TLList.eventHandler.bodyOrderChange = function (event) {
  setTimeout(function () {
    this.emit('itemorderchange', Object.assign({}, event, {
      type: 'itemorderchange',
      target: this
    }, this));
  }.bind(this), 500);
};

TLList.eventHandler.bodyDragItemStart = function (event) {
  setTimeout(function () {
    this.emit('dragitemstart', Object.assign({}, event, {
      type: 'dragitemstart',
      target: this
    }), this);
  }.bind(this), 500);
};

TLList.eventHandler.bodyDragItemEnd = function (event) {
  setTimeout(function () {
    this.emit('dragitemend', Object.assign({}, event, {
      type: 'dragitemend',
      target: this
    }), this);
  }.bind(this), 500);
};

_Core.default.install(TLList);

var _default = TLList;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/BoardGroup.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/BoardGroup.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/boardgroup.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _RepresentativeBoard = _interopRequireDefault(require("./RepresentativeBoard"));

var _TLList = _interopRequireDefault(require("./TLList"));

var _utils = require("./utils");


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends TLList
 * @constructor
 */

function BoardGroup() {
  (0, _utils.repeatEvents)(this, {
    pressplusboard: 'pressadditem',
    pressaddboard: 'pressadditem',
    orderchange: 'itemorderchange',
    //adapt name
    boardorderchange: 'itemorderchange',
    boardleave: 'itemleave',
    boardenter: 'itementer',
    dragboardstart: 'dragitemstart',
    dragboardend: 'dragitemend'
  });

  if ('LanguageModule' in window && window.LanguageModule.text) {
    this.addItemText = '+ ' + window.LanguageModule.text('txt_add_board');
  }
}

BoardGroup.tag = 'BoardGroup'.toLowerCase();
BoardGroup.defaultFriendQuery = 'boardtable.tl-list-body';

BoardGroup.render = function () {
  return _('tllist', true);
};

BoardGroup.prototype.addItemText = "+ Thêm board";
/***
 *
 * @param {RepresentativeBoard} board
 */

BoardGroup.prototype.addBoard = function (board) {
  this.$body.addChildBefore(board, this.$tail);
};

BoardGroup.prototype.getAllBoards = function () {
  return this.$body.getAllBoards();
};

_Core.default.install(BoardGroup);

var _default = BoardGroup;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/BoardManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/BoardManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/boardcard.css");

require("../../css/boardmanager.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _BoardGroup = _interopRequireDefault(require("./BoardGroup"));

var _TLBoardTable = _interopRequireDefault(require("./TLBoardTable"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _RepresentativeBoard = _interopRequireDefault(require("./RepresentativeBoard"));

var _utils = require("./utils");

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends TLBoardTable
 * @constructor
 */

function BoardManager() {
  (0, _utils.repeatEvents)(this, {
    pressplusboard: 'pressadd',
    pressaddboard: 'pressadd',
    pressaddcard: 'pressadd',
    presspluscard: 'pressadd',
    pressaddgroup: 'pressadd'
  });

  _OOP.default.drillProperty(this, this, 'hasPlusCard', 'hasAddBtn');

  _OOP.default.drillProperty(this, this, 'hasPlusBoard', 'hasAddBtn');

  this.boardMode = false;
}

BoardManager.tag = 'boardmanager';

BoardManager.render = function () {
  return _({
    tag: 'TLBoardTable'.toLowerCase(),
    class: 'cd-board-manager'
  }, true);
};
/***
 *
 * @param {BoardGroup} boardGroupElt
 * @returns {BoardManager}
 */


BoardManager.prototype.addBoardGroup = function (boardGroupElt, staticItem) {
  this.addItem(boardGroupElt, staticItem);
  boardGroupElt.$body.friends = ['#' + this.id + ' ' + _BoardGroup.default.defaultFriendQuery];
  return this;
};
/***
 *
 * @param {RepresentativeBoard} boardElt
 * @param staticItem
 */


BoardManager.prototype.addBoard = function (boardElt) {
  // console.log(boardElt);
  this.addItem(boardElt, false);
  this.boardMode = true;
};
/***
 *
 * @param {RepresentativeBoard} boardElt
 */


BoardManager.prototype.removeBoard = function (boardElt) {
  this.removeItem(boardElt);
  this.boardMode = true;
};
/***
 *
 * @param {BoardGroup} boardGroupElt
 * @returns {BoardManager}
 */


BoardManager.prototype.removeGroup = function (boardGroupElt) {
  this.$body.removeChild(boardGroupElt);
  return this;
};

BoardManager.prototype.getAllGroups = function () {
  return this.getAllItems();
};

BoardManager.prototype.getAllBoards = function () {
  if (this.boardMode) {
    return this.getAllItems();
  } else {
    return this.getAllGroups().reduce(function (ac, cr) {
      ac.push.apply(ac, cr.getAllBoards());
      return ac;
    }, []);
  }
};

BoardManager.property = {};
BoardManager.property.boardMode = {
  set: function (value) {
    if (value) {
      this.addClass('cd-board-mode');

      if ('LanguageModule' in window && window.LanguageModule.text) {
        this.addText = '+ ' + window.LanguageModule.text('txt_add_board');
      } else this.addText = "+ Thêm board";
    } else {
      this.removeClass('cd-board-mode');

      if ('LanguageModule' in window && window.LanguageModule.text) {
        this.addText = '+ ' + window.LanguageModule.text('txt_add_category');
      } else this.addText = "+ Thêm nhóm";
    }
  },
  get: function () {
    return this.containsClass('cd-board-mode');
  }
};

_Core.default.install(BoardManager);

var _default = BoardManager;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/TaskCard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/TaskCard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/boardcard.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _TLCard = _interopRequireDefault(require("./TLCard"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends TLCard
 * @constructor
 */

function TaskCard() {}

TaskCard.tag = 'TaskCard'.toLowerCase();

TaskCard.render = function () {
  return _('tlcard.cd-task-card', true);
};

_Core.default.install(TaskCard);

var _default = TaskCard;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/taskboard/ListBoard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/taskboard/ListBoard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/boardcard.css");

require("../../css/listboard.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _TLList = _interopRequireDefault(require("./TLList"));

var _TaskCard = _interopRequireDefault(require("./TaskCard"));

var _utils = require("./utils");


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * contains list of TaskCard
 * @extends TLList
 * @constructor
 */

function ListBoard() {
  (0, _utils.repeatEvents)(this, {
    presspluscard: 'pressadditem',
    pressaddcard: 'pressadditem',
    orderchange: 'itemorderchange',
    //adapt name
    cardorderchange: 'itemorderchange',
    cardleave: 'itemleave',
    cardenter: 'itementer',
    dragcardstart: 'dragitemstart',
    dragcardend: 'dragitemend'
  });
}

ListBoard.tag = 'ListBoard'.toLowerCase();

ListBoard.render = function () {
  return _('tllist.cd-list-board');
};

ListBoard.prototype.addItemText = "+ Thêm card";
/***
 *
 * @param  {TaskCard} cardElt
 * @returns {ListBoard}
 */

ListBoard.prototype.addCard = function (cardElt) {
  this.addItem(cardElt);
  return this;
};

ListBoard.prototype.getAllCards = function () {
  return this.getAllItems();
};

ListBoard.prototype.getAllCard = ListBoard.prototype.getAllCards;

_Core.default.install(ListBoard);

var _default = ListBoard;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/PlusBoard.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/PlusBoard.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/boardcard.css");

var _Core = _interopRequireDefault(require("./Core"));


var _ = _Core.default._;

function PlusBoard() {}

PlusBoard.tag = 'PlusBoard'.toLowerCase();

PlusBoard.render = function () {
  return _({
    class: 'cd-board-plus',
    child: 'span.mdi.mdi-plus'
  });
};

_Core.default.install(PlusBoard);

var _default = PlusBoard;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/HTimeTableItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/HTimeTableItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/htimetableitem.css");

var _Core = _interopRequireDefault(require("./Core"));

var _status2Icon = _interopRequireDefault(require("./status2Icon"));

var _ContextMenu = _interopRequireDefault(require("absol-acomp/js/ContextMenu"));


var _ = _Core.default._;
var $ = _Core.default.$;

_ContextMenu.default.auto();

function HTimeTableItem() {
  /**
   * @type {HTimeTableItem}
   */
  this.$left = null;
  /**
   * @type { HTimeTableItem }
   */

  this.$right = null;
  this._status = [];
  this.$flagRow = $('.cd-month-table-item-flag-row', this);
  this.$flages = [];
  this._name = '';
  this.$name = $('.cd-month-table-item-name', this);
  this.left = null;
  this.right = null;
}

HTimeTableItem.tag = 'HTimeTableItem'.toLowerCase();

HTimeTableItem.render = function () {
  return _({
    tag: 'hanger',
    extendEvent: 'contextmenu',
    class: 'cd-month-table-item',
    child: [{
      class: 'cd-month-table-item-left-icon-ctn',
      child: 'span.mdi.mdi-menu-left'
    }, {
      class: 'cd-month-table-item-right-icon-ctn',
      child: 'span.mdi.mdi-menu-right'
    }, {
      class: 'cd-month-table-item-flag-ctn',
      child: {
        class: 'cd-month-table-item-flag-row'
      }
    }, {
      tag: 'span',
      class: 'cd-month-table-item-name',
      child: {
        text: ""
      }
    }, '.cd-month-table-item-left-drag-line', '.cd-month-table-item-right-drag-line']
  });
};

HTimeTableItem.prototype.findStart = function () {
  var res = this;

  while (res.$left) {
    res = res.$left;
  }

  return res;
};

HTimeTableItem.prototype.findRight = function () {
  var res = this;

  while (res.$right) {
    res = res.$right;
  }

  return res;
};

HTimeTableItem.property = {};
/**
 * @type {HTimeTableItem}
 */

HTimeTableItem.property.left = {
  set: function (value) {
    if (value) {
      this.addClass('cd-continue-left');
      this.$left = value;
    } else {
      this.$left = null;
      this.removeClass('cd-continue-left');
    }
  },
  get: function () {
    return this.$left;
  }
};
/**
 * @type {HTimeTableItem}
 */

HTimeTableItem.property.right = {
  set: function (value) {
    if (value) {
      this.addClass('cd-continue-right');
      this.$right = value;
    } else {
      this.$right = null;
      this.removeClass('cd-continue-right');
    }
  },
  get: function () {
    return this.$right;
  }
};
/**
 * @type {HTimeTableItem}
 */

HTimeTableItem.property.status = {
  set: function (status) {
    this.$flagRow.clearChild();
    status = status || [];

    if (typeof status == 'string') {
      status = status.trim().split(/\s+/);
    }

    this._status = status;
    var flag;
    var icon;
    var flagElt;

    for (var i = 0; i < status.length; ++i) {
      flag = status[i];
      icon = _status2Icon.default[flag];

      if (icon) {
        flagElt = _(icon).addClass('cd-month-table-item-flag');
        this.$flagRow.addChild(flagElt);
      }
    }
  },
  get: function () {
    return this._status;
  }
};
/**
 * @type {HTimeTableItem}
 */

HTimeTableItem.property.isOverDue = {
  set: function (value) {
    if (value) {
      this.addClass('cd-status-over-due');
    } else {
      this.removeClass('cd-status-over-due');
    }
  },
  get: function () {
    return this.containsClass('cd-status-over-due');
  }
};
/**
 * @type {HTimeTableItem}
 */

HTimeTableItem.property.name = {
  set: function (value) {
    this._name = (value || '') + '';
    this.$name.firstChild.data = this._name;
  },
  get: function () {
    return this._name;
  }
};

_Core.default.install(HTimeTableItem);

var _default = HTimeTableItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/VTimeTableItem.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/VTimeTableItem.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/vtimetableitem.css");

var _Core = _interopRequireDefault(require("./Core"));

var _status2Icon = _interopRequireDefault(require("./status2Icon"));


var _ = _Core.default._;
var $ = _Core.default.$;

function VTimeTableItem() {
  /**
   * @type {VTimeTableItem}
   */
  this.$left = null;
  /**
   * @type { VTimeTableItem }
   */

  this.$right = null;
  this._status = [];
  this.$flagRow = $('.cd-month-table-item-flag-row', this);
  this.$flages = [];
  this._name = '';
  this.$name = $('.cd-v-time-table-item-name', this);
}

VTimeTableItem.tag = 'VTimeTableItem'.toLowerCase();

VTimeTableItem.render = function () {
  return _({
    tag: 'hanger',
    class: 'cd-v-time-table-item',
    child: [{
      class: 'cd-v-time-table-item-name-ctn',
      child: {
        tag: 'span',
        class: 'cd-v-time-table-item-name',
        child: {
          text: ""
        }
      }
    }, '.cd-v-time-table-item-top-drag-line', '.cd-v-time-table-item-bottom-drag-line']
  });
};

VTimeTableItem.prototype.findStart = function () {
  var res = this;

  while (res.$left) {
    res = res.$left;
  }

  return res;
};

VTimeTableItem.prototype.findRight = function () {
  var res = this;

  while (res.$right) {
    res = res.$right;
  }

  return res;
}; //độ chia nhỏ nhất là 5 phút, làm tròn


VTimeTableItem.property = {};
/**
 * @type {VTimeTableItem}
 */

VTimeTableItem.property.isOverDue = {
  set: function (value) {
    if (value) {
      this.addClass('cd-status-over-due');
    } else {
      this.removeClass('cd-status-over-due');
    }
  },
  get: function () {
    return this.containsClass('cd-status-over-due');
  }
};
/**
 * @type {VTimeTableItem}
 */

VTimeTableItem.property.name = {
  set: function (value) {
    this._name = (value || '') + '';
    this.$name.firstChild.data = this._name;
  },
  get: function () {
    return this._name;
  }
};

_Core.default.install(VTimeTableItem);

var _default = VTimeTableItem;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/CActivityTooltip.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/CActivityTooltip.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/cactivitytooltip.css");

var _Core = _interopRequireDefault(require("./Core"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var _ = _Core.default._;
var $ = _Core.default.$;

function CActivityTooltip() {
  this.$headerTime = $('.cd-activity-tooltip-header-time', this);
  this.$timeTextNode = this.$headerTime.childNodes[1].firstChild;
  this.$name = $('.cd-activity-tooltip-name', this);
  this.$nameTextNode = this.$name.firstChild;
  this.$desc = $('.cd-activity-tooltip-desc', this);
  this.$descTextNode = this.$desc.firstChild;
  this.$board = $('.cd-activity-tooltip-board', this);
  this.$boardTextNode = this.$board.childNodes[1].firstChild;
  this.$list = $('.cd-activity-tooltip-list', this);
  this.$listTextNode = this.$list.childNodes[1].firstChild;
  this.$card = $('.cd-activity-tooltip-card', this);
  this.$cardTextNode = this.$card.childNodes[1].firstChild;
}

CActivityTooltip.tag = 'CActivityTooltip'.toLowerCase();

CActivityTooltip.render = function () {
  return _({
    class: 'cd-activity-tooltip',
    child: [{
      class: 'cd-activity-tooltip-header-time',
      child: ['span.mdi.mdi-flag-outline', {
        tag: 'span',
        child: {
          text: ""
        }
      }]
    }, {
      class: 'cd-activity-tooltip-name',
      child: {
        text: ''
      }
    }, {
      class: 'cd-activity-tooltip-desc',
      child: {
        text: ''
      }
    }, {
      class: 'cd-activity-tooltip-board',
      child: ['span.mdi.mdi-square', {
        tag: 'span',
        child: {
          text: ''
        }
      }]
    }, {
      class: 'cd-activity-tooltip-list',
      child: ['span.mdi.mdi-view-list', {
        tag: 'span',
        child: {
          text: ''
        }
      }]
    }, {
      class: 'cd-activity-tooltip-card',
      child: ['span.mdi.mdi-card-bulleted', {
        tag: 'span',
        child: {
          text: ''
        }
      }]
    }]
  });
};

CActivityTooltip.property = {};
/**
 * @type {CActivityTooltip}
 */

CActivityTooltip.property.time = {
  set: function (value) {
    this.$timeTextNode.data = value;

    if (value) {
      this.$headerTime.removeStyle('display');
    } else {
      this.$headerTime.addStyle('display', 'none');
    }
  },
  get: function () {
    return this.$timeTextNode.data;
  }
};
/**
 * @type {CActivityTooltip}
 */

CActivityTooltip.property.name = {
  set: function (value) {
    this.$nameTextNode.data = value;

    if (value) {
      this.$name.removeStyle('display');
    } else {
      this.$name.addStyle('display', 'none');
    }
  },
  get: function () {
    return this.$nameTextNode.data;
  }
};
/**
 * @type {CActivityTooltip}
 */

CActivityTooltip.property.board = {
  set: function (value) {
    this.$boardTextNode.data = value;

    if (value) {
      this.$board.removeStyle('display');
    } else {
      this.$board.addStyle('display', 'none');
    }
  },
  get: function () {
    return this.$boardTextNode.data;
  }
};
/**
 * @type {CActivityTooltip}
 */

CActivityTooltip.property.list = {
  set: function (value) {
    this.$listTextNode.data = value;

    if (value) {
      this.$list.removeStyle('display');
    } else {
      this.$list.addStyle('display', 'none');
    }
  },
  get: function () {
    return this.$listTextNode.data;
  }
};
/**
 * @type {CActivityTooltip}
 */

CActivityTooltip.property.card = {
  set: function (value) {
    this.$cardTextNode.data = value;

    if (value) {
      this.$card.removeStyle('display');
    } else {
      this.$card.addStyle('display', 'none');
    }
  },
  get: function () {
    return this.$cardTextNode.data;
  }
};
/**
 * @type {CActivityTooltip}
 */

CActivityTooltip.property.desc = {
  set: function (value) {
    this.$descTextNode.data = value;

    if (value) {
      this.$desc.removeStyle('display');
    } else {
      this.$desc.addStyle('display', 'none');
    }
  },
  get: function () {
    return this.$descTextNode.data;
  }
};
CActivityTooltip._token = null;
CActivityTooltip.$instance = null;
CActivityTooltip.defaultPops = {
  list: '',
  board: '',
  name: '',
  time: ''
};
/**
 * @param {import('absol/src/Math/Vec2').default} pos
 * @param {*} props
 */

CActivityTooltip.show = function (pos, props) {
  if (!CActivityTooltip.$instance) {
    CActivityTooltip.$instance = _(CActivityTooltip.tag);
  }

  CActivityTooltip.$instance.addClass('cd-hidden');
  if (!CActivityTooltip.$instance.parentElement) document.body.appendChild(CActivityTooltip.$instance);
  CActivityTooltip._token = Math.floor(Math.random() * 100000000) + '';
  Object.assign(CActivityTooltip.$instance, CActivityTooltip.defaultPops, props);

  var screenSize = _Dom.default.getScreenSize();

  var bound = CActivityTooltip.$instance.getBoundingClientRect();
  var dx = 0,
      dy = 10;

  if (bound.width + pos.x > screenSize.width - 5) {
    dx = -bound.width;
  }

  if (bound.height + pos.y > screenSize.height - 5) {
    dy = -bound.height;
  }

  CActivityTooltip.$instance.addStyle({
    left: pos.x + dx + 'px',
    top: pos.y + dy + 'px'
  });
  CActivityTooltip.$instance.removeClass('cd-hidden');
  return CActivityTooltip._token;
};

CActivityTooltip.close = function (token) {
  if (arguments.length == 0) token = CActivityTooltip._token;
  if (token != CActivityTooltip._token) return;
  if (CActivityTooltip.$instance) CActivityTooltip.$instance.remove();
  CActivityTooltip._token = "NONE_ACTIVE";
};

_Core.default.install(CActivityTooltip);

var _default = CActivityTooltip;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/CActivity.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/CActivity.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _HTimeTableItem = _interopRequireDefault(require("./HTimeTableItem"));

var _datetime = require("absol/src/Time/datetime");

var _Core = _interopRequireDefault(require("./Core"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _VTimeTableItem = _interopRequireDefault(require("./VTimeTableItem"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _CActivityTooltip = _interopRequireDefault(require("./CActivityTooltip"));


var _ = _Core.default._;
var $ = _Core.default.$;
var MIN_DATE = new Date(1890, 0, 1);
var MAX_DATE = new Date(2200, 0, 1);
/**
 * @typedef {Object} MonthTableItemProperty
 * @property {Date} startTime
 * @property {Date} endTime
 * @property {Array<String>} status
 * @property {String} list
 * @property {String} board
 */

/**
 *
 * @param {import('./MonthTable').default} tableElt
 * @param {MonthTableItemProperty} props
 */

function CActivity(tableElt, props) {
  _EventEmitter.default.call(this);
  /**
   * @type {CActivity}
   */


  this.cloneFrom = null; // to track

  this.$table = tableElt;
  /***
   *
   * @type {string}
   */

  this.boardName = "";
  this.listName = '';
  this.cardName = "";
  this.desc = "";
  /**
   * @type {Date}
   */

  this.startTime = null;
  /**
   * @type {Date}
   */

  this.allDay = false;
  this.firstDayOfWeek = -1; //need to update

  this.endTime = null;
  this.active = false;
  this.daySegments = [];
  this.vSegment = null;
  this.status = [];
  this.name = '(no title)';
  this.hourSegment = null; // /*example

  this.quickmenu = {
    menuProps: {
      items: [{
        text: "Mở",
        icon: 'span.mdi.mdi-open-in-new'
      }, {
        text: "Xóa",
        icon: 'span.mdi.mdi-delete'
      }]
    },
    onSelect: function (item, activity) {// console.log(item, activity);
    }
  }; // */
  // this.quickmenu = null;

  this.on('contextmenu', this.ev_contextMenu.bind(this)).on('mouseenter', this.ev_mouseEnter.bind(this)).on('mouseleave', this.ev_mouseLeave.bind(this));
  this._quickmenuShowing = false;
  this._tooltipToken = null;
  this._tooltipTimeout = -1;
  Object.assign(this, props); //todo 
}

Object.defineProperties(CActivity.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
CActivity.prototype.constructor = CActivity;
CActivity.prototype.$itemPool = [];
CActivity.prototype.$vItemPool = [];

CActivity.prototype._attach = function () {};

CActivity.prototype._detach = function () {};

CActivity.prototype.remove = function () {
  this.removeAllDaySegment();
  this.removeAllHourSegment();
  this.$table = null;

  if (!this.cloneFrom) {
    //origin
    this.$table.removeActivity(this);
  } else {//todo
  }
};

CActivity.prototype.updateStatus = function () {
  var status = this.status;
  status = status || [];

  if (this.daySegments.length > 0) {
    this.daySegments[0].$item.status = status;
  }
};

CActivity.prototype.updateName = function () {
  var name = this.name;
  name = name || '';
  this.daySegments.forEach(function (seg) {
    seg.$item.name = name;
  });
};

CActivity.prototype.getDayLength = function () {
  var dayLength = (0, _datetime.compareDate)(this.endTime, this.startTime);
  if (this.endTime.getTime() > (0, _datetime.beginOfDay)(this.endTime).getTime()) dayLength++;
  return dayLength;
};

CActivity.prototype.removeAllDaySegment = function () {
  var segment;

  for (var i = 0; i < this.daySegments.length; ++i) {
    segment = this.daySegments[i];
    segment.$item.remove(); //todo: make it like new

    segment.$item.mActivity = null;
    segment.$item.left = null;
    segment.$item.right = null;
    segment.$item.status = null;
    this.$itemPool.push(segment.$item);
  }

  this.daySegments = [];
};

CActivity.prototype.removeAllHourSegment = function () {
  if (this.hourSegment) {
    this.hourSegment.$item.remove();
    this.$vItemPool.push(this.hourSegment.$item);
    this.hourSegment = null;
  }
};

CActivity.prototype._makeOneItem = function () {
  var itemElt;

  if (this.$itemPool.length > 0) {
    itemElt = this.$itemPool.pop();
  } else {
    itemElt = _(_HTimeTableItem.default.tag);
    ['click', 'mouseenter', 'mouseleave', 'predrag', 'drag', 'dragend', 'dragstart', 'contextmenu'].forEach(function (eventName) {
      itemElt.on(eventName, function (event) {
        if (this.mActivity) this.mActivity.emit(eventName, event, this.mActivity);
      });
    });
  }

  itemElt.mActivity = this;
  return itemElt;
};

CActivity.prototype.updateActive = function () {
  var active = this.active;

  for (var i = 0; i < this.daySegments.length; ++i) {
    if (active) this.daySegments[i].$item.addClass('cd-active');else this.daySegments[i].$item.removeClass('cd-active');
  }

  if (this.hourSegment) {
    if (active) this.hourSegment.$item.addClass('cd-active');else this.hourSegment.$item.removeClass('cd-active');
  }
};

CActivity.prototype._isDaySegmentUpdated = function () {
  var startMil = this.startTime.getTime();
  var endMil = this.endTime.getTime();
  if (startMil > endMil) return this.daySegments.length === 0; //invalid time, must remove all

  if (this.daySegments.length === 0) return false; // not created

  if (this.$table.firstDayOfWeek !== this.firstDayOfWeek) return false; // must update

  var firstSegment = this.daySegments[0];
  var lastSegment = this.daySegments[this.daySegments.length - 1];
  if (startMil !== firstSegment.startTime.getTime()) return false;
  if (endMil !== lastSegment.endTime.getTime()) return false; //todo: check if scroll

  return true;
};

CActivity.prototype.reCreateDaySegments = function () {
  this.removeAllDaySegment();
  var start = this.startTime;
  var end = this.endTime;
  var segments = [];
  var segment;
  var nextWeek;
  var firstDayOfWeek = this.$table.firstDayOfWeek;
  this.firstDayOfWeek = firstDayOfWeek; //update

  if (start.getTime() < end.getTime()) {
    while (start.getTime() < end.getTime()) {
      nextWeek = (0, _datetime.beginOfWeek)(new Date(start.getTime() + _datetime.MILLIS_PER_DAY * 7), false, firstDayOfWeek);
      segment = {};
      segment.holder = this;
      segments.push(segment);
      segment.startTime = start;
      segment.endTime = new Date(Math.min(end.getTime(), nextWeek.getTime()));
      segment.dayLength = (0, _datetime.compareDate)(segment.endTime, segment.startTime);
      if (segment.endTime.getTime() > (0, _datetime.beginOfDay)(segment.endTime).getTime()) segment.dayLength++;else {
        segment.dayLength = 0;
      }
      segment.$item = this._makeOneItem();
      segment.$item.addStyle('width', 'calc(' + 100 * segment.dayLength + '% - 10px)');
      start = nextWeek;
    }
  } else {
    segment = {};
    segment.holder = this;
    segments.push(segment);
    segment.startTime = start;
    segment.endTime = start;
    segment.dayLength = 1;
    segment.$item = this._makeOneItem();
    segment.$item.addStyle('width', 'calc(' + 100 * segment.dayLength + '% - 10px)');
  }

  for (var i = 0; i < segments.length; ++i) {
    if (i > 0) {
      segments[i].$item.left = segments[i - 1].$item;
      segments[i - 1].$item.right = segments[i].$item;
    }

    if (i < segments.length - 1) {
      segments[i].$item.right = segments[i + 1].$item;
      segments[i + 1].$item.left = segments[i].$item;
    }
  }

  this.daySegments = segments;
  this.updateStatus();
  this.updateName();
  this.updateActive();
};

CActivity.prototype.updateDaySegments = function () {
  if (!this._isDaySegmentUpdated()) this.reCreateDaySegments();
};

CActivity.prototype.getVisibleDaySegments = function () {
  this.updateDaySegments();
  var start = this.$table.startTime.getTime();
  var end = this.$table.endTime.getTime();
  return this.daySegments.filter(function (seg) {
    return seg.startTime.getTime() >= start && seg.endTime.getTime() <= end;
  });
};

CActivity.prototype.getVisibleHourSegment = function () {
  if (this.isSingleDay()) {
    //todo: pool
    var itemElt;

    if (!this.hourSegment) {
      itemElt = _(_VTimeTableItem.default.tag);
      this.hourSegment = {
        $item: itemElt,
        startTime: new Date(),
        endTime: new Date()
      };
      ['click', 'mouseenter', 'mouseleave', 'predrag', 'drag', 'dragend', 'dragstart'].forEach(function (eventName) {
        itemElt.on(eventName, function (event) {
          if (this.mActivity) this.mActivity.emit(eventName, event, this.mActivity);
        });
      });
    } else {
      itemElt = this.hourSegment.$item;
    }

    itemElt.mActivity = this;
    itemElt.name = this.name;
    this.hourSegment.startTime = this.startTime;
    this.hourSegment.endTime = this.endTime;
    this.hourSegment.$item.addStyle('height', (this.endTime.getTime() - this.startTime.getTime()) * 100 / _datetime.MILLIS_PER_HOUR + '%');
    return this.hourSegment;
  } else {
    return null;
  }
};

CActivity.prototype.isSingleDay = function () {
  return !this.allDay && (0, _datetime.compareDate)(this.startTime, new Date(this.endTime.getTime() - 1)) == 0;
}; //May 18 12-00pm \u2212 Jun 22 1-00pm (35d 1h)


CActivity.prototype._dateTimeToText = function (date) {
  var h, m;
  var text = '';
  text += _datetime.shortMonthNames[this.startTime.getMonth()] + ' ' + this.startTime.getDate();
  h = this.startTime.getHours();
  m = this.startTime.getMinutes();
  text += ' ' + (h > 12 ? h - 12 : h) + '-' + (m < 10 ? '0' + m : m) + (h >= 12 ? 'pm' : 'am');
  return text;
};

CActivity.prototype._milToText = function (mil) {
  var mil = this.endTime.getTime() - this.startTime.getTime();
  var d = Math.floor(mil / _datetime.MILLIS_PER_DAY);
  var h = Math.floor(mil % _datetime.MILLIS_PER_DAY / _datetime.MILLIS_PER_HOUR);
  var m = Math.floor(mil % _datetime.MILLIS_PER_HOUR / _datetime.MILLIS_PER_MINUTE);
  var text = '(' + d + 'd';

  if (h > 0 || m > 0) {
    text += ' ' + h + 'h';
    if (m > 0) text += m + 'm';
  }

  text += ')';
  return text;
};
/**
 * @returns {String}
 */


CActivity.prototype.getTimeText = function () {
  var text = this._dateTimeToText(this.startTime);

  if (this.startTime.getTime() < this.endTime.getTime()) {
    text += ' \u2212 ' + this._dateTimeToText() + this._milToText(this.endTime.getTime() - this.startTime.getTime());
  }

  return text;
};
/**
 * @return {CActivity}
 */


CActivity.prototype.clone = function () {
  var obj = new CActivity(this.$table, {
    startTime: this.startTime,
    endTime: this.endTime,
    name: this.name,
    list: this.list,
    board: this.board,
    status: this.status,
    cloneFrom: this
  });
  return obj;
};

CActivity.prototype.ev_contextMenu = function (event) {
  var quickmenu = this.quickmenu;
  var thisA = this;

  if (quickmenu) {
    var menuProps = this.quickmenu.menuProps || this.quickmen && this.quickmenu.getMenuProps() || null;
    if (!menuProps) throw new Error("Invalid quickmenu!");
    var items = menuProps.items; // copy to keep data safely

    var items2 = items.map(function (item, i) {
      return Object.assign({
        __idx__: i
      }, item);
    });

    _CActivityTooltip.default.close(this._tooltipToken);

    CActivity._quickmenuShowing = true;
    event.showContextMenu(Object.assign({}, menuProps, {
      items: items2
    }), function (event) {
      var idx = event.menuItem.__idx__;
      var item = items[idx];

      if (quickmenu.onSelect) {
        quickmenu.onSelect(item, thisA);
      }
    });
    $(document.body).once('mousedown', function () {
      CActivity._quickmenuShowing = false;
    });
    event.stopPropagation();
  }
};

CActivity.prototype.ev_mouseEnter = function (event) {
  if (this.cloneFrom) return;
  var thisCA = this;

  if (this._showTooltipTimeout > 0) {
    clearTimeout(this._showTooltipTimeout);
    this._showTooltipTimeout = -1;
  }

  var pos = new _Vec.default(event.clientX, event.clientY);
  this._tooltipTimeout = setTimeout(function () {
    if (CActivity._quickmenuShowing) return;
    thisCA._tooltipToken = _CActivityTooltip.default.show(pos, thisCA._getTooltipData());
  }, 200);
};

CActivity.prototype._getTooltipData = function () {
  return {
    name: this.name,
    time: this.getTimeText(),
    board: this.boardName || '',
    list: this.listName || '',
    card: this.cardName || '',
    desc: this.desc || ''
  };
};

CActivity.prototype.ev_mouseLeave = function () {
  if (this._tooltipTimeout > 0) {
    clearTimeout(this._tooltipTimeout);
    this._tooltipTimeout = -1;
  }

  _CActivityTooltip.default.close(this._tooltipToken);
};

var _default = CActivity;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/CDayCell.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/CDayCell.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/cdaycell.css");

var _Core = _interopRequireDefault(require("./Core"));

var _datetime = require("absol/src/Time/datetime");


var _ = _Core.default._;
var $ = _Core.default.$;
var defaultDate = (0, _datetime.beginOfDay)(new Date());

function CDayCell() {
  this.$number = $('.cd-day-cell-number', this);
  this.$mmmmdd = $('.cd-day-cell-mmmdd', this);
  /**
   * @type {Text}
   */

  this.$numberText = this.$number.firstChild;
  /**
   * @type {Text}
   */

  this.$mmmmddText = this.$mmmmdd.firstChild;
  this._date = new Date();
  this.date = this._date;
  this._day = 0;
}

CDayCell.tag = 'CDayCell'.toLowerCase();

CDayCell.render = function () {
  return _({
    class: ['cd-day-cell', 'cd-day-0'],
    child: [{
      class: 'cd-day-cell-nav',
      child: [{
        tag: 'span',
        class: 'cd-day-cell-number',
        child: {
          text: ''
        }
      }, {
        tag: 'span',
        class: 'cd-day-cell-mmmdd',
        child: {
          text: ''
        }
      }]
    }]
  });
};

CDayCell.prototype.clearChild = function () {
  var children = Array.prototype.slice.call(this.children);
  var child;

  for (var i = 0; i < children.length; ++i) {
    child = children[i];
    if (child != this.$mmmmdd && child != this.$number) this.removeChild(children[i]);
  }
};

CDayCell.property = {};
/**
 * @type {CDayCell}
 */

CDayCell.property.date = {
  /**
   *
   * @param {Date} value
   */
  set: function (value) {
    value = value || defaultDate;
    var day = value.getDay();

    if (day != this._day) {
      this.removeClass('cd-day-' + this._day);
      this._day = day;
      this.addClass('cd-day-' + this._day);
    }

    this._date = value;
    this.$numberText.data = value.getDate();
    this.$mmmmddText.data = (0, _datetime.formartDateString)(value, 'mmmm-dd');
    if ((0, _datetime.compareDate)(defaultDate, value) == 0) this.addClass('cd-today');else this.removeClass('cd-today');

    if (value.getDate() == 1) {
      this.addClass('cd-first-day-of-month');
    } else {
      this.removeClass('cd-first-day-of-month');
    }
  },

  /**
   * @returns {Date}
   */
  get: function () {
    return this._date;
  }
};
/**
 * @type {CDayCell}
 */

CDayCell.property.selected = {
  set: function (value) {
    if (value) this.addClass('cd-selected');else this.removeClass('cd-selected');
  },
  get: function () {
    return this.containsClass('cd-selected');
  }
};

_Core.default.install(CDayCell);

var _default = CDayCell;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/CWeekRow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/CWeekRow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/cweekrow.css");

var _Core = _interopRequireDefault(require("./Core"));

var _datetime = require("absol/src/Time/datetime");

var _CDayCell = _interopRequireDefault(require("./CDayCell"));


var _ = _Core.default._;
var $ = _Core.default.$;
var defaultDate = (0, _datetime.beginOfWeek)(new Date());

function CWeekRow() {
  var thisR = this;
  /**
   * @type {Array<CDayCell>}
   */

  this.$dayCells = Array(7).fill(null).map(function () {
    return _('cdaycell').addTo(thisR);
  });
  this._date = defaultDate;
  this.date = this._date;
}

CWeekRow.tag = 'CWeekRow'.toLowerCase();

CWeekRow.render = function () {
  return _({
    class: 'cd-week-row'
  });
};

CWeekRow.prototype._updateDate = function () {
  var millis0 = this._date.getTime();

  for (var i = 0; i < 7; ++i) {
    this.$dayCells[i].date = new Date(millis0 + i * _datetime.MILLIS_PER_DAY);
  }
};

CWeekRow.prototype.getCellByDate = function (date) {
  return this.$dayCells[this.getCellIdxByDate(date)] || null;
};

CWeekRow.prototype.getCellIdxByDate = function (date) {
  return (0, _datetime.compareDate)(date, this._date);
};

CWeekRow.property = {};
/**
 * @type {CWeekRow}
 */

CWeekRow.property.date = {
  /**
   * 
   * @param {Date} value 
   */
  set: function (value) {
    this._date = value || defaultDate;

    this._updateDate();
  },

  /**
   * @returns {Date}
   */
  get: function () {
    return this._date;
  }
};

_Core.default.install(CWeekRow);

var _default = CWeekRow;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/helper/SegmentMerger.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/helper/SegmentMerger.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function SegmentMerger() {
  this.segments = [];
}

SegmentMerger.prototype.addItem = function (item, start, length) {
  var newSegments = [];
  var oldSegments = this.segments;
  var collapseSegments = [];
  var segment;

  while (oldSegments.length > 0) {
    segment = oldSegments.shift();

    if (this._isCollapse(segment, start, length)) {
      collapseSegments.push(segment);
    } else {
      newSegments.push(segment);
    }
  }

  var newSegment = {
    start: start,
    length: length,
    items: [item]
  };
  var end = newSegment.length + newSegment.start;

  for (var i = 0; i < collapseSegments.length; ++i) {
    segment = collapseSegments[i];
    newSegment.start = Math.min(newSegment.start, segment.start);
    newSegment.items.push.apply(newSegment.items, segment.items);
    end = Math.max(end, segment.start + segment.length);
  }

  newSegment.length = end - newSegment.start;
  this.segments.push.apply(this.segments, newSegments);
  this.segments.push(newSegment);
};

SegmentMerger.prototype._isCollapse = function (segment, start, length) {
  var end = start + length;
  var sEnd = segment.start + segment.length;
  return !(start >= sEnd || end <= segment.start);
};

var _default = SegmentMerger;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/helper/SegmentFinder.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/helper/SegmentFinder.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

const {
  default: SegmentMerger
} = require("./SegmentMerger");

function SegmentFinder() {
  this.segments = [];
}

SegmentFinder.prototype.push = function (xstart, xend, y, data) {
  this.segments.push({
    xstart: xstart,
    xend: xend,
    y: y,
    data
  });
};

SegmentFinder.prototype.getMinYFreeAt = function (x) {
  var dict = {};
  var seg;

  for (var i = 0; i < this.segments.length; ++i) {
    seg = this.segments[i];
    if (seg.xstart <= x && seg.xend > x) dict[seg.y + ''] = true;
  }

  for (var i = 0; true; ++i) {
    if (!dict[i + '']) return i;
  }
};

SegmentFinder.prototype.getMaxY = function () {
  var maxVal = -1;
  var seg;

  for (var i = 0; i < this.segments.length; ++i) {
    seg = this.segments[i];
    maxVal = Math.max(maxVal, seg.y);
  }

  return maxVal;
};

var _default = SegmentFinder;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/CDayOfWeekRow.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/CDayOfWeekRow.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/cdayofweekrow.css");

var _Core = _interopRequireDefault(require("./Core"));

var _datetime = require("absol/src/Time/datetime");


var _ = _Core.default._;
var $ = _Core.default.$;

function CDayOfWeekRow() {
  var thisR = this;
  this.$cell = _datetime.dayNames.map(function (text) {
    return _({
      class: 'cd-day-of-week-cell',
      child: {
        text: text
      }
    }).addTo(thisR);
  });
  this._firstDay = 0;

  this._updateDays();

  this.firstDay = this._firstDay;
}

CDayOfWeekRow.tag = 'CDayOfWeekRow'.toLowerCase();

CDayOfWeekRow.render = function () {
  return _({
    class: 'cd-day-of-week-row'
  });
};

CDayOfWeekRow.prototype._updateDays = function () {
  var today = new Date().getDay();

  for (var i = 0; i < 7; ++i) {
    if (today === i) {
      this.$cell[i].addClass('cd-today');
    } else {
      this.$cell[i].removeClass('cd-today');
    }

    this.$cell[i].firstChild.data = _datetime.dayNames[(i + this._firstDay) % 7];
  }
};

CDayOfWeekRow.property = {};
/**
 * @type {CDayOfWeekRow}
 */

CDayOfWeekRow.property.firstDay = {
  /**
   *
   * @param {Number} value
   */
  set: function (value) {
    value = value || 0;

    if (value != this._firstDay) {
      this._firstDay = value;

      this._updateDays();
    }
  },

  /**
   * @returns {Date}
   */
  get: function () {
    return this._firstDay;
  }
};

_Core.default.install(CDayOfWeekRow);

var _default = CDayOfWeekRow;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/MonthTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/MonthTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ItemCmp = ItemCmp;
exports.default = void 0;

require("../../css/monthtable.css");

var _Core = _interopRequireDefault(require("./Core"));

var _datetime = require("absol/src/Time/datetime");

var _CActivity = _interopRequireDefault(require("./CActivity"));

var _CActivityTooltip = _interopRequireDefault(require("./CActivityTooltip"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _CWeekRow = _interopRequireDefault(require("./CWeekRow"));

var _CDayCell = _interopRequireDefault(require("./CDayCell"));

var _SegmentFinder = _interopRequireDefault(require("../helper/SegmentFinder"));

var _CDayOfWeekRow = _interopRequireDefault(require("./CDayOfWeekRow"));


var _ = _Core.default._;
var $ = _Core.default.$;
var defaultFocusDate = (0, _datetime.beginOfMonth)(new Date());
/**
 *
 * @param {CActivity} a
 * @param {CActivity} b
 */

function ItemCmp(a, b) {
  var d = a.startTime.getTime() - b.startTime.getTime();
  if (d == 0) return a.getDayLength() - b.getDayLength();
  return d;
}

function MonthTable() {
  var thisMT = this;
  this.domSignal = new _DomSignal.default();
  this.domSignal.on('requestUpdateCardPosition', this.updateCardPosition.bind(this));
  /**
   * @type {Array<CActivity>}
   */

  this.activities = [];
  /**
   * @type {CActivity}
   */

  this.activeActivity = null;
  /**
   * @type {CActivity}
   */

  this._lastVisiblePeriod = null; // this.clonedCard = null;
  // this._initCloneIdx = -1;
  // this._currentCloneIdx = -1;
  // this._dragTimeFactor = [0, 0];

  this.$attachook = _('attachhook').addTo(this).on('error', this.eventHandler.attached);
  this.$selectDate = null;
  this._focusDate = new Date(0);
  this._week = (0, _datetime.beginOfWeek)((0, _datetime.prevMonth)(this._focusDate));
  this._firstDayOfWeek = 0;
  /**
   * @type {CDayOfWeekRow}
   */

  this.$dayOfWeekRow = $('cdayofweekrow', this); // this._selectDateFormat = 'mmm-dd';

  this.$body = $('.cd-month-table-body', this).removeClass('as-bscroller').on('scroll', this.eventHandler.scrollBody);
  this.$content = $('.cd-month-table-content', this).on('click', this.eventHandler.clickDay);
  /**
   * @type {Array<CWeekRow>}
   */

  this.$weekRows = Array(18).fill(null).map(function () {
    return _('cweekrow').addTo(thisMT.$content);
  });
  this.$header = $('.cd-month-table-header', this);
  this.$daysOfWeek = [];
  $('.cd-month-table-header-day', this.$header, function (day) {
    thisMT.$daysOfWeek.push(day);
  });
  this.focusDate = defaultFocusDate;
  this.$placeHolder = []; // this.$clonedPlaceHolder = [];
}

MonthTable.tag = 'MonthTable'.toLowerCase();
MonthTable.$placePool = [];
MonthTable.$clonedPlacePool = [];

MonthTable.render = function () {
  return _({
    extendEvent: ['presscell', 'presscard', 'visibleperiodchange'],
    class: 'cd-month-table',
    child: [{
      class: 'cd-month-table-header',
      child: {
        tag: 'cdayofweekrow'
      }
    }, {
      tag: 'bscroller',
      class: 'cd-month-table-body',
      child: {
        class: 'cd-month-table-content'
      }
    }, {
      class: 'cd-month-table-footer'
    }]
  });
};

MonthTable.prototype._appendTop = function () {
  var rowElt;

  var weekMillis = this._week.getTime();

  for (var i = 1; i <= 3; ++i) {
    rowElt = _({
      tag: 'cweekrow',
      props: {
        date: new Date(weekMillis - i * _datetime.MILLIS_PER_DAY * 7)
      }
    });
    this.$content.addChildBefore(rowElt, this.$content.firstChild);
    this.$weekRows.unshift(rowElt);
  }

  this._week = this.$weekRows[0].date;
  this.domSignal.emit('requestUpdateCardPosition');
};

MonthTable.prototype._appendBottom = function () {
  var rowElt;
  var weekMillis = this._week.getTime() + _datetime.MILLIS_PER_DAY * 7 * this.$weekRows.length;

  for (var i = 0; i < 3; ++i) {
    rowElt = _({
      tag: 'cweekrow',
      props: {
        date: new Date(weekMillis + i * _datetime.MILLIS_PER_DAY * 7)
      }
    });
    this.$content.addChild(rowElt, this.$content.firstChild);
    this.$weekRows.push(rowElt);
  }

  this.domSignal.emit('requestUpdateCardPosition');
};

MonthTable.prototype.scrollIntoDate = function (date) {
  var row = this.getWeekRowByDate(date);

  if (row) {
    this.$body.scrollInto(row);
  }
};

MonthTable.prototype._scrollToFocusMonth = function () {
  var month = (0, _datetime.beginOfMonth)(this._focusDate);
  this.scrollIntoDate(month);
};
/**
 *
 * @param {Date} date
 * @returns {CWeekRow}
 */


MonthTable.prototype.getWeekRowByDate = function (date) {
  return this.$weekRows[this.getWeekRowIdxByDate(date)];
};
/**
 *
 * @param {Date} date
 * @returns {Number}
 */


MonthTable.prototype.getWeekRowIdxByDate = function (date) {
  var week = this._beginOfWeek(date);

  var idx = Math.floor((0, _datetime.compareDate)(week, this._week) / 7);
  return idx;
};
/**
 *
 * @param {Date} date
 * @returns {CDayCell}
 */


MonthTable.prototype.getCellByDate = function (date) {
  var row = this.getWeekRowByDate(date);

  if (row) {
    return row.getCellByDate(date);
  }

  return null;
};

MonthTable.prototype._beginOfWeek = function (date) {
  return (0, _datetime.beginOfWeek)(date, false, this._firstDayOfWeek);
};
/**
 * @param {import('./CActivity').MonthTableItemProperty} props
 */


MonthTable.prototype.addActivity = function (props) {
  var mc = new _CActivity.default(this, props);
  mc.on('click', this.eventHandler.clickActivity);
  this.activities.push(mc);
  this.requestUpdateCardPosition();
  return mc;
};
/**
 * @param {CActivity} activity
 */


MonthTable.prototype.removeActivity = function (activity) {
  var cardIndex = this.activities.indexOf(activity);

  if (cardIndex >= 0) {
    this.activities.splice(cardIndex, 1);
    activity.removeAllDaySegment();
    activity.$table = null;
    activity.off('mouseenter', this.eventHandler.enterActivity).off('mouseleave', this.eventHandler.leaveActivity); //         .off('dragstart', this.eventHandler.dragStartCard)
    //         .off('dragend', this.eventHandler.dragEndCard)
    //         .off('drag', this.eventHandler.dragCard);
  } else {
    throw new Error("Card is not a member of MonthTable");
  }
};

MonthTable.prototype.removeAllActivity = function () {
  var activity;

  for (var i = 0; i < this.activities.length; ++i) {
    activity = this.activities[i];
    activity.removeAllDaySegment();
    activity.$table = null;
    activity.off('mouseenter', this.eventHandler.enterActivity).off('mouseleave', this.eventHandler.leaveActivity);
  }

  this.activities = [];
  this.requestUpdateCardPosition();
};
/**
 * @param {CActivity} activity
 */


MonthTable.prototype.containsActivity = function (activity) {
  var cardIndex = this.activities.indexOf(activity);
  return cardIndex >= 0;
};

MonthTable.prototype._updateDays = function () {
  var startMillis = this._week.getTime();

  for (var i = 0; i < this.$weekRows.length; ++i) {
    this.$weekRows[i].date = new Date(startMillis + _datetime.MILLIS_PER_DAY * 7 * i);
  }
};

MonthTable.prototype._updateSelectedDate = function () {
  if (this.$selectDate) {
    this.$selectDate.removeClass('cd-selected');
  }

  var date = this._selectedDate;
  if (!date) return;
  var cell = this.getCellByDate(date);

  if (cell) {
    this.$selectDate = cell;
    this.$selectDate.addClass('cd-selected');
  } else {
    this._selectedDate = null; //selected day is out
  }
};

MonthTable.prototype.selectDate = function (date) {
  this._selectedDate = date;

  this._updateSelectedDate();
};

MonthTable.prototype.selectActivity = function (activity) {
  if (activity == this.activeActivity) return;

  if (this.activeActivity) {
    this.activeActivity.active = false;
    this.activeActivity.updateActive();
  }

  this.activeActivity = activity;

  if (this.activeActivity) {
    this.activeActivity.active = true;
    this.activeActivity.updateActive();
  }
};

MonthTable.prototype._dateOfCell = function (cell) {
  /**
   * @type {CWeekRow}
   */
  var parent = cell.parentElement;
  var idx = parent.$dayCells.indexOf(cell);
  return new Date(parent.date.getTime() + _datetime.MILLIS_PER_DAY * idx);
};

MonthTable.prototype.getCellByPosition = function (clientX, clientY) {
  var point = new _Vec.default(clientX, clientY);
  var bound;
  var j;

  for (var i = 0; i < this.$weekRows.length; ++i) {
    bound = _Rectangle.default.fromClientRect(this.$weekRows[i].getBoundingClientRect());

    if (bound.containsPoint(point)) {
      j = Math.floor((bound.x - clientX) / (bound.width / 7));
      return this.$weekRows[i].$dayCells[j];
    }
  }

  return null;
};

MonthTable.prototype._clearPlaceHolder = function () {
  var pool = MonthTable.$placePool;
  this.$placeHolder.forEach(function (ph) {
    ph.clearChild();
    ph.selfRemove();
    pool.push(ph);
  });
  this.$placeHolder = [];
};

MonthTable.prototype._makeOnePlaceHolder = function () {
  var holder;

  if (MonthTable.$placePool.length > 0) {
    holder = MonthTable.$placePool.pop();
  } else {
    holder = _('.cd-month-table-item-place-holder');
  }

  this.$placeHolder.push(holder);
  return holder;
};

MonthTable.prototype._clearClonedPlaceHolder = function () {// var pool = MonthTable.$clonedPlacePool;
  // this.$clonedPlaceHolder.forEach(function (ph) {
  //     ph.clearChild();
  //     ph.selfRemove();
  //     pool.push(ph);
  // });
  // this.$clonedPlaceHolder = [];
};

MonthTable.prototype._makeOneClonedPlaceHolder = function () {
  var holder;

  if (MonthTable.$clonedPlacePool.length > 0) {
    holder = MonthTable.$clonedPlacePool.pop();
  } else {
    holder = _('.cd-month-table-item-place-holder.cd-cloned');
  }

  this.$clonedPlaceHolder.push(holder);
  return holder;
};
/**
 *
 * @param {Element} cell
 * @returns {Number}
 */


MonthTable.prototype._countPlaceHolder = function (cell) {
  var count = 0;
  var child;

  for (var i = 0; i < cell.childNodes.length; ++i) {
    child = cell.childNodes[i];
    if (child.containsClass && child.containsClass('cd-month-table-item-place-holder') && !child.containsClass('cd-cloned')) count++;
  }

  return count;
};
/**
 *
 * @param {Element} cell
 * @param {Number} n
 */


MonthTable.prototype._fillHolderToCell = function (cell, n) {
  var n0 = this._countPlaceHolder(cell);

  while (n0 < n) {
    cell.addChild(this._makeOnePlaceHolder());
    ++n0;
  }
};

MonthTable.prototype.updateCardPosition = function () {
  this._clearPlaceHolder();

  var thisMT = this;
  var holder;
  var segments;
  var holders = this.activities.slice();
  holders.sort(ItemCmp);
  var sf = new _SegmentFinder.default();

  while (holders.length > 0) {
    holder = holders.shift();
    segments = holder.getVisibleDaySegments();
    segments.forEach(function (seg) {
      var pHolder = thisMT._makeOnePlaceHolder();

      pHolder.addChild(seg.$item);
      var cell = thisMT.getCellByDate(seg.startTime);

      if (cell) {
        var idx = (0, _datetime.compareDate)(seg.startTime, thisMT._week);
        var yMin = sf.getMinYFreeAt(idx);

        thisMT._fillHolderToCell(cell, yMin);

        cell.addChild(pHolder);
        sf.push(idx, idx + seg.dayLength, yMin, seg);
      } else {
        throw new Error("Bug");
      }
    });
  }
};

MonthTable.prototype._updateClonedCardPosition = function () {// this._clearClonedPlaceHolder();
  // var thisMT = this;
  // this.clonedSegments = this.clonedCard.getVisibleDaySegments();
  // this.clonedSegments.forEach(function (seg) {
  //     var pHolder = thisMT._makeOneClonedPlaceHolder();
  //     var cell = thisMT.getCellByDate(seg.startTime);
  //     var cellBound = cell.getBoundingClientRect();
  //     var contentBound = thisMT.$content.getBoundingClientRect();
  //     var firstHolder = $('.cd-month-table-item-place-holder', cell.parentElement);
  //     if (firstHolder) {
  //         var holderBound = firstHolder.getBoundingClientRect();
  //         pHolder.addStyle({
  //             width: cellBound.width + 'px',
  //             left: cellBound.left - contentBound.left + 1 + 'px',
  //             top: holderBound.top - contentBound.top + 'px',
  //         });
  //     }
  //     else {
  //         pHolder.addStyle({
  //             width: cellBound.width + 'px',
  //             left: cellBound.left - contentBound.left + 'px',
  //             top: cellBound.top - contentBound.top + 30 + 'px',
  //         });
  //     }
  //     thisMT.$content.addChild(pHolder);
  //     pHolder.addChild(seg.$item);
  // });
};

MonthTable.prototype._appendIfNeed = function () {
  var firstRow = this.$weekRows[0];
  var firstRowBound = firstRow.getBoundingClientRect();
  var bodyBound = this.$body.getBoundingClientRect();

  if (firstRowBound.bottom > bodyBound.top) {
    this._appendTop();

    return;
  }

  var lastRow = this.$weekRows[this.$weekRows.length - 1];
  var lastRowBound = lastRow.getBoundingClientRect();

  if (lastRowBound.top < bodyBound.bottom) {
    this._appendBottom();
  }
};

MonthTable.prototype.notifyPeriodChange = function () {
  this.emit('visibleperiodchange', {
    target: this,
    visiblePeriod: this._lastVisiblePeriod || this.getVisiblePeriod()
  }, this);
};

MonthTable.prototype.notifyPeriodChangeIfNeed = function () {
  var currentVisiblePeriod = this.getVisiblePeriod();

  if (!this._lastVisiblePeriod || (0, _datetime.compareDate)(currentVisiblePeriod.startTime, this._lastVisiblePeriod.startTime, false) !== 0 || currentVisiblePeriod.rowCount !== this._lastVisiblePeriod.rowCount) {
    this._lastVisiblePeriod = currentVisiblePeriod;
    this.notifyPeriodChange();
  }
};

MonthTable.prototype.getVisiblePeriod = function (delta) {
  delta = delta || 0;
  var lIdx = 0,
      hIdx = this.$weekRows.length - 1;
  var bodyBound = this.$body.getBoundingClientRect();
  var mIdx;
  var mBound;

  while (lIdx < hIdx) {
    mIdx = lIdx + hIdx >> 1;
    mBound = this.$weekRows[mIdx].getBoundingClientRect();

    if (mBound.top + mBound.height / 2 < bodyBound.top + delta) {
      lIdx = mIdx + 1;
    } else {
      hIdx = mIdx;
    }
  }

  var topRowIdx = lIdx;
  lIdx = 0;
  hIdx = this.$weekRows.length - 1;

  while (lIdx < hIdx) {
    mIdx = lIdx + hIdx + 1 >> 1;
    mBound = this.$weekRows[mIdx].getBoundingClientRect();

    if (mBound.top + mBound.height / 2 > bodyBound.bottom + delta) {
      hIdx = mIdx - 1;
    } else {
      lIdx = mIdx;
    }
  }

  var botRowIdx = hIdx;
  return {
    startTime: new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * 7 * topRowIdx),
    endTime: new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * 7 * (botRowIdx + 1)),
    rowIdx: topRowIdx,
    rowCount: botRowIdx - topRowIdx + 1,
    startRowElt: this.$weekRows[topRowIdx],
    endRowElt: this.$weekRows[botRowIdx]
  };
};

MonthTable.prototype.prevPeriod = function () {
  var bodyBound = this.$body.getBoundingClientRect();
  var vp = this.getVisiblePeriod(bodyBound.height);
  this.focusInto(vp.startTime);
  return vp.startTime;
};

MonthTable.prototype.nextPeriod = function () {
  var vp = this.getVisiblePeriod();
  this.focusInto(vp.endTime);
  return vp.endTime;
};

MonthTable.prototype.focusInto = function (date) {
  var startTime = this.startTime;
  var endTime = this.endTime;

  if ((0, _datetime.compareDate)(date, startTime, false) < 14 || (0, _datetime.compareDate)(endTime, date, false) < 42) {
    this.focusDate = date;
  }

  this.selectDate(date);
  this.scrollIntoDate(date);
  this.notifyPeriodChangeIfNeed();
};

MonthTable.prototype.requestUpdateCardPosition = function () {
  this.domSignal.emit('requestUpdateCardPosition');
};

MonthTable.property = {};
/**
 * @type {MonthTable}
 */

MonthTable.property.focusDate = {
  set: function (date) {
    this._focusDate = date;
    this._week = (0, _datetime.beginOfWeek)(new Date(date.getTime() - 42 * _datetime.MILLIS_PER_DAY), false, this._firstDayOfWeek);

    this._updateDays();

    this._updateSelectedDate();

    this.requestUpdateCardPosition();
  },
  get: function () {
    return this._focusDate;
  }
};
MonthTable.property.startTime = {
  get: function () {
    return this._week;
  }
};
MonthTable.property.endTime = {
  get: function () {
    return new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * this.$weekRows.length * 7);
  }
};
/**
 * @type {MonthTable}
 */

MonthTable.property.firstDayOfWeek = {
  set: function (value) {
    if (!(value >= 0 && value < 7)) {
      value = 0;
    }

    if (this._firstDayOfWeek == value) return;
    this._firstDayOfWeek = value;
    var month = (0, _datetime.beginOfMonth)(this._focusDate);
    this._week = (0, _datetime.beginOfWeek)(new Date(month.getTime() - 42 * _datetime.MILLIS_PER_DAY), false, this._firstDayOfWeek);
    this.$dayOfWeekRow.firstDay = value;

    this._updateDays();

    this.requestUpdateCardPosition();
  },
  get: function () {
    return this._firstDayOfWeek;
  }
};
/**
 * @type {MonthTable}
 */

MonthTable.eventHandler = {};

MonthTable.eventHandler.attached = function () {
  this._scrollToFocusMonth();
};

MonthTable.eventHandler.clickDay = function (event) {
  var target = event.target;

  if (target.containsClass && target.containsClass('cd-day-cell')) {
    this.selectActivity(null);
    this.selectDate(this._dateOfCell(target));
    this.emit('presscell', {
      originEvent: event,
      type: 'presscell',
      cell: target,
      date: this._dateOfCell(target)
    });
  }
};
/**
 * @param {MouseEvent} event
 * @param {CActivity} sender
 */


MonthTable.eventHandler.clickActivity = function (event, sender) {
  this.selectDate(null);
  this.selectActivity(sender);
  this.emit('presscard', {
    originEvent: event,
    type: 'presscard',
    activity: sender
  }, this);
}; //lock all feature drag card


MonthTable.eventHandler.dragEndCard = function (event, sender) {
  return;

  if (this.clonedCard) {
    if (this.clonedCard.cloneFrom.startTime.getTime() != this.clonedCard.startTime.getTime() || this.clonedCard.cloneFrom.endTime.getTime() != this.clonedCard.endTime.getTime()) {
      //TODO: emit event or call plugin
      this.clonedCard.cloneFrom.startTime = this.clonedCard.startTime;
      this.clonedCard.cloneFrom.endTime = this.clonedCard.endTime;
      this.updateCardPosition();
    }

    this.clonedCard.remove();

    this._clearClonedPlaceHolder();

    this.clonedCard = null;
  }

  document.body.classList.remove('cd-moving-activity');
};

MonthTable.eventHandler.dragStartCard = function (event, sender) {
  return;
  this._dragTimeFactor = [1, 1];

  if (event.target.classList.contains('cd-month-table-item-right-drag-line')) {
    this._dragTimeFactor[0] = 0;
  } else if (event.target.classList.contains('cd-month-table-item-left-drag-line')) {
    this._dragTimeFactor[1] = 0;
  }

  this.eventHandler.clickActivity(event, sender);
  this.clonedCard = this.activeActivity.clone();
  this._initCloneIdx = this.getCellIdxByPosition(event.clientX, event.clientY);
  this._currentCloneIdx = this._initCloneIdx;

  this._updateClonedCardPosition();

  document.body.classList.add('cd-moving-activity');
};

MonthTable.eventHandler.dragCard = function (event, sender) {
  return;
  var newIdx = this.getCellIdxByPosition(event.clientX, event.clientY);

  if (newIdx != -1 && newIdx != this._currentCloneIdx) {
    this._currentCloneIdx = newIdx;
    var dMil = _datetime.MILLIS_PER_DAY * (newIdx - this._initCloneIdx);

    var newStartTimeMil = this.clonedCard.cloneFrom.startTime.getTime() + dMil * this._dragTimeFactor[0];

    var newEndTimeMil = this.clonedCard.cloneFrom.endTime.getTime() + dMil * this._dragTimeFactor[1];

    if (newEndTimeMil > newStartTimeMil) {
      //valid time
      this.clonedCard.startTime = new Date(newStartTimeMil);
      this.clonedCard.endTime = new Date(newEndTimeMil);

      this._updateClonedCardPosition();
    }
  }
};

MonthTable.eventHandler.scrollBody = function () {
  this._appendIfNeed();

  this.notifyPeriodChangeIfNeed(); //todo
};

_Core.default.install(MonthTable);

var _default = MonthTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/WeekTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/WeekTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/weektable.css");

require("../../css/nowline.css");

var _Core = _interopRequireDefault(require("./Core"));

var _datetime = require("absol/src/Time/datetime");

var _CActivity = _interopRequireDefault(require("./CActivity"));

var _CActivityTooltip = _interopRequireDefault(require("./CActivityTooltip"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _MonthTable = _interopRequireWildcard(require("./MonthTable"));

var _SegmentMerger = _interopRequireDefault(require("../helper/SegmentMerger"));

var _SegmentFinder = _interopRequireDefault(require("../helper/SegmentFinder"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));




var _ = _Core.default._;
var $ = _Core.default.$;

function WeekTable() {
  var thisWT = this;
  this.domSignal = new _DomSignal.default();
  this.domSignal.on('requestUpdateCardPosition', this.updateCardPosition.bind(this));
  this.domSignal.on('requestUpdateHourRows', this._updateHourRows.bind(this));
  this.domSignal.on('requestUpdateHours', this._updateHours.bind(this));
  this._focusDate = new Date();
  this._week = (0, _datetime.beginOfWeek)(this._focusDate, false, this._firstDayOfWeek);
  this._workHourStart = 8;
  this._workHourEnd = 17.5;
  this._daysOff = [];
  this._lastVisiblePeriod = null;
  /**
   * @type {Array<CActivity>}
   */

  this.activities = [];
  /**
   * @type {CActivity}
   */

  this.activeActivity = null;
  /**
   * @type {CDayOfWeekRow}
   */

  this.$dayOfWeekRow = $('cdayofweekrow', this);
  this.$dayOfWeekRow.addChildBefore(_('.cd-week-table-empty-day'), this.$dayOfWeekRow.firstChild);
  this._firstDayOfWeek = 0; //same with MonthTable

  this.firstDayOfWeek = this._firstDayOfWeek;
  this.$header = $('.cd-week-table-header', this);
  this.$hourPlaceHolder = [];
  this.$dayPlaceHolder = [];
  this.$multidayContent = $('.cd-week-table-multiday', this);
  /****
   * @type {CWeekRow}
   */

  this.$weekRow = _('cweekrow').addTo(this.$multidayContent);
  this.$emptyDay = _('.cd-week-table-empty-day');
  this.$weekRow.addChildBefore(this.$emptyDay, this.$weekRow.firstChild).on('click', this.eventHandler.clickWeekRow);
  this.$content = $('.cd-week-table-content', this).on('click', this.eventHandler.clickHourTable);
  this.$hourRows = Array.prototype.filter.call(this.$content.childNodes, function (elt) {
    return elt.containsClass && elt.containsClass('cd-week-table-hour');
  });
  this.$hours = [];
  $('.cd-week-table-hour-day', this, function (hourElt) {
    thisWT.$hours.push(hourElt);
  });
  this.$body = $('.cd-week-table-body', this).removeClass('as-bscroller');
  this.$nowLine = _('.cd-now-line').addTo(this.$body);
  this._updateNowLineTimeout = -1;
  this._selectedEltHolder = {
    type: -1
  };
  this.selectedTime = {
    type: -1,
    time: new Date()
  }; // this.$clonedDayPlaceHolder = [];
  // /**
  //  * @type {CActivity}
  //  */
  // this.clonedCard = null;
  // this._initCloneIdx = -1;
  // this._currentCloneIdx = -1;
  // this._dragTimeFactor = [0, 0];

  this.$attachook = _('attachhook').on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
  }).addTo(this);
  this.$attachook.requestUpdateSize = this.updateSize.bind(this);

  this._updateDays();

  this.workHourStart = 8;
  this.workHourEnd = 17.5;
  this.firstDayOfWeek = 0;
  this.daysOff = [0, 6];
  this.focusDate = new Date();
}

WeekTable.tag = "WeekTable".toLowerCase();

WeekTable.render = function () {
  return _({
    extendEvent: 'visibleperiodchange',
    class: ['cd-week-table', _BrowserDetector.default.isMobile ? 'cd-mobile' : 'cd-desktop'],
    child: [{
      //reuse class
      class: 'cd-week-table-header',
      child: {
        tag: 'cdayofweekrow'
      }
    }, {
      class: 'cd-week-table-multiday'
    }, {
      tag: 'bscroller',
      class: 'cd-week-table-body',
      child: {
        tag: 'bscroller',
        class: 'cd-week-table-content',
        child: Array(24).fill(null).map(function (u, i) {
          return {
            class: 'cd-week-table-hour',
            child: [{
              class: 'cd-week-table-hour-value',
              child: {
                class: 'cd-week-table-hour-value-number',
                child: [{
                  text: (i == 0 ? 12 : i <= 12 ? i : i - 12) + ''
                }].concat({
                  '0': [{
                    class: 'cd-week-table-hour-value-apm',
                    child: {
                      text: "AM"
                    }
                  }],
                  '12': [{
                    class: 'cd-week-table-hour-value-apm',
                    child: {
                      text: "PM"
                    }
                  }]
                }[i + ''] || [])
              }
            }].concat(Array(7).fill('.cd-week-table-hour-day'))
          };
        })
      }
    }]
  });
};

WeekTable.prototype.requestUpdateCardPosition = _MonthTable.default.prototype.requestUpdateCardPosition;

WeekTable.prototype._updateNowLine = function () {
  var thisWT = this;
  if (this._updateNowLineTimeout > 0) clearTimeout(this._updateNowLine);
  var now = new Date();

  var bDay = (now.getTime() - (0, _datetime.beginOfDay)(now).getTime()) / _datetime.MILLIS_PER_DAY;

  var contentBound = this.$content.getBoundingClientRect();
  this.$nowLine.addStyle('top', contentBound.height * bDay + 'px');
  var dayIndex = (0, _datetime.compareDate)(now, this._week);

  if (dayIndex >= 0 && dayIndex < 7) {
    this.$nowLine.addClass('cd-current-week').addStyle('--today-left', dayIndex / 7 * 100 + '%');
  } else {
    this.$nowLine.removeClass('cd-current-week');
  }

  if (this.isDescendantOf(document.body)) {
    this._updateNowLineTimeout = setTimeout(function () {
      thisWT._updateNowLineTimeout = -1;

      thisWT._updateNowLine();
    }, 30000);
  }
};

WeekTable.prototype.updateSize = function () {
  var headBound = this.$header.getBoundingClientRect();
  var dayContentBound = this.$multidayContent.getBoundingClientRect();
  this.$body.addStyle('height', 'calc(100% - ' + (headBound.height + dayContentBound.height) + 'px)');

  this._updateNowLine();
};

WeekTable.prototype.getCellIdxByPosition = function (clientX, clientY) {
  var rect;
  var point = new _Vec.default(clientX, clientY);

  for (var i = 0; i < this.$days.length; ++i) {
    rect = _Rectangle.default.fromClientRect(this.$days[i].getBoundingClientRect());
    rect.y = 0;
    rect.height = 100000;
    if (rect.containsPoint(point)) return i;
  }

  return -1;
};

WeekTable.prototype._getTimeByPosition = function (clientX, clientY) {
  var res = {
    type: -1
  }; //none

  var weekRowBound = this.$weekRow.getBoundingClientRect();
  var emptyCellBound = this.$emptyDay.getBoundingClientRect();
  var idx;

  if (clientX >= emptyCellBound.right && clientX < weekRowBound.right) {
    idx = Math.floor((clientX - emptyCellBound.right) / ((weekRowBound.right - emptyCellBound.right) / 7));

    if (clientY >= weekRowBound.top && clientY <= weekRowBound.bottom) {
      res.time = new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * idx);
      res.type = 0;
    } else {
      var contentBound = this.$content.getBoundingClientRect();
      var hIdx = Math.floor((clientY - contentBound.top) / contentBound.height * 48);
      res.type = 1;
      res.time = new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * idx + hIdx * _datetime.MILLIS_PER_HOUR / 2);
    }
  } //todo


  return res;
};

WeekTable.prototype.dateOfCell = function (idx) {
  return new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * idx);
};

WeekTable.prototype.hourOfCell = function (idx) {
  var start = this._week;
  var col = idx % 7;
  var row = Math.floor(idx / 7);
  return new Date(start.getTime() + _datetime.MILLIS_PER_DAY * col + _datetime.MILLIS_PER_HOUR * row);
};

WeekTable.prototype.getDayCellByDate = function (date) {
  return this.$weekRow.getCellByDate(date);
};
/**
 *
 * @param {Date} date
 * @returns {Number}
 */


WeekTable.prototype.getHourCellIdxByDate = function (date) {
  var iCol = (0, _datetime.compareDate)(date, this._week);
  if (iCol < 0 || iCol >= 7) return -1;
  var h = date.getHours();
  return h * 7 + iCol;
};

WeekTable.prototype.getHourCellByDate = function (date) {
  return this.$hours[this.getHourCellIdxByDate(date)] || null;
};

WeekTable.prototype.getTimeByPosition = function (x, y) {
  var startTime = this._week;
  var pos = new _Vec.default(x, y);
  var bound;

  for (var i = 0; i < this.$days.length; ++i) {
    bound = _Rectangle.default.fromClientRect(this.$days[i].getBoundingClientRect());

    if (bound.containsPoint(pos)) {
      return {
        type: 0,
        millis: startTime.getTime() + _datetime.MILLIS_PER_DAY * i
      };
    }
  }

  for (var i = 0; i < this.$hours.length; ++i) {
    bound = _Rectangle.default.fromClientRect(this.$hours[i].getBoundingClientRect());

    if (bound.containsPoint(pos)) {
      return {
        type: 1,
        millis: startTime.getTime() + _datetime.MILLIS_PER_DAY * (i % 7) + _datetime.MILLIS_PER_HOUR * Math.floor(i / 7)
      };
    }
  }

  return null;
};

WeekTable.$dayPlacePool = [];

WeekTable.prototype._clearDayPlaceHolder = function () {
  var pool = WeekTable.$dayPlacePool;
  this.$dayPlaceHolder.forEach(function (ph) {
    ph.clearChild();
    ph.selfRemove();
    pool.push(ph);
  });
  this.$dayPlaceHolder = [];
};

WeekTable.prototype._makeOneDayPlaceHolder = function () {
  var holder;

  if (WeekTable.$dayPlacePool.length > 0) {
    holder = WeekTable.$dayPlacePool.pop();
  } else {
    holder = _('.cd-week-table-day-item-place-holder');
  }

  this.$dayPlaceHolder.push(holder);
  return holder;
};

WeekTable.$clonedDayPlacePool = [];

WeekTable.prototype._clearClonedDayPlaceHolder = function () {
  var pool = WeekTable.$clonedDayPlacePool;
  this.$clonedDayPlaceHolder.forEach(function (ph) {
    ph.clearChild();
    ph.selfRemove();
    pool.push(ph);
  });
  this.$clonedDayPlaceHolder = [];
};

WeekTable.prototype._makeOneClonedDayPlaceHolder = function () {
  var holder;

  if (WeekTable.$clonedDayPlacePool.length > 0) {
    holder = WeekTable.$clonedDayPlacePool.pop();
  } else {
    holder = _('.cd-week-table-day-item-place-holder.cd-cloned');
  }

  this.$clonedDayPlaceHolder.push(holder);
  return holder;
};

WeekTable.$hourPlacePool = [];

WeekTable.prototype._clearHourPlaceHolder = function () {
  var pool = WeekTable.$hourPlacePool;
  this.$hourPlaceHolder.forEach(function (ph) {
    ph.clearChild();
    ph.selfRemove();
    pool.push(ph);
  });
  this.$hourPlaceHolder = [];
};

WeekTable.prototype._makeOneHourPlaceHolder = function () {
  var holder;

  if (_MonthTable.default.$placePool.length > 0) {
    holder = _MonthTable.default.$placePool.pop();
  } else {
    holder = _('.cd-week-table-hour-item-place-holder');
  }

  this.$hourPlaceHolder.push(holder);
  return holder;
};
/**
 *
 * @param {Element} cell
 * @returns {Number}
 */


WeekTable.prototype._countDayPlaceHolder = function (cell) {
  var count = 0;
  var child;

  for (var i = 0; i < cell.childNodes.length; ++i) {
    child = cell.childNodes[i];
    if (child.containsClass && child.containsClass('cd-week-table-day-item-place-holder') && !child.containsClass('cd-cloned')) count++;
  }

  return count;
};
/**
 *
 * @param {Element} cell
 * @param {Number} n
 */


WeekTable.prototype._fillDayHolderToCell = function (cell, n) {
  var n0 = this._countDayPlaceHolder(cell);

  while (n0 < n) {
    cell.addChild(this._makeOneDayPlaceHolder());
    ++n0;
  }
};

WeekTable.prototype._updateDayOfWeek = _MonthTable.default.prototype._updateDayOfWeek; //reuse

WeekTable.prototype._updateDays = function () {
  this.$weekRow.date = this._week;
};

WeekTable.prototype._updateHours = function () {
  var hourElt;
  var dayClass;

  for (var i = 0; i < this.$hours.length; ++i) {
    hourElt = this.$hours[i];
    dayClass = 'cd-day-' + (i + this.firstDayOfWeek) % 7;

    if (hourElt.__day_class__ && dayClass != hourElt.__day_class__) {
      hourElt.removeClass(hourElt.__day_class__);
    }

    hourElt.__day_class__ = dayClass;
    hourElt.addClass(dayClass);
  }
};

WeekTable.prototype._updateHourRows = function () {
  var start = this._workHourStart;
  var end = this._workHourEnd;
  var rowElt;

  for (var i = 0; i < 24; ++i) {
    rowElt = this.$hourRows[i];

    if (start <= i) {
      if (end - i >= 1) {
        rowElt.removeClass('cd-off').removeClass('cd-off-half-before').removeClass('cd-off-half-after');
      } else if (end - i >= 0.5) {
        rowElt.removeClass('cd-off').addClass('cd-off-half-after').removeClass('cd-off-half-before');
      } else {
        rowElt.addClass('cd-off');
      }
    } else if (start - 0.5 <= i) {
      if (end >= i) {
        rowElt.removeClass('cd-off').addClass('cd-off-half-before').removeClass('cd-off-half-after');
      } else {
        rowElt.addClass('cd-off');
      }
    } else {
      rowElt.addClass('cd-off');
    }
  }
};

WeekTable.prototype.selectDate = function (date) {
  this.selectedTime.type = date ? 0 : -1;
  this.selectedTime.time = date;

  this._updateSelectedTime();
};

WeekTable.prototype.selectHour = function (date) {
  this.selectedTime.type = date ? 1 : -1;
  this.selectedTime.time = date;

  this._updateSelectedTime();
};

WeekTable.prototype._updateSelectedTime = function () {
  if (this._selectedEltHolder.type === 0) {
    this._selectedEltHolder.$cell.removeClass('cd-selected');

    this._selectedEltHolder.type = -1;
    this._selectedEltHolder.$cell = null;
  } else if (this._selectedEltHolder.type === 1) {
    this._selectedEltHolder.$beforeCell.removeClass('cd-selected-before');

    this._selectedEltHolder.$afterCell.removeClass('cd-selected-after');

    this._selectedEltHolder.type = -1;
    this._selectedEltHolder.$beforeCell = null;
    this._selectedEltHolder.$afterCell = null;
  }

  if (this.selectedTime.type === 0) {
    this._selectedEltHolder.type = 0;
    this._selectedEltHolder.$cell = this.getDayCellByDate(this.selectedTime.time);

    this._selectedEltHolder.$cell.addClass('cd-selected');
  } else if (this.selectedTime.type === 1) {
    this._selectedEltHolder.type = 1;
    var cell;
    cell = this.getHourCellByDate(this.selectedTime.time);
    this._selectedEltHolder.$afterCell = this.getHourCellByDate(this.selectedTime.time);

    this._selectedEltHolder.$afterCell.addClass('cd-selected-after');

    if (this.selectedTime.time.getMinutes() >= 30) {
      cell = this.getHourCellByDate(new Date(this.selectedTime.time.getTime() + _datetime.MILLIS_PER_HOUR));
    }

    this._selectedEltHolder.$beforeCell = cell;

    this._selectedEltHolder.$beforeCell.addClass('cd-selected-before');
  } // if (this.$selectedCell) {
  //     this.$selectedCell.removeClass('cd-selected');
  //     this.$selectedCell = null;
  // }
  // if (this.selectedTime.type == 0 && this.selectedTime.time) {
  //     this.$selectedCell = this.getDayCellByDate(this.selectedTime.time);
  // }
  // else if (this.selectedTime.type == 1 && this.selectedTime.time) {
  //     this.$selectedCell = this.getHourCellByDate(this.selectedTime.time);
  //     console.log(this.$selectedCell)
  // }
  // else {
  //     //todo: clear
  // }
  // if (this.$selectedCell) {
  //     this.$selectedCell.addClass('cd-selected');
  // }

};

WeekTable.prototype.getVisiblePeriod = function () {
  return {
    startTime: this._week,
    endTime: new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * 7)
  };
};

WeekTable.prototype.prevPeriod = function () {
  var newDate = new Date(this._week.getTime() - _datetime.MILLIS_PER_DAY * 7);
  this.focusInto(newDate);
  return newDate;
};

WeekTable.prototype.nextPeriod = function () {
  var newDate = new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * 7);
  this.focusInto(newDate);
  return newDate;
};

WeekTable.prototype.focusInto = function (date) {
  var startTime = this.startTime;
  var endTime = this.endTime;

  if ((0, _datetime.compareDate)(date, startTime, false) < 0 || (0, _datetime.compareDate)(endTime, date, false) <= 0) {
    this.focusDate = date;
  }

  this.selectDate(date);
  this.notifyPeriodChangeIfNeed();
};

WeekTable.prototype.notifyPeriodChange = function () {
  this.emit('visibleperiodchange', {
    target: this,
    visiblePeriod: this._lastVisiblePeriod || this.getVisiblePeriod()
  }, this);
};

WeekTable.prototype.notifyPeriodChangeIfNeed = function () {
  var currentVisiblePeriod = this.getVisiblePeriod();

  if (!this._lastVisiblePeriod || (0, _datetime.compareDate)(currentVisiblePeriod.startTime, this._lastVisiblePeriod.startTime) !== 0) {
    this._lastVisiblePeriod = currentVisiblePeriod;
    this.notifyPeriodChange();
  }
};

WeekTable.prototype.updateCardPosition = function () {
  var thisWT = this;

  this._clearDayPlaceHolder();

  var segments = [];
  var activities = this.activities.slice();
  activities.sort(_MonthTable.ItemCmp);
  var sf = new _SegmentFinder.default();
  var singleCActivitys = [];
  var act;
  var segments;

  while (activities.length > 0) {
    act = activities.shift();

    if (act.isSingleDay()) {
      singleCActivitys.push(act);
      continue;
    }

    segments = act.getVisibleDaySegments();
    segments.forEach(function (seg) {
      var pHolder = thisWT._makeOneDayPlaceHolder();

      pHolder.addChild(seg.$item);
      var cell = thisWT.getDayCellByDate(seg.startTime);

      if (cell) {
        var idx = (0, _datetime.compareDate)(seg.startTime, thisWT._week);
        var yMin = sf.getMinYFreeAt(idx);

        thisWT._fillDayHolderToCell(cell, yMin);

        cell.addChild(pHolder);
        sf.push(idx, idx + seg.dayLength, yMin, seg);
      } else {
        throw new Error("Bug");
      }
    });
  }

  this._clearHourPlaceHolder();

  var sm = new _SegmentMerger.default();

  while (singleCActivitys.length > 0) {
    act = singleCActivitys.shift();
    sm.addItem(act, act.startTime.getTime(), act.endTime.getTime() - act.startTime.getTime());
  }

  var week = this._week;
  var minTop = 10000000;
  var topHourItem = null;
  sm.segments.forEach(function (group) {
    var startTime = (0, _datetime.beginOfDay)(new Date(group.start));
    var colIdx = (0, _datetime.compareDate)(startTime, week);
    if (colIdx < 0 || colIdx >= 7) return; // out of calendar

    var firsCell = thisWT.$hours[colIdx];
    /**
     * @type {Array<CActivity>}
     */

    var activities = group.items;

    var holder = thisWT._makeOneHourPlaceHolder();

    firsCell.addChild(holder);
    var segments = activities.map(function (act) {
      return act.getVisibleHourSegment();
    });
    var sf = new _SegmentFinder.default();
    segments.sort(function (a, b) {
      var d = a.startTime.getTime() - b.startTime.getTime();
      if (d == 0) d = b.endTime.getTime() - a.endTime.getTime();
      return d;
    });
    segments.forEach(function (segment) {
      var y = sf.getMinYFreeAt(segment.startTime.getTime());
      sf.push(segment.startTime.getTime(), segment.endTime.getTime(), y, segment);
    });
    var nCol = sf.getMaxY() + 1;
    holder.style.setProperty('--child-width', 100 / nCol + '%');
    sf.segments.forEach(function (seg) {
      var itemElt = seg.data.$item;
      var top = (seg.data.startTime.getTime() - startTime.getTime()) / _datetime.MILLIS_PER_HOUR * 100;

      if (top < minTop) {
        minTop = top;
        topHourItem = itemElt;
      }

      itemElt.addStyle({
        left: 100 * seg.y / nCol + '%',
        top: top + '%'
      });
      holder.addChild(itemElt);
    });
  });
  this.updateSize();

  if (topHourItem) {
    this.$body.scrollTop = (this.$body.getFontSize() * 4 + 1) * minTop / 100;
  }
};
/**
 * @param {import('./CActivity').MonthTableItemProperty} props
 */


WeekTable.prototype.addActivity = function (props) {
  var mc = new _CActivity.default(this, props);
  mc.on('click', this.eventHandler.clickActivity).on('mouseenter', this.eventHandler.enterActivity).on('mouseleave', this.eventHandler.leaveActivity);
  this.activities.push(mc);
  this.requestUpdateCardPosition();
  return mc;
};
/**
 * @param {CActivity} act
 */


WeekTable.prototype.removeActivity = function (act) {
  var cardIndex = this.activities.indexOf(act);

  if (cardIndex >= 0) {
    this.activities.splice(cardIndex, 1);
    act.removeAllSegment();
    act.$table = null;
    act.off('mouseenter', this.eventHandler.enterActivity).off('mouseleave', this.eventHandler.leaveActivity).off('dragstart', this.eventHandler.dragStartCard).off('dragend', this.eventHandler.dragEndCard).off('drag', this.eventHandler.dragCard);
  } else {
    throw new Error("Card is not a member of MonthTable");
  }

  this.requestUpdateCardPosition();
};

WeekTable.prototype.removeAllActivity = function () {
  var act;

  for (var i = 0; i < this.activities.length; ++i) {
    act = this.activities[i];
    act.removeAllDaySegment();
    act.$table = null;
    act.off('mouseenter', this.eventHandler.enterActivity).off('mouseleave', this.eventHandler.leaveActivity);
  }

  this.activities = [];
  this.requestUpdateCardPosition();
};
/**
 * @param {CActivity} act
 */


WeekTable.prototype.containsActivity = function (act) {
  var cardIndex = this.activities.indexOf(act);
  return cardIndex >= 0;
};

WeekTable.prototype._updateClonedCActivityPosition = function () {
  this._clearClonedDayPlaceHolder();

  var thisWT = this;
  this.clonedSegments = this.clonedCard.getVisibleDaySegments();
  this.clonedSegments.forEach(function (seg) {
    var pHolder = thisWT._makeOneClonedDayPlaceHolder();

    var cell = thisWT.getDayCellByDate(seg.startTime);
    var cellBound = cell.getBoundingClientRect();
    var contentBound = thisWT.$multidayContent.getBoundingClientRect();
    var firstHolder = $('.cd-week-table-day-item-place-holder', cell.parentElement);

    if (firstHolder) {
      var holderBound = firstHolder.getBoundingClientRect();
      pHolder.addStyle({
        width: cellBound.width - 1 + 'px',
        left: cellBound.left - contentBound.left + 1 + 'px',
        top: holderBound.top - contentBound.top + 'px'
      });
    } else {
      pHolder.addStyle({
        width: cellBound.width - 1 + 'px',
        left: cellBound.left - contentBound.left + 1 + 'px',
        top: cellBound.top - contentBound.top + 30 + 'px'
      });
    }

    thisWT.$multidayContent.addChild(pHolder);
    pHolder.addChild(seg.$item);
  });
};

WeekTable.prototype.requestUpdateCardPosition = _MonthTable.default.prototype.requestUpdateCardPosition;

WeekTable.prototype.requestUpdateHourRows = function () {
  this.domSignal.emit('requestUpdateHourRows');
};

WeekTable.prototype.requestUpdateHours = function () {
  this.domSignal.emit('requestUpdateHours');
};

WeekTable.prototype.selectActivity = function (act) {
  if (act == this.activeActivity) return;

  if (this.activeActivity) {
    this.activeActivity.active = false;
    this.activeActivity.updateActive();
  }

  this.activeActivity = act;

  if (this.activeActivity) {
    this.activeActivity.active = true;
    this.activeActivity.updateActive();
  }
};

WeekTable.property = {};
/**
 * @type {WeekTable}
 */

WeekTable.property.focusDate = {
  set: function (date) {
    if ((0, _datetime.compareDate)(this._focusDate, date) == 0) return;
    this._focusDate = date;
    this._week = (0, _datetime.beginOfWeek)(date, false, this._firstDayOfWeek);

    this._updateDays();

    this.requestUpdateCardPosition();
  },
  get: function () {
    return this._focusDate;
  }
};
WeekTable.property.startTime = {
  get: function () {
    return this._week;
  }
};
WeekTable.property.endTime = {
  get: function () {
    return new Date(this._week.getTime() + _datetime.MILLIS_PER_DAY * 7);
  }
};
/**
 * @type {WeekTable}
 */

WeekTable.property.firstDayOfWeek = {
  set: function set(value) {
    if (!(value >= 0 && value < 7)) {
      value = 0;
    }

    if (this._firstDayOfWeek == value) return;
    this._firstDayOfWeek = value;
    this._week = (0, _datetime.beginOfWeek)(this._focusDate, false, this._firstDayOfWeek);
    this.$dayOfWeekRow.firstDay = value;

    this._updateDays();

    this.requestUpdateHours();
    this.requestUpdateCardPosition();
  },
  get: function get() {
    return this._firstDayOfWeek;
  }
};
/**
 * @type {WeekTable}
 */

WeekTable.property.workHourStart = {
  set: function (value) {
    this._workHourStart = value;
    this.requestUpdateHourRows();
  },
  get: function () {
    return this._workHourStart;
  }
};
/**
 * @type {WeekTable}
 */

WeekTable.property.workHourEnd = {
  set: function (value) {
    this._workHourEnd = value;
    this.requestUpdateHourRows();
  },
  get: function () {
    return this._workHourEnd;
  }
};
/**
 * @type {WeekTable}
 */

WeekTable.property.daysOff = {
  set: function (value) {
    value = value || [];
    var contentElt = this.$content;

    this._daysOff.forEach(function (d) {
      contentElt.removeClass('cd-off-day-' + d);
    });

    this._daysOff = value;

    this._daysOff.forEach(function (d) {
      contentElt.addClass('cd-off-day-' + d);
    });
  },
  get: function () {
    return this._daysOff;
  }
};
/**
 * @type {WeekTable}
 */

WeekTable.eventHandler = {}; // WeekTable.eventHandler.clickDay = function (idx, event) {
//     var target = event.target;
//     if (target.containsClass
//         && (target.containsClass('cd-month-table-day')
//         )
//     ) {
//         this.selectDate(this.dayOfCell(idx))
//     }
// };

/**
 * @param {MouseEvent} event
 * @param {CActivity} sender
 */

WeekTable.eventHandler.clickActivity = function (event, sender) {
  this.selectActivity(sender);
  this.selectDate(null);
};
/**
 * @param {MouseEvent} event
 * @param {CActivity} sender
 */


WeekTable.eventHandler.enterActivity = function (event, sender) {
  if (this._showTooltipTimeout > 0) {
    clearTimeout(this._showTooltipTimeout);
    this._showTooltipTimeout = -1;
  }

  var pos = new _Vec.default(event.clientX, event.clientY);
  this._showTooltipOf = sender;
  this._showTooltipTimeout = setTimeout(function () {
    sender.tooltipToken = _CActivityTooltip.default.show(pos, {
      name: sender.name,
      time: sender.getTimeText(),
      board: sender.boardName || '',
      list: sender.listName || '',
      card: sender.cardName || ''
    });
  }, 200);
};
/**
 * @param {MouseEvent} event
 * @param {CActivity} event
 */


WeekTable.eventHandler.leaveActivity = function (event, sender) {
  if (this._showTooltipOf == sender && this._showTooltipTimeout > 0) {
    clearTimeout(this._showTooltipTimeout);
    this._showTooltipTimeout = -1;
  }

  _CActivityTooltip.default.close(sender.tooltipToken);
};

WeekTable.eventHandler.dragEndCard = function (event, sender) {
  return;
  this.getTimeByPosition(event.clientX, event.clientY);
  return;

  if (this.clonedCard) {
    if (this.clonedCard.cloneFrom.startTime.getTime() != this.clonedCard.startTime.getTime() || this.clonedCard.cloneFrom.endTime.getTime() != this.clonedCard.endTime.getTime()) {
      //TODO: emit event or call plugin
      this.clonedCard.cloneFrom.startTime = this.clonedCard.startTime;
      this.clonedCard.cloneFrom.endTime = this.clonedCard.endTime;
      this.updateCardPosition();
    }

    this.clonedCard.remove();

    this._clearClonedDayPlaceHolder();

    this.clonedCard = null;
  }

  document.body.classList.remove('cd-moving-activity');
};

WeekTable.eventHandler.dragStartCard = function (event, sender) {
  return;
  this.getTimeByPosition(event.clientX, event.clientY);
  return;
  this._dragTimeFactor = [1, 1];

  if (event.target.classList.contains('cd-month-table-item-right-drag-line')) {
    this._dragTimeFactor[0] = 0;
  } else if (event.target.classList.contains('cd-month-table-item-left-drag-line')) {
    this._dragTimeFactor[1] = 0;
  }

  this.eventHandler.clickActivity(event, sender);
  this.clonedCard = this.activeActivity.clone();
  this._initCloneIdx = this.getCellIdxByPosition(event.clientX, event.clientY);
  this._currentCloneIdx = this._initCloneIdx;

  this._updateClonedCActivityPosition();

  document.body.classList.add('cd-moving-activity');
};

WeekTable.eventHandler.dragCard = function (event, sender) {
  return;
  var timeInfo = this.getTimeByPosition(event.clientX, event.clientY);
  if (!timeInfo) return;
  return;
  var newIdx = this.getCellIdxByPosition(event.clientX, event.clientY);

  if (newIdx != -1 && newIdx != this._currentCloneIdx) {
    this._currentCloneIdx = newIdx;
    var dMil = _datetime.MILLIS_PER_DAY * (newIdx - this._initCloneIdx);

    var newStartTimeMil = this.clonedCard.cloneFrom.startTime.getTime() + dMil * this._dragTimeFactor[0];

    var newEndTimeMil = this.clonedCard.cloneFrom.endTime.getTime() + dMil * this._dragTimeFactor[1];

    if (newEndTimeMil > newStartTimeMil) {
      //valid time
      this.clonedCard.startTime = new Date(newStartTimeMil);
      this.clonedCard.endTime = new Date(newEndTimeMil);

      this._updateClonedCActivityPosition();
    }
  }
};
/***
 *
 * @param {MouseEvent} event
 */


WeekTable.eventHandler.clickWeekRow = function (event) {
  var target = event.target;

  if (target.containsClass && target.containsClass('cd-day-cell')) {
    var time = this._getTimeByPosition(event.clientX, event.clientY);

    if (time.type === 0) {
      this.selectedTime.vlue = time.time;
    }

    this.selectDate(this._getTimeByPosition(event.clientX, event.clientY).time);
    this.selectActivity(null);
  }
};

WeekTable.eventHandler.clickHourTable = function (event) {
  var time = this._getTimeByPosition(event.clientX, event.clientY).time;

  this.selectHour(time);
  this.selectActivity(null); // var bound = cellElt.getBoundingClientRect();
  // var dmil = 0;
  // if (event.clientY > bound.top + bound.height / 2) {
  //     dmil = MILLIS_PER_HOUR / 2;
  // }
  // console.log(idx);
  // this.selectedTime.type = 1;
  // this.selectedTime.time = new Date(this.hourOfCell(idx).getTime() + dmil);
  // console.log(this.selectedTime);
  // // this._updateSelectedCell();
};

_Core.default.install(WeekTable);

var _default = WeekTable;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dashboard/GridPosition.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dashboard/GridPosition.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.findCollapsedRect = findCollapsedRect;
exports.findDirs = findDirs;
exports.findNewPosition = findNewPosition;

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");


/***
 *
 * @param rectList
 * @param {Rectangle}rect
 * @return {string[]}
 */
function findCollapsedRect(rectList, rect) {
  var ids = [];
  /**
   * @type {Rectangle}
   */

  var cRect;

  for (var id in rectList) {
    cRect = rectList[id];

    if (cRect.collapsedSquare(rect) > 0) {
      ids.push(id);
    }
  }

  return ids;
}

var dirList = [new _Vec.default(0, -1), new _Vec.default(1, 0), new _Vec.default(0, 1), new _Vec.default(-1, 0)];

function findDirs(addingRect, movingRect) {
  var c1 = addingRect.centerPoint();
  var c2 = movingRect.centerPoint();
  var dir = c2.sub(c1).normalized();
  var res = dirList.slice();
  res.sort(function (a, b) {
    return -a.dot(dir) + b.dot(dir);
  });
  return res;
}
/***
 *
 * @param staticRectList
 * @param {Rectangle} addingRect
 * @param {Rectangle} movingRect
 * @param {Rectangle} gridsterBound
 * @param {Rectangle} emptyBound
 */


function findNewPosition(staticRectList, addingRect, movingRect, gridsterBound, emptyBound) {
  function tryWidthLimit(limitRect) {
    var allRects = Object.keys(staticRectList).map(function (key) {
      return staticRectList[key];
    });
    allRects.push(movingRect, gridsterBound, emptyBound);
    var minBound = allRects.reduce(function (ac, cr) {
      return ac.merge(cr);
    }, limitRect);
    var dirs = findDirs(addingRect, movingRect);
    var dir;
    var cPos;
    var cRect = movingRect.clone();

    for (var i = 0; i < dirs.length; ++i) {
      dir = dirs[i];
      cPos = new _Vec.default(movingRect.x, movingRect.y);

      while (true) {
        cPos = cPos.add(dir);
        cRect.x = cPos.x;
        cRect.y = cPos.y;
        if (!minBound.contains(cRect)) break;
        if (addingRect.collapsedSquare(cRect) > 0) continue;
        if (findCollapsedRect(staticRectList, cRect).length > 0) break;
        return cPos;
      }
    }

    if (emptyBound) for (var x = emptyBound.x; x < emptyBound.x + emptyBound.width - movingRect.width; ++x) {
      for (var y = emptyBound.y; y < emptyBound.y + emptyBound.height - movingRect.height; ++y) {
        cRect.x = x;
        cRect.y = y;
        if (!minBound.contains(cRect)) continue;
        if (addingRect.collapsedSquare(cRect) > 0) continue;
        if (findCollapsedRect(staticRectList, cRect).length > 0) continue;
        return new _Vec.default(x, y);
      }
    }
    emptyBound = minBound;

    for (var x = emptyBound.x; x < emptyBound.x + emptyBound.width - movingRect.width; ++x) {
      for (var y = emptyBound.y; y < emptyBound.y + emptyBound.height - movingRect.height; ++y) {
        cRect.x = x;
        cRect.y = y;
        if (!minBound.contains(cRect)) continue;
        if (addingRect.collapsedSquare(cRect) > 0) continue;
        if (findCollapsedRect(staticRectList, cRect).length > 0) continue;
        return new _Vec.default(x, y);
      }
    }
  }

  var limitRect = gridsterBound.clone();
  var ret;

  while (!ret) {
    ret = tryWidthLimit(limitRect);
    limitRect.height *= 2;
  }

  return ret;
}
};

moduleFactories["node_modules/absol-card/js/dashboard/DBWidget.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dashboard/DBWidget.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.dir2HS = void 0;

require("../../css/dbwidget.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _stringFormat = require("absol/src/String/stringFormat");

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _GridPosition = require("./GridPosition");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");


var _ = _Core.default._;
var $ = _Core.default.$;

function createDefaultDBWidgetMenu() {
  return {
    props: {
      items: [{
        text: 'Sửa',
        icon: 'span.mdi.mdi-pencil',
        cmd: 'edit'
      }, {
        text: 'Xóa',
        icon: 'span.mdi.mdi-delete',
        cmd: 'del'
      }]
    },
    onSelect: function (item) {
      console.log(item.cmd);
    }
  };
}

var dir2HS = {
  ne: [0, 1, 1, -1],
  nw: [1, 1, -1, -1],
  se: [0, 0, 1, 1],
  sw: [1, 0, -1, 1],
  e: [0, 0, 1, 0],
  w: [1, 0, -1, 0],
  s: [0, 0, 0, 1],
  n: [0, 1, 0, -1],
  move: [1, 1, 0, 0]
};
exports.dir2HS = dir2HS;
_('style#db-wedget-style').addTo(document.head).innerHTML = Object.keys(dir2HS).map(function (name) {
  return 'body.db-resizing-' + name + ' > div';
}).join(',\n') + '{\n' + '    pointer-events: none;\n' + '}\n' + Object.keys(dir2HS).map(function (name) {
  return 'body.db-resizing-' + name + '{\n' + '    cursor: ' + name + (name === 'move' ? '' : '-resize') + ';\n' + '}';
}).join('\n');
/***
 * @extends AElement
 * @constructor
 */

function DBWidget() {
  this.gridX = 0;
  this.gridY = 0;
  this.gridWidth = 1;
  this.gridHeight = 1;
  var thisW = this;
  this.$title = $('.db-widget-title', this);
  this.$titleText = this.$title.firstChild;
  this.$headerRight = $('.db-widget-header-right', this);
  this.$body = $('.db-widget-body', this);
  this.$contextBtn = $('.db-widget-context-btn', this);
  this.$filterBtn = $('.db-widget-filter-btn', this).on('click', this.eventHandler.clickFilterBtn);

  for (var dirName in dir2HS) {
    this['$resizer' + dirName.toUpperCase()] = $('.db-widget-resize-' + dirName, this).on('dragstart', this._startLocalState.bind(this, dir2HS[dirName])).on('drag', this._changeLocalState.bind(this)).on('dragend', this._endLocalState.bind(this));
  }

  this._quickmenuHolder = null;
  this._quickmenuAdapter = {
    getMenuProps: function () {
      return thisW._quickmenu.props;
    },
    onSelect: function () {
      if (typeof thisW._quickmenu.onSelect == 'function') thisW._quickmenu.onSelect.apply(thisW, arguments);
    }
  };
  this._quickmenu = null;
  this.quickmenu = createDefaultDBWidgetMenu();
  this.$attachhook = $('attachhook', this);
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$attachhook.on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdateSize();
  });
  this.on('pointerdown', this.eventHandler.pointerdown);
}

DBWidget.tag = 'DBWidget'.toLowerCase();

DBWidget.render = function () {
  return _({
    class: 'db-widget',
    id: (0, _stringGenerate.randomIdent)(20),
    extendEvent: ['pressfilter', 'positionchange'],
    child: [{
      class: 'db-widget-header',
      child: [{
        tag: 'hanger',
        class: 'db-widget-resize-move',
        child: 'span.mdi.mdi-drag-vertical'
      }, {
        tag: 'span',
        class: 'db-widget-title',
        child: {
          text: ""
        }
      }, {
        class: 'db-widget-header-right',
        child: [{
          tag: 'button',
          class: ['tl-transparent-btn', 'db-widget-filter-btn'],
          child: 'span.mdi.mdi-filter'
        }, {
          tag: 'button',
          class: ['tl-transparent-btn', 'db-widget-context-btn'],
          child: 'span.mdi.mdi-dots-horizontal'
        }]
      }]
    }, {
      class: ['db-widget-body', 'as-bscroller']
    }, // 'hanger.db-widget-resize',
    'hanger.db-widget-resize-n', 'hanger.db-widget-resize-s', 'hanger.db-widget-resize-e', 'hanger.db-widget-resize-w', {
      tag: 'hanger',
      class: 'db-widget-resize-se',
      child: 'span.mdi.mdi-resize-bottom-right'
    }, 'hanger.db-widget-resize-nw', 'hanger.db-widget-resize-ne', 'hanger.db-widget-resize-sw', 'attachhook']
  });
};

['addChild', 'addChildBefore', 'addChildAfter', 'clearchild', 'findChildBefore', 'findChildAfter'].forEach(function (name) {
  DBWidget.prototype[name] = function () {
    return this.$body[name].apply(this.$body, arguments);
  };
});
DBWidget.prototype.maxScrollSpeed = 300;

DBWidget.prototype.updateSize = function () {
  var rightBound = this.$headerRight.getBoundingClientRect();
  this.$title.addStyle('width', 'calc(100% - ' + rightBound.width + 'px)');
};

DBWidget.prototype.getChildNodes = function () {
  return this.$body.getChildNodes();
};
/***
 *
 * @return {Rectangle}
 */


DBWidget.prototype.getGridPosition = function () {
  return new _Rectangle.default(this.gridX, this.gridY, this.gridWidth, this.gridHeight);
};
/***
 *
 * @param {Rectangle} position
 */


DBWidget.prototype.setGridPosition = function (position) {
  this.gridX = position.x;
  this.gridY = position.y;
  this.gridWidth = position.width;
  this.gridHeight = position.height;
};

DBWidget.property = {};
/**
 *
 * @type {{} |DBWidget}
 */

DBWidget.property.title = {
  set: function (value) {
    this.$titleText.data = value || '';
  },
  get: function () {
    return this.$titleText.data;
  }
};
DBWidget.property.quickmenu = {
  set: function (value) {
    value = value || null;

    if (value) {
      if (!this._quickmenuHolder) this._quickmenuHolder = _QuickMenu.default.toggleWhenClick(this.$contextBtn, this._quickmenuAdapter);
    } else {
      if (this._quickmenuHolder) {
        this._quickmenuHolder.remove();

        this._quickmenuHolder = null;
      }
    }

    this._quickmenu = value;
  },
  get: function () {
    return this._quickmenu;
  }
};
DBWidget.property.gridPosition = {
  set: function (value) {
    this.setGridPosition(value);
  },
  get: function () {
    return this.getGridPosition();
  }
};
['grid-x', 'grid-y', 'grid-width', 'grid-height'].forEach(function (styleName) {
  var propertyName = (0, _stringFormat.kebabCaseToCamelCase)(styleName);
  var stylePropertyName = '--' + styleName;
  DBWidget.property[propertyName] = {
    set: function (value) {
      value = value || 0;
      this.addStyle(stylePropertyName, value + '');
    },
    get: function () {
      return parseFloat(this.getComputedStyleValue(stylePropertyName)) || 0;
    }
  };
});
/**
 * @returns {DBGridster}
 */

DBWidget.prototype.getParent = function () {
  return this.parentElement;
};

DBWidget.prototype._startLocalState = function (hs, event) {
  var cursorClass = 'db-resizing-' + (event.target.attr('class').match(/resize-([a-z]+)/) || ['', 'move'])[1];
  document.body.classList.add(cursorClass);
  this.addClass('db-moving');
  var parent = this.getParent();
  var pBound = parent.getBoundingClientRect();
  var bound = this.getBoundingClientRect();
  var pos = new _Vec.default(bound.left, bound.top);
  var pPos = new _Vec.default(pBound.left, pBound.top).sub(new _Vec.default(parent.scrollLeft, parent.scrollTop));
  this._resizeData = {
    cursorClass: cursorClass,
    hs: hs,
    bound: bound,
    position: pos.sub(pPos),
    offset: event.startingPoint.sub(pPos),
    size: new _Vec.default(bound.width, bound.height),
    currentPoint: event.currentPoint,
    $placePreview: _('.db-widget-place-preview').addTo(parent),
    startPositionList: parent.getPositionList(),
    cGridWidth: this.gridWidth,
    cGridHeight: this.gridHeight,
    cGridX: this.gridX,
    cGridY: this.gridY,
    lGridWidth: this.gridWidth,
    lGridHeight: this.gridHeight,
    lGridX: this.gridX,
    lGridY: this.gridY,
    lGridPosition: this.getGridPosition(),
    modifiedPosition: {
      error: 'NOT_INIT'
    },
    $scrollHolder: _({
      class: 'db-gridster-scroll-holder',
      style: {
        top: parent.scrollHeight - 1 + 'px'
      }
    }).addTo(parent)
  };
};

DBWidget.prototype._endLocalState = function () {
  document.body.classList.remove(this._resizeData.cursorClass);
  var parent = this.getParent();

  this._resizeData.$placePreview.remove();

  this._resizeData.$scrollHolder.remove();

  var newPosition = Object.assign({}, this._resizeData.startPositionList);

  if (!this._resizeData.modifiedPosition.error) {
    var position = parent.findPosition(this.getBoundingClientRect());
    this.addStyle(position);
    Object.assign(newPosition, this._resizeData.modifiedPosition);
    delete newPosition[this.id];
  }

  this.removeStyle('width').removeStyle('height').removeStyle('top').removeStyle('left');
  this.removeClass('db-moving');
  parent.applyPositionList(newPosition);
  var newPositionList = parent.getPositionList();

  for (var id in newPositionList) {
    if (!newPositionList[id].equals(this._resizeData.startPositionList[id])) {
      this.emit('positionchange', {
        type: 'positionchange',
        target: this,
        newPositionList: newPositionList,
        prevPositionList: Object.assign({}, this._resizeData.startPositionList)
      }, this);
      parent.emit('positionlistchange', {
        type: 'positionlistchange',
        target: parent,
        newPositionList: newPositionList,
        prevPositionList: Object.assign({}, this._resizeData.startPositionList)
      }, parent);
      break;
    }
  }

  this._resizeData = null;
};

DBWidget.prototype._changeLocalState = function (event) {
  if (this._resizeData.requestAnimationFrameId >= 0) {
    cancelAnimationFrame(this._resizeData.requestAnimationFrameId);
    this._resizeData.requestAnimationFrameId = -1;
  }

  var parent = this.getParent();
  var hs = this._resizeData.hs;
  var pBound = parent.getBoundingClientRect();
  var pPos = new _Vec.default(pBound.left, pBound.top).sub(new _Vec.default(parent.scrollLeft, parent.scrollTop));
  var newOffset = event.currentPoint.sub(pPos);
  var d = newOffset.sub(this._resizeData.offset);
  this.addStyle({
    width: this._resizeData.bound.width + d.x * hs[2] + 'px',
    height: this._resizeData.bound.height + d.y * hs[3] + 'px'
  });
  this.addStyle({
    left: this._resizeData.position.x + d.x * hs[0] + 'px',
    top: this._resizeData.position.y + d.y * hs[1] + 'px'
  });
  var position = parent.findPosition(this.getBoundingClientRect());

  this._resizeData.$placePreview.addStyle(position);

  if (this._resizeData.cGridWidth !== position["--grid-width"] || this._resizeData.cGridHeight !== position["--grid-height"] || this._resizeData.cGridX !== position["--grid-x"] || this._resizeData.cGridY !== position["--grid-y"]) {
    this._resizeData.cGridWidth = position["--grid-width"];
    this._resizeData.cGridHeight = position["--grid-height"];
    this._resizeData.cGridX = position["--grid-x"];
    this._resizeData.cGridY = position["--grid-y"];
    var allRects = Object.assign({}, this._resizeData.startPositionList);
    var thisRect = allRects[this.id].clone();
    thisRect.width = this._resizeData.cGridWidth;
    thisRect.height = this._resizeData.cGridHeight;
    thisRect.x = this._resizeData.cGridX;
    thisRect.y = this._resizeData.cGridY;
    delete allRects[this.id];
    var collapseRectIds = (0, _GridPosition.findCollapsedRect)(allRects, thisRect);
    var newPositionList = Object.assign({}, this._resizeData.startPositionList);
    var staticRect;
    var moveId;
    var moveRect;
    var newPos;

    for (var i = 0; i < collapseRectIds.length; ++i) {
      moveId = collapseRectIds[i];
      staticRect = Object.assign({}, allRects);
      moveRect = staticRect[moveId].clone();
      delete staticRect[moveId];
      newPos = (0, _GridPosition.findNewPosition)(staticRect, thisRect, moveRect, new _Rectangle.default(0, 0, this.getParent().nCol, this.getParent().nRow), this._resizeData.lGridPosition);

      if (newPos) {
        moveRect.x = newPos.x;
        moveRect.y = newPos.y;
        newPositionList[moveId] = moveRect;
        allRects[moveId] = moveRect;
      } else {
        newPositionList = {
          error: "FAIL"
        };
        break;
      }
    }

    if (!newPositionList.error) {
      this.getParent().applyPositionList(newPositionList);
    } else {}

    this._resizeData.modifiedPosition = newPositionList;
  }

  _ResizeSystem.default.updateDown(this);

  this._autoScroll(event);
};

DBWidget.prototype._autoScroll = function (event) {
  if (!this._resizeData) return;
  var resizeData = this._resizeData;
  var scrollerX = this.getParent();
  var overflowStyle;

  while (scrollerX) {
    overflowStyle = window.getComputedStyle(scrollerX)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'auto hidden' || overflowStyle === 'scroll' || scrollerX.tagName === 'HTML') && scrollerX.clientWidth < scrollerX.scrollWidth) break;
    scrollerX = scrollerX.parentElement;
  }

  var scrollerY = this.getParent();

  while (scrollerY) {
    overflowStyle = window.getComputedStyle(scrollerY)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'hidden auto' || overflowStyle === 'scroll' || scrollerY.tagName === 'HTML') && scrollerY.clientHeight < scrollerY.scrollHeight) break;
    scrollerY = scrollerY.parentElement;
  }

  var outBound;
  var bBound;

  var screenSize = _Dom.default.getScreenSize();

  var vx = 0;
  var vy = 0;
  bBound = this.getBoundingClientRect();

  if (scrollerX) {
    if (resizeData.$scrollerX !== scrollerX || !event.repeated) {
      resizeData.scrollerXValue = scrollerX.scrollLeft;
      resizeData.$scrollerX = scrollerX;
    }

    outBound = scrollerX.getBoundingClientRect();
    outBound = {
      left: Math.max(outBound.left, 0),
      top: Math.max(outBound.top, 0),
      bottom: Math.min(outBound.bottom, screenSize.height),
      right: Math.min(outBound.right, screenSize.width)
    };

    if (bBound.left < outBound.left) {
      vx = bBound.left - outBound.left;
    } else if (bBound.right > outBound.right) {
      vx = bBound.right - outBound.right;
    }
  } else {
    resizeData.$scrollerX = null;
  }

  if (scrollerY) {
    if (resizeData.$scrollerY !== scrollerY || !event.repeated) {
      resizeData.scrollerYValue = scrollerY.scrollTop;
      resizeData.$scrollerY = scrollerY;
    }

    outBound = scrollerY.getBoundingClientRect();
    outBound = {
      left: Math.max(outBound.left, 0),
      top: Math.max(outBound.top, 0),
      bottom: Math.min(outBound.bottom, screenSize.height),
      right: Math.min(outBound.right, screenSize.width)
    };

    if (bBound.top < outBound.top) {
      vy = bBound.top - outBound.top;
    } else if (bBound.bottom > outBound.bottom) {
      vy = bBound.bottom - outBound.bottom;
    }
  } else {
    resizeData.$scrollerY = null;
  }

  vx = Math.max(-this.maxScrollSpeed, Math.min(this.maxScrollSpeed, vx * Math.sqrt(Math.abs(vx))));
  vy = Math.max(-this.maxScrollSpeed, Math.min(this.maxScrollSpeed, vy * Math.sqrt(Math.abs(vy))));

  if (vx !== 0 || vy !== 0) {
    var cEvent = Object.assign({
      repeated: true
    }, event);
    var thisBT = this;
    var now = new Date().getTime();

    if (resizeData.requestAnimationFrameId >= 0) {
      cancelAnimationFrame(resizeData.requestAnimationFrameId);
      resizeData.requestAnimationFrameId = -1;
    }

    resizeData.requestAnimationFrameId = requestAnimationFrame(function () {
      resizeData.requestAnimationFrameId = -1;
      var dt = (new Date().getTime() - now) / 1000;
      var cont = false;

      if (resizeData.$scrollerY && vy !== 0 && bBound.height < resizeData.$scrollerY.clientHeight) {
        resizeData.scrollerYValue += vy * dt;
        resizeData.scrollerYValue = Math.max(0, Math.min(resizeData.$scrollerY.scrollHeight - resizeData.$scrollerY.clientHeight, resizeData.scrollerYValue));
        resizeData.$scrollerY.scrollTop = resizeData.scrollerYValue;
        cont = true;
      }

      if (resizeData.$scrollerX && bBound.width < resizeData.$scrollerX.clientHeight) {
        resizeData.scrollerXValue += vx * dt;
        resizeData.scrollerXValue = Math.max(0, Math.min(resizeData.$scrollerX.scrollWidth - resizeData.$scrollerX.clientWidth, resizeData.scrollerXValue));
        resizeData.$scrollerX.scrollLeft = resizeData.scrollerXValue;
        cont = true;
      }

      if (thisBT._resizeData && cont) {
        thisBT._changeLocalState(cEvent);
      }
    });
  }
};
/***
 *
 * @type {DBWidget|{}}
 */


DBWidget.eventHandler = {};

DBWidget.eventHandler.pointerdown = function () {
  if (this.containsClass('cd-active')) return;
  var parent = this.getParent();

  if (parent) {
    parent.activeWidget(this);
  }
};

DBWidget.eventHandler.clickFilterBtn = function (event) {
  this.emit('pressfilter', {
    originEvent: event,
    type: 'pressfilter',
    target: this
  }, this);
};

_Core.default.install(DBWidget);

var _default = DBWidget;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dashboard/DBGridster.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dashboard/DBGridster.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/dbgridster.css");

var _Core = _interopRequireDefault(require("../dom/Core"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends AElement
 * @constructor
 */

function DBGridster() {
  this.cellSize = 50;
}

DBGridster.tag = 'DBGridster'.toLowerCase();

DBGridster.render = function () {
  return _({
    extendEvent: ['positionlistchange'],
    class: ['db-gridster', 'as-bscroller'],
    child: ['.db-gridster-place-preview']
  });
};
/***
 *
 * @param {DOMRect} cRect
 * @returns {{"--grid-x": number, "--grid-width": number, "--grid-y": number, "--grid-height": number}}
 */


DBGridster.prototype.findPosition = function (cRect) {
  var cBound = this.getBoundingClientRect();
  var bound = {
    width: this.clientWidth,
    height: this.clientHeight,
    top: cBound.top,
    left: cBound.left
  };
  var width, height;
  var x, y;
  var cellWidth = this.cellSize;
  x = Math.round((cRect.left - bound.left + this.scrollLeft - 10) / cellWidth);
  var right = Math.round((cRect.right + 12 - bound.left + this.scrollLeft - 10) / cellWidth);
  var cellHeight = this.cellSize;
  y = Math.round((cRect.top - bound.top + this.scrollTop - 10) / cellHeight);
  var bottom = Math.round((cRect.bottom + 12 - bound.top + this.scrollTop - 10) / cellHeight);
  x = Math.max(0, x);
  y = Math.max(0, y);
  width = Math.max(1, right - x);
  height = Math.max(1, bottom - y);
  return {
    '--grid-x': x,
    '--grid-y': y,
    '--grid-width': width,
    '--grid-height': height
  };
};

DBGridster.prototype.getPositionList = function () {
  return Array.prototype.reduce.call(this.childNodes, function (ac, elt) {
    if (elt.getGridPosition) {
      ac[elt.id] = elt.getGridPosition();
    }

    return ac;
  }, {});
};

DBGridster.prototype.applyPositionList = function (positionList) {
  Array.prototype.forEach.call(this.childNodes, function (elt) {
    if (elt.setGridPosition) {
      if (positionList[elt.id]) {
        elt.setGridPosition(positionList[elt.id]);
      }
    }
  }, {});
};

DBGridster.prototype.activeWidget = function (elt) {
  var c;

  for (var i = 0; i < this.childNodes.length; ++i) {
    c = this.childNodes[i];

    if (c === elt) {
      c.addClass('db-active');
    } else {
      c.removeClass('db-active');
    }
  }
};
/**
 *
 * @param {number} width
 * @param {number} height
 */


DBGridster.prototype.findAvailableNewRect = function (width, height) {
  var nCol = this.nCol;
  var h = Array(nCol).fill(0);
  var rects = this.getPositionList();
  var rect;

  for (var name in rects) {
    rect = rects[name];

    for (var x = rect.x; x < rect.x + rect.width; ++x) {
      h[x] = Math.max(h[x], rect.y + rect.height);
    }
  } //todo: better performance


  var bestX = -1;
  var bestY = 100000000;
  var y;

  for (var x = 0; x < nCol - width; ++x) {
    y = Math.max.apply(Math, h.slice(x, x + width));

    if (y < bestY) {
      bestX = x;
      bestY = y;
    }
  }

  return new _Rectangle.default(bestX, bestY, width, height);
};

DBGridster.property = {};
DBGridster.property.cellSize = {
  set: function (val) {
    val = val || 20;

    if (typeof val === "number") {
      this.addStyle('--gridster-cell-size', val + 'px');
    } else this.addStyle('--gridster-cell-size', val);
  },
  get: function () {
    return parseFloat(this.getComputedStyleValue('--gridster-cell-size').replace('px', ''));
  }
};
DBGridster.property.nCol = {
  set: function () {},
  get: function () {
    return Math.floor((this.clientWidth - 20) / this.cellSize) || 1;
  }
};
DBGridster.property.nRow = {
  set: function () {},
  get: function () {
    return Math.floor((this.clientHeight - 20) / this.cellSize) || 1;
  }
};
DBGridster.property.positionList = {
  set: function (value) {
    this.applyPositionList(value);
  },
  get: function () {
    return this.getPositionList();
  }
};
var _default = DBGridster;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/dom/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/dom/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = install;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _BoardManager = _interopRequireDefault(require("../taskboard/BoardManager"));

var _ListBoard = _interopRequireDefault(require("../taskboard/ListBoard"));

var _TaskCard = _interopRequireDefault(require("../taskboard/TaskCard"));

var _RepresentativeBoard = _interopRequireDefault(require("../taskboard/RepresentativeBoard"));

var _PlusBoard = _interopRequireDefault(require("./PlusBoard"));

var _MonthTable = _interopRequireDefault(require("./MonthTable"));

var _CActivityTooltip = _interopRequireDefault(require("./CActivityTooltip"));

var _WeekTable = _interopRequireDefault(require("./WeekTable"));

var _VTimeTableItem = _interopRequireDefault(require("./VTimeTableItem"));

var _CDayCell = _interopRequireDefault(require("./CDayCell"));

var _CWeekRow = _interopRequireDefault(require("./CWeekRow"));

var _BoardGroup = _interopRequireDefault(require("../taskboard/BoardGroup"));

var _TLBoardTable = _interopRequireDefault(require("../taskboard/TLBoardTable"));

var _TLList = _interopRequireDefault(require("../taskboard/TLList"));

var _TLCard = _interopRequireDefault(require("../taskboard/TLCard"));

var _DBWidget = _interopRequireDefault(require("../dashboard/DBWidget"));

var _DBGridster = _interopRequireDefault(require("../dashboard/DBGridster"));


/**
 * 
 * @param {Dom} core 
 */
function install(core) {
  core.install([_BoardManager.default, _ListBoard.default, _TaskCard.default, _PlusBoard.default, _RepresentativeBoard.default, _MonthTable.default, _CActivityTooltip.default, _WeekTable.default, _VTimeTableItem.default, _CDayCell.default, _CWeekRow.default, _BoardGroup.default, _TLBoardTable.default, _TLList.default, _TLCard.default, _DBWidget.default, _DBGridster.default]);
}
};

moduleFactories["node_modules/absol-card/js/adapter/WorkCalendarApdapter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/adapter/WorkCalendarApdapter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function WorkCalendarAdapter() {
  /***
   *
   * @type {WorkCalendar|null}
   */
  this.workCalendar = null;
}
/***
 *
 * @param {WorkCalendar} wc
 */


WorkCalendarAdapter.prototype.attach = function (wc) {
  this.workCalendar = wc;
};

WorkCalendarAdapter.prototype.getUserList = function () {
  throw new Error("Not implement!");
};

WorkCalendarAdapter.prototype.openActivity = function () {
  throw new Error("Not implement!");
};

WorkCalendarAdapter.prototype.getBoardList = function () {
  throw new Error("Not implement!");
};

WorkCalendarAdapter.prototype.getActivities = function (boardId, cardId) {
  throw new Error("Not implement!");
};

WorkCalendarAdapter.prototype.notifyDataSheetChange = function () {
  if (this.workCalendar) this.workCalendar.reload();
};

var _default = WorkCalendarAdapter;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/js/fragment/WorkCalendar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/js/fragment/WorkCalendar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/workcalendar.css");

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _Core = _interopRequireDefault(require("../dom/Core"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _datetime = require("absol/src/Time/datetime");

var _WorkCalendarApdapter = _interopRequireDefault(require("../adapter/WorkCalendarApdapter"));


var _ = _Core.default._;
var $ = _Core.default.$;

function WorkCalendar(props) {
  _Fragment.default.call(this);

  this._loadingToken = -1; // property default value

  this.firstDayOfWeek = 1;
  /***
   *
   * @type {WorkCalendarAdapter}
   */

  this.adapter = null;
  Object.assign(this, props);
  if (this.adapter && this.adapter.attach) this.adapter.attach(this);
  this.activities = []; //các thẻ đang hiển thị hiệnt tại
}

Object.defineProperties(WorkCalendar.prototype, Object.getOwnPropertyDescriptors(_Fragment.default.prototype));
WorkCalendar.prototype.constructor = WorkCalendar;
/***
 * hàm này gọi sau khi gọi createView, đợc gọi 1 lần bởi getView
 */

WorkCalendar.prototype.onCreated = function () {
  this._viewCurrentCalendar();

  this._loadCurrentCalendar();
};

WorkCalendar.prototype._createHeader = function () {
  var thisWC = this;
  this.$header = _({
    class: 'cd-work-calendar-header',
    child: [{
      class: 'cd-work-calendar-filter',
      child: [{
        tag: 'label',
        child: {
          text: "Board"
        }
      }, {
        tag: 'selectmenu',
        class: "cd-work-calendar-board-select",
        props: {
          items: this.adapter.getBoardList()
        },
        on: {
          change: this._loadCurrentCalendar.bind(this) // load lại lịch hiện tại với user mới

        }
      }]
    }, {
      class: 'cd-work-calendar-filter',
      child: [{
        tag: 'label',
        child: {
          text: "User"
        }
      }, {
        tag: 'selectmenu',
        class: 'cd-work-calendar-user-select',
        props: {
          items: this.adapter.getUserList()
        },
        on: {
          change: this._loadCurrentCalendar.bind(this) // load lại lịch hiện tại với user mới

        }
      }]
    }, {
      class: 'cd-work-calendar-filter',
      child: [{
        class: 'cd-work-calendar-date',
        child: [{
          tag: 'button',
          class: '.cd-prev-2',
          child: 'span.mdi.mdi-chevron-double-left',
          on: {
            click: this.ev_clickPrevPage.bind(this)
          }
        }, {
          tag: 'button',
          class: '.cd-prev',
          child: 'span.mdi.mdi-chevron-left',
          on: {
            click: this.ev_clickPrevDate.bind(this)
          }
        }, {
          tag: 'button',
          class: 'cd-today',
          child: {
            text: 'Today'
          },
          on: {
            click: this.ev_clickToday.bind(this)
          }
        }, {
          tag: 'button',
          class: 'cd-next',
          child: 'span.mdi.mdi-chevron-right',
          on: {
            click: this.ev_clickNextDate.bind(this)
          }
        }, {
          tag: 'button',
          class: 'cd-next-2',
          child: 'span.mdi.mdi-chevron-double-right',
          on: {
            click: this.ev_clickNextPage.bind(this)
          }
        }, {
          tag: 'dateinput',
          props: {
            value: new Date()
          },
          on: {
            change: function () {
              console.log(this.value);
              thisWC.focusIntoDate(this.value || new Date());
            }
          }
        }]
      }]
    }, {
      class: 'cd-work-calendar-filter',
      child: [{
        tag: 'label',
        child: {
          text: "Lịch"
        }
      }, {
        tag: 'selectmenu',
        class: 'cd-work-calendar-type-select',
        props: {
          items: [{
            text: "Tháng",
            value: "MONTH"
          }, {
            text: "Tuần",
            value: "WEEK"
          }],
          disabled: false,
          value: "MONTH"
        },
        on: {
          change: function () {
            thisWC._viewCurrentCalendar();

            thisWC._loadCurrentCalendar();
          }
        }
      }]
    }]
  });
  this.$calendarType = $('selectmenu.cd-work-calendar-type-select', this.$header);
  this.$userId = $('.cd-work-calendar-user-select', this.$header);
  this.$boardId = $('.cd-work-calendar-board-select', this.$header);
  this.$focusDate = $('dateinput', this.$header);
};

WorkCalendar.prototype._createWeekFrame = function () {
  this.$weekFrame = _({
    tag: 'frame',
    class: 'cd-work-calendar-frame',
    style: {// backgroundColor: 'rgb(255, 220, 220)'
    },
    child: {
      tag: 'weektable',
      style: {
        width: '100%',
        height: '100%' // fix sau

      },
      props: {
        firstDayOfWeek: this.firstDayOfWeek
      },
      on: {
        visibleperiodchange: function (event) {
          console.log(event.visiblePeriod); //ngoài ra thời điểm bất kì có thể lấy bằng cách gọi
          //this là weektable

          console.log(this.getVisiblePeriod());
        }
      }
    }
  });
  this.$weekTable = $('weektable', this.$weekFrame);
};

WorkCalendar.prototype._createMonthFrame = function () {
  this.$monthFrame = _({
    tag: 'frame',
    class: 'cd-work-calendar-frame',
    style: {// backgroundColor: 'rgb(255, 220, 220)'
    },
    child: {
      tag: 'monthtable',
      style: {
        width: '100%',
        height: '100%' // fix sau

      },
      props: {
        firstDayOfWeek: this.firstDayOfWeek
      },
      on: {
        visibleperiodchange: function (event) {
          console.log(event.visiblePeriod); //ngoài ra thời điểm bất kì có thể lấy bằng cách gọi
          //this là weektable

          console.log(this.getVisiblePeriod());
        }
      }
    }
  });
  this.$monthTable = $('monthtable', this.$monthFrame);
};

WorkCalendar.prototype._createLoadModal = function () {
  this.$loadModal = _({
    tag: 'modal',
    class: 'cd-work-loading-modal',
    child: {
      tag: 'img',
      props: {
        src: 'https://absol.cf/assets/loadingicon/Spin1s.svg'
      }
    }
  });
};
/***
 * hàm gọi bởi getView, và chỉ được gọi 1 lần duy nhất
 */


WorkCalendar.prototype.createView = function () {
  this._createHeader();

  this._createWeekFrame();

  this._createMonthFrame();

  this.$view = _({
    class: 'cd-work-calendar',
    child: [this.$header, {
      tag: 'frameview',
      child: [this.$weekFrame, this.$monthFrame]
    }]
  });
  this.$frameView = $('frameview', this.$view);
  this.$attachhook = _('attachhook').addTo(this.$view).on('error', function () {
    _Dom.default.addToResizeSystem(this);

    this.requestUpdateSize();
  });
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
};

WorkCalendar.prototype._viewCurrentCalendar = function () {
  var calendarType = this.$calendarType.value;

  switch (calendarType) {
    case "MONTH":
      this._viewMonthCalendar();

      break;

    case 'WEEK':
      this._viewWeekCalendar();

      break;
  }

  this.focusIntoDate(this.$focusDate.value);
};

WorkCalendar.prototype._viewMonthCalendar = function () {
  this.$monthFrame.requestActive();
};

WorkCalendar.prototype._viewWeekCalendar = function () {
  this.$weekFrame.requestActive();
};

WorkCalendar.prototype.updateSize = function () {
  var headerBound = this.$header.getBoundingClientRect();
  this.$frameView.addStyle('height', 'calc(100% - ' + headerBound.height + 'px)');
};

WorkCalendar.prototype.reload = function () {
  this._loadCurrentCalendar();
};

WorkCalendar.prototype._loadCurrentCalendar = function () {
  var calendarType = this.$calendarType.value;

  switch (calendarType) {
    case "MONTH":
      this._loadMonthCalendar();

      break;

    case "WEEK":
      this._loadWeekCalendar();

      break;
  }
};

WorkCalendar.prototype._loadMonthCalendar = function () {
  var thisWC = this; //xóa toàn bộ thẻ cũ trước khi thêm các thẻ mới

  this.$monthTable.removeAllActivity();
  var userId = this.$userId.value;
  var boardId = this.$boardId.value;
  this.adapter.getActivities(boardId, userId).then(function (propOfCards) {
    thisWC.activities = propOfCards.map(function (pC) {
      //hàm addActivity trả về một đối tượng CActivity với các property lấy từ card
      var act = thisWC.$monthTable.addActivity(pC);
      act.on('click', function () {
        thisWC.adapter.openActivity(act);
      }); //cũng có thể viết ngắn gọn :
      // act.on('click',  thisWC.adapter._openActivity.bind( thisWC.adapter, card));

      return act;
    });
  });
};

WorkCalendar.prototype._loadWeekCalendar = function () {
  var thisWC = this;
  this.$weekTable.removeAllActivity();
  var userId = this.$userId.value;
  var boardId = this.$boardId.value;
  this.adapter.getActivities(boardId, userId).then(function (propOfCards) {
    thisWC.activities = propOfCards.map(function (pC) {
      //hàm addActivity trả về một đối tượng CActivity với các property lấy từ card
      var act = thisWC.$weekTable.addActivity(pC);
      act.on('click', function () {
        thisWC.adapter.openActivity(act);
      });
      return act;
    });
  });
};
/***
 *
 * @param {Date} date
 */


WorkCalendar.prototype.focusIntoDate = function (date) {
  var calendarType = this.$calendarType.value;
  this.$focusDate.value = date;

  switch (calendarType) {
    case "MONTH":
      this.$monthTable.focusInto(date);
      break;

    case "WEEK":
      this.$weekTable.focusInto(date);
      break;
  }
};

WorkCalendar.prototype._showLoading = function () {
  var token = Math.random() * 10000 >> 0;
  this._loadingToken = token;
  if (!this.$loadModal) this._createLoadModal();
  this.$loadModal.addTo(document.body);
  return token;
};

WorkCalendar.prototype._closeLoading = function (token) {
  if (this._loadingToken != token) return;
  this.$loadModal.remove();
  this._loadingToken = -1;
};

WorkCalendar.prototype.ev_clickPrevDate = function () {
  var newFocusDate = (0, _datetime.prevDate)(this.$focusDate.value);
  this.focusIntoDate(newFocusDate);
};

WorkCalendar.prototype.ev_clickToday = function () {
  var newFocusDate = (0, _datetime.beginOfDay)(new Date());
  this.focusIntoDate(newFocusDate);
};

WorkCalendar.prototype.ev_clickNextDate = function () {
  var newFocusDate = (0, _datetime.nextDate)(this.$focusDate.value);
  this.focusIntoDate(newFocusDate);
};

WorkCalendar.prototype.ev_clickNextPage = function () {
  var calendarType = this.$calendarType.value;
  var newFocusDate;

  switch (calendarType) {
    case "MONTH":
      newFocusDate = this.$monthTable.nextPeriod();
      break;

    case "WEEK":
      newFocusDate = this.$weekTable.nextPeriod();
      break;
  }

  this.$focusDate.value = newFocusDate;
};

WorkCalendar.prototype.ev_clickPrevPage = function () {
  var calendarType = this.$calendarType.value;
  var newFocusDate;

  switch (calendarType) {
    case "MONTH":
      newFocusDate = this.$monthTable.prevPeriod();
      break;

    case "WEEK":
      newFocusDate = this.$weekTable.prevPeriod();
      break;
  }

  this.$focusDate.value = newFocusDate;
};

var _default = WorkCalendar;
exports.default = _default;
};

moduleFactories["node_modules/absol-card/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-card/dev.js ***/
"use strict";

require("absol/src/absol");

require("absol-acomp/dev");

require("absol-mobile/dev");

require("absol-vchart/src/vchart");

var _install = _interopRequireDefault(require("./js/dom/install"));

var _WorkCalendar = _interopRequireDefault(require("./js/fragment/WorkCalendar"));

var _WorkCalendarApdapter = _interopRequireDefault(require("./js/adapter/WorkCalendarApdapter"));


window.absol = window.absol || absol;
absol.WorkCalendar = _WorkCalendar.default;
absol.WorkCalendarAdapter = _WorkCalendarApdapter.default;
(0, _install.default)(absol.coreDom);
};

moduleFactories["node_modules/absol-tutor/js/dom/Core.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/dom/Core.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$$ = exports.$ = exports._ = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _install = _interopRequireDefault(require("absol-acomp/js/dom/install"));


var Core = new _Dom.default({});
(0, _install.default)(Core);
var _ = Core._;
exports._ = _;
var $ = Core.$;
exports.$ = $;
var $$ = Core.$$;
exports.$$ = $$;
var _default = Core;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/asset/icon/click.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/asset/icon/click.tpl ***/
module.exports = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"Capa_1\" x=\"0px\"\n     y=\"0px\" viewBox=\"0 0 512 512\" xml:space=\"preserve\" width=\"512\"\n     height=\"512\" class=\"atr-click-icon\">\n\t\t<path class=\"atr-click-icon-arrow\"\n              d=\"M422.762,507.605l-87.518-87.503l-42.422,42.422c-3.662,3.662-8.979,5.171-14.048,3.999    c-5.068-1.201-9.141-4.922-10.781-9.858l-84.858-254.561c-1.802-5.391-0.396-11.338,3.618-15.352    c3.999-3.999,9.961-5.464,15.352-3.618l254.561,84.858c4.937,1.641,8.657,5.713,9.858,10.781    c1.187,5.054-0.322,10.371-3.999,14.048l-42.422,42.422l87.503,87.517c5.859,5.859,5.859,15.352,0,21.211l-63.633,63.633    C438.113,513.465,428.621,513.465,422.762,507.605z\"/>\n    <g class=\"atr-click-icon-effect\">\n        <path d=\"M195,120c-8.291,0-15-6.709-15-15V15c0-8.291,6.709-15,15-15s15,6.709,15,15v90C210,113.291,203.291,120,195,120z\"/>\n        <path d=\"M120.762,141.973L57.114,78.325c-5.859-5.859-5.859-15.352,0-21.211s15.352-5.859,21.211,0l63.647,63.647    c5.859,5.859,5.859,15.352,0,21.211C136.113,147.832,126.621,147.832,120.762,141.973z\"/>\n        <path d=\"M57.114,332.886c-5.859-5.859-5.859-15.352,0-21.211l63.647-63.647c5.859-5.859,15.352-5.859,21.211,0    s5.859,15.352,0,21.211l-63.647,63.647C72.466,338.745,62.974,338.745,57.114,332.886z\"/>\n        <path d=\"M248.027,141.973c-5.859-5.859-5.859-15.352,0-21.211l63.647-63.647c5.859-5.859,15.352-5.859,21.211,0    s5.859,15.352,0,21.211l-63.647,63.647C263.379,147.832,253.887,147.832,248.027,141.973z\"/>\n        <path d=\"M105,210H15c-8.291,0-15-6.709-15-15s6.709-15,15-15h90c8.291,0,15,6.709,15,15S113.291,210,105,210z\"/>\n    </g>\n\n</svg>\n";

};

moduleFactories["node_modules/absol-tutor/asset/icon/scrollbar.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/asset/icon/scrollbar.tpl ***/
module.exports = "<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\"\n     width=\"94.305px\" height=\"492.156px\" viewBox=\"198.926 0 94.305 492.156\"\n     xml:space=\"preserve\" class=\"atr-scroll-bar-icon\">\n\t<path class=\"atr-scroll-bar-icon-border\" d=\"M198.926,0v492.156h94.305V0H198.926z M283.64,482.564h-75.126V9.593h75.126V482.564z\"></path>\n\t<path class=\"atr-scroll-bar-icon-btn-up\" d=\"M275.656,17.579H215.73v48.73h59.926 V17.579z M222.034,54.744l23.659-31.54l23.646,31.54H222.034z\"></path>\n\t<path class=\"atr-scroll-bar-icon-btn-down\" d=\"M275.656,426.914H215.73v48.735h59.926V426.914z M245.692,470.038\n\t\tl-23.659-31.551h47.305L245.692,470.038z\"></path>\n\t<path class=\"atr-scroll-bar-icon-bar\" d=\"M268.857,314.251V142.212h-46.341v172.039H268.857z M261.328,247.346h-30.895v-7.99\n\t\th30.895V247.346z M261.328,228.565h-30.895v-7.989h30.895V228.565z M230.048,203.003h30.887v7.992h-30.887V203.003z\"/>\n</svg>";

};

moduleFactories["node_modules/absol-tutor/asset/icon/tutor.tpl"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/asset/icon/tutor.tpl ***/
module.exports = "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 1000 1000\" enable-background=\"new 0 0 1000 1000\" xml:space=\"preserve\">\n    <path d=\"M471.7,934.1l66.2-34.2L491,682.3l15.3-26.9l-1.2-27.5c-29.2-1.7-37.8-1.7-66.9,0l-1.2,27.5l15.3,26.9l-46.9,217.5L471.7,934.1z\"/><path d=\"M271,403.2c16.8,60.8,40.9,106.4,71.1,139.2c32.9,35.8,72.4,56.1,117.1,64.1l4,0.7l4-0.9c49.5-11.1,89.1-32.4,120.6-67.8c29.2-32.8,51-77.2,67.1-136.4c13.6-8.4,23.8-22.1,30.6-40.2c7.6-19.9,11-45.6,10.6-76l-0.2-12l-9.4-6.7c-1.1-0.9-2.2-1.6-3.4-2.3c12.5-176.8-11-278.7-210.5-250.2C405,24.3,331.4,3.2,289.4,35.8C236.7,88.7,233,168,247.3,261.1c-3.2,1.8-6.3,3.8-9.5,6.2l-9.4,6.7l-0.2,12c-0.5,31,3.2,57.2,11,77.2C246.3,381.5,256.9,395.1,271,403.2z M300.6,307c0.7-2.1,1.3-4.5,2-7.2l0.3,0.1l0.9-5c3.2-13.5,6.8-31.2,10-44.8c1.3-4,2.6-7.9,4.1-11.7c46.4,37.6,129.7,41.8,201-25.3l-12.7,36.8l12.9,2.7l14.6-24.8l-1.8,17.4l13.8,1.9l8.5-28.5c16.9,10.3,35.6,24.1,52.3,16.6c5.5,13.4,9.8,28,12.6,43.7l3.6,20.2l6.3-0.4l2.9,10.5c7.4-1,13.9-1.1,20.2-1.2c-1,14.7-3.3,27.1-7,36.9c-3.9,10-9.1,16.7-15.7,19.1l-10.9,4.1l-3,11.8c-14.3,56.8-33.5,98-59.3,126.8c-24.2,27.2-55,44-93.8,53.4c-34.1-6.9-64.1-22.8-89.1-49.9c-26.8-29.2-48.2-71.6-63-129.7l-3.2-12.4l-11.5-3.8c-6.8-2.2-12.2-8.7-16.1-18.7c-3.9-9.9-6.3-22.5-7.3-37.6C282.9,306.1,294.7,302.9,300.6,307z\"/><path d=\"M825.5,740.9l105.9-266.6l-25.6-11.5l-71.9,181l-24,58.3c-16.9-37.4-37.4-70.1-60.7-93.6l-7.2-7.2l-9.7,0.3l-114,4.1v49.9l105.4-3.8c27.4,31.1,50.5,79.5,66.4,132.4c15.8,52.3,24.3,108.3,23.1,155.6H116.9c1.9-41.3,7-91.3,19.1-140.1c13.4-54.2,35.3-106.9,71.1-143.5l95.6,0.9v-49.9l-104.5-1l-8.8,0l-6.8,6.2c-47.8,44.3-75.8,108.8-92.1,174.7C74.7,851.1,70,916.4,69.1,964.5L68.6,990h24h742.6h21.1l2.3-22.4c5.9-57.9-3.4-131.3-23.8-198.5C831.9,759.6,828.8,750.2,825.5,740.9z\"/>\n</svg>";

};

moduleFactories["node_modules/absol-tutor/js/dom/Icon.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/dom/Icon.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.TutorIco = exports.ScrollBarIco = exports.ClickIco = void 0;

require("../../css/clickico.css");

require("../../css/scrollbarico.css");

var _click = _interopRequireDefault(require("../../asset/icon/click.tpl"));

var _scrollbar = _interopRequireDefault(require("../../asset/icon/scrollbar.tpl"));

var _tutor = _interopRequireDefault(require("../../asset/icon/tutor.tpl"));

var _Core = require("./Core");


var ClickIco = (0, _Core._)(_click.default);
exports.ClickIco = ClickIco;
var ScrollBarIco = (0, _Core._)(_scrollbar.default);
exports.ScrollBarIco = ScrollBarIco;
var TutorIco = (0, _Core._)(_tutor.default);
exports.TutorIco = TutorIco;
};

moduleFactories["node_modules/absol-tutor/js/dom/PuncturedModal.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/dom/PuncturedModal.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/puncturedmodal.css");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _Core = _interopRequireWildcard(require("./Core"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _Icon = require("./Icon");




/***
 * @extends AElement
 * @constructor
 */
function PuncturedModal() {
  this.$target = null;
  this.$trackScrollParents = [];
  this._handlePositionChange = this._handlePositionChange.bind(this);
  this.$attachhook = (0, _Core.$)('attachhook', this);
  this.$attachhook.requestUpdateSize = this._handlePositionChange;
  this.$a = (0, _Core.$)('.atr-punctured-modal-a', this);
  this.$b = (0, _Core.$)('.atr-punctured-modal-b', this);
  this.$c = (0, _Core.$)('.atr-punctured-modal-c', this);
  this.$d = (0, _Core.$)('.atr-punctured-modal-d', this);
  this._updateTimeout = -1;
}

PuncturedModal.tag = 'PuncturedModal'.toLowerCase();

PuncturedModal.render = function () {
  return (0, _Core._)({
    extendEvent: 'positionchange',
    class: ['atr-punctured-modal', 'atr-punctured-modal-root'],
    child: ['.atr-punctured-modal.atr-punctured-modal-a', '.atr-punctured-modal.atr-punctured-modal-b', '.atr-punctured-modal.atr-punctured-modal-d', '.atr-punctured-modal.atr-punctured-modal-c', 'attachhook']
  });
};

PuncturedModal.prototype.follow = function (targetElt) {
  if (this.$trackScrollParents.length > 0) this.stopTrackPosition();
  this.$target = targetElt || null;
  var trackElt = this.$target;
  if (!trackElt) return;

  while (trackElt) {
    if (trackElt.addEventListener) trackElt.addEventListener('scroll', this._handlePositionChange, false);else trackElt.attachEvent('onscroll', this._handlePositionChange, false);
    this.$trackScrollParents.push(trackElt);
    trackElt = trackElt.parentElement;
  }

  if (document.addEventListener) {
    document.addEventListener('scroll', this._handlePositionChange, false);
  } else {
    document.attachEvent('onscroll', this._handlePositionChange, false);
  }

  this.$trackScrollParents.push(document);

  if (this.isDescendantOf(document.body)) {
    this._handlePositionChange();
  } else {
    this.$attachhook.resetState();
  }

  _ResizeSystem.default.add(this.$attachhook);
};

PuncturedModal.prototype.stopTrackPosition = function () {
  var trackElt;

  for (var i = 0; i < this.$trackScrollParents.length; ++i) {
    trackElt = this.$trackScrollParents[i];
    if (trackElt.removeEventListener) trackElt.removeEventListener('scroll', this._handlePositionChange, false);else trackElt.dettachEvent && trackElt.dettachEvent('onscroll', this._handlePositionChange, false);
  }

  this.$trackScrollParents = [];
};

PuncturedModal.prototype._handlePositionChange = function (event) {
  if (!this.$target) return;
  var thisM = this;
  if (this._updateTimeout > 0) clearTimeout(this._updateTimeout);
  var bound = undefined;

  function update() {
    thisM._updateTimeout = -1;
    if (!thisM.$target) return;
    var bound1 = thisM.$target.getBoundingClientRect();

    if (!bound || bound1.left !== bound.left || bound1.width !== bound.width || bound1.top !== bound.top || bound1.height !== bound.height) {
      thisM.addStyle({
        '--punctured-x': bound1.left + 'px',
        '--punctured-y': bound1.top + 'px',
        '--punctured-width': bound1.width + 'px',
        '--punctured-height': bound1.height + 'px'
      });
      thisM.emit('positionchange', {
        target: this,
        bound: bound
      }, this);
      bound = bound1;
      thisM._updateTimeout = setTimeout(update, 10);
    }
  }

  update();
};

PuncturedModal.prototype.reset = function () {
  this.removeStyle({
    '--punctured-x': null,
    '--punctured-y': null,
    '--punctured-width': null,
    '--punctured-height': null
  });
};

_Core.default.install(PuncturedModal);

var _default = PuncturedModal;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/dom/BlinkMask.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/dom/BlinkMask.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/blinkmask.css");

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _Core = _interopRequireWildcard(require("./Core"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _Icon = require("./Icon");

var _PuncturedModal = _interopRequireDefault(require("./PuncturedModal"));




/***
 * @extends PuncturedModal
 * @constructor
 */
function BlinkMask() {
  this.$target = null;
  this.$trackScrollParents = [];
  this._handlePositionChange = this._handlePositionChange.bind(this);
  this.$attachhook = (0, _Core.$)('attachhook', this);
  this.$attachhook.requestUpdateSize = this._handlePositionChange;
  ;
  this._updateTimeout = -1;
}

BlinkMask.tag = 'BlinkMask'.toLowerCase();

BlinkMask.render = function () {
  return (0, _Core._)({
    extendEvent: 'positionchange',
    class: ['atr-blink-mask', 'as-anim'],
    child: ['attachhook']
  });
};

BlinkMask.prototype.follow = function () {
  var lastTargetElt = this.$target;

  var res = _PuncturedModal.default.prototype.follow.apply(this, arguments);

  var currentTarget = this.$target;

  if (lastTargetElt !== currentTarget && currentTarget) {
    this.removeClass('as-anim');
    setTimeout(function () {
      if (this.$target === currentTarget) {
        this.addClass('as-anim');
      }
    }.bind(this), 0);
  }

  return res;
};

BlinkMask.prototype.stopTrackPosition = _PuncturedModal.default.prototype.stopTrackPosition;

BlinkMask.prototype._handlePositionChange = function (event) {
  if (!this.$target) return;
  var thisM = this;
  if (this._updateTimeout > 0) clearTimeout(this._updateTimeout);
  var bound = undefined;

  function update() {
    thisM._updateTimeout = -1;
    if (!thisM.$target) return;
    var bound1 = thisM.$target.getBoundingClientRect();

    if (!bound || bound1.left !== bound.left || bound1.width !== bound.width || bound1.top !== bound.top || bound1.height !== bound.height) {
      thisM.addStyle({
        left: bound1.left + 'px',
        top: bound1.top + 'px',
        width: bound1.width + 'px',
        height: bound1.height + 'px'
      });
      thisM.emit('positionchange', {
        target: this,
        bound: bound
      }, this);
      bound = bound1;
      thisM._updateTimeout = setTimeout(update, 10);
    }
  }

  update();
};

BlinkMask.prototype.reset = function () {
  this.removeStyle({
    left: null,
    top: null,
    width: null,
    height: null
  });
};

_Core.default.install(BlinkMask);

var _default = BlinkMask;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/dom/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/dom/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = install;
exports.PublicTutorCreators = void 0;

var _PuncturedModal = _interopRequireDefault(require("./PuncturedModal"));

var _BlinkMask = _interopRequireDefault(require("./BlinkMask"));


var PublicTutorCreators = [_PuncturedModal.default, _BlinkMask.default];
exports.PublicTutorCreators = PublicTutorCreators;

function install(core) {
  core.install(PublicTutorCreators);
}
};

moduleFactories["node_modules/absol-tutor/js/scriptor/TutorNameManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/TutorNameManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function TutorNameManager() {
  this.sync = {};
  this.async = {};
  this.const = {};
  this._cacheSync = null;
  this._cacheAsync = null;
  this._cacheConst = null;
}

TutorNameManager.prototype.addAsync = function (key) {
  this.async[key] = true;
  this._cacheAsync = null;
  return this;
};

TutorNameManager.prototype.addSync = function (key) {
  this.sync[key] = true;
  this._cacheSync = null;
  return this;
};

TutorNameManager.prototype.addConst = function (key) {
  this.const[key] = true;
  this._cacheConst = null;
  return this;
};

TutorNameManager.prototype.getAllSync = function () {
  if (!this._cacheSync) this._cacheSync = Object.keys(this.sync);
  return this._cacheSync;
};

TutorNameManager.prototype.getAllAsync = function () {
  if (!this._cacheAsync) this._cacheAsync = Object.keys(this.async);
  return this._cacheAsync;
};

TutorNameManager.prototype.getAllConst = function () {
  if (!this._cacheConst) this._cacheConst = Object.keys(this.const);
  return this._cacheConst;
};

TutorNameManager.prototype.getAll = function () {
  return this.getAllSync().concat(this.getAllAsync()).concat(this.getAllConst());
};

TutorNameManager.prototype.spreadObject = function (obj) {
  return this.getAll().map(function (key) {
    return obj[key];
  });
};

var _default = new TutorNameManager();

exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/TACData.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/TACData.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var TACData = {
  define: function (path, desc) {
    var t = path.split('.');
    var cObject = this;
    var cKey;

    for (var i = 0; i < t.length; ++i) {
      cKey = t[i];
      cObject.properties = cObject.properties || {};

      if (i + 1 === t.length) {
        cObject.properties[cKey] = desc;
      } else {
        cObject.properties[cKey] = cObject.properties[cKey] || {};
      }

      cObject = cObject.properties[cKey];
    }

    return this;
  }
};
TACData.define('Math.max', {
  type: 'function',
  args: [{
    name: '...x',
    type: 'number'
  }],
  returns: 'number',
  desc: "Giá trị lớn nhất"
});
TACData.define('Math.min', {
  type: 'function',
  args: [{
    name: '...x',
    type: 'number'
  }],
  returns: 'number',
  desc: "Giá trị nhỏ nhất"
});
var _default = TACData;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/engine/TState.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/engine/TState.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


/***
 *
 * @param {AsyncCommand} command
 * @constructor
 */
function TState(command) {
  this.command = command;
}

TState.prototype.name = 'noop';
TState.prototype.onStart = _noop.default;
TState.prototype.onStop = _noop.default;
/***
 *
 * @param {string} state
 */

TState.prototype.goto = function (state) {
  this.command.goto(state);
};

var _default = TState;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/engine/AsyncCommand.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/engine/AsyncCommand.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.STATE_FINISH = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TState = _interopRequireDefault(require("./TState"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


var STATE_FINISH = 'finish';
/***
 * @extends TState
 * @param command
 * @constructor
 */

exports.STATE_FINISH = STATE_FINISH;

function StateFinish(command) {
  _TState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateFinish, _TState.default);

StateFinish.prototype.onStart = function () {
  this.command.resolve();
};
/***
 *
 * @param {TProcess}process
 * @param {{}} args
 * @constructor
 */


function AsyncCommand(process, args) {
  this.process = process;
  this.args = args;
  this.state = null;
  this.promise = new Promise(function (resolve, reject) {
    this._resolveCb = resolve;
    this._rejectCb = reject;
  }.bind(this));
}

AsyncCommand.prototype.type = 'async';
AsyncCommand.prototype.argNames = [];
AsyncCommand.prototype.onStart = _noop.default;
AsyncCommand.prototype.onStop = _noop.default;

AsyncCommand.prototype.goto = function (state) {
  if (!this.state) return; // stop or not start, can not goto

  var clazz = this.stateClasses[state];
  this.state.onStop();
  this.state = new clazz(this);
  this.state.onStart();
};

AsyncCommand.prototype.resolve = function (result) {
  var stackIdx;

  if (this.state) {
    this.state.onStop();
    this.onStop();
    this.state = null;
    stackIdx = this.process.stack.indexOf(this);

    if (stackIdx >= 0) {
      this.process.stack.splice(stackIdx, 1);
    } else {
      throw new Error('Stack error: process.stack run incorrectly!');
    }
  }

  if (this._resolveCb) {
    this._resolveCb(result);

    this._rejectCb = null;
    this._resolveCb = null;
  }
};

AsyncCommand.prototype.reject = function (err) {
  if (this.state) {
    this.state.onStop();
    this.state = null;
    this.onStop();
  }

  if (this._rejectCb) {
    this._rejectCb(err);

    this._rejectCb = null;
    this._resolveCb = null;
  }
};

AsyncCommand.prototype.exec = function () {
  if (!this.state) {
    this.process.stack.push(this);
    this.onStart();
    this.state = new this.stateClasses.entry(this);
    this.state.onStart();
  }

  return this.promise;
};

AsyncCommand.prototype.stateClasses = {};
AsyncCommand.prototype.stateClasses.finish = StateFinish;
AsyncCommand.prototype.stateClasses.entry = StateFinish;
var _default = AsyncCommand;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/engine/TCommand.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/engine/TCommand.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.inheritCommand = inheritCommand;
exports.default = void 0;

var _AsyncCommand = _interopRequireDefault(require("./AsyncCommand"));

var _noop = _interopRequireDefault(require("absol/src/Code/noop"));


/***
 * @type {function(...args: function):void}
 */
function inheritCommand() {
  var classes = Array.prototype.slice.call(arguments);
  var clazz = classes.shift();
  if (classes.length === 0) classes.push(_AsyncCommand.default);
  var argNames = [];
  var stateClasses;
  var des = {};

  for (var i = 0; i < classes.length; ++i) {
    Object.assign(des, Object.getOwnPropertyDescriptors(classes[i].prototype));

    if (classes[i].prototype.stateClasses) {
      stateClasses = Object.assign(stateClasses || {}, classes[i].prototype.stateClasses);
    }

    if (classes[i].prototype.argNames) {
      argNames = classes[i].prototype.argNames;
    }
  }

  delete des.constructor;
  Object.defineProperties(clazz.prototype, des);
  clazz.prototype.argNames = argNames.slice();

  if (stateClasses) {
    clazz.prototype.stateClasses = stateClasses;
  }
}
/***
 *
 * @param {TProcess} process
 * @param {{}} args
 * @constructor
 */


function TCommand(process, args) {
  this.process = process;
  this.args = args;
}

TCommand.prototype.className = 'TCommand';
TCommand.prototype.argNames = [];
TCommand.prototype.onStart = _noop.default;
TCommand.prototype.onStop = _noop.default;
TCommand.prototype.exec = _noop.default;
var _default = TCommand;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/BaseState.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/BaseState.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TState = _interopRequireDefault(require("../engine/TState"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


/***
 * @extends TState
 * @param command
 * @constructor
 */
function BaseState(command) {
  _TState.default.apply(this, arguments);
  /***
   * @type BaseCommand
   * @name command
   * @memberOf BaseState#
   */


  for (var key in this) {
    if (key.startsWith('ev_') || typeof this[key] === "function") {
      this[key] = this[key].bind(this);
    }
  }
}

_OOP.default.mixClass(BaseState, _TState.default);

Object.defineProperty(BaseState.prototype, 'tutor', {
  get: function () {
    return this.command.tutor;
  }
});
Object.defineProperty(BaseState.prototype, 'args', {
  get: function () {
    return this.command.args;
  }
});
var _default = BaseState;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/util/wrapAsync.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/util/wrapAsync.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = wrapAsync;

function wrapAsync(val) {
  if (val) {
    if (val.exec) return val.exec();
    if (val.then) return val;
  }

  return Promise.resolve(val);
}
};

moduleFactories["node_modules/absol-tutor/js/scriptor/BaseCommand.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/BaseCommand.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/basecommand.css");

var _Core = require("../dom/Core");

var _wrapAsync = _interopRequireDefault(require("../util/wrapAsync"));

var _Tooltip = _interopRequireDefault(require("absol-acomp/js/Tooltip"));

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _showdown = require("showdown");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _BlinkMask = _interopRequireDefault(require("../dom/BlinkMask"));

var _Dom = require("absol/src/HTML5/Dom");

var _AsyncCommand = _interopRequireDefault(require("../engine/AsyncCommand"));

var _TCommand = require("../engine/TCommand");

var _TState = _interopRequireDefault(require("../engine/TState"));


var showdownConverter = new _showdown.Converter();
/***
 * @typedef {{eltPath:string, message:string, wrongMessage:string, finishMessage:string, text: string, query: string, value:(string|number|null)>,until:(BaseCommand|(function():Promise))}} TutorCommandArgs
 */

/***
 * @extends AsyncCommand
 * @param process
 * @param {TutorCommandArgs} args
 * @constructor
 */

function BaseCommand(process, args) {
  _AsyncCommand.default.apply(this, arguments);

  this.tooltipToken = null;
  /***
   *
   * @type {*[]}
   * @protected
   */

  this._toastElts = [];
  this.hadWrongAction = false;
  this.$target = null;
  this._currentTostPosition = 'se';
  /** KeyBoard **/

  this._ev_docKeyboard = this.ev_docKeyboard.bind(this);
  this._keyboardPrevented = false;
  /***
   * only call if prevented keyboard
   * @type {function():void}
   */

  this.keyCb = null;
  /** Mouse **/

  this.ev_clickModal = this.ev_clickModal.bind(this);
  /***
   * only call if prevented mouse
   * @type {function():void}
   */

  this.clickCb = null;
}

(0, _TCommand.inheritCommand)(BaseCommand, _AsyncCommand.default);
BaseCommand.prototype.$htmlRender = (0, _Core._)('div');
/***
 * @type BlinkMask
 */

BaseCommand.prototype.$highlightModal = (0, _Core._)({
  tag: _BlinkMask.default.tag,
  class: ['atr-explain-modal', 'as-non-interact', 'as-animation']
});
BaseCommand.prototype.$puncturedModal = (0, _Core._)({
  tag: 'puncturedmodal',
  class: 'as-transparent',
  props: {
    onInteractOut: null
  }
});
BaseCommand.prototype.$transparentModal = (0, _Core._)('.atr-transparent-modal.as-hidden');
BaseCommand.prototype.$tooltipContent = (0, _Core._)({
  class: 'atr-explain-text'
});
/***
 *
 * @param {KeyboardEvent} event
 */

BaseCommand.prototype.ev_docKeyboard = function (event) {
  this.hadWrongAction = true;
  event.preventDefault();

  if (this.keyCb) {
    this.keyCb();
  }
};
/***
 *
 * @param {function|null} cb
 */


BaseCommand.prototype.ifPressKey = function (cb) {
  this.keyCb = cb;
};

BaseCommand.prototype.ev_clickModal = function (event) {
  this.hadWrongAction = true;
  if (this.clickCb) this.clickCb();
};
/***
 *
 * @param {function|null} cb
 */


BaseCommand.prototype.ifClickModal = function (cb) {
  this.clickCb = cb;
};
/***
 * @param {HTMLElement} elt
 * @param {MouseEvent} event
 */


BaseCommand.prototype.hitSomeOf = function (elt, event) {
  if ((0, _EventEmitter.hitElement)(elt, event)) return false;

  var bound = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

  var p = new _Vec.default(event.clientX, event.clientY);
  if (!bound.containsPoint(p)) return false;
  var id = elt.getAttribute('data-tutor-id') || elt['data-tutor-id'];
  if (!id) return false;
  var target = event.target;
  var tId;

  while (target) {
    tId = target.getAttribute('data-tutor-id') || target['data-tutor-id'];
    if (tId === id) return elt !== target;
    target = target.parentElement;
  }

  return false;
};

BaseCommand.prototype.onStart = function () {
  this.$puncturedModal.on('click', this.ev_clickModal);
  this.$transparentModal.on('click', this.ev_clickModal);
};
/***
 *
 * @param {function|null} cb
 */


BaseCommand.prototype.ifCancel = function (cb) {};

BaseCommand.prototype.onStop = function () {
  /** modal **/
  this.$puncturedModal.off('click', this.ev_clickModal);
  this.$transparentModal.off('click', this.ev_clickModal);
  this.clickCb = null;
  this.keyCb = null;
  this.closeTooltip();
  this.closeAllToasts();
  this.highlightElt(null);
  this.onlyClickTo(null);
  this.preventMouse(false);
  this.preventKeyBoard(false);
};

BaseCommand.prototype.md2HTMLElements = function (text) {
  this.$htmlRender.innerHTML = showdownConverter.makeHtml(text);
  return Array.prototype.slice.call(this.$htmlRender.childNodes);
};

BaseCommand.prototype.preventMouse = function (flag) {
  if (!this.$transparentModal.parentElement) {
    document.body.appendChild(this.$transparentModal);
  }

  if (flag) {
    this.$transparentModal.removeClass('as-hidden');
  } else {
    this.$transparentModal.addClass('as-hidden');
  }
};

BaseCommand.prototype.preventKeyBoard = function (flag) {
  if (flag) {
    if (!this._keyboardPrevented) {
      this._keyboardPrevented = true;
      document.addEventListener('keydown', this.ev_docKeyboard);
    }
  } else {
    if (this._keyboardPrevented) {
      this._keyboardPrevented = false;
      document.removeEventListener('keydown', this.ev_docKeyboard);
    }
  }
};

BaseCommand.prototype.highlightElt = function (elt) {
  if (!this.$highlightModal.parentElement) {
    document.body.appendChild(this.$highlightModal);
  }

  this.$highlightModal.follow(elt);

  if (elt) {
    this.$highlightModal.removeClass('as-transparent');
  } else {
    this.$highlightModal.addClass('as-transparent');
    this.$highlightModal.reset();
  }
};

BaseCommand.prototype.onlyClickTo = function (elt) {
  if (!this.$puncturedModal.parentElement) {
    document.body.appendChild(this.$puncturedModal);
  }

  if (elt) {
    this.$puncturedModal.follow(elt);
    this.$puncturedModal.removeClass('as-hidden');
  } else {
    this.$puncturedModal.follow(null);
    this.$puncturedModal.addClass('as-hidden');
    this.$puncturedModal.onInteractOut = null;
  }
};
/***
 *
 * @param {string} message
 */


BaseCommand.prototype.showDelayToast = function (message) {
  var thisC = this;
  this.preventMouse(true);
  this.showToast(message);
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      thisC.preventMouse(false);
      resolve();
    }, thisC.tutor.option.messageDelay);
  });
};

BaseCommand.prototype.showTooltip = function (elt, message) {
  if (typeof message !== "string") return;
  var eltList = this.md2HTMLElements(message);
  this.$tooltipContent.clearChild();
  eltList.forEach(function (elt) {
    this.$tooltipContent.addChild(elt);
  }.bind(this));
  this.tooltipToken = _Tooltip.default.show(elt, this.$tooltipContent, 'auto');

  _Tooltip.default.$holder.addClass('atr-on-top-1');
};
/***
 *
 * @param {string} message
 */


BaseCommand.prototype.showToast = function (message) {
  if (typeof message !== "string") return;
  var pos = this._currentTostPosition;

  var toastElt = _Toast.default.make({
    class: ['as-variant-background', 'atr-toast-message'],
    props: {
      htitle: 'Tutor',
      variant: 'sticky-note',
      timeText: ''
    },
    child: this.md2HTMLElements(message)
  }, pos);

  this._toastElts.push(toastElt);

  this._updateToastPosition();
};

BaseCommand.prototype.closeAllToasts = function () {
  setTimeout(function () {
    this._toastElts.forEach(function (elt) {
      elt.disappear();
    });
  }.bind(this), 1000);
};

BaseCommand.prototype.assignTarget = function (targetElt) {
  this.$target = targetElt;

  this._updateToastPosition();
};
/***
 *
 * @protected
 */


BaseCommand.prototype._updateToastPosition = function () {
  var targetElt = this.$target;

  if (targetElt) {
    var bound = targetElt.getBoundingClientRect();
    var screenSize = (0, _Dom.getScreenSize)();
    var toastListElt = _Toast.default.$toastList4Pos[this._currentTostPosition];
    var toastListBound = toastListElt.getBoundingClientRect();

    var boundRect = _Rectangle.default.fromClientRect(bound);

    var roastListRect = _Rectangle.default.fromClientRect(toastListBound);

    var isOverlay = roastListRect.isCollapse(boundRect);

    if (this._currentTostPosition === 'se' && bound.left + 400 >= screenSize.width && bound.top + 150 >= screenSize.height || isOverlay) {
      this._currentTostPosition = 'sw';
    } else if (this._currentTostPosition === 'sw' && bound.left <= 400 && bound.top + 150 >= screenSize.height || isOverlay) {
      this._currentTostPosition = 'se';
    }

    this._toastElts.forEach(function (elt) {
      if (!elt.parentElement || elt.parentElement === toastListElt) return;
      toastListElt.addChild(elt);
    });
  }
};

BaseCommand.prototype.closeTooltip = function () {
  if (this.tooltipToken) {
    _Tooltip.default.closeTooltip(this.tooltipToken);
  }
};

BaseCommand.prototype.depthClone = function () {
  var args = this.args;
  var newArgs = Object.keys(args).reduce(function (ac, cr) {
    if (args[cr] && args[cr].depthClone) {
      ac[cr] = args[cr].depthClone();
    } else {
      ac[cr] = args[cr];
    }

    return ac;
  }, {});
  return new this.constructor(this.process, newArgs);
};

BaseCommand.prototype.asyncGetElt = function (val) {
  var res;

  if (typeof val === "string") {
    res = (0, _wrapAsync.default)(this.tutor.findNode(val));
  } else {
    res = (0, _wrapAsync.default)(val);
  }

  return res.then(function (result) {
    if (result) return (0, _Core.$)(result);
    return result;
  });
};
/***
 *
 * @param {string|AElement} query
 * @param {boolean=} unsafe
 * @return {AElement}
 */


BaseCommand.prototype.findNode = function (query, unsafe) {
  return this.tutor.findNode(query, unsafe);
};

Object.defineProperty(BaseCommand.prototype, 'tutor', {
  get: function () {
    return this.process.tutor;
  }
});
var _default = BaseCommand;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserBaseAction.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserBaseAction.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));


/***
 * @extends BaseState
 * @param {BaseCommand} command
 * @constructor
 */
function StateWaitElt(command) {
  _BaseState.default.call(this, command);

  this.checkElt = this.checkElt.bind(this);
  this.countDown = 20;
}

_OOP.default.mixClass(StateWaitElt, _BaseState.default);

StateWaitElt.prototype.onStart = function () {
  this.inv = setInterval(this.checkElt, 100);
};

StateWaitElt.prototype.onStop = function () {
  clearInterval(this.inv);
};

StateWaitElt.prototype.checkElt = function () {
  this.command.elt = this.command.findNode(this.args.eltPath, true);
  this.countDown--;

  if (this.countDown <= 0) {
    this.command.reject(new Error("Could not find " + this.args.eltPath));
    return;
  }

  var error;

  if (this.command.elt) {
    error = this.command.verifyElt();

    if (error) {
      this.command.reject(error);
    } else {
      this.command.assignTarget(this.command.elt);
      this.goto('show_message');
    }
  }
};
/***
 * @extends BaseState
 * @param {BaseCommand} command
 * @constructor
 */


function StateShowMessage(command) {
  _BaseState.default.call(this, command);
}

_OOP.default.mixClass(StateShowMessage, _BaseState.default);

StateShowMessage.prototype.onStart = function () {
  this.command.showDelayToast(this.args.message).then(function () {
    this.goto('user_begin');
  }.bind(this));
};
/***
 * @extends BaseCommand
 * @constructor
 */


function UserBaseAction() {
  _BaseCommand.default.apply(this, arguments);
  /***
   *
   * @type {null|AElement}
   */


  this.elt = null;
  this.hadWrongAction = false;
}

(0, _TCommand.inheritCommand)(UserBaseAction, _BaseCommand.default);
/***
 *
 * @return {Promise<void>}
 */

UserBaseAction.prototype.requestUserAction = function () {
  return Promise.resolve();
};
/***
 *
 * @returns {null|Error}
 */


UserBaseAction.prototype.verifyElt = function () {
  return null;
};

UserBaseAction.prototype.stateClasses.entry = StateWaitElt;
UserBaseAction.prototype.stateClasses.show_message = StateShowMessage;
UserBaseAction.prototype.stateClasses.user_begin = UserBaseAction.prototype.stateClasses.finish;
var _default = UserBaseAction;
exports.default = _default;
};

moduleFactories["node_modules/regenerator-runtime/runtime.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/regenerator-runtime/runtime.js ***/
"use strict";

/**
 * Copyright (c) 2014, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
 * additional grant of patent rights can be found in the PATENTS file in
 * the same directory.
 */
!function (global) {
  "use strict";

  var Op = Object.prototype;
  var hasOwn = Op.hasOwnProperty;
  var undefined; // More compressible than void 0.

  var $Symbol = typeof Symbol === "function" ? Symbol : {};
  var iteratorSymbol = $Symbol.iterator || "@@iterator";
  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  var inModule = typeof module === "object";
  var runtime = global.regeneratorRuntime;

  if (runtime) {
    if (inModule) {
      // If regeneratorRuntime is defined globally and we're in a module,
      // make the exports object identical to regeneratorRuntime.
      module.exports = runtime;
    } // Don't bother evaluating the rest of this file if the runtime was
    // already defined globally.


    return;
  } // Define the runtime globally (as expected by generated code) as either
  // module.exports (if we're in a module) or a new, empty object.


  runtime = global.regeneratorRuntime = inModule ? module.exports : {};

  function wrap(innerFn, outerFn, self, tryLocsList) {
    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
    var generator = Object.create(protoGenerator.prototype);
    var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
    // .throw, and .return methods.

    generator._invoke = makeInvokeMethod(innerFn, self, context);
    return generator;
  }

  runtime.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
  // record like context.tryEntries[i].completion. This interface could
  // have been (and was previously) designed to take a closure to be
  // invoked without arguments, but in all the cases we care about we
  // already have an existing method we want to call, so there's no need
  // to create a new function object. We can even get away with assuming
  // the method takes exactly one argument, since that happens to be true
  // in every case, so we don't have to touch the arguments object. The
  // only additional allocation required is the completion record, which
  // has a stable shape and so hopefully should be cheap to allocate.

  function tryCatch(fn, obj, arg) {
    try {
      return {
        type: "normal",
        arg: fn.call(obj, arg)
      };
    } catch (err) {
      return {
        type: "throw",
        arg: err
      };
    }
  }

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
  // breaking out of the dispatch switch statement.

  var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
  // .constructor.prototype properties for functions that return Generator
  // objects. For full spec compliance, you may wish to configure your
  // minifier not to mangle the names of these two functions.

  function Generator() {}

  function GeneratorFunction() {}

  function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
  // don't natively support it.


  var IteratorPrototype = {};

  IteratorPrototype[iteratorSymbol] = function () {
    return this;
  };

  var getProto = Object.getPrototypeOf;
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));

  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
    // This environment has a native %IteratorPrototype%; use it instead
    // of the polyfill.
    IteratorPrototype = NativeIteratorPrototype;
  }

  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction"; // Helper for defining the .next, .throw, and .return methods of the
  // Iterator interface in terms of a single ._invoke method.

  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function (method) {
      prototype[method] = function (arg) {
        return this._invoke(method, arg);
      };
    });
  }

  runtime.isGeneratorFunction = function (genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
    // do is to check its .name property.
    (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
  };

  runtime.mark = function (genFun) {
    if (Object.setPrototypeOf) {
      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
    } else {
      genFun.__proto__ = GeneratorFunctionPrototype;

      if (!(toStringTagSymbol in genFun)) {
        genFun[toStringTagSymbol] = "GeneratorFunction";
      }
    }

    genFun.prototype = Object.create(Gp);
    return genFun;
  }; // Within the body of any async function, `await x` is transformed to
  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  // `hasOwn.call(value, "__await")` to determine if the yielded value is
  // meant to be awaited.


  runtime.awrap = function (arg) {
    return {
      __await: arg
    };
  };

  function AsyncIterator(generator) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);

      if (record.type === "throw") {
        reject(record.arg);
      } else {
        var result = record.arg;
        var value = result.value;

        if (value && typeof value === "object" && hasOwn.call(value, "__await")) {
          return Promise.resolve(value.__await).then(function (value) {
            invoke("next", value, resolve, reject);
          }, function (err) {
            invoke("throw", err, resolve, reject);
          });
        }

        return Promise.resolve(value).then(function (unwrapped) {
          // When a yielded Promise is resolved, its final value becomes
          // the .value of the Promise<{value,done}> result for the
          // current iteration. If the Promise is rejected, however, the
          // result for this iteration will be rejected with the same
          // reason. Note that rejections of yielded Promises are not
          // thrown back into the generator function, as is the case
          // when an awaited Promise is rejected. This difference in
          // behavior between yield and await is important, because it
          // allows the consumer to decide what to do with the yielded
          // rejection (swallow it and continue, manually .throw it back
          // into the generator, abandon iteration, whatever). With
          // await, by contrast, there is no opportunity to examine the
          // rejection reason outside the generator function, so the
          // only option is to throw it from the await expression, and
          // let the generator function handle the exception.
          result.value = unwrapped;
          resolve(result);
        }, reject);
      }
    }

    if (typeof global.process === "object" && global.process.domain) {
      invoke = global.process.domain.bind(invoke);
    }

    var previousPromise;

    function enqueue(method, arg) {
      function callInvokeWithMethodAndArg() {
        return new Promise(function (resolve, reject) {
          invoke(method, arg, resolve, reject);
        });
      }

      return previousPromise = // If enqueue has been called before, then we want to wait until
      // all previous Promises have been resolved before calling invoke,
      // so that results are always delivered in the correct order. If
      // enqueue has not been called before, then it is important to
      // call invoke immediately, without waiting on a callback to fire,
      // so that the async generator function has the opportunity to do
      // any necessary setup in a predictable way. This predictability
      // is why the Promise constructor synchronously invokes its
      // executor callback, and why async functions synchronously
      // execute code before the first await. Since we implement simple
      // async functions in terms of async generators, it is especially
      // important to get this right, even though it requires care.
      previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
      // invocations of the iterator.
      callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
    } // Define the unified helper method that is used to implement .next,
    // .throw, and .return (see defineIteratorMethods).


    this._invoke = enqueue;
  }

  defineIteratorMethods(AsyncIterator.prototype);

  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
    return this;
  };

  runtime.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
  // AsyncIterator objects; they just return a Promise for the value of
  // the final result produced by the iterator.

  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
    return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
    : iter.next().then(function (result) {
      return result.done ? result.value : iter.next();
    });
  };

  function makeInvokeMethod(innerFn, self, context) {
    var state = GenStateSuspendedStart;
    return function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        if (method === "throw") {
          throw arg;
        } // Be forgiving, per 25.3.3.3.3 of the spec:
        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume


        return doneResult();
      }

      context.method = method;
      context.arg = arg;

      while (true) {
        var delegate = context.delegate;

        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);

          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }

        if (context.method === "next") {
          // Setting context._sent for legacy support of Babel's
          // function.sent implementation.
          context.sent = context._sent = context.arg;
        } else if (context.method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw context.arg;
          }

          context.dispatchException(context.arg);
        } else if (context.method === "return") {
          context.abrupt("return", context.arg);
        }

        state = GenStateExecuting;
        var record = tryCatch(innerFn, self, context);

        if (record.type === "normal") {
          // If an exception is thrown from innerFn, we leave state ===
          // GenStateExecuting and loop back for another invocation.
          state = context.done ? GenStateCompleted : GenStateSuspendedYield;

          if (record.arg === ContinueSentinel) {
            continue;
          }

          return {
            value: record.arg,
            done: context.done
          };
        } else if (record.type === "throw") {
          state = GenStateCompleted; // Dispatch the exception by looping back around to the
          // context.dispatchException(context.arg) call above.

          context.method = "throw";
          context.arg = record.arg;
        }
      }
    };
  } // Call delegate.iterator[context.method](context.arg) and handle the
  // result, either by returning a { value, done } result from the
  // delegate iterator, or by modifying context.method and context.arg,
  // setting context.delegate to null, and returning the ContinueSentinel.


  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];

    if (method === undefined) {
      // A .throw or .return when the delegate iterator has no .throw
      // method always terminates the yield* loop.
      context.delegate = null;

      if (context.method === "throw") {
        if (delegate.iterator.return) {
          // If the delegate iterator has a return method, give it a
          // chance to clean up.
          context.method = "return";
          context.arg = undefined;
          maybeInvokeDelegate(delegate, context);

          if (context.method === "throw") {
            // If maybeInvokeDelegate(context) changed context.method from
            // "return" to "throw", let that override the TypeError below.
            return ContinueSentinel;
          }
        }

        context.method = "throw";
        context.arg = new TypeError("The iterator does not provide a 'throw' method");
      }

      return ContinueSentinel;
    }

    var record = tryCatch(method, delegate.iterator, context.arg);

    if (record.type === "throw") {
      context.method = "throw";
      context.arg = record.arg;
      context.delegate = null;
      return ContinueSentinel;
    }

    var info = record.arg;

    if (!info) {
      context.method = "throw";
      context.arg = new TypeError("iterator result is not an object");
      context.delegate = null;
      return ContinueSentinel;
    }

    if (info.done) {
      // Assign the result of the finished delegate to the temporary
      // variable specified by delegate.resultName (see delegateYield).
      context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).

      context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
      // exception, let the outer generator proceed normally. If
      // context.method was "next", forget context.arg since it has been
      // "consumed" by the delegate iterator. If context.method was
      // "return", allow the original .return call to continue in the
      // outer generator.

      if (context.method !== "return") {
        context.method = "next";
        context.arg = undefined;
      }
    } else {
      // Re-yield the result returned by the delegate method.
      return info;
    } // The delegate iterator is finished, so forget it and continue with
    // the outer generator.


    context.delegate = null;
    return ContinueSentinel;
  } // Define Generator.prototype.{next,throw,return} in terms of the
  // unified ._invoke helper method.


  defineIteratorMethods(Gp);
  Gp[toStringTagSymbol] = "Generator"; // A Generator should always return itself as the iterator object when the
  // @@iterator function is called on it. Some browsers' implementations of the
  // iterator prototype chain incorrectly implement this, causing the Generator
  // object to not be returned from this call. This ensures that doesn't happen.
  // See https://github.com/facebook/regenerator/issues/274 for more details.

  Gp[iteratorSymbol] = function () {
    return this;
  };

  Gp.toString = function () {
    return "[object Generator]";
  };

  function pushTryEntry(locs) {
    var entry = {
      tryLoc: locs[0]
    };

    if (1 in locs) {
      entry.catchLoc = locs[1];
    }

    if (2 in locs) {
      entry.finallyLoc = locs[2];
      entry.afterLoc = locs[3];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryLocsList) {
    // The root entry object (effectively a try statement without a catch
    // or a finally block) gives us a place to store values thrown from
    // locations where there is no enclosing try statement.
    this.tryEntries = [{
      tryLoc: "root"
    }];
    tryLocsList.forEach(pushTryEntry, this);
    this.reset(true);
  }

  runtime.keys = function (object) {
    var keys = [];

    for (var key in object) {
      keys.push(key);
    }

    keys.reverse(); // Rather than returning an object with a next method, we keep
    // things simple and return the next function itself.

    return function next() {
      while (keys.length) {
        var key = keys.pop();

        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      } // To avoid creating an additional object, we just hang the .value
      // and .done properties off the next function object itself. This
      // also ensures that the minifier will not anonymize the function.


      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];

      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1,
            next = function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;
          return next;
        };

        return next.next = next;
      }
    } // Return an iterator with no values.


    return {
      next: doneResult
    };
  }

  runtime.values = values;

  function doneResult() {
    return {
      value: undefined,
      done: true
    };
  }

  Context.prototype = {
    constructor: Context,
    reset: function (skipTempReset) {
      this.prev = 0;
      this.next = 0; // Resetting context._sent for legacy support of Babel's
      // function.sent implementation.

      this.sent = this._sent = undefined;
      this.done = false;
      this.delegate = null;
      this.method = "next";
      this.arg = undefined;
      this.tryEntries.forEach(resetTryEntry);

      if (!skipTempReset) {
        for (var name in this) {
          // Not sure about the optimal order of these conditions:
          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
            this[name] = undefined;
          }
        }
      }
    },
    stop: function () {
      this.done = true;
      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;

      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },
    dispatchException: function (exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;

      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;

        if (caught) {
          // If the dispatched exception was caught by a catch block,
          // then let that catch block handle the exception normally.
          context.method = "next";
          context.arg = undefined;
        }

        return !!caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          // Exception thrown outside of any try block that could handle
          // it, so set the completion value of the entire function to
          // throw the exception.
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }
          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },
    abrupt: function (type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }

      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
        // Ignore the finally entry if control is not jumping to a
        // location outside the try/catch block.
        finallyEntry = null;
      }

      var record = finallyEntry ? finallyEntry.completion : {};
      record.type = type;
      record.arg = arg;

      if (finallyEntry) {
        this.method = "next";
        this.next = finallyEntry.finallyLoc;
        return ContinueSentinel;
      }

      return this.complete(record);
    },
    complete: function (record, afterLoc) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" || record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = this.arg = record.arg;
        this.method = "return";
        this.next = "end";
      } else if (record.type === "normal" && afterLoc) {
        this.next = afterLoc;
      }

      return ContinueSentinel;
    },
    finish: function (finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.finallyLoc === finallyLoc) {
          this.complete(entry.completion, entry.afterLoc);
          resetTryEntry(entry);
          return ContinueSentinel;
        }
      }
    },
    "catch": function (tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;

          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry);
          }

          return thrown;
        }
      } // The context.catch method must only be called with a location
      // argument that corresponds to a known catch block.


      throw new Error("illegal catch attempt");
    },
    delegateYield: function (iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      if (this.method === "next") {
        // Deliberately forget the last sent value so that we don't
        // accidentally pass it on to the delegate.
        this.arg = undefined;
      }

      return ContinueSentinel;
    }
  };
}( // Among the various tricks for obtaining a reference to the global
// object, this seems to be the most reliable technique that does not
// use indirect eval (which violates Content Security Policy).
typeof global === "object" ? global : typeof window === "object" ? window : typeof self === "object" ? self : void 0);
};

moduleFactories["node_modules/absol-tutor/js/engine/TProcess.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/engine/TProcess.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

/***
 *
 * @param {TProgram} program
 * @constructor
 */
function TProcess(program) {
  this.program = program;
  this.env = {};
  this.program.engine.makeEnvVariables(this);
  this.state = 'READY';
  this.returns = null;
  this.stack = [];
  this.debug = {
    loc: {
      start: -1,
      end: -1,
      row: 0,
      //indexing from 1
      col: 0
    }
  };
}

TProcess.prototype.exec = function () {
  if (this.state !== "READY") return this.returns;
  this.state = 'RUNNING';
  var args = this.program.envArgNames.map(function (nane) {
    return this.env[nane];
  }.bind(this));
  this.returns = this.program.exec.apply(this, args);
  return this.returns;
};

TProcess.prototype.stop = function () {
  if (this.state !== 'RUNNING') return;
  this.state = 'STOP';
  var stack = this.stack.slice();

  while (stack.length > 0) {
    stack.pop().reject();
  }
};

var _default = TProcess;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/engine/TProgram.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/engine/TProgram.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TProcess = _interopRequireDefault(require("./TProcess"));


/***
 *
 * @param {ScriptEngine} engine
 * @param {function} exec
 * @param {string[]} envArgNames
 * @param {{}}info
 * @constructor
 */
function TProgram(engine, exec, envArgNames, info) {
  Object.assign(this, info);
  this.engine = engine;
  this.exec = exec;
  this.envArgNames = envArgNames;
}

TProgram.prototype.ProcessClass = _TProcess.default;
/***
 *
 * @returns {TProcess}
 */

TProgram.prototype.newProcess = function () {
  return new this.ProcessClass(this);
};

var _default = TProgram;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/engine/TDebug.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/engine/TDebug.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

function TDebug(process, args) {
  this.process = process;
  this.args = args;
}

TDebug.prototype.argNames = ['row', 'col', 'start', 'end'];
TDebug.prototype.name = '_db';
TDebug.prototype.type = 'sync';
TDebug.prototype.className = 'TDebug';

TDebug.prototype.exec = function () {
  Object.assign(this.process.debug.loc, this.args);
};

var _default = TDebug;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/engine/ScriptEngine.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/engine/ScriptEngine.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _AsyncCommand = _interopRequireDefault(require("./AsyncCommand"));

var _runtime = _interopRequireDefault(require("regenerator-runtime/runtime"));

var _TProgram = _interopRequireDefault(require("./TProgram"));

var _TDebug = _interopRequireDefault(require("./TDebug"));


var traverse = babel.traverse;
var parse = babel.parse;
var babelTypes = babel.types;
var presetEnv = babel.presetEnv;
var generator = babel.generator;

function ScriptEngine() {
  this.asyncCommandClasses = {};
  this.syncCommandClasses = {};
  this.constantClasses = {};
  this.asyncCommandFunctions = {};
  this.syncCommandFunctions = {};
  this.constants = {};
  this.installClass(_TDebug.default);
}

ScriptEngine.prototype.makeModuleTemplate = function (code, argNames) {
  return 'module.exports = async function exec(' + argNames.join(',') + ') {\n' + code + '\nreturn 0;' + '}';
};

ScriptEngine.prototype.awaitInject = function (code, ast) {
  var dict = Object.assign({}, this.asyncCommandClasses, this.asyncCommandFunctions);
  traverse(ast, {
    ExpressionStatement: function (path) {
      if (path.node.ignore) return;
      if (path.node.loc.start.line === 1) return;

      var _db = babel.types.callExpression(babel.types.identifier("_db"), [babel.types.numericLiteral(path.node.loc.start.line), babel.types.numericLiteral(path.node.loc.start.column), babel.types.numericLiteral(path.node.start), babel.types.numericLiteral(path.node.end)]);

      _db.ignore = true;
      path.insertBefore(_db);
    },
    CallExpression: function (path) {
      var needUpdate = false;

      if (path.parent.type === 'AwaitExpression') {
        needUpdate = true;
      } else {
        var node = path.node;
        var callee = node.callee;
        var calleeName = code.substr(callee.start, callee.end - callee.start);

        if (dict[calleeName]) {
          var newNode = babelTypes.awaitExpression(node);
          path.replaceWith(newNode);
          needUpdate = true;
        }
      }

      if (needUpdate) {
        var p = path;
        var pNode;

        while (p) {
          pNode = p.node;

          if (pNode.type === 'FunctionDeclaration') {
            pNode.async = true;
            dict[pNode.id.name] = true;
            break;
          }

          p = p.parentPath;
        }
      }
    }
  });
  return ast;
};

ScriptEngine.prototype.makeEnvVariable = function (process, name) {
  var clazz = this.asyncCommandClasses[name] || this.syncCommandClasses[name];
  var className;

  if (clazz) {
    if (clazz.attachEnv) {
      clazz.attachEnv(process, process.env);
    } else {
      className = clazz.prototype.className || clazz.name;
      new Function('process', 'env', className, 'env.' + name + ' = function ' + name + '(' + clazz.prototype.argNames.join(', ') + ') {' + 'return new ' + className + '(process, {' + clazz.prototype.argNames.map(function (argName) {
        return argName + ': ' + argName;
      }).concat('arguments: Array.prototype.slice.call(arguments)').join(',\n') + '}).exec();' + '}')(process, process.env, clazz);
    }

    return;
  }

  clazz = this.constantClasses[name];

  if (clazz) {
    if (clazz.attachEnv) {
      clazz.attachEnv(process, process.env);
    } else {
      process.env[name] = new clazz(process, {});
    }

    return;
  }

  var func = this.syncCommandFunctions[name] || this.asyncCommandFunctions[name];

  if (func) {
    process.env[name] = func;
    return;
  }

  if (name in this.constants) {
    process.env[name] = this.constants[name];
  }
};
/***
 *
 * @param {TProcess} process
 * @returns {*}
 */


ScriptEngine.prototype.makeEnvVariables = function (process) {
  process.program.envArgNames.forEach(function (arg) {
    this.makeEnvVariable(process, arg);
  }.bind(this));
};

ScriptEngine.prototype.ProgramClass = _TProgram.default;
/***
 * @returns TProgram
 */

ScriptEngine.prototype.compile = function (code) {
  var argNames = Object.keys(Object.assign({}, this.asyncCommandClasses, this.syncCommandClasses, this.constantClasses, this.syncCommandFunctions, this.asyncCommandFunctions, this.constants));
  code = this.makeModuleTemplate(code, argNames);
  var ast = parse(code);
  this.awaitInject(code, ast);
  var options = {
    presets: [presetEnv]
  };
  var newCode = generator(ast, {}, code).code;
  var transformedCode = babel.transform(newCode, options).code;
  var m = {};
  var execFn = new Function('module', 'regeneratorRuntime', transformedCode);
  execFn(m, _runtime.default);
  return new this.ProgramClass(this, m.exports, argNames, {
    code: code,
    es6Code: newCode,
    transformedCode: transformedCode
  });
};

ScriptEngine.prototype.installClass = function (clazz) {
  var type = clazz.prototype.type;
  var name = clazz.prototype.name;

  switch (type) {
    case 'async':
      this.asyncCommandClasses[name] = clazz;
      break;

    case 'sync':
      this.syncCommandClasses[name] = clazz;
      break;

    case 'const':
      this.constantClasses[name] = clazz;
      break;
  }

  return this;
};

ScriptEngine.prototype.installFunction = function (name, func, async) {
  if (async) {
    this.asyncCommandFunctions[name] = func;
  } else {
    this.syncCommandFunctions[name] = func;
  }

  return this;
};

ScriptEngine.prototype.installConst = function (name, value) {
  this.constants[name] = value;
};

var _default = ScriptEngine;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/TutorEngine.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/TutorEngine.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _ScriptEngine = _interopRequireDefault(require("../engine/ScriptEngine"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));


function TutorEngine() {
  _ScriptEngine.default.call(this);
}

_OOP.default.mixClass(TutorEngine, _ScriptEngine.default);

var _default = new TutorEngine();

exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Explain.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Explain.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/explain.css");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


/***
 * @extends BaseState
 * @constructor
 */
function StateShowMessage() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateShowMessage, _BaseState.default);

StateShowMessage.prototype.onStart = function () {
  this.command.showTooltip(this.command.elt, this.args.text);
  var until = this.args.until;

  if (!until) {
    this.goto('finish');
    return;
  }

  if (until.depthClone) {
    until.depthClone().exec().then(this.goto.bind(this, 'finish'));
  } else if (until.exec) {
    until.depthClone().exec().then(this.goto.bind(this, 'finish'));
  } else if (until.exec) {
    until.exec().then(this.goto.bind(this, 'finish'));
  } else if (until.then) {
    until.then(this.goto.bind(this, 'finish'));
  } else {
    this.goto('finish');
  }
};
/***
 * @extends {UserBaseAction}
 */


function Explain() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(Explain, _UserBaseAction.default);
Explain.prototype.argNames = ['eltPath', 'text', 'until'];
Explain.prototype.name = 'explain';
Explain.prototype.stateClasses.user_begin = StateShowMessage;

_TutorEngine.default.installClass(Explain);

_TutorNameManager.default.addAsync('explain');

_TACData.default.define('explain', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'text',
    type: 'MarkdownString'
  }, {
    name: 'until',
    type: 'Trigger'
  }]
});

var _default = Explain;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Timeout.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Timeout.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TCommand = require("../engine/TCommand");

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


/***
 * @extends BaseCommand
 * @constructor
 */
function StateWait() {
  _BaseState.default.apply(this, arguments);

  this.toIdx = -1;
}

_OOP.default.mixClass(StateWait, _BaseState.default);

StateWait.prototype.onStart = function () {
  this.toIdx = setTimeout(this.goto.bind(this, 'finish'), this.args.millis);
};

StateWait.prototype.onStop = function () {
  clearTimeout(this.toIdx);
};
/***
 * @extends {BaseCommand}
 */


function Timeout() {
  _BaseCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(Timeout, _BaseCommand.default);
Timeout.prototype.type = 'sync';
Timeout.prototype.name = 'TIME_OUT';
Timeout.prototype.stateClasses['entry'] = StateWait;
Timeout.prototype.argNames = ['millis'];

Timeout.attachEnv = function (tutor, env) {
  env.TIME_OUT = function (millis) {
    return new Timeout(tutor, {
      millis: millis || 0
    });
  };
};

_TutorEngine.default.installClass(Timeout);

_TutorNameManager.default.addSync('TIME_OUT').addAsync('delay').addAsync('delayUntil');

_TACData.default.define('TIME_OUT', {
  type: 'function',
  args: [{
    name: 'millis',
    type: 'number'
  }],
  returns: 'Trigger'
});

var _default = Timeout;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/PressAnyKey.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/PressAnyKey.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TCommand = require("../engine/TCommand");

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));


/***
 * @extends BaseState
 * @constructor
 */
function WaitPressKey() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(WaitPressKey, _BaseState.default);

WaitPressKey.prototype.onStart = function () {
  document.addEventListener('keydown', this.ev_keyPress);
};

WaitPressKey.prototype.onStop = function () {
  document.removeEventListener('keydown', this.ev_keyPress);
};

WaitPressKey.prototype.ev_keyPress = function () {
  this.goto('finish');
};
/***
 * @extends {BaseCommand}
 */


function PressAnyKey() {
  _BaseCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(PressAnyKey, _BaseCommand.default);
PressAnyKey.prototype.type = 'const';
PressAnyKey.prototype.name = 'PRESS_ANY_KEY';
PressAnyKey.prototype.stateClasses['entry'] = WaitPressKey;

_TutorEngine.default.installClass(PressAnyKey);

_TutorNameManager.default.addConst('PRESS_ANY_KEY');

_TACData.default.define('PRESS_ANY_KEY', {
  type: 'Trigger'
});

var _default = PressAnyKey;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/ClickAnyWhere.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/ClickAnyWhere.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitClick() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateWaitClick, _BaseState.default);

StateWaitClick.prototype.onStart = function () {
  document.addEventListener('click', this.ev_click);
};

StateWaitClick.prototype.ev_click = function (event) {
  this.goto('finish');
};

StateWaitClick.prototype.onStop = function () {
  document.removeEventListener('click', this.ev_click);
};
/***
 * @extends {BaseCommand}
 */


function ClickAnyWhere() {
  _BaseCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(ClickAnyWhere, _BaseCommand.default);
ClickAnyWhere.prototype.type = 'const';
ClickAnyWhere.prototype.name = 'CLICK_ANY_WHERE';
ClickAnyWhere.prototype.stateClasses.entry = StateWaitClick;

_TutorEngine.default.installClass(ClickAnyWhere);

_TutorNameManager.default.addConst('CLICK_ANY_WHERE');

_TACData.default.define('CLICK_ANY_WHERE', {
  type: 'Trigger'
});

var _default = ClickAnyWhere;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Earliest.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Earliest.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


/***
 * @extends {BaseCommand}
 */
function Earliest() {
  _BaseCommand.default.apply(this, arguments);
}

_OOP.default.mixClass(Earliest, _BaseCommand.default);

Earliest.prototype.name = 'EARLIEST';
Earliest.prototype.type = 'sync';
Earliest.prototype.argNames = [];

Earliest.prototype.exec = function () {
  var expressions = this.args.arguments.map(function (e) {
    if (e.depthClone) {
      return e.depthClone().exec();
    } else if (e.then) {
      return e;
    } else if (e.exec) {
      return e.exec();
    }

    return Promise.resolve();
  });
  return Promise.any(expressions);
};

_TutorEngine.default.installClass(Earliest);

_TutorNameManager.default.addSync('EARLIEST');

var _default = Earliest;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Latest.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Latest.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _TCommand = require("../engine/TCommand");


/***
 * @extends {BaseCommand}
 */
function Latest() {
  _BaseCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(Latest, _BaseCommand.default);
Latest.prototype.name = 'LATEST';
Latest.prototype.type = 'sync';
Latest.prototype.argNames = [];

Latest.prototype.exec = function () {
  var expressions = this.args.arguments.map(function (e) {
    if (e.depthClone) {
      return e.depthClone().exec();
    } else if (e.then) {
      return e;
    } else if (e.exec) {
      return e.exec();
    }

    return Promise.resolve();
  });
  return Promise.all(expressions);
};

_TutorEngine.default.installClass(Latest);

var _default = Latest;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/ShowSnackBar.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/ShowSnackBar.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Snackbar = _interopRequireDefault(require("absol-acomp/js/Snackbar"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));


/***
 * @extends {BaseCommand}
 */
function ShowSnackBar() {
  _BaseCommand.default.apply(this, arguments);
}

_OOP.default.mixClass(ShowSnackBar, _BaseCommand.default);

ShowSnackBar.prototype.exec = function () {
  this.start();
  this.preventMouse(true);

  _Snackbar.default.show(this.args.text);

  if (this.args.until && this.args.until.exec) {
    return this.args.until.depthClone().exec().then(this.stop.bind(this));
  } else {
    this.stop();
    return Promise.resolve();
  }
};

ShowSnackBar.attachEnv = function (tutor, env) {
  env.showSnackBar = function (text, until) {
    return new ShowSnackBar(tutor, {
      text: text,
      until: until
    }).exec();
  };
};

_TutorNameManager.default.addAsync('showSnackBar');

_TACData.default.define('showSnackBar', {
  type: 'function',
  args: [{
    name: 'title',
    type: 'string'
  }, {
    name: 'text',
    type: 'MarkdownString'
  }, {
    name: 'until',
    type: 'Trigger'
  }]
});

var _default = ShowSnackBar;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Appear.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Appear.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.StateWaitEltAppear = StateWaitEltAppear;
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Core = require("../dom/Core");

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitEltAppear() {
  _BaseState.default.apply(this, arguments);

  this.timeOut = -1;
}

_OOP.default.mixClass(StateWaitEltAppear, _BaseState.default);

StateWaitEltAppear.prototype.onStart = function () {
  this.endTime = new Date().getTime() + (this.args.timeout || 100);
  this.checkElt();
};

StateWaitEltAppear.prototype.onStop = function () {
  if (this.timeOut >= 0) {
    clearTimeout(this.timeOut);
    this.timeOut = -1;
  }
};

StateWaitEltAppear.prototype.isVisibility = function (elt) {
  var eltBound;

  if (elt) {
    eltBound = elt.getBoundingClientRect();

    if (eltBound.width > 0 || eltBound.height > 0) {
      if ((0, _Core.$)(elt).getComputedStyleValue('visibility') !== 'hidden') {
        return true;
      }
    }
  }

  return false;
};

StateWaitEltAppear.prototype.checkElt = function () {
  var now = new Date().getTime();
  this.timeOut = -1;
  var elt = this.command.findNode(this.args.eltPath, true);

  if (this.isVisibility(elt)) {
    this.command.resolve(true);
  } else if (now > this.endTime) {
    this.command.resolve(false);
  } else {
    this.timeOut = setTimeout(this.checkElt.bind(this), Math.min(100, this.endTime - now));
  }
};
/***
 * @extends {BaseCommand}
 * @constructor
 */


function Appear() {
  _BaseCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(Appear, _BaseCommand.default);
Appear.prototype.className = 'Appear';
Appear.prototype.argNames = ['eltPath', 'timeout'];
Appear.prototype.name = 'APPEAR';
Appear.prototype.stateClasses.entry = StateWaitEltAppear;
Appear.prototype.type = 'sync';

_TutorEngine.default.installClass(Appear);

var _default = Appear;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/TutorPath.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/TutorPath.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _JSPath = _interopRequireDefault(require("absol/src/HTML5/JSPath"));


/***
 * @extends JSPath
 * @constructor
 */
function TutorPath() {
  this.match = TutorPath.prototype.match;
  return this;
}

TutorPath.prototype.match = function (elt, query) {
  var res = _JSPath.default.prototype.match.call(this, elt, query);

  res = res || query.tagName && elt.getAttribute('data-tutor-id') === query.tagName;
  res = res || query.id && elt.getAttribute('data-tutor-id') === query.id;
  res = res || query.tagName && elt['data-tutor-id'] === query.tagName;
  return res;
};
/****
 *
 * @param query
 * @return {TutorPath}
 */


TutorPath.compile = function (query) {
  var jsPath = _JSPath.default.compileJSPath(query);

  jsPath = TutorPath.call(jsPath);
  return jsPath;
};

var _default = TutorPath;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/util/findNode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/util/findNode.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = findNode;

var _Dom = require("absol/src/HTML5/Dom");

var _Core = require("../dom/Core");

var _TutorPath = _interopRequireDefault(require("../TutorPath"));


function findNode(query, root) {
  if ((0, _Dom.isDomNode)(query)) return (0, _Core.$)(query);
  root = root || document.body;
  if (typeof query != 'string') return null;

  var tutorPath = _TutorPath.default.compile(query);

  var res = tutorPath.findFirst(root);
  if (res) (0, _Core.$)(res);
  return res;
}
};

moduleFactories["node_modules/absol-tutor/js/scriptor/QuerySelector.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/QuerySelector.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TCommand = _interopRequireWildcard(require("../engine/TCommand"));

var _findNode = _interopRequireDefault(require("../util/findNode"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));




/***
 * @extends TCommand
 * @constructor
 */
function QuerySelector() {
  _TCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(QuerySelector, _TCommand.default);
QuerySelector.prototype.className = 'QuerySelector';
QuerySelector.prototype.name = '$';
QuerySelector.prototype.type = 'sync';
QuerySelector.prototype.argNames = ['query', 'inNode'];

QuerySelector.prototype.exec = function () {
  return (0, _findNode.default)(this.args.query, this.args.inNode);
};

_TutorEngine.default.installClass(QuerySelector);

var _default = QuerySelector;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserClick.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserClick.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TCommand = require("../engine/TCommand");


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitClick() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateWaitClick, _BaseState.default);

StateWaitClick.prototype.onStart = function () {
  this.command.highlightElt(this.command.elt);
  this.command.onlyClickTo(this.command.elt);
  this.command.clickCb = this.ev_clickOut;
  this.command.elt.addEventListener('click', this.ev_click);
};

StateWaitClick.prototype.onStop = function () {
  this.command.elt.removeEventListener('click', this.ev_click);
};

StateWaitClick.prototype.ev_clickOut = function () {
  if (this.args.wrongMessage) {
    this.command.showTooltip(this.command.elt, this.args.wrongMessage);
  }
};

StateWaitClick.prototype.ev_click = function () {
  this.goto('finish');
};
/***
 * @extends UserBaseAction
 * @constructor
 */


function UserClick() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserClick, _UserBaseAction.default);
UserClick.prototype.name = 'userClick';
UserClick.prototype.argNames = ['eltPath', 'message', 'wrongMessage'];
UserClick.prototype.stateClasses.user_begin = StateWaitClick;

_TutorNameManager.default.addAsync('userClick');

_TACData.default.define('userClick', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }]
});

_TutorEngine.default.installClass(UserClick);

var _default = UserClick;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserCheckbox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserCheckbox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


/****
 * @extends BaseState
 * @constructor
 */
function StateWaitCheck() {
  _BaseState.default.apply(this, arguments);

  this.checkTO = -1;
}

_OOP.default.mixClass(StateWaitCheck, _BaseState.default);

StateWaitCheck.prototype.onStart = function () {
  this.command.elt.on('click', this.ev_click);
  this.command.highlightElt(this.command.elt);
  this.command.onlyClickTo(this.command.elt);

  this.command.clickCb = function () {
    this.command.showTooltip(this.command.elt, this.command.args.wrongMessage);
  }.bind(this);
};

StateWaitCheck.prototype.onStop = function () {
  this.command.elt.off('click', this.ev_click);
  clearTimeout(this.checkTO);
};

StateWaitCheck.prototype.delayCheck = function () {
  this.checkTO = setTimeout(function () {
    if (!!this.command.elt.checked === !!this.args.checked) {
      this.goto('finish');
    }
  }.bind(this), 50);
};

StateWaitCheck.prototype.ev_click = function () {
  this.delayCheck();
};
/***
 * @extends UserBaseAction
 * @constructor
 */


function UserCheckbox() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserCheckbox, _UserBaseAction.default);
UserCheckbox.prototype.name = 'userCheckbox';
UserCheckbox.prototype.stateClasses['user_begin'] = StateWaitCheck;
UserCheckbox.prototype.argNames = ['eltPath', 'checked', 'message', 'wrongMessage'];

UserCheckbox.prototype.verifyElt = function () {
  var elt = this.elt;

  if (!elt.hasClass || !(elt.hasClass('absol-checkbox') || elt.hasClass('absol-radio') || elt.hasClass('as-checkbox-input') || elt.hasClass('as-checkbox-input') || elt.hasClass('as-radio-input') || elt.hasClass('absol-switch') || elt.tagName.toLowerCase() === 'input' && (elt.type === 'checkbox' || elt.type === 'radio'))) {
    return new Error('Type error: not a radio or checkbox');
  }

  return null;
};
/***
 * @extends UserCheckbox
 * @constructor
 */


function UserSwitch() {
  UserCheckbox.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserSwitch, UserCheckbox);
UserSwitch.prototype.name = 'userSwitch';
/***
 * @extends UserCheckbox
 * @constructor
 */

function UserRadio() {
  UserCheckbox.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserRadio, UserCheckbox);
UserRadio.prototype.name = 'userRadio';

_TutorEngine.default.installClass(UserCheckbox);

_TutorEngine.default.installClass(UserSwitch);

_TutorEngine.default.installClass(UserRadio);

_TutorNameManager.default.addAsync('userCheckbox');

_TutorNameManager.default.addAsync('userSwitch');

_TutorNameManager.default.addAsync('userRadio');

_TACData.default.define('userCheckbox', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'checked',
    type: 'boolean'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }]
}).define('userRadio', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'checked',
    type: 'boolean'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }]
});

var _default = UserCheckbox;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserInputText.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserInputText.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _wrapAsync = _interopRequireDefault(require("../util/wrapAsync"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _Core = require("../dom/Core");

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TCommand = require("../engine/TCommand");


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitFocus() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateWaitFocus, _BaseState.default);

StateWaitFocus.prototype.onStart = function () {
  this.command.inputElt = (0, _Core.$)('input', this.command.elt) || (0, _Core.$)('textarea', this.command.elt);
  this.command.inputElt.on('focus', this.ev_focus);

  if (document.hasFocus() && document.activeElement === this.command.inputElt) {
    this.goto('user_input');
  }

  this.command.highlightElt(this.command.inputElt);
  this.command.clickCb = this.ev_clickOut;
  if (this.command.hadWrongAction && this.command.args.wrongMessage) this.command.showTooltip(this.command.inputElt, this.command.args.wrongMessage);
  this.command.onlyClickTo(this.command.inputElt);
};

StateWaitFocus.prototype.onStop = function () {
  this.command.inputElt.off('focus', this.ev_focus);
  this.command.clickCb = null;
};

StateWaitFocus.prototype.ev_focus = function () {
  this.goto('user_input');
};

StateWaitFocus.prototype.ev_clickOut = function () {
  this.command.hadWrongAction = true;
  if (this.command.args.wrongMessage) this.command.showTooltip(this.command.inputElt, this.command.args.wrongMessage);
};
/***
 * @extends BaseState
 * @constructor
 */


function StateUserInput() {
  _BaseState.default.apply(this, arguments);

  this.chaged = false;
}

_OOP.default.mixClass(StateUserInput, _BaseState.default);

StateUserInput.prototype.onStart = function () {
  this.command.highlightElt(null);
  this.command.inputElt.on('change', this.ev_change).on('blur', this.ev_change).once('change', function () {
    this.changed = true;
  }.bind(this)).once('blur', function () {
    this.changed = true;
  }.bind(this)).on('keydown', this.ev_keyDown).on('keyup', this.ev_keyUp);
};

StateUserInput.prototype.onStop = function () {
  this.command.inputElt.off('change', this.ev_change).off('blur', this.ev_change).off('keydown', this.ev_keyDown).off('keyup', this.ev_keyUp);
  if (this.typingTimeout > 0) clearTimeout(this.typingTimeout);
  if (this.changeTimeout > 0) clearTimeout(this.changeTimeout);
};

StateUserInput.prototype.verify = function verify() {
  var isMatched;
  var matchExpression = this.args.match;
  var elt = this.command.inputElt;
  var wrongMessage = this.args.wrongMessage;
  var text = elt.value || elt.text || '';

  if (matchExpression && matchExpression.test) {
    isMatched = matchExpression.test(elt.value || elt.text || '');
  } else if (typeof matchExpression === "function") {
    isMatched = matchExpression(text);
  } else if (typeof matchExpression === 'string') {
    isMatched = text === matchExpression;
  } else if (typeof matchExpression === 'number') {
    isMatched = parseFloat(text) === matchExpression;
  } else {
    isMatched = text > 0;
  }

  if (!isMatched && wrongMessage) {
    this.command.showTooltip(elt, wrongMessage);
  } else if (isMatched) {
    this.command.closeTooltip();
  }

  return isMatched;
};

StateUserInput.prototype.ev_change = function () {
  var elt = this.command.inputElt;

  if (this.verify()) {
    this.goto('prevent_input');
  } else {
    this.changeTimeout = setTimeout(function () {
      this.changeTimeout = -1;

      if (!_AElement.default.prototype.isDescendantOf.call(document.activeElement, elt)) {
        elt.focus();
      }
    }.bind(this), 1);
  }
};

StateUserInput.prototype.ev_keyUp = function () {
  if (this.typingTimeout > 0) clearTimeout(this.typingTimeout);
  this.typingTimeout = setTimeout(function () {
    this.typingTimeout = -1;

    if (this.verify()) {
      this.goto('prevent_input');
    }
  }.bind(this), 300);
};

StateUserInput.prototype.ev_keyDown = function (event) {
  this.command.highlightElt(null);

  if (event.key === 'Enter') {
    if (this.verify()) {
      this.goto('prevent_input');
    }
  }
};
/***
 * @extends BaseState
 * @constructor
 */


function StatePreventInput() {
  _BaseState.default.apply(this, arguments);

  this.checkItv = -1;
}

_OOP.default.mixClass(StatePreventInput, _BaseState.default);

StatePreventInput.prototype.onStart = function () {
  var elt = this.command.inputElt;
  elt.on('keydown', this.ev_keyDown).once('blur', this.ev_finish);
  this.checkItv = setInterval(function () {
    if (document.activeElement !== elt) {
      elt.off('keydown', this.ev_keyDown).off('blur', this.ev_finish);
      clearInterval(this.checkItv);
    }
  }.bind(this), 100);
  this.goto('finish');
};

StatePreventInput.prototype.ev_finish = function () {
  clearInterval(this.checkItv);
  this.command.inputElt.off('keydown', this.ev_keyDown).off('blur', this.ev_finish);
};

StatePreventInput.prototype.ev_keyDown = function (event) {
  if (event.key.length === 1 && !event.ctrlKey && !event.altKey) {
    event.preventDefault();
  }
};
/***
 * @extends UserBaseAction
 * @constructor
 */


function UserInputText() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserInputText, _UserBaseAction.default);
UserInputText.prototype.name = 'userInputText';
UserInputText.prototype.stateClasses['user_begin'] = StateWaitFocus;
UserInputText.prototype.stateClasses['user_input'] = StateUserInput;
UserInputText.prototype.stateClasses['prevent_input'] = StatePreventInput;

UserInputText.prototype.verifyElt = function (elt) {
  var res = (0, _Core.$)('input', elt) || (0, _Core.$)('textarea', elt);
  if (!res) return new Error('Type invalid: not a text input or not contains text input!');
  return null;
};

UserInputText.prototype.requestUserAction = function () {
  var matchExpression = this.args.match;
  var thisC = this;
  var elt = this.tutor.findNode(this.args.eltPath);
  elt = this._verifyTextInput(elt);
  var wrongMessage = this.args.wrongMessage;
  thisC.highlightElt(elt);
  var changed = false;

  function onClick() {
    thisC.highlightElt(null);
  }

  this._clickCb = function () {
    var result = verify();

    if (!result || !changed) {
      thisC.highlightElt(elt);
    }
  };

  thisC.onlyClickTo(elt);

  function verify() {
    var isMatched;
    var text = elt.value || elt.text || '';

    if (matchExpression && matchExpression.test) {
      isMatched = matchExpression.test(elt.value || elt.text || '');
    } else if (typeof matchExpression === "function") {
      isMatched = matchExpression(text);
    } else if (typeof matchExpression === 'string') {
      isMatched = text === matchExpression;
    } else if (typeof matchExpression === 'number') {
      isMatched = parseFloat(text) === matchExpression;
    } else {
      isMatched = text > 0;
    }

    if (!isMatched && wrongMessage) {
      thisC.showTooltip(elt, wrongMessage);
    } else if (isMatched) {
      thisC.closeTooltip();
    }

    return isMatched;
  }

  return new Promise(function (resolve, reject) {
    var changeTimeout = -1;

    function onKeydown(event) {
      thisC.highlightElt(null);

      if (event.key === 'Enter') {
        if (verify()) {
          elt.off('keyup', verify).off('change', onChange).off('blur', onChange).off('keydown', onKeydown).off('onKeyUp', onKeydown).off('click', onClick);
          if (changeTimeout >= 0) clearTimeout(changeTimeout);
          thisC._rejectCb = null;
          resolve();
        }
      }
    }

    var typingTimout = -1;

    function onKeyUp() {
      if (typingTimout > 0) clearTimeout(typingTimout);
      typingTimout = setTimeout(function () {
        typingTimout = -1;

        if (verify()) {
          function preventKey(event) {
            if (event.key.length === 1 && !event.ctrlKey && !event.altKey) {
              event.preventDefault();
            }
          }

          var checkIntv = setInterval(function () {
            if (document.activeElement !== elt) finishPrevent();
          }, 100);
          elt.on('keydown', preventKey).on('blur', finishPrevent);

          function finishPrevent() {
            elt.off('keydown', preventKey).off('blur', finishPrevent);
            clearInterval(checkIntv);
          }

          elt.off('keyup', verify).off('change', onChange).off('blur', onChange).off('keydown', onKeydown).off('onKeyUp', onKeydown).off('click', onClick);
          resolve();
        }
      }, 300);
    }

    function onChange(event) {
      if (verify()) {
        elt.off('keyup', verify).off('change', onChange).off('blur', onChange).off('keydown', onKeydown).off('keyup', onKeyUp).off('click', onClick);
        if (changeTimeout >= 0) clearTimeout(changeTimeout);
        thisC._rejectCb = null;
        resolve();
      } else {
        changeTimeout = setTimeout(function () {
          changeTimeout = -1;

          if (!_AElement.default.prototype.isDescendantOf.call(document.activeElement, elt)) {
            elt.focus();
          }
        }, 1);
      }
    }

    elt.on('keyup', verify).on('change', onChange).on('blur', onChange).once('change', function () {
      changed = true;
    }).once('blur', function () {
      changed = true;
    }).on('click', onClick).on('keydown', onKeydown).on('keyup', onKeyUp);

    thisC._rejectCb = function () {
      elt.off('keyup', verify).off('change', onChange).off('blur', onChange);
      if (changeTimeout >= 0) clearTimeout(changeTimeout);
      reject();
    };
  });
};

UserInputText.attachEnv = function (tutor, env) {
  env.userInputText = function (eltPath, match, message, wrongMessage) {
    return new UserInputText(tutor, {
      eltPath: eltPath,
      match: match,
      message: message,
      wrongMessage: wrongMessage
    }).exec();
  };
};

_TutorEngine.default.installConst('EMAIL_REGEX', /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/);

_TutorEngine.default.installClass(UserInputText);

_TutorNameManager.default.addAsync('userInputText').addConst('EMAIL_REGEX');

_TACData.default.define('userInputText', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'match',
    type: 'Regex|function(string):bool'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }]
}).define('EMAIL_REGEX', {
  type: 'Regex',
  desc: "Biểu thức kiểm tra email"
});

var _default = UserInputText;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/SetRootView.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/SetRootView.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _findNode = _interopRequireDefault(require("../util/findNode"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


var SetRootView = {
  prototype: {
    name: 'setRootView',
    type: 'sync'
  }
};

SetRootView.attachEnv = function (tutor, env) {
  env.setRootView = function (eltPath) {
    tutor.$view = (0, _findNode.default)(eltPath) || document.body;
  };
};

_TutorEngine.default.installClass(SetRootView);

_TutorNameManager.default.addSync('setRootView');

var _default = SetRootView;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserSelectMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserSelectMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

require("../../css/basecommand.css");

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TCommand = require("../engine/TCommand");


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitOpenModal() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateWaitOpenModal, _BaseState.default);

StateWaitOpenModal.prototype.onStart = function () {
  this.command.elt.on('click', this.ev_click);
  this.command.onlyClickTo(this.command.elt);
  this.command.highlightElt(this.command.elt);
};

StateWaitOpenModal.prototype.onStop = function () {
  this.command.elt.off('click', this.ev_click);
  this.command.highlightElt(null);
  clearTimeout(this._checkTO);
  this.command.onlyClickTo(null);
};

StateWaitOpenModal.prototype.checkSelectBox = function () {
  var selectListBox = this.command.elt.$selectlistBox;

  if (selectListBox.getBoundingClientRect().width > 0) {
    this.goto('user_wait_close_modal');
  }
};

StateWaitOpenModal.prototype.ev_click = function () {
  this._checkTO = setTimeout(this.checkSelectBox.bind(this), 50);
};
/***
 * @extends BaseState
 * @constructor
 */


function StateWaitCloseModal() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateWaitCloseModal, _BaseState.default);

StateWaitCloseModal.prototype.onStart = function () {
  this.inv = setInterval(this.checkSelectBox.bind(this), 150);
  var elt = this.command.elt;
  this.command.onlyClickTo(elt.$selectlistBox);
  var searchMessage = this.args.searchMessage;

  if (searchMessage && elt.enableSearch) {
    this.command.showTooltip(elt.$selectlistBox.$searchInput, searchMessage);
  }
};

StateWaitCloseModal.prototype.onStop = function () {
  clearInterval(this.inv);
  this.command.showTooltip(null);
};

StateWaitCloseModal.prototype.checkSelectBox = function () {
  var selectListBox = this.command.elt.$selectlistBox;
  var bound = selectListBox.getBoundingClientRect();

  if (bound.width === 0) {
    this.goto('check_value');
  }
};
/***
 * @extends BaseState
 * @constructor
 */


function StateCheckValue() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateCheckValue, _BaseState.default);

StateCheckValue.prototype.onStart = function () {
  if (this.command.elt.value === this.args.value) {
    this.goto('finish');
  } else {
    this.goto('user_begin');

    if (this.args.wrongMessage) {
      this.command.showTooltip(this.command.elt, this.args.wrongMessage);
    }
  }
};
/***
 * @extends UserBaseAction
 * @constructor
 */


function UserSelectMenu() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserSelectMenu, _UserBaseAction.default);
UserSelectMenu.prototype.className = 'UserSelectMenu';
UserSelectMenu.prototype.name = 'userSelectMenu';
UserSelectMenu.prototype.argNames = ['eltPath', 'value', 'message', 'wrongMessage', 'searchMessage'];
UserSelectMenu.prototype.stateClasses.user_begin = StateWaitOpenModal;
UserSelectMenu.prototype.stateClasses.user_wait_close_modal = StateWaitCloseModal;
UserSelectMenu.prototype.stateClasses.check_value = StateCheckValue;

UserSelectMenu.prototype.verifyElt = function () {
  var elt = this.elt;

  if (!elt.containsClass || !(elt.containsClass('absol-selectmenu') || elt.containsClass('as-select-menu') || elt.containsClass('as-select-tree-menu'))) {
    return new Error("Type error: not a select-menu!");
  }

  return null;
};

_TutorEngine.default.installClass(UserSelectMenu);

_TACData.default.define('userSelectMenu', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'value',
    type: '(string|value)'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }, {
    name: 'searchMessage',
    type: 'string'
  }]
});

_TutorNameManager.default.addAsync('userSelectMenu');

var _default = UserSelectMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/ShowToastMessage.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/ShowToastMessage.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TCommand = require("../engine/TCommand");

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _BaseState = _interopRequireDefault(require("./BaseState"));


/****
 * @extends BaseState
 * @constructor
 */
function StateShowMessage() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateShowMessage, _BaseState.default);

StateShowMessage.prototype.onStart = function () {
  var title = this.args.title;
  var text = this.args.text;
  var variant = this.args.variant;
  var avoid = this.args.avoid;
  var disappearTimeout = this.args.disappearTimeout;
  var pos = 'se';

  if (["se", "sw", "ne", "nw", 'sc'].indexOf(avoid) >= 0) {
    pos = avoid;
  }

  this.command.$toast = _Toast.default.make({
    class: ['as-variant-background', 'atr-toast-message'],
    props: {
      htitle: title,
      disappearTimeout: disappearTimeout,
      variant: variant,
      timeText: ''
    },
    child: _BaseCommand.default.prototype.md2HTMLElements.call({
      $htmlRender: _BaseCommand.default.prototype.$htmlRender
    }, text)
  }, pos);
  this.command.avoidOverlay();
  this.goto('wait_until');
};
/****
 * @extends BaseState
 * @constructor
 */


function StateWaitUntil() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateWaitUntil, _BaseState.default);

StateWaitUntil.prototype.onStart = function () {
  var until = this.args.until;
  if (!until) until = Promise.resolve();

  if (typeof until === 'number') {
    until = new Promise(function (resolve) {
      setTimeout(resolve, until);
    });
  } else if (typeof until === "function") {
    until = until();
  }

  if (until.depthClone) until = until.depthClone();
  if (until.exec) until = until.exec();

  if (until.then) {
    until.then(this.goto.bind(this, 'finish'));
  } else {
    this.goto('finish');
  }
};
/***
 * @extends BaseCommand
 * @constructor
 */


function ShowToastMessage() {
  _BaseCommand.default.apply(this, arguments);

  this.$toast = null;
}

(0, _TCommand.inheritCommand)(ShowToastMessage, _BaseCommand.default);
ShowToastMessage.prototype.argNames = ['title', 'text', 'disappearTimeout', 'until', 'variant', 'avoid'];
ShowToastMessage.prototype.name = 'showToastMessage';
ShowToastMessage.prototype.stateClasses.entry = StateShowMessage;
ShowToastMessage.prototype.stateClasses.wait_until = StateWaitUntil;
/***
 *
 * @protected
 */

ShowToastMessage.prototype.avoidOverlay = function () {
  var thisC = this;
  var avoidElt = null;

  this._toastElts.push(this.$toast);

  if (this.args.avoid) {
    if (["se", "sw", "ne", "nw"].indexOf(this.args.avoid) < 0) {
      avoidElt = this.args.avoid && this.tutor.findNode(this.args.avoid, true);
      if (avoidElt) thisC.assignTarget(avoidElt);
      setTimeout(function () {
        avoidElt = avoidElt || thisC.args.avoid && thisC.tutor.findNode(thisC.args.avoid, true);
        if (avoidElt) thisC.assignTarget(avoidElt);
      }, 3);
    }
  }
};

_TutorEngine.default.installClass(ShowToastMessage);

_TutorEngine.default.installClass(ShowToastMessage);

_TutorNameManager.default.addAsync('showToastMessage');

_TACData.default.define('showToastMessage', {
  type: 'function',
  args: [{
    name: 'title',
    type: 'string'
  }, {
    name: 'text',
    type: 'MarkdownString'
  }, {
    name: 'disappearTimeout',
    type: 'number'
  }, {
    name: 'until',
    type: 'Trigger'
  }, {
    name: 'variant',
    type: 'VariantColorNamesMap'
  }, {
    name: 'avoid?',
    type: '(string|AElement)'
  }],
  desc: 'VariantColorNamesMap("primary" | "secondary" | "success" | "info" | "warning" | "error" | "danger" | "light" | "dark" | "link" | "note")'
});

var _default = ShowToastMessage;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserDateInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserDateInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.StateChooseDate = StateChooseDate;
exports.StateCheckDateValue = StateCheckDateValue;
exports.default = void 0;

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var datetime = _interopRequireWildcard(require("absol/src/Time/datetime"));

var _Core = require("../dom/Core");

var _TemplateString2 = _interopRequireDefault(require("absol/src/JSMaker/TemplateString"));

var _TCommand = require("../engine/TCommand");

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _BaseState = _interopRequireDefault(require("./BaseState"));




/***
 * @extends BaseState
 * @param {BaseCommand} command
 * @constructor
 */
function StateWaitCalendar(command) {
  _BaseState.default.call(this, command);

  this.blindIdx = -1;
  this.checkIdx = -1;
}

_OOP.default.mixClass(StateWaitCalendar, _BaseState.default);

StateWaitCalendar.prototype.onStart = function () {
  var elt = this.command.elt;
  var message = this.args.message;
  var wrongMessage = this.args.wrongMessage;
  var inputTextHintFunc = this.args.inputTextHint && new Function('return ' + _TemplateString2.default.parse(this.args.inputTextHint).toJSCode());

  inputTextHintFunc = inputTextHintFunc || function () {
    return null;
  };

  if (this.command.hadWrongAction && wrongMessage) this.command.showTooltip(this.command.elt, wrongMessage);
  this.command.onlyClickTo(elt.$calendarBtn);
  this.command.elt.$calendarBtn.on('click', this.ev_click);
  this.command.highlightElt(elt);
  this.command.clickCb = this.ev_clickOut;
  this.blindIdx = setTimeout(function () {
    this.blindIdx = -1;
    this.command.highlightElt(elt.$calendarBtn);
  }.bind(this), 400);
};

StateWaitCalendar.prototype.onStop = function () {
  clearTimeout(this.blindIdx);
  clearTimeout(this.checkIdx);
  this.command.elt.$calendarBtn.off('click', this.ev_click);
};

StateWaitCalendar.prototype.checkCalendar = function () {
  var elt = this.command.elt;
  var isOn = !!(elt.share.$calendar && elt.share.$calendar.isDescendantOf(document.body));

  if (isOn) {
    this.goto('choose_date');
  }
};

StateWaitCalendar.prototype.ev_click = function () {
  this.checkIdx = setTimeout(this.checkCalendar.bind(this), 50);
};

StateWaitCalendar.prototype.ev_clickOut = function () {
  this.command.hadWrongAction = true;
  if (this.args.wrongMessage) this.command.showTooltip(this.command.elt, this.args.wrongMessage);
};
/***
 * @extends BaseState
 * @param {BaseCommand} command
 * @constructor
 */


function StateChooseDate(command) {
  _BaseState.default.call(this, command);

  this.blindIdx = -1;
  this.checkIdx = -1;
}

_OOP.default.mixClass(StateChooseDate, _BaseState.default);

StateChooseDate.prototype.onStart = function () {
  this.calendarElt = this.command.elt.share.$calendar;
  this.command.highlightElt(this.calendarElt);
  this.blindIdx = setTimeout(this.highlightTarget.bind(this), 400);
  this.command.onlyClickTo(this.calendarElt);
  document.addEventListener('click', this.ev_click);
};

StateChooseDate.prototype.onStop = function () {
  document.removeEventListener('click', this.ev_click);
  clearTimeout(this.blindIdx);
  clearTimeout(this.checkIdx);
};

StateChooseDate.prototype.highlightTarget = function () {
  var calendar = this.calendarElt;
  var value = this.args.value;
  var thisC = this.command;
  var viewDate = calendar._viewDate;
  if (!viewDate) return;
  var dM = (0, datetime.compareMonth)(value, viewDate);

  if (dM === 0) {
    (0, _Core.$)('.absol-chrome-calendar-week-in-month>div', calendar, function (dateElt) {
      if (dateElt.__date__ && datetime.compareDate(dateElt.__date__, value) === 0 && !dateElt.hasClass('absol-chrome-calendar-not-in-month')) {
        thisC.highlightElt(dateElt);
      }
    });
  } else if (dM < 0) {
    thisC.highlightElt(calendar.$prevBtn);
  } else if (dM > 0) {
    thisC.highlightElt(calendar.$nextBtn);
  }
};

StateChooseDate.prototype.checkCalendar = function () {
  var elt = this.command.elt;
  var isOn = !!(this.calendarElt && this.calendarElt.isDescendantOf(document.body));

  if (isOn) {
    this.highlightTarget();
  } else {
    this.goto('check_value');
  }
};

StateChooseDate.prototype.ev_click = function () {
  this.checkIdx = setTimeout(this.checkCalendar.bind(this), 50);
};
/***
 * @extends BaseState
 * @param {BaseCommand} command
 * @constructor
 */


function StateCheckDateValue(command) {
  _BaseState.default.call(this, command);
}

_OOP.default.mixClass(StateCheckDateValue, _BaseState.default);

StateCheckDateValue.prototype.onStart = function () {
  var value = this.args.value;
  var inputValue = this.command.elt.value;

  if (value === inputValue) {
    this.goto('finish');
  } else if (value && inputValue) {
    if ((0, datetime.compareDate)(value, inputValue) === 0) {
      this.goto('finish');
    } else {
      this.command.hadWrongAction = true;
      this.goto('user_begin');
    }
  }
}; //To do: user focus to input

/***
 * @extends UserBaseAction
 * @constructor
 */


function UserDateInput() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserDateInput, _UserBaseAction.default);
UserDateInput.prototype.name = 'userDateInput';
UserDateInput.prototype.argNames = ['eltPath', 'value', 'message', 'wrongMessage', 'inputTextHint'];
UserDateInput.prototype.stateClasses['user_begin'] = StateWaitCalendar;
UserDateInput.prototype.stateClasses['choose_date'] = StateChooseDate;
UserDateInput.prototype.stateClasses['check_value'] = StateCheckDateValue;

UserDateInput.prototype._isFocus = function (elt) {
  return document.hasFocus() && document.activeElement === elt;
};

UserDateInput.prototype.verifyElt = function () {
  if (!this.elt.hasClass && !this.elt.hasClass('as-date-time-input')) {
    return new Error('Type error: not a date-input!');
  }
};

UserDateInput.prototype.requestUserAction = function () {
  var thisC = this;
  /***
   *
   * @type {DateInput2}
   */

  var elt = thisC.tutor.findNode(thisC.args.eltPath);
  this.assignTarget(elt);
  var message = this.args.message;
  var wrongMessage = this.args.wrongMessage;
  var inputTextHintFunc = this.args.inputTextHint && new Function('return ' + _TemplateString.default.parse(this.args.inputTextHint).toJSCode());

  inputTextHintFunc = inputTextHintFunc || function () {
    return null;
  };

  var inputTextHint;
  var value = this.args.value;
  return new Promise(function (resolve, reject) {
    thisC.onlyClickTo(elt);
    thisC.highlightElt(elt);
    var calendarOn = !!(elt.share.$calendar && elt.share.$calendar.isDescendantOf(document.body));
    /***
     * @type {ChromeCalendar}
     */

    var calendar;
    var lastKey;

    function onClick(event) {
      lastKey = null;
      checkCalendar();
      checkInput();
    }

    function onCalendarOpen() {
      calendar = elt.share.$calendar;
      thisC.onlyClickTo(elt.share.$calendar);
      thisC.highlightElt(elt.share.$calendar);
      onCalendarStep();
    }

    function onCalendarClose() {
      thisC.onlyClickTo(elt);
      thisC.highlightElt(elt);

      if (datetime.compareDate(elt.value, value) === 0) {
        clearListener();
        resolve();
      }
    }

    function onCalendarStep() {
      var viewDate = calendar._viewDate;
      if (!viewDate) return;
      var dM = (0, datetime.compareMonth)(value, viewDate);

      if (dM === 0) {
        (0, _Core.$)('.absol-chrome-calendar-week-in-mounth>div', calendar, function (dateElt) {
          if (dateElt.__date__ && datetime.compareDate(dateElt.__date__, value) === 0 && !dateElt.containsClass('absol-chrome-calendar-not-in-month')) {
            thisC.highlightElt(dateElt);
          }
        });
      } else if (dM < 0) {
        thisC.highlightElt(calendar.$prevBtn);
      } else if (dM > 0) {
        thisC.highlightElt(calendar.$nextBtn);
      }
    }

    function checkCalendar() {
      setTimeout(function () {
        var isDisplay = !!(elt.share.$calendar && elt.share.$calendar.isDescendantOf(document.body));

        if (calendarOn !== isDisplay) {
          calendarOn = isDisplay;

          if (calendarOn) {
            onCalendarOpen();
          } else {
            onCalendarClose();
          }
        } else if (calendarOn) {
          onCalendarStep();
        }
      }, 10);
    }

    function onKeyUp(event) {
      lastKey = event.key;
      checkInput();
    }

    var prevented = false;

    function checkInput() {
      setTimeout(function () {
        inputTextHint = inputTextHintFunc.call(elt);

        if (thisC._isFocus(elt.$input) && lastKey !== 'Enter') {
          thisC.highlightElt(null);
          var text = elt.$input.value;

          try {
            var expectedValue = (0, datetime.parseDateString)(text, elt.format || 'dd/mm/yyyy');

            if (!prevented && expectedValue && (0, datetime.compareDate)(expectedValue, value) === 0) {
              function preventKey(event) {
                if (event.key.length === 1 && !event.ctrlKey && !event.altKey) {
                  event.preventDefault();
                }
              }

              var checkIntv = setInterval(function () {
                if (document.activeElement !== elt.$input) finishPrevent();
              }, 100);
              elt.$input.on('keydown', preventKey).on('blur', finishPrevent);

              function finishPrevent() {
                elt.$input.off('keydown', preventKey).off('blur', finishPrevent);
                clearInterval(checkIntv);
              }

              resolve();
            } else {
              if (inputTextHint) thisC.showTooltip(elt.$input, inputTextHint);
            }
          } catch (error) {
            if (inputTextHint) thisC.showTooltip(elt.$input, inputTextHint);
          }
        } else {
          if ((0, datetime.compareDate)(elt.value, value) !== 0) {
            if (wrongMessage) thisC.showTooltip(elt, wrongMessage);
            if (lastKey !== 'Enter' && !(elt.share.$calendar && elt.share.$calendar.isDescendantOf(document.body))) thisC.highlightElt(elt);

            if (lastKey === 'Enter') {
              elt.$input.focus();
              elt.$input.select && elt.$input.select();
            }
          } else {
            clearListener();
            resolve();
          }
        }
      }, 10);
    }

    function clearListener() {
      document.body.removeEventListener('click', onClick);
      document.body.removeEventListener('keyup', onKeyUp);
    }

    thisC._rejectCb = function () {
      clearListener();
      reject();
    };

    document.body.addEventListener('click', onClick);
    document.body.addEventListener('keyup', onKeyUp);
  });
};

UserDateInput.attachEnv = function (tutor, env) {
  env.userDateInput = function (eltPath, value, message, wrongMessage, inputTextHint) {
    if (!value || !value.toDateString) throw new Error("Invalid value, value must be a DateTime!");
    return new UserDateInput(tutor, {
      eltPath: eltPath,
      value: value,
      message: message,
      wrongMessage: wrongMessage,
      inputTextHint: inputTextHint
    }).exec();
  };
};

_TutorEngine.default.installClass(UserDateInput);

_TutorNameManager.default.addAsync('userDateInput');

var _default = UserDateInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserCalendarInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserCalendarInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _ChromeCalendar = _interopRequireDefault(require("absol-acomp/js/ChromeCalendar"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _UserDateInput = require("./UserDateInput");


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitCalendar() {
  _BaseState.default.apply(this, arguments);

  this.clickTO = -1;
}

_OOP.default.mixClass(StateWaitCalendar, _BaseState.default);

StateWaitCalendar.prototype.onStart = function () {
  var elt = this.command.elt;
  var thisC = this.command;
  thisC.onlyClickTo(elt);
  thisC.highlightElt(elt);

  if (thisC.hadWrongAction && this.args.wrongMessage) {
    thisC.showTooltip(elt, thisC.args.wrongMessage);
  }

  document.addEventListener('click', this.ev_click);
};

StateWaitCalendar.prototype.onStop = function () {
  clearTimeout(this.clickTO);
  document.removeEventListener('click', this.ev_click);
};

StateWaitCalendar.prototype.ev_click = function () {
  var thisC = this.command;
  var elt = this.command.elt;
  thisC.highlightElt(null);
  if (this.clickTO >= 0) clearTimeout(this.clickTO);
  this.clickTO = setTimeout(function () {
    this.clickTO = -1;

    if (_ChromeCalendar.default.$calendar && _ChromeCalendar.default.$calendar.isDescendantOf(document.body)) {
      this.goto('choose_date');
    }
  }.bind(this), 100);
};
/***
 * @extends StateChooseDate
 * @constructor
 */


function StateChooseDate1() {
  _UserDateInput.StateChooseDate.apply(this, arguments);

  this.clickTO = -1;
}

_OOP.default.mixClass(StateChooseDate1, _UserDateInput.StateChooseDate);

StateChooseDate1.prototype.onStart = function () {
  this.calendarElt = _ChromeCalendar.default.$calendar;
  this.command.highlightElt(this.calendarElt);
  this.blindIdx = setTimeout(this.highlightTarget.bind(this), 400);
  this.command.onlyClickTo(this.calendarElt);
  document.addEventListener('click', this.ev_click);
};
/***
 * @extends BaseState
 * @constructor
 */


function StateWaitChange() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateWaitChange, _BaseState.default);
/***
 * @extends UserBaseAction
 * @constructor
 */


function UserCalendarInput() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserCalendarInput, _UserBaseAction.default);
UserCalendarInput.prototype.className = 'UserCalendarInput';
UserCalendarInput.prototype.name = 'userCalendarInput';
UserCalendarInput.prototype.argNames = ['eltPath', 'value', 'message', 'wrongMessage'];
UserCalendarInput.prototype.stateClasses['user_begin'] = StateWaitCalendar;
UserCalendarInput.prototype.stateClasses['choose_date'] = StateChooseDate1;
UserCalendarInput.prototype.stateClasses['check_value'] = _UserDateInput.StateCheckDateValue;

UserCalendarInput.prototype.verifyElt = function () {
  var elt = this.elt;

  if (!elt.hasClass || !elt.hasClass('absol-calendar-input')) {
    return new Error("Invalid element type: not a CalendarInput!");
  }

  return null;
};

_TutorEngine.default.installClass(UserCalendarInput);

_TutorNameManager.default.addAsync('userCalendarInput');

_TACData.default.define('userCalendarInput', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'value',
    type: 'Date'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }]
});

var _default = UserCalendarInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/DateTime.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/DateTime.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var datetime = _interopRequireWildcard(require("absol/src/Time/datetime"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));




var DateTime = {};
DateTime.properties = Object.assign({}, datetime);

DateTime.properties.parseDMY = function (str) {
  return (0, datetime.parseDateString)(str, 'dd/mm/yyyy');
};

DateTime.properties.formatDateString = datetime.formartDateString;
DateTime.libs = {};
Object.keys(DateTime.properties).forEach(function (key) {
  Object.defineProperty(DateTime.libs, key, {
    value: DateTime.properties[key],
    configurable: false,
    writable: false
  });
});

_TutorEngine.default.installConst('datetime', DateTime.libs);

_TutorNameManager.default.addConst('datetime');

var _default = DateTime;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserQuickMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserQuickMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _Core = require("../dom/Core");

var _findNode = _interopRequireDefault(require("../util/findNode"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitMenu() {
  _BaseState.default.apply(this, arguments);

  this.wcIdx = -1;
}

_OOP.default.mixClass(StateWaitMenu, _BaseState.default);

StateWaitMenu.prototype.onStart = function () {
  this.command.highlightElt(this.command.elt);
  this.command.onlyClickTo(this.command.elt);
  if (this.command.hadWrongAction && this.args.wrongMessage) this.command.showTooltip(this.command.elt, this.args.wrongMessage);
  this.command.elt.on('click', this.ev_click);
  this.command.clickCb = this.ev_clickOut;
};

StateWaitMenu.prototype.onStop = function () {
  clearTimeout(this.wcIdx);
};

StateWaitMenu.prototype.ev_clickOut = function () {
  this.command.hadWrongAction = true;
  if (this.args.wrongMessage) this.command.showTooltip(this.command.elt, this.args.wrongMessage);
};

StateWaitMenu.prototype.checkMenu = function () {
  if (_QuickMenu.default.$elt && _QuickMenu.default.$elt.getBoundingClientRect().width > 0) {
    this.goto('wait_click');
  }
};

StateWaitMenu.prototype.ev_click = function () {
  clearTimeout(this.wcIdx);
  this.wcIdx = setTimeout(this.checkMenu.bind(this), 10);
};
/***
 * @extends BaseState
 * @constructor
 */


function StateWaitClick() {
  _BaseState.default.apply(this, arguments);

  this.checkMenuIdx = -1;
  this.blindIdx = -1;
}

_OOP.default.mixClass(StateWaitClick, _BaseState.default);

StateWaitClick.prototype.onStart = function () {
  this.command.highlightElt(_QuickMenu.default.$elt);
  this.itemElt = (0, _findNode.default)(this.args.selectId, _QuickMenu.default.$elt);

  if (!this.itemElt) {
    this.command.reject(new Error("QuickMenu do not contain " + this.args.selectId));
    return;
  }

  this.itemElt.once('click', this.ev_clickItem);
  if (this.command.hadWrongAction && this.args.wrongMessage) this.command.showTooltip(_QuickMenu.default.$elt, this.args.wrongMessage);
  this.command.onlyClickTo(this.itemElt);
  this.blindIdx = setTimeout(function () {
    this.command.highlightElt(this.itemElt);
  }.bind(this), 400);
  this.checkMenuIdx = setInterval(this.checkMenu.bind(this), 200);
  this.command.clickCb = this.checkMenu.bind(this);
};

StateWaitClick.prototype.onStop = function () {
  clearInterval(this.checkMenuIdx);
  clearInterval(this.blindIdx);
  this.itemElt.off('click', this.ev_clickItem);
  this.command.clickCb = null;
};

StateWaitClick.prototype.checkMenu = function () {
  if (_QuickMenu.default.$elt.getBoundingClientRect().width === 0) {
    this.goto('user_begin');
  }
};

StateWaitClick.prototype.ev_clickItem = function () {
  this.goto('finish');
};
/***
 * @extends UserBaseAction
 * @constructor
 */


function UserQuickMenu() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserQuickMenu, _UserBaseAction.default);
UserQuickMenu.prototype.className = 'UserQuickMenu';
UserQuickMenu.prototype.name = 'userQuickMenu';
UserQuickMenu.prototype.argNames = ['eltPath', 'selectId', 'message', 'wrongMessage'];
UserQuickMenu.prototype.stateClasses['user_begin'] = StateWaitMenu;
UserQuickMenu.prototype.stateClasses['wait_click'] = StateWaitClick;

UserQuickMenu.prototype.verifyElt = function () {
  // if (!this.elt.classList.contains('as-quick-menu-trigger')) {
  //     return new Error('Type error: not a quick-menu trigger');
  // }
  return null;
};

_TutorEngine.default.installClass(UserQuickMenu);

_TutorEngine.default.installFunction('getAllQuickMenuTriggers', function () {
  return (0, _Core.$$)('.as-quick-menu-trigger');
});

_TutorNameManager.default.addAsync('userQuickMenu').addSync('getAllQuickMenuTriggers');

_TACData.default.define('userQuickMenu', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'selectId',
    type: 'string'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }]
}).define('getAllQuickMenuTriggers', {
  type: 'function',
  args: [],
  returns: 'QuickMenuTriggers[]'
});

var _default = UserQuickMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserLevel2Menu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserLevel2Menu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _findNode = _interopRequireDefault(require("../util/findNode"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitSelectRoot() {
  _BaseState.default.apply(this, arguments);

  this.toIdx = -1;
}

_OOP.default.mixClass(StateWaitSelectRoot, _BaseState.default);

StateWaitSelectRoot.prototype.onStart = function () {
  this.command.menuLevel = 0;
  this.command.highlightElt(this.command.elt);
  var itemElt = (0, _findNode.default)(this.args.menuItemPath[0], this.command.elt);
  this.command.menuItemElt = itemElt;
  if (this.command.hadWrongAction && this.args.wrongMessage) this.command.showTooltip(this.command.menuItemElt, this.args.wrongMessage);
  this.command.onlyClickTo(itemElt);
  this.toIdx = setTimeout(function () {
    this.command.highlightElt(itemElt);
  }.bind(this), 400);
  itemElt.on('click', this.ev_click);
  this.command.clickCb = this.ev_clickOut;
};

StateWaitSelectRoot.prototype.onStop = function () {
  clearTimeout(this.toIdx);
  this.command.menuItemElt.off('click', this.ev_click);
  this.command.clickCb = null;
};

StateWaitSelectRoot.prototype.ev_click = function () {
  this.goto('hover_next');
};

StateWaitSelectRoot.prototype.ev_clickOut = function () {
  this.command.hadWrongAction = true;
  if (this.args.wrongMessage) this.command.showTooltip(this.command.menuItemElt, this.args.wrongMessage);
};
/***
 * @extends BaseState
 * @constructor
 */


function StateHoverNext() {
  _BaseState.default.apply(this, arguments);

  this.toIdx = -1;
  this.checkInv = -1;
}

_OOP.default.mixClass(StateHoverNext, _BaseState.default);

StateHoverNext.prototype.onStart = function () {
  this.command.menuLevel++;
  this.command.highlightElt(this.command.menuItemElt.$container);
  var itemElt = (0, _findNode.default)(this.args.menuItemPath[this.command.menuLevel], this.command.menuItemElt.$container);
  this.command.menuItemElt = itemElt;
  if (this.command.hadWrongAction && (this.args.wrongMessage1 || this.args.wrongMessage)) this.command.showTooltip(this.command.menuItemElt, this.args.wrongMessage1 || this.args.wrongMessage);
  this.command.onlyClickTo(itemElt);
  this.toIdx = setTimeout(function () {
    this.command.highlightElt(itemElt);
  }.bind(this), 100);
  this.command.menuItemElt.once('mouseenter', this.ev_mouseenter);
  this.checkInv = setInterval(this.checkItemVisibility.bind(this), 300);
};

StateHoverNext.prototype.checkItemVisibility = function () {
  var c = this.command.menuItemElt;

  while (c) {
    if (c.getBoundingClientRect().width === 0) return false;

    if (_AElement.default.prototype.getComputedStyleValue.call(c, 'visibility') !== 'visible') {
      clearInterval(this.checkInv);
      this.command.hadWrongAction = true;
      this.goto('user_begin');
      break;
    }

    c = c.parentElement;
  }
};

StateHoverNext.prototype.onStop = function () {
  this.command.menuItemElt.off('mouseenter', this.ev_mouseenter);
};

StateHoverNext.prototype.ev_mouseenter = function () {
  if (this.command.menuLevel + 1 >= this.args.menuItemPath.length) {
    this.goto('wait_click_current');
  } else {
    this.goto('hover_next');
  }
};
/***
 * @extends BaseState
 * @constructor
 */


function StateWaitClickCurrent() {
  _BaseState.default.apply(this, arguments);

  this.checkInv = -1;
}

_OOP.default.mixClass(StateWaitClickCurrent, _BaseState.default);

StateWaitClickCurrent.prototype.onStart = function () {
  this.command.onlyClickTo(this.command.menuItemElt);
  this.command.highlightElt(this.command.menuItemElt);
  this.checkInv = setInterval(this.checkItemVisibility.bind(this), 300);
  this.command.menuItemElt.once('click', this.ev_click);
};

StateWaitClickCurrent.prototype.onStop = function () {
  clearInterval(this.checkInv);
  this.command.menuItemElt.off('click', this.ev_click);
};

StateWaitClickCurrent.prototype.ev_click = function () {
  this.goto('finish');
};

StateWaitClickCurrent.prototype.checkItemVisibility = StateHoverNext.prototype.checkItemVisibility;
/***
 * @extends UserBaseAction
 * @constructor
 */

function UserLevel2Menu() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserLevel2Menu, _UserBaseAction.default);
UserLevel2Menu.prototype.argNames = ['eltPath', 'menuItemPath', 'message', 'wrongMessage', 'wrongMessage1'];
UserLevel2Menu.prototype.name = 'userLevel2Menu';
UserLevel2Menu.prototype.className = 'UserLevel2Menu';
UserLevel2Menu.prototype.stateClasses.user_begin = StateWaitSelectRoot;
UserLevel2Menu.prototype.stateClasses.hover_next = StateHoverNext;
UserLevel2Menu.prototype.stateClasses.wait_click_current = StateWaitClickCurrent;

UserLevel2Menu.prototype.verifyElt = function () {
  var elt = this.elt;

  if (!elt.containsClass || !elt.containsClass('as-v-root-menu')) {
    return new Error('Type error: not a valid menu!');
  }
};

_TutorEngine.default.installClass(UserLevel2Menu);

_TutorNameManager.default.addAsync('userLevel2Menu');

_TACData.default.define('userLevel2Menu', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'menuItemPath',
    type: 'string[]'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }, {
    name: 'wrongMessage1',
    type: 'string'
  }]
});

var _default = UserLevel2Menu;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Delay.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Delay.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


/***
 * @extends BaseState
 * @constructor
 */
function StateRunTrigger() {
  _BaseState.default.apply(this, arguments);

  this.expression = this.args.until;

  if (this.expression && this.expression.depthClone) {
    this.expression = this.expression.depthClone();
  }

  this.toId = -1;
}

_OOP.default.mixClass(StateRunTrigger, _BaseState.default);

StateRunTrigger.prototype.onStart = function () {
  this.command.preventKeyBoard(true);
  this.command.preventMouse(true);

  if (typeof this.expression === "number") {
    this.toId = setTimeout(this.goto.bind(this, 'finish'), this.expression);
  } else if (this.expression && this.expression.then) {
    this.expression.then(this.goto.bind(this, 'finish'));
  } else if (this.expression && this.expression.exec) {
    this.expression.exec().then(this.goto.bind(this, 'finish'));
  } else {
    throw new Error("\"until\" argument is not valid!");
  }
};

StateRunTrigger.prototype.onStop = function () {
  if (this.toId > 0) {
    clearTimeout(this.toId);
  }

  this.command.preventKeyBoard(false);
  this.command.preventMouse(false);
};
/***
 * @extends BaseCommand
 * @constructor
 */


function Delay() {
  _BaseCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(Delay, _BaseCommand.default);
Delay.prototype.argNames = ['until'];
Delay.prototype.className = 'Delay';
Delay.prototype.name = 'delay';
Delay.prototype.stateClasses.entry = StateRunTrigger;

_TutorEngine.default.installClass(Delay);

_TutorNameManager.default.addAsync('delay');

_TACData.default.define('delay', {
  type: 'function',
  args: [{
    name: 'trigger',
    type: 'Trigger|number'
  }],
  desc: "Chờ trong khoảng thời gian hoặc trigger kích hoạt"
});

var _default = Delay;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserSwitchTabIfNeed.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserSwitchTabIfNeed.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));


/***
 * @extends UserBaseAction
 * @constructor
 */
function UserSwitchTabIfNeed() {
  _UserBaseAction.default.apply(this, arguments);
}

_OOP.default.mixClass(UserSwitchTabIfNeed, _UserBaseAction.default);
/***
 *
 * @param {HTMLElement} elt
 */


UserSwitchTabIfNeed.prototype.findTabView = function (elt) {
  var tabFrameElt = null;
  var tabViewElt = null;

  while (elt) {
    if (elt.classList.contains('absol-tab-frame')) {
      tabViewElt = null;
      tabFrameElt = elt;
    } else if (elt.classList.contains('absol-tabview')) {
      tabViewElt = elt;
      break;
    }

    elt = elt.parentElement;
  }

  return tabFrameElt && tabViewElt && {
    tabFrameElt: tabFrameElt,
    tabViewElt: tabViewElt
  };
};

UserSwitchTabIfNeed.prototype.exec = function () {
  this.start();
  var thisC = this;
  var elt = this.tutor.findNode(this.args.eltPath);
  var message = this.args.message;
  var wrongMessage = this.args.wrongMessage;
  var tabInfo = this.findTabView(elt);

  if (!tabInfo) {
    this.stop();
    return Promise.resolve();
  }

  var tabViewElt = tabInfo.tabViewElt;
  var tabFrameElt = tabInfo.tabFrameElt;
  var activeTabId = tabViewElt.historyOfTab[tabViewElt.historyOfTab.length - 1];

  if (activeTabId === tabFrameElt.id) {
    return new Promise(function (resolve, reject) {
      if (!thisC.args.notNeedMessage) {
        resolve();
        return;
      }

      thisC.showToast(thisC.args.notNeedMessage);
      var timeoutId = setTimeout(function () {
        timeoutId = -1;
        thisC.stop();
        resolve();
      }, 2000);

      thisC._rejectCb = function () {
        if (timeoutId >= 0) {
          clearTimeout(timeoutId);
          timeoutId = -1;
          reject();
        }
      };
    });
  }

  var tabButton = tabViewElt.$tabbar.getButtonByIdent(tabFrameElt.id);
  tabButton.addClass('atr-tab-button-disabled-close');
  this.highlightElt(tabButton);
  this.showToast(message);
  return new Promise(function (resolve, reject) {
    function onClick() {
      tabButton.removeClass('atr-tab-button-disabled-close');
      tabButton.off('click', onClick);
      resolve();
    }

    thisC._rejectCb = function () {
      tabButton.removeClass('atr-tab-button-disabled-close');
      tabButton.off('click', onClick);
      reject();
    };

    thisC._clickCb = function () {
      if (wrongMessage) thisC.showTooltip(tabButton, wrongMessage);
      thisC.highlightElt(tabButton);
    };

    thisC.onlyClickTo(tabButton);
    tabButton.on('click', onClick);
  }).then(this.stop.bind(this));
};

UserSwitchTabIfNeed.attachEnv = function (tutor, env) {
  env.userSwitchTabIfNeed = function (eltPath, message, wrongMessage, notNeedMessage) {
    return new UserSwitchTabIfNeed(tutor, {
      eltPath: eltPath,
      message: message,
      wrongMessage: wrongMessage,
      notNeedMessage: notNeedMessage
    }).exec();
  };
};

_TutorNameManager.default.addAsync('userSwitchTabIfNeed');

_TACData.default.define('userSwitchTabIfNeed', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }, {
    name: 'notNeedMessage',
    type: 'string'
  }],
  desc: "eltPath: phần tử bất kì trong tab cần bật, nếu đang mở đúng tab hiện tại, sử dụng notNeedMessage, delay 2s và nhảy lệnh " + "tiếp theo, nếu không có tab nào, lệnh không được thực hiện"
});

var _default = UserSwitchTabIfNeed;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserSwitchTab.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserSwitchTab.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _UserSwitchTabIfNeed = _interopRequireDefault(require("./UserSwitchTabIfNeed"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));


/***
 * @extends UserSwitchTabIfNeed
 * @constructor
 */
function UserSwitchTab() {
  _UserSwitchTabIfNeed.default.apply(this, arguments);
}

_OOP.default.mixClass(UserSwitchTab, _UserSwitchTabIfNeed.default);

UserSwitchTab.prototype.requestUserAction = function () {
  var thisC = this;
  var elt = this.tutor.findNode(this.args.eltPath);
  var wrongMessage = this.args.wrongMessage;
  var tabInfo = this.findTabView(elt);

  if (!tabInfo) {
    throw Error(this.args.eltPath + ' is not a element of any tab!');
  }

  var tabViewElt = tabInfo.tabViewElt;
  var tabFrameElt = tabInfo.tabFrameElt;
  var tabButton = tabViewElt.$tabbar.getButtonByIdent(tabFrameElt.id);
  tabButton.addClass('atr-tab-button-disabled-close');
  thisC.highlightElt(tabButton);
  return new Promise(function (resolve, reject) {
    function onClick() {
      thisC._clickCb = null;
      tabButton.removeClass('atr-tab-button-disabled-close');
      resolve();
    }

    thisC._rejectCb = function () {
      tabButton.removeClass('atr-tab-button-disabled-close');
      tabButton.off('click', onClick);
      reject();
    };

    thisC._clickCb = function () {
      if (wrongMessage) thisC.showTooltip(tabButton, wrongMessage);
    };

    thisC.onlyClickTo(tabButton);
    tabButton.on('click', onClick);
  });
};

UserSwitchTab.prototype.exec = _UserBaseAction.default.prototype.exec;

UserSwitchTab.attachEnv = function (tutor, env) {
  env.userSwitchTab = function (eltPath, message, wrongMessage) {
    return new UserSwitchTab(tutor, {
      eltPath: eltPath,
      message: message,
      wrongMessage: wrongMessage
    }).exec();
  };
};

_TutorNameManager.default.addAsync('userSwitchTab');

_TACData.default.define('userSwitchTab', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }],
  desc: "eltPath: phần tử bất kì trong tab cần bật, nếu đang mở đúng tab hiện tại, nếu đang mở đúng tab hiện tại thì người" + "dùng vẫn phải bấm bút tab dù nó không có tác dụng gì"
});

var _default = UserSwitchTab;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserScrollIfNeed.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserScrollIfNeed.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Dom = _interopRequireWildcard(require("absol/src/HTML5/Dom"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _Core = require("../dom/Core");

var _Icon = require("../dom/Icon");

var _Tooltip = _interopRequireDefault(require("absol-acomp/js/Tooltip"));

var _TCommand = require("../engine/TCommand");

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _BaseState = _interopRequireDefault(require("./BaseState"));




/***
 * @extends BaseState
 * @constructor
 */
function StateBeforeScroll() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateBeforeScroll, _BaseState.default);

StateBeforeScroll.prototype.onStart = function () {
  this.command.scrollerElt = this.command.findVScroller(this.command.elt);

  if (!this.command.scrollerElt) {
    this.goto('finish');
    return;
  }

  this.scrollDir = this.command.findScrollDir(this.command.elt, this.command.scrollerElt);

  if (this.scrollDir.dy === 0) {
    this.goto('finish');
    return;
  }

  this.command.highlightElt(this.command.elt);
  this.goto('begin_scrolling');
};
/***
 * @extends BaseState
 * @constructor
 */


function StateBeginScrolling() {
  _BaseState.default.apply(this, arguments);

  this.checkIdx = -1;
  this.pointerLock = false;
  this.currentDir = 0;
}

_OOP.default.mixClass(StateBeginScrolling, _BaseState.default);

StateBeginScrolling.prototype.onStart = function () {
  this.command.scrollerElt.addEventListener('scroll', this.ev_scroll);
  document.addEventListener('scroll', this.ev_scroll);
  this.command.scrollerElt.classList.add('atr-scroll-only');
  document.body.addEventListener('pointerdown', this.ev_pointerDown);
  document.body.addEventListener('touchstart', this.ev_pointerDown);
  document.body.addEventListener('pointerup', this.ev_pointerUp);
  document.body.addEventListener('pointercancel', this.ev_pointerUp);
  document.body.addEventListener('touchend', this.ev_pointerUp);
  this.scrollDir = this.command.findScrollDir(this.command.elt, this.command.scrollerElt);
  this.prevScrollTop = this.command.scrollerElt.scrollTop;

  this.command._showScroll(this.command.scrollerElt, this.scrollDir);

  this.command.onlyClickTo(this.command.scrollerElt);
};

StateBeginScrolling.prototype.onStop = function () {
  this.command.scrollerElt.removeEventListener('scroll', this.ev_scroll);
  document.removeEventListener('scroll', this.ev_scroll);
  this.command.scrollerElt.classList.remove('atr-scroll-only');
  if (this.checkIdx > 0) clearTimeout(this.checkIdx);
  document.body.removeEventListener('pointerdown', this.ev_pointerDown);
  document.body.removeEventListener('touchstart', this.ev_pointerDown);
  document.body.removeEventListener('pointerup', this.ev_pointerUp);
  document.body.removeEventListener('pointercancel', this.ev_pointerUp);
  document.body.removeEventListener('touchend', this.ev_pointerUp);
};

StateBeginScrolling.prototype.delayCheck = function () {
  if (this.checkIdx > 0) {
    clearTimeout(this.checkIdx);
  }

  var thisC = this.command;
  var vScroller = this.command.scrollerElt;
  this.checkIdx = setTimeout(function () {
    this.checkIdx = -1;
    var currentDir = thisC.findScrollDir(this.command.elt, vScroller);
    this.currentDir = currentDir;
    var pointerLock = this.pointerLock;

    if (currentDir.dy === 0 || !vScroller) {
      thisC._showScrollTooltip(null);

      thisC._prevTootipDir.dy = 0;

      if (!pointerLock) {
        this.goto('finish');
      }
    } else {
      thisC._showScroll(vScroller, currentDir);

      if (thisC._prevTootipDir.dy !== currentDir.dy) {
        thisC._showScrollTooltip(vScroller, currentDir.dy > 0 ? this.command.args.scrollUpMessage : this.command.args.scrollDownMessage, currentDir);
      }

      thisC._prevTootipDir.dy = currentDir.dy;
    }
  }.bind(this), 100);
};

StateBeginScrolling.prototype.ev_scroll = function (event) {
  this.command._updateToastPosition();

  this.currentDir = this.command.findScrollDir(this.command.elt, this.command.scrollerElt);
  var vScroller = this.command.scrollerElt;

  if (vScroller.scrollTop > this.prevScrollTop) {
    if (this.currentDir.dy > 0) {
      this.command.hadWrongAction = true;
    }
  } else if (vScroller.scrollTop < this.prevScrollTop) {
    if (this.currentDir.dy < 0) {
      this.command.hadWrongAction = true;
    }
  }

  this.prevScrollTop = this.command.scrollerElt.scrollTop;
  this.delayCheck();
};

StateBeginScrolling.prototype.ev_pointerUp = function () {
  this.pointerLock = true;
};

StateBeginScrolling.prototype.ev_pointerDown = function () {
  this.pointerLock = false;
};
/***
 * @extends BaseState
 * @constructor
 */


function StateShowMessage() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateShowMessage, _BaseState.default);

StateShowMessage.prototype.onStart = function () {
  this.currentDir = this.command.findScrollDir(this.command.elt, this.command.scrollerElt);

  if (this.currentDir.dy === 0) {
    this.goto('finish');
  } else {
    this.command.showDelayToast(this.args.message).then(function () {
      this.goto('user_begin');
    }.bind(this));
  }
};
/***
 * @extends BaseCommand
 * @constructor
 */


function UserScrollIfNeed() {
  _BaseCommand.default.apply(this, arguments);

  this._prevTootipDir = {
    dy: 0,
    dx: 0
  };
}

(0, _TCommand.inheritCommand)(UserScrollIfNeed, _UserBaseAction.default);
UserScrollIfNeed.prototype.name = 'userScrollIfNeed';
UserScrollIfNeed.prototype.argNames = ['eltPath', 'message', 'scrollUpMessage', 'scrollDownMessage', 'offset', 'delta'];
UserScrollIfNeed.prototype.stateClasses['user_begin'] = StateBeforeScroll;
UserScrollIfNeed.prototype.stateClasses['begin_scrolling'] = StateBeginScrolling;
UserScrollIfNeed.prototype.stateClasses['show_message'] = StateShowMessage;
UserScrollIfNeed.prototype.$scrollBarIcon = (0, _Core.$)(_Icon.ScrollBarIco.cloneNode(true));
UserScrollIfNeed.prototype.$scrollBarIconCtn = (0, _Core._)({
  class: 'atr-scroll-icon-ctn',
  child: UserScrollIfNeed.prototype.$scrollBarIcon
});
/***
 * @type {Tooltip}
 */

UserScrollIfNeed.prototype.$scrollTooltip = (0, _Core._)({
  tag: _Tooltip.default.tag,
  class: 'atr-scroll-tooltip',
  child: {
    class: 'atr-explain-text'
  }
});
UserScrollIfNeed.prototype.$scrollTooltipText = (0, _Core.$)('.atr-explain-text', UserScrollIfNeed.prototype.$scrollTooltip);

UserScrollIfNeed.prototype._showScroll = function (elt, dir) {
  this.$scrollBarIcon.removeClass('atr-down').removeClass('atr-up').removeStyle('transform');
  this.$scrollBarIconCtn.removeStyle('left').removeStyle('top');
  if (elt && !this.$scrollBarIconCtn.parentElement) document.body.appendChild(this.$scrollBarIconCtn);else if (!elt && this.$scrollBarIconCtn.parentElement) {
    this.$scrollBarIconCtn.remove();
    return;
  }
  if (!dir) return;
  var bound = elt.getBoundingClientRect();
  var iconBound = this.$scrollBarIconCtn.getBoundingClientRect();

  if (dir.dy) {
    this.$scrollBarIconCtn.addStyle('left', bound.right - 17 - iconBound.width - 5 + 'px');

    if (dir.dy > 0) {
      this.$scrollBarIcon.addClass('atr-up');
      this.$scrollBarIconCtn.addStyle('top', bound.top + 'px');
    } else {
      this.$scrollBarIcon.addClass('atr-down');
      this.$scrollBarIconCtn.addStyle('top', bound.bottom - iconBound.height - 5 + 'px');
    }
  }
};

UserScrollIfNeed.prototype._showScrollTooltip = function (scroller, message, dir) {
  if (!message || !scroller || !dir || !dir.dy) {
    this.$scrollTooltip.remove();
    return;
  }

  if (!this.$scrollTooltip.parentElement) document.body.appendChild(this.$scrollTooltip);
  var sBound = scroller.getBoundingClientRect();
  var messageElt = this.md2HTMLElements(message);
  this.$scrollTooltipText.clearChild().addChild(messageElt);
  this.$scrollTooltip.addStyle('visibility', 'hidden');
  var tBound = this.$scrollTooltip.getBoundingClientRect();

  if (dir.dy > 0) {
    this.$scrollTooltip.removeClass('top').addClass('bottom');
    this.$scrollTooltip.addStyle({
      left: sBound.left + sBound.width / 2 - tBound.width / 2 + 'px',
      top: sBound.top + 'px',
      visibility: 'visible'
    });
  } else {
    this.$scrollTooltip.removeClass('bottom').addClass('top');
    this.$scrollTooltip.addStyle({
      left: sBound.left + sBound.width / 2 - tBound.width / 2 + 'px',
      top: sBound.bottom - tBound.height - 40 + 'px',
      visibility: 'visible'
    });
  }
};

UserScrollIfNeed.prototype.findVScroller = function (elt, dY) {
  var parent = elt.parentElement;
  var overflowStyle;

  while (parent) {
    overflowStyle = window.getComputedStyle(parent)['overflow'];

    if ((overflowStyle === 'auto' || overflowStyle === 'hidden auto' || overflowStyle === 'scroll' || parent.tagName === 'HTML') && parent.clientHeight < parent.scrollHeight) {
      return parent;
    }

    parent = parent.parentElement;
  }
};

UserScrollIfNeed.prototype.findScrollDir = function (elt, scroller) {
  var outBound;

  if (scroller) {
    outBound = scroller.getBoundingClientRect();
  } else {
    outBound = (0, _Dom.traceOutBoundingClientRect)(elt);
  }

  var bound = elt.getBoundingClientRect();
  var dx = 0;
  var dy = 0;

  if (outBound.height < bound.height * 1.2 && (true || outBound.height * 1.2 > bound.height)) {
    var delta = outBound.height * this.args.delta;
    var outStart = outBound.top + delta;
    var outEnd = outBound.bottom - delta;
    var outX = outStart + this.args.offset * (outEnd - outStart);
    var x = bound.top + this.args.offset * bound.height;

    if (Math.abs(x - outX) > delta) {
      if (outX < x) {
        dy = -1;
      } else {
        dy = 1;
      }
    }
  } else if (outBound.bottom < bound.bottom !== outBound.top > bound.top) {
    if (outBound.bottom < bound.bottom) {
      dy = -1;
    } else if (outBound.top > bound.top) {
      dy = 1;
    }
  }

  if (outBound.right < bound.right !== outBound.left > bound.left) {
    if (outBound.right < bound.right) {
      dx = -1;
    } else if (outBound.left > bound.left) {
      dx = 1;
    }
  }

  return {
    dx: dx,
    dy: dy
  };
};

UserScrollIfNeed.prototype.onStop = function () {
  this._showScroll(null);

  _BaseCommand.default.prototype.onStop.apply(this, arguments);

  this.$scrollBarIconCtn.remove();
  this.$scrollTooltip.remove();
};

_TutorEngine.default.installClass(UserScrollIfNeed);

_TutorNameManager.default.addAsync('userScrollIfNeed');

_TACData.default.define('userScrollIfNeed', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'scrollUpMessage',
    type: 'string'
  }, {
    name: 'scrollDownMessage',
    type: 'string'
  }, {
    name: 'offset',
    type: 'number(0->1)'
  }, {
    name: 'delta',
    type: 'number(0->1)'
  }],
  desc: "Yêu cầu người dùng scroll, hiện giờ chỉ hỗ trợ scroll dọc"
});

var _default = UserScrollIfNeed;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Net.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Net.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


var Net = {};
Net.properties = {};

Net.properties.downloadText = function (rqi) {
  return fetch(rqi).then(function (res) {
    return res.text();
  });
};

_TutorEngine.default.installFunction('downloadText', Net.properties.downloadText, true);

_TutorNameManager.default.addAsync('downloadText');

_TACData.default.define('downloadText', {
  type: 'function',
  args: [{
    name: 'rqi',
    type: 'string|RequestInfo'
  }],
  returns: 'string',
  desc: "Tải file về và trả ra string"
});

var _default = Net;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Logger.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Logger.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


var Logger = {};
Logger.properties = {};
Logger.properties.log = console.log.bind(console);

_TutorEngine.default.installFunction('log', Logger.properties.log, false);

_TutorNameManager.default.addAsync('log');

_TACData.default.define('log', {
  type: 'function',
  args: [{
    name: '...arg',
    type: 'any'
  }],
  returns: 'void',
  desc: "in ra console để debug"
});

var _default = Logger;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserMultiSelectMenu.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserMultiSelectMenu.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TACData = _interopRequireDefault(require("./TACData"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _TCommand = require("../engine/TCommand");

var _Tooltip = _interopRequireDefault(require("absol-acomp/js/Tooltip"));


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitDropdown() {
  _BaseState.default.apply(this, arguments);

  this.checkTO = -1;
}

_OOP.default.mixClass(StateWaitDropdown, _BaseState.default);

StateWaitDropdown.prototype.onStart = function () {
  this.command.highlightElt(this.command.elt);
  this.command.clickCb = this.ev_clickOut;
  this.command.onlyClickTo(this.command.elt);
  this.command.elt.on('click', this.ev_click);

  if (this.command.hadWrongAction && this.args.wrongMessage) {
    this.command.showTooltip(this.command.elt, this.args.wrongMessage);
  }
};

StateWaitDropdown.prototype.onStop = function () {
  if (this.checkTO > 0) clearTimeout(this.checkTO);
  this.command.elt.off('click', this.ev_click);
  this.command.clickCb = null;
};

StateWaitDropdown.prototype.delayCheck = function () {
  if (this.checkTO > 0) clearTimeout(this.checkTO);
  this.checkTO = setTimeout(function () {
    this.checkTO = -1;

    if (this.command.elt.$selectlistBox.isDescendantOf(document.body)) {
      this.goto('wait_pick_item');
    }
  }.bind(this), 10);
};

StateWaitDropdown.prototype.ev_click = function () {
  this.delayCheck();
};

StateWaitDropdown.prototype.ev_clickOut = function () {
  this.command.hadWrongAction = true;

  if (this.args.wrongMessage) {
    this.command.showTooltip(this.command.elt, this.args.wrongMessage);
  }
};
/***
 * @extends BaseState
 * @constructor
 */


function StateWaitPickItem() {
  _BaseState.default.apply(this, arguments);

  this.blinkTO = -1;
}

_OOP.default.mixClass(StateWaitPickItem, _BaseState.default);

_OOP.default.mixClass(StateWaitPickItem, _BaseState.default);

StateWaitPickItem.prototype.onStart = function () {
  document.body.addEventListener('mousedown', this.ev_click);
  this.command.highlightElt(this.command.elt.$selectlistBox);
  this.command.onlyClickTo(this.command.elt.$selectlistBox);
  this.command.clickCb = this.ev_clickOut;
  this.blinkTO = setTimeout(function () {
    this.blinkTO = -1;
    this.command.highlightElt(null);
  }.bind(this), 1000);
};

StateWaitPickItem.prototype.onStop = function () {
  document.body.removeEventListener('mousedown', this.ev_click);
  if (this.checkTO > 0) clearTimeout(this.checkTO);
  if (this.blinkTO > 0) clearTimeout(this.blinkTO);
  this.command.clickCb = null;
};

StateWaitPickItem.prototype.delayCheck = function () {
  if (this.checkTO > 0) clearTimeout(this.checkTO);
  this.checkTO = setTimeout(function () {
    this.checkTO = -1;

    if (!this.command.elt.$selectlistBox.isDescendantOf(document.body)) {
      this.goto('check_values');
    }
  }.bind(this), 100);
};

StateWaitPickItem.prototype.ev_click = function () {
  this.delayCheck();
};

StateWaitPickItem.prototype.ev_clickOut = function () {
  this.command.hadWrongAction = true;
};
/***
 * @extends BaseState
 * @constructor
 */


function StateCheckValues() {
  _BaseState.default.apply(this, arguments);

  this.checkTO = -1;
}

_OOP.default.mixClass(StateCheckValues, _BaseState.default);

StateCheckValues.prototype.onStart = function () {
  this.command.onlyClickTo(this.command.elt);
  var values = this.command.elt.values.slice();
  var requireValues = this.command.args.values || [];
  var requireDict = requireValues.reduce(function (ac, cr) {
    ac[cr] = true;
    return ac;
  }, {});

  for (var i = 0; i < values.length; ++i) {
    if (!requireDict[values[i]]) {
      this.command.needRemoveValue = values[i];
      this.goto('remove_item');
      return;
    }
  }

  if (values.length < requireValues.length) {
    this.goto('user_begin');
  } else {
    this.goto('finish');
  }
};
/***
 * @extends BaseState
 * @constructor
 */


function StateRemoveItem() {
  _BaseState.default.apply(this, arguments);

  this.checkTO = -1;
  this.blinkTO = -1;
}

_OOP.default.mixClass(StateRemoveItem, _BaseState.default);

StateRemoveItem.prototype.onStart = function () {
  this.updateItem();
  this.command.elt.on('change', this.ev_change);
  this.command.clickCb = this.ev_clickOut;
};

StateRemoveItem.prototype.onStop = function () {
  if (this.blinkTO > 0) {
    clearTimeout(this.blinkTO);
  }

  this.command.highlightElt(null);
  this.command.elt.off('change', this.ev_change);
};

StateRemoveItem.prototype.updateItem = function () {
  var value = this.command.needRemoveValue;
  this.needRemoveElt = this.command.elt.$items.find(function (elt) {
    return elt.value === value;
  });

  if (this.needRemoveElt) {
    this.command.highlightElt(this.needRemoveElt.$close);
    this.command.onlyClickTo(this.needRemoveElt.$close);
  } else {
    this.command.needRemoveValue = null;
    this.goto('check_values');
  }
};

StateRemoveItem.prototype.blinkElt = function (elt) {
  if (this.blinkTO > 0) clearTimeout(this.blinkTO);
  this.command.highlightElt(elt);
  this.blinkTO = setTimeout(function () {
    this.blinkTO = -1;
    this.command.highlightElt(null);
  }.bind(this), 500);
};

StateRemoveItem.prototype.ev_change = function () {
  _Tooltip.default.updatePosition();

  this.goto('check_values');
};

StateRemoveItem.prototype.ev_clickOut = function () {
  this.command.hadWrongAction = true;

  if (this.args.wrongMessage) {
    this.command.showTooltip(this.command.elt, this.args.wrongMessage);
  }
};
/***
 * @extends UserBaseAction
 * @constructor
 */


function UserMultiSelectMenu() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserMultiSelectMenu, _UserBaseAction.default);
UserMultiSelectMenu.prototype.name = 'userMultiSelectMenu';
UserMultiSelectMenu.prototype.className = 'UserMultiSelectMenu';
UserMultiSelectMenu.prototype.argNames = ['eltPath', 'values', 'message', 'wrongMessage', 'searchMessage'];
UserMultiSelectMenu.prototype.stateClasses['user_begin'] = StateWaitDropdown;
UserMultiSelectMenu.prototype.stateClasses['wait_pick_item'] = StateWaitPickItem;
UserMultiSelectMenu.prototype.stateClasses['check_values'] = StateCheckValues;
UserMultiSelectMenu.prototype.stateClasses['remove_item'] = StateRemoveItem; //
// UserMultiSelectMenu.prototype.nextActionState = function (stateName) {
//     this.actionState = stateName;
//     this.emitter.emit.apply(this.emitter, arguments);
// };
//
// UserMultiSelectMenu.prototype._verifyMultiSelectMenu = function (elt) {
//     if (!elt.containsClass || !elt.containsClass("as-multi-select-menu")) {
//         throw new Error("Type error: not a MultiSelectMenu(SelectBox)");
//     }
// };//10p
//
// UserMultiSelectMenu.prototype.onStateEntry = function () {
//     var thisC = this;
//     this.onlyClickTo(this.elt);
//     this.ifClickModal(function () {
//         thisC.hadWrongAction = true;
//         thisC.highlightElt(this.elt);
//     });
//
//     function onClick() {
//         if (thisC.elt.isFocus) {
//             thisC.elt.off('click', onClick);
//             thisC.ifClickModal(null);
//             thisC.highlightElt(null);
//             thisC.nextActionState('open_dropdown');
//         }
//     }
//
//     this.elt.on('click', onClick);
// };
//
//
// UserMultiSelectMenu.prototype.onStateOpenDropDown = function () {
//     var thisC = this;
//     this.onlyClickTo(this.elt.$selectlistBox);
//
//     function onMouseUp() {
//         setTimeout(function () {
//             if (thisC.elt.isFocus) {
//
//             }
//             else {
//                 document.removeEventListener('mouseup', onMouseUp);
//             }
//         }, 100);
//     }
//
//     document.addEventListener('mouseup', onMouseUp);
// };
//
// UserMultiSelectMenu.prototype.requestUserAction = function () {
//     var thisC = this;
//     this.elt = this.findNode(this.args.eltPath);
//     this._verifyMultiSelectMenu(this.elt);
//     return new Promise(function (resolve, reject) {
//         function clear() {
//             thisC.emitter.off('finish', onFinish)
//                 .off('cancel', onCancel);
//         }
//
//         var onCancel = function () {
//             clear();
//             reject();
//         }
//         var onFinish = function () {
//             clear();
//             resolve();
//         };
//         thisC.nextActionState('entry')
//     });
//
// };
//
// UserMultiSelectMenu.attachEnv = function (tutor, env) {
//     env.userMultiSelectMenu = function (eltPath, values, message, wrongMessage) {
//         return new UserMultiSelectMenu(tutor, {
//             eltPath: eltPath,
//             values: values,
//             message: message,
//             wrongMessage: wrongMessage
//         }).exec();
//     }
// };

_TutorEngine.default.installClass(UserMultiSelectMenu);

_TutorNameManager.default.addAsync('userMultiSelectMenu');

_TACData.default.define('userMultiSelectMenu', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'values',
    type: '(string|value)[]'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }, {
    name: 'searchMessage',
    type: 'string'
  }]
});

var _default = UserMultiSelectMenu;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/ShowConfirmToast.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/ShowConfirmToast.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _ShowToastMessage = _interopRequireDefault(require("./ShowToastMessage"));

var _TCommand = require("../engine/TCommand");

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _BaseState = _interopRequireDefault(require("./BaseState"));


/***
 * @extends BaseState
 * @constructor
 */
function StateShowMessage() {
  _BaseState.default.apply(this, arguments);
}

_OOP.default.mixClass(StateShowMessage, _BaseState.default);

StateShowMessage.prototype.onStart = function () {
  var command = this.command;
  var title = this.args.title;
  var text = this.args.text;
  var buttonText = this.args.buttonText;
  var variant = this.args.variant;
  var avoid = this.args.avoid;
  var pos = 'se';

  if (["se", "sw", "ne", "nw", 'sc'].indexOf(this.args.avoid) >= 0) {
    pos = avoid;
  }

  var self = this;

  var child = _BaseCommand.default.prototype.md2HTMLElements.call({
    $htmlRender: _BaseCommand.default.prototype.$htmlRender
  }, text);

  if (!(child instanceof Array)) child = [child];
  child.push({
    class: 'atr-confirm-toast-footer',
    child: {
      tag: 'flexiconbutton',
      props: {
        text: buttonText
      },
      on: {
        click: function () {
          command.$toast.disappear();
          self.goto('finish');
        }
      }
    }
  });
  command.$toast = _Toast.default.make({
    class: ['as-variant-background', 'atr-toast-message'],
    props: {
      htitle: title,
      disappearTimeout: 0,
      variant: variant,
      timeText: ''
    },
    child: child
  }, pos);
  command.$toast.$closeBtn.on('click', function () {
    self.goto('finish');
  });
  command.preventMouse(true);
  command.preventKeyBoard(true);
  command.avoidOverlay();
};

StateShowMessage.prototype.onStop = function () {
  this.command.$toast.disappear();
};
/***
 * @extends ShowToastMessage
 * @constructor
 */


function ShowConfirmToast() {
  _ShowToastMessage.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(ShowConfirmToast, _ShowToastMessage.default);
ShowConfirmToast.prototype.argNames = ['title', 'text', 'buttonText', 'variant', 'avoid'];
ShowConfirmToast.prototype.name = 'showConfirmToast';
ShowConfirmToast.prototype.stateClasses.entry = StateShowMessage;

_TutorEngine.default.installClass(ShowConfirmToast);

_TutorNameManager.default.addAsync('showConfirmToast');

_TACData.default.define('showConfirmToast', {
  type: 'function',
  args: [{
    name: 'title',
    type: 'string'
  }, {
    name: 'text',
    type: 'MarkdownString'
  }, {
    name: 'buttonText',
    type: 'string'
  }, {
    name: 'variant',
    type: 'VariantColorNamesMap'
  }, {
    name: 'avoid?',
    type: '(string|AElement)'
  }],
  desc: 'VariantColorNamesMap("primary" | "secondary" | "success" | "info" | "warning" | "error" | "danger" | "light" | "dark" | "link" | "note")'
});

var _default = ShowConfirmToast;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserDateInYearInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserDateInYearInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TCommand = require("../engine/TCommand");

var _BaseState = _interopRequireDefault(require("./BaseState"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _Core = require("../dom/Core");

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));


/***
 * @extends BaseState
 * @constructor
 */
function StateWaitDMCalendar() {
  _BaseState.default.apply(this, arguments);

  this.checkTO = -1;
}

_OOP.default.mixClass(StateWaitDMCalendar, _BaseState.default);

StateWaitDMCalendar.prototype.onStart = function () {
  this.command.highlightElt(this.command.elt);
  this.command.onlyClickTo(this.command.elt);
  this.command.clickCb = this.ev_clickOut;
  document.addEventListener('click', this.ev_click);

  if (this.command.hadWrongAction && this.args.wrongMessage) {
    this.command.showTooltip(this.command.elt, this.args.wrongMessage);
  }
};

StateWaitDMCalendar.prototype.onStop = function () {
  this.command.clickCb = null;
  clearTimeout(this.checkTO);
  document.removeEventListener('click', this.ev_click);
};

StateWaitDMCalendar.prototype.ev_click = function () {
  this.checkTO = setTimeout(function () {
    if (this.command.elt.share.$picker && this.command.elt.share.$picker.isDescendantOf(document.body)) {
      this.goto('choose_month');
    }
  }.bind(this), 30);
};

StateWaitDMCalendar.prototype.ev_clickOut = function () {
  this.command.hadWrongAction = true;

  if (this.args.wrongMessage) {
    this.command.showTooltip(this.command.elt, this.args.wrongMessage);
  }
};
/***
 * @extends BaseState
 * @constructor
 */


function StateChooseMonth() {
  _BaseState.default.apply(this, arguments);

  this.checkTO = -1;
  this.prevHighlightingElt = null;
}

_OOP.default.mixClass(StateChooseMonth, _BaseState.default);

StateChooseMonth.prototype.onStart = function () {
  this.command.highlightElt(this.command.elt.share.$picker);
  this.command.onlyClickTo(this.command.elt.share.$picker);
  this.checkTO = setTimeout(this.highlightMonth.bind(this), 400);
  this.command.$pickerCells = (0, _Core.$$)('.as-date-in-year-picker-cell', this.command.elt.share.$picker);
  this.command.$pickerCells[3].addStyle('pointer-events', 'none');

  if (this.command.hadWrongAction && this.args.wrongMessage) {
    this.command.showTooltip(this.command.elt.share.$picker, this.args.wrongMessage);
  }
};

StateChooseMonth.prototype.onStop = function () {
  clearTimeout(this.checkTO);
  this.command.$pickerCells[3].removeStyle('pointer-events');
};

StateChooseMonth.prototype.highlightMonth = function () {
  var picker = this.command.elt.share.$picker;
  var month = this.args.value.month;

  if (picker.value && picker.value.month === month) {
    this.goto('choose_date');
    return;
  }

  var monthBtnList = this.command.elt.share.$picker.$months;
  var targetBtnList = [monthBtnList[month], monthBtnList[month + 12], monthBtnList[month + 24]];
  var monthScroller = this.command.elt.share.$picker.$monthScroller;

  var scrollerRect = _Rectangle.default.fromClientRect(monthScroller.getBoundingClientRect());

  var scrollerCenterPoint = scrollerRect.centerPoint();
  var nearestBtn = targetBtnList.reduce(function (ac, cr) {
    var rect = _Rectangle.default.fromClientRect(cr.getBoundingClientRect());

    var dist = rect.centerPoint().sub(scrollerCenterPoint).abs();

    if (dist < ac.dist) {
      ac.button = cr;
      ac.dist = dist;
    }

    return ac;
  }, {
    button: null,
    dist: Infinity
  }).button;

  var nearestRect = _Rectangle.default.fromClientRect(nearestBtn.getBoundingClientRect());

  var needHighlightElt;

  if (nearestRect.collapsedSquare(scrollerRect) < nearestRect.square() * 0.8) {
    if (scrollerCenterPoint.sub(nearestRect.centerPoint()).y < 0) {
      needHighlightElt = this.command.elt.share.$picker.$monthDownBtn;
    } else {
      needHighlightElt = this.command.elt.share.$picker.$monthUpBtn;
    }
  } else {
    needHighlightElt = nearestBtn;
  }

  if (this.prevHighlightingElt !== needHighlightElt) {
    this.command.highlightElt(needHighlightElt);
    this.prevHighlightingElt = needHighlightElt;
  }

  this.checkTO = setTimeout(this.highlightMonth.bind(this), 100);
};
/***
 * @extends BaseState
 * @constructor
 */


function StateChooseDate() {
  _BaseState.default.apply(this, arguments);

  this.checkTO = -1;
  this.prevHighlightElt = null;
}

_OOP.default.mixClass(StateChooseDate, _BaseState.default);

StateChooseDate.prototype.onStart = function () {
  this.$picker = this.command.elt.share.$picker;
  this.command.onlyClickTo(this.command.elt.share.$picker);
  this.checkTO = setTimeout(this.check.bind(this), 400);
  this.command.$pickerCells = (0, _Core.$$)('.as-date-in-year-picker-cell', this.command.elt.share.$picker);
  this.command.$pickerCells[2].addStyle('pointer-events', 'none');
  this.command.highlightElt(this.command.$pickerCells[3].firstChild);

  if (this.command.hadWrongAction && this.args.wrongMessage) {
    this.command.showTooltip(this.command.elt.share.$picker, this.args.wrongMessage);
  }
};

StateChooseDate.prototype.onStop = function () {
  clearTimeout(this.checkTO);
  this.command.$pickerCells[2].removeStyle('pointer-events');
};

StateChooseDate.prototype.check = function () {
  if (this.$picker.value && this.$picker.value.date === this.args.value.date) {
    this.goto('wait_confirm');
    return;
  }

  if (!this.prevHighlightElt) {
    this.prevHighlightElt = this.$picker.$days[this.args.value.date - 1];
    this.command.highlightElt(this.prevHighlightElt);
  }

  this.checkTO = setTimeout(this.check.bind(this), 100);
};
/***
 * @extends BaseState
 * @constructor
 */


function StateWaitConfirm() {
  _BaseState.default.apply(this, arguments);

  this.checkTO = -1;
}

_OOP.default.mixClass(StateWaitConfirm, _BaseState.default);

StateWaitConfirm.prototype.onStart = function () {
  this.command.elt.share.$picker.addClass('atr-scroll-only');
  this.command.elt.share.$picker.addStyle('cursor', 'not-allowed');
  this.command.highlightElt(this.command.elt);
  document.addEventListener('click', this.ev_click);

  if (this.args.finishMessage) {
    this.command.showTooltip(this.command.elt, this.args.finishMessage);
  }
};

StateWaitConfirm.prototype.onStop = function () {
  this.command.elt.share.$picker.removeClass('atr-scroll-only');
  this.command.elt.share.$picker.removeStyle('cursor');
  document.removeEventListener('click', this.ev_click);
};

StateWaitConfirm.prototype.ev_click = function () {
  this.checkTO = setTimeout(function () {
    if (!this.command.elt.share.$picker.isDescendantOf(document.body)) {
      this.goto('finish');
    }
  }.bind(this), 30);
};
/***
 * @extends UserBaseAction
 * @constructor
 */


function UserDateInYearInput() {
  _UserBaseAction.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(UserDateInYearInput, _UserBaseAction.default);
UserDateInYearInput.prototype.className = 'UserDateInYearInput';
UserDateInYearInput.prototype.name = 'userDateInYearInput';
UserDateInYearInput.prototype.argNames = ['eltPath', 'value', 'message', 'wrongMessage', 'finishMessage'];
UserDateInYearInput.prototype.stateClasses['user_begin'] = StateWaitDMCalendar;
UserDateInYearInput.prototype.stateClasses['choose_month'] = StateChooseMonth;
UserDateInYearInput.prototype.stateClasses['choose_date'] = StateChooseDate;
UserDateInYearInput.prototype.stateClasses['wait_confirm'] = StateWaitConfirm;

UserDateInYearInput.prototype._isFocus = function (elt) {
  return document.hasFocus() && document.activeElement === elt;
};

UserDateInYearInput.prototype._waitOpenPicker = function () {
  var self = this;
  var elt = this.elt;
  return new Promise(function (resolve, reject) {
    function onClick() {
      setTimeout(function () {
        if (elt.share.$picker && elt.share.$picker.isDescendantOf(document.body)) {
          document.removeEventListener('click', onClick);
          self._rejectCb = null;
          resolve();
        }
      }, 10);
    }

    document.addEventListener('click', onClick);

    self._rejectCb = function () {
      document.removeEventListener('click', onClick);
      reject();
    };
  });
};

UserDateInYearInput.prototype._blinkCalendar = function () {
  var self = this;

  this._lockPicker();

  return new Promise(function (resolve, reject) {
    self.highlightElt(self.elt.share.$picker);
    self.onlyClickTo(self.elt.share.$picker);
    setTimeout(resolve, 500);

    self._rejectCb = function () {
      self._unlockPicker();

      reject();
    };
  });
};

UserDateInYearInput.prototype._lockPicker = function () {
  document.removeEventListener('click', this.elt.eventHandler.clickOut);
};

UserDateInYearInput.prototype._unlockPicker = function () {
  document.addEventListener('click', this.elt.eventHandler.clickOut);
};

UserDateInYearInput.prototype._waitChooseMonth = function () {
  var self = this;
  var value = this.args.value;
  return new Promise(function (resolve, reject) {
    self.highlightElt(null);
    self.elt.share.$picker.$months[value.month - 1 + 12].scrollIntoView();
    self.highlightElt(self.elt.share.$picker.$months[value.month - 1 + 12]);
    self.onlyClickTo(self.elt.share.$picker.$months[value.month - 1 + 12]);

    self._clickCb = function () {
      self.showTooltip(self.elt.share.$picker.$months[value.month - 1 + 12], self.args.wrongMessage);
    };

    function onClick() {
      self._clickCb = null;
      resolve();
    }

    self.elt.share.$picker.$months[value.month - 1 + 12].once('click', onClick);

    self._rejectCb = function () {
      self.elt.share.$picker.$months[value.month - 1 + 12].off('click', onClick);

      self._unlockPicker();

      reject();
    };
  });
};

UserDateInYearInput.prototype._waitChooseDate = function () {
  var self = this;
  var value = this.args.value;
  return new Promise(function (resolve, reject) {
    var dateElt = self.elt.share.$picker.$days[value.date - 1];
    self.highlightElt(dateElt);
    self.onlyClickTo(dateElt);

    function onClick() {
      resolve();
    }

    dateElt.once('click', onClick);

    self._rejectCb = function () {
      self._unlockPicker();

      dateElt.off('click', onClick);
      self.highlightElt(null);
      reject();
    };
  });
};

UserDateInYearInput.prototype._waitClose = function () {
  var self = this;
  return new Promise(function (resolve, reject) {
    self.highlightElt(self.elt);
    self.onlyClickTo(self.elt);
    var notNull = self.elt.notNull;
    self.elt.notNull = true;

    function onCLick(event) {
      self.elt.eventHandler.clickOut(event);
      self.elt.notNull = notNull;
      resolve();
    }

    self._clickCb = function () {
      self.showTooltip(self.elt, self.args.finishMessage || "Nhấn vào đây để xác nhận giá trị vừa chọn");
    };

    self.elt.once('click', onCLick);

    self._rejectCb = function () {
      self.elt.off('click', onCLick);
      self.elt.notNull = notNull;
      reject();
    };
  });
};

UserDateInYearInput.prototype.requestUserAction = function () {
  var thisC = this;
  /***
   *
   * @type {DateInYearInput}
   */

  var elt = thisC.tutor.findNode(thisC.args.eltPath);
  this.elt = elt;
  this.assignTarget(elt);
  var message = this.args.message;
  var wrongMessage = this.args.wrongMessage;
  this.highlightElt(elt);
  this.onlyClickTo(elt);

  this._clickCb = function () {
    this.showTooltip(elt, wrongMessage);
  }.bind(this);

  return this._waitOpenPicker().then(this._blinkCalendar.bind(this)).then(this._waitChooseMonth.bind(this)).then(this._waitChooseDate.bind(this)).then(this._waitClose.bind(this));
};

UserDateInYearInput.attachEnv = function (tutor, env) {
  env.userDateInYearInput = function (eltPath, value, message, wrongMessage, finishMessage) {
    return new UserDateInYearInput(tutor, {
      eltPath: eltPath,
      value: value,
      message: message,
      wrongMessage: wrongMessage,
      finishMessage: finishMessage
    }).exec();
  };
};

_TutorEngine.default.installClass(UserDateInYearInput);

_TutorNameManager.default.addAsync('userDateInYearInput');

var _default = UserDateInYearInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserFileInputBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserFileInputBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));


/***
 * @extends UserBaseAction
 * @constructor
 */
function UserFileInputBox() {
  _UserBaseAction.default.apply(this, arguments);
}

_OOP.default.mixClass(UserFileInputBox, _UserBaseAction.default);

UserFileInputBox.prototype._verifyInput = function (elt) {
  if (!elt.containsClass || !elt.containsClass('as-file-input-box')) {
    throw new Error('Type error: not a FileInputBox');
  } else if (!elt.allowUpload) {
    throw new Error('Element error: element is not allow upload(allowUpload=false)');
  }
};

UserFileInputBox.prototype._waitFile = function () {
  var self = this;
  var elt = this.elt;
  return new Promise(function (resolve, reject) {
    self.highlightElt(elt);
    self.onlyClickTo(elt);

    if (self.hadWrongAction && self.args.wrongMessage) {
      self.showTooltip(elt, self.args.wrongMessage);
    }

    var timeout = -1;

    function onClick() {
      self.highlightElt(null);
      self.onlyClickTo(null);
      timeout = setTimeout(waitFocus, 500);
    }

    elt.once('click', onClick);

    function waitFocus() {
      if (document.hasFocus()) {
        if (self.elt.value) {
          resolve(true);
        } else {
          resolve(false);
        }
      } else {
        timeout = setTimeout(waitFocus, 500);
      }
    }

    self._rejectCb = function () {
      elt.off('click', onClick);
      reject();
    };
  }).then(function (ok) {
    if (!ok) {
      self.hadWrongAction = true;
      return self._waitFile();
    }

    return true;
  });
};

UserFileInputBox.prototype.requestUserAction = function () {
  this.elt = this.tutor.findNode(this.args.eltPath);
  this.assignTarget(this.elt);

  this._verifyInput(this.elt);

  return this._waitFile();
};

UserFileInputBox.attachEnv = function (tutor, env) {
  env.userFileInputBox = function (eltPath, message, wrongMessage) {
    return new UserFileInputBox(tutor, {
      eltPath: eltPath,
      message: message,
      wrongMessage: wrongMessage
    }).exec();
  };
};

_TutorNameManager.default.addAsync('userFileInputBox');

_TACData.default.define('userFileInputBox', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }]
});

var _default = UserFileInputBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/UserFileListInput.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/UserFileListInput.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _UserBaseAction = _interopRequireDefault(require("./UserBaseAction"));


/***
 * @extends UserBaseAction
 * @constructor
 */
function UserFileListInput() {
  _UserBaseAction.default.apply(this, arguments);
}

_OOP.default.mixClass(UserFileListInput, _UserBaseAction.default);

UserFileListInput.prototype._verifyInput = function (elt) {
  if (!elt.containsClass || !elt.containsClass('as-file-list-input')) {
    throw new Error('Type error: not a FileInputBox');
  } else if (elt.readOnly) {
    throw new Error('Element error: element is not allow upload(allowUpload=false)');
  }
};

UserFileListInput.prototype._blinkInput = function () {
  var self = this;
  return new Promise(function (resolve, reject) {
    var timeout = setTimeout(function () {
      resolve();
    }, 500);

    self._rejectCb = function () {
      clearTimeout();
    };
  });
};

UserFileListInput.prototype._waitFile = function () {// var self = this;
  // var elt = this.elt;
  // return new Promise(function (resolve, reject) {
  //     self.highlightElt(elt);
  //     self.onlyClickTo(elt);
  //     var timeout = -1;
  //
  //     function onClick() {
  //         self.highlightElt(null);
  //         self.onlyClickTo(null);
  //         timeout = setTimeout(waitFocus, 500);
  //     }
  //
  //     elt.once('click', onClick);
  //
  //     function waitFocus() {
  //         if (document.hasFocus()) {
  //             if (self.elt.value) {
  //                 resolve(true);
  //             } else {
  //                 resolve(false);
  //             }
  //         } else {
  //             timeout = setTimeout(waitFocus, 500);
  //         }
  //     }
  //
  //     self._rejectCb = function () {
  //         elt.off('click', onClick);
  //         reject();
  //     }
  // }).then(function (ok) {
  //     if (!ok) return self._waitFile();
  //     return true;
  // });
};

UserFileListInput.prototype.requestUserAction = function () {
  this.elt = this.tutor.findNode(this.args.eltPath);
  this.assignTarget(this.elt);

  this._verifyInput(this.elt);

  return this._waitFile();
};

UserFileListInput.attachEnv = function (tutor, env) {
  env.userFileListInput = function (eltPath, fileCount, message, wrongMessage) {
    return new UserFileListInput(tutor, {
      eltPath: eltPath,
      fileCount: fileCount,
      message: message,
      wrongMessage: wrongMessage
    }).exec();
  };
};

_TutorNameManager.default.addAsync('userFileListInput');

_TACData.default.define('userFileListInput', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'fileCount',
    type: 'number'
  }, {
    name: 'message',
    type: 'string'
  }, {
    name: 'wrongMessage',
    type: 'string'
  }]
});

var _default = UserFileListInput;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Disappear.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Disappear.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseCommand = _interopRequireDefault(require("./BaseCommand"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _TCommand = require("../engine/TCommand");

var _Appear = require("./Appear");

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));


/***
 * @extends StateWaitEltAppear
 * @constructor
 */
function StateWaitEltDisappear() {
  _Appear.StateWaitEltAppear.apply(this, arguments);
}

_OOP.default.mixClass(StateWaitEltDisappear, _Appear.StateWaitEltAppear);

StateWaitEltDisappear.prototype.checkElt = function () {
  var now = new Date().getTime();
  this.timeOut = -1;
  var elt = this.command.findNode(this.args.eltPath, true);

  if (!this.isVisibility(elt)) {
    this.command.resolve(true);
  } else if (now > this.endTime) {
    this.command.resolve(false);
  } else {
    this.timeOut = setTimeout(this.checkElt.bind(this), Math.min(100, this.endTime - now));
  }
};
/***
 * @extends {BaseCommand}
 */


function Disappear() {
  _BaseCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(Disappear, _BaseCommand.default);
Disappear.prototype.className = 'Disappear';
Disappear.prototype.argNames = ['eltPath', 'timeout'];
Disappear.prototype.stateClasses.entry = StateWaitEltDisappear;
Disappear.prototype.name = 'DISAPPEAR';
Disappear.prototype.type = 'sync'; //it will return Promise

_TutorEngine.default.installClass(Disappear);

_TutorNameManager.default.addAsync('DISAPPEAR');

_TACData.default.define('DISAPPEAR', {
  type: 'function',
  args: [{
    name: 'eltPath',
    type: '(string|AElement)'
  }, {
    name: 'timeout',
    type: 'number'
  }],
  desc: "Trigger chờ element biến mất"
});

var _default = Disappear;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/util/findAllNodes.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/util/findAllNodes.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = findAllNodes;

var _Dom = require("absol/src/HTML5/Dom");

var _Core = require("../dom/Core");

var _TutorPath = _interopRequireDefault(require("../TutorPath"));


function findAllNodes(query, root) {
  if ((0, _Dom.isDomNode)(query)) return (0, _Core.$)(query);
  root = root || document.body;
  if (typeof query != 'string') return null;

  var tutorPath = _TutorPath.default.compile(query);

  var res = tutorPath.findAll(root);
  if (res && res.length > 0) res.forEach(function (e) {
    (0, _Core.$)(e);
  });
  return res;
}
};

moduleFactories["node_modules/absol-tutor/js/scriptor/QuerySelectorAll.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/QuerySelectorAll.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TCommand = _interopRequireWildcard(require("../engine/TCommand"));

var _findNode = _interopRequireDefault(require("../util/findNode"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));

var _findAllNodes = _interopRequireDefault(require("../util/findAllNodes"));




/***
 * @extends TCommand
 * @constructor
 */
function QuerySelectorAll() {
  _TCommand.default.apply(this, arguments);
}

(0, _TCommand.inheritCommand)(QuerySelectorAll, _TCommand.default);
QuerySelectorAll.prototype.className = 'QuerySelectorAll';
QuerySelectorAll.prototype.name = '$$';
QuerySelectorAll.prototype.type = 'sync';
QuerySelectorAll.prototype.argNames = ['query', 'inNode'];

QuerySelectorAll.prototype.exec = function () {
  return (0, _findAllNodes.default)(this.args.query, this.args.inNode);
};

_TutorEngine.default.installClass(QuerySelectorAll);

var _default = QuerySelectorAll;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/Utils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/Utils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _TutorNameManager = _interopRequireDefault(require("./TutorNameManager"));

var _TACData = _interopRequireDefault(require("./TACData"));

var _TutorEngine = _interopRequireDefault(require("./TutorEngine"));


var Utils = {};
Utils.properties = {};

Utils.properties.EQUAL_NUMBER = function (number, delta) {
  delta = delta || 0;
  return function (value) {
    if (typeof value === "string") {
      value = parseFloat(value);
    }

    if (Math.abs(number - value) <= delta) return true;
    return false;
  };
};

_TutorEngine.default.installFunction('EQUAL_NUMBER', Utils.properties.EQUAL_NUMBER, false);

_TutorNameManager.default.addAsync('EQUAL_NUMBER');

_TACData.default.define('EQUAL_NUMBER', {
  type: 'function',
  args: [{
    name: 'value',
    type: 'string|number'
  }],
  returns: 'function',
  desc: "So sánh số"
});

var _default = Utils;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/expressionList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/expressionList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Explain = _interopRequireDefault(require("./Explain"));

var _Timeout = _interopRequireDefault(require("./Timeout"));

var _PressAnyKey = _interopRequireDefault(require("./PressAnyKey"));

var _ClickAnyWhere = _interopRequireDefault(require("./ClickAnyWhere"));

var _Earliest = _interopRequireDefault(require("./Earliest"));

var _Latest = _interopRequireDefault(require("./Latest"));

var _ShowSnackBar = _interopRequireDefault(require("./ShowSnackBar"));

var _Appear = _interopRequireDefault(require("./Appear"));

var _QuerySelector = _interopRequireDefault(require("./QuerySelector"));

var _UserClick = _interopRequireDefault(require("./UserClick"));

var _UserCheckbox = _interopRequireDefault(require("./UserCheckbox"));

var _UserInputText = _interopRequireDefault(require("./UserInputText"));

var _SetRootView = _interopRequireDefault(require("./SetRootView"));

var _UserSelectMenu = _interopRequireDefault(require("./UserSelectMenu"));

var _ShowToastMessage = _interopRequireDefault(require("./ShowToastMessage"));

var _UserCalendarInput = _interopRequireDefault(require("./UserCalendarInput"));

var _DateTime = _interopRequireDefault(require("./DateTime"));

var _UserQuickMenu = _interopRequireDefault(require("./UserQuickMenu"));

var _UserLevel2Menu = _interopRequireDefault(require("./UserLevel2Menu"));

var _Delay = _interopRequireDefault(require("./Delay"));

var _UserSwitchTabIfNeed = _interopRequireDefault(require("./UserSwitchTabIfNeed"));

var _UserSwitchTab = _interopRequireDefault(require("./UserSwitchTab"));

var _UserScrollIfNeed = _interopRequireDefault(require("./UserScrollIfNeed"));

var _Net = _interopRequireDefault(require("./Net"));

var _Logger = _interopRequireDefault(require("./Logger"));

var _UserMultiSelectMenu = _interopRequireDefault(require("./UserMultiSelectMenu"));

var _ShowConfirmToast = _interopRequireDefault(require("./ShowConfirmToast"));

var _UserDateInput = _interopRequireDefault(require("./UserDateInput"));

var _UserDateInYearInput = _interopRequireDefault(require("./UserDateInYearInput"));

var _UserFileInputBox = _interopRequireDefault(require("./UserFileInputBox"));

var _UserFileListInput = _interopRequireDefault(require("./UserFileListInput"));

var _Disappear = _interopRequireDefault(require("./Disappear"));

var _QuerySelectorAll = _interopRequireDefault(require("./QuerySelectorAll"));

var _Utils = _interopRequireDefault(require("./Utils"));


var commandList = [_QuerySelector.default, _QuerySelectorAll.default, _SetRootView.default, _Explain.default, _Timeout.default, _DateTime.default, _PressAnyKey.default, _ClickAnyWhere.default, _Earliest.default, _Latest.default, _ShowSnackBar.default, _Appear.default, _Disappear.default, _QuerySelector.default, _UserClick.default, _UserCheckbox.default, _UserInputText.default, _UserSelectMenu.default, _ShowToastMessage.default, _ShowConfirmToast.default, _UserCalendarInput.default, _UserDateInput.default, _UserQuickMenu.default, _UserLevel2Menu.default, _UserSwitchTabIfNeed.default, _UserSwitchTab.default, _Delay.default, _UserScrollIfNeed.default, _UserMultiSelectMenu.default, _UserDateInYearInput.default, _UserFileInputBox.default, _UserFileListInput.default, _Net.default, _Logger.default, _Utils.default];
var _default = commandList;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/Tutor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/Tutor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _expressionList = _interopRequireDefault(require("./scriptor/expressionList"));

var _findNode = _interopRequireDefault(require("./util/findNode"));

var _findAllNodes = _interopRequireDefault(require("./util/findAllNodes"));

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _stringUtils = require("absol/src/String/stringUtils");

var _TutorEngine = _interopRequireDefault(require("./scriptor/TutorEngine"));

var _safeThrow = _interopRequireDefault(require("absol/src/Code/safeThrow"));


/***
 * @augments Context
 * @param view
 * @param script
 * @param option
 * @constructor
 */
function Tutor(view, script, option) {
  _EventEmitter.default.call(this);

  _Context.default.call(this);

  this.$view = view;
  /***
   *
   * @type {*|TProgram}
   */

  this.prorgram = this.programCache[(0, _stringUtils.stringHashCode)(script)] || _TutorEngine.default.compile(script);
  /***
   *
   * @type {TProcess}
   */

  this.process = this.prorgram.newProcess();
  this.process.tutor = this;
  this.option = Object.assign({
    messageDelay: 300
  }, option);
  this.debug.status = 'NOT_START';
}

_OOP.default.mixClass(Tutor, _EventEmitter.default, _Context.default);

Tutor.prototype.programCache = {};

Tutor.prototype.exec = function () {
  this.debug.status = "RUNNING";
  return this.process.exec().then(function (result) {
    this.debug.status = "FINISH";
    return result;
  }.bind(this)).catch(function (error) {
    (0, _safeThrow.default)(error);

    if (error instanceof Error) {
      this.debug.status = "ERROR";
      throw error;
    }
  }.bind(this));
};

Tutor.prototype.stop = function () {
  this.process.stop();
};

Tutor.prototype.findNode = function (query, unsafe) {
  var elt = (0, _findNode.default)(query, this.$view);
  if (!elt && !unsafe) throw new Error('Can not find element with query="' + query + '"');
  return elt;
};

Tutor.prototype.findAllNode = function (query) {
  return (0, _findAllNodes.default)(query, this.$view);
};

Tutor.prototype.getStatus = function () {
  if (this.debug.status === "NOT_START") return {
    status: "NOT_START"
  };
  if (this.debug.status === "RUNNING" || this.debug.status === "ERROR") return {
    status: this.debug.status,
    code: this.process.program.code.substr(this.debug.loc.start, this.debug.loc.end - this.debug.loc.start),
    row: this.debug.loc.row - 1,
    col: this.debug.loc.col
  };
  return {
    status: "FINISH"
  };
};

Object.defineProperty(Tutor.prototype, 'debug', {
  get: function () {
    return this.process.debug;
  }
});
var _default = Tutor;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/runScriptFromUrl.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/runScriptFromUrl.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = runScriptFromUrl;

var _Tutor = _interopRequireDefault(require("./Tutor"));


function runScriptFromUrl(url, elt) {
  return fetch(url).then(function (res) {
    return res.text();
  }).then(function (text) {
    elt = elt || document.body;
    var tutor = new _Tutor.default(elt, text);
    return tutor.exec();
  });
}

;
};

moduleFactories["node_modules/absol-tutor/js/scriptor/TutorACECompleter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/scriptor/TutorACECompleter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/ace.css");

var _TACData = _interopRequireDefault(require("./TACData"));

var _stringMatching = require("absol/src/String/stringMatching");


function TutorACECompleter() {
  this.name = 'absol';
  this.spaceRex = /\s+/;
  this.structIdent = {
    identifier: true,
    'variable.language': true,
    'support.constant': true
  };
}

TutorACECompleter.prototype._getArgs = function (func) {
  var args = (func.toString().match(/function\s.*?\(([^)]*)\)/) || ['', ''])[1];
  return args.split(',').map(function (arg) {
    return arg.replace(/\/\*.*\*\//, '').trim();
  }).filter(function (arg) {
    return arg;
  });
};

TutorACECompleter.prototype._jsTrackStruct = function (session, pos, prefix) {
  var res = [];
  var track = [];
  var tokenIto = new ace.TokenIterator(session, pos.row, pos.column);
  var firstToken;

  while (true) {
    var token = tokenIto.getCurrentToken();
    if (token == undefined) break;

    if (!this.spaceRex.test(token.value)) {
      if (token.value != '.' && !this.structIdent[token.type]) break;
      if (!firstToken) firstToken = token.value;

      if (this.structIdent[token.type]) {
        track.push(token.value);
      }
    }

    tokenIto.stepBackward();
  }

  if (firstToken !== '.' && track.length > 0 && prefix === track[0]) track.shift();
  var currentKey;
  var currentObj = _TACData.default;

  for (var i = track.length - 1; i >= 0; --i) {
    currentKey = track[i];
    currentObj = currentObj.properties && currentObj.properties[currentKey];
    if (!currentObj) break;
  }

  if (currentObj) {
    var keyHolders = Object.keys(currentObj.properties).map(function (key) {
      var score = 0;

      if (key.startsWith(prefix)) {
        score += 1 + prefix.length / (key.length + 1);
      }

      if (prefix.length > 0) score += (0, _stringMatching.wordLike)(key, prefix);
      return {
        key: key,
        score: score
      };
    });
    keyHolders.sort(function (a, b) {
      return b.score - a.score;
    });
    keyHolders.forEach(function (holder) {
      var item = {
        name: holder.key,
        value: holder.key,
        score: 1000000 + holder.score * 100,
        meta: 'tutor'
      };
      var propertyDesc = currentObj.properties && currentObj.properties[holder.key];

      if (propertyDesc) {
        item.type = propertyDesc.type;

        if (item.type === 'function') {
          item.args = propertyDesc.args;
          item.returns = propertyDesc.returns;
          item.desc = propertyDesc.desc;
        }
      }

      res.push(item);
    });
  }

  return res;
};

TutorACECompleter.prototype._jsTrackLocalValue = function (session, pos, prefix) {
  var res = [];
  var tokenIto = new ace.TokenIterator(session, pos.row, pos.column);
  var currentToken = tokenIto.getCurrentToken();

  if (currentToken && currentToken.value === prefix || pos.column == 0) {
    tokenIto.stepBackward();
    currentToken = tokenIto.getCurrentToken();
  }

  if (currentToken && currentToken.value === '.') return res;
  var lastIdentifier = false;

  while (currentToken) {
    if (currentToken.type === "identifier") {
      lastIdentifier = currentToken.value;
    } else if (currentToken.type === 'storage.type') {
      if (lastIdentifier) {
        var item = {
          value: lastIdentifier,
          meta: currentToken.value,
          score: 1000001
        };
        res.push(item);
        lastIdentifier = false;
      }
    } else if (!this.spaceRex.test(currentToken.value)) {
      lastIdentifier = false;
    }

    tokenIto.stepBackward();
    currentToken = tokenIto.getCurrentToken();
  }

  return res;
};

TutorACECompleter.prototype.getCompletions = function (editor, session, pos, prefix, callback) {
  if (session.getMode().$id !== "ace/mode/javascript") {
    callback(null, []);
    return;
  }

  var completions = [];
  completions.push.apply(completions, this._jsTrackStruct(session, pos, prefix));
  completions.push.apply(completions, this._jsTrackLocalValue(session, pos, prefix));
  completions.sort(function (a, b) {
    if (a.score !== b.score) return a.score - b.score;
    var x = a.value.toUpperCase();
    var y = b.value.toUpperCase();
    return x === y ? 0 : x > y ? 1 : -1;
  });
  callback(null, completions);
};

TutorACECompleter.prototype.getDocTooltip = function (item) {
  if (item.type === "function" && !item.docHTML) {
    var html = ['<div class="atr-ace-tooltip-define">', '<span class="ace_storage ace_type">function</span>', '<span class="ace_paren ace_lparen">(</span>'].concat([item.args.map(function (arg) {
      if (typeof arg === "object") {
        arg = arg.name + ':' + arg.type;
      }

      return '<span class="ace_identifier">' + arg + '</span>';
    }).join('<span class="ace_punctuation ace_operator">, </span>')]).concat(['<span class="ace_paren ace_rparen">)</span>']);

    if (item.returns) {
      html.push('<span>:' + item.returns + '</span>');
    }

    html.push('</div>');

    if (item.desc) {
      html.push('<p class="atr-ace-tooltip-desc">' + item.desc + '</p>');
    }

    item.docHTML = html.join("");
  }
};

if (window.ace) {
  var langTools = ace.acequire('ace/ext/language_tools');
  ace.TokenIterator = ace.TokenIterator || ace.acequire("ace/token_iterator").TokenIterator;
  if (langTools) langTools.addCompleter(new TutorACECompleter()); // data stub:

  var sqlTables = [{
    name: 'users',
    description: 'Users in the system'
  }, {
    name: 'userGroups',
    description: 'User groups to which users belong'
  }, {
    name: 'customers',
    description: 'Customer entries'
  }, {
    name: 'companies',
    description: 'Legal entities of customers'
  }, {
    name: 'loginLog',
    description: 'Log entries for user log-ins'
  }, {
    name: 'products',
    description: 'Products offered in the system'
  }, {
    name: 'productCategories',
    description: 'Different product categories'
  }];
}

var _default = TutorACECompleter;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/app/SplitEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/app/SplitEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Core = require("../dom/Core");

var _absolBrace = _interopRequireDefault(require("absol-brace"));

require("../../css/spliteditor.css");

require("absol-form/css/cmdtool.css");

require("../scriptor/TutorACECompleter");


/***
 * @augments Fragment
 * @param channel
 * @param id
 * @constructor
 */
function SplitEditor(channel, id) {
  _Fragment.default.call(this);
}

_OOP.default.mixClass(SplitEditor, _Fragment.default);

SplitEditor.prototype.createView = function () {
  this.$view = (0, _Core._)({
    class: "atr-split-editor",
    child: ['p.atr-split-editor-ace']
  });
  this.$editor = (0, _Core.$)('p.atr-split-editor-ace', this.$view);
  this.editor = _absolBrace.default.ace.edit(this.$editor);
  this.editor.getSession().setMode("ace/mode/javascript");
  this.editor.setOptions({
    enableBasicAutocompletion: true,
    enableSnippets: true,
    enableLiveAutocompletion: false
  });

  if (window['TUTOR_LOCAL_SAVE']) {
    this.editor.on('change', this.localSaveDelay.bind(this));
  }
};

SplitEditor.prototype.localSaveDelay = function () {
  var thisSE = this;

  if (this._saveTimeout >= 0) {
    clearTimeout(this._saveTimeout);
  }

  this._saveTimeout = setTimeout(function () {
    var script = thisSE.editor.getValue();
    localStorage.setItem('TUTOR_MASTER_SCRIPT', script);
  }, 1000);
};

SplitEditor.prototype.setValue = function (data) {
  this.editor.setValue(data);
};

SplitEditor.prototype.getValue = function () {
  return this.editor.getValue();
};

var _default = SplitEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/app/FlagManager.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/app/FlagManager.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/fragmanager.css");

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _Core = require("../dom/Core");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

require("absol-form/css/propertyeditor.css");

var _OnsScreenWindow = _interopRequireDefault(require("absol-acomp/js/OnsScreenWindow"));


/***
 * @extends Fragment
 * @constructor
 */
function FlagManager() {
  _Fragment.default.call(this);

  this.flag = {};
  this.readSetting();
}

_OOP.default.mixClass(FlagManager, _Fragment.default);

FlagManager.prototype.STORE_KEY = "ABSOL_FLAG";

FlagManager.prototype.readSetting = function () {
  var flagText = localStorage.getItem(this.STORE_KEY) || '{}';
  var newFlag = {};

  try {
    newFlag = JSON.parse(flagText);
  } catch (err) {}

  this.applyFlag(newFlag);
};

FlagManager.prototype.applyFlag = function (newFlag, save) {
  Object.keys(Object.assign({}, this.flag, newFlag)).forEach(function (key) {
    if (key in window) {
      if (key in newFlag) {
        window[key] = newFlag[key];
      } else {
        delete window[key];
      }
    } else {
      if (key in newFlag) {
        window[key] = newFlag[key];
      }
    }
  });
  this.flag = newFlag;
  if (save) this.saveSetting();
};

FlagManager.prototype.saveSetting = function () {
  localStorage.setItem(this.STORE_KEY, JSON.stringify(this.flag));
};

FlagManager.prototype.createView = function () {
  /****
   * @type {OnScreenWindow}
   */
  this.$view = (0, _Core._)({
    tag: 'onscreenwindow',
    class: 'atr-flag-manager',
    style: {
      width: '400px',
      height: '400px',
      top: '20px',
      left: 'calc(100vw - 420px)'
    },
    props: {
      windowTitle: "Flag Manager",
      windowActions: [{
        icon: 'span.mdi.mdi-close',
        name: 'close'
      }]
    },
    child: [{
      class: ['as-property-editor', 'as-bscroller'],
      style: {
        width: '100%',
        height: '100%',
        overflow: 'auto'
      },
      child: {
        tag: 'table',
        style: {
          width: '100%'
        },
        child: ['<thead><tr><td>key</td><td>value</td><td></td></tr></thead>', {
          tag: 'tbody',
          child: [{
            tag: 'tr',
            class: 'atr-add-flag-row',
            child: [{
              tag: 'td',
              attr: {
                colspan: '3'
              },
              style: {
                textAlign: 'center'
              },
              child: 'span.mdi.mdi-plus'
            }]
          }]
        }]
      }
    }]
  });
  this.$tbody = (0, _Core.$)('.as-property-editor tbody', this.$view);
  this.$addRow = (0, _Core.$)('.atr-add-flag-row', this.$view).on('click', this._addRow.bind(this, '', false));

  for (var key in this.flag) {
    this._addRow(key, this.flag[key]);
  }

  this.$view.on('action', event => {
    if (event.actionData.name === 'close') this.stop();
  });
};

FlagManager.prototype.onResume = function () {
  var view = this.getView();

  if (!view.isDescendantOf(document.body)) {
    document.body.appendChild(view);
  }
};

FlagManager.prototype._updateInputColor = function () {
  var dict = {};
  (0, _Core.$)('input.atr-flag-name', this.$tbody, function (inputELt) {
    var value = inputELt.value.trim();

    if (value) {
      if (dict[value]) {
        inputELt.addStyle('border-color', 'red');
      } else {
        inputELt.removeStyle('border-color');
        dict[value] = true;
      }
    } else {
      inputELt.addStyle('border-color', 'rgb(150, 255, 0)');
    }
  });
};

FlagManager.prototype._getFlagFromInput = function () {
  var res = {};
  (0, _Core.$)('.atr-flag-row', this.$tbody, function (rowElt) {
    var p = rowElt.getFlag && rowElt.getFlag();

    if (p) {
      res[p.key] = p.value;
    }
  });
  return res;
};

FlagManager.prototype._addRow = function (key, value) {
  var thisFM = this;
  var newRow = (0, _Core._)({
    tag: 'tr',
    class: 'atr-flag-row',
    child: ['td', 'td', 'td']
  });
  var name = (0, _Core._)('input.atr-flag-name').addTo(newRow.childNodes[0]);
  name.value = key || '';
  var value = (0, _Core._)({
    tag: 'selectmenu',
    props: {
      items: [{
        text: 'TRUE',
        value: true
      }, {
        text: 'FALSE',
        value: false
      }],
      value: !!value
    }
  }).addStyle('width', '50px').addTo(newRow.childNodes[1]);
  value.on('change', function () {
    thisFM.applyFlag(thisFM._getFlagFromInput(), true);
  });
  var deleteBtn = (0, _Core._)('span.mdi.mdi-trash-can-outline').addTo(newRow.childNodes[2]).on('click', function () {
    newRow.remove();
    thisFM.applyFlag(thisFM._getFlagFromInput(), true);
  });
  name.on('change', function () {
    thisFM.applyFlag(thisFM._getFlagFromInput(), true);
  }).on('keyup', function (event) {
    if (event.key === 'Enter') {
      this.blur();
    }

    thisFM._updateInputColor();
  });
  this.$tbody.addChildBefore(newRow, this.$addRow);

  newRow.getFlag = function () {
    if (name.value) return {
      key: name.value,
      value: value.value
    };
  };

  this._updateInputColor();
};

FlagManager.prototype.onPause = function () {
  var view = this.getView();

  if (view.isDescendantOf(document.body)) {
    view.remove();
  }
};
/***
 *
 * @param {string} key
 * @param {boolean=} value
 */


FlagManager.prototype.add = function (key, value) {
  if (!key || typeof key != 'string') return;
  if (key in this.flag) return;

  if (typeof value != "boolean") {
    value = !!window[key];
  }

  window[key] = value;
  this.flag[key] = value;
  this.saveSetting();
  if (this.$view) this._addRow(key, value);
};

var _default = new FlagManager();

exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/app/Inspector.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/app/Inspector.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Context = _interopRequireDefault(require("absol/src/AppPattern/Context"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Tooltip = _interopRequireDefault(require("absol-acomp/js/Tooltip"));

var _Core = require("../dom/Core");

require("../../css/inspector.css");

var _Dom = require("absol/src/HTML5/Dom");

var _BaseEditor = _interopRequireDefault(require("absol-form/js/core/BaseEditor"));

var _OnsScreenWindow = _interopRequireDefault(require("absol-acomp/js/OnsScreenWindow"));

var _ExpTree = _interopRequireDefault(require("absol-acomp/js/ExpTree"));

var _Clipboard = require("absol/src/HTML5/Clipboard");

var _Snackbar = _interopRequireDefault(require("absol-acomp/js/Snackbar"));

var _utils = require("absol-acomp/js/utils");


/***
 * @extends BaseEditor
 * @constructor
 */
function Inspector() {
  _BaseEditor.default.call(this);

  this.ev_mouseenter = this.ev_mouseenter.bind(this);

  this._createBox();

  this._createTreeWindow();
}

_OOP.default.mixClass(Inspector, _BaseEditor.default);

Inspector.prototype.CONFIG_STORE_KEY = "TUTOR_INSPECTOR_SETTING";
Inspector.prototype.config = {
  inspectedTreeWindow: {
    x: 1,
    y: 58,
    width: 15,
    height: 40
  }
};

Inspector.prototype.onResume = function () {
  document.body.addEventListener('mouseover', this.ev_mouseenter);
  this.$treeWindow.addTo(document.body);
};

Inspector.prototype.onPause = function () {
  document.body.removeEventListener('mouseover', this.ev_mouseenter);
  this.$box.remove();
  this.$treeWindow.remove();
};

Inspector.prototype._createBox = function () {
  this.$box = (0, _Core._)({
    class: 'atr-inspector-rect',
    child: {
      class: 'atr-inspector-rect-text',
      child: {
        text: ''
      }
    }
  });
  this.$text = (0, _Core.$)('.atr-inspector-rect-text', this.$box);
};

Inspector.prototype._createTreeWindow = function () {
  this.$treeWindow = (0, _Core._)({
    tag: _OnsScreenWindow.default.tag,
    style: {
      zIndex: 1900000000,
      top: this.config.inspectedTreeWindow.y + 'vh',
      left: this.config.inspectedTreeWindow.x + 'vw',
      width: this.config.inspectedTreeWindow.width + 'vw',
      height: this.config.inspectedTreeWindow.height + 'vh'
    },
    props: {
      windowTitle: 'Inspected Tree'
    },
    child: [{
      class: 'atr-inspector-tree-ctn',
      child: {
        tag: _ExpTree.default.tag,
        props: {
          name: ':root',
          icon: 'span.mdi.mdi-source-commit-start-next-local',
          status: 'open'
        }
      }
    }, {
      class: 'atr-inspector-tree-footer',
      child: {
        text: 'Tip: click to copy path'
      }
    }]
  });
  /***
   *
   * @type {ExpTree}
   */

  this.$tree = (0, _Core.$)('exptree', this.$treeWindow);
};

Inspector.prototype.tag2Icon = {
  'default': 'span.mdi.mdi-source-commit-start-next-local',
  'selectmenu': 'span.mdi.mdi-menu-open',
  'quickmenutrigger': 'span.mdi.mdi-dots-vertical-circle-outline',
  'checkbox': 'span.mdi.mdi-check-box-outline',
  'text-input': 'span.mdi.mdi-form-textbox'
};
/**
 *
 * @param {Array<string>} path
 * @param {string} tagName
 */

Inspector.prototype.addNode = function (path, tagName) {
  var current = this.$tree;
  var prev = null;

  for (var i = 0; i < path.length; ++i) {
    prev = current;
    prev.status = 'open';
    current = prev.accessByPath([path[i]]);

    if (!current) {
      current = (0, _Core._)({
        tag: _ExpTree.default.tag,
        extendEvent: 'contextmenu',
        props: {
          name: path[i]
        },
        on: {
          press: function (event) {
            var path = this.getPath();
            path.shift();
            (0, _Clipboard.copyText)(JSON.stringify(path.join(' ')));

            _Snackbar.default.show('Copy: ' + JSON.stringify(path.join(' ')));
          }
        }
      });

      if (i + 1 === path.length) {
        current.icon = this.tag2Icon[tagName] || this.tag2Icon.default;
      } else {
        current.icon = this.tag2Icon.default;
      }

      prev.addChild(current);
    }

    if (i + 1 === path.length) {
      if (this.$lastActiveNode) {
        this.$lastActiveNode.active = false;
      }

      this.$lastActiveNode = current;
      this.$lastActiveNode.active = true;
      (0, _utils.vScrollIntoView)(this.$lastActiveNode.getNode());
    }
  }
};

Inspector.prototype.ev_mouseenter = function (event) {
  if (!event.ctrlKey) return;
  var target = event.target;
  var elt;
  var idPath = [];
  var tooltipText = [];

  while (target) {
    if (target.classList.contains('absol-selectlist-item') && !(target.parentElement && target.parentElement.classList.contains('absol-selectmenu-holder-item'))) {
      elt = target;
      break;
    }

    var tutorId = target.getAttribute('data-tutor-id') || target['data-tutor-id'] || target['data-tutor-id'];

    if (tutorId) {
      if (!elt) elt = target;
      idPath.unshift(tutorId);
    }

    target = target.parentElement;
  }

  target = elt;
  var tagName = 'default';

  if (target) {
    if (idPath.length > 0) {
      tooltipText.push('id = ' + JSON.stringify(idPath[idPath.length - 1]));
      if (idPath.length > 1) tooltipText.push('path = ' + JSON.stringify(idPath.join(' ')));
      if (target.classList.contains('absol-selectmenu')) tagName = 'selectmenu';
      if (target.classList.contains('as-quick-menu-trigger')) tagName = 'quickmenutrigger';
      if (target.classList.contains('absol-checkbox')) tagName = 'checkbox';
      if (target.tagName === 'INPUT' && target.type === 'text') tagName = 'text-input';
      this.addNode(idPath, tagName);
    }

    if (target.classList.contains('absol-selectlist-item') || target.classList.contains('absol-selectmenu')) {
      if (target.value === 0 || target.value) tooltipText.push('value= <strong>' + target.value + '</strong>');
    }

    if (tooltipText.length > 0) {
      this.$text.innerHTML = tooltipText.join('  ');
      var bound = target.getBoundingClientRect();
      this.$box.addStyle({
        width: bound.width + 2 + 'px',
        height: bound.height + 2 + 'px',
        left: bound.left - 1 + 'px',
        top: bound.top - 1 + 'px'
      }).addTo(document.body);
      var textBound = this.$text.getBoundingClientRect();
      var screen = (0, _Dom.getScreenSize)();

      if (bound.top < textBound.height) {
        this.$box.addClass('atr-bottom');
      } else {
        this.$box.removeClass('atr-bottom');
      }

      if (bound.left + textBound.width > screen.width) {
        this.$box.addClass('atr-left');
      } else {
        this.$box.removeClass('atr-left');
      }
    }
  }

  if (!target) {
    this.$box.remove();
  }
};

var _default = Inspector;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/app/TutorMaster.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/app/TutorMaster.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Tutor = _interopRequireDefault(require("../Tutor"));

var _Icon = require("../dom/Icon");

require("../../css/tutormaster.css");

var _utils = require("absol-acomp/js/utils");

var _Core = require("../dom/Core");

var _FlagManager = _interopRequireDefault(require("./FlagManager"));

var _Toast = _interopRequireDefault(require("absol-acomp/js/Toast"));

var _Inspector = _interopRequireDefault(require("./Inspector"));

var _BaseEditor = _interopRequireDefault(require("absol-form/js/core/BaseEditor"));

var _OnsScreenWindow = _interopRequireDefault(require("absol-acomp/js/OnsScreenWindow"));

var _Dom = require("absol/src/HTML5/Dom");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _SplitEditor = _interopRequireDefault(require("./SplitEditor"));


var dependentSrc = (0, _Core.$)('script', false, function (elt) {
  if (elt.src && elt.src.indexOf('absol.dependents.js') >= 0) {
    return true;
  }
});
dependentSrc = dependentSrc && dependentSrc.src;
var tutorSrc = document.currentScript.src;

_FlagManager.default.add('TUTOR_LOCAL_SAVE', true);
/***
 * @extends BaseEditor
 * @constructor
 */


function TutorMaster() {
  _BaseEditor.default.call(this);

  this.script = window['TUTOR_LOCAL_SAVE'] && localStorage.getItem('TUTOR_MASTER_SCRIPT') || '';
  this.inspector = new _Inspector.default();
  this.splitEditor = new _SplitEditor.default();
}

_OOP.default.mixClass(TutorMaster, _BaseEditor.default);

TutorMaster.prototype.CONFIG_STORE_KEY = 'TUTOR_MASTER_SETTING';
TutorMaster.prototype.config = {
  editor: {
    width: 48,
    height: 48,
    x: 2,
    y: 50
  },
  toolbar: {
    x: 0.999,
    y: 0.999
  }
};

TutorMaster.prototype.createView = function () {
  this.$view = (0, _Core._)({
    style: {
      '--tutor-master-x': this.config.toolbar.x,
      '--tutor-master-y': this.config.toolbar.y
    },
    class: 'atr-tutor-master',
    child: [{
      tag: 'hanger',
      class: 'atr-tutor-master-head',
      child: _Icon.TutorIco.cloneNode(true),
      on: {
        dragstart: this.ev_headerDragStart.bind(this),
        drag: this.ev_headerDrag.bind(this)
      }
    }, {
      tag: 'button',
      attr: {
        title: 'Import File Script'
      },
      class: ['as-from-tool-button', 'atr-import-btn'],
      child: 'span.mdi.mdi-file-import'
    }, {
      tag: 'button',
      attr: {
        title: 'Edit Script'
      },
      class: ['as-from-tool-button', 'atr-edit-script-btn'],
      child: 'span.mdi.mdi-script-text-outline'
    }, {
      tag: 'button',
      attr: {
        title: 'Play'
      },
      class: ['as-from-tool-button', 'atr-play-btn'],
      child: 'span.mdi.mdi-play'
    }, {
      tag: 'button',
      class: ['as-from-tool-button', 'atr-stop-btn'],
      child: 'span.mdi.mdi-stop'
    }, {
      tag: 'button',
      attr: {
        title: 'Download Script'
      },
      class: ['as-from-tool-button', 'atr-download-btn'],
      child: 'span.mdi.mdi-cloud-download'
    }, {
      tag: 'button',
      attr: {
        title: 'Inspector'
      },
      class: ['as-from-tool-button', 'atr-inspector-btn'],
      child: 'span.mdi.mdi-auto-fix'
    }, {
      tag: 'a',
      class: 'atr-download-link',
      attr: {
        download: 'tutor_script.js'
      },
      style: {
        display: 'none'
      }
    }]
  });
  this.$importBtn = (0, _Core.$)('.atr-import-btn', this.$view).on('click', this.importFromFileDialog.bind(this));
  this.$editScriptBtn = (0, _Core.$)('.atr-edit-script-btn', this.$view).on('click', this.ev_clickEditScript.bind(this));
  this.$playBtn = (0, _Core.$)('.atr-play-btn', this.$view).on('click', this.ev_clickPlayBtn.bind(this));
  this.$stopBtn = (0, _Core.$)('.atr-stop-btn', this.$view).on('click', this.ev_clickStopBtn.bind(this));
  this.$stopBtn.disabled = true;
  this.$downloadBtn = (0, _Core.$)('.atr-download-btn', this.$view).on('click', this.downloadScript.bind(this));
  this.$downloadLink = (0, _Core.$)('a.atr-download-link', this.$view);
  this.$inspectorBtn = (0, _Core.$)('.atr-inspector-btn', this.$view).on('click', this.ev_clickInspectorBtn.bind(this));
  /***
   * @type {OnScreenWindow}
   */

  this.$editWindow = (0, _Core._)('onscreenwindow').addStyle({
    width: this.config.editor.width + 'vw',
    height: this.config.editor.height + 'vh',
    left: this.config.editor.x + 'vw',
    top: this.config.editor.y + 'vh',
    visibility: 'hidden',
    opacity: '0'
  }).addClass('attr-split-editor-window');
  this.$editWindow.on('relocation', this.ev_editWindowPositionChange.bind(this)).on('sizechange', this.ev_editWindowPositionChange.bind(this));
  this.$editWindow.windowTitle = 'Tutor';
  this.$editWindow.addChild(this.splitEditor.getView());
  this.$editWindow.addTo(document.body);
  this.$editWindow.windowActions = [{
    class: 'as-window-box-header-button-close',
    icon: 'span.mdi.mdi-close',
    name: 'close'
  }];
  this.$editWindow.on('action', function (event) {
    if (event.actionData && event.actionData.name === 'close') {
      this.ev_clickCloseScript(event);
    }
  }.bind(this));
  this.splitEditor.setValue(this.script);
};

TutorMaster.prototype.importFromFileDialog = function () {
  var thisTM = this;
  (0, _utils.openFileDialog)({
    accept: ".js"
  }).then(function (files) {
    if (files.length > 0) {
      var fileReader = new FileReader();

      fileReader.onload = function (event) {
        thisTM.setScript(event.target.result);
      };

      fileReader.readAsText(files[0]);
    }
  });
};

TutorMaster.prototype.onResume = function () {
  document.body.classList.add('atr-has-tutor-master');
};

TutorMaster.prototype.onPause = function () {
  document.body.classList.remove('atr-has-tutor-master');
};

TutorMaster.prototype.onStart = function () {
  var view = this.getView();

  if (window.data_module && window.data_module.exportDatabase) {
    this.$databaseBtn = (0, _Core._)({
      tag: 'button',
      attr: {
        title: 'ExportDatabase'
      },
      class: ['as-from-tool-button', 'atr-inspector-btn'],
      child: 'span.mdi.mdi-database',
      on: {
        click: window.data_module.exportDatabase.bind(window.data_module)
      }
    }).addTo(this.$view);
  }

  if (!view.parentElement) {
    view.addTo(document.body);
    var bound = view.getBoundingClientRect();
    view.addStyle({
      '--tutor-master-width': bound.width + 'px',
      '--tutor-master-height': bound.height + 'px'
    });
  }
};

TutorMaster.prototype.onDestroy = function () {
  this.$editWindow.remove();
};

TutorMaster.prototype.setScript = function (script) {
  this.script = script || '';
  this.splitEditor.setValue(this.script);
};

TutorMaster.prototype.downloadScript = function () {
  var thisTM = this;
  var blob = new Blob([this.splitEditor.getValue()], {
    type: 'text/plain'
  });
  thisTM.$downloadLink.href = URL.createObjectURL(blob);
  thisTM.$downloadLink.click();
};

TutorMaster.prototype.ev_clickEditScript = function () {
  if (this.$editScriptBtn.containsClass('as-active')) {
    this.$editScriptBtn.removeClass('as-active');
    this.$editWindow.addStyle('visibility', 'hidden');
    this.$editWindow.addStyle('opacity', '0');
  } else {
    this.$editWindow.removeStyle('visibility');
    this.$editWindow.addStyle('opacity', '1');
    this.$editScriptBtn.addClass('as-active');
  }
};

TutorMaster.prototype.ev_clickCloseScript = function () {
  if (this.$editScriptBtn.containsClass('as-active')) {
    this.$editScriptBtn.removeClass('as-active');
    this.$editWindow.addStyle('visibility', 'hidden');
    this.$editWindow.addStyle('opacity', '0');
  }
};

TutorMaster.prototype.ev_clickPlayBtn = function () {
  this.script = this.splitEditor.getValue();
  this.$editWindow.addStyle('visibility', 'hidden').addStyle('opacity', '0');
  this.$playBtn.disabled = true;

  var onFinish = function (err) {
    if (err instanceof Error) {
      var status = this.tutor.getStatus();

      _Toast.default.make({
        class: 'atr-toast-message',
        props: {
          variant: 'error',
          htitle: "Tutor Runtime Error!",
          disappearTimeout: 20000
        },
        child: [{
          tag: 'strong',
          child: {
            text: '[Ln ' + status.row + (status.col > 0 ? ', Col ' + status.col : '') + '] '
          }
        }, {
          tag: 'code',
          child: {
            text: status.code
          }
        }, {
          tag: 'div',
          child: {
            text: err.message
          }
        }]
      });

      console.error(err);
    } else if (typeof err === 'number' || err === undefined) {
      if (err === 0) {
        _Toast.default.make({
          props: {
            message: "Script finish successfully!",
            variant: 'success',
            htitle: "Success",
            disappearTimeout: 6000
          }
        });
      } else {
        _Toast.default.make({
          props: {
            message: 'Script is interrupted!',
            variant: 'warning',
            htitle: "",
            disappearTimeout: 6000
          }
        });
      }
    }

    this.$playBtn.disabled = false;
    this.$stopBtn.disabled = true;

    if (this.$editScriptBtn.containsClass('as-active')) {
      this.$editWindow.removeStyle('visibility').addStyle('opacity', '1');
    }

    this.tutor = null;
  }.bind(this);

  try {
    this.tutor = new _Tutor.default(document.body, this.script);
    this.$stopBtn.disabled = false;
    return this.tutor.exec().then(onFinish).catch(onFinish);
  } catch (err) {
    this.$playBtn.disabled = false;

    if (this.$editScriptBtn.containsClass('as-active')) {
      this.$editWindow.removeStyle('visibility').addStyle('opacity', '1');
    }

    _Toast.default.make({
      props: {
        variant: 'error',
        htitle: 'Script Error!',
        message: err.message,
        disappearTimeout: 10000
      }
    });

    console.error(err);
    this.$stopBtn.disabled = true;
    this.tutor = null;
  }
};

TutorMaster.prototype.ev_clickStopBtn = function () {
  if (this.tutor) {
    this.tutor.stop();
  }
};

TutorMaster.prototype.ev_clickInspectorBtn = function () {
  if (this.$inspectorBtn.containsClass('as-active')) {
    this.$inspectorBtn.removeClass('as-active');
    this.inspector.stop();
  } else {
    this.$inspectorBtn.addClass('as-active');
    this.inspector.start();
  }
};

TutorMaster.prototype.ev_editWindowPositionChange = function () {
  var screenSize = (0, _Dom.getScreenSize)();
  var bound = this.$editWindow.getBoundingClientRect();
  this.config.editor.x = bound.left / screenSize.width * 100;
  this.config.editor.y = bound.top / screenSize.height * 100;
  this.config.editor.width = bound.width / screenSize.width * 100;
  this.config.editor.height = bound.height / screenSize.height * 100;
  this.saveConfig();
};

TutorMaster.prototype.ev_headerDragStart = function () {
  var bound = this.$view.getBoundingClientRect();
  var screenSize = (0, _Dom.getScreenSize)();
  this._headerDragData = {
    bound: bound,
    screenSize: screenSize,
    initPos: new _Vec.default(bound.left, bound.top)
  };
};

TutorMaster.prototype.ev_headerDrag = function (event) {
  var d = event.currentPoint.sub(event.startingPoint);

  var newPos = this._headerDragData.initPos.add(d);

  var x = (newPos.x - 2) / (this._headerDragData.screenSize.width - this._headerDragData.bound.width - 4);
  var y = (newPos.y - 2) / (this._headerDragData.screenSize.height - this._headerDragData.bound.height - 4);
  x = Math.max(0, Math.min(0.98, x));
  y = Math.max(0, Math.min(0.98, y));
  this.$view.addStyle({
    '--tutor-master-x': x,
    '--tutor-master-y': y
  });
  this.config.toolbar.x = x;
  this.config.toolbar.y = y;
  this.saveConfig();
};

var _default = TutorMaster;
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/js/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/js/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Tutor = _interopRequireDefault(require("./Tutor"));

var _runScriptFromUrl = _interopRequireDefault(require("./runScriptFromUrl"));

var _SplitEditor = _interopRequireDefault(require("./app/SplitEditor"));

var _TutorMaster = _interopRequireDefault(require("./app/TutorMaster"));

var _FlagManager = _interopRequireDefault(require("./app/FlagManager"));

var _findNode = _interopRequireDefault(require("./util/findNode"));

var _UserBaseAction = _interopRequireDefault(require("./scriptor/UserBaseAction"));

var _BaseCommand = _interopRequireDefault(require("./scriptor/BaseCommand"));

var _TACData = _interopRequireDefault(require("./scriptor/TACData"));

var _TutorNameManager = _interopRequireDefault(require("./scriptor/TutorNameManager"));

var _expressionList = _interopRequireDefault(require("./scriptor/expressionList"));

var _Core = _interopRequireDefault(require("./dom/Core"));

var _install = _interopRequireDefault(require("./dom/install"));


var _default = {
  FlagManager: _FlagManager.default,
  Tutor: _Tutor.default,
  runScriptFromUrl: _runScriptFromUrl.default,
  SplitEditor: _SplitEditor.default,
  TutorMaster: _TutorMaster.default,
  findNode: _findNode.default,
  UserBaseAction: _UserBaseAction.default,
  BaseCommand: _BaseCommand.default,
  TACData: _TACData.default,
  TutorNameManager: _TutorNameManager.default,
  expressionList: _expressionList.default,
  Core: _Core.default,
  installToCore: _install.default
};
exports.default = _default;
};

moduleFactories["node_modules/absol-tutor/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-tutor/dev.js ***/
"use strict";

var _install = _interopRequireDefault(require("./js/dom/install"));

require("absol/src/absol");

require("absol-acomp/dev");

require("absol-brace/dev");

var _ = _interopRequireDefault(require("."));

var _FlagManager = _interopRequireDefault(require("./js/app/FlagManager"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _TutorMaster = _interopRequireDefault(require("./js/app/TutorMaster"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));


(0, _install.default)(absol.coreDom);
absol.tutor = _.default;
absol.FlagManager = _FlagManager.default;

_FlagManager.default.add('FLAG_MANAGER_STARTUP');

_FlagManager.default.add('TUTOR_STARTUP');

_Dom.default.documentReady.then(function () {
  if (window.FLAG_MANAGER_STARTUP && window.self === window.top) _FlagManager.default.start();

  if (window.TUTOR_STARTUP && window.self === window.top && !_BrowserDetector.default.isMobile) {
    var tutorMaster = new _TutorMaster.default();
    tutorMaster.start();
  }
});
};

moduleFactories["node_modules/absol-sheet/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _SComp = _interopRequireDefault(require("./js/dom/SComp"));

var _TableEditor = _interopRequireDefault(require("./js/fragment/TableEditor"));

var _TSFunction = _interopRequireDefault(require("./js/fx/TSFunction"));

var ExcelFx = _interopRequireWildcard(require("./js/fx/ExcelFx"));




var _default = {
  dom: _SComp.default,
  TableEditor: _TableEditor.default,
  TSFunction: _TSFunction.default,
  ExcelFx: ExcelFx
};
exports.default = _default;
};

moduleFactories["node_modules/absol-sheet/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-sheet/dev.js ***/
"use strict";

require("absol/src/absol");

require("absol-acomp/dev");

var _ = _interopRequireDefault(require("."));


window.absol.sheet = _.default;
};

moduleFactories["node_modules/absol-debug/js/dom/Core.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-debug/js/dom/Core.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var Core = new _Dom.default();
var _default = Core;
exports.default = _default;
};

moduleFactories["node_modules/absol-debug/js/dom/DString.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-debug/js/dom/DString.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = DString;

require("../../css/dstring.css");

var _Core = _interopRequireDefault(require("./Core"));


var _ = _Core.default._;
var $ = _Core.default.$;
/***
 * @extends HTMLElement
 * @constructor
 */

function DString() {
  this.$value = this.firstChild;
  this.value = "";
}

DString.tag = 'dstring';

DString.render = function () {
  return _({
    tag: 'p',
    class: 'ad-string',
    child: {
      text: ''
    }
  });
};

DString.property = {};
/***
 *
 * @type {DString}
 */

DString.property.value = {
  set: function (value) {
    this.$value.data = value;
  },
  get: function () {
    return this.$value.data;
  }
};

_Core.default.install(DString);
};

moduleFactories["node_modules/absol-debug/js/dom/DConsole.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-debug/js/dom/DConsole.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/dconsole.css");

var _Core = _interopRequireDefault(require("./Core"));

require("./DString");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var _ = _Core.default._;
var $ = _Core.default.$;

function DConsole() {}

DConsole.tag = 'dconsole';

DConsole.render = function () {
  return _('div.ad-console');
};

DConsole.prototype._makeEventObject = function (event) {
  var eventObj = _EventEmitter.default.eventProperties.reduce(function (ac, key) {
    var value = event[key];

    if (value !== undefined) {
      ac[key] = value;
    }

    return ac;
  }, {});

  Object.assign(eventObj, event);
  return eventObj;
}; //simple with text


DConsole.prototype._makeViewOf = function (value) {
  if (value === undefined) {
    value = 'undefined';
  } else if (value === null) {
    value = "null";
  } else if (typeof value == 'string') {} else if (value.type && value.target) {
    value = JSON.stringify(this._makeEventObject(value), null, 4);
  } else {
    value = JSON.stringify(value, null, 4);
  }

  return _({
    tag: 'dstring',
    props: {
      value: value
    }
  });
};

DConsole.prototype._autoScrollIfNeed = function () {
  var thisDC = this;

  if (this.offsetHeight + this.scrollTop >= this.scrollHeight - 20) {
    setTimeout(function () {
      thisDC.scrollTop = thisDC.scrollHeight;
    }, 10);
  }
};

DConsole.prototype.showError = function (error) {
  this._autoScrollIfNeed();

  var logGroup = _({
    class: 'ad-log-error',
    child: [{
      tag: 'span',
      class: 'ad-log-error-message',
      child: {
        text: error.message + ''
      }
    }, {
      tag: "span",
      class: 'ad-log-error-at',
      child: {
        text: ' at ' + error.filename + '<' + error.lineno + ':' + error.colno + '>'
      }
    }, {
      class: 'ad-log-error-stack',
      tag: 'div',
      style: {
        display: 'none'
      },
      child: {
        text: error.stack
      }
    }]
  });

  var displayStack = false;
  var stackElt = $('.ad-log-error-stack', logGroup);
  logGroup.on('click', function () {
    displayStack = !displayStack;

    if (displayStack) {
      stackElt.removeStyle('display');
    } else {
      stackElt.addStyle('display', 'none');
    }
  });
  this.addChild(logGroup);
};

DConsole.prototype.log = function () {
  this._autoScrollIfNeed();

  var logGroup = _('.ad-log-group');

  for (var i = 0; i < arguments.length; ++i) {
    logGroup.addChild(this._makeViewOf(arguments[i]));
  }

  this.addChild(logGroup);
};

DConsole.prototype.error = function () {
  this._autoScrollIfNeed();

  var logGroup = _('.ad-log-group');

  logGroup.addStyle('color', 'red');

  for (var i = 0; i < arguments.length; ++i) {
    logGroup.addChild(this._makeViewOf(arguments[i]));
  }

  this.addChild(logGroup);
};

DConsole.prototype.info = function () {
  this._autoScrollIfNeed();

  var logGroup = _('.ad-log-group');

  logGroup.addStyle('color', 'blue');

  for (var i = 0; i < arguments.length; ++i) {
    logGroup.addChild(this._makeViewOf(arguments[i]));
  }

  this.addChild(logGroup);
};

DConsole.$elt = null;

DConsole.auto = function () {
  if (this.$elt) return;

  var $elt = _({
    tag: 'dconsole',
    class: 'ad-standard-alone'
  });

  this.$shareInstance = $elt;
  console['l' + 'og'] = $elt.log.bind($elt);
  console['e' + 'rror'] = $elt.error.bind($elt);
  console['i' + 'nfo'] = $elt.info.bind($elt);
  window.addEventListener('error', function (event) {
    $elt.showError({
      lineno: event.lineno,
      colno: event.colno,
      filename: event.source || event.filename,
      stack: event.error.stack,
      message: event.message
    });
  });

  window.onerror = window.onerror || function (message, source, lineno, colno, error) {
    $elt.showError({
      lineno: lineno,
      colno: colno,
      filename: source,
      stack: error.stack,
      message: message
    });
  };

  var show = true;

  var $toggleBtn = _({
    tag: 'button',
    class: 'ad-console-toggle',
    child: 'span.mdi.mdi-console',
    on: {
      click: function () {
        show = !show;

        if (show) {
          $elt.removeStyle('display');
        } else {
          $elt.addStyle('display', 'none');
        }
      }
    }
  });

  _Dom.default.documentReady.then(function () {
    $elt.addTo(document.body);
    $toggleBtn.addTo(document.body);
  });
};

_Core.default.install(DConsole);

var _default = DConsole;
exports.default = _default;
};

moduleFactories["node_modules/absol-debug/js/dom/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-debug/js/dom/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = install;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _DConsole = _interopRequireDefault(require("./DConsole"));


/**
 * 
 * @param {Dom} core 
 */
function install(core) {
  core.install([_DConsole.default]);
}
};

moduleFactories["node_modules/absol-debug/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-debug/dev.js ***/
"use strict";

var _install = _interopRequireDefault(require("./js/dom/install"));


window.absol = window.absol || {};
(0, _install.default)(absol.coreDom);
};

moduleFactories["node_modules/absol-poser/dom/Core.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/Core.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.$$ = exports.$ = exports._ = void 0;

require("../css/config_format.css");

require("../css/common.css");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _install = _interopRequireDefault(require("absol-acomp/js/dom/install"));

var _SelectMenu = _interopRequireDefault(require("absol-acomp/js/SelectMenu"));

var _ACore = _interopRequireDefault(require("absol-acomp/ACore"));


var Core = new _Dom.default();
(0, _install.default)(Core);
Core.install('dropdown-ico', _ACore.default.creator['dropdown-ico']);
var _ = Core._;
exports._ = _;
var $ = Core.$;
exports.$ = $;
var $$ = Core.$$;
exports.$$ = $$;
var _default = Core; ///

exports.default = _default;
};

moduleFactories["node_modules/absol-poser/utils.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/utils.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.toImageUrl = toImageUrl;
exports.autoThemeVariable = autoThemeVariable;

var _Color = _interopRequireDefault(require("absol/src/Color/Color"));


/***
 *
 * @param {string|Blob|File} file
 */
function toImageUrl(file) {
  var url;

  if (file instanceof Blob || file instanceof File) {
    file.blobUrl = file.url || URL.createObjectURL(file);
    url = file.blobUrl;
  } else if (typeof file === "string") {
    url = file;
  }

  return url;
}

function autoThemeVariable(viewElt) {
  var cp = getComputedStyle(viewElt);
  var color = cp.getPropertyValue('--menu-background-color') || cp.getPropertyValue('--variant-color-primary') || 'blue';
  color = _Color.default.parse(color.trim());
  var hsla = color.toHSLA();
  hsla[2] = (hsla[2] + 1) / 2;
  hsla[1] = (hsla[1] + 1) / 2;
  color = _Color.default.fromHSLA(hsla[0], hsla[1], hsla[2], hsla[3]);
  viewElt.addStyle('--separator-line-color', color.toString('rgba'));
}
};

moduleFactories["node_modules/absol-poser/dom/editor/question/APEditableChoiceAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/APEditableChoiceAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/textanswer.css");

var _utils = require("absol-acomp/js/utils");

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _utils2 = require("../../../utils");




/**
 * @extends AElement
 * @constructor
 */
function APEditableChoiceAnswer() {
  this.$addImageBtn = (0, _Core.$)('.ap-editable-ad-image-btn', this).on('click', this.eventHandler.clickAddImage);
  this.$imageCtn = (0, _Core.$)('.ap-editable-image-ctn', this);
  this.$attachmentAddBtn = (0, _Core.$)('.as-message-input-attachment-add-btn', this).on('click', this.eventHandler.clickAddImage);
  this.$text = (0, _Core.$)('.ap-editable-text-answer-content-ctn preinput', this).on('focus', this.eventHandler.textFocus).on('blur', this.eventHandler.textBlur);
  this.imageFiles = [];
  this.$trueAws = (0, _Core.$)('.ap-editable-text-true-answer-select-ctn > ' + this.trueAnsTag, this).on('change', this.eventHandler.trueAnswerChange);
  this.$select = (0, _Core.$)('.ap-editable-text-select-ctn', this).firstChild;
  this._questionId = null;
  this.questionId = null;
  this._by = 'radio';
  this.by = this._by;
  this._data = new _Attributes.default(this);

  this._data.loadAttributeHandlers(this.dataHandlers);

  this.isCorrectAnswer = false;
}

APEditableChoiceAnswer.tag = 'APEditableChoiceAnswer'.toLowerCase();
APEditableChoiceAnswer.prototype.selectConstruction = {
  tag: 'radiobutton',
  class: 'ap-radio'
};
APEditableChoiceAnswer.prototype.trueAnswerConstruction = {
  tag: 'radiobutton',
  class: 'ap-radio'
};
APEditableChoiceAnswer.prototype.trueAnsTag = 'radiobutton';

APEditableChoiceAnswer.render = function () {
  return (0, _Core._)({
    extendEvent: ['change'],
    class: 'ap-editable-text-answer',
    child: [{
      class: 'ap-editable-text-select-ctn',
      child: this.prototype.selectConstruction
    }, {
      class: ['ap-editable-text-answer-content-ctn', 'ap-input'],
      child: [{
        tag: 'preinput',
        class: 'ap-text-input'
      }, {
        class: 'ap-editable-image-ctn',
        child: [{
          tag: 'button',
          class: 'as-message-input-attachment-add-btn',
          child: [// 'span.mdi.mdi-arrow-down-bold.as-message-input-attachment-add-btn-drop',
          {
            tag: 'span',
            class: 'as-message-input-attachment-add-btn-plus',
            child: {
              text: "+"
            }
          }]
        }]
      }, {
        class: 'ap-editable-text-answer-btn-ctn',
        child: {
          tag: 'button',
          class: ['ap-button', 'ap-editable-ad-image-btn'],
          child: 'span.mdi.mdi-image-outline'
        }
      }]
    }, {
      class: 'ap-editable-text-true-answer-select-ctn',
      child: [this.prototype.trueAnswerConstruction, {
        tag: 'span',
        class: 'ap-editable-text-true-answer-label',
        child: {
          text: 'Đáp án đúng'
        },
        on: {
          click: function () {
            var pE = this.parentElement;
            pE.firstChild.click();
          }
        }
      }]
    }]
  });
};

APEditableChoiceAnswer.prototype.selectAllText = function () {
  var text = this.$text.value;
  this.$text.focus();
  this.$text.applyData(text, {
    start: 0,
    end: text.length
  });
};
/***
 *
 * @param {File|string} file
 * @param {Event|*=} originalEvent
 * @private
 */


APEditableChoiceAnswer.prototype._addImage = function (file, originalEvent) {
  var thisA = this;
  var src;
  var fileName;

  if (typeof file === "string") {
    src = file;
    fileName = file.split('/').pop() || '';
  } else if (file instanceof Blob || file instanceof File) {
    src = (0, _utils2.toImageUrl)(file);
    fileName = file.name;
  } else return;

  this.imageFiles.push(file);
  this.addClass('ap-has-image');
  var itemElt = (0, _Core._)({
    class: ['as-message-input-attach-preview', 'as-image'],
    attr: {
      title: file.name
    },
    child: [{
      class: 'as-message-input-attach-preview-image',
      style: {
        backgroundImage: 'url(' + src + ')'
      }
    }, {
      tag: 'button',
      class: 'as-message-input-attach-preview-close-btn',
      child: 'span.mdi.mdi-close',
      attr: {
        title: 'remove'
      },
      on: {
        click: function (event) {
          var idx = thisA.imageFiles.indexOf(file);

          if (idx >= 0) {
            thisA.imageFiles.splice(idx, 1);
          }

          itemElt.remove();

          if (thisA.imageFiles.length === 0) {
            thisA.removeClass('ap-has-image');
          }

          thisA.emit('change', {
            type: 'change',
            target: this,
            fieldName: 'images',
            originalEvent: event
          }, this);
        }
      }
    }, {
      class: 'as-message-input-attach-preview-info',
      child: [{
        class: 'as-message-input-attach-preview-name',
        child: {
          text: file.name
        }
      }, {
        class: 'as-message-input-attach-preview-size',
        child: {
          text: (0, _utils.fileSize2Text)(file.size)
        }
      }]
    }]
  });
  this.$imageCtn.addChildBefore(itemElt, this.$attachmentAddBtn);
  if (originalEvent) this.emit('change', {
    type: 'change',
    target: this,
    fieldName: 'images',
    originalEvent: originalEvent
  }, this);
};

APEditableChoiceAnswer.eventHandler = {};

APEditableChoiceAnswer.eventHandler.clickAddImage = function (event) {
  var thisA = this; // var image = prompt("Enter image url: ", '');
  // if (image && image.trim().length > 0) {
  //     thisA._addImage(image.trim(), event);
  // }

  (0, _utils.openFileDialog)({
    accept: "image/*"
  }).then(files => {
    if (files && files[0]) {
      var file = files[0];

      this._addImage(file, event);
    }
  });
};
/***
 * @this APEditableChoiceAnswer
 */


APEditableChoiceAnswer.eventHandler.trueAnswerChange = function () {
  this.emit('change', {
    type: 'change',
    target: this,
    propertyName: 'isCorrectAnswer'
  }, this);
};
/***
 * @this APEditableChoiceAnswer
 */


APEditableChoiceAnswer.eventHandler.textFocus = function () {
  this._prevText = this.$text.value;
};
/***
 * @this APEditableChoiceAnswer
 */


APEditableChoiceAnswer.eventHandler.textBlur = function (event) {
  var text = this.$text.value;

  if (this._prevText !== text) {
    this.emit('change', {
      type: 'change',
      target: this,
      fieldName: 'text',
      originalEvent: event
    }, this);
  }
};

APEditableChoiceAnswer.property = {};
APEditableChoiceAnswer.property.questionId = {
  set: function (value) {
    this._questionId = value;
    this.$trueAws.name = 'true_answer_of_' + value;
  },
  get: function () {
    return this._questionId;
  }
};
APEditableChoiceAnswer.property.isCorrectAnswer = {
  set: function (value) {
    this.$trueAws.checked = !!value;
  },
  get: function () {
    return this.$trueAws.checked;
  }
};
APEditableChoiceAnswer.property.data = {
  set: function (value) {
    Object.assign(this._data, value);
  },
  get: function () {
    return this._data;
  }
};
APEditableChoiceAnswer.prototype.dataHandlers = {};
APEditableChoiceAnswer.prototype.dataHandlers.text = {
  set: function (value) {
    if (typeof value !== "string") value += '';
    this.$text.value = value;
  },
  get: function () {
    return this.$text.value;
  }
};
APEditableChoiceAnswer.prototype.dataHandlers.images = {
  /***
   * @this APEditableSection
   * @param images
   */
  set: function (images) {
    if (!(images instanceof Array)) images = [];

    while (this.$imageCtn.firstChild !== this.$attachmentAddBtn) {
      this.$imageCtn.removeChild(this.$imageCtn.firstChild);
    }

    this.imageFiles.splice(0, this.imageFiles.length);
    images.forEach(function (file) {
      this._addImage(file);
    }.bind(this));
  },
  get: function () {
    return this.imageFiles.slice();
  }
};
APEditableChoiceAnswer.prototype.dataHandlers.ident = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    this.attr('data-ident', value + '');
  },
  get: function () {
    var ident = parseInt(this.attr('data-ident'));
    if (!(0, _utils.isRealNumber)(ident)) ident = 0;
    return ident;
  }
};

_Core.default.install(APEditableChoiceAnswer);

var _default = APEditableChoiceAnswer; //con15p

exports.default = _default;
};

moduleFactories["node_modules/absol-poser/contants/QuestionTypeItems.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/contants/QuestionTypeItems.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.QuestionTypeDict = exports.QuestionType2Icon = void 0;
var QuestionTypeItems = [{
  text: 'Trả lời ngắn',
  icon: 'span.mdi.mdi-text-short',
  questionType: 'short_answer'
}, {
  text: 'Trả lời dài',
  icon: 'span.mdi.mdi-text',
  questionType: 'paragraph'
}, //15p
'-------------', {
  text: 'Trắc nghiệm (Một đáp án)',
  icon: 'span.mdi.mdi-radiobox-marked',
  questionType: 'multiple_choice'
}, {
  text: 'Trắc nghiệm (Nhiều đáp án)',
  icon: 'span.mdi.mdi-check-box-outline',
  questionType: 'checkboxes'
}, // {
//     text: 'Menu thả xuống',
//     icon: 'span.mdi.mdi-arrow-down-drop-circle outline',
//     questionType: 'dropdown'
// },
'------------', // {
//     text: 'Tải tệp lên',
//     icon: 'span.mdi.mdi-cloud-upload-outline',
//      questionType: 'file_upload'
// },
{
  text: 'Phạm vi tuyến tính',
  icon: '<i class="material-icons">linear_scale</i>',
  questionType: 'linear_scale'
} // {
//     text: 'Lưới trắc nghiệm',
//     icon: '<svg viewBox="0 0 24 24">\n' +
//         '    <path fill="currentColor" d="M12 16C13.1 16 14 16.9 14 18S13.1 20 12 20 10 19.1 10 18 10.9 16 12 16M12 10C13.1 10 14 10.9 14 12S13.1 14 12 14 10 13.1 10 12 10.9 10 12 10M12 4C13.1 4 14 4.9 14 6S13.1 8 12 8 10 7.1 10 6 10.9 4 12 4M6 16C7.1 16 8 16.9 8 18S7.1 20 6 20 4 19.1 4 18 4.9 16 6 16M6 10C7.1 10 8 10.9 8 12S7.1 14 6 14 4 13.1 4 12 4.9 10 6 10M6 4C7.1 4 8 4.9 8 6S7.1 8 6 8 4 7.1 4 6 4.9 4 6 4M18 16C19.1 16 20 16.9 20 18S19.1 20 18 20 16 19.1 16 18 16.9 16 18 16M18 10C19.1 10 20 10.9 20 12S19.1 14 18 14 16 13.1 16 12 16.9 10 18 10M18 4C19.1 4 20 4.9 20 6S19.1 8 18 8 16 7.1 16 6 16.9 4 18 4Z" />\n' +
//         '</svg>'
//      questionType: 'multiple_choice_grid'
// },
// {
//     text: 'Lưới hộp kiểm',
//     icon: '<i class="material-icons">apps</i>'
//    questionType:'checkbox_grid'
// },
// '----------------',
// {
//     text: 'Ngày',
//     icon: 'span.mdi.mdi-calendar',
//     questionType: 'date'
// },
// {
//     text: 'Giờ',
//     icon: 'span.mdi.mdi-clock-outline'
//     questionType: 'time'
// },
];
var QuestionType2Icon = QuestionTypeItems.reduce(function (ac, cr) {
  if (cr.icon) ac[cr.questionType] = cr.icon;
  return ac;
}, {});
exports.QuestionType2Icon = QuestionType2Icon;
var QuestionTypeDict = QuestionTypeItems.reduce((ac, cr) => {
  if (typeof cr === 'object') ac[cr.questionType] = cr;
  return ac;
}, {});
exports.QuestionTypeDict = QuestionTypeDict;
var _default = QuestionTypeItems;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/APEditableCheckboxAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/APEditableCheckboxAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/textanswer.css");

var _APEditableChoiceAnswer = _interopRequireDefault(require("./APEditableChoiceAnswer"));




/**
 * @extends APEditableChoiceAnswer
 * @constructor
 */
function APEditableCheckboxAnswer() {
  _APEditableChoiceAnswer.default.call(this);
}

APEditableCheckboxAnswer.tag = 'APEditableCheckboxAnswer'.toLowerCase();
APEditableCheckboxAnswer.render = _APEditableChoiceAnswer.default.render;
Object.assign(APEditableCheckboxAnswer.prototype, _APEditableChoiceAnswer.default.prototype);
APEditableCheckboxAnswer.eventHandler = Object.assign({}, _APEditableChoiceAnswer.default.eventHandler);
APEditableCheckboxAnswer.property = Object.assign({}, _APEditableChoiceAnswer.default.property);
APEditableCheckboxAnswer.prototype.selectConstruction = {
  tag: 'checkboxbutton',
  class: 'ap-radio'
};
APEditableCheckboxAnswer.prototype.trueAnswerConstruction = {
  tag: 'checkboxbutton',
  class: 'ap-radio'
};
APEditableCheckboxAnswer.prototype.trueAnsTag = 'checkboxbutton';

_Core.default.install(APEditableCheckboxAnswer);

var _default = APEditableCheckboxAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/PEShortAnswerField.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/PEShortAnswerField.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/textanswer.css");



/**
 * @extends AElement
 * @constructor
 */
function PEShortAnswerField() {}

PEShortAnswerField.tag = 'PEShortAnswerField'.toLowerCase();

PEShortAnswerField.render = function () {
  return (0, _Core._)({
    class: ['ap-editable-answer-list', 'ape-short-answer-field', 'ap-editable-short-text-answer'],
    child: [{
      child: {
        class: 'ap-field-name',
        child: '<span>Trả lời</span>'
      }
    }, {
      class: 'ap-editable-short-text-answer-text-field'
    }]
  });
};

_Core.default.install(PEShortAnswerField);

var _default = PEShortAnswerField;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/PEParagraphAnswerField.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/PEParagraphAnswerField.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/textanswer.css");



/**
 * @extends AElement
 * @constructor
 */
function PEParagraphAnswerField() {}

PEParagraphAnswerField.tag = 'APEditableLongTextAnswer'.toLowerCase();

PEParagraphAnswerField.render = function () {
  return (0, _Core._)({
    class: ['ap-editable-answer-list', 'ape-paragraph-answer-field', 'ap-editable-long-text-answer'],
    child: [{
      child: {
        class: 'ap-field-name',
        child: '<span>Trả lời</span>'
      }
    }, {
      class: 'ap-editable-long-text-answer-text-field',
      child: ['div', 'div', 'div']
    }]
  });
};

_Core.default.install(PEParagraphAnswerField);

var _default = PEParagraphAnswerField;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/PELinearScaleAnswerField.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/PELinearScaleAnswerField.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/linearscale.css");

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));




/**
 * @extends AElement
 * @constructor
 */
function PELinearScaleAnswerField() {
  var inputs = (0, _Core.$$)('.ap-editable-linear-scale-answer-range selectmenu', this);
  this.$min = inputs[0].on('change', this.eventHandler.minChange);
  this.$max = inputs[1].on('change', this.eventHandler.maxChange);
  this.$minLb = (0, _Core.$)('.ap-editable-linear-scale-answer-title-min  .ap-field-name span', this);
  this.$maxLb = (0, _Core.$)('.ap-editable-linear-scale-answer-title-max  .ap-field-name span', this);
  this.$titleOfMin = (0, _Core.$)('.ap-editable-linear-scale-answer-title-min  .ap-input', this).on('change', this.eventHandler.inputTextChange.bind(this, 'min'));
  this.$titleOfMax = (0, _Core.$)('.ap-editable-linear-scale-answer-title-max  .ap-input', this).on('change', this.eventHandler.inputTextChange.bind(this, 'max'));
  this._data = new _Attributes.default(this);

  this._data.loadAttributeHandlers(this.dataHandlers);

  this.data = {
    min: 0,
    max: 10,
    titleOfMin: '',
    titleOfMax: ''
  };
}

PELinearScaleAnswerField.tag = 'APEditableLinearScaleAnswer'.toLowerCase();

PELinearScaleAnswerField.render = function () {
  return (0, _Core._)({
    extendEvent: 'change',
    class: ['ap-editable-linear-scale-answer', 'ap-editable-answer-list', 'ape-linear-scale-answer-field'],
    child: [{
      class: 'ap-editable-linear-scale-answer-range',
      child: [{
        class: 'ap-field-name',
        child: {
          tag: 'span',
          child: {
            text: '  '
          }
        }
      }, {
        class: 'ap-editable-linear-scale-answer-range-input-ctn',
        child: [{
          tag: 'selectmenu',
          props: {
            items: [{
              text: '0',
              value: 0
            }, {
              text: '1',
              value: 1
            }]
          }
        }, '<span>&nbsp; &nbsp; đến &nbsp; &nbsp;</span>', {
          tag: 'selectmenu',
          props: {
            items: Array(9).fill(null).map(function (u, i) {
              return {
                text: i + 2 + '',
                value: i + 2
              };
            })
          }
        }]
      }]
    }, {
      class: 'ap-editable-linear-scale-answer-title-min',
      child: [{
        class: 'ap-field-name',
        child: {
          tag: 'span',
          child: {
            text: 'Tiêu đề mức {min}'
          }
        }
      }, {
        class: 'ap-editable-linear-scale-answer-title-input-ctn',
        child: [{
          tag: 'input',
          class: 'ap-input',
          attr: {
            type: 'text'
          }
        }]
      }]
    }, {
      class: 'ap-editable-linear-scale-answer-title-max',
      child: [{
        class: 'ap-field-name',
        child: {
          tag: 'span',
          child: {
            text: 'Tiêu đề mức {max}'
          }
        }
      }, {
        class: 'ap-editable-linear-scale-answer-title-input-ctn',
        child: [{
          tag: 'input',
          class: 'ap-input',
          attr: {
            type: 'text'
          }
        }]
      }]
    }]
  });
};

PELinearScaleAnswerField.property = {};
PELinearScaleAnswerField.property.data = {
  set: function (value) {
    Object.assign(this._data, value);
  },
  get: function () {
    return this._data;
  }
};
PELinearScaleAnswerField.prototype.dataHandlers = {};
PELinearScaleAnswerField.prototype.dataHandlers.min = {
  set: function (value) {
    if (typeof value === "number") {
      value = Math.max(0, value);
      value = Math.min(1, value);
      value = Math.floor(value);
    } else {
      value = 0;
    }

    this.$min.value = value;
    this.$minLb.firstChild.data = "Tiêu đề mức " + value;
  },
  get: function () {
    return this.$min.value;
  }
};
PELinearScaleAnswerField.prototype.dataHandlers.max = {
  set: function (value) {
    if (typeof value === "number") {
      value = Math.max(2, value);
      value = Math.min(10, value);
      value = Math.floor(value);
    } else {
      value = 10;
    }

    this.$max.value = value;
    this.$maxLb.firstChild.data = "Tiêu đề mức " + value;
  },
  get: function () {
    return this.$max.value;
  }
};
PELinearScaleAnswerField.prototype.dataHandlers.titleOfMax = {
  set: function (value) {
    if (typeof value !== "string") value = value + '';
    this.$titleOfMax.value = value;
  },
  get: function () {
    return this.$titleOfMax.value;
  }
};
PELinearScaleAnswerField.prototype.dataHandlers.titleOfMin = {
  set: function (value) {
    if (typeof value !== "string") value = value + '';
    this.$titleOfMin.value = value;
  },
  get: function () {
    return this.$titleOfMin.value;
  }
};
PELinearScaleAnswerField.eventHandler = {};

PELinearScaleAnswerField.eventHandler.maxChange = function (event) {
  this.$maxLb.firstChild.data = "Tiêu đề mức " + this.$max.value;
  this.emit('change', {
    type: 'change',
    target: this,
    fieldName: 'max',
    originalEvent: event.originalEvent || event
  }, this);
};

PELinearScaleAnswerField.eventHandler.minChange = function (event) {
  this.$minLb.firstChild.data = "Tiêu đề mức " + this.$min.value;
  this.emit('change', {
    type: 'change',
    target: this,
    fieldName: 'min',
    originalEvent: event.originalEvent || event
  }, this);
};

PELinearScaleAnswerField.eventHandler.inputTextChange = function (fieldName, event) {
  this.emit('change', {
    type: 'change',
    target: this,
    fieldName: fieldName,
    originalEvent: event.originalEvent || event
  }, this);
};

_Core.default.install(PELinearScaleAnswerField);

var _default = PELinearScaleAnswerField;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/APEditableAnswerCtn.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/APEditableAnswerCtn.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("../../css/editableanswerctn.css");

var _Core = _interopRequireWildcard(require("../Core"));

var _Board = _interopRequireDefault(require("absol-acomp/js/Board"));

var _BoardTable = require("absol-acomp/js/BoardTable");

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function APEditableAnswerCtn() {
  this.$editableAnswer = (0, _Core.$)('.ap-editable-answer', this);
  this.$removeBtn = (0, _Core.$)('.ap-editable-answer-ctn-remove-bt-ctn > button', this).on('click', this.eventHandler.pressRemove);
}

APEditableAnswerCtn.tag = 'APEditableAnswerCtn'.toLowerCase();

APEditableAnswerCtn.render = function () {
  return (0, _Core._)({
    tag: _Board.default.tag,
    extendEvent: ['pressremove'],
    class: 'ap-editable-answer-ctn',
    child: [{
      class: ['ap-editable-answer-ctn-drag-zone', _BoardTable.DRAG_ZONE_CLASS_NAME],
      child: '<i class="material-icons drag-icon-button">drag_indicator</i>',
      on: {
        contextmenu: function (event) {
          if ((0, _EventEmitter.isMouseRight)(event)) event.preventDefault();
        }
      }
    }, {
      class: 'ap-editable-answer'
    }, {
      class: 'ap-editable-answer-ctn-remove-bt-ctn',
      child: {
        tag: 'button',
        class: 'ap-button',
        child: 'span.mdi.mdi-close'
      }
    }]
  });
};

APEditableAnswerCtn.prototype.addChild = function (child) {
  this.$editableAnswer.selfReplace(child);
  this.$editableAnswer = child;
};

APEditableAnswerCtn.eventHandler = {};

APEditableAnswerCtn.eventHandler.pressRemove = function (event) {
  this.emit('pressremove', {
    type: 'pressremove',
    target: this,
    originalEvent: event
  }, this);
};

_Core.default.install(APEditableAnswerCtn);

var _default = APEditableAnswerCtn;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/APMoreChoiceAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/APMoreChoiceAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/radioanswer.css");

var _utils = require("absol-acomp/js/utils");

var _APEditableChoiceAnswer = _interopRequireDefault(require("./APEditableChoiceAnswer"));




/**
 * @extends AElement
 * @constructor
 */
function APMoreChoiceAnswer() {
  this.$text = (0, _Core.$)('input', this).on('focus', this.eventHandler.action.bind(this, 'new'));
  this.$other = (0, _Core.$)('a', this).on('click', this.eventHandler.action.bind(this, 'other'));
}

APMoreChoiceAnswer.tag = 'APMoreChoiceAnswer'.toLowerCase();
APMoreChoiceAnswer.prototype.selectConstruction = _APEditableChoiceAnswer.default.prototype.selectConstruction;

APMoreChoiceAnswer.render = function () {
  return (0, _Core._)({
    extendEvent: ['action'],
    class: ['ap-editable-answer-ctn', 'ap-more-radio-answer', 'ap-has-adding-other'],
    child: {
      class: 'ap-editable-text-answer',
      child: [{
        class: 'ap-editable-text-select-ctn',
        child: this.prototype.selectConstruction
      }, {
        class: ['ap-more-radio-answer-content-ctn'],
        child: [{
          tag: 'input',
          class: 'ap-input',
          attr: {
            type: 'text'
          }
        }, {
          tag: 'a',
          child: {
            tag: 'span',
            child: {
              text: 'Thêm khác'
            }
          }
        }]
      }]
    }
  });
};

APMoreChoiceAnswer.eventHandler = {};

APMoreChoiceAnswer.eventHandler.action = function (action, event) {
  this.emit('action', {
    type: 'action',
    action: action,
    target: this,
    originalEvent: event
  }, this);
};

APMoreChoiceAnswer.property = {};
APMoreChoiceAnswer.property.hasAddingOther = {
  set: function (value) {
    if (value) {
      this.addClass('ap-has-adding-other');
    } else {
      this.removeClass('ap-has-adding-other');
    }
  },
  get: function () {
    return this.containsClass('ap-has-adding-other');
  }
};

_Core.default.install(APMoreChoiceAnswer);

var _default = APMoreChoiceAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/APOtherChoiceAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/APOtherChoiceAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/radioanswer.css");

var _utils = require("absol-acomp/js/utils");

var _APEditableChoiceAnswer = _interopRequireDefault(require("./APEditableChoiceAnswer"));




/**
 * @extends AElement
 * @constructor
 */
function APOtherChoiceAnswer() {
  this.$removeBtn = (0, _Core.$)('.ap-editable-answer-ctn-remove-bt-ctn > button', this).on('click', this.eventHandler.action.bind(this, 'remove'));
}

APOtherChoiceAnswer.tag = 'APOtherChoiceAnswer'.toLowerCase();
APOtherChoiceAnswer.prototype.selectConstruction = _APEditableChoiceAnswer.default.prototype.selectConstruction;

APOtherChoiceAnswer.render = function () {
  return (0, _Core._)({
    extendEvent: ['action'],
    class: ['ap-editable-answer-ctn', 'ap-other-radio-answer'],
    child: [{
      class: 'ap-editable-text-answer',
      child: [{
        class: 'ap-editable-text-select-ctn',
        child: this.prototype.selectConstruction
      }, {
        class: ['ap-more-radio-answer-content-ctn'],
        child: [{
          tag: 'input',
          class: 'ap-input',
          attr: {
            type: 'text',
            placeholder: 'Other...',
            readonly: true
          }
        }]
      }]
    }, {
      class: 'ap-editable-answer-ctn-remove-bt-ctn',
      child: {
        tag: 'button',
        class: 'ap-button',
        child: 'span.mdi.mdi-close'
      }
    }]
  });
};

APOtherChoiceAnswer.eventHandler = {};

APOtherChoiceAnswer.eventHandler.action = function (action, event) {
  this.emit('action', {
    type: 'action',
    action: action,
    target: this,
    originalEvent: event
  }, this);
};

_Core.default.install(APOtherChoiceAnswer);

var _default = APOtherChoiceAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/PERadioAnswerList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/PERadioAnswerList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

require("../../../css/question.css");

var _APEditableAnswerCtn = _interopRequireDefault(require("../APEditableAnswerCtn"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _APEditableChoiceAnswer = _interopRequireDefault(require("./APEditableChoiceAnswer"));

var _APMoreChoiceAnswer = _interopRequireDefault(require("./APMoreChoiceAnswer"));

var _APOtherChoiceAnswer = _interopRequireDefault(require("./APOtherChoiceAnswer"));




/***
 * @extends AElement
 * @constructor
 */
function PERadioAnswerList() {
  this.$more = (0, _Core.$)(this.moreTag, this).on('action', this.eventHandler.moreAction);
  this.$other = null;
  /***
   *
   * @type {string}
   */

  this.questionId = (0, _stringGenerate.randomIdent)(8);
  this.on('orderchange', this.eventHandler.orderchange);
}

PERadioAnswerList.tag = 'PERadioAnswerList'.toLowerCase();
PERadioAnswerList.prototype.answerTag = _APEditableChoiceAnswer.default.tag;
PERadioAnswerList.prototype.moreTag = _APMoreChoiceAnswer.default.tag;
PERadioAnswerList.prototype.otherTag = _APOtherChoiceAnswer.default.tag;
PERadioAnswerList.prototype.peClassName = 'ape-radio-answer-list';

PERadioAnswerList.render = function () {
  return (0, _Core._)({
    tag: _BoardTable.default.tag,
    extendEvent: ['change'],
    class: ['ap-editable-answer-list', this.prototype.peClassName],
    child: [{
      tag: this.prototype.moreTag
    }]
  });
};
/***
 *
 * @param data
 * @return {APEditableAnswerCtn}
 * @private
 */


PERadioAnswerList.prototype._makeAnswerWithCtn = function (data) {
  var thisA = this;
  return (0, _Core._)({
    tag: _APEditableAnswerCtn.default.tag,
    child: {
      tag: this.answerTag,
      props: {
        data: data,
        questionId: this.questionId
      },
      on: {
        change: function (event) {
          var ev = {
            type: 'change',
            target: thisA,
            of: this
          };

          if (event.fieldName === 'text' || event.fieldName === 'images') {
            ev.fieldName = event.fieldName;
          } else if (event.propertyName === "isCorrectAnswer") {
            ev.propertyName = 'correct_answer';
          }

          thisA.emit('change', ev, thisA);
        }
      }
    },
    on: {
      pressremove: function (event) {
        this.selfRemove();
        thisA.emit('change', {
          type: 'change',
          target: thisA,
          of: this,
          propertyName: 'data',
          action: 'remove'
        }, this);
      }
    }
  });
};

PERadioAnswerList.prototype.addOther = function (originalEvent) {
  if (this.$other && this.$other.parentElement) return;
  var thisList = this;
  if (!this.$other) this.$other = (0, _Core._)({
    tag: this.otherTag,
    on: {
      action: function (event) {
        if (event.action === 'remove') {
          this.selfRemove();
          thisList.emit('change', {
            type: 'change',
            target: thisList,
            propertyName: 'data',
            originalEvent: event.originalEvent || event
          }, thisList);
          thisList.$more.hasAddingOther = true;
        }
      }
    }
  });
  this.addChildBefore(this.$other, this.$more);
  this.$more.hasAddingOther = false;
  if (originalEvent) this.emit('change', {
    type: 'change',
    target: this,
    propertyName: 'data',
    originalEvent: originalEvent
  }, this);
};
/***
 *
 * @param {Event=}originalEvent
 */


PERadioAnswerList.prototype.addNew = function (originalEvent) {
  this._autoIdx = this._autoIdx || (0, _Core.$$)(_APEditableAnswerCtn.default.tag, this).length;
  this._autoIdx += 1;

  var newAnsCtn = this._makeAnswerWithCtn({
    text: 'Tùy chọn ' + this._autoIdx
  });

  var bf = this.$other && this.$other.parentElement && this.$other || this.$more;
  this.addChildBefore(newAnsCtn, bf);
  newAnsCtn.$editableAnswer.selectAllText();
  if (originalEvent) this.emit('change', {
    type: 'change',
    target: this,
    propertyName: 'data',
    originalEvent: originalEvent
  }, this);
};

PERadioAnswerList.property = {};
PERadioAnswerList.property.data = {
  /***
   * @this PERadioAnswerList
   * @param {*[]} value
   */
  set: function (value) {
    var _this = this;

    if (!(value instanceof Array)) value = [];
    (0, _Core.$$)(_APEditableAnswerCtn.default.tag, this).forEach(function (ansElt) {
      ansElt.selfRemove();
    });
    if (this.$other) this.$other.selfRemove();
    var ctnList = value.map(function (it) {
      if (it !== 'other') {
        return _this._makeAnswerWithCtn(it);
      }
    }).filter(function (elt) {
      return !!elt;
    });
    ctnList.forEach(function (ansElt) {
      _this.addChildBefore(ansElt, _this.$more);
    });
    if (value.indexOf('other') >= 0) this.addOther();
  },
  get: function () {
    var res = (0, _Core.$$)(this.answerTag, this).map(function (ansElt) {
      return ansElt.data;
    });
    if (this.$other && this.$other.parentElement) res.push('other');
    return res;
  }
};
PERadioAnswerList.property.correct_answer = {
  set: function (value) {
    (0, _Core.$$)(_APEditableChoiceAnswer.default.tag, this).forEach(function (ans, i) {
      ans.isCorrectAnswer = i === value;
    });
  },
  get: function () {
    var ansList = (0, _Core.$$)(_APEditableChoiceAnswer.default.tag, this);
    var ans;

    for (var i = 0; i < ansList.length; ++i) {
      ans = ansList[i];
      if (ans.isCorrectAnswer) return i;
    }

    return -1;
  }
};
PERadioAnswerList.property.questionId = {
  /***
   * @this PERadioAnswerList
   * @param value
   */
  set: function (value) {
    this._questionId = value;
    (0, _Core.$$)(_APEditableChoiceAnswer.default.tag, this).forEach(function (ansELt) {
      ansELt.questionId = value;
    });
  },

  /***
   * @this PERadioAnswerList
   * @returns {string} value
   */
  get: function () {
    return this._questionId;
  }
};
PERadioAnswerList.eventHandler = {};

PERadioAnswerList.eventHandler.moreAction = function (event) {
  switch (event.action) {
    case 'new':
      this.addNew(event);
      break;

    case 'other':
      this.addOther(event);
      break;
  }
};

PERadioAnswerList.eventHandler.orderchange = function (event) {
  this.emit('change', {
    type: 'change',
    target: this,
    propertyName: 'data',
    originalEvent: event.originalEvent || event.originEvent || event
  }, this);
};

_Core.default.install(PERadioAnswerList);

var _default = PERadioAnswerList;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/APMoreCheckboxAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/APMoreCheckboxAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/radioanswer.css");

var _utils = require("absol-acomp/js/utils");

var _APEditableChoiceAnswer = _interopRequireDefault(require("./APEditableChoiceAnswer"));

var _APEditableCheckboxAnswer = _interopRequireDefault(require("./APEditableCheckboxAnswer"));

var _APMoreChoiceAnswer = _interopRequireDefault(require("./APMoreChoiceAnswer"));




/**
 * @extends AElement
 * @constructor
 */
function APMoreCheckboxAnswer() {
  _APMoreChoiceAnswer.default.call(this);
}

APMoreCheckboxAnswer.tag = 'APMoreCheckboxAnswer'.toLowerCase();
Object.assign(APMoreCheckboxAnswer.prototype, _APMoreChoiceAnswer.default.prototype);
APMoreCheckboxAnswer.prototype.selectConstruction = _APEditableCheckboxAnswer.default.prototype.selectConstruction;
APMoreCheckboxAnswer.render = _APMoreChoiceAnswer.default.render;
APMoreCheckboxAnswer.eventHandler = {};

APMoreCheckboxAnswer.eventHandler.action = function (action, event) {
  this.emit('action', {
    type: 'action',
    action: action,
    target: this,
    originalEvent: event
  }, this);
};

APMoreCheckboxAnswer.property = Object.assign({}, _APMoreChoiceAnswer.default.property);

_Core.default.install(APMoreCheckboxAnswer);

var _default = APMoreCheckboxAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/APOtherCheckboxAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/APOtherCheckboxAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/radioanswer.css");

var _utils = require("absol-acomp/js/utils");

var _APEditableChoiceAnswer = _interopRequireDefault(require("./APEditableChoiceAnswer"));

var _APOtherChoiceAnswer = _interopRequireDefault(require("./APOtherChoiceAnswer"));

var _APEditableCheckboxAnswer = _interopRequireDefault(require("./APEditableCheckboxAnswer"));




/**
 * @extends AElement
 * @constructor
 */
function APOtherCheckboxAnswer() {
  _APOtherChoiceAnswer.default.call(this);
}

APOtherCheckboxAnswer.tag = 'APOtherCheckboxAnswer'.toLowerCase();
Object.assign(APOtherCheckboxAnswer.prototype, _APOtherChoiceAnswer.default.prototype);
APOtherCheckboxAnswer.prototype.selectConstruction = _APEditableCheckboxAnswer.default.prototype.selectConstruction;
APOtherCheckboxAnswer.render = _APOtherChoiceAnswer.default.render;
APOtherCheckboxAnswer.eventHandler = Object.assign({}, _APOtherChoiceAnswer.default.eventHandler);
APOtherCheckboxAnswer.property = Object.assign({}, _APOtherChoiceAnswer.default.property);

_Core.default.install(APOtherCheckboxAnswer);

var _default = APOtherCheckboxAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/PECheckboxAnswerList.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/PECheckboxAnswerList.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/question.css");

var _APEditableCheckboxAnswer = _interopRequireDefault(require("./APEditableCheckboxAnswer"));

var _PERadioAnswerList = _interopRequireDefault(require("./PERadioAnswerList"));

var _APMoreCheckboxAnswer = _interopRequireDefault(require("./APMoreCheckboxAnswer"));

var _APOtherCheckboxAnswer = _interopRequireDefault(require("./APOtherCheckboxAnswer"));




/***
 * @extends PERadioAnswerList
 * @constructor
 */
function PECheckboxAnswerList() {
  _PERadioAnswerList.default.call(this);
}

PECheckboxAnswerList.tag = 'PECheckboxAnswerList'.toLowerCase();
PECheckboxAnswerList.render = _PERadioAnswerList.default.render;
PECheckboxAnswerList.property = Object.assign({}, _PERadioAnswerList.default.property);
PECheckboxAnswerList.prototype = Object.assign({}, _PERadioAnswerList.default.prototype);
PECheckboxAnswerList.eventHandler = Object.assign({}, _PERadioAnswerList.default.eventHandler);
PECheckboxAnswerList.prototype.peClassName = 'ape-checkbox-answer-list';
PECheckboxAnswerList.prototype.answerTag = _APEditableCheckboxAnswer.default.tag;
PECheckboxAnswerList.prototype.otherTag = _APOtherCheckboxAnswer.default.tag;
PECheckboxAnswerList.prototype.moreTag = _APMoreCheckboxAnswer.default.tag;
PECheckboxAnswerList.property.correct_answer = {
  set: function (value) {
    if (!(value instanceof Array)) value = [value];
    var dict = value.reduce(function (ac, cr) {
      ac[cr] = true;
      return ac;
    }, {});
    var ans;
    var ansList = (0, _Core.$$)(PECheckboxAnswerList.prototype.answerTag, this);

    for (var i = 0; i < ansList.length; ++i) {
      ans = ansList[i];
      ans.isCorrectAnswer = dict[i];
    }
  },
  get: function () {
    var ansList = (0, _Core.$$)(PECheckboxAnswerList.prototype.answerTag, this);
    return ansList.map(function (ans, i) {
      return ans.isCorrectAnswer ? i : -1;
    }).filter(function (v) {
      return v >= 0;
    });
  }
};

_Core.default.install(PECheckboxAnswerList);

var _default = PECheckboxAnswerList;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/APEditableSection.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/APEditableSection.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../Core"));

require("../../css/common.css");

require("../../css/section.css");

var _utils = require("absol-acomp/js/utils");

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));

var _utils2 = require("../../utils");




/***
 * @extends AElement
 * @constructor
 */
function APEditableSection() {
  this.imageFiles = [];
  this.$idx = (0, _Core.$)('.ap-editable-question-index-input', this).on('change', this.eventHandler.idxInputChange);
  this.$imagebtn = (0, _Core.$)('.ap-editable-section-image-btn-ctn button', this).on('click', this.eventHandler.clickAddImage);
  this.$imageCtn = (0, _Core.$)('.ap-editable-image-ctn', this);
  this.$attachmentAddBtn = (0, _Core.$)('.as-message-input-attachment-add-btn', this).on('click', this.eventHandler.clickAddImage);
  /***
   *
   * @type {PreInput}
   */

  this.$description = (0, _Core.$)('.ap-editable-section-description', this).on('focus', this.eventHandler.descInputFocus).on('blur', this.eventHandler.descInputBlur);
  this.$name = (0, _Core.$)('.ap-editable-section-name', this).on('change', this.eventHandler.nameInputChange);
  this.$actionBtns = (0, _Core.$$)('.ap-editable-section-tool button', this).forEach(btn => {
    btn.on('click', this.eventHandler.clickActionButton.bind(this, btn.attr('data-action')));
  });
  this._data = new _Attributes.default(this);

  this._data.loadAttributeHandlers(this.dataHandlers);

  this.idx = 1;
}

APEditableSection.tag = "APEditableSection".toLowerCase();

APEditableSection.render = function () {
  return (0, _Core._)({
    extendEvent: ['action', 'change'],
    class: ['ap-block', 'ap-editable-section'],
    child: [{
      class: 'ap-editable-section-header',
      child: [{
        class: 'ap-editable-section-idx',
        child: [{
          class: 'ap-field-name',
          child: {
            tag: 'span',
            child: {
              text: 'Thứ tự section'
            }
          }
        }, {
          tag: 'input',
          class: ['ap-input', 'ap-editable-question-index-input'],
          attr: {
            type: 'number',
            pattern: "\d*",
            inputmode: "decimal",
            value: 1,
            step: 1,
            min: 1,
            max: 3200,
            readonly: 'true'
          }
        }]
      }, {
        class: 'ap-editable-section-tool',
        child: [{
          tag: 'button',
          class: 'ap-button',
          attr: {
            'data-action': 'merge_with_above',
            title: 'Hợp nhất với section trước'
          },
          child: 'span.mdi.mdi-call-merge'
        }, {
          tag: 'button',
          class: 'ap-button',
          attr: {
            "data-action": 'delete',
            title: 'Xóa section'
          },
          child: 'span.mdi.mdi-delete-forever'
        }]
      }]
    }, {
      class: 'ap-editable-section-content',
      child: [{
        class: 'ap-editable-section-name-ctn',
        child: [{
          child: {
            class: 'ap-field-name',
            child: {
              tag: 'span',
              child: {
                text: 'Tên Section'
              }
            }
          }
        }, {
          tag: 'input',
          attr: {
            type: 'text'
          },
          class: ['ap-input', 'ap-editable-section-name']
        }]
      }, {
        class: 'ap-editable-section-description-ctn',
        child: [{
          child: {
            class: 'ap-field-name',
            child: {
              tag: 'span',
              child: {
                text: 'Mô tả Section'
              }
            }
          }
        }, {
          tag: _PreInput.default.tag,
          class: ['ap-input', 'ap-editable-section-description']
        }]
      }, {
        class: 'ap-editable-image-ctn',
        child: [{
          tag: 'button',
          class: 'as-message-input-attachment-add-btn',
          child: [// 'span.mdi.mdi-arrow-down-bold.as-message-input-attachment-add-btn-drop',
          {
            tag: 'span',
            class: 'as-message-input-attachment-add-btn-plus',
            child: {
              text: "+"
            }
          }]
        }]
      }, {
        class: 'ap-editable-section-image-btn-ctn',
        child: {
          tag: 'button',
          class: 'ap-button',
          child: 'span.mdi.mdi-image-outline'
        }
      }]
    }]
  });
};

APEditableSection.prototype.apBlockType = "section";
/***
 *
 * @param {File|string} file
 * @param {Event|*} originalEvent
 * @public
 */

APEditableSection.prototype._addImage = function (file, originalEvent) {
  var thisA = this;
  var src;
  var fileName;

  if (typeof file === "string") {
    src = file;
    fileName = file.split('/').pop() || '';
  } else if (file instanceof Blob || file instanceof File) {
    src = (0, _utils2.toImageUrl)(file);
    fileName = file.name;
  } else return;

  this.imageFiles.push(file);
  this.addClass('ap-has-image');
  var itemElt = (0, _Core._)({
    class: ['as-message-input-attach-preview', 'as-image'],
    attr: {
      title: file.name
    },
    child: [{
      class: 'as-message-input-attach-preview-image',
      style: {
        backgroundImage: 'url(' + src + ')'
      }
    }, {
      tag: 'button',
      class: 'as-message-input-attach-preview-close-btn',
      child: 'span.mdi.mdi-close',
      attr: {
        title: 'remove'
      },
      on: {
        click: function (event) {
          var idx = thisA.imageFiles.indexOf(file);

          if (idx >= 0) {
            thisA.imageFiles.splice(idx, 1);
          }

          itemElt.remove();

          if (thisA.imageFiles.length === 0) {
            thisA.removeClass('ap-has-image');
          }

          thisA.emit('change', {
            type: 'change',
            target: thisA,
            fieldName: 'images'
          }, thisA);
        }
      }
    }, {
      class: 'as-message-input-attach-preview-info',
      child: [{
        class: 'as-message-input-attach-preview-name',
        child: {
          text: fileName
        }
      }, {
        class: 'as-message-input-attach-preview-size',
        child: {
          text: (0, _utils.fileSize2Text)(file.size)
        }
      }]
    }]
  });
  this.$imageCtn.addChildBefore(itemElt, this.$attachmentAddBtn);
  if (originalEvent) this.emit('change', {
    type: 'change',
    target: this,
    fieldName: 'images'
  }, this);
};

APEditableSection.property = {};
APEditableSection.property.idx = {
  set: function (value) {
    if (typeof value !== "number") value = 1;
    value = Math.max(1, Math.min(3200, value)) << 0;
    this.$idx.value = value;
    this.attr('data-idx', value);
  },
  get: function () {
    return parseInt(this.$idx.value);
  }
};
APEditableSection.property.data = {
  set: function (value) {
    Object.assign(this._data, value);
  },
  get: function () {
    return this._data;
  }
};
APEditableSection.eventHandler = {};
/***
 * @this APEditableSection
 */

APEditableSection.eventHandler.clickAddImage = function (event) {
  var thisA = this; // var image = prompt("Enter image url: ", '');
  // if (image && image.trim().length >0){
  //     thisA._addImage(image.trim(), event);
  // }
  // //

  (0, _utils.openFileDialog)({
    accept: "image/*"
  }).then(files => {
    if (files && files[0]) {
      thisA._addImage(files[0], event);
    }
  });
};

APEditableSection.eventHandler.clickActionButton = function (action, event) {
  this.emit('action', {
    action: action,
    target: this,
    type: 'action',
    originalEvent: event
  }, this);
};

APEditableSection.eventHandler.idxInputChange = function (event) {
  this.$idx.value = Math.min(32000, Math.max(1, parseInt(this.$idx.value))) << 0;
  this.emit('action', {
    action: 'set_idx',
    idx: this.idx,
    target: this,
    type: 'action',
    originalEvent: event
  }, this);
};
/***
 * @this APEditableSection
 * @param event
 */


APEditableSection.eventHandler.nameInputChange = function (event) {
  this.emit('change', {
    type: 'change',
    target: this,
    originalEvent: event,
    fieldName: 'name'
  }, this);
};
/***
 * @this APEditableSection
 * @param event
 */


APEditableSection.eventHandler.descInputFocus = function (event) {
  this._prevDescVal = this.$description.value;
};
/***
 * @this APEditableSection
 * @param event
 */


APEditableSection.eventHandler.descInputBlur = function (event) {
  var value = this.$description.value;

  if (value !== this._prevDescVal) {
    this.emit('change', {
      type: 'change',
      target: this,
      originalEvent: event,
      fieldName: 'description'
    }, this);
  }
};

APEditableSection.prototype.dataHandlers = {};
APEditableSection.prototype.dataHandlers.name = {
  set: function (value) {
    value = (value || '') + '';
    this.$name.value = value;
  },
  get: function () {
    return this.$name.value;
  }
};
APEditableSection.prototype.dataHandlers.description = {
  set: function (value) {
    value = (value || '') + '';
    this.$description.value = value;
  },
  get: function () {
    return this.$description.value;
  }
};
APEditableSection.prototype.dataHandlers.images = {
  /***
   * @this APEditableSection
   * @param images
   */
  set: function (images) {
    if (!(images instanceof Array)) images = [];

    while (this.$imageCtn.firstChild !== this.$attachmentAddBtn) {
      this.$imageCtn.removeChild(this.$imageCtn.firstChild);
    }

    this.imageFiles.splice(0, this.imageFiles.length);
    images.forEach(function (file) {
      this._addImage(file);
    }.bind(this));
  },
  get: function () {
    return this.imageFiles.slice();
  }
};
APEditableSection.prototype.dataHandlers.ident = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    this.attr('data-ident', value + '');
  },
  get: function () {
    var ident = parseInt(this.attr('data-ident'));
    if (!(0, _utils.isRealNumber)(ident)) ident = 0;
    return ident;
  }
};

_Core.default.install(APEditableSection);

var _default = APEditableSection;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/editor/question/APEditableQuestion.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/editor/question/APEditableQuestion.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

require("../../../css/question.css");

var _APEditableChoiceAnswer = _interopRequireDefault(require("./APEditableChoiceAnswer"));

var _QuestionTypeItems = _interopRequireWildcard(require("../../../contants/QuestionTypeItems"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _APEditableCheckboxAnswer = _interopRequireDefault(require("./APEditableCheckboxAnswer"));

var _PEShortAnswerField = _interopRequireDefault(require("./PEShortAnswerField"));

var _PEParagraphAnswerField = _interopRequireDefault(require("./PEParagraphAnswerField"));

var _PELinearScaleAnswerField = _interopRequireDefault(require("./PELinearScaleAnswerField"));

var _PERadioAnswerList = _interopRequireDefault(require("./PERadioAnswerList"));

var _PECheckboxAnswerList = _interopRequireDefault(require("./PECheckboxAnswerList"));

var _APEditableSection = _interopRequireDefault(require("../APEditableSection"));

var _utils = require("absol-acomp/js/utils");




/****
 * @extends AElement
 * @constructor
 */
function APEditableQuestion() {
  this.imageFiles = [];
  this.$questionTypeInput = (0, _Core.$)('.ap-editable-question-type-input', this).on('select', this.eventHandler.typeSelect);
  this.$content = (0, _Core.$)('.ap-editable-question-content', this);
  this.$content.on('focus', this.eventHandler.preInputFocus.bind(this, this.$content)).on('blur', this.eventHandler.preInputBlur.bind(this, this.$content));
  this.$description = (0, _Core.$)('.ap-editable-question-description', this);
  this.$description.on('focus', this.eventHandler.preInputFocus.bind(this, this.$description)).on('blur', this.eventHandler.preInputBlur.bind(this, this.$content));
  this.$imagebtn = (0, _Core.$)('.ap-editable-question-image-btn-ctn button', this).on('click', this.eventHandler.clickAddImage);
  this.$imageCtn = (0, _Core.$)('.ap-editable-image-ctn', this);
  this.$attachmentAddBtn = (0, _Core.$)('.as-message-input-attachment-add-btn', this).on('click', this.eventHandler.clickAddImage);
  this.$answer = (0, _Core.$)('.ap-editable-answer-list', this);
  this.$listHeader = (0, _Core.$)('.ap-editable-answer-list-header', this);
  this.$noteCtn = (0, _Core.$)('.ap-editable-answer-note-ctn', this);
  this.$note = (0, _Core.$)('.ap-editable-answer-note', this).on('keyup', () => {
    if (this.$note.value.trim().length > 0) {
      this.$noteCtn.removeClass('ap-empty-filed');
    } else {
      this.$noteCtn.addClass('ap-empty-filed');
    }
  });
  this.$note.on('focus', this.eventHandler.preInputFocus.bind(this, this.$note)).on('blur', this.eventHandler.preInputBlur.bind(this, this.$note));
  this.$requireCtn = (0, _Core.$)('.ap-editable-question-required-ctn', this);
  this.$required = (0, _Core.$)('.ap-editable-question-required', this).on('change', this.eventHandler.requiredSwitchChange);
  this.$score = (0, _Core.$)('.ap-editable-question-point', this).on('change', this.eventHandler.scoreChange);
  this.$idx = (0, _Core.$)('.ap-editable-question-index-input', this).on('change', this.eventHandler.idxInputChange);
  this.$actionBtns = (0, _Core.$$)('.ap-editable-question-tool .ap-button', this);
  this.$actionBtns.forEach(function (btn) {
    btn.on('click', this.eventHandler.clickActionButton.bind(this, btn.attr('data-action')));
  }.bind(this));

  this._injectStyle();

  this.idx = 1;
  this.questionId = (0, _stringGenerate.randomIdent)(12);
  this._backupData = {};
  this._data = new _Attributes.default(this);
  this._data.type = 'NULL';

  this._data.loadAttributeHandlers(this.dataHandlers);

  this._data.type = 'multiple_choice';
  /***
   * @name data
   * @memberOf APEditableQuestion#
   */
}

APEditableQuestion.tag = 'APEditableQuestion'.toLowerCase();

APEditableQuestion.render = function () {
  var idPrefix = (0, _stringGenerate.randomIdent)(8);
  return (0, _Core._)({
    extendEvent: ['action', 'change'],
    class: ['ap-block', 'ap-editable-question'],
    attr: {
      'data-ident': '0'
    },
    child: [{
      class: 'ap-editable-question-header',
      child: [{
        class: 'ap-editable-question-index',
        child: [{
          class: 'ap-field-name',
          child: {
            tag: 'span',
            child: {
              text: 'Thứ tự câu hỏi'
            }
          }
        }, {
          tag: 'input',
          class: ['ap-input', 'ap-editable-question-index-input'],
          attr: {
            type: 'number',
            pattern: "\d*",
            inputmode: "decimal",
            value: 1,
            readonly: 'true'
          }
        }]
      }, {
        class: 'ap-editable-question-type',
        child: [{
          class: 'ap-field-name',
          child: {
            tag: 'span',
            child: {
              text: 'Loại câu hỏi'
            }
          }
        }, {
          tag: 'ribbonbutton',
          class: 'ap-editable-question-type-input',
          props: {
            text: 'Trắc nghiệm',
            icon: 'span.mdi.mdi-radiobox-marked',
            items: _QuestionTypeItems.default
          }
        }]
      }, {
        class: 'ap-editable-question-option-ctn',
        child: [{
          class: 'ap-editable-question-point-ctn',
          child: [{
            tag: 'label',
            attr: {
              for: idPrefix + '_points'
            },
            child: {
              text: 'Điểm'
            }
          }, {
            tag: 'input',
            props: {
              value: '1'
            },
            class: ['ap-editable-question-point', 'ap-input'],
            attr: {
              type: 'number'
            },
            id: idPrefix + '_points'
          }]
        }, {
          class: 'ap-editable-question-required-ctn',
          child: [{
            tag: 'label',
            child: {
              text: 'Bắt buộc'
            }
          }, {
            tag: 'switch',
            class: 'ap-editable-question-required'
          }]
        }]
      }, {
        class: 'ap-editable-question-tool',
        child: [{
          tag: 'button',
          class: 'ap-button',
          attr: {
            'data-action': 'duplicate'
          },
          child: 'span.mdi.mdi-file-multiple'
        }, {
          tag: 'button',
          class: 'ap-button',
          attr: {
            "data-action": 'delete'
          },
          child: 'span.mdi.mdi-delete-forever'
        }]
      }]
    }, {
      class: 'ap-editable-question-content-ctn',
      child: [{
        child: {
          class: 'ap-field-name',
          child: {
            tag: 'span',
            child: {
              text: 'Nội dung câu hỏi'
            }
          }
        }
      }, {
        tag: 'preinput',
        attr: {
          'data-field-name': 'content'
        },
        class: 'ap-editable-question-content',
        props: {
          value: ''
        }
      }]
    }, {
      class: 'ap-editable-question-description-ctn',
      child: [{
        child: {
          class: 'ap-field-name',
          child: {
            tag: 'span',
            child: {
              text: 'Mô tả'
            }
          }
        }
      }, {
        tag: 'preinput',
        attr: {
          'data-field-name': 'description'
        },
        class: 'ap-editable-question-description'
      }]
    }, {
      class: 'ap-editable-question-image-btn-ctn',
      child: {
        tag: 'button',
        class: 'ap-button',
        child: 'span.mdi.mdi-image-outline'
      }
    }, {
      class: 'ap-editable-image-ctn',
      child: [{
        tag: 'button',
        class: 'as-message-input-attachment-add-btn',
        child: [// 'span.mdi.mdi-arrow-down-bold.as-message-input-attachment-add-btn-drop',
        {
          tag: 'span',
          class: 'as-message-input-attachment-add-btn-plus',
          child: {
            text: "+"
          }
        }]
      }]
    }, {
      class: 'ap-editable-answer-list-header',
      child: [{
        class: 'ap-editable-answer-list-header-true-answer-text',
        child: {
          text: 'Đáp án đúng'
        }
      }]
    }, {
      class: 'ap-editable-answer-list'
    }, {
      class: 'ap-editable-answer-note-ctn',
      child: [{
        class: 'ap-field-name',
        child: {
          tag: 'span',
          child: {
            text: 'Ghi chú'
          }
        }
      }, {
        tag: 'preinput',
        attr: {
          "data-field-name": 'feedback'
        },
        class: ['ap-editable-answer-note', 'ap-input']
      }]
    } //,
    // {
    //     class: 'ap-editable-question-footer',
    //     child: [
    //         {
    //             child: [
    //
    //             ]
    //         },
    //
    //     ]
    // }
    ]
  });
};

APEditableQuestion.prototype.apBlockType = "question";

APEditableQuestion.prototype._injectStyle = function () {
  this.$questionTypeInput.addChild((0, _Core._)({
    tag: 'button',
    class: 'absol-selectmenu-btn',
    child: 'dropdown-ico'
  }));
};

APEditableQuestion.eventHandler = {};

APEditableQuestion.eventHandler.typeSelect = function (event) {
  var item = event.item;
  var prevType = this.data.type;
  var newType = item.questionType;
  if (prevType === newType) return;
  var newData;

  if ((prevType === 'checkboxes' || prevType === 'multiple_choice') && (newType === 'checkboxes' || newType === 'multiple_choice')) {
    newData = Object.assign({}, JSON.parse(JSON.stringify(this.data)), {
      type: newType
    });

    if (newType === 'checkboxes') {
      if ((0, _utils.isNaturalNumber)(newData.correct_answer)) {
        newData.correct_answer = [newData.correct_answer];
      } else {
        newData.correct_answer = [];
      }
    } else {
      if (newData.correct_answer && newData.correct_answer.length > 0) {
        newData.correct_answer = newData.correct_answer[0];
      } else {
        newData.correct_answer = null;
      }
    }

    this.data = newData;
  } else {
    this.data.type = item.questionType;
  }

  this.emit('change', {
    type: 'change',
    target: this,
    fieldName: 'type',
    originalEvent: event
  }, this);
};

APEditableQuestion.eventHandler.clickActionButton = function (action, event) {
  console.log(action);
  this.emit('action', {
    type: 'action',
    target: this,
    action: action,
    originalEvent: event
  }, this);
};

APEditableQuestion.eventHandler.idxInputChange = function (event) {
  this.$idx.value = Math.min(32000, Math.max(1, parseInt(this.$idx.value))) << 0;
  this.emit('action', {
    type: 'action',
    target: this,
    action: 'set_idx',
    idx: this.idx,
    originalEvent: event
  }, this);
};

APEditableQuestion.eventHandler.preInputFocus = function (inputElt, event) {
  this['_prev_' + inputElt.attr('data-field-name')] = inputElt.value;
};

APEditableQuestion.eventHandler.preInputBlur = function (inputElt, event) {
  var fieldName = inputElt.attr('data-field-name');
  var prevVal = this['_prev_' + fieldName];
  var value = inputElt.value;

  if (prevVal !== value) {
    this.emit('change', {
      type: 'change',
      target: this,
      fieldName: fieldName,
      originalEvent: event
    }, this);
  }
};

APEditableQuestion.eventHandler.requiredSwitchChange = function (event) {
  if (this.$required.checked) {
    this.$requireCtn.removeClass('ap-empty-field');
  } else {
    this.$requireCtn.addClass('ap-empty-field');
  }

  this.emit('change', {
    type: 'change',
    target: this,
    fieldName: 'required',
    originalEvent: event
  }, this);
};

APEditableQuestion.eventHandler.scoreChange = function (event) {
  this.emit('change', {
    type: 'change',
    target: this,
    fieldName: 'required',
    originalEvent: event
  }, this);
};

APEditableQuestion.property = {};
APEditableQuestion.property.idx = {
  set: function (value) {
    if (typeof value !== "number") value = 1;
    value = Math.max(1, Math.min(32000, value)) << 0;
    this.$idx.value = value;
    this.attr('data-idx', value);
  },
  get: function () {
    return parseInt(this.$idx.value);
  }
};
APEditableQuestion.property.questionId = {
  set: function (value) {
    value = value || (0, _stringGenerate.randomIdent)(12);
    this._questionId = value;
    (0, _Core.$$)(_APEditableChoiceAnswer.default.tag, this).forEach(function (aw) {
      aw.questionId = value;
    });
  },
  get: function () {
    return this._questionId;
  }
};
APEditableQuestion.property.data = {
  set: function (value) {
    var data = Object.assign({}, value);
    this._data.type = data.type || 'multiple_choice';
    if ('answer' in data) this._data.answer = data.answer;
    if ('correct_answer' in data) this._data.correct_answer = data.correct_answer;
    delete data.type;
    delete data.answer;
    delete data.correct_answer;
    Object.assign(this._data, value);
  },
  get: function () {
    return this._data;
  }
};
APEditableQuestion.property.acceptQuestionTypes = {
  /***
   * @this {APEditableQuestion}
   * @param value
   */
  set: function (value) {
    value = value || null;
    if (typeof value === "string") value = [value];

    if (value && value.filter) {
      value = value.filter(t => {
        return !!_QuestionTypeItems.QuestionTypeDict[t];
      });
    }

    if (value && value.length === 0) value = null;
    this._acceptQuestionTypes = value;

    if (value) {
      this.$questionTypeInput.items = value.map(t => _QuestionTypeItems.QuestionTypeDict[t]);
    } else {
      this.$questionTypeInput.items = _QuestionTypeItems.default;
    }
  },
  get: function () {
    return this._acceptQuestionTypes || null;
  }
};
APEditableQuestion.property.readOnly = {
  /***
   * @this {APEditableQuestion}
   * @param value
   */
  set: function (value) {
    if (value) {
      this.addClass('ap-read-only');
    } else {
      this.removeClass('ap-read-only');
    }

    [this.$score, this.$description, this.$content, this.$note].forEach(elt => elt.readOnly = !!value);
  },
  get: function () {
    return this.hasClass('ap-read-only');
  }
};
APEditableQuestion.prototype.dataHandlers = {};
APEditableQuestion.prototype.dataHandlers.ident = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    this.attr('data-ident', value + '');
  },
  get: function () {
    var ident = parseInt(this.attr('data-ident'));
    if (!(0, _utils.isRealNumber)(ident)) ident = 0;
    return ident;
  }
};
APEditableQuestion.prototype.dataHandlers.type = {
  /***
   * @this APEditableQuestion
   * @param {string} value
   * @param {Ref} ref
   * @return {string}
   */
  set: function (value, ref) {
    if (value === 'NULL') return value;
    var cValue = ref.get();

    var item = _QuestionTypeItems.default.find(function (item) {
      return item.questionType === value;
    });

    if (item) {
      this.$questionTypeInput.text = item.text;
      this.$questionTypeInput.icon = item.icon;
    } else {
      value = ref.get();
    }

    var backup;
    var typeHandler;
    var data;

    if (cValue !== value) {
      data = Object.assign({}, this.data);

      if (cValue !== 'NULL') {
        this._backupData[cValue] = {
          data: data,
          $answer: this.$answer
        };
      }

      backup = this._backupData[value];

      if (!backup) {
        backup = {};
        typeHandler = this.typeHandlers[value];

        if (typeHandler) {
          backup.$answer = typeHandler.createAnswer.call(this);
        }
      }

      var oldAWElt = this.$answer;
      this.$answer = backup.$answer;
      oldAWElt.selfReplace(this.$answer);
      if (cValue && cValue.replace) this.removeClass('ap-editable-question-type-' + cValue.replace(/[_]/g, '-'));
      this.addClass('ap-editable-question-type-' + value.replace(/[_]/g, '-'));
    }

    return value;
  }
};
APEditableQuestion.prototype.dataHandlers.content = {
  set: function (value) {
    value = value || '';
    if (typeof value !== "string") value = value + '';
    this.$content.value = value;
  },
  get: function () {
    return this.$content.value;
  }
};
APEditableQuestion.prototype.dataHandlers.description = {
  set: function (value) {
    value = value || '';
    if (typeof value !== "string") value = value + '';
    this.$description.value = value;
  },
  get: function () {
    return this.$description.value;
  }
};
APEditableQuestion.prototype.dataHandlers.images = _APEditableSection.default.prototype.dataHandlers.images;
APEditableQuestion.prototype._addImage = _APEditableSection.default.prototype._addImage;
APEditableQuestion.eventHandler.clickAddImage = _APEditableSection.default.eventHandler.clickAddImage;
APEditableQuestion.prototype.dataHandlers.answer = {
  /***
   * @this APEditableQuestion
   * @param value
   */
  set: function (value) {
    var typeHandler = this.typeHandlers[this._data.type];

    if (typeHandler) {
      typeHandler.loadAnswer.call(this, value);
    }
  },
  get: function () {
    var typeHandler = this.typeHandlers[this._data.type];

    if (typeHandler && typeHandler.getAnswer) {
      typeHandler.getAnswer.call(this, value);
    } else {
      return this.$answer.data;
    }
  },
  export: function () {
    if (['multiple_choice', 'checkboxes', 'linear_scale'].indexOf(this._data.type) >= 0) {
      var data = this.$answer.data;
      if (data && data.export) data = data.export();

      if (data instanceof Array) {
        data = data.map(function (it) {
          if (it && it.export) return it.export();
          return it;
        });
      }

      return data;
    } else return undefined;
  }
};
APEditableQuestion.prototype.dataHandlers.correct_answer = {
  /***
   * @this APEditableQuestion
   * @param value
   */
  set: function (value) {
    var type = this._data.type;

    if (['multiple_choice', 'checkboxes'].indexOf(type) >= 0) {
      this.$answer.correct_answer = value;
    }
  },
  get: function () {
    var type = this._data.type;

    if (['multiple_choice', 'checkboxes'].indexOf(type) >= 0) {
      return this.$answer.correct_answer;
    } else return null;
  },
  export: function () {
    var type = this._data.type;

    if (['multiple_choice', 'checkboxes'].indexOf(type) >= 0) {
      return this.$answer.correct_answer;
    } else return undefined;
  }
};
APEditableQuestion.prototype.dataHandlers.note = {
  set: function (value) {
    value = (value || '') + '';
    this.$note.value = (value || '') + '';

    if (value.trim().length > 0) {
      this.$noteCtn.removeClass('ap-empty-filed');
    } else {
      this.$noteCtn.addClass('ap-empty-filed');
    }
  },
  get: function () {
    return this.$note.value;
  }
};
APEditableQuestion.prototype.dataHandlers.required = {
  set: function (value) {
    if (value === 'false') value = false;else if (value === 'true') value = true;
    this.$required.checked = !!value;

    if (value) {
      this.$requireCtn.removeClass('ap-empty-field');
    } else {
      this.$requireCtn.addClass('ap-empty-field');
    }
  },
  get: function () {
    return this.$required.checked;
  }
};
APEditableQuestion.prototype.dataHandlers.score = {
  set: function (value) {
    if (typeof value === 'string') value = parseInt(value);

    if (typeof value !== 'number') {
      value = NaN;
    }

    if (isNaN(value)) {
      this.$score.value = '';
    } else {
      this.$score.value = value + '';
    }
  },
  get: function () {
    // if (['short_answer', 'paragraph'].indexOf(this._data.type) < 0)
    //all question has score
    return parseInt(this.$score.value); // else return NaN;
  },
  export: function () {
    if (['short_answer', 'paragraph'].indexOf(this._data.type) < 0) return parseInt(this.$score.value);else return undefined;
  }
};
APEditableQuestion.prototype.typeHandlers = {};
APEditableQuestion.prototype.typeHandlers.multiple_choice = {
  /***
   * @this APEditableQuestion
   * @return {*}
   */
  createAnswer: function () {
    var _this = this;

    return (0, _Core._)({
      tag: _PERadioAnswerList.default.tag,
      on: {
        change: function (event) {
          var ev = {
            type: 'change',
            target: _this,
            originalEvent: event.originalEvent || event
          };

          if (event.propertyName === 'correct_answer') {
            ev.fieldName = 'correct_answer';
          } else if (event.fieldName === 'text' || event.fieldName === 'images') {
            ev.fieldName = 'answer';
          }

          _this.emit('change', ev, _this);
        }
      }
    });
  },

  /***
   * @this APEditableQuestion
   * @param answers
   */
  loadAnswer: function (answers) {
    var questionId = this.questionId;
    var answerElt = this.$answer;
    answerElt.data = answers;
    answerElt.questionId = questionId;

    if (answers.length > 0) {
      this.$listHeader.removeStyle('display');
    } else {
      this.$listHeader.addStyle('display', 'none');
    }
  }
};
APEditableQuestion.prototype.typeHandlers.checkboxes = {
  createAnswer: function () {
    var _this = this;

    return (0, _Core._)({
      tag: _PECheckboxAnswerList.default.tag,
      on: {
        change: function (event) {
          var ev = {
            type: 'change',
            target: _this,
            originalEvent: event.originalEvent || event
          };

          if (event.propertyName === 'correct_answer') {
            ev.fieldName = 'correct_answer';
          } else if (event.fieldName === 'text' || event.fieldName === 'images') {
            ev.fieldName = 'answer';
          }

          _this.emit('change', ev, _this);
        }
      }
    });
  },

  /***
   * @this APEditableQuestion
   * @param answers
   */
  loadAnswer: function (answers) {
    var answerElt = this.$answer;
    answerElt.data = answers;

    if (answers.length > 0) {
      this.$listHeader.removeStyle('display');
    } else {
      this.$listHeader.addStyle('display', 'none');
    }
  }
};
APEditableQuestion.prototype.typeHandlers.short_answer = {
  createAnswer: function () {
    return (0, _Core._)(_PEShortAnswerField.default.tag);
  },

  /***
   * @this APEditableQuestion
   * @param answers
   */
  loadAnswer: function (answers) {
    this.$answer.data = answers;
    this.$listHeader.addStyle('display', 'none');
  }
};
APEditableQuestion.prototype.typeHandlers.paragraph = {
  createAnswer: function () {
    return (0, _Core._)(_PEParagraphAnswerField.default.tag);
  },

  /***
   * @this APEditableQuestion
   * @param answers
   */
  loadAnswer: function (answers) {
    this.$answer.data = answers;
    this.$listHeader.addStyle('display', 'none');
  }
};
APEditableQuestion.prototype.typeHandlers.linear_scale = {
  /***
   *
   * @this {APEditableQuestion}
   */
  createAnswer: function () {
    var self = this;
    var res = (0, _Core._)({
      tag: _PELinearScaleAnswerField.default.tag,
      on: {
        change: function (event) {
          self.emit('change', {
            type: 'change',
            target: self,
            fieldName: 'answer.' + event.fieldName,
            originalEvent: event.originalEvent || event
          }, self);
        }
      }
    });
    return res;
  },

  /***
   * @this APEditableQuestion
   * @param answers
   */
  loadAnswer: function (answers) {
    this.$answer.data = answers;
    this.$listHeader.addStyle('display', 'none');
  }
};

_Core.default.install(APEditableQuestion);

var _default = APEditableQuestion;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/viewer/question/PVShortAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/viewer/question/PVShortAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));



/***
 * @extends AElement
 * @constructor
 */
function PVShortAnswer() {
  this.addEventListener('change', this.eventHandler.textChange);
}

PVShortAnswer.tag = 'PVShortAnswer'.toLowerCase();

PVShortAnswer.render = function () {
  return (0, _Core._)({
    tag: 'input',
    extendEvent: ['resultchange'],
    class: ['ap-input', 'ap-short-answer'],
    attr: {
      type: 'text'
    }
  });
};

PVShortAnswer.property = {};
PVShortAnswer.property.result = {
  set: function (value) {
    this.value = (value || '') + '';
  },
  get: function () {
    return this.value;
  }
};
PVShortAnswer.property.readOnly = {
  set: function (value) {
    if (value) {
      this.attr('readonly', true);
      this.addClass('ap-readonly');
    } else {
      this.attr('readonly', undefined);
    }
  },
  get: function () {
    return this.containsClass('ap-readonly');
  }
};
PVShortAnswer.eventHandler = {};

PVShortAnswer.eventHandler.textChange = function (event) {
  this.emit('resultchange', {
    originalEvent: event,
    type: 'resultchange',
    target: this
  }, this);
};

_Core.default.install(PVShortAnswer);

var _default = PVShortAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/viewer/question/PVParagraphAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/viewer/question/PVParagraphAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));




/***
 * @extends PreInput
 * @constructor
 */
function PVParagraphAnswer() {
  this.on('focus', this.eventHandler.inputFocus).on('blur', this.eventHandler.inputBlur);
}

PVParagraphAnswer.tag = 'PVParagraphAnswer'.toLowerCase();

PVParagraphAnswer.render = function () {
  return (0, _Core._)({
    tag: _PreInput.default.tag,
    extendEvent: ['resultchange'],
    class: ['ap-input', 'ap-paragraph-answer']
  });
};

PVParagraphAnswer.property = {};
PVParagraphAnswer.property.result = {
  set: function (value) {
    this.value = (value || '') + '';
  },
  get: function () {
    return this.value;
  }
};
PVParagraphAnswer.eventHandler = {};

PVParagraphAnswer.eventHandler.inputFocus = function () {
  this._prevResult = this.value;
};

PVParagraphAnswer.eventHandler.inputBlur = function (event) {
  var value = this.value;

  if (this._prevResult !== value) {
    this.emit('resultchange', {
      originalEvent: event,
      type: 'resultchange',
      target: this
    }, this);
  }
};

_Core.default.install(PVParagraphAnswer);

var _default = PVParagraphAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/viewer/question/PVLinearScaleAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/viewer/question/PVLinearScaleAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _RadioButton = _interopRequireDefault(require("absol-acomp/js/RadioButton"));

var _DomSignal = _interopRequireDefault(require("absol/src/HTML5/DomSignal"));

var _utils = require("absol-acomp/js/utils");




function PVLinearScaleAnswer() {
  this.$minTitle = (0, _Core.$)('.ap-linear-scale-answer-min-title  span', this);
  this.$maxTitle = (0, _Core.$)('.ap-linear-scale-answer-max-title span', this);
  this.$table = (0, _Core.$)('.ap-linear-scale-answer-table', this);
  this.$firstCol = this.$table.firstChild;
  this.$lastCol = this.$table.lastChild;
  this.$radios = [];
  this.$firstCol.remove();
  this.$lastCol.remove();
  this.$domSignal = (0, _Core._)('attachhook').addTo(this);
  this.domSignal = new _DomSignal.default(this.$domSignal);
  this.domSignal.on('requestUpdateSize', this.updateSize.bind(this));
  this.domSignal.emit('requestUpdateSize');
  this._result = null;
  this._data = new _Attributes.default(this);

  this._data.loadAttributeHandlers(this.dataHandlers);

  this.id = (0, _stringGenerate.randomIdent)(8);
}

PVLinearScaleAnswer.tag = 'PVLinearScaleAnswer'.toLowerCase();

PVLinearScaleAnswer.render = function () {
  return (0, _Core._)({
    extendEvent: ['resultchange'],
    class: 'ap-linear-scale-answer',
    child: [{
      class: 'ap-linear-scale-answer-table',
      child: [{
        class: 'ap-linear-scale-answer-table-title-ctn-left',
        child: [{
          class: 'ap-linear-scale-answer-min-title',
          child: {
            tag: 'span',
            child: {
              text: 'Không đồng ý'
            }
          }
        }, {
          child: {
            tag: 'span',
            child: {
              text: "Trả lời"
            }
          }
        }]
      }, {
        class: 'ap-linear-scale-answer-table-title-ctn-right',
        child: [{
          class: 'ap-linear-scale-answer-min-title',
          child: {
            tag: 'span',
            child: {
              text: 'Hoàn toàn đồng ý'
            }
          }
        }, {}]
      }]
    }]
  });
};

PVLinearScaleAnswer.prototype.updateSize = function () {
  var leftBound = this.$firstCol.getBoundingClientRect();
  var lastBound = this.$lastCol.getBoundingClientRect();
  this.$table.addStyle('left', leftBound.width + 'px');
  this.$table.addStyle('right', lastBound.width + 'px');
};

PVLinearScaleAnswer.prototype._updateRadios = function () {
  var min = this._data.min;
  var value = this._result;
  if (!(0, _utils.isRealNumber)(min) || !(0, _utils.isRealNumber)(value)) return;

  for (var i = 0; i < this.$radios.length; ++i) {
    if (i + min === value) {
      this.$radios[i].checked = true;
    } else {
      this.$radios[i].checked = false;
    }
  }
};

PVLinearScaleAnswer.property = {};
PVLinearScaleAnswer.property.data = {
  set: function (value) {
    value = Object.assign({}, value);
    this._data.min = value.min;
    delete value.min;
    Object.assign(this._data, value);
  },
  get: function () {
    return this._data;
  }
};
PVLinearScaleAnswer.property.result = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = null;else value = Math.floor(value);
    this._result = value;

    this._updateRadios();
  },
  get: function () {
    return this._result;
  }
};
PVLinearScaleAnswer.property.readOnly = {
  set: function (value) {
    if (value) this.addClass('ap-readonly');else this.removeClass('ap-readonly');
  },
  get: function () {
    return this.containsClass('ap-readonly');
  }
};
PVLinearScaleAnswer.prototype.dataHandlers = {};
PVLinearScaleAnswer.prototype.dataHandlers.max = {
  /***
   * @this PVLinearScaleAnswer
   * @param max
   */
  set: function (max) {
    var self = this;
    var min = this._data.min;
    var n = max - min + 1;
    var id = this.id;
    var colElt;
    var radio;

    while (this.$table.childNodes.length < n) {
      colElt = (0, _Core._)({
        class: 'ap-linear-scale-answer-table-col',
        child: [{
          child: {
            tag: 'span',
            child: {
              text: '0'
            }
          }
        }, {
          child: {
            tag: _RadioButton.default.tag,
            props: {
              name: this.id + '_radio'
            },
            on: {
              change: function (event) {
                self.emit('resultchange', {
                  type: 'resultchange',
                  target: self,
                  originalEvent: event
                }, self);
              }
            }
          }
        }]
      });
      radio = (0, _Core.$)(_RadioButton.default.tag, colElt);
      radio.on('change', this.eventHandler.radioChange.bind(this, radio));
      this.$radios.push(radio);
      this.$table.addChild(colElt, this.$lastCol);
    }

    this.$table.firstChild.addChild(this.$firstCol);
    this.$table.lastChild.addChild(this.$lastCol);

    while (this.$table.childNodes.length > n) {
      this.$table.lastChild.remove();
      this.$radios.pop();
    }

    for (var i = 0; i < n; ++i) {
      this.$table.childNodes[i].firstChild.firstChild.firstChild.data = min + i + '';
      this.$table.childNodes[i].childNodes[1].firstChild.value = i;
      this.$table.childNodes[i].addStyle('width', Math.floor(1000 / n) / 10 + '%');
    }

    this._updateRadios();

    this.domSignal.emit('requestUpdateSize');
  }
};
PVLinearScaleAnswer.eventHandler = {};

PVLinearScaleAnswer.eventHandler.radioChange = function (radio, event) {
  this._result = parseInt(radio.value);
  this.emit('resultchange', {
    type: 'resultchange',
    target: this,
    originalEvent: event.originalEvent || event.originEvent || event
  }, this);
};

_Core.default.install(PVLinearScaleAnswer);

var _default = PVLinearScaleAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/viewer/question/PVMultipleChoiceAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/viewer/question/PVMultipleChoiceAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

var _stringGenerate = require("absol/src/String/stringGenerate");

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));

var _EventEmitter = require("absol/src/HTML5/EventEmitter");




/***
 * @extends AElement
 * @constructor
 */
function PVMultipleChoiceAnswer() {
  this._data = [];
  this._result = null;
  this._correctAnswer = null;
  this.$checkes = [];
  this.$answers = [];
  this.id = (0, _stringGenerate.randomIdent)(8);
}

PVMultipleChoiceAnswer.tag = 'PVMultipleChoiceAnswer'.toLowerCase();

PVMultipleChoiceAnswer.render = function () {
  return (0, _Core._)({
    extendEvent: ['resultchange'],
    class: 'ap-multiple-choice-answer',
    child: []
  });
};

PVMultipleChoiceAnswer.prototype.selectConstruction = {
  tag: 'radiobutton',
  class: 'ap-radio'
};

PVMultipleChoiceAnswer.prototype._updateResult = function () {
  var result = this._result;
  var correctAnswer = this._correctAnswer;
  var data = this._data;
  var self = this;
  if (!data) return;

  if (!result) {
    if (this.$otherText) {
      this.$otherText.value = '';
      this.$checkes.forEach(function (elt) {
        elt.checked = false;
      });
    }
  } else {
    this.$answers.forEach((ansElt, i) => {
      if (i === correctAnswer) {
        ansElt.addClass('ap-correct-answer');
      } else {
        ansElt.removeClass('ap-correct-answer');
      }

      if (i === result.idx) {
        ansElt.addClass('ap-result-answer');
      } else if ('other' in result && data[i] === 'other') {
        ansElt.addClass('ap-result-answer');
      } else {
        ansElt.removeClass('ap-result-answer');
      }
    });
    this.$checkes.forEach(function (elt, i) {
      if (i === result.idx) {
        elt.checked = true;
      } else if ('other' in result && data[i] === 'other') {
        elt.checked = true;
        if (self.$otherText) self.$otherText.value = true;
      } else {
        elt.checked = false;
      }
    });
  }
};

PVMultipleChoiceAnswer.property = {};
PVMultipleChoiceAnswer.property.data = {
  /***
   * @this PVMultipleChoiceAnswer
   * @param value
   */
  set: function (value) {
    var self = this;
    this.clearChild();
    this.$checkes = [];
    this.$answers = [];
    this._data = value || [];

    this._data.forEach(function (ans, i) {
      var ansElt, select;

      if (ans === 'other') {
        ansElt = (0, _Core._)({
          class: 'ap-choice-answer',
          child: [{
            class: 'ap-choice-answer-select',
            child: [this.selectConstruction, 'span.mdi.mdi-check-bold', 'span.mdi.mdi-close-thick']
          }, {
            class: ['ap-choice-answer-content-ctn', 'ap-empty'],
            style: {
              position: 'relative'
            },
            child: [{
              tag: _PreInput.default.tag,
              class: ['ap-choice-answer-content', 'ap-input'],
              on: {
                focus: function (event) {
                  this.parentElement.removeClass('ap-empty');
                  this._prevResult = this.value;
                  var preCheck = select.checked;

                  if (!preCheck) {
                    select.checked = true;
                    self.eventHandler.selectChange(i, event);
                  }
                },
                blur: function (event) {
                  var value = this.value;

                  if (value.trim().length === 0) {
                    this.parentElement.addClass('ap-empty');
                  }

                  if (value !== this._prevResult) self.eventHandler.otherTextChange(event);
                }
              }
            }, {
              class: 'ap-choice-answer-content-placeholder',
              child: {
                child: {
                  text: 'Khác...'
                }
              }
            }]
          }]
        });
        this.$otherText = (0, _Core.$)('preinput', ansElt);
      } else {
        ansElt = (0, _Core._)({
          class: ['ap-choice-answer'].concat(ans.images && ans.images.length > 0 ? ['ap-has-image'] : []),
          child: [{
            class: 'ap-choice-answer-select',
            child: [this.selectConstruction, 'span.mdi.mdi-check-bold', 'span.mdi.mdi-close-thick']
          }, {
            class: 'ap-choice-answer-content-ctn',
            child: [{
              class: 'ap-choice-answer-content',
              child: {
                tag: 'span',
                child: {
                  text: ans.text
                }
              }
            }, {
              class: 'ap-choice-answer-image-ctn',
              child: (ans.images || []).map(function (img) {
                if (img instanceof Blob || img instanceof File) img = URL.createObjectURL(img);
                return {
                  tag: 'img',
                  props: {
                    src: img
                  }
                };
              })
            }]
          }]
        });
      }

      select = (0, _Core.$)('.ap-choice-answer-select', ansElt).firstChild;
      select.name = this.id + '_select';
      select.value = i + '';
      select.on('change', self.eventHandler.selectChange.bind(self, i));
      ansElt.on('click', function (event) {
        if (!self.readOnly && !(0, _EventEmitter.hitElement)(select, event)) {
          if (self.selectConstruction.tag === 'radiobutton') {
            if (!select.checked) {
              select.checked = true;
              select.emit('change', {});
            }
          } else {
            select.checked = !select.checked;
            select.emit('change', {});
          }
        }
      });
      this.$checkes.push(select);
      this.$answers.push(ansElt);
      this.addChild(ansElt);
    }.bind(this));

    this._updateResult();
  },
  get: function () {
    return this._data;
  }
};
PVMultipleChoiceAnswer.property.correctAnswer = {
  set: function (value) {
    this._correctAnswer = value;

    this._updateResult();
  },
  get: function () {
    return this._value;
  }
};
PVMultipleChoiceAnswer.property.result = {
  set: function (value) {
    this._result = value || null;

    this._updateResult();
  },
  get: function () {
    return this._result;
  }
};
PVMultipleChoiceAnswer.property.readOnly = {
  set: function (value) {
    if (value) this.addClass('ap-readonly');else this.removeClass('ap-readonly');
  },
  get: function () {
    return this.containsClass('ap-readonly');
  }
};
PVMultipleChoiceAnswer.eventHandler = {};

PVMultipleChoiceAnswer.eventHandler.selectChange = function (valueIdx, event) {
  var answer = this._data[valueIdx];

  if (answer === 'other') {
    this._result = {
      other: this.$otherText.value
    };
  } else {
    this._result = {
      idx: valueIdx
    };
  }

  this.emit('resultchange', {
    type: 'resultchange',
    target: this,
    originalEvent: event
  }, this);
};

PVMultipleChoiceAnswer.eventHandler.otherTextChange = function (event) {
  if (this._result && 'other' in this._result) {
    this._result.other = this.$otherText.value;
    this.emit('resultchange', {
      type: 'resultchange',
      target: this,
      originalEvent: event
    }, this);
  }
};

_Core.default.install(PVMultipleChoiceAnswer);

var _default = PVMultipleChoiceAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/viewer/question/PVCheckboxesAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/viewer/question/PVCheckboxesAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

var _PVMultipleChoiceAnswer = _interopRequireDefault(require("./PVMultipleChoiceAnswer"));




/***
 * @extends PVMultipleChoiceAnswer
 * @constructor
 */
function PVCheckboxesAnswer() {
  _PVMultipleChoiceAnswer.default.call(this);
}

PVCheckboxesAnswer.tag = 'PVCheckboxesAnswer'.toLowerCase();
PVCheckboxesAnswer.render = _PVMultipleChoiceAnswer.default.render;
PVCheckboxesAnswer.prototype.selectConstruction = {
  tag: 'checkboxbutton',
  class: 'ap-checkbox'
};
PVCheckboxesAnswer.property = Object.assign({}, _PVMultipleChoiceAnswer.default.property);
PVCheckboxesAnswer.eventHandler = Object.assign({}, _PVMultipleChoiceAnswer.default.eventHandler);

PVCheckboxesAnswer.prototype._updateResult = function () {
  var result = this._result || [];
  var dict = result.reduce(function (ac, cr) {
    ac[cr.idx] = true;
    if ('other' in cr) ac.other = cr.other;
    return ac;
  }, {});
  var correctDict = (this._correctAnswer || []).reduce((ac, cr) => {
    ac[cr] = true;
    return ac;
  }, {});
  this.$answers.forEach((ansElt, i) => {
    if (correctDict[i]) {
      ansElt.addClass('ap-correct-answer');
    } else {
      ansElt.removeClass('ap-correct-answer');
    }

    if (dict[i]) {
      ansElt.addClass('ap-result-answer');
    } else {
      ansElt.removeClass('ap-result-answer');
    }
  }); //todo: handle other if need

  this.$checkes.forEach(function (elt, i) {
    elt.checked = !!dict[i];
  });

  if (this.$otherText) {
    this.$otherText.value = dict.other || '';
  }
};

PVCheckboxesAnswer.eventHandler.selectChange = function (valueIdx, event) {
  var checked = this.$checkes[valueIdx].checked;
  var answer = this._data[valueIdx];
  var resultIdx = this._result ? this._result.findIndex(function (it) {
    if (answer === 'other') {
      return 'other' in it;
    } else {
      return it.idx === valueIdx;
    }
  }) : -1;

  if (checked) {
    if (resultIdx >= 0) {
      if (answer === 'other') {
        this._result[resultIdx].other = this.$otherText.value;
      }
    } else {
      if (!(this._result instanceof Array)) this._result = [];

      if (answer === 'other') {
        this._result.push({
          other: this.$otherText.value
        });
      } else {
        this._result.push({
          idx: valueIdx
        });
      }
    }
  } else {
    if (resultIdx >= 0) {
      this._result.splice(resultIdx, 1);
    }
  }

  function idxOf(it) {
    if ('other' in it) return 10000;
    return it.idx;
  }

  this._result.sort(function (a, b) {
    return idxOf(a) - idxOf(b);
  });

  this.emit('resultchange', {
    type: 'resultchange',
    target: this,
    originalEvent: event
  }, this);
};

PVCheckboxesAnswer.eventHandler.otherTextChange = function (event) {
  var resultIdx = this._result ? this._result.findIndex(function (it) {
    return 'other' in it;
  }) : -1;

  if (resultIdx >= 0) {
    this._result[resultIdx].other = this.$otherText.value;
    this.emit('resultchange', {
      type: 'resultchange',
      target: this,
      originalEvent: event
    }, this);
  }
};

_Core.default.install(PVCheckboxesAnswer);

var _default = PVCheckboxesAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/viewer/PVSection.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/viewer/PVSection.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../Core"));

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _utils = require("../../utils");

var _utils2 = require("absol-acomp/js/utils");




function PVSection() {
  this.$name = (0, _Core.$)('.ap-section-name-ctn > span', this);
  this.$description = (0, _Core.$)('.ap-section-description', this);
  this.$imageCtn = (0, _Core.$)('.ap-section-image-ctn', this);
  this.$idx = (0, _Core.$)('.ap-section-idx', this);
  this._idx = 1;
  this.idx = this._idx;
  this._data = new _Attributes.default(this);

  this._data.loadAttributeHandlers(this.dataHandlers);
}

PVSection.tag = 'PVSection'.toLowerCase();

PVSection.render = function () {
  return (0, _Core._)({
    class: ['ap-block', 'ap-section'],
    child: [{
      class: 'ap-section-header',
      child: [{
        child: {
          class: 'ap-section-idx',
          child: {
            text: 1
          }
        }
      }, {
        class: 'ap-section-name-ctn',
        child: {
          tag: 'span',
          child: {
            text: ''
          }
        }
      }]
    }, {
      class: 'ap-section-body',
      child: [{
        class: 'ap-section-description',
        child: {
          text: ''
        }
      }, {
        class: 'ap-section-image-ctn'
      }]
    }]
  });
};

PVSection.property = {};
PVSection.property.idx = {
  set: function (value) {
    this._idx = value;
    this.$idx.firstChild.data = value + '';
  },
  get: function () {
    return this._idx;
  }
};
PVSection.property.data = {
  set: function (data) {
    Object.assign(this._data, data);
  },
  get: function () {
    return this._data;
  }
};
PVSection.prototype.dataHandlers = {};
PVSection.prototype.dataHandlers.name = {
  set: function (value) {
    this.$name.firstChild.data = value;
  },
  get: function () {
    return this.$name.firstChild.data;
  }
};
PVSection.prototype.dataHandlers.description = {
  set: function (value) {
    this.$description.firstChild.data = value;
  },
  get: function () {
    return this.$description.firstChild.data;
  }
};
PVSection.prototype.dataHandlers.images = {
  set: function (images) {
    images = images || [];
    this.$imageCtn.clearChild();
    this.$images = images.map(function (img) {
      if (img instanceof Blob || img instanceof File) {
        img = (0, _utils.toImageUrl)(img);
      }

      return (0, _Core._)({
        tag: 'img',
        props: {
          src: img
        }
      });
    });
    this.$imageCtn.addChild(this.$images);
    return images;
  }
};
PVSection.prototype.dataHandlers.ident = {
  set: function (value) {
    if (!(0, _utils2.isRealNumber)(value)) value = 0;
    this.attr('data-ident', value + '');
  },
  get: function () {
    var ident = parseInt(this.attr('data-ident'));
    if (!(0, _utils2.isRealNumber)(ident)) ident = 0;
    return ident;
  }
};

_Core.default.install(PVSection);

var _default = PVSection;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/viewer/question/PVQuestion.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/viewer/question/PVQuestion.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../../Core"));

var _Attributes = _interopRequireDefault(require("absol/src/AppPattern/Attributes"));

var _PVShortAnswer = _interopRequireDefault(require("./PVShortAnswer"));

var _PVParagraphAnswer = _interopRequireDefault(require("./PVParagraphAnswer"));

var _PVLinearScaleAnswer = _interopRequireDefault(require("./PVLinearScaleAnswer"));

var _PVMultipleChoiceAnswer = _interopRequireDefault(require("./PVMultipleChoiceAnswer"));

var _PVCheckboxesAnswer = _interopRequireDefault(require("./PVCheckboxesAnswer"));

var _PVSection = _interopRequireDefault(require("../PVSection"));

var _utils = require("absol-acomp/js/utils");




/***
 * @extends AElement
 * @constructor
 */
function PVQuestion() {
  this.$idx = (0, _Core.$)('.ap-question-idx > span', this);
  this.$content = (0, _Core.$)('.ap-question-content-ctn > span', this);
  this.$description = (0, _Core.$)('.ap-question-description > span', this);
  this.$imageCtn = (0, _Core.$)('.ap-question-image-ctn', this);
  this.$body = (0, _Core.$)('.ap-question-body', this);
  this.$answer = null;
  this._data = new _Attributes.default(this);

  this._data.loadAttributeHandlers(this.dataHandlers);
}

PVQuestion.tag = 'PVQuestion'.toLowerCase();

PVQuestion.render = function () {
  return (0, _Core._)({
    extendEvent: ['resultchange'],
    class: ['ap-block', 'ap-question'],
    child: [{
      class: 'ap-question-header',
      child: [{
        child: {
          class: 'ap-question-idx',
          child: {
            tag: 'span',
            child: {
              text: '1'
            }
          }
        }
      }, {
        class: 'ap-question-content-ctn',
        child: [{
          tag: 'span',
          child: {
            text: ''
          }
        }]
      }]
    }, {
      class: 'ap-question-description',
      child: {
        tag: 'span',
        child: {
          text: ''
        }
      }
    }, {
      class: 'ap-question-image-ctn'
    }, {
      class: 'ap-question-body'
    }]
  });
};

PVQuestion.prototype.init = function (props) {
  var cProps = Object.assign({}, props);
  var result = props.result;
  delete cProps.result;
  Object.assign(this, cProps);

  if ('result' in props) {
    this.result = result;
  }
};

PVQuestion.property = {};
PVQuestion.property.data = {
  set: function (value) {
    value = Object.assign({}, value);
    this._data.type = value.type;
    this._data.answer = value.answer;
    this._data.correct_answer = value.correct_answer;
    delete value.type;
    delete value.answer;
    delete value.answer;
    delete value.correct_answer;
    Object.assign(this._data, value);
    this.$answer.correctAnswer = this._data.correct_answer;
    this.$answer.result = this._result;
  },
  get: function () {
    return this._data;
  }
};
PVQuestion.property.result = {
  set: function (result) {
    this._result = result;
    if (this.$answer) this.$answer.result = this._result;
  },
  get: function () {
    if (this.$answer) return this.$answer.result;
    return this._result;
  }
};
PVQuestion.property.resultIdent = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = null;

    if (value === null) {
      this.attr('data-result-ident', undefined);
    } else {
      this.attr('data-result-ident', value + '');
    }
  },
  get: function () {
    var res = parseInt(this.attr('data-result-ident'));
    if (isNaN(res)) res = 0;
    return res;
  }
};
PVQuestion.property.idx = {
  set: function (value) {
    this._idx = value;
    this.$idx.firstChild.data = value + '';
  },
  get: function () {
    return this._idx;
  }
};
PVQuestion.property.readOnly = {
  set: function (value) {
    if (value) this.addClass('ap-read-only');else this.removeClass('ap-read-only');
    if (this.$answer) this.$answer.readOnly = !!value;
  },
  get: function () {
    return this.hasClass('ap-read-only');
  }
};
PVQuestion.prototype.dataHandlers = {};
PVQuestion.prototype.dataHandlers.content = {
  set: function (value) {
    this.$content.firstChild.data = value;
  },
  get: function () {
    return this.$content.firstChild.data;
  }
};
PVQuestion.prototype.dataHandlers.description = {
  set: function (value) {
    this.$description.firstChild.data = value;
  },
  get: function () {
    return this.$description.firstChild.data;
  }
};
PVQuestion.prototype.dataHandlers.type = {
  set: function (value) {
    var tag = this.type2tag[value];
    this.$body.clearChild();

    if (tag) {
      this.$answer = (0, _Core._)({
        tag: tag,
        on: {
          resultchange: this.eventHandler.answerResultChange
        }
      });
      this.$answer.readOnly = this.readOnly;
    } else {
      this.$answer = (0, _Core._)('pre');
    }

    this.$body.addChild(this.$answer);
    return value;
  }
};
PVQuestion.prototype.dataHandlers.answer = {
  set: function (value) {
    var tag = this.type2tag[this._data.type];

    if (tag) {
      this.$answer.data = value;
    } else {
      this.$answer.clearChild().addChild((0, _Core._)({
        text: JSON.stringify(value, null, 4)
      }));
    }
  },
  get: function () {
    return this.$answer.data;
  }
};
PVQuestion.prototype.dataHandlers.ident = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    this.attr('data-ident', value + '');
  },
  get: function () {
    var ident = parseInt(this.attr('data-ident'));
    if (!(0, _utils.isRealNumber)(ident)) ident = 0;
    return ident;
  }
};
PVQuestion.prototype.dataHandlers.images = _PVSection.default.prototype.dataHandlers.images;
PVQuestion.eventHandler = {};

PVQuestion.eventHandler.answerResultChange = function () {
  this.emit('resultchange', {
    type: 'resultchange',
    target: this
  }, this);
};

PVQuestion.prototype.type2tag = {
  short_answer: _PVShortAnswer.default.tag,
  paragraph: _PVParagraphAnswer.default.tag,
  linear_scale: _PVLinearScaleAnswer.default.tag,
  multiple_choice: _PVMultipleChoiceAnswer.default.tag,
  checkboxes: _PVCheckboxesAnswer.default.tag
};

_Core.default.install(PVQuestion);

var _default = PVQuestion;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/evaluation/PRParagraphAnswer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/evaluation/PRParagraphAnswer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../Core"));



/***
 * @extends PreInput
 * @constructor
 */
function PRParagraphAnswer() {}

PRParagraphAnswer.tag = 'PRParagraphAnswer'.toLowerCase();

PRParagraphAnswer.render = function () {
  return (0, _Core._)({
    tag: 'pre',
    extendEvent: ['resultchange'],
    class: ['ap-input', 'ap-paragraph-answer', 'as-preinput'],
    child: {
      text: ''
    }
  });
};

PRParagraphAnswer.property = {};
PRParagraphAnswer.property.result = {
  set: function (value) {
    this.firstChild.data = (value || '') + '';
  },
  get: function () {
    return this.firstChild.data;
  }
};
PRParagraphAnswer.property.readOnly = {
  set: function (value) {
    if (value) {
      this.setAttribute('contenteditable', 'false');
      this.contentEditable = false;
      this.addClass('ap-readonly');
    } else {
      this.setAttribute('contenteditable', 'true');
      this.contentEditable = true;
      this.removeClass('ap-readonly');
    }
  },
  get: function () {
    return this.containsClass('ap-readonly');
  }
};
PRParagraphAnswer.eventHandler = {};

PRParagraphAnswer.eventHandler.inputFocus = function () {
  this._prevResult = this.value;
};

PRParagraphAnswer.eventHandler.inputBlur = function (event) {
  var value = this.value;

  if (this._prevResult !== value) {
    this.emit('resultchange', {
      originalEvent: event,
      type: 'resultchange',
      target: this
    }, this);
  }
};

_Core.default.install(PRParagraphAnswer);

var _default = PRParagraphAnswer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/evaluation/PRQuestion.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/evaluation/PRQuestion.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Core = _interopRequireWildcard(require("../Core"));

var _PVQuestion = _interopRequireDefault(require("../viewer/question/PVQuestion"));

var _PVShortAnswer = _interopRequireDefault(require("../viewer/question/PVShortAnswer"));

var _PVLinearScaleAnswer = _interopRequireDefault(require("../viewer/question/PVLinearScaleAnswer"));

var _PVMultipleChoiceAnswer = _interopRequireDefault(require("../viewer/question/PVMultipleChoiceAnswer"));

var _PVCheckboxesAnswer = _interopRequireDefault(require("../viewer/question/PVCheckboxesAnswer"));

var _PreInput = _interopRequireDefault(require("absol-acomp/js/PreInput"));

var _PRParagraphAnswer = _interopRequireDefault(require("./PRParagraphAnswer"));

var _utils = require("absol-acomp/js/utils");

var _int = require("absol/src/Math/int");




/***
 * @extends PVQuestion
 * @constructor
 */
function PRQuestion() {
  _PVQuestion.default.call(this);

  this.$designedScore = (0, _Core.$)('.ap-question-designed-score input', this);
  this.$evaluatedScore = (0, _Core.$)('.ap-question-evaluated-score input', this).on('change', this.eventHandler.evaluatedChange);
  this.$note = (0, _Core.$)('.ap-question-note-ctn pre', this);
  this.$feedback = (0, _Core.$)('.ap-question-feedback-ctn preinput', this).on('focus', this.eventHandler.noteFocus).on('blur', this.eventHandler.noteBlur);
  this.designedScore = null;
  this.evaluatedScore = null;
  this.evaluationIdent = 0;
}

PRQuestion.tag = 'PRQuestion'.toLowerCase();

PRQuestion.render = function () {
  return (0, _Core._)({
    extendEvent: ['evaluationchange'],
    class: ['ap-block', 'ap-question', 'ap-evaluation'],
    child: [{
      class: 'ap-question-header',
      child: [{
        child: {
          class: 'ap-question-idx',
          child: {
            tag: 'span',
            child: {
              text: '1'
            }
          }
        }
      }, {
        class: 'ap-question-content-ctn',
        child: [{
          tag: 'span',
          child: {
            text: ''
          }
        }]
      }]
    }, {
      class: 'ap-question-description',
      child: {
        tag: 'span',
        child: {
          text: ''
        }
      }
    }, {
      class: 'ap-question-image-ctn'
    }, {
      class: 'ap-question-body'
    }, {
      class: 'ap-question-score-ctn',
      child: [{
        class: 'ap-question-designed-score',
        child: [{
          class: 'ap-field-name',
          child: {
            tag: 'span',
            child: {
              text: 'Điểm thiết kế'
            }
          }
        }, {
          tag: 'input',
          class: 'ap-input',
          attr: {
            type: 'number',
            readonly: true,
            disabled: true
          }
        }]
      }, {
        class: 'ap-question-evaluated-score',
        child: [{
          class: 'ap-field-name',
          child: {
            tag: 'span',
            child: {
              text: 'Điểm đánh giá'
            }
          }
        }, {
          tag: 'input',
          class: 'ap-input',
          attr: {
            type: 'number'
          }
        }]
      }]
    }, {
      class: 'ap-question-note-ctn',
      child: [{
        class: 'ap-field-name',
        child: {
          tag: 'span',
          child: {
            text: 'Ghi chú'
          }
        }
      }, {
        tag: 'pre',
        class: 'ap-input',
        child: {
          text: ''
        }
      }]
    }, {
      class: 'ap-question-feedback-ctn',
      child: [{
        class: 'ap-field-name',
        child: {
          tag: 'span',
          child: {
            text: 'Nhận xét'
          }
        }
      }, {
        tag: _PreInput.default.tag,
        class: 'ap-input'
      }]
    }]
  });
};

PRQuestion.prototype.dataHandlers = Object.assign({}, _PVQuestion.default.prototype.dataHandlers);
PRQuestion.property = Object.assign({}, _PVQuestion.default.property);
PRQuestion.property.evaluatedScore = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = null;
    var text;

    if (value === null) {
      this.$evaluatedScore.value = '';
    } else {
      if ((0, _utils.isRealNumber)(value)) {
        text = (0, _int.numberAutoFixed)(value) + '';

        if (value.toFixed(2).length < text.length) {
          text = value.toFixed(1);
        }
      } else {
        text = value + '';
      }

      this.$evaluatedScore.value = text;
    }
  },
  get: function () {
    var score = parseFloat(this.$evaluatedScore.value);
    if (!(0, _utils.isRealNumber)(score)) score = null;
    return score;
  }
};
PRQuestion.property.designedScore = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = null;
    if (value === null) this.$designedScore.value = '';else this.$designedScore.value = value + '';
  },
  get: function () {
    var score = parseFloat(this.$designedScore.value);
    if (!(0, _utils.isRealNumber)(score)) score = null;
    return score;
  }
};
PRQuestion.property.note = {
  set: function (value) {
    value = typeof value === 'string' ? value : (value || '') + '';

    if (value) {
      this.addClass('ap-has-note');
    } else {
      this.removeClass('ap-has-note');
    }

    this.$note.firstChild.data = value;
  },
  get: function () {
    this.$note.firstChild.data;
  }
};
PRQuestion.property.feedback = {
  set: function (value) {
    value = typeof value === 'string' ? value : (value || '') + '';

    if (value) {
      this.addClass('ap-has-feedback');
    } else {
      this.removeClass('ap-has-feedback');
    }

    this.$feedback.value = value;
  },
  get: function () {
    return this.$feedback.value;
  }
};
PRQuestion.property.evaluationIdent = {
  set: function (value) {
    if (!(0, _utils.isRealNumber)(value)) value = 0;
    this.attr('data-evaluation-ident', value + '');
  },
  get: function () {
    var ident = parseInt(this.attr('data-evaluation-ident'));
    if ((0, _utils.isRealNumber)(ident)) return ident;
    return 0;
  }
};
PRQuestion.property.readOnly = {
  set: function (value) {
    if (value) {
      this.addClass('ap-read-only');
    } else {
      this.removeClass('ap-read-only');
    }

    this.$feedback.readOnly = !!value;
  },
  get: function () {
    return this.hasClass('ap-read-only');
  }
};
PRQuestion.prototype.dataHandlers.type = {
  set: function (value) {
    this.attr('data-type', value);
    var tag = this.type2tag[value];
    this.$body.clearChild();

    if (tag) {
      this.$answer = (0, _Core._)({
        tag: tag,
        props: {
          readOnly: true
        }
      });
    } else {
      this.$answer = (0, _Core._)('pre');
    }

    this.$body.addChild(this.$answer);
    return value;
  }
};

PRQuestion.prototype.init = function (props) {
  var cProps = Object.assign({}, props);
  var result = cProps.result;
  delete cProps.result;
  Object.assign(this, cProps);

  if ('result' in props) {
    this.result = result;
  }
};

PRQuestion.prototype.type2tag = {
  short_answer: _PVShortAnswer.default.tag,
  paragraph: _PRParagraphAnswer.default.tag,
  linear_scale: _PVLinearScaleAnswer.default.tag,
  multiple_choice: _PVMultipleChoiceAnswer.default.tag,
  checkboxes: _PVCheckboxesAnswer.default.tag
};
PRQuestion.eventHandler = {};

PRQuestion.eventHandler.evaluatedChange = function (event) {
  this.emit('evaluationchange', {
    type: 'evaluationchange',
    originalEvent: event,
    target: this,
    property: 'evaluatedScore'
  });
};

PRQuestion.eventHandler.noteFocus = function () {
  this._preFeedbackValue = this.$feedback.value;
};

PRQuestion.eventHandler.noteBlur = function (event) {
  var currentValue = this.$feedback.value;

  if (this._preFeedbackValue !== currentValue) {
    this.emit('evaluationchange', {
      type: 'evaluationchange',
      originalEvent: event,
      property: 'note',
      target: this
    }, this);
  }
};

_Core.default.install(PRQuestion);

var _default = PRQuestion;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/install.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/install.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = install;
exports.publicCreators = void 0;

var _APEditableQuestion = _interopRequireDefault(require("./editor/question/APEditableQuestion"));

var _APEditableSection = _interopRequireDefault(require("./editor/APEditableSection"));

var _PRQuestion = _interopRequireDefault(require("./evaluation/PRQuestion"));

var _PVQuestion = _interopRequireDefault(require("./viewer/question/PVQuestion"));

var _PVSection = _interopRequireDefault(require("./viewer/PVSection"));


var publicCreators = [_APEditableQuestion.default, _APEditableSection.default, _PRQuestion.default, _PVQuestion.default, _PVSection.default];
/***
 *
 * @param {Dom} core
 */

exports.publicCreators = publicCreators;

function install(core) {
  core.install(publicCreators);
}
};

moduleFactories["node_modules/absol-poser/fragment/PoserQuestionTreeEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/fragment/PoserQuestionTreeEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Core = require("../dom/Core");

require("absol-form/css/cmdtool.css");

var _ExpTree = _interopRequireWildcard(require("absol-acomp/js/ExpTree"));

require("../css/questiontreeeditor.css");

var _QuestionTypeItems = require("../contants/QuestionTypeItems");

var _Hanger = _interopRequireDefault(require("absol-acomp/js/Hanger"));

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));




/***
 * @extends Fragment
 * @param poserEditor
 * @constructor
 */
function PoserQuestionTreeEditor(poserEditor) {
  _Fragment.default.call(this);

  this.poserEditor = poserEditor;

  for (var key in this) {
    if (key.startsWith('ev_')) {
      this[key] = this[key].bind(this);
    }
  }

  this._dragData = {
    tree: null
  };
}

_OOP.default.mixClass(PoserQuestionTreeEditor, _Fragment.default);

PoserQuestionTreeEditor.prototype.createView = function () {
  this.$view = (0, _Core._)({
    class: 'ap-question-tree-editor',
    child: [{
      class: 'ap-question-tree-exp-scroller'
    }]
  });
  this.$scroller = (0, _Core.$)('.ap-question-tree-exp-scroller', this.$view);

  if (!this.poserEditor.opt.hasSection) {
    this.$view.addClass('ap-without-section');
  }
};

PoserQuestionTreeEditor.prototype.reload = function () {
  var thisE = this;
  this.$scroller.clearChild();
  this.$root = (0, _Core._)({
    tag: _ExpTree.ExpGroup.tag
  });
  var readOnly = this.poserEditor.opt.readOnly;
  (0, _Core._)({
    tag: readOnly ? 'div' : _Hanger.default.tag,
    elt: this.$root,
    on: {
      predrag: this.ev_predrag,
      dragstart: this.ev_dragstart,
      dragend: this.ev_dragend,
      drag: this.ev_drag
    },
    props: {
      hangOn: 5
    }
  });
  this.$scroller.addChild(this.$root);
  Array.prototype.reduce.call(this.poserEditor.$data.childNodes, function (ac, elt) {
    if (elt.apBlockType === 'section') {
      ac.section = (0, _Core._)({
        tag: _ExpTree.default.tag,
        props: {
          name: elt.data.name,
          icon: 'span.mdi.mdi-format-section',
          bindingBlock: elt,
          bindingBlockType: 'section'
        }
      });
      elt.bindingTreeNode = ac.section;
      ac.root.addChild(ac.section);
      ac.section.on('press', thisE.ev_press.bind(thisE, ac.section));
    } else if (elt.apBlockType === 'question') {
      var qt = (0, _Core._)({
        tag: _ExpTree.default.tag,
        props: {
          name: elt.data.content,
          icon: _QuestionTypeItems.QuestionType2Icon[elt.data.type],
          bindingBlock: elt,
          bindingBlockType: 'question'
        }
      });
      if (elt.hasClass('ap-focus')) qt.addClass('ap-focus');
      elt.bindingTreeNode = qt;
      ac.section.addChild(qt);
      qt.on('press', thisE.ev_press.bind(thisE, qt));
    }

    return ac;
  }, {
    root: this.$root,
    section: null
  });
};

PoserQuestionTreeEditor.prototype._findTree = function (elt) {
  while (elt && elt !== this.$root) {
    if (elt.classList && elt.classList.contains('absol-exp-tree')) {
      return elt;
    }

    elt = elt.parentElement;
  }

  return null;
};

PoserQuestionTreeEditor.prototype.ev_dragstart = function (event) {
  this.$view.addClass('ap-dragging');
  var dData = this._dragData;
  dData.initTreeBound = dData.tree.getBoundingClientRect();
  var crRootBound = this.$root.getBoundingClientRect();
  dData.initRootBound = crRootBound;
  dData.mouseOffset = event.currentPoint.sub(new _Vec.default(dData.initTreeBound.left, dData.initTreeBound.top));
  dData.clonedTree = (0, _Core.$)(dData.tree.cloneNode(true)).addClass('ap-question-tree-editor-cloned-node').addStyle('width', dData.initTreeBound.width + 'px');
  dData.nextTree = dData.tree.parentElement.findChildAfter(dData.tree);
  dData.tree.addClass('ap-moving');
  dData.initY = dData.initTreeBound.top - dData.initRootBound.top;

  if (dData.type === 'section') {
    dData.positions = dData.positions || Array.prototype.map.call(this.$root.childNodes, function (node) {
      return {
        bfr: node,
        y: node.getBoundingClientRect().top - crRootBound.top
      };
    }).concat({
      bfr: null,
      //last
      y: crRootBound.height
    });
  } else {
    dData.positions = dData.positions || Array.prototype.reduce.call(this.$root.childNodes, function (ac, sectionTree) {
      var questionNodes = sectionTree.getChildren();
      var sPositions = questionNodes.map(function (qNode) {
        return {
          bfr: qNode,
          parent: sectionTree,
          y: qNode.getBoundingClientRect().top - crRootBound.top
        };
      });
      sPositions.push({
        bfr: null,
        parent: sectionTree,
        y: sectionTree.getBoundingClientRect().bottom - crRootBound.top
      });
      ac = ac.concat(sPositions);
      return ac;
    }, []);
  }

  var eBoundRect = _Rectangle.default.fromClientRect(this.$view.getBoundingClientRect());

  dData.clonedTree.addStyle('top', event.currentPoint.sub(eBoundRect.A()).sub(dData.mouseOffset).y + 'px');
  this.$view.appendChild(dData.clonedTree);
};

PoserQuestionTreeEditor.prototype.ev_drag = function (event) {
  event.preventDefault();
  var dData = this._dragData;
  var crRootBound = this.$root.getBoundingClientRect();
  var dy = crRootBound.top - dData.initRootBound.top + event.currentPoint.sub(event.startingPoint).y;
  var y = dData.initY + dy;

  var eBoundRect = _Rectangle.default.fromClientRect(this.$view.getBoundingClientRect());

  dData.clonedTree.addStyle('top', event.currentPoint.sub(eBoundRect.A()).sub(dData.mouseOffset).y + 'px');
  dData.nearestPosition = dData.positions.reduce(function (ac, cr) {
    var d = Math.abs(y + 15 - cr.y);

    if (d < ac.minDist) {
      ac.nearest = cr;
      ac.minDist = d;
    }

    return ac;
  }, {
    nearest: null,
    minDist: Infinity
  }).nearest;
  this.$view.addStyle('--new-pos-y', dData.nearestPosition.y + 'px');

  if (dData.nearestPosition.bfr === dData.tree || dData.nearestPosition.bfr === dData.nextTree) {
    this.$view.removeClass('ap-changed');
    dData.changed = false;
  } else {
    this.$view.addClass('ap-changed');
    dData.changed = true;
  }
};

PoserQuestionTreeEditor.prototype.ev_dragend = function () {
  clearInterval(this._scrollAutoInv);
  var dData = this._dragData;
  dData.clonedTree.remove();
  dData.tree.removeClass('ap-moving');
  var blockCtn, bf, af;

  if (dData.changed) {
    blockCtn = dData.tree.bindingBlock.parentElement;
    dData.tree.selfRemove();

    if (dData.type === 'section') {
      var sectionElementList = Array.prototype.reduce.call(blockCtn.childNodes, function (ac, cr) {
        if (ac.end) return ac;

        if (cr === dData.tree.bindingBlock) {
          ac.start = true;
          ac.result.push(cr);
        } else if (ac.start) {
          if (cr.apBlockType === 'section') {
            ac.end = true;
          } else {
            ac.result.push(cr);
          }
        }

        return ac;
      }, {
        start: false,
        end: false,
        result: []
      }).result;
      sectionElementList.forEach(function (elt) {
        elt.selfRemove();
      });

      if (dData.nearestPosition.bfr) {
        this.$root.addChildBefore(dData.tree, dData.nearestPosition.bfr);
        bf = dData.nearestPosition.bfr.bindingBlock;
        sectionElementList.forEach(function (elt) {
          blockCtn.addChildBefore(elt, bf);
        });

        this._focusDelay(sectionElementList[0]);
      } else {
        this.$root.addChild(dData.tree);
        sectionElementList.forEach(function (elt) {
          blockCtn.addChild(elt);
        });

        this._focusDelay(sectionElementList[0]);
      }
    } else {
      dData.tree.bindingBlock.selfRemove();

      if (dData.nearestPosition.bfr) {
        dData.nearestPosition.parent.addChildBefore(dData.tree, dData.nearestPosition.bfr);
        blockCtn.addChildBefore(dData.tree.bindingBlock, dData.nearestPosition.bfr.bindingBlock);
      } else {
        dData.nearestPosition.parent.addChild(dData.tree);
        bf = dData.nearestPosition.parent.parentElement.findChildAfter(dData.nearestPosition.parent);

        if (bf) {
          blockCtn.addChildBefore(dData.tree.bindingBlock, bf.bindingBlock);
        } else {
          blockCtn.addChild(dData.tree.bindingBlock);
        }
      }

      this._focusDelay(dData.tree.bindingBlock);
    }

    this.poserEditor.updateIdx();
    this.poserEditor.notifyChange();
  }

  this._dragData = {};
  this.$view.removeClass('ap-dragging');
  this.$view.removeClass('ap-changed');
};

PoserQuestionTreeEditor.prototype.ev_predrag = function (event) {
  var tree = this._findTree(event.target);

  if (!tree) event.cancel(); // event.cancel();
  // Snackbar.show("Chức năng kéo thả hiện đang được xử lý.");
  // return;

  this._dragData.tree = tree;
  this._dragData.type = tree.bindingBlockType;
  event.preventDefault();
};

PoserQuestionTreeEditor.prototype.ev_press = function (tree, event) {
  this.poserEditor.focusBlock(tree.bindingBlock, true);
};

PoserQuestionTreeEditor.prototype._focusDelay = function (elt) {
  setTimeout(function () {
    this.poserEditor.focusBlock(elt, true);
  }.bind(this), 100);
};

var _default = PoserQuestionTreeEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dom/printer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dom/printer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.exportPoserElementAsPDF = exportPoserElementAsPDF;
exports.PoserSerializer = exports.PoserPrintSerialHandlers = void 0;

require("../css/print.css");

var _FileSaver = require("absol/src/Network/FileSaver");

var _PrintSerializer = _interopRequireDefault(require("absol/src/Print/PrintSerializer"));

var _PaperPrinter = _interopRequireDefault(require("absol/src/Print/PaperPrinter"));

var _Rectangle = _interopRequireDefault(require("absol/src/Math/Rectangle"));

var _PrintSerialHandlers = require("absol/src/Print/PrintSerialHandlers");

var _Vec = _interopRequireDefault(require("absol/src/Math/Vec2"));


/***
 *
 * @type {PSHandler[]}
 */
var PoserPrintSerialHandlers = [];
exports.PoserPrintSerialHandlers = PoserPrintSerialHandlers;
PoserPrintSerialHandlers.push({
  id: 'RibbonText',
  match: (elt, scope, stack) => elt.classList && elt.classList.contains('as-ribbon-button-text'),
  exec: (printer, elt, scope, stack, accept) => {
    var content = elt.getAttribute('data-text');
    content = content.replace(/^" |"$/g, '');

    var rect = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    rect.x -= printer.O.x;
    rect.y -= printer.O.y;
    rect.width *= 2;
    var attr = (0, _PrintSerialHandlers.computePrintAttr)(elt);
    printer.text(content, rect, attr.style);
  }
});
PoserPrintSerialHandlers.push({
  id: 'MaterialIcon',
  match: (elt, scope, stack) => elt.classList && elt.classList.contains('material-icons'),
  exec: (printer, elt, scope, stack, accept) => {
    var style = getComputedStyle(elt);
    var font = style.getPropertyValue('font');

    var rect = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    if (rect.width * rect.height === 0) return;
    var canvas = document.createElement('canvas');
    canvas.width = rect.width * 3;
    canvas.height = rect.height * 3;
    var ctx = canvas.getContext('2d');
    ctx.font = "18px \"Material Icons\"";
    ctx.textBaseline = "top";
    rect.x -= printer.O.x;
    rect.y -= printer.O.y;
    rect.width *= 3;
    rect.height *= 3;
    ctx.fillStyle = style.getPropertyValue('color');
    ctx.fillText(elt.innerText, 10, 10);
    printer.image(canvas, rect);
  }
}); // ap-editable-short-text-answer-text-field

PoserPrintSerialHandlers.push({
  id: "APTextField",
  match: (elt, scope, stack) => elt.classList && elt.classList.contains('ap-editable-short-text-answer-text-field') || elt.parentElement && elt.parentElement.classList.contains('ap-editable-long-text-answer-text-field'),
  exec: (printer, elt, scope, stack, accept) => {
    var rect = _Rectangle.default.fromClientRect(elt.getBoundingClientRect());

    rect.x -= printer.O.x;
    rect.y -= printer.O.y;
    var C = rect.C().sub(new _Vec.default(0, 5));
    var D = rect.D().sub(new _Vec.default(0, 5));
    printer.line(D, C, {
      stroke: 'black',
      strokeWidth: 1
    });
  }
});
var PoserSerializer = new _PrintSerializer.default();
exports.PoserSerializer = PoserSerializer;
PoserSerializer.addHandlers(PoserPrintSerialHandlers);

function exportPoserElementAsPDF(elt, opt) {
  var printer = new _PaperPrinter.default();
  return PoserSerializer.serialize(elt, printer).then(printer => printer.exportAsPDF()).then(doc => {
    var blob = doc.output('blob');
    (0, _FileSaver.saveAs)(blob, (opt.title || 'export') + '.pdf');
  });
}
};

moduleFactories["node_modules/absol-poser/fragment/PoserEditor.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/fragment/PoserEditor.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _Core = require("../dom/Core");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

require("../css/posereditor.css");

var _APEditableSection = _interopRequireDefault(require("../dom/editor/APEditableSection"));

var _APEditableQuestion = _interopRequireDefault(require("../dom/editor/question/APEditableQuestion"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _ContextMenu = _interopRequireDefault(require("absol-acomp/js/ContextMenu"));

var _utils = require("absol-acomp/js/utils");

var _BoardTable = _interopRequireDefault(require("absol-acomp/js/BoardTable"));

var _PoserQuestionTreeEditor = _interopRequireDefault(require("./PoserQuestionTreeEditor"));

var _FileSaver = require("absol/src/Network/FileSaver");

var _YesNoQuestionDialog = _interopRequireDefault(require("absol-acomp/js/YesNoQuestionDialog"));

var _Modal = _interopRequireDefault(require("absol-acomp/js/Modal"));

var _utils2 = require("../utils");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _LoadingCubeModal = _interopRequireDefault(require("absol-acomp/js/LoadingCubeModal"));

var _printer = require("../dom/printer");


/***
 * @augments Fragment
 * @augments EventEmitter
 * @param {{}=} opt
 * @constructor
 */
function PoserEditor(opt) {
  this.opt = Object.assign({
    hasScroller: true,
    hasTool: true,
    hasSection: true,
    questionTypes: null
  }, opt);

  _Fragment.default.call(this);

  _EventEmitter.default.call(this);

  this.treeEditor = new _PoserQuestionTreeEditor.default(this);
}

_OOP.default.mixClass(PoserEditor, _Fragment.default, _EventEmitter.default);

PoserEditor.prototype.createView = function () {
  this.$view = (0, _Core._)({
    class: 'ap-poser-editor',
    child: [{
      class: 'ap-poser-editor-header',
      child: {
        class: ['as-form-cmd-tool'],
        child: [{
          class: 'as-from-tool-group-buttons',
          child: [{
            tag: 'button',
            class: 'as-from-tool-button',
            child: 'span.mdi.mdi-file-tree-outline',
            attr: {
              title: 'Edit Tree',
              'data-cmd': 'edit_tree'
            }
          }, {
            tag: 'button',
            class: 'as-from-tool-button',
            child: 'span.mdi.mdi-code-json',
            attr: {
              title: 'Edit Tree',
              'data-cmd': 'export_js'
            }
          }]
        }, {
          class: 'as-from-tool-group-buttons',
          child: [{
            tag: 'button',
            class: 'as-from-tool-button',
            child: 'span.mdi.mdi-format-section',
            attr: {
              title: 'New Section',
              'data-cmd': 'new_section'
            }
          }, {
            tag: 'button',
            class: 'as-from-tool-button',
            child: 'span.mdi.mdi-comment-question-outline',
            attr: {
              title: 'New Question',
              'data-cmd': 'new_question'
            }
          }, {
            tag: 'button',
            class: 'as-from-tool-button',
            style: {
              color: 'rgba(222, 30, 30)'
            },
            child: 'span.mdi.mdi-delete-forever',
            attr: {
              title: 'New Question',
              'data-cmd': 'delete'
            },
            props: {
              disabled: true
            }
          }, // {
          //     tag: 'button',
          //     class: 'as-from-tool-button',
          //     style: { color: 'rgba(50, 50, 222)' },
          //     child: 'span.mdi.mdi-printer',
          //     attr: {
          //         title: 'Print',
          //         'data-cmd': 'print'
          //     }
          // },
          {
            tag: 'button',
            class: 'as-from-tool-button',
            style: {
              color: 'rgba(50, 200, 222)'
            },
            child: 'span.mdi.mdi-download',
            attr: {
              title: 'Download',
              'data-cmd': 'download'
            }
          }]
        }]
      }
    }, {
      class: 'ap-poser-editor-body',
      child: [{
        class: 'ap-poser-editor-data'
      }, {
        class: 'ap-poser-editor-tree-editor-ctn',
        child: this.treeEditor.getView()
      }]
    }, {
      class: 'ap-poser-editor-footer'
    }]
  });
  var self = this;
  this.$view.poserEditor = this;
  this.$body = (0, _Core.$)('.ap-poser-editor-body', this.$view);
  this.$data = (0, _Core.$)('.ap-poser-editor-data', this.$view);
  this.$cmdButtons = (0, _Core.$$)('.as-form-cmd-tool button', this.$view).reduce(function (ac, btn) {
    var name = btn.attr('data-cmd');
    ac[name] = btn;
    return ac;
  }, {});
  this.$cmdButtons['edit_tree'].on('click', this.toggleTreeEditor.bind(this));
  this.$cmdButtons['export_js'].on('click', this.exportJS.bind(this));
  this.$cmdButtons['new_section'].on('click', this.addNewSection.bind(this));
  this.$cmdButtons['new_question'].on('click', this.addNewQuestion.bind(this));
  this.$cmdButtons['delete'].on('click', this.deleteFocusBlock.bind(this)); // this.$cmdButtons['print'].on('click', this.print.bind(this));

  this.$cmdButtons['download'].on('click', this.downloadAsPdf.bind(this));
  this.$attachhook = (0, _Core._)('attachhook').addTo(this.$view);
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  this.$attachhook.on('attached', function () {
    self.start();

    _ResizeSystem.default.add(this);

    this.requestUpdateSize();
  });

  _ContextMenu.default.auto();

  if (!this.opt.hasScroller) {
    this.$view.addClass('ap-without-scroller');
  }

  if (!this.opt.hasTool) {
    this.$view.addClass('ap-without-tool');
  }

  if (!this.opt.hasSection) {
    this.$view.addClass('ap-without-section');
  }

  if (this.opt.readOnly) {
    this.$view.addClass('ap-read-only');
  }
};

PoserEditor.prototype.onResume = function () {
  if (this.$view) {
    (0, _utils2.autoThemeVariable)(this.$view);

    _ResizeSystem.default.add(this.$attachhook);
  }
};

PoserEditor.prototype.setData = function (data) {
  this._originalData = data || [];
  this._sections = data instanceof Array ? data : [data];

  if (!this.opt.hasSection) {
    this._sections = this._sections.reduce((ac, cr) => {
      var questions = cr.questions;
      if (questions && questions.length > 0) ac[0].questions.push.apply(ac[0].questions, questions);
      return ac;
    }, [{
      questions: [],
      section: data[0] && data[0].section || {
        name: "Câu hỏi",
        description: "",
        images: [],
        ident: 1
      }
    }]);
  }

  this.$data.clearChild();

  this._sections.forEach(function (stn) {
    var section = this._makeSection({
      data: stn.section
    });

    var questions = stn.questions.map(function (qData) {
      return this._makeQuestion({
        data: qData
      });
    }.bind(this));
    this.$data.addChild([section].concat(questions));
  }.bind(this));

  this.updateIdx();
  this.treeEditor.reload();
};

PoserEditor.prototype.getData = function () {
  var count = 1;
  var dict = {
    "0": true
  };

  var getOnce = () => {
    while (dict[count]) ++count;

    dict[count] = true;
    return count;
  };

  var cleanObject = o => {
    for (var key in o) if (o[key] === null || o[key] === undefined || typeof o[key] === "number" && isNaN(o[key])) {
      delete o[key];
    }

    return o;
  };

  var result = Array.prototype.reduce.call(this.$data.childNodes, (ac, node) => {
    var nodeData;

    if (node.apBlockType === "section") {
      ac.stn = {
        questions: []
      };

      if (this.opt.hasSection) {
        ac.stn.section = cleanObject(Object.assign({}, node.data));
      }

      ac.result.push(ac.stn);
    } else if (node.apBlockType === 'question') {
      nodeData = cleanObject(Object.assign({}, node.data));

      if (!(0, _utils.isNaturalNumber)(nodeData.ident) || dict[nodeData.ident] || nodeData.ident === 0) {
        nodeData.ident = getOnce();
      } else {
        dict[nodeData.ident] = true;
      }

      ac.stn.questions.push(nodeData);
    }

    return ac;
  }, {
    result: [],
    stn: null
  }).result;
  return result;
};

PoserEditor.prototype._getSectionGroupData = function (sectionGroupElt) {
  var sectionElt = sectionGroupElt.firstChild;
  var questionEltArr = Array.prototype.slice.call(sectionGroupElt.childNodes, 1);
  return {
    section: sectionElt.data.export(),
    questions: questionEltArr.map(function (cNode) {
      return cNode.data.export();
    })
  };
};
/***
 *
 * @param {AElement} elt
 * @private
 */


PoserEditor.prototype._findQuestionElt = function (elt) {
  while (elt && elt !== this.$view) {
    if (elt.classList.contains('ap-block') && elt.classList.contains('ap-editable-question')) {
      return elt;
    }

    elt = elt.parentElement;
  }
};
/***
 *
 * @param {AElement} elt
 * @private
 */


PoserEditor.prototype._findSectionGroupElt = function (elt) {
  while (elt && elt !== this.$view) {
    if (elt.classList.contains('ap-section-group')) {
      return elt;
    }

    elt = elt.parentElement;
  }
};

PoserEditor.prototype._makeSection = function (props) {
  var thisE = this;
  return (0, _Core._)({
    tag: _APEditableSection.default.tag,
    props: props,
    on: {
      change: function (event) {
        this.bindingTreeNode.name = this.data.name || "[unset]";
        thisE.notifyChange();
      },
      click: function () {
        thisE.focusBlock(this, false);
      },
      action: function (event) {
        switch (event.action) {
          case 'merge_with_above':
            thisE.deleteBlock(this);
            break;

          case 'delete':
            thisE.requestDeleteSection(this);
            break;

          default:
            console.log("TODO", event.action);
        }
      }
    }
  });
};

PoserEditor.prototype._makeQuestion = function (props) {
  var thisE = this;
  return (0, _Core._)({
    tag: _APEditableQuestion.default.tag,
    props: Object.assign({
      acceptQuestionTypes: this.opt.questionTypes,
      readOnly: this.opt.readOnly
    }, props),
    on: {
      change: function (event) {
        this.bindingTreeNode.name = this.data.content || "[unset]";

        if (event.fieldName === 'type') {
          thisE.treeEditor.reload();
        }

        thisE.emit('change', {
          type: 'change',
          target: thisE
        }, thisE);
      },
      click: function () {
        thisE.focusBlock(this, false);
      },
      action: function (event) {
        switch (event.action) {
          case 'delete':
            thisE.requestDeleteQuestion(this);
            break;

          case 'duplicate':
            thisE.duplicateQuestion(this);
            thisE.notifyChange();
            break;

          default:
            console.log("TODO: action", event.action);
        }
      }
    }
  });
};

PoserEditor.prototype.updateSize = function () {
  var width = this.$view.getBoundingClientRect().width;

  if (!this._prevWidth || this._prevWidth < 500 !== width < 500) {
    if (width < 500) {
      this.$view.addClass('ap-width-s');
    } else {
      this.$view.removeClass('ap-width-s');
    }
  }

  if (!this._prevWidth || this._prevWidth < 390 !== width < 390) {
    if (width < 390) {
      this.$view.addClass('ap-width-xs');
    } else {
      this.$view.removeClass('ap-width-xs');
    }
  }

  this._prevWidth = width;
};

PoserEditor.prototype._updateCmdButtons = function () {
  if (this._currentFocusBlock && this.$data.firstChild !== this._currentFocusBlock && this._currentFocusBlock.parentElement) {
    this.$cmdButtons["delete"].disabled = false;
  } else {
    this.$cmdButtons["delete"].disabled = true;
  }
};

PoserEditor.prototype.updateIdx = function () {
  var qIdx = 1;
  var sIdx = 1;
  var elt;
  var next;

  for (var i = 0; i < this.$data.childNodes.length; ++i) {
    elt = this.$data.childNodes[i];
    next = this.$data.childNodes[i + 1];

    if (elt.apBlockType === "section") {
      elt.idx = sIdx++;
    } else if (elt.apBlockType === "question") {
      elt.idx = qIdx++;

      if (!next || next.apBlockType === "section") {
        elt.addClass('ap-last-question');
      } else {
        elt.removeClass('ap-last-question');
      }
    }
  }
};

PoserEditor.prototype.moveSectionGroupUp = function (sectionGroup) {
  var parent = sectionGroup.parentElement;
  var prevElt = parent.findChildBefore();
  if (!prevElt || prevElt === parent.firstChild) return;
  sectionGroup.selfRemove();
  parent.addChildBefore(sectionGroup, prevElt);
  this.updateIdx();
  (0, _utils.vScrollIntoView)(sectionGroup.firstChild);
};

PoserEditor.prototype.requestDeleteSection = function (sectionElt) {
  this.openYesNoQuestionDialog('Xóa section', "Bạn muốn xóa section " + sectionElt.idx + '. ' + (sectionElt.data.name || '')).then(result => {
    if (result) {
      this.deleteSection(sectionElt);
      this.notifyChange();
    }
  });
};

PoserEditor.prototype.requestDeleteQuestion = function (questionElt) {
  var previewText = questionElt.data.content || '';
  if (previewText.length > 30) previewText = previewText.substring(0, 27) + '...';
  this.openYesNoQuestionDialog('Xóa câu hỏi', "Bạn muốn xóa câu  hỏi số " + questionElt.idx + '. ' + previewText).then(result => {
    if (result) {
      this.deleteQuestion(questionElt);
      this.notifyChange();
    }
  });
};

PoserEditor.prototype.deleteQuestion = function (questionElt) {
  this.deleteBlock(questionElt);
};

PoserEditor.prototype.deleteSection = function (sectionElt) {
  if (!sectionElt.isDescendantOf(this.$data)) return false;
  var blocks = [];
  var curSectionElt, blockElt;

  for (var i = 0; i < this.$data.childNodes.length; ++i) {
    blockElt = this.$data.childNodes[i];
    if (blockElt.hasClass('ap-editable-section')) curSectionElt = blockElt;

    if (curSectionElt === sectionElt) {
      blocks.push(blockElt);
    }
  }

  blocks.forEach(blk => blk.selfRemove());
  this.updateIdx();
  this.treeEditor.reload();
};

PoserEditor.prototype.duplicateQuestion = function (questionElt) {
  var parent = questionElt.parentElement;
  var data = questionElt.data.export();

  var newQuestion = this._makeQuestion({
    data: data
  });

  parent.addChildAfter(newQuestion, questionElt);
  this.updateIdx(parent);
  this.treeEditor.reload();
  setTimeout(() => {
    this.focusBlock(newQuestion, true);
  }, 100);
};

PoserEditor.prototype.toggleTreeEditor = function () {
  if (this.$view.containsClass('ap-open-tree-editor')) {
    this.$view.removeClass('ap-open-tree-editor');
  } else {
    this.$view.addClass('ap-open-tree-editor');
  }
};

PoserEditor.prototype.exportJS = function () {
  var jsCode = 'module.exports = ' + JSON.stringify(this.getData(), null, 4).replace(/"([^"]+)":/g, function (all, g1) {
    return g1 + ':';
  }) + ';';
  (0, _FileSaver.saveTextAs)(jsCode, 'question_data.js');
};

PoserEditor.prototype.focusBlock = function (block, scrollInto) {
  if (this._currentFocusBlock) {
    this._currentFocusBlock.removeClass('ap-focus');

    this._currentFocusBlock.bindingTreeNode.removeClass('ap-focus');

    this._currentFocusBlock = null;
  }

  this._currentFocusBlock = block;

  if (this._currentFocusBlock) {
    this._currentFocusBlock.addClass('ap-focus');

    this._currentFocusBlock.bindingTreeNode.addClass('ap-focus');

    if (scrollInto) (0, _utils.vScrollIntoView)(this._currentFocusBlock);
    if (this._currentFocusBlock.bindingTreeNode.getBoundingClientRect().height > 10) (0, _utils.vScrollIntoView)(this._currentFocusBlock.bindingTreeNode);
  }

  this._updateCmdButtons();
};

PoserEditor.prototype.deleteBlock = function (blockElt) {
  if (blockElt === this.$data.firstChild) return false;
  if (!blockElt.isDescendantOf(this.$data)) return false;
  if (this._currentFocusBlock === blockElt) this._currentFocusBlock = null;
  blockElt.selfRemove();
  this.updateIdx();

  this._updateCmdButtons();

  this.treeEditor.reload();
};

PoserEditor.prototype.deleteFocusBlock = function () {
  if (this._currentFocusBlock) this.deleteBlock(this._currentFocusBlock);
};

PoserEditor.prototype.notifyChange = function () {
  this.emit('change', {
    type: 'change',
    target: this
  }, this);
};

PoserEditor.prototype.ev_contextMenu = function (event) {
  var thisE = this;
  event.stopPropagation();
  var target = event.target;
  var temp = target;

  while (temp) {
    if (temp.classList && temp.classList.contains(_BoardTable.default.DRAG_ZONE_CLASS_NAME)) return;
    temp = temp.parentElement;
  }

  var questionElt = this._findQuestionElt(target);

  var sectionGroupElt = this._findSectionGroupElt(target);

  var menuItems = [{
    text: 'Thêm section',
    cmd: 'delele_section',
    icon: 'span.mdi.mdi-playlist-plus'
  }];

  if (sectionGroupElt) {
    menuItems.push({
      text: 'Nhân bản section',
      cmd: 'duplicate_section',
      icon: 'span.mdi.mdi-content-duplicate'
    });
  }

  if (questionElt) {
    menuItems.push("-----------", {
      text: "Thêm câu hỏi",
      cmd: 'new_question',
      icon: 'span.mdi.mdi-comment-plus-outline'
    }, {
      text: "Nhân bản câu hỏi",
      cmd: "duplicate_question",
      icon: 'span.mdi.mdi-comment-multiple-outline'
    });
  }

  event.showContextMenu({
    items: menuItems
  }, function (event) {
    var item = event.menuItem;

    switch (item.cmd) {
      case 'duplicate_section':
        break;
    }
  });
};

PoserEditor.prototype.addNewSection = function (props) {
  var userAction = props && props.target && props.type;
  if (userAction) props = {};

  var newSection = this._makeSection(props || {});

  if (this._currentFocusBlock && this._currentFocusBlock.parentElement === this.$data) {
    this.$data.addChildAfter(newSection, this._currentFocusBlock);
  } else {
    this.$data.addChild(newSection);
  }

  this.treeEditor.reload();
  this.focusBlock(newSection, true);
  this.updateIdx();
  if (userAction) this.notifyChange();
};

PoserEditor.prototype.addNewQuestion = function (props) {
  var userAction = props && props.target && props.type;
  if (userAction) props = {};

  if (this.$data.childNodes.length === 0) {
    this.addNewSection();
  }

  var newQuestion = this._makeQuestion(props || {});

  if (this._currentFocusBlock && this._currentFocusBlock.parentElement === this.$data) {
    this.$data.addChildAfter(newQuestion, this._currentFocusBlock);
  } else {
    this.$data.addChild(newQuestion);
  }

  this.treeEditor.reload();
  this.focusBlock(newQuestion, true);
  this.updateIdx();
  if (userAction) this.notifyChange();
};

PoserEditor.prototype.openYesNoQuestionDialog = function (title, message) {
  return new Promise(resolve => {
    if (window.ModalElement && window.ModalElement.question) {
      window.ModalElement.question({
        title: title,
        message: message,
        onclick: function (sel) {
          if (sel === 0) {
            resolve(true);
          } else {
            resolve(false);
          }
        }
      });
    } else {
      var modal = (0, _Core._)({
        tag: _Modal.default.tag,
        child: {
          tag: _YesNoQuestionDialog.default.tag,
          props: {
            textYes: 'Có',
            textNo: 'Không',
            message: message,
            dialogTitle: title
          },
          on: {
            action: event => {
              modal.remove();
              resolve(event.action.name === 'yes');
            }
          }
        }
      }).addTo(document.body);
    }
  });
};
/***
 *
 * @param {Object=} opt
 */


PoserEditor.prototype.print = function (opt) {
  _Dom.default.printElement(Object.assign({
    elt: this.getView(),
    keepBackgroundColor: false
  }, opt || {}));
};
/***
 *
 * @param {Object=} opt
 */


PoserEditor.prototype.downloadAsPdf = function (opt) {
  opt = opt || {};

  if (window.ModalElement && window.ModalElement.show_loading) {
    window.ModalElement.show_loading();
  } else {
    this._loadingToken = _LoadingCubeModal.default.show();
  }

  (0, _printer.exportPoserElementAsPDF)(this.getView(), opt).then(() => {
    if (window.ModalElement && window.ModalElement.close) {
      window.ModalElement.close();
    } else {
      _LoadingCubeModal.default.close(this._loadingToken);
    }
  });
};

var _default = PoserEditor;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/fragment/PoserViewer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/fragment/PoserViewer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _Core = require("../dom/Core");

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

require("../css/posereditor.css");

var _APEditableSection = _interopRequireDefault(require("../dom/editor/APEditableSection"));

var _APEditableQuestion = _interopRequireDefault(require("../dom/editor/question/APEditableQuestion"));

var _PVSection = _interopRequireDefault(require("../dom/viewer/PVSection"));

var _PVQuestion = _interopRequireDefault(require("../dom/viewer/question/PVQuestion"));

var _ContextMenu = _interopRequireDefault(require("absol-acomp/js/ContextMenu"));

var _ResizeSystem = _interopRequireDefault(require("absol/src/HTML5/ResizeSystem"));

var _PoserQuestionTreeEditor = _interopRequireDefault(require("./PoserQuestionTreeEditor"));

require("../css/poserviewer.css");

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _utils = require("absol-acomp/js/utils");

var _utils2 = require("../utils");

var _Array = require("absol/src/DataStructure/Array");


/***
 * @extends Fragment
 * @param {*=} opt
 * @constructor
 */
function PoserViewer(opt) {
  this.opt = Object.assign({
    hasScroller: true,
    hasSection: true,
    shuffleQuestion: false
  }, opt);

  _Fragment.default.call(this);

  _EventEmitter.default.call(this);
}

_OOP.default.mixClass(PoserViewer, _Fragment.default, _EventEmitter.default);

PoserViewer.prototype.createView = function () {
  this.$view = (0, _Core._)({
    class: 'ap-poser-viewer',
    child: [{
      class: 'ap-poser-viewer-header'
    }, {
      class: 'ap-poser-viewer-body'
    }, {
      class: 'ap-poser-viewer-footer'
    }],
    on: {
      contextmenu: this.ev_contextMenu.bind(this)
    }
  });
  this.$view.poserViewer = this;
  this.$body = (0, _Core.$)('.ap-poser-viewer-body', this.$view);
  this.$attachhook = (0, _Core._)('attachhook').addTo(this.$view);
  this.$attachhook.requestUpdateSize = this.updateSize.bind(this);
  var self = this;
  this.$attachhook.on('attached', function () {
    _ResizeSystem.default.add(this);

    this.requestUpdateSize();
    self.start();
  });

  if (!this.opt.hasScroller) {
    this.$view.addClass('ap-without-scroller');
  }

  if (!this.opt.hasSection) {
    this.$view.addClass('ap-without-section');
  }

  if (this.opt.readOnly) {
    this.$view.addClass('ap-read-only');
  }
};
/***
 *
 * @param {Array<APSectionData>} data
 * @param {Array<number>=} order
 */


PoserViewer.prototype.setData = function (data, order) {
  this._originalData = this.normalizeData(data);
  this._sections = this._originalData;
  this._orders = [];

  if (order) {
    this._orders = order.slice();
  } else {
    this._sections.forEach(stn => {
      var idArr = stn.questions.map(qt => qt.ident);

      if (this.opt.shuffleQuestion) {
        (0, _Array.arrayShuffle)(idArr);
      }

      this._orders.push.apply(this._orders, idArr);
    });
  }

  this._id2order = this._orders.reduce((ac, cr, i) => {
    ac[cr] = i;
    return ac;
  }, {});
  this.$body.clearChild();
  var qtCount = 0;

  this._sections.forEach(function (stn, i) {
    var gElt = this._makeSectionGroup(stn, i + 1, qtCount + 1);

    qtCount += stn.questions.length;
    this.$body.addChild(gElt);
  }.bind(this));

  setTimeout(() => {
    console.log(this.getOrder());
  }, 1000);
};

PoserViewer.prototype.normalizeData = function (data) {
  var dict = {};
  var count = 1;
  var needIdent = [];
  data = data || [];
  data = data instanceof Array ? data : [data];
  data = data.map(function (oGroup) {
    var group = Object.assign({}, oGroup);
    group.section = Object.assign({}, oGroup.section);

    if (!group.section.ident || !(group.section.ident > 0)) {
      needIdent.push(group.section);
    } else {
      dict[group.section.ident] = true;
    }

    group.questions = (oGroup.questions || []).map(function (oQuestion) {
      var question = Object.assign({}, oQuestion);
      delete question.correct_answer;

      if (!question.ident || !(question.ident > 0)) {
        needIdent.push(question);
      } else {
        dict[question.ident] = true;
      }

      if (question.answer && question.answer instanceof Array) {
        question.answer = oQuestion.answer.map(function (ans) {
          if (typeof ans === 'object') {
            ans = Object.assign({}, ans);

            if (!ans.ident || !(ans.ident > 0)) {
              needIdent.push(ans);
            } else {
              dict[ans.ident] = true;
            }

            return ans;
          } else return ans;
        });
      }

      return question;
    });
    return group;
  });
  needIdent.forEach(function (it) {
    while (dict[count]) {
      count++;
    }

    it.ident = count;
    count++;
  });
  return data;
};

PoserViewer.prototype.getData = function () {
  return this._originalData;
};

PoserViewer.prototype.getOrder = function () {
  if (!this._originalData) return null;

  var originOrders = this._originalData.reduce((ac, cr) => {
    return ac.concat(cr.questions.map(qt => qt.ident + ''));
  }, []);

  var cOrder = this._orders.map(x => x + '');

  if (!this.opt.shuffleQuestion && (0, _Array.arrayCompare)(originOrders, cOrder, true)) {
    return null;
  } else return this._orders.slice();
};

PoserViewer.prototype._makeSectionGroup = function (stnData, stnIdx, qtIdx0) {
  var self = this;
  var stn = {
    tag: _PVSection.default.tag,
    props: {
      data: stnData.section,
      idx: stnIdx
    }
  };
  var sortedQuestions = stnData.questions.slice();
  sortedQuestions.sort((a, b) => {
    return this._id2order[a.ident] - this._id2order[b.ident];
  });
  var questions = sortedQuestions.map((qt, i) => {
    return {
      tag: _PVQuestion.default.tag,
      attr: {
        'data-order': this._id2order[qt.ident]
      },
      props: {
        data: qt,
        idx: qtIdx0 + i,
        readOnly: !!this.opt.readOnly
      },
      on: {
        resultchange: function (event) {
          self.ev_questionResultChange(this, event);
        }
      }
    };
  });
  return (0, _Core._)({
    class: 'ap-section-group',
    child: [stn].concat(questions)
  });
};

PoserViewer.prototype.getResult = function () {
  var count = 1;
  var dict = {
    "0": true
  };

  var getOnce = () => {
    while (dict[count]) ++count;

    dict[count] = true;
    return count;
  };

  var questions = Array.prototype.reduce.call(this.$body.childNodes, function (ac, cr) {
    ac.push.apply(ac, Array.prototype.slice.call(cr.childNodes, 1));
    return ac;
  }, []);
  return questions.reduce(function (ac, qt) {
    var ident = qt.resultIdent;

    if (ident === 0 || !(0, _utils.isNaturalNumber)(ident) || dict[ident]) {
      ident = getOnce();
    } else {
      dict[ident] = true;
    }

    ac[qt.data.ident] = {
      ident: ident,
      value: qt.result
    };
    return ac;
  }, {});
};

PoserViewer.prototype.setResult = function (resultDict) {
  resultDict = resultDict || {};
  var questions = Array.prototype.reduce.call(this.$body.childNodes, function (ac, cr) {
    ac.push.apply(ac, Array.prototype.slice.call(cr.childNodes, 1));
    return ac;
  }, []);
  questions.forEach(function (qt) {
    var questionIdent = qt.data.ident;
    var resultProp = resultDict[questionIdent];

    if (resultProp) {
      qt.result = resultProp.value;
      qt.resultIdent = resultProp.ident;
    }
  });
};

PoserViewer.prototype.ev_contextMenu = function (event) {
  console.log(event.target);
};

PoserViewer.prototype.updateSize = function () {
  var width = this.$view.getBoundingClientRect().width;

  if (!this._prevWidth || this._prevWidth < 500 !== width < 500) {
    if (width < 500) {
      this.$view.addClass('ap-width-s');
    } else {
      this.$view.removeClass('ap-width-s');
    }
  }

  if (!this._prevWidth || this._prevWidth < 390 !== width < 390) {
    if (width < 390) {
      this.$view.addClass('ap-width-xs');
    } else {
      this.$view.removeClass('ap-width-xs');
    }
  }

  this._prevWidth = width;
};

PoserViewer.prototype.ev_questionResultChange = function (questionElt, event) {
  this.emit('resultchange', {
    target: this,
    type: 'resultchange',
    originalEvent: event.originalEvent || event,
    questionResult: questionElt.result,
    questionData: questionElt.data.export(),
    questionIdent: questionElt.data.ident
  }, this);
};

PoserViewer.prototype.onResume = function () {
  if (this.$view) (0, _utils2.autoThemeVariable)(this.$view);
};

var _default = PoserViewer;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/fragment/PoserEvaluation.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/fragment/PoserEvaluation.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _OOP = _interopRequireDefault(require("absol/src/HTML5/OOP"));

var _Core = require("../dom/Core");

require("../css/poserevaluation.css");

var _PVSection = _interopRequireDefault(require("../dom/viewer/PVSection"));

var _utils = require("absol-acomp/js/utils");

var _utils2 = require("../utils");


/***
 * @augments Fragment
 * @augments EventEmitter
 * @param {{readOnly: boolean}=} opt
 * @constructor
 */
function PoserEvaluation(opt) {
  this.opt = Object.assign({
    readOnly: false,
    hasScroller: true,
    hasSection: true,
    autoEvaluate: true
  }, opt || {});

  _Fragment.default.call(this);

  _EventEmitter.default.call(this);
}

_OOP.default.mixClass(PoserEvaluation, _Fragment.default, _EventEmitter.default);

PoserEvaluation.prototype.createView = function () {
  this.$view = (0, _Core._)({
    class: 'ap-evaluation'
  });
  this.$view.afterAttached().then(() => this.start());

  if (this.opt.readOnly) {
    this.$view.addClass('ap-read-only');
  }

  if (!this.opt.hasScroller) {
    this.$view.addClass('ap-without-scroller');
  }

  if (!this.opt.hasSection) {
    this.$view.addClass('ap-without-section');
  }
};

PoserEvaluation.prototype.onResume = function () {
  if (this.$view) (0, _utils2.autoThemeVariable)(this.$view);
};
/***
 *
 * @param {{sections:[], result:[], order?:[]}}data
 */


PoserEvaluation.prototype.setData = function (data) {
  var self = this;
  var view = this.getView();
  this._data = data;
  view.clearChild();
  var count = 0;
  var id2order = null;
  if (data.order) id2order = data.order.reduce((ac, cr, i) => {
    ac[cr] = i;
    return ac;
  }, {});

  if (data.sections) {
    data.sections.forEach((st, stIdx) => {
      var stn = (0, _Core._)({
        tag: _PVSection.default.tag,
        props: {
          data: st.section,
          idx: stIdx + 1
        }
      });
      view.addChild(stn);
      var sortedQuestion = st.questions.slice();
      if (id2order) sortedQuestion.sort((a, b) => id2order[a.ident] - id2order[b.ident]);
      sortedQuestion.forEach((oqt, index, array) => {
        var qt = Object.assign({}, oqt);
        var designedScore = qt.score;
        delete qt.score;
        var qtElt = (0, _Core._)({
          tag: 'PRQuestion'.toLowerCase(),
          props: {
            idx: count + 1,
            data: qt,
            designedScore: designedScore || 1,
            // evaluatedScore: evaluatedScore,
            note: qt.note,
            readOnly: this.opt.readOnly
          },
          on: {
            evaluationchange: function (event) {
              self.emit('evaluationchange', {
                type: 'evaluationchange',
                originalEvent: event.originalEvent || event,
                target: self,
                question: qt,
                questionElt: qtElt,
                property: event.property
              });
            }
          }
        });
        if (index + 1 === array.length) qtElt.addClass('ap-last-question');
        var questionIdent = qt.ident;

        if (data.result && data.result[questionIdent]) {
          qtElt.result = data.result[questionIdent].value;
          qtElt.resultIdent = data.result[questionIdent].ident;
        }

        var evaluatedScore = this._evaluateScore(oqt, data.result[questionIdent]);

        if (this.opt.autoEvaluate) {
          qtElt.evaluatedScore = evaluatedScore;
          qtElt.autoEvaluatedScore = evaluatedScore;
          qtElt.attr('data-evaluated-score', evaluatedScore + '');
        }

        view.addChild(qtElt);
        count++;
      });
    });
  }
};

PoserEvaluation.prototype.evaluators = {
  multiple_choice: (question, result) => {
    if (result && result.value && result.value.idx === question.correct_answer) {
      return question.score;
    } else {
      return 0;
    }
  },
  checkboxes: (question, result) => {
    var spw;
    var rightAns = 0,
        wrongAns = 0;

    if (result && result.value && question.correct_answer && question.correct_answer.length) {
      spw = question.score / question.correct_answer.length;
      result.value.forEach(ans => {
        if (question.correct_answer.indexOf(ans.idx) >= 0) {
          rightAns++;
        } else {
          wrongAns++;
        }
      });
      if (rightAns <= wrongAns) return 0;
      return spw * (rightAns - wrongAns);
    } else {
      return 0;
    }
  }
};

PoserEvaluation.prototype._evaluateScore = function (question, result) {
  if (!result) return 0;
  var evaluator = this.evaluators[question.type];
  if (!evaluator) return 0;
  return evaluator(question, result);
};

PoserEvaluation.prototype.getData = function () {
  return this._data;
};

PoserEvaluation.prototype.getEvaluation = function () {
  var count = 1;
  var dict = {
    "0": true
  };

  var getOnce = () => {
    while (dict[count]) ++count;

    dict[count] = true;
    return count;
  };

  this.getView();
  return Array.prototype.filter.call(this.$view.childNodes, function (elt) {
    return elt.containsClass && elt.containsClass('ap-question');
  }).reduce((ac, elt) => {
    var questionIdent = elt.data.ident;
    var evaluatedScore = elt.evaluatedScore;
    if (!(0, _utils.isRealNumber)(evaluatedScore)) evaluatedScore = elt.designedScore;
    var ident = elt.evaluationIdent;

    if (!(0, _utils.isNaturalNumber)(ident) || ident === 0 || dict[ident]) {
      ident = getOnce();
    } else {
      dict[ident] = true;
    }

    ac[questionIdent] = {
      ident: ident,
      score: evaluatedScore,
      feedback: elt.feedback
    };
    return ac;
  }, {});
};

PoserEvaluation.prototype.setEvaluation = function (evaluationData) {
  evaluationData = evaluationData || {};
  this.getView();
  return Array.prototype.filter.call(this.$view.childNodes, function (elt) {
    return elt.containsClass && elt.containsClass('ap-question');
  }).forEach(elt => {
    var questionIdent = elt.data.ident;
    var evaluation = evaluationData[questionIdent] || {};
    elt.evaluationIdent = evaluation.ident || 0;

    if ('score' in evaluation && !isNaN(evaluation.score)) {
      elt.evaluatedScore = evaluation.score;
    } else if (!this.opt.autoEvaluate) {
      elt.evaluatedScore = evaluation.score || 0;
    }

    elt.feedback = evaluation.feedback || '';
  }, {});
};

var _default = PoserEvaluation;
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/index.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _install = _interopRequireDefault(require("./dom/install"));

var _PoserEditor = _interopRequireDefault(require("./fragment/PoserEditor"));

var _PoserViewer = _interopRequireDefault(require("./fragment/PoserViewer"));

var _APEditableQuestion = _interopRequireDefault(require("./dom/editor/question/APEditableQuestion"));

var _PoserEvaluation = _interopRequireDefault(require("./fragment/PoserEvaluation"));


var _default = {
  install: _install.default,
  PoserEditor: _PoserEditor.default,
  PoserViewer: _PoserViewer.default,
  PoserEvaluation: _PoserEvaluation.default,
  APEditableQuestion: _APEditableQuestion.default
};
exports.default = _default;
};

moduleFactories["node_modules/absol-poser/dev.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-poser/dev.js ***/
"use strict";

require("absol");

require("absol-acomp/dev");

var _index = _interopRequireDefault(require("./index"));

var _install = _interopRequireDefault(require("./dom/install"));


window.absol = window.absol || {};
window.absol.poser = _index.default;
(0, _install.default)(absol.coreDom);
};

moduleFactories["node_modules/pizo/js/dom/Fcore.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/dom/Fcore.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _absolAcomp = _interopRequireDefault(require("absol-acomp"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


var Fcore = new _Dom.default();
Fcore.traceOutBoundingClientRect = _Dom.default.traceOutBoundingClientRect;
Fcore.install(_absolAcomp.default.core);
var _default = Fcore;
exports.default = _default;
};

moduleFactories["node_modules/pizo/js/dom/Icons.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/dom/Icons.js ***/
"use strict";

var _Fcore = _interopRequireDefault(require("./Fcore"));


var _ = _Fcore.default._;

_Fcore.default.install('mdi-align-horizontal-left', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
            <path fill="#000000" d = "M22 13V19H6V13H22M6 5V11H16V5H6M2 2V22H4V2H2" />\
        </svg>');
});

_Fcore.default.install('mdi-align-horizontal-center', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
             <path fill="#000000" d="M20 19H13V22H11V19H4V13H11V11H7V5H11V2H13V5H17V11H13V13H20V19Z" />\
        </svg>');
});

_Fcore.default.install('mdi-align-horizontal-right', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
             <path fill="#000000" d="M18 13V19H2V13H18M8 5V11H18V5H8M20 2V22H22V2H20Z" />\
        </svg>');
});

_Fcore.default.install('mdi-align-vertical-bottom', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
             <path fill="#000000" d="M11 18H5V2H11V18M19 8H13V18H19V8M22 20H2V22H22V20Z" />\
        </svg>');
});

_Fcore.default.install('mdi-align-vertical-center', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
             <path fill="#000000" d="M5 20V13H2V11H5V4H11V11H13V7H19V11H22V13H19V17H13V13H11V20H5Z" />\
        </svg>');
});

_Fcore.default.install('mdi-align-vertical-top', function () {
  return _('<svg width="24px" height="24px" viewBox="0 0 24 24">\
           <path fill="#000000" d="M11 22H5V6H11V22M19 6H13V16H19V6M22 2H2V4H22V2Z" />\
        </svg>');
});

_Fcore.default.install('frame-ico', function () {
  return _('<svg width="25.03mm" height="26.1mm" version="1.1" viewBox="0 0 25.03 26.1" xmlns="http://www.w3.org/2000/svg">' + '    <g transform="translate(0,-270.9)">' + '        <path d="m12.662 270.91-7.0158 3.7418v4.0759l6.9156-4.0424 7.0492 3.9756-0.13363-3.9422z" style="fill:gray" />' + '        <path d="m12.628 276.89-6.7486 3.6416 6.6817 4.0424 6.7151-3.842z" style="fill:rgb(240, 122, 0)" />' + '        <path d="m5.2452 282.4-0.03341 7.3165 6.3811 3.8754 0.03341-7.4167z" style="fill:rgb( 122, 240, 0)" />' + '        <path d="m19.745 282.37-6.3811 3.842v7.3499l6.4145-3.7084z" style="fill:rgb(0, 122, 240)" />' + '        <path d="m21.816 283.07-0.13364 7.8176-6.7486 4.1093 3.2406 2.0045 6.7152-3.9088 0.13363-8.1517z" style="fill:gray" />' + '        <path d="m3.1738 283.04-3.1738 2.0045v7.7842l6.7151 4.1093 3.3409-1.8709-6.7151-3.9756z" style="fill:gray" />' + '    </g>' + '</svg>');
});

_Fcore.default.install('filter-ico', function () {
  return _('<svg class="navbar-search__filter" viewBox="0 0 15 15">' + '    <g>' + '        <polyline fill="none" points="5.5 13.2 5.5 5.8 1.5 1.2 13.5 1.2 9.5 5.8 9.5 10.2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"></polyline>' + '    </g>' + '</svg>');
});

_Fcore.default.install('drag-horizontal', function () {
  return _('<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><circle cy="5" cx="9.5" r="1.5"></circle><circle cy="5" cx="14.5" r="1.5"></circle><circle cy="11" cx="9.5" r="1.5"></circle><circle cy="11" cx="14.5" r="1.5"></circle><circle cy="17" cx="9.5" r="1.5"></circle><circle cy="17" cx="14.5" r="1.5"></circle></svg>');
});

_Fcore.default.install('drag-vertical', function () {
  return _('<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" x="0" y="0" width="24px" height="24px" viewBox="0 0 24 24" preserveAspectRatio="none"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 5.83L15.17 9l1.41-1.41L12 3 7.41 7.59 8.83 9 12 5.83zm0 12.34L8.83 15l-1.41 1.41L12 21l4.59-4.59L15.17 15 12 18.17z" fill="#5F6368"/></g></svg>');
});

_Fcore.default.install('sort-up', function () {
  return _('<svg width="8" height="6" x="0" y="0" style="opacity: 1;"><defs></defs><rect x="0" y="0" width="8" height="6" fill="transparent" class="stencil__selection-helper"></rect><path d="M0 6.000000000000002C0 6.000000000000002 4.000000000000001 0 4.000000000000001 0 4.000000000000001 0 8 6.000000000000002 8 6.000000000000002 8 6.000000000000002 0 6.000000000000002 0 6.000000000000002" stroke-width="0" stroke="none" stroke-dasharray="none" fill="rgb(96, 96, 96)" fill-rule="evenOdd"></path></svg>');
});

_Fcore.default.install('sort-down', function () {
  return _('<svg width="8" height="6" x="0" y="0" style="opacity: 1;"><defs></defs><rect x="0" y="0" width="8" height="6" fill="transparent" class="stencil__selection-helper"></rect><path d="M0 0C0 0 4.000000000000001 6 4.000000000000001 6 4.000000000000001 6 8 0 8 0 8 0 0 0 0 0" stroke-width="0" stroke="none" stroke-dasharray="none" fill="rgb(96, 96, 96)" fill-rule="evenOdd"></path></svg>');
});
};

moduleFactories["node_modules/pizo/js/dom/Fcomp.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/dom/Fcomp.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./Icons");

var _Fcore = _interopRequireDefault(require("./Fcore"));


//install all icon to core
//todo: import orther Creator
var _default = _Fcore.default;
exports.default = _default;
};

moduleFactories["node_modules/pizo/js/R.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/R.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _default = {
  APP: 'pizo',
  VERSION: '0.0.1'
};
exports.default = _default;
};

moduleFactories["node_modules/pizo/js/component/FormatFunction.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/FormatFunction.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.formatDate = formatDate;
exports.setAction = setAction;
exports.checkValueElement = checkValueElement;
exports.checkManyArray = checkManyArray;
exports.check2Array = check2Array;
exports.getRealLength = getRealLength;
exports.generalOperator = generalOperator;
exports.operator = operator;
exports.equal = equal;
exports.formatNumber = formatNumber;
exports.reFormatNumber = reFormatNumber;
exports.formatFit = formatFit;
exports.getGMT = getGMT;
exports.getIDCompair = getIDCompair;
exports.getNameCompair = getNameCompair;
exports.removeAccents = removeAccents;
exports.promiseState = promiseState;
exports.consoleArea = consoleArea;
exports.grayscale = grayscale;
exports.consoleWKT = consoleWKT;
exports.consoleWKTLine = consoleWKTLine;
exports.checkRule = checkRule;
exports.checkRuleWKT = checkRuleWKT;
exports.loadingWheel = loadingWheel;
exports.insertAfter = insertAfter;
exports.isEqual = isEqual;
exports.isNumeric = isNumeric;
exports.setCookie = setCookie;
exports.getCookie = getCookie;
exports.eraseCookie = eraseCookie;
exports.isVisiableColumn = isVisiableColumn;
exports.isQueryMap = isQueryMap;

var _R = _interopRequireDefault(require("../R"));

var _Fcore = _interopRequireDefault(require("../dom/Fcore"));

require("../../css/FormatFunction.css");


var _ = _Fcore.default._;
var $ = _Fcore.default.$;

function formatDate(date, isMinutes = false, isHours = false, isDay = true, isMonth = true, isYear = false) {
  if (typeof date == "object") var d = date;else var d = new Date(date); //time zone value from database
  //get the timezone offset from local time in minutes

  var tzDifference = -d.getTimezoneOffset(); //convert the offset to milliseconds, add to targetTime, and make a new Date

  d = new Date(d.getTime() + tzDifference * 60 * 1000);
  var resultTime = [];
  var resultDayMonth = [];

  if (isHours) {
    var hour = '' + d.getHours();
    if (hour.length < 2) hour = '0' + hour;
    resultTime.push(hour);
  }

  if (isMinutes) {
    var minute = '' + d.getMinutes();
    if (minute.length < 2) minute = '0' + minute;
    resultTime.push(minute);
    var second = '' + d.getSeconds();
    if (second.length < 2) second = '0' + second;
    resultTime.push(second);
  }

  if (isDay) {
    var day = '' + d.getDate();
    if (day.length < 2) day = '0' + day;
    resultDayMonth.push(day);
  }

  if (isMonth) {
    var month = '' + (d.getMonth() + 1);
    if (month.length < 2) month = '0' + month;
    resultDayMonth.push(month);
  }

  if (isYear) resultDayMonth.push('' + d.getFullYear());
  return resultTime.join(':') + " " + resultDayMonth.join('/');
}

function setAction(data) {
  var result = [];
  var isResult = false;

  if (data.properties !== undefined) {
    for (var i = 0; i < data.properties.length; i++) {
      result.push(setAction(data.properties[i]));
    }

    if (eval(result.join("&&"))) {
      data["action"] = 'const';
      isResult = true;
    }
  }

  if (data.items !== undefined) {
    if (getRealLength(data.items) <= 1) {
      data["action"] = 'const';
      return true;
    }
  } else {
    if (result == "") return true;else if (isResult) {
      return true;
    }
  }

  return false;
}

function checkValueElement(element) {
  var input = element.getElementsByTagName("input");
  var textarea = element.getElementsByTagName("textarea");
  var selectmenu = element.getElementsByClassName("absol-selectmenu");
  var result = [];

  for (var i = 0; i < input.length; i++) {
    result.push(input[i].value);
  }

  for (var i = 0; i < textarea.length; i++) {
    result.push(textarea[i].value);
  }

  for (var i = 0; i < selectmenu.length; i++) {
    result.push(selectmenu[i].value);
  }

  return result;
}

function checkManyArray(arrAll, arrChild) {
  for (var i = 0; i < arrAll.length; i++) {
    if (check2Array(arrAll[i], arrChild)) return true;
  }

  return false;
}

function check2Array(arr1, arr2) {
  if (arr1.length !== arr2.length) return false;

  for (var i = 0; i < arr1.length; i++) {
    if (arr1[i] != arr2[i]) return false;
  }

  return true;
}

function getRealLength(arr) {
  var check = [];
  var count = 0;
  var checkElement = [];

  for (var i = 0; i < arr.length; i++) {
    if (arr[i] != null && typeof arr[i] === 'object') {
      var item = arr[i];

      if (checkElement[item.element.innerHTML] !== undefined && checkManyArray(checkElement[item.element.innerHTML], checkValueElement(item.element))) {
        arr.splice(i, 1);
        i--;
        continue;
      }

      if (checkElement[item.element.innerHTML]) {
        checkElement[item.element.innerHTML][++checkElement[item.element.innerHTML].index] = checkValueElement(item.element);
      } else {
        checkElement[item.element.innerHTML] = [];
        checkElement[item.element.innerHTML].index = 0;
        checkElement[item.element.innerHTML][checkElement[item.element.innerHTML].index] = checkValueElement(item.element);
      }
    } else {
      if (check[arr[i]] !== undefined) {
        arr.splice(i, 1);
        i--;
        continue;
      }

      check[arr[i]] = 1;
    }

    count++;
  }

  return count;
}

function generalOperator(data, WHERE) {
  var stringResult = operator(data, WHERE);
  if (stringResult == "()") return true;
  return eval(stringResult);
}

function operator(data, WHERE) {
  var stringResult = "(";

  for (var i = 0; i < WHERE.length; i++) {
    stringResult += equal(data, WHERE[i]);
  }

  return stringResult + ")";
}

function equal(data, WHERE) {
  var stringResult = "";

  if (typeof WHERE === "string") {
    return WHERE;
  } else if (typeof WHERE === "object") {
    if (Array.isArray(WHERE)) {
      stringResult += operator(data, WHERE);
    } else {
      for (var param in WHERE) {
        if (WHERE[param] !== null) {
          if (typeof WHERE[param] === "object") {
            var tempTime = WHERE[param].value;
            var tempTime1 = data[param];

            if (typeof WHERE[param].value.getMonth === 'function') {
              tempTime = WHERE[param].value.getTime();
              tempTime1 = new Date(data[param]);
              tempTime1 = tempTime1.getTime();
            }

            if (typeof data[param].getMonth === 'function') {
              tempTime = data[param].getTime();
              tempTime1 = new Date(WHERE[param].value);
              tempTime1 = tempTime1.getTime();
            }

            if (typeof tempTime == "string" && !isNaN(Date.parse(tempTime))) {
              tempTime = new Date(tempTime);
              tempTime = tempTime.getTime();
            }

            if (typeof tempTime1 == "string" && !isNaN(Date.parse(tempTime1))) {
              tempTime1 = new Date(tempTime1);
              tempTime1 = tempTime1.getTime();
            }

            if (eval(tempTime1 + WHERE[param].operator + tempTime)) stringResult += true;else stringResult += false;
          } else {
            var tempTime = WHERE[param];
            var tempTime1 = data[param];

            if (typeof WHERE[param] === 'object' && typeof WHERE[param].getMonth === 'function') {
              tempTime = WHERE[param].getTime();
              tempTime1 = new Date(data[param]);
              tempTime1 = tempTime1.getTime();
            }

            if (data[param] !== null && typeof data[param] === 'object' && typeof data[param].getMonth === 'function') {
              tempTime = data[param].getTime();
              tempTime1 = new Date(WHERE[param]);
              tempTime1 = tempTime1.getTime();
            }

            if (typeof tempTime == "string" && !isNaN(Date.parse(tempTime))) {
              tempTime = new Date(tempTime);
              tempTime = tempTime.getTime();
            }

            if (typeof tempTime1 == "string" && !isNaN(Date.parse(tempTime1))) {
              tempTime1 = new Date(tempTime1);
              tempTime1 = tempTime1.getTime();
            }

            if (tempTime1 == tempTime1) stringResult += true;else stringResult += false;
          }
        } else {
          stringResult += true;
        }
      }
    }
  }

  return stringResult;
}

function formatNumber(n) {
  if (n == "") return ""; // format number 1000000 to 1,234,567

  return n.replace(/\D/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

function reFormatNumber(n) {
  if (n == "") return "";
  return parseFloat(n.split(",").join(""));
}

function formatFit(n) {
  var arr = [];
  var per = 10;
  var check;

  while (n != 0) {
    check = n % per;
    arr.push(check);
    n = n - check;
    per *= 10;
  }

  return arr;
}

function getGMT(date, timezone = 0, onlyDay = false) {
  if (date == undefined) var d = new Date();else var d = new Date(date); //time zone value from database

  var timeZoneFromDB = timezone; //time zone value from database
  //get the timezone offset from local time in minutes

  var tzDifference = timeZoneFromDB * 60 + d.getTimezoneOffset(); //convert the offset to milliseconds, add to targetTime, and make a new Date

  d = new Date(d.getTime() + tzDifference * 60 * 1000);
  var resultTime = [];
  var resultDayMonth = [];

  if (onlyDay == false) {
    var hour = '' + d.getHours();
    if (hour.length < 2) hour = '0' + hour;
    resultTime.push(hour);
    var minute = '' + d.getMinutes();
    if (minute.length < 2) minute = '0' + minute;
    resultTime.push(minute);
    var second = '' + d.getSeconds();
    if (second.length < 2) second = '0' + second;
    resultTime.push(second);
  }

  resultDayMonth.push('' + d.getFullYear());
  var month = '' + (d.getMonth() + 1);
  if (month.length < 2) month = '0' + month;
  resultDayMonth.push(month);
  var day = '' + d.getDate();
  if (day.length < 2) day = '0' + day;
  resultDayMonth.push(day);
  if (onlyDay === false) return resultDayMonth.join('-') + " " + resultTime.join(':');else return resultDayMonth.join('-');
}

function getIDCompair(string) {
  if (string == 0) return 0;
  return parseInt(string.slice(string.lastIndexOf("_") + 1));
}

function getNameCompair(string) {
  if (string == 0) return "";
  return string.slice(0, string.lastIndexOf("_"));
}

function removeAccents(str) {
  return str.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/đ/g, 'd').replace(/Đ/g, 'D');
}

function promiseState(promise, callback) {
  // Symbols and RegExps are never content-equal
  var uniqueValue = window['Symbol'] ? Symbol('unique') : /unique/;

  function notifyPendingOrResolved(value) {
    if (value === uniqueValue) {
      return callback('pending');
    } else {
      return callback('fulfilled');
    }
  }

  function notifyRejected(reason) {
    return callback('rejected');
  }

  var race = [promise, Promise.resolve(uniqueValue)];
  Promise.race(race).then(notifyPendingOrResolved, notifyRejected);
}

function consoleArea(areas) {
  var result = [];
  var multipolygon = {
    type: "FeatureCollection",
    features: []
  };
  areas.forEach(function (f) {
    if (f._area > 1.1368683772161603e-13) {
      var vertices = f.vertexlist;

      if (vertices !== undefined) {
        var temp = [];

        for (var i = 0; i < vertices.length; i++) {
          temp.push([vertices[i].x, vertices[i].y]);
        }

        temp.push([vertices[0].x, vertices[0].y]);
        temp = checkRule(temp);
        multipolygon.features.push({
          type: "Feature",
          properties: {},
          geometry: {
            type: 'Polygon',
            coordinates: [temp]
          }
        });
      }
    }
  });
  return result;
}

function grayscale(src) {
  return new Promise(function (resolve, reject) {
    var image = new Image();
    image.src = src;
    image.style.visibility = "hidden";
    image.style.position = "absolute";
    image.style.top = 0;

    image.onload = function () {
      document.body.appendChild(image);
      var myCanvas = document.createElement("canvas");
      var myCanvasContext = myCanvas.getContext("2d");
      var imgWidth = image.width;
      var imgHeight = image.height; // You'll get some string error if you fail to specify the dimensions

      myCanvas.width = imgWidth;
      myCanvas.height = imgHeight; //  alert(imgWidth);

      myCanvasContext.drawImage(image, 0, 0); // This function cannot be called if the image is not rom the same domain.
      // You'll get security error if you do.

      var imgPixels = myCanvasContext.getImageData(0, 0, imgWidth, imgHeight);
      document.body.removeChild(image); // This loop gets every pixels on the image and

      for (var y = 0; y < imgPixels.height; y++) {
        for (var x = 0; x < imgPixels.width; x++) {
          var i = y * 4 * imgPixels.width + x * 4;
          var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
          imgPixels.data[i] = avg;
          imgPixels.data[i + 1] = avg;
          imgPixels.data[i + 2] = avg;
        }
      }

      myCanvasContext.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
      resolve(myCanvas.toDataURL());
    };
  });
}

function toBase64(arr) {
  //arr = new Uint8Array(arr) if it's an ArrayBuffer
  return btoa(arr.reduce((data, byte) => data + String.fromCharCode(byte), ''));
}

function consoleWKT(areas) {
  var multipolygon = "MULTIPOLYGON(";
  var polygon,
      isFirst,
      coordinates,
      isFirstPolygon = "";
  areas.forEach(function (f) {
    if (f._area > 1.1368683772161603e-13) {
      var vertices = f.vertexlist;

      if (vertices !== undefined) {
        polygon = "";
        coordinates = "";
        isFirst = "";

        for (var i = 0; i < vertices.length; i++) {
          coordinates += isFirst + vertices[i].x + " " + vertices[i].y;
          isFirst = ",";
        }

        coordinates += isFirst + vertices[0].x + " " + vertices[0].y;
        coordinates = checkRuleWKT(coordinates);
        polygon += "((" + coordinates + "))";
      }

      multipolygon += isFirstPolygon + polygon;
      isFirstPolygon = ",";
    }
  });
  multipolygon += ")";
  return multipolygon;
}

function consoleWKTLine(lines) {
  var isFirstLines = "";
  var multilines = "MultiLineString(";
  lines.forEach(function (f) {
    multilines += isFirstLines + "(" + f.origin.x + " " + f.origin.y;
    multilines += ", " + f.twin.origin.x + " " + f.twin.origin.y + ")";
    isFirstLines = ",";
  });
  multilines += ")";
  if (multilines == "MultiLineString()") return -1;
  return multilines;
}

function checkRule(poly) {
  var sum = 0;

  for (var i = 0; i < poly.length - 1; i++) {
    var cur = poly[i],
        next = poly[i + 1];
    sum += (next[0] - cur[0]) * (next[1] + cur[1]);
  }

  if (sum > 0) return poly.reverse();
  return poly;
}

function checkRuleWKT(poly) {
  var sum = 0;
  var polygon = poly.split(",");

  for (var i = 0; i < polygon.length - 1; i++) {
    var cur = polygon[i].split(" "),
        next = polygon[i + 1].split(" ");
    sum += (next[0] - cur[0]) * (parseFloat(next[1]) + parseFloat(cur[1]));
  }

  if (sum > 0) return polygon.reverse().join();
  return poly;
}

function loadingWheel() {
  var temp = _({
    tag: "div",
    class: "container-wheel",
    child: [{
      tag: "div",
      class: "lds-roller",
      child: [{
        tag: "div"
      }, {
        tag: "div"
      }, {
        tag: "div"
      }, {
        tag: "div"
      }, {
        tag: "div"
      }, {
        tag: "div"
      }, {
        tag: "div"
      }, {
        tag: "div"
      }]
    }]
  });

  Object.assign(temp, loadingWheel.prototype);
  document.body.appendChild(temp);
  document.body.style.pointerEvents = "none";
  return temp;
}

loadingWheel.prototype.disable = function () {
  document.body.style.pointerEvents = "";
  this.selfRemove();
};

function insertAfter(newNode, existingNode) {
  existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);
}

function isEqual(value, other) {
  // Get the value type
  var type = Object.prototype.toString.call(value); // If the two objects are not the same type, return false

  if (type !== Object.prototype.toString.call(other)) return false; // If items are not an object or array, return false

  if (['[object Array]', '[object Object]'].indexOf(type) < 0) return false; // Compare the length of the length of the two items

  var valueLen = type === '[object Array]' ? value.length : Object.keys(value).length;
  var otherLen = type === '[object Array]' ? other.length : Object.keys(other).length;
  if (valueLen !== otherLen) return false; // Compare two items

  var compare = function (item1, item2) {
    // Get the object type
    var itemType = Object.prototype.toString.call(item1); // If an object or array, compare recursively

    if (['[object Array]', '[object Object]'].indexOf(itemType) >= 0) {
      if (!isEqual(item1, item2)) return false;
    } // Otherwise, do a simple comparison
    else {
      // If the two items are not the same type, return false
      if (itemType !== Object.prototype.toString.call(item2)) return false; // Else if it's a function, convert to a string and compare
      // Otherwise, just compare

      if (itemType === '[object Function]') {
        if (item1.toString() !== item2.toString()) return false;
      } else {
        if (item1 !== item2) return false;
      }
    }
  }; // Compare properties


  if (type === '[object Array]') {
    for (var i = 0; i < valueLen; i++) {
      if (compare(value[i], other[i]) === false) return false;
    }
  } else {
    for (var key in value) {
      if (value.hasOwnProperty(key)) {
        if (compare(value[key], other[key]) === false) return false;
      }
    }
  } // If nothing failed, return true


  return true;
}

;

function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function setCookie(name, value, days) {
  var expires = "";

  if (days) {
    var date = new Date();
    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
    expires = "; expires=" + date.toUTCString();
  }

  document.cookie = name + "=" + (value || "") + expires + "; path=/";
}

function getCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');

  for (var i = 0; i < ca.length; i++) {
    var c = ca[i];

    while (c.charAt(0) == ' ') c = c.substring(1, c.length);

    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
  }

  return null;
}

function eraseCookie(name) {
  document.cookie = name + '=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}

function isVisiableColumn(dataAll, dataRow, current) {
  var isComplete = ["isFilter", "isSearch", "isRange"];

  for (var i = 0; i < isComplete.length; i++) {
    if (isComplete[i] == current) continue;
    if (dataAll[isComplete[i]] == true && dataRow[isComplete[i]] || dataAll[isComplete[i]] == undefined && dataRow[isComplete[i]] == undefined) continue;
    return false;
  }

  return true;
}

function isQueryMap(stackObject, query, dataStack) {
  // var isStack = ["isStatus","isTimeCreate","isPriceRange"];
  stackObject[dataStack] = query;
  var result = [];

  for (var param in stackObject) {
    if (result.length > 0) {
      result.push("&&");
    }

    result.push(stackObject[param]);
  }

  return result;
}
};

moduleFactories["node_modules/pizo/js/component/HashTable.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/HashTable.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.HashTable = HashTable;

var _FormatFunction = require("./FormatFunction");

function HashTable(data) {
  this.hash = [];
  this.checkData = [];
  this.functionSetHash(data);
  this.data = data;
  return this;
}

HashTable.prototype.functionSetHash = function (data, dataParent = "") {
  var hash = this.hash;
  var checkData = this.checkData;
  var value;
  var object;
  var tempCharater = [];

  for (var m = 0; m < data.length; m++) {
    object = data[m];

    for (var i = 0; i < object.length; i++) {
      if (object[i].valuesearch !== undefined) value = object[i].value;
      if (object[i].value !== undefined) value = object[i].value;else if (typeof object[i] === "string") value = object[i];else value = "";
      var stringCheck = m + dataParent;

      if (Array.isArray(value)) {
        for (var k = 0; k < value.length; k++) {
          for (var j = 0; j < value[k].length; j++) {
            tempCharater = value[k][j].toLocaleLowerCase();

            if (hash[tempCharater] === undefined) {
              hash[tempCharater] = [];
            }

            if (hash[tempCharater][stringCheck] == undefined) hash[tempCharater][stringCheck] = [];
            if (hash[tempCharater][stringCheck][i] === undefined) hash[tempCharater][stringCheck][i] = [];
            hash[tempCharater][stringCheck][i].push(j);
          }
        }
      } else {
        for (var j = 0; j < value.length; j++) {
          tempCharater = value[j].toLocaleLowerCase();

          if (hash[tempCharater] === undefined) {
            hash[tempCharater] = [];
          }

          if (hash[tempCharater][stringCheck] == undefined) hash[tempCharater][stringCheck] = [];
          if (hash[tempCharater][stringCheck][i] === undefined) hash[tempCharater][stringCheck][i] = [];
          hash[tempCharater][stringCheck][i].push(j);
        }
      }

      if (data[m].getRowMerge) checkData[stringCheck] = data[m].getRowMerge;else checkData[stringCheck] = [data[m]];
    }

    if (data[m].child !== undefined) {
      this.functionSetHash(data[m].child, "_" + m + dataParent);
    }
  }
};

HashTable.prototype.hashVisiableAll = function (arr) {
  arr.sort(function (a, b) {
    if (a.oldIndex === undefined) {
      if (b.oldIndex === undefined) return 0;
      return -1;
    }

    if (b.oldIndex === undefined) return 1;

    if (a.oldIndex < b.oldIndex) {
      return -1;
    }

    if (a.oldIndex > b.oldIndex) {
      return 1;
    }

    return 0;
  });

  for (var i = 0; i < arr.length; i++) {
    if ((0, _FormatFunction.isVisiableColumn)(this.data, arr[i], "isSearch")) {
      arr[i].visiable = true;
    } else {
      arr[i].visiable = false;
    }

    arr[i].isSearch = undefined;

    if (arr[i].child && arr[i].child.length > 0) {
      this.hashVisiableAll(arr[i].child);
    }
  }
};

HashTable.prototype.getKey = function (key, index) {
  key = key.trim();

  if (key === "") {
    this.hashVisiableAll(this.data);
    this.data.isSearch = undefined;
    return;
  }

  var check = [];
  this.data.updateVisible = true;
  var rowElement, objectElement;
  this.data.isSearch = true;

  for (var i = 0; i < key.length; i++) {
    var arrCharacter = this.hash[key[i].toLocaleLowerCase()];

    Loop1: for (var row in arrCharacter) {
      if (index === undefined) rowElement = arrCharacter[row];else if (arrCharacter[row][index] !== undefined) rowElement = [arrCharacter[row][index]];else continue;
      if (check[row] === undefined) check[row] = [];

      Loop2: for (var column in rowElement) {
        if (check[row][column] === undefined && i !== 0) {
          continue;
        }

        objectElement = rowElement[column];
        if (Array.isArray(objectElement)) for (var j = 0; j < objectElement.length; j++) {
          if (check[row][column] === undefined) {
            check[row][column] = {
              index: objectElement[j]
            };
            check[row][column].indexCharacter = key.length - 1;
            check[row][column].lastCheck = [objectElement];
            check[row][column].lastIndexCheck = [];
            check[row][column].lastIndex = objectElement[j];
            var temp = key.length - (objectElement[j] + "").length;
            var tempString = "";

            for (var x = 0; x < temp; x++) tempString += "0";

            check[row][column].tempExactly = parseFloat("0." + tempString + objectElement[j]);
          } else {
            if (objectElement[j] > check[row][column].index) {
              if (check[row][column].indexCharacter !== key.length - i) {
                delete check[row][column];
                continue Loop2;
              } else {
                var prevCheck = objectElement[j];
                var currentIndex = check[row][column].index;
                var tempIndex = check[row][column].indexCharacter;
                var tempExactly = check[row][column].tempExactly + (prevCheck - currentIndex);
                var lastCheck = check[row][column].lastCheck;
                var lastIndexCheck = check[row][column].lastIndexCheck; // prevCheck = currentIndex;

                var tempDistance = 0;

                for (var m = lastIndexCheck.length - 1; m >= 0; m--) {
                  var itemCheck = lastCheck[m + 1];
                  var itemIndexCheck = 1;
                  var lastIndex = lastIndexCheck[m];
                  var oldIndex = lastIndexCheck[m];

                  for (var n = itemIndexCheck; n < itemCheck.length; n++) {
                    if (itemCheck[n] > prevCheck) break;
                    lastIndex = itemCheck[n];
                  }

                  prevCheck = lastIndex;

                  if (lastIndex - oldIndex > 0) {
                    tempExactly -= lastIndex - oldIndex - tempDistance;
                    tempDistance += lastIndex - oldIndex;
                    lastIndexCheck[m] = lastIndex;

                    if (m == lastIndexCheck.length - 1) {
                      var temp = key.length - (lastIndex + "").length;
                      var tempString = "";

                      for (var x = 0; x < temp; x++) tempString += "0";

                      tempExactly = parseInt(tempExactly) + parseFloat("0." + tempString + lastIndex);
                    }
                  } else break;
                }

                lastCheck.unshift(objectElement);
                lastIndexCheck.unshift(check[row][column].lastIndex);
                check[row][column] = {
                  index: objectElement[j]
                };
                check[row][column].lastCheck = lastCheck;
                check[row][column].lastIndexCheck = lastIndexCheck;
                check[row][column].lastIndex = objectElement[j];
                check[row][column].indexCharacter = tempIndex - 1;
                check[row][column].tempExactly = tempExactly;
              }
            } else {
              continue;
            }
          }

          if (check[row][column].indexCharacter == 0) {
            var arrParent = row.split("_");
            var k = arrParent.length - 1;
            var stringCheck = arrParent[k];
            var charCode = stringCheck.charCodeAt(0);

            while (k >= 0) {
              var object = this.checkData[stringCheck];

              for (var l = 0; l < object.length; l++) {
                if ((0, _FormatFunction.isVisiableColumn)(this.data, object[l], "isSearch") === true) {
                  object[l].confirm = true;
                  object[l].isComplete = true;
                  var tempExactly = check[row][column].tempExactly + charCode / 1000000000;
                  if (object[l].exactly === undefined) object[l].exactly = tempExactly;else if (object[l].exactly > tempExactly) object[l].exactly = tempExactly;
                } else object[l].confirm = undefined;
              }

              var object = this.checkData[stringCheck];

              for (var l = 0; l < object.length; l++) {
                object[l].isSearch = true;
              }

              charCode += arrParent[k].charCodeAt(0);
              stringCheck = arrParent[--k] + "_" + stringCheck;
            }

            continue Loop1;
          } else {
            var object = this.checkData[row];

            for (var l = 0; l < object.length; l++) {
              if (object[l].isComplete !== true) {
                object[l].isSearch = undefined;
                object[l].confirm = undefined;
              }
            }

            continue Loop2;
          }
        }
      }
    }
  }
};
};

moduleFactories["node_modules/pizo/js/component/HashTableFilter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/HashTableFilter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.HashTableFilter = HashTableFilter;

var _FormatFunction = require("./FormatFunction");

function HashTableFilter(data) {
  this.hash = [];
  this.data = data;
  this.check = [];
  this.functionSetHash(data);
  this.indexCount = [];
  this.lastIndex = [];
  this.lastKey = [];
  this.lastIndexFilter = [];
  this.functionCheck = [];
  return this;
}

HashTableFilter.prototype.functionSetHash = function (data, dataParent = "") {
  var hash = this.hash;
  var value;
  var object;

  for (var m = 0; m < data.length; m++) {
    object = data[m];
    var stringCheck = m + dataParent;

    if (this.check[stringCheck] == undefined) {
      this.check[stringCheck] = [];
      this.check[stringCheck].data = object.getRowMerge;
    }

    for (var i = 0; i < object.length; i++) {
      if (object[i].value !== undefined) value = object[i].value;else if (typeof object[i] === "string") value = object[i];else value = "";

      if (Array.isArray(value)) {
        for (var j = 0; j < value.length; j++) {
          if (hash[i] === undefined) hash[i] = [];
          if (hash[i][value[j]] === undefined) hash[i][value[j]] = [];
          hash[i][value[j]].push(stringCheck);
        }
      } else {
        if (hash[i] === undefined) hash[i] = [];
        if (hash[i][value] === undefined) hash[i][value] = [];
        hash[i][value].push(stringCheck);
      }

      if (data[m].child !== undefined) {
        this.functionSetHash(data[m].child, "_" + m + dataParent);
      }
    }
  }
};

HashTableFilter.prototype.hashVisiableAll = function (arr) {
  for (var i = 0; i < arr.length; i++) {
    if ((0, _FormatFunction.isVisiableColumn)(this.data, arr[i], "isFilter")) {
      arr[i].visiable = true;
    } else {
      arr[i].visiable = false;
    }

    arr[i].isFilter = undefined;

    if (arr[i].child && arr[i].child.length > 0) {
      this.hashVisiableAll(arr[i].child);
    }
  }
};

HashTableFilter.prototype.getKey = function (key, index) {
  var hash = this.hash;
  this.lastKey[index] = key;

  if (key == 0) {
    if (this.lastIndex[index] !== undefined) for (var i = 0; i < this.lastIndex[index].length; i++) this.lastIndex[index][i][index] = undefined;
    delete this.indexCount[index];
    var countAll = this.indexCount.reduce((a, b) => a + b, 0);

    if (countAll > 0) {
      for (var tempx in this.indexCount) {
        index = parseInt(tempx);
        key = this.lastKey[index];
        break;
      }
    } else {
      this.hashVisiableAll(this.data);
      return;
    }
  }

  this.data.updateVisible = true;
  this.indexCount[index] = 1;
  this.data.isFilter = true;
  var countAll = this.indexCount.reduce((a, b) => a + b, 0);
  if (this.lastIndex[index] !== undefined) for (var i = 0; i < this.lastIndex[index].length; i++) this.lastIndex[index][i][index] = undefined;
  this.lastIndex[index] = [];

  for (var i = 0; i < this.lastIndexFilter.length; i++) {
    this.lastIndexFilter[i].isFilter = undefined;
  }

  this.lastIndexFilter = [];
  if (hash[index] !== undefined && hash[index][key] !== undefined) for (var i = 0; i < hash[index][key].length; i++) {
    var checkRow = this.check[hash[index][key][i]];
    checkRow[index] = true;
    this.lastIndex[index].push(checkRow);
    var countIn = 0;

    for (var param in checkRow) {
      if (checkRow[param] === true) {
        countIn++;
      }
    }

    if (countIn == countAll) {
      for (var k = 0; k < checkRow.data.length; k++) {
        if ((0, _FormatFunction.isVisiableColumn)(this.data, checkRow.data[k], "isFilter") === true) checkRow.data[k].confirm = true;
        checkRow.data[k].isFilter = true;
        checkRow.data[k].isComplete = true;
      }

      this.lastIndexFilter.push(checkRow);
    } else {
      for (var k = 0; k < checkRow.data.length; k++) {
        if (checkRow.data[k].isComplete !== true) {
          checkRow.data[k].isFilter = undefined;
          checkRow.data[k].confirm = undefined;
        }
      }
    }
  }
};
};

moduleFactories["node_modules/pizo/js/component/HashTableRange.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/HashTableRange.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.HashTableRange = HashTableRange;

var _FormatFunction = require("./FormatFunction");

function HashTableRange(data, id, index) {
  this.data = data;
  this.hash = [];
  this.indexCount = [];
  this.setUpKey(id, index);
  return this;
}

HashTableRange.prototype.setUpKey = function (id, index) {
  this.hash[id] = [index];
};

HashTableRange.prototype.hashVisiableAll = function (arr) {
  for (var i = 0; i < arr.length; i++) {
    if ((0, _FormatFunction.isVisiableColumn)(this.data, arr[i], "isRange")) {
      arr[i].visiable = true;
    } else {
      arr[i].visiable = false;
    }

    arr[i].isRange = undefined;

    if (arr[i].child && arr[i].child.length > 0) {
      this.hashVisiableAll(arr[i].child);
    }
  }
};

HashTableRange.prototype.getKey = function (min, max, id) {
  if (min == this.hash[id][1] && max == this.hash[id][2]) return;
  this.hash[id][1] = min;
  this.hash[id][2] = max;
  var index = this.hash[id][0];
  var value, object;
  this.data.isRange = true;
  this.data.updateVisible = true;

  Loop: for (var i = 0; i < this.data.length; i++) {
    var object = this.data[i][index];
    if (object.value !== undefined) value = object.value;else if (typeof object === "string") value = object;else value = "";
    if (this.indexCount[i] == undefined) this.indexCount[i] = [];

    if ((min === "" || min == undefined || min < value) && (max === "" || max == undefined || value < max)) {
      this.indexCount[i][id] = true;
    } else this.indexCount[i][id] = false;

    for (var param in this.hash) {
      if (this.indexCount[i][param] == false) {
        this.data[i].isRange = false;
        this.data[i].confirm = undefined;
        continue Loop;
      } else {
        this.data[i].isRange = true;

        if ((0, _FormatFunction.isVisiableColumn)(this.data, this.data[i], "isRange")) {
          this.data[i].confirm = true;
        } else this.data[i].confirm = undefined;
      }
    }
  }
};
};

moduleFactories["node_modules/pizo/js/component/slip.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/slip.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = Slip;

/*
    Slip - swiping and reordering in lists of elements on touch screens, no fuss.

    Fires these events on list elements:

        • slip:swipe
            When swipe has been done and user has lifted finger off the screen.
            If you execute event.preventDefault() the element will be animated back to original position.
            Otherwise it will be animated off the list and set to display:none.

        • slip:beforeswipe
            Fired before first swipe movement starts.
            If you execute event.preventDefault() then element will not move at all.

        • slip:cancelswipe
            Fired after the user has started to swipe, but lets go without actually swiping left or right.

        • slip:animateswipe
            Fired while swiping, before the user has let go of the element.
            event.detail.x contains the amount of movement in the x direction.
            If you execute event.preventDefault() then the element will not move to this position.
            This can be useful for saturating the amount of swipe, or preventing movement in one direction, but allowing it in the other.

        • slip:reorder
            Element has been dropped in new location. event.detail contains the following:
                • insertBefore: DOM node before which element has been dropped (null is the end of the list). Use with node.insertBefore().
                • spliceIndex: Index of element before which current element has been dropped, not counting the element iself.
                               For use with Array.splice() if the list is reflecting objects in some array.
                • originalIndex: The original index of the element before it was reordered.

        • slip:beforereorder
            When reordering movement starts.
            Element being reordered gets class `slip-reordering`.
            If you execute event.preventDefault() then the element will not move at all.

        • slip:beforewait
            If you execute event.preventDefault() then reordering will begin immediately, blocking ability to scroll the page.

        • slip:tap
            When element was tapped without being swiped/reordered. You can check `event.target` to limit that behavior to drag handles.


    Usage:

        CSS:
            You should set `user-select:none` (and WebKit prefixes, sigh) on list elements,
            otherwise unstoppable and glitchy text selection in iOS will get in the way.

            You should set `overflow-x: hidden` on the container or body to prevent horizontal scrollbar
            appearing when elements are swiped off the list.


        var list = document.querySelector('ul#slippylist');
        new Slip(list);

        list.addEventListener('slip:beforeswipe', function(e) {
            if (shouldNotSwipe(e.target)) e.preventDefault();
        });

        list.addEventListener('slip:swipe', function(e) {
            // e.target swiped
            if (thatWasSwipeToRemove) {
                e.target.parentNode.removeChild(e.target);
            } else {
                e.preventDefault(); // will animate back to original position
            }
        });

        list.addEventListener('slip:beforereorder', function(e) {
            if (shouldNotReorder(e.target)) e.preventDefault();
        });

        list.addEventListener('slip:reorder', function(e) {
            // e.target reordered.
            if (reorderedOK) {
                e.target.parentNode.insertBefore(e.target, e.detail.insertBefore);
            } else {
                e.preventDefault();
            }
        });

    Requires:
        • Touch events
        • CSS transforms
        • Function.bind()

    Caveats:
        • Elements must not change size while reordering or swiping takes place (otherwise it will be visually out of sync)
*/

/*! @license
    Slip.js 1.2.0

    © 2014 Kornel Lesiński <kornel@geekhood.net>. All rights reserved.

    Redistribution and use in source and binary forms, with or without modification,
    are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
       the following disclaimer in the documentation and/or other materials provided with the distribution.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
    USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
var accessibility = {
  // Set values to false if you don't want Slip to manage them
  container: {
    ariaRole: "listbox",
    tabIndex: 0,
    focus: false // focuses after drop

  },
  items: {
    ariaRole: "option",
    // If "option" flattens items, try "group": https://www.marcozehe.de/2013/03/08/sometimes-you-have-to-use-illegal-wai-aria-to-make-stuff-work/
    tabIndex: -1,
    // 0 will make every item tabbable, which isn't always useful
    focus: false // focuses when dragging

  }
};
var damnYouChrome = /Chrome\/[3-5]/.test(navigator.userAgent); // For bugs that can't be programmatically detected :( Intended to catch all versions of Chrome 30-40

var needsBodyHandlerHack = damnYouChrome; // Otherwise I _sometimes_ don't get any touchstart events and only clicks instead.

/* When dragging elements down in Chrome (tested 34-37) dragged element may appear below stationary elements.
   Looks like WebKit bug #61824, but iOS Safari doesn't have that problem. */

var compositorDoesNotOrderLayers = damnYouChrome; // -webkit-mess

var testElementStyle = document.createElement('div').style;
var transitionJSPropertyName = "transition" in testElementStyle ? "transition" : "webkitTransition";
var transformJSPropertyName = "transform" in testElementStyle ? "transform" : "webkitTransform";
var transformCSSPropertyName = transformJSPropertyName === "webkitTransform" ? "-webkit-transform" : "transform";
var userSelectJSPropertyName = "userSelect" in testElementStyle ? "userSelect" : "webkitUserSelect";
testElementStyle[transformJSPropertyName] = 'translateZ(0)';
var hwLayerMagicStyle = testElementStyle[transformJSPropertyName] ? 'translateZ(0) ' : '';
var hwTopLayerMagicStyle = testElementStyle[transformJSPropertyName] ? 'translateZ(1px) ' : '';
testElementStyle = null;
var globalInstances = 0;
var attachedBodyHandlerHack = false;

var nullHandler = function () {};

function Slip(container, options) {
  if ('string' === typeof container) container = document.querySelector(container);
  if (!container || !container.addEventListener) throw new Error("Please specify DOM node to attach to");
  if (!this || this === window) return new Slip(container, options);
  this.options = options = options || {};
  this.options.keepSwipingPercent = options.keepSwipingPercent || 0;
  this.options.minimumSwipeVelocity = options.minimumSwipeVelocity || 1;
  this.options.minimumSwipeTime = options.minimumSwipeTime || 110;
  this.options.ignoredElements = options.ignoredElements || [];
  if (!Array.isArray(this.options.ignoredElements)) throw new Error("ignoredElements must be an Array"); // Functions used for as event handlers need usable `this` and must not change to be removable

  this.cancel = this.setState.bind(this, this.states.idle);
  this.onTouchStart = this.onTouchStart.bind(this);
  this.onTouchMove = this.onTouchMove.bind(this);
  this.onTouchEnd = this.onTouchEnd.bind(this);
  this.onMouseDown = this.onMouseDown.bind(this);
  this.onMouseMove = this.onMouseMove.bind(this);
  this.onMouseUp = this.onMouseUp.bind(this);
  this.onMouseLeave = this.onMouseLeave.bind(this);
  this.onSelection = this.onSelection.bind(this);
  this.onContainerFocus = this.onContainerFocus.bind(this);
  this.setState(this.states.idle);
  this.attach(container);
}

function getTransform(node) {
  var transform = node.style[transformJSPropertyName];

  if (transform) {
    return {
      value: transform,
      original: transform
    };
  }

  if (window.getComputedStyle) {
    var style = window.getComputedStyle(node).getPropertyValue(transformCSSPropertyName);
    if (style && style !== 'none') return {
      value: style,
      original: ''
    };
  }

  return {
    value: '',
    original: ''
  };
}

function findIndex(target, nodes) {
  var originalIndex = 0;
  var listCount = 0;

  for (var i = 0; i < nodes.length; i++) {
    if (nodes[i].nodeType === 1) {
      listCount++;

      if (nodes[i] === target.node) {
        originalIndex = listCount - 1;
      }
    }
  }

  return originalIndex;
} // All functions in states are going to be executed in context of Slip object


Slip.prototype = {
  container: null,
  options: {},
  state: null,
  target: null,
  // the tapped/swiped/reordered node with height and backed up styles
  usingTouch: false,
  // there's no good way to detect touchscreen preference other than receiving a touch event (really, trust me).
  mouseHandlersAttached: false,
  startPosition: null,
  // x,y,time where first touch began
  latestPosition: null,
  // x,y,time where the finger is currently
  previousPosition: null,
  // x,y,time where the finger was ~100ms ago (for velocity calculation)
  startPositionAverage: null,
  canPreventScrolling: false,
  states: {
    idle: function idleStateInit() {
      this.removeMouseHandlers();

      if (this.target) {
        this.target.node.style.willChange = ''; // this.target = null;
      }

      this.usingTouch = false;
      return {
        allowTextSelection: true
      };
    },
    undecided: function undecidedStateInit() {
      this.target.height = this.target.node.offsetHeight;
      this.target.node.style.willChange = transformCSSPropertyName;
      this.target.node.style[transitionJSPropertyName] = '';

      if (!this.dispatch(this.target.originalTarget, 'beforewait')) {
        if (this.dispatch(this.target.originalTarget, 'beforereorder')) {
          this.setState(this.states.reorder);
        }
      } else {
        var holdTimer = setTimeout(function () {
          var move = this.getAbsoluteMovement();

          if (this.canPreventScrolling && move.x < 15 && move.y < 25) {
            if (this.dispatch(this.target.originalTarget, 'beforereorder')) {
              this.setState(this.states.reorder);
            }
          }
        }.bind(this), 300);
      }

      return {
        leaveState: function () {
          clearTimeout(holdTimer);
        },
        onMove: function () {
          var move = this.getAbsoluteMovement();

          if (move.x > 20 && move.y < Math.max(100, this.target.height)) {
            if (this.dispatch(this.target.originalTarget, 'beforeswipe', {
              directionX: move.directionX,
              directionY: move.directionY
            })) {
              this.setState(this.states.swipe);
              return false;
            } else {
              this.setState(this.states.idle);
            }
          }

          if (move.y > 20) {
            this.setState(this.states.idle);
          } // Chrome likes sideways scrolling :(


          if (move.x > move.y * 1.2) return false;
        },
        onLeave: function () {
          this.setState(this.states.idle);
        },
        onEnd: function () {
          var allowDefault = this.dispatch(this.target.originalTarget, 'tap');
          this.setState(this.states.idle);
          return allowDefault;
        }
      };
    },
    swipe: function swipeStateInit() {
      var swipeSuccess = false;
      var swipeAverage = false;
      var container = this.container;
      var originalIndex = findIndex(this.target, this.container.childNodes);
      this.target.node.originalIndex = originalIndex;
      container.classList.add('slip-swiping-container');

      function removeClass() {
        container.classList.remove('slip-swiping-container');
      }

      this.target.height = this.target.node.offsetHeight;
      return {
        leaveState: function () {
          if (swipeSuccess) {
            this.animateSwipe(function (target) {
              target.node.style[transformJSPropertyName] = target.baseTransform.original;
              target.node.style[transitionJSPropertyName] = '';

              if (this.dispatch(target.node, 'afterswipe')) {
                removeClass();
                return true;
              } else {
                this.animateToZeroHidden(undefined, target);
              }
            }.bind(this));
          } else {
            if (swipeAverage) this.animateToAverage(removeClass);else this.animateToZeroHidden(removeClass);
          }
        },
        onMove: function () {
          var delta = 0;
          if (this.target.node.startPositionAverage !== undefined) delta = this.target.node.startPositionAverage;
          var move = this.getTotalMovementAvarage(delta);

          if (Math.abs(move.y) < this.target.height + 20) {
            if (this.dispatch(this.target.node, 'animateswipe', {
              x: move.x,
              originalIndex: originalIndex
            })) {
              if (true) {
                this.target.node.style[transformJSPropertyName] = 'translate(' + move.x + 'px,0) ' + hwLayerMagicStyle;

                if (this.target.node.hiddenButtonRight !== undefined) {
                  var hiddenButtonRight = this.target.node.hiddenButtonRight;
                  hiddenButtonRight.style["height"] = this.target.node.offsetHeight + "px";
                  hiddenButtonRight.style[transformJSPropertyName] = 'translate(' + -move.x + 'px,0) ' + hwLayerMagicStyle;
                  if (-move.x > 0) hiddenButtonRight.style["width"] = -move.x + "px";
                  var tempElement = hiddenButtonRight.childNodes[0].childNodes[hiddenButtonRight.childNodes[0].childNodes.length - 1];
                  var lastWidth;

                  if (tempElement !== undefined) {
                    if (tempElement.classList.contains("button-hidden-swipe-activeAll-width")) lastWidth = parseInt(tempElement.style.maxWidth);else lastWidth = tempElement.clientWidth;

                    if (hiddenButtonRight.offsetWidth > hiddenButtonRight.childNodes[0].offsetWidth + lastWidth || hiddenButtonRight.childNodes[0].childNodes.length == 1 && -move.x > 0) {
                      if (tempElement !== undefined && !tempElement.classList.contains("button-hidden-swipe-activeAll-width")) {
                        tempElement.classList.add("button-hidden-swipe-activeAll-width");
                      }
                    } else {
                      if (tempElement !== undefined && tempElement.classList.contains("button-hidden-swipe-activeAll-width")) {
                        tempElement.classList.remove("button-hidden-swipe-activeAll-width");
                      }
                    }
                  }
                }
              } else {
                this.target.node.style[transformJSPropertyName] = 'translate(' + move.x + 'px,0) ' + hwLayerMagicStyle;

                if (this.target.node.hiddenButtonLeft !== undefined) {
                  var hiddenButtonLeft = this.target.node.hiddenButtonLeft;
                  hiddenButtonLeft.style["height"] = this.target.node.offsetHeight + "px";
                  hiddenButtonLeft.style[transformJSPropertyName] = 'translate(' + -move.x + 'px,0) ' + hwLayerMagicStyle;
                  if (-move.x > 0) hiddenButtonLeft.style["width"] = -move.x + "px";
                  var tempElement = hiddenButtonLeft.childNodes[0].childNodes[hiddenButtonLeft.childNodes[0].childNodes.length - 1];
                  var lastWidth;
                  if (tempElement.classList.contains("button-hidden-swipe-activeAll-width")) lastWidth = parseInt(tempElement.style.maxWidth);else lastWidth = tempElement.offsetWidth;

                  if (hiddenButtonLeft.offsetWidth > hiddenButtonLeft.childNodes[0].offsetWidth + lastWidth) {
                    if (tempElement !== undefined && !tempElement.classList.contains("button-hidden-swipe-activeAll-width")) {
                      tempElement.classList.add("button-hidden-swipe-activeAll-width");
                    }
                  } else {
                    if (tempElement !== undefined && tempElement.classList.contains("button-hidden-swipe-activeAll-width")) {
                      tempElement.classList.remove("button-hidden-swipe-activeAll-width");
                    }
                  }
                }
              }
            }

            return false;
          } else {
            this.dispatch(this.target.node, 'cancelswipe');
            this.setState(this.states.idle);
          }
        },
        onLeave: function () {
          this.state.onEnd.call(this);
        },
        onEnd: function () {
          var hiddenButtonRight = this.target.node.hiddenButtonRight;
          var tempElement;
          if (hiddenButtonRight !== undefined) tempElement = hiddenButtonRight.childNodes[0].childNodes[hiddenButtonRight.childNodes[0].childNodes.length - 1];
          var delta = 0;
          if (this.target.node.startPositionAverage != undefined && this.target.node.startPositionAverage > 0) delta = this.target.node.startPositionAverage;
          var move = this.getAbsoluteMovementAvarage(delta);
          var swiped = false;

          if (tempElement !== undefined && tempElement.classList.contains("button-hidden-swipe-activeAll-width")) {
            var swiped = true;
          } else {
            var velocity = (move.x - delta) / move.time; // How far out has the item been swiped?

            var swipedPercent = Math.abs((this.startPosition.x - this.previousPosition.x) / this.container.clientWidth) * 100;

            if (tempElement !== undefined) {
              // console.log(move.x,tempElement.childNodes[0])
              if (move.x > parseInt(tempElement.childNodes[0].offsetWidth) * hiddenButtonRight.childNodes[0].childNodes.length && move.directionX == "left") swipeAverage = true;
            } else {
              if (delta > 0) swiped = false;else var swiped = velocity > this.options.minimumSwipeVelocity && move.time > this.options.minimumSwipeTime || this.options.keepSwipingPercent && swipedPercent > this.options.keepSwipingPercent;
            }
          }

          if (swiped) {
            if (this.dispatch(this.target.node, 'swipe', {
              direction: move.directionX,
              originalIndex: originalIndex
            })) {
              swipeSuccess = true; // can't animate here, leaveState overrides anim
            }
          } else {
            this.dispatch(this.target.node, 'cancelswipe');
          }

          this.setState(this.states.idle);
          return !swiped;
        }
      };
    },
    reorder: function reorderStateInit() {
      if (this.target.node.focus && accessibility.items.focus) {
        this.target.node.focus();
      }

      this.target.height = this.target.node.offsetHeight;
      var nodes;

      if (this.options.ignoredElements.length) {
        var container = this.container;
        var query = container.tagName.toLowerCase();

        if (container.getAttribute('id')) {
          query = '#' + container.getAttribute('id');
        } else if (container.classList.length) {
          query += '.' + container.getAttribute('class').replace(' ', '.');
        }

        query += ' > ';
        this.options.ignoredElements.forEach(function (selector) {
          query += ':not(' + selector + ')';
        });

        try {
          nodes = container.parentNode.querySelectorAll(query);
        } catch (err) {
          if (err instanceof DOMException && err.name === 'SyntaxError') throw new Error('ignoredElements you specified contain invalid query');else throw err;
        }
      } else {
        nodes = this.container.childNodes;
      }

      var originalIndex = findIndex(this.target, nodes);
      var mouseOutsideTimer;
      var zero = this.target.node.offsetTop + this.target.height / 2;
      var otherNodes = [];
      var element = this.target.node;

      if (element.childrenNodes.length != 0) {
        element.setDisPlayNone();
      }

      var elementParent = element.getParentNode();

      if (elementParent.tagName == "DIV") {
        element.minDrag = elementParent.headerTable.offsetHeight;
      } else element.minDrag = elementParent.offsetTop + elementParent.offsetHeight;

      if (elementParent.tagName == "DIV") {
        element.maxDrag = elementParent.childNodes[0].offsetHeight - element.offsetHeight;
      } else element.maxDrag = elementParent.offsetTop + elementParent.getHeightChild();

      for (var i = 0; i < nodes.length; i++) {
        if (nodes[i].nodeType != 1 || nodes[i] === this.target.node) continue;
        var t = nodes[i].offsetTop;
        nodes[i].style[transitionJSPropertyName] = transformCSSPropertyName + ' 0.2s ease-in-out';
        nodes[i].transformObject = {
          node: nodes[i],
          baseTransform: getTransform(nodes[i]),
          pos: t + (t < zero ? nodes[i].offsetHeight : 0) - zero
        };
        otherNodes.push(nodes[i].transformObject);
      }

      this.target.node.classList.add('slip-reordering'); // this.target.node.style.zIndex = '99999';

      this.target.node.style[userSelectJSPropertyName] = 'none';

      if (compositorDoesNotOrderLayers) {
        // Chrome's compositor doesn't sort 2D layers
        this.container.style.webkitTransformStyle = 'preserve-3d';
      }

      function onChangeChild(arr, text) {
        for (var i = 0; i < arr.length; i++) {
          arr[i].style[transformJSPropertyName] = text;

          if (arr[i].childrenNodes.length !== 0) {
            onChangeChild(arr[i].childrenNodes, text);
          }
        }
      }

      function onMove() {
        /*jshint validthis:true */
        var self = this;
        this.updateScrolling();

        if (mouseOutsideTimer) {
          // don't care where the mouse is as long as it moves
          clearTimeout(mouseOutsideTimer);
          mouseOutsideTimer = null;
        }

        var move = this.getTotalMovement();
        if (this.target.node.offsetTop + move.y < this.target.node.minDrag || this.target.node.offsetTop + move.y > this.target.node.maxDrag) return;
        this.target.node.style[transformJSPropertyName] = 'translate(0,' + move.y + 'px) ' + hwTopLayerMagicStyle + this.target.baseTransform.value;
        this.target.node.moveY = move;
        var height = this.target.height;
        this.target.node.getParentNode().childrenNodes.forEach(function (o) {
          // o = o.transformObject;
          if (self.target.node !== o) {
            o = o.transformObject;
            var off = 0;

            if (o.pos < 0 && move.y < 0 && o.pos > move.y) {
              off = height;
            } else if (o.pos > 0 && move.y > 0 && o.pos < move.y) {
              off = -height;
            } // FIXME: should change accelerated/non-accelerated state lazily


            var transform = off ? 'translate(0,' + off + 'px) ' + hwLayerMagicStyle + o.baseTransform.value : o.baseTransform.original;

            if (o.node.style[transformJSPropertyName] != transform) {
              o.node.style[transformJSPropertyName] = transform;

              if (o.node.childrenNodes.length != 0) {
                var arr = o.node.childrenNodes;
                onChangeChild(arr, transform);
              }
            }
          }
        });
        return false;
      }

      onMove.call(this);
      return {
        leaveState: function () {
          if (mouseOutsideTimer) clearTimeout(mouseOutsideTimer);

          if (compositorDoesNotOrderLayers) {
            this.container.style.webkitTransformStyle = '';
          }

          if (this.container.focus && accessibility.container.focus) {
            this.container.focus();
          }

          this.target.node.classList.remove('slip-reordering');
          this.target.node.style[userSelectJSPropertyName] = '';
          this.animateToZero(function (target) {
            target.node.style.zIndex = '';
          });
          otherNodes.forEach(function (o) {
            o.node.style[transformJSPropertyName] = o.baseTransform.original;
            o.node.style[transitionJSPropertyName] = ''; // FIXME: animate to new position
          });
        },
        onMove: onMove,
        onLeave: function () {
          // don't let element get stuck if mouse left the window
          // but don't cancel immediately as it'd be annoying near window edges
          if (mouseOutsideTimer) clearTimeout(mouseOutsideTimer);
          mouseOutsideTimer = setTimeout(function () {
            mouseOutsideTimer = null;
            this.cancel();
          }.bind(this), 700);
        },
        onEnd: function () {
          var move = this.target.node.moveY;
          var i, spliceIndex;
          var arr = this.target.node.getParentNode().childrenNodes;

          if (move === undefined || move.y === undefined) {
            this.setState(this.states.idle);
            return false;
          }

          if (move.y < 0) {
            for (i = 0; i < arr.length; i++) {
              if (arr[i].transformObject !== undefined && arr[i].transformObject.pos > move.y) {
                break;
              }
            }

            spliceIndex = i;
          } else {
            for (i = arr.length - 1; i >= 0; i--) {
              if (arr[i].transformObject !== undefined && arr[i].transformObject.pos < move.y) {
                break;
              }
            }

            spliceIndex = i + 1;
          } // if (spliceIndex == originalIndex) {
          //     this.setState(this.states.idle);
          //     return false;
          // }


          this.dispatch(this.target.node, 'reorder', {
            spliceIndex: spliceIndex,
            originalIndex: originalIndex,
            insertBefore: arr[spliceIndex] ? arr[spliceIndex] : null
          });
          this.setState(this.states.idle);
          return false;
        }
      };
    }
  },
  attach: function (container) {
    globalInstances++;
    if (this.container) this.detach(); // In some cases taps on list elements send *only* click events and no touch events. Spotted only in Chrome 32+
    // Having event listener on body seems to solve the issue (although AFAIK may disable smooth scrolling as a side-effect)

    if (!attachedBodyHandlerHack && needsBodyHandlerHack) {
      attachedBodyHandlerHack = true;
      document.body.addEventListener('touchstart', nullHandler, false);
    }

    this.container = container; // Accessibility

    if (false !== accessibility.container.tabIndex) {
      this.container.tabIndex = accessibility.container.tabIndex;
    }

    if (accessibility.container.ariaRole) {
      this.container.setAttribute('aria-role', accessibility.container.ariaRole);
    }

    this.setChildNodesAriaRoles();
    this.container.addEventListener('focus', this.onContainerFocus, false);
    this.otherNodes = []; // selection on iOS interferes with reordering

    document.addEventListener("selectionchange", this.onSelection, false); // cancel is called e.g. when iOS detects multitasking gesture

    this.container.addEventListener('touchcancel', this.cancel, false);
    this.container.addEventListener('touchstart', this.onTouchStart, false);
    this.container.addEventListener('touchmove', this.onTouchMove, false);
    this.container.addEventListener('touchend', this.onTouchEnd, false);
    this.container.addEventListener('mousedown', this.onMouseDown, false); // mousemove and mouseup are attached dynamically
  },
  detach: function () {
    this.cancel();
    this.container.removeEventListener('mousedown', this.onMouseDown, false);
    this.container.removeEventListener('touchend', this.onTouchEnd, false);
    this.container.removeEventListener('touchmove', this.onTouchMove, false);
    this.container.removeEventListener('touchstart', this.onTouchStart, false);
    this.container.removeEventListener('touchcancel', this.cancel, false);
    document.removeEventListener("selectionchange", this.onSelection, false);

    if (false !== accessibility.container.tabIndex) {
      this.container.removeAttribute('tabIndex');
    }

    if (accessibility.container.ariaRole) {
      this.container.removeAttribute('aria-role');
    }

    this.unSetChildNodesAriaRoles();
    globalInstances--;

    if (!globalInstances && attachedBodyHandlerHack) {
      attachedBodyHandlerHack = false;
      document.body.removeEventListener('touchstart', nullHandler, false);
    }
  },
  setState: function (newStateCtor) {
    if (this.state) {
      if (this.state.ctor === newStateCtor) return;
      if (this.state.leaveState) this.state.leaveState.call(this);
    } // Must be re-entrant in case ctor changes state


    var prevState = this.state;
    var nextState = newStateCtor.call(this);

    if (this.state === prevState) {
      nextState.ctor = newStateCtor;
      this.state = nextState;
    }
  },
  findTargetNode: function (targetNode) {
    while (targetNode && targetNode.parentNode !== this.container) {
      targetNode = targetNode.parentNode;
    }

    return targetNode;
  },
  onContainerFocus: function (e) {
    e.stopPropagation();
    this.setChildNodesAriaRoles();
  },
  setChildNodesAriaRoles: function () {
    var nodes = this.container.childNodes;

    for (var i = 0; i < nodes.length; i++) {
      if (nodes[i].nodeType != 1) continue;

      if (accessibility.items.ariaRole) {
        nodes[i].setAttribute('aria-role', accessibility.items.ariaRole);
      }

      if (false !== accessibility.items.tabIndex) {
        nodes[i].tabIndex = accessibility.items.tabIndex;
      }
    }
  },
  unSetChildNodesAriaRoles: function () {
    var nodes = this.container.childNodes;

    for (var i = 0; i < nodes.length; i++) {
      if (nodes[i].nodeType != 1) continue;

      if (accessibility.items.ariaRole) {
        nodes[i].removeAttribute('aria-role');
      }

      if (false !== accessibility.items.tabIndex) {
        nodes[i].removeAttribute('tabIndex');
      }
    }
  },
  onSelection: function (e) {
    e.stopPropagation();
    var isRelated = e.target === document || this.findTargetNode(e);
    var iOS = /(iPhone|iPad|iPod)/i.test(navigator.userAgent) && !/(Android|Windows)/i.test(navigator.userAgent);
    if (!isRelated) return;

    if (iOS) {
      // iOS doesn't allow selection to be prevented
      this.setState(this.states.idle);
    } else {
      if (!this.state.allowTextSelection) {
        e.preventDefault();
      }
    }
  },
  addMouseHandlers: function () {
    // unlike touch events, mousemove/up is not conveniently fired on the same element,
    // but I don't need to listen to unrelated events all the time
    if (!this.mouseHandlersAttached) {
      this.mouseHandlersAttached = true;
      document.documentElement.addEventListener('mouseleave', this.onMouseLeave, false);
      window.addEventListener('mousemove', this.onMouseMove, true);
      window.addEventListener('mouseup', this.onMouseUp, true);
      window.addEventListener('blur', this.cancel, false);
    }
  },
  removeMouseHandlers: function () {
    if (this.mouseHandlersAttached) {
      this.mouseHandlersAttached = false;
      document.documentElement.removeEventListener('mouseleave', this.onMouseLeave, false);
      window.removeEventListener('mousemove', this.onMouseMove, true);
      window.removeEventListener('mouseup', this.onMouseUp, true);
      window.removeEventListener('blur', this.cancel, false);
    }
  },
  onMouseLeave: function (e) {
    // e.stopPropagation();
    if (this.usingTouch) return;

    if (e.target === document.documentElement || e.relatedTarget === document.documentElement) {
      if (this.state.onLeave) {
        this.state.onLeave.call(this);
      }
    }
  },
  onMouseDown: function (e) {
    e.stopPropagation();
    if (this.usingTouch || e.button != 0 || !this.setTarget(e)) return;
    this.addMouseHandlers(); // mouseup, etc.

    this.canPreventScrolling = true; // or rather it doesn't apply to mouse

    this.startAtPosition({
      x: e.clientX,
      y: e.clientY,
      time: e.timeStamp
    });
  },
  onTouchStart: function (e) {
    e.stopPropagation();
    this.usingTouch = true;
    this.canPreventScrolling = true; // This implementation cares only about single touch

    if (e.touches.length > 1) {
      this.setState(this.states.idle);
      return;
    }

    if (!this.setTarget(e)) return;
    this.startAtPosition({
      x: e.touches[0].clientX,
      y: e.touches[0].clientY,
      time: e.timeStamp
    });
  },
  setTarget: function (e) {
    var targetNode = this.findTargetNode(e.target);

    if (!targetNode) {
      this.setState(this.states.idle);
      return false;
    } // scrollContainer may be explicitly set via options, otherwise search upwards for a parent with an overflow-y property
    // fallback to document.scrollingElement (or documentElement on IE), and do not use document.body


    var scrollContainer = this.options.scrollContainer;

    if (!scrollContainer) {
      var top = document.scrollingElement || document.documentElement;
      scrollContainer = targetNode.parentNode;

      while (scrollContainer) {
        if (scrollContainer == top) break;
        if (scrollContainer != document.body && scrollContainer.scrollHeight - scrollContainer.clientHeight > 10 && window.getComputedStyle(scrollContainer)['overflow-y'] != 'visible') break;
        scrollContainer = scrollContainer.parentNode;
      }

      scrollContainer = scrollContainer || top;
    }

    if (this.target !== null && this.target.node !== targetNode) {
      this.animateToZeroHidden(undefined, this.target);
    }

    this.target = {
      originalTarget: e.target,
      node: targetNode,
      scrollContainer: scrollContainer,
      origScrollTop: scrollContainer.scrollTop,
      origScrollHeight: scrollContainer.scrollHeight,
      baseTransform: getTransform(targetNode)
    };
    return true;
  },
  startAtPosition: function (pos) {
    this.startPosition = this.previousPosition = this.latestPosition = pos;
    this.setState(this.states.undecided);
  },
  updatePosition: function (e, pos) {
    if (this.target == null) {
      return;
    }

    this.latestPosition = pos;

    if (this.state.onMove) {
      if (this.state.onMove.call(this) === false) {
        e.preventDefault();
      }
    } // sample latestPosition 100ms for velocity


    if (this.latestPosition.time - this.previousPosition.time > 100) {
      this.previousPosition = this.latestPosition;
    }
  },
  onMouseMove: function (e) {
    e.stopPropagation();
    this.updatePosition(e, {
      x: e.clientX,
      y: e.clientY,
      time: e.timeStamp
    });
  },
  onTouchMove: function (e) {
    e.stopPropagation();
    this.updatePosition(e, {
      x: e.touches[0].clientX,
      y: e.touches[0].clientY,
      time: e.timeStamp
    }); // In Apple's touch model only the first move event after touchstart can prevent scrolling (and event.cancelable is broken)

    this.canPreventScrolling = false;
  },
  onMouseUp: function (e) {
    // e.stopPropagation();
    if (this.usingTouch || e.button !== 0) return;

    if (this.state.onEnd && false === this.state.onEnd.call(this)) {
      e.preventDefault();
    }
  },
  onTouchEnd: function (e) {
    // e.stopPropagation();
    if (e.touches.length > 1) {
      this.cancel();
    } else if (this.state.onEnd && false === this.state.onEnd.call(this)) {
      e.preventDefault();
    }
  },
  getTotalMovement: function () {
    var scrollOffset = this.target.scrollContainer.scrollTop - this.target.origScrollTop;
    return {
      x: this.latestPosition.x - this.startPosition.x,
      y: this.latestPosition.y - this.startPosition.y + scrollOffset,
      time: this.latestPosition.time - this.startPosition.time
    };
  },
  getTotalMovementAvarage: function (delta) {
    var scrollOffset = this.target.scrollContainer.scrollTop - this.target.origScrollTop;
    return {
      x: this.latestPosition.x - this.startPosition.x - delta,
      y: this.latestPosition.y - this.startPosition.y + scrollOffset,
      time: this.latestPosition.time - this.startPosition.time
    };
  },
  getAbsoluteMovement: function () {
    var move = this.getTotalMovement();
    return {
      x: Math.abs(move.x),
      y: Math.abs(move.y),
      time: move.time,
      directionX: move.x < 0 ? 'left' : 'right',
      directionY: move.y < 0 ? 'up' : 'down'
    };
  },
  getAbsoluteMovementAvarage: function (delta) {
    var move = this.getTotalMovementAvarage(delta);
    return {
      x: Math.abs(move.x),
      y: Math.abs(move.y),
      time: move.time,
      directionX: move.x < 0 ? 'left' : 'right',
      directionY: move.y < 0 ? 'up' : 'down'
    };
  },
  updateScrolling: function () {
    var triggerOffset = 40,
        offset = 0;
    var scrollable = this.target.scrollContainer,
        containerRect = scrollable.getBoundingClientRect(),
        targetRect = this.target.node.getBoundingClientRect(),
        bottomOffset = Math.min(containerRect.bottom, window.innerHeight) - targetRect.bottom,
        topOffset = targetRect.top - Math.max(containerRect.top, 0),
        maxScrollTop = this.target.origScrollHeight - Math.min(scrollable.clientHeight, window.innerHeight);

    if (bottomOffset < triggerOffset) {
      offset = Math.min(triggerOffset, triggerOffset - bottomOffset);
    } else if (topOffset < triggerOffset) {
      offset = Math.max(-triggerOffset, topOffset - triggerOffset);
    }

    scrollable.scrollTop = Math.max(0, Math.min(maxScrollTop, scrollable.scrollTop + offset));
  },
  dispatch: function (targetNode, eventName, detail) {
    var event = document.createEvent('CustomEvent');

    if (event && event.initCustomEvent) {
      event.initCustomEvent('slip:' + eventName, true, true, detail);
    } else {
      event = document.createEvent('Event');
      event.initEvent('slip:' + eventName, true, true);
      event.detail = detail;
    }

    return targetNode.dispatchEvent(event);
  },
  getSiblings: function (target) {
    var siblings = [];
    var tmp = target.node.nextSibling;

    while (tmp) {
      if (tmp.nodeType == 1) siblings.push({
        node: tmp,
        baseTransform: getTransform(tmp)
      });
      tmp = tmp.nextSibling;
    }

    return siblings;
  },
  animateToZero: function (callback, target) {
    // save, because this.target/container could change during animation
    target = target || this.target;
    var delta = 0;
    if (this.target.node.startPositionAverage != undefined && this.target.node.startPositionAverage > 0) delta = this.target.node.startPositionAverage;
    var move = this.getTotalMovementAvarage(delta);
    target.node.style[transitionJSPropertyName] = transformCSSPropertyName + ' 0.2s ease-out';
    target.node.style[transformJSPropertyName] = 'translate(0,0) ' + hwLayerMagicStyle;

    if (move.x > 0 && target.node.hiddenButtonRight !== undefined) {
      target.node.hiddenButtonRight.style[transitionJSPropertyName] = "all" + ' 0.2s ease-out';
      target.node.hiddenButtonRight.style[transformJSPropertyName] = 'translate(0,0) ' + hwLayerMagicStyle;
      target.node.hiddenButtonRight.style["width"] = 0;
      var tempElement = this.target.node.hiddenButtonRight.childNodes[0].childNodes[this.target.node.hiddenButtonRight.childNodes[0].childNodes.length - 1];

      if (tempElement !== undefined && tempElement.classList.contains("button-hidden-swipe-activeAll-width")) {
        tempElement.classList.remove("button-hidden-swipe-activeAll-width");
      }
    }

    setTimeout(function () {
      target.node.style[transitionJSPropertyName] = '';
      target.node.style[transformJSPropertyName] = '';

      if (move.x && target.node.hiddenButtonRight !== undefined) {
        target.node.hiddenButtonRight.style[transitionJSPropertyName] = '';
        target.node.hiddenButtonRight.style[transformJSPropertyName] = '';
      }

      if (callback) callback.call(this, target);
      target.node.startPositionAverage = 0;
    }.bind(this), 201);
  },
  animateToZeroHidden: function (callback, target) {
    // save, because this.target/container could change during animation
    target = target || this.target;
    var delta = 0;
    if (this.target.node.startPositionAverage != undefined && this.target.node.startPositionAverage > 0) delta = this.target.node.startPositionAverage;
    var move = this.getTotalMovementAvarage(delta);
    target.node.style[transitionJSPropertyName] = transformCSSPropertyName + ' 0.2s ease-out';
    target.node.style[transformJSPropertyName] = 'translate(0,0) ' + hwLayerMagicStyle;

    if (move.x > 0 && target.node.hiddenButtonRight !== undefined) {
      target.node.hiddenButtonRight.style[transitionJSPropertyName] = "all" + ' 0.2s ease-out';
      target.node.hiddenButtonRight.style[transformJSPropertyName] = 'translate(0,0) ' + hwLayerMagicStyle;
      target.node.hiddenButtonRight.style["width"] = 0;
      var tempElement = this.target.node.hiddenButtonRight.childNodes[0].childNodes[this.target.node.hiddenButtonRight.childNodes[0].childNodes.length - 1];

      if (tempElement !== undefined && tempElement.classList.contains("button-hidden-swipe-activeAll-width")) {
        tempElement.classList.remove("button-hidden-swipe-activeAll-width");
      }
    }

    setTimeout(function () {
      target.node.style[transitionJSPropertyName] = '';
      target.node.style[transformJSPropertyName] = '';

      if (move.x && target.node.hiddenButtonRight !== undefined) {
        target.node.hiddenButtonRight.style[transitionJSPropertyName] = '';
        target.node.hiddenButtonRight.style[transformJSPropertyName] = '';
      }

      if (callback) callback.call(this, target);
      target.node.startPositionAverage = 0;
    }.bind(this), 201);
  },
  animateToZero: function (callback, target) {
    // save, because this.target/container could change during animation
    target = target || this.target;
    target.node.style[transitionJSPropertyName] = transformCSSPropertyName + ' 0.1s ease-out';
    target.node.style[transformJSPropertyName] = 'translate(0,0) ' + hwLayerMagicStyle + target.baseTransform.value;
    setTimeout(function () {
      target.node.style[transitionJSPropertyName] = '';
      target.node.style[transformJSPropertyName] = target.baseTransform.original;
      if (callback) callback.call(this, target);
    }.bind(this), 101);
  },
  animateToAverage: function (callback, target) {
    // save, because this.target/container could change during animation
    target = target || this.target;
    var delta = 0;
    if (this.target.node.startPositionAverage != undefined && this.target.node.startPositionAverage > 0) delta = this.target.node.startPositionAverage;
    var move = this.getAbsoluteMovementAvarage(delta);

    if (move.x > 0 && target.node.hiddenButtonRight !== undefined) {
      var transformWidth = parseInt(target.node.hiddenButtonRight.childNodes[0].childNodes[0].childNodes[0].offsetWidth) * this.target.node.hiddenButtonRight.childNodes[0].childNodes.length;
      target.node.style[transitionJSPropertyName] = transformCSSPropertyName + ' 0.1s ease-in';
      target.node.style[transformJSPropertyName] = 'translate(' + -transformWidth + 'px,0) ' + hwLayerMagicStyle;
      target.node.hiddenButtonRight.style[transitionJSPropertyName] = 'all' + ' 0.1s ease-in';
      target.node.hiddenButtonRight.style[transformJSPropertyName] = 'translate(' + transformWidth + 'px,0) ' + hwLayerMagicStyle;
      target.node.hiddenButtonRight.style["width"] = transformWidth + "px";
      var tempElement = this.target.node.hiddenButtonRight.childNodes[0].childNodes[this.target.node.hiddenButtonRight.childNodes[0].childNodes.length - 1];

      if (tempElement !== undefined && tempElement.classList.contains("button-hidden-swipe-activeAll-width")) {
        tempElement.classList.remove("button-hidden-swipe-activeAll-width");
      }
    }

    setTimeout(function () {
      target.node.style[transitionJSPropertyName] = '';
      if (move.x > 0 && target.node.hiddenButtonRight !== undefined) target.node.hiddenButtonRight.style[transitionJSPropertyName] = '';
      if (callback) callback.call(this, target);
      target.node.startPositionAverage = transformWidth;
    }.bind(this), 101);
  },
  animateSwipe: function (callback) {
    var target = this.target;
    var siblings = this.getSiblings(target);
    var emptySpaceTransformStyle = 'translate(0,' + this.target.height + 'px) ' + hwLayerMagicStyle + ' '; // FIXME: animate with real velocity

    target.node.style[transitionJSPropertyName] = 'all 0.1s linear';
    target.node.style[transformJSPropertyName] = ' translate(' + (this.getTotalMovement().x > 0 ? '' : '-') + '100%,0) ' + hwLayerMagicStyle + target.baseTransform.value;
    setTimeout(function () {
      if (callback.call(this, target)) {
        siblings.forEach(function (o) {
          o.node.style[transitionJSPropertyName] = '';
          o.node.style[transformJSPropertyName] = emptySpaceTransformStyle + o.baseTransform.value;
        });
        setTimeout(function () {
          siblings.forEach(function (o) {
            o.node.style[transitionJSPropertyName] = transformCSSPropertyName + ' 0.1s ease-in-out';
            o.node.style[transformJSPropertyName] = 'translate(0,0) ' + hwLayerMagicStyle + o.baseTransform.value;
          });
          setTimeout(function () {
            siblings.forEach(function (o) {
              o.node.style[transitionJSPropertyName] = '';
              o.node.style[transformJSPropertyName] = o.baseTransform.original;
            });
          }, 101);
        }, 1);
      }
    }.bind(this), 101);
  }
};
};

moduleFactories["node_modules/pizo/js/component/ModuleView.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/ModuleView.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ModuleView = ModuleView;
exports.alignFormCss = alignFormCss;
exports.selectElement = selectElement;
exports.unit_Long = unit_Long;
exports.unit_Zone = unit_Zone;
exports.input_choicenumber = input_choicenumber;
exports.fakeInput = fakeInput;
exports.tableView = tableView;
exports.getDate = getDate;
exports.allowNumbersOnly = allowNumbersOnly;
exports.createAlias = createAlias;
exports.removeAccents = removeAccents;
exports.deleteQuestion = deleteQuestion;
exports.confirmQuestion = confirmQuestion;

var _Fcore = _interopRequireDefault(require("../dom/Fcore"));

require("../../css/ModuleView.css");

require("../../css/tablesort.css");

var _HashTable = require("../component/HashTable");

var _HashTableFilter = require("../component/HashTableFilter");

var _HashTableRange = require("../component/HashTableRange");

var _FormatFunction = require("./FormatFunction");

var _Svg = _interopRequireDefault(require("absol/src/HTML5/Svg"));

var _BrowserDetector = _interopRequireDefault(require("absol/src/Detector/BrowserDetector"));

var _slip = _interopRequireDefault(require("./slip.js"));


// import '../../css/CardDone.css';
// import TabView from 'absol-acomp/js/TabView';
_Svg.default.ShareInstance._;
_Svg.default.ShareInstance.$;

window.getTextSize = function getTextSize(text) {
  var svg = _Svg.default.ShareInstance._({
    tag: 'svg',
    style: {
      position: 'fixed',
      zIndex: '10000',
      top: 0,
      left: 0,
      background: 'gray'
    },
    child: {
      child: {
        tag: 'text',
        attr: {
          transform: 'rotate(45)',
          x: 0,
          y: 0
        },
        style: {
          fill: 'green'
        },
        child: {
          text: text
        }
      }
    }
  }).addTo(document.body);

  var text = _Svg.default.ShareInstance.$('g');

  var size = text.getBBox();
  svg.attr({
    width: size.width,
    height: size.height,
    viewBox: [size.x, size.y, size.width, size.height].join(' ')
  });
  return size;
};

var _ = _Fcore.default._;
var $ = _Fcore.default.$;
var traceOutBoundingClientRect = _Fcore.default.traceOutBoundingClientRect;

function ModuleView() {}

function alignFormCss(element, elementDynamic, GroupElement = []) {
  var maxColumn = [],
      k,
      maxWidth,
      longElement = 0,
      check = [],
      countRow = [];

  for (var i = 0; i < element.length; i++) {
    k = 0;

    if (check.includes(element[i])) {
      element.splice(i, 1);
      i--;
      continue;
    } else {
      check.push(element[i]);
    }

    for (var j = 0; j < element[i].childNodes.length; j++) {
      if (GroupElement[i] === j && GroupElement[i][0] === j) {
        longElement = GroupElement[i][1];
        maxWidth += element[i].childNodes[j].offsetWidth;
        longElement--;
        continue;
      } else {
        if (longElement > 0) {
          maxWidth += element[i].childNodes[j].offsetWidth;
          longElement--;
          continue;
        } else maxWidth = element[i].childNodes[j].offsetWidth;
      }

      if (maxWidth > maxColumn[k] || maxColumn[k] === undefined) {
        maxColumn[k] = element[i].childNodes[j].offsetWidth;
      }

      k++;
      maxWidth = 0;
    }
  }

  var resultcss = '';
  var value;
  var Dynamic = [];
  var fontSizeHtml = getDefaultFontSize()[1];

  for (var i = 0; i < element.length; i++) {
    countRow[i] = 0;
    Dynamic[i] = [];

    for (var j = 0; j < element[i].childNodes.length; j++) {
      if (elementDynamic !== j || Array.isArray(elementDynamic) && elementDynamic.includes(j)) {
        value = '';
        element[i].classList.forEach(function (result) {
          value += "." + result;
        });
        value += ' ';
        element[i].childNodes[j].classList.forEach(function (result) {
          value += "." + result;
        });
        var marginYes = 0;
        if (element[i].childNodes[j].tagName === "SPAN") marginYes = 10;
        var tempWidth = (maxColumn[j] + marginYes) / fontSizeHtml;
        var el = element[i].childNodes[j];
        var paddingLeft = window.getComputedStyle(el, null).getPropertyValue('padding-left');
        var paddingRight = window.getComputedStyle(el, null).getPropertyValue('padding-right');
        var padding = parseFloat(paddingLeft) + parseFloat(paddingRight);
        var border = window.getComputedStyle(el, null).getPropertyValue('border-width');
        border = parseFloat(border);
        value += '{\n';
        value += 'width: ' + (tempWidth - (padding + border + 1) / fontSizeHtml) + 'em; \n';
        value += '}\n';
        countRow[i] += tempWidth;
        resultcss += value;
      } else {
        Dynamic[i].push(j);
      }
    }
  }

  if (Dynamic.length !== 0) {
    Dynamic.forEach(function (result, index) {
      for (var i = 0; i < Dynamic[index].length; i++) {
        element[index].childNodes[Dynamic[index]];
        value = '';
        element[index].classList.forEach(function (result) {
          value += "." + result;
        });
        value += ' ';
        element[index].childNodes[Dynamic[index]].classList.forEach(function (result) {
          value += "." + result;
        });
        var el = element[index].childNodes[Dynamic[index]];
        var paddingLeft = window.getComputedStyle(el, null).getPropertyValue('padding-left');
        var paddingRight = window.getComputedStyle(el, null).getPropertyValue('padding-right');
        var border = window.getComputedStyle(el, null).getPropertyValue('border-width');
        border = parseFloat(border);
        var padding = parseFloat(paddingLeft) + parseFloat(paddingRight);
        value += '{\n';
        value += 'width: calc(' + 100 / Dynamic[index].length + '% - ' + (countRow[index] / Dynamic[index].length + (padding + border + 1) / fontSizeHtml) + 'em); \n';
        value += '}\n';
        resultcss += value;
      }
    });
  }

  var blob = new Blob([resultcss], {
    type: 'text/css;charset=utf-8'
  });
  var link = document.createElement('a');
  link.href = window.URL.createObjectURL(blob);
  link.download = "style_alignFormCss.css";
  link.click();
}

function getDefaultFontSize(pa) {
  pa = pa || document.body;
  var who = document.createElement('div');
  who.style.cssText = 'display:inline-block; padding:0; line-height:1; position:absolute; visibility:hidden; font-size:1em';
  who.appendChild(document.createTextNode('M'));
  pa.appendChild(who);
  var fs = [who.offsetWidth, who.offsetHeight];
  pa.removeChild(who);
  return fs;
}

function selectElement(nameClass, elementDynamic) {
  var ElementStack = [],
      GroupElement = [];
  window.addEventListener("click", function (event) {
    var elementTarget = event.target;

    while (elementTarget.classList !== undefined && !elementTarget.classList.contains(nameClass)) elementTarget = elementTarget.parentNode;

    if (elementTarget !== undefined && elementTarget !== document) {
      ElementStack.push(elementTarget);
    }
  });
  window.addEventListener("keydown", function (event) {
    if (event.keyCode === 27) {
      alignFormCss(ElementStack, elementDynamic, GroupElement);
    }
  });
}

function unit_Long(functionX = function () {}) {
  return _({
    tag: "selectmenu",
    class: "pizo-new-realty-dectruct-content-area-unit",
    on: {
      change: functionX
    },
    props: {
      items: [{
        text: "m",
        value: 1
      }, {
        text: "km",
        value: 1000
      }, {
        text: "in",
        value: 0.0254
      }]
    }
  });
}

function unit_Zone(functionX = function () {}) {
  return _({
    tag: "selectmenu",
    class: "pizo-new-realty-dectruct-content-area-unit-size",
    on: {
      change: functionX
    },
    props: {
      items: [{
        text: "m²",
        value: 1
      }, {
        text: "km²",
        value: 1000000
      }, {
        text: "hecta",
        value: 10000
      }]
    }
  });
}

function input_choicenumber(point, callback) {
  var input = absol._({
    tag: "input",
    class: "quantumWizTextinputPaperinputInput",
    props: {
      type: "number",
      autocomplete: "off",
      min: 0,
      max: 999999,
      step: 1,
      dir: "auto",
      badinput: false,
      value: point
    },
    on: {
      focus: function () {
        return function (input) {
          input.classList.add("isFocused");
        }(input);
      },
      blur: function () {
        return function (input) {
          input.classList.remove("isFocused");
        }(input);
      },
      input: function () {
        return function () {
          input.requestUpdateSize();
          if (callback !== undefined) callback(input.value);
        }();
      }
    }
  });

  input.getValue = function () {
    return input.value;
  };

  input.requestUpdateSize = function () {
    input.style.width = fakeInput(input.value, 14) + 15 + "px";
  };

  input.requestUpdateSize();
  return input;
}

function fakeInput(text, size) {
  var temp = document.getElementsByClassName("fake-text");
  if (temp.length === 0) document.body.appendChild(absol._({
    tag: "span",
    class: "fake-text",
    props: {
      innerHTML: text
    }
  }));else temp[0].innerHTML = text + "-";

  if (size !== undefined) {
    temp[0].style.fontSize = size + "px";
  } else temp[0].style.fontSize = "1.7857em";

  return temp[0].offsetWidth;
}

function moveAt(clone, pageX, pageY, shiftX, shiftY, trigger, functionCheckZone, bg, result) {
  var y = pageY - result.getBoundingClientRect().top;
  y -= shiftY;
  clone.style.top = y + 'px';
  var x = pageX - result.getBoundingClientRect().left;
  x -= shiftX;
  clone.style.left = x + 'px';
}

function onMouseMove(clone, event, shiftX, shiftY, trigger, functionCheckZone, bg, parent) {
  event.preventDefault();
  moveAt(clone, event.pageX, event.pageY, shiftX, shiftY, trigger, functionCheckZone, bg, parent);
}

function onMouseMoveFix(clone, event, shiftY, result) {
  event.preventDefault();
  moveAtFix(clone, event.pageY, shiftY, result);
}

function moveAtFix(clone, pageY, shiftY, result) {
  var y = pageY - result.getBoundingClientRect().top;
  y -= shiftY;
  var height = result.clientHeight;
  var tempx = height - 3 * clone.clientHeight / 4;
  var top = clone.clientHeight / 2;

  if (result.tagName !== "DIV") {
    height += result.getHeightChild();
    tempx = height;
  } else {
    if (result.headerTable.offsetHeight === 0) {
      top = -clone.clientHeight / 4;
    }
  }

  if (y > tempx) {
    y = tempx;
    return;
  }

  if (y < top) {
    y = top;
    return;
  }

  clone.style.top = y + 'px';
}

function moveElement(event, me, result, index) {
  var scrollParent = result.realTable.parentNode;

  while (scrollParent) {
    var overflowStyle = window.getComputedStyle(scrollParent)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'scroll' || scrollParent.tagName === 'HTML') && (scrollParent.clientHeight < scrollParent.scrollHeight || scrollParent.clientWidth < scrollParent.scrollWidth)) break;
    scrollParent = scrollParent.parentElement;
  }

  if (scrollParent) scrollParent.addEventListener("scroll", function (event) {
    bg.isMove = false;
    outFocus(clone, trigger, functionCheckZone, bg, result);
  });
  var trigger;
  var height = 112;
  if (result.height !== undefined) height = result.height;
  var clone = result.cloneColumn(index);
  var bg = result.backGround(height, function () {
    if (bg.noAction !== true) result.deleteColumn(index);
  }, index);

  var functionCheckZone = function (event) {
    if (AABBYY(window.xMousePos, window.yMousePos, bg.getDeleteZone().getBoundingClientRect())) {
      if (!bg.classList.contains("focus-blast")) bg.classList.add("focus-blast");
    } else {
      if (bg.classList.contains("focus-blast")) bg.classList.remove("focus-blast");
    }

    var arrZone = bg.getZone();

    for (var i = 0; i < arrZone.length; i++) {
      var checkElement = arrZone[i];

      if (AABBYY(window.xMousePos, window.yMousePos, checkElement.getBoundingClientRect())) {
        if (!checkElement.classList.contains("focus-blast")) checkElement.classList.add("focus-blast");
      } else {
        if (checkElement.classList.contains("focus-blast")) checkElement.classList.remove("focus-blast");
      }
    }
  };

  window.addEventListener("mousemove", functionCheckZone);
  bg.isMove = true;
  result.appendChild(bg);
  bg.appendChild(clone);
  let shiftX = clone.clientWidth / 2 - 15;
  let shiftY = clone.clientHeight / 2;
  moveAt(clone, event.pageX, event.pageY, shiftX, shiftY, trigger, functionCheckZone, bg, result);
  window.addEventListener('mousemove', trigger = function (event) {
    onMouseMove(clone, event, shiftX, shiftY, trigger, functionCheckZone, bg, result);
  });

  window.onmouseup = function () {
    bg.isMove = false;
    outFocus(clone, trigger, functionCheckZone, bg, result);
  };
}

function moveElementFix(event, me, result, index) {
  var trigger;
  var clone = result.cloneRow(index);
  var bg = result.backGroundFix(index);
  var scrollParent = result.realTable.parentNode;

  while (scrollParent) {
    var overflowStyle = window.getComputedStyle(scrollParent)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'scroll' || scrollParent.tagName === 'HTML') && (scrollParent.clientHeight < scrollParent.scrollHeight || scrollParent.clientWidth < scrollParent.scrollWidth)) break;
    scrollParent = scrollParent.parentElement;
  }

  result.bodyTable.appendChild(bg);
  bg.appendChild(clone);

  var functionCheckZone = function (event) {
    var arrZone = bg.getZone();

    for (var i = 0; i < arrZone.length; i++) {
      var offset = clone.getBoundingClientRect();
      var centerX = offset.left + offset.width / 2; // [UPDATE] subtract to center

      var centerY = offset.top + offset.height / 2;
      var checkElement = arrZone[i];

      if (AAYY(centerX, centerY, checkElement.getBoundingClientRect())) {
        if (!checkElement.classList.contains("focus-blast")) {
          checkElement.classList.add("focus-blast");
          break;
        }
      } else {
        if (checkElement.classList.contains("focus-blast")) checkElement.classList.remove("focus-blast");
      }

      var removeList = document.getElementsByClassName("focus-blast")[0];
      if (removeList !== undefined) removeList.classList.remove("focus-blast");
    }
  };

  let shiftY = clone.clientHeight / 2;
  moveAtFix(clone, event.pageY, shiftY, result);
  if (scrollParent) scrollParent.addEventListener("scroll", function (event) {
    moveAtFix(clone, event.pageY, shiftY, result);
    bg.style.top = parseFloat(bg.style.realTop) - parseFloat(scrollParent.scrollTop) + "px";
  });
  window.addEventListener('mousemove', functionCheckZone);

  var trigger = function (event) {
    onMouseMoveFix(clone, event, shiftY, result);
  };

  var mouseUpFunction = function () {
    window.removeEventListener("mouseup", mouseUpFunction);
    var removeList = document.getElementsByClassName("focus-blast")[0];

    if (removeList !== undefined) {
      var row1 = removeList.row1;
      var row2 = removeList.row2;

      if (row1 === undefined && row2 === 0) {
        outFocus(clone, trigger, functionCheckZone, bg, result);
        return;
      }

      var element = me;

      while (element.tagName !== "TR" && element !== undefined) {
        element = element.parentNode;
      }

      if (element === removeList.elementReal) {
        outFocus(clone, trigger, functionCheckZone, bg, result);
        return;
      }

      result.bodyTable.insertBefore(element, removeList.elementReal);

      if (element.getElementChild !== undefined) {
        var elementChild = element.getElementChild();

        if (elementChild.length !== 0) {
          for (var i = 0; i < elementChild.length; i++) {
            result.bodyTable.insertBefore(elementChild[i], removeList.elementReal);
          }
        }
      }

      if (result.data.child !== undefined) {
        result.data.child = changeIndex(result.data.child, index - 1, row1);
      } else result.data = changeIndex(result.data, index - 1, row1);

      result.childrenNodes = changeIndex(result.childrenNodes, index - 1, row1);
      var k = 0;

      for (var i = 0; i < result.clone.length; i++) {
        var checkValue = array_insertBefore(result.clone[i], element.childNodes[k], row2);
        if (checkValue === false) continue;
        result.clone[i] = checkValue;
        k++;
      }

      if (result.checkSpan !== undefined) result.checkSpan = changeIndex(result.checkSpan, index - 1, row1);
    }

    outFocus(clone, trigger, functionCheckZone, bg, result);
  };

  window.addEventListener('mousemove', trigger);
  window.addEventListener("mouseup", mouseUpFunction);
}

function array_insertBefore(arr, data, new_index) {
  var old_index;

  for (var i = 0; i < arr.length; i++) {
    if (arr[i] === data) {
      old_index = i;
      break;
    }
  }

  if (old_index === undefined) return false; // for testing

  return arr_change(arr, data, old_index, new_index);
}

;

function arr_change(arr, data, old_index, new_index) {
  if (new_index === undefined) new_index = arr.length + 1;

  if (old_index > new_index) {
    arr.splice(new_index, 0, data);
    arr.splice(old_index + 1, 1);
  } else {
    arr.splice(new_index, 0, data);
    arr.splice(old_index, 1);
  }

  return arr;
}

function changeIndex(arr, old_index, new_index) {
  var data = arr.splice(old_index, 1)[0];
  if (old_index < new_index) arr.splice(new_index - 1, 0, data);else arr.splice(new_index, 0, data);
  return arr;
}

function AABBYY(x, y, bound) {
  if (bound.x === 0 && bound.y === 0 && bound.width === 0 && bound.height === 0) return true;
  return x >= bound.x && y >= bound.y && x <= bound.x + bound.width && y <= bound.y + bound.height;
}

function AAYY(x, y, bound) {
  if (bound.x === 0 && bound.y === 0 && bound.width === 0 && bound.height === 0) return true;
  return y >= bound.y && y <= bound.y + bound.height;
}

function outFocus(clone, trigger, functionCheckZone, bg, parent) {
  window.removeEventListener('mousemove', functionCheckZone);
  window.removeEventListener('mousemove', trigger);
  window.onmouseup = null;
  setTimeout(function () {
    bg.selfRemove();

    if (parent.isSaveTheme) {
      parent.saveTheme();
    }
  }, 20);
  clone.selfRemove();
  var event = new CustomEvent('dragdrop');
  parent.realTable.parentNode.dispatchEvent(event);
}

function captureMousePosition(event) {
  window.xMousePos = event.pageX;
  window.yMousePos = event.pageY;
}

function tableView(header = [], data = [], dragHorizontal = false, dragVertical = false, childIndex = 1, indexRow = 50) {
  var cell,
      row,
      check = [];
  var checkSpan = [];
  var headerTable;

  if (header !== undefined) {
    if (header.headerElement !== undefined) {
      headerTable = header.headerElement;
    } else headerTable = _({
      tag: "thead"
    });
  }

  var bodyTable = _({
    tag: "tbody"
  });

  var realTable = _({
    tag: "table",
    class: "sortTable",
    child: [headerTable, bodyTable]
  });

  var resolveAdd;
  var promiseAdd = new Promise(function (resolve, reject) {
    resolveAdd = resolve;
  });

  var result = _({
    tag: "div",
    class: "container-sortTable",
    child: [realTable, {
      tag: 'attachhook',
      on: {
        error: function () {
          resolveAdd();
        }
      }
    }]
  });

  data.checkVisiableCell = function (x, y) {
    if (typeof this[x][y] !== "object") return true;

    if (x > 0) {
      if (this[x - 1][y] === this[x][y]) return false;
    }

    if (y > 0) {
      if (this[x][y - 1] === this[x][y]) return false;
    }

    return true;
  };

  result.realTable = realTable;
  result.headerTable = headerTable;

  if (header.headerElement !== undefined) {
    result.headerElement = header.headerElement;
    delete header.headerElement;
  }

  result.bodyTable = bodyTable;
  Object.assign(result, tableView.prototype);
  result.check = check;

  if (header.isSaveTheme) {
    result.isSaveTheme = header.isSaveTheme;

    if ((0, _FormatFunction.getCookie)(result.isSaveTheme + "token_pizo_table_header" + window.userid) != undefined) {
      var last = JSON.parse((0, _FormatFunction.getCookie)(result.isSaveTheme + "token_pizo_table_header" + window.userid));

      for (var param in last) {
        if (typeof header[param] == 'object' && typeof header[param] == 'object') Object.assign(header[param], last[param]);
      }

      result.arrSortHeader = JSON.parse((0, _FormatFunction.getCookie)(result.isSaveTheme + "token_pizo_table_sort" + window.userid));
    }
  }

  if (header.attachScroll) {
    result.attachScroll = header.attachScroll;
  }

  result.header = header;
  result.data = data;
  result.dragVertical = dragVertical;
  result.dragHorizontal = dragHorizontal;
  result.isSwipeLeft = false;
  result.isSwipeRight = false;
  result.sortArray = [];
  result.indexPageSum = Math.ceil(result.data.length / indexRow);

  if (window.scrollEvent === undefined) {
    window.xMousePos = 0;
    window.yMousePos = 0;
    window.lastScrolledLeft = 0;
    window.lastScrolledTop = 0;
    document.addEventListener("mousemove", function (event) {
      window.scrollEvent = captureMousePosition(event);
    });
    var scrollParent = result;
    promiseAdd.then(function () {
      while (scrollParent) {
        var overflowStyle = window.getComputedStyle(scrollParent)['overflow'];
        if ((overflowStyle === 'auto' || overflowStyle === 'scroll' || scrollParent.tagName === 'HTML') && (scrollParent.clientHeight < scrollParent.scrollHeight || scrollParent.clientWidth < scrollParent.scrollWidth)) break;
        scrollParent = scrollParent.parentElement;
      }

      if (scrollParent) {
        var lastScrollTime = new Date().getTime();

        var functionScrollTemp = function (event) {
          var now = new Date().getTime();

          if (now - lastScrollTime > 300) {
            if (!result.isDescendantOf(scrollParent)) {
              scrollParent.removeEventListener("scroll", functionScrollTemp);
              return;
            }
          }

          lastScrollTime = new Date().getTime();

          if (result.lastScrolledLeft != scrollParent.scrollLeft) {
            window.xMousePos -= result.lastScrolledLeft;
            result.lastScrolledLeft = scrollParent.scrollLeft;
            window.xMousePos += result.lastScrolledLeft;
          }

          if (result.lastScrolledTop != scrollParent.scrollTop) {
            window.yMousePos -= result.lastScrolledTop;
            result.lastScrolledTop = scrollParent.scrollTop;
            window.yMousePos += result.lastScrolledTop;
          }
        };

        scrollParent.addEventListener("scroll", functionScrollTemp);
      }

      if (_BrowserDetector.default.isMobile || result.attachScroll === true) {
        var tempLimit = _({
          tag: "div",
          child: [{
            tag: "span",
            style: {
              padding: "10px",
              textAlign: "center",
              display: "block",
              fontSize: "16px"
            },
            props: {
              innerHTML: "Để tìm kiếm các phần tử cũ hơn vui lòng sử dung Tìm kiếm"
            }
          }]
        });

        tempLimit.style.display = "none";
        result.appendChild(tempLimit);
        if (scrollParent) scrollParent.addEventListener("scroll", function (event) {
          if (result.currentIndex > indexRow * 10 && result.currentIndex !== result.data.length) {
            if (tempLimit.style.display !== "block") tempLimit.style.display = "block";
            return;
          } else {
            if (tempLimit.style.display !== "none") tempLimit.style.display = "none";
          }

          if (result.currentIndex === result.data.length) return;
          result.indexPage = result.currentIndex / 10 + 1;

          if (this.scrollTop >= this.scrollHeight - this.offsetHeight) {
            if (result.getBodyTable !== undefined) {
              result.getBodyTable(result.data);

              if (result.bodyTable.listCheckBox !== undefined && result.bodyTable.listCheckBox.length > 0) {
                result.bodyTable.listCheckBox[0].update();
              }
            }
          }

          result.setUpSwipe();
        });
      }
    }.bind(this));
  }

  result.updatePagination = function (number = result.tempIndexRow, isRedraw = true) {
    if (_BrowserDetector.default.isMobile || this.attachScroll == true) {
      result.tempIndexRow = indexRow;

      if (isRedraw) {
        result.updateTable(undefined, undefined, undefined, undefined, undefined, false);
        if (scrollParent) scrollParent.emit("scroll");
      }
    } else {
      result.tempIndexRow = parseInt(number);

      if (result.paginationElement !== undefined) {
        if (isRedraw) {
          result.updateTable();
        }

        var pagination = result.pagination(result.tempIndexRow);
        result.paginationElement.parentNode.replaceChild(pagination, result.paginationElement);
      } else {
        var pagination = result.pagination(result.tempIndexRow);
        result.appendChild(pagination);
      }

      result.paginationElement = pagination;
    }
  };

  result.updatePagination(indexRow, false);
  result.clone = [];
  var k = 0;
  result.toUpperCase = header.toUpperCase == true ? true : false;
  result.toLowerCase = header.toLowerCase == true ? true : false;
  result.updateTableOnlyHeader();
  result.parentMargin = 0;
  result.childIndex = childIndex;
  result.childrenNodes = [];
  result.getBodyTable(data, undefined, true);
  result.checkSpan = checkSpan;

  if (dragVertical) {
    result.slip = new _slip.default(result.bodyTable);
    result.setUpSlip();
  }

  return result;
}

tableView.prototype.getVisiable = function () {
  return this.getVisiableChild(this.data);
};

tableView.prototype.getVisiableChild = function (arr) {
  var result = [];

  for (var i = 0; i < arr.length; i++) {
    if (arr[i].visiable == true || arr[i].visiable == undefined) {
      var x = Object.assign({}, arr[i]);
      result.push(x);

      if (arr[i].child) {
        x.child = this.getVisiableChild(arr[i].child);
      }
    }
  }

  return result;
};

tableView.prototype.updateTableHeader = function () {
  this.updateTableOnlyHeader();

  if (this.isSaveTheme) {
    this.saveTheme();
  }

  if (this.isInputHeader) {
    this.addInputSearchHeader();
  }

  this.updateTable();
};

tableView.prototype.updateTableOnlyHeader = function () {
  var headerElement = this.headerElement;
  var header = this.header;
  var result = this;
  var check = this.check;
  var cell, row;
  row = _({
    tag: "tr"
  });
  var k = 0;
  result.clone = [];

  if (this.arrSortHeader) {
    for (var i = 0; i < header.length; i++) check[i] = "hidden";

    for (var i = 0; i < this.arrSortHeader.length; i++) {
      if (header[this.arrSortHeader[i]].hidden === false || header[this.arrSortHeader[i]].hidden === undefined) {
        check[this.arrSortHeader[i]] = undefined;
        result.clone[k] = [];
        if (headerElement) cell = result.getCellHeader(header[this.arrSortHeader[i]], this.arrSortHeader[i], $('th#' + this.arrSortHeader[i], this));else {
          cell = result.getCellHeader(header[this.arrSortHeader[i]], this.arrSortHeader[i]);
          row.addChild(cell);
        }
        result.clone[k++].push(cell);
      } else check[this.arrSortHeader[i]] = "hidden";
    }
  } else for (var i = 0; i < header.length; i++) {
    if (header[i].hidden === false || header[i].hidden === undefined) {
      check[i] = undefined;
      result.clone[k] = [];
      if (headerElement) cell = result.getCellHeader(header[i], i, $('th#' + i, this));else {
        cell = result.getCellHeader(header[i], i);
        row.addChild(cell);
      }
      result.clone[k++].push(cell);
    } else check[i] = "hidden";
  }

  if (headerElement == undefined) {
    if (this.headerTable.childNodes[0]) this.headerTable.replaceChild(row, this.headerTable.childNodes[0]);else this.headerTable.appendChild(row);
  }
};

tableView.prototype.getElementNext = function (element) {
  if (element.childrenNodes.length > 0) {
    return this.getElementNext(element.childrenNodes[element.childrenNodes.length - 1]);
  }

  return element.nextSibling;
};

tableView.prototype.getElementNextVisiale = function (element) {
  element = element.nextSibling;
  if (element) while (element.nextSibling && element.nextSibling.classList.contains("displayNone")) {
    element = element.nextSibling;
  }
  return element;
};

tableView.prototype.getElementPrevVisiale = function (element) {
  element = element.previousSibling;
  if (element) while (element.previousSibling && element.previousSibling.classList.contains("displayNone")) {
    element = element.previousSibling;
  }
  return element;
};

tableView.prototype.setUpSwipe = function (isSwipeLeft, isSwipeRight) {
  setTimeout(function () {
    if (isSwipeLeft !== undefined) {
      this.isSwipeLeft = isSwipeLeft;
    }

    if (this.isSwipeLeft !== undefined) {
      for (var i = 0; i < this.bodyTable.childNodes.length; i++) {
        if (this.bodyTable.childNodes[i].hiddenButtonLeft !== undefined) continue;

        var hiddenButton = _({
          tag: "div",
          class: "button-hidden-swipe-container-left",
          child: [{
            tag: "div",
            class: "button-hidden-swipe-calcWidth"
          }]
        });

        for (var j = 0; j < this.isSwipeLeft.length; j++) {
          this.bodyTable.childNodes[i].appendChild(hiddenButton);
          var icon;

          if (typeof this.isSwipeLeft[j].icon == "string") {
            icon = _({
              tag: "i",
              class: ["material-icons", "button-hidden-swipe-icon"],
              style: this.isSwipeLeft[j].iconStyle,
              props: {
                innerHTML: this.isSwipeLeft[j].icon
              }
            });
          } else icon = this.isSwipeRight[j].icon.cloneNode(true);

          var tempElement = _({
            tag: "div",
            class: "button-hidden-swipe",
            on: {
              click: function (index, indexEvent, e) {
                if (this.isSwipeLeft[indexEvent].event !== undefined) {
                  var me = this.bodyTable.childNodes[index];
                  var index = me.originalIndex;
                  var parent = me.getParentNode();
                  this.isSwipeLeft[indexEvent].event(e, me, index, me.data, me, parent);
                }
              }.bind(this, i, j)
            },
            style: {
              width: 1 / this.isSwipeLeft.length * 100 + "%",
              backgroundColor: this.isSwipeLeft[j].background,
              maxWidth: this.bodyTable.childNodes[i].offsetHeight * 1.2 + "px",
              zIndex: j
            },
            child: [{
              tag: "div",
              class: "button-hidden-swipe-detail",
              style: {
                width: this.bodyTable.childNodes[i].offsetHeight + "px",
                height: this.bodyTable.childNodes[i].offsetHeight + "px"
              },
              child: [icon]
            }]
          });

          if (!(this.isSwipeLeft[j].text == "" || this.isSwipeLeft[j].text == undefined)) {
            tempElement.childNodes[0].appendChild(_({
              tag: "span",
              class: "button-hidden-swipe-text",
              style: {
                color: this.isSwipeLeft[j].textcolor
              },
              props: {
                innerHTML: this.isSwipeLeft[j].text
              }
            }));
          }

          if (j == this.isSwipeLeft.length - 1) tempElement.classList.add("button-hidden-swipe-activeAll");
          hiddenButton.childNodes[0].appendChild(tempElement);
        }

        this.bodyTable.childNodes[i].hiddenButtonLeft = hiddenButton;
      }
    }

    if (isSwipeRight !== undefined) {
      this.isSwipeRight = isSwipeRight;
    }

    if (this.isSwipeRight !== undefined) {
      for (var i = 0; i < this.bodyTable.childNodes.length; i++) {
        if (this.bodyTable.childNodes[i].hiddenButtonRight !== undefined) continue;

        var hiddenButton = _({
          tag: "div",
          class: "button-hidden-swipe-container-right",
          child: [{
            tag: "div",
            class: "button-hidden-swipe-calcWidth"
          }]
        });

        for (var j = 0; j < this.isSwipeRight.length; j++) {
          this.bodyTable.childNodes[i].appendChild(hiddenButton);
          var icon;

          if (typeof this.isSwipeRight[j].icon == "string") {
            icon = _({
              tag: "i",
              class: ["material-icons", "button-hidden-swipe-icon"],
              style: this.isSwipeRight[j].iconStyle,
              props: {
                innerHTML: this.isSwipeRight[j].icon
              }
            });
          } else icon = this.isSwipeRight[j].icon.cloneNode(true);

          var tempElement = _({
            tag: "div",
            class: "button-hidden-swipe",
            on: {
              click: function (index, indexEvent, e) {
                if (this.isSwipeRight[indexEvent].event !== undefined) {
                  var me = this.bodyTable.childNodes[index];
                  var index = me.originalIndex;
                  var parent = me.getParentNode();
                  this.isSwipeRight[indexEvent].event(e, me, index, me.data, me, parent);
                }
              }.bind(this, i, j)
            },
            style: {
              width: 1 / this.isSwipeRight.length * 100 + "%",
              backgroundColor: this.isSwipeRight[j].background,
              maxWidth: this.bodyTable.childNodes[i].offsetWidth * 3 / 4 / this.isSwipeRight.length + "px",
              zIndex: j
            },
            child: [{
              tag: "div",
              class: "button-hidden-swipe-detail",
              child: [icon]
            }]
          });

          if (!(this.isSwipeRight[j].text == "" || this.isSwipeRight[j].text == undefined)) {
            tempElement.childNodes[0].appendChild(_({
              tag: "span",
              class: "button-hidden-swipe-text",
              style: {
                color: this.isSwipeRight[j].textcolor
              },
              props: {
                innerHTML: this.isSwipeRight[j].text
              }
            }));
          }

          if (j == this.isSwipeRight.length - 1) tempElement.classList.add("button-hidden-swipe-activeAll");
          hiddenButton.childNodes[0].appendChild(tempElement);
        }

        this.bodyTable.childNodes[i].hiddenButtonRight = hiddenButton;
        setTimeout(function (hiddenButton) {
          var container;
          var max = 0;

          for (var i = 0; i < hiddenButton.childNodes[0].childNodes.length; i++) {
            container = hiddenButton.childNodes[0].childNodes[i].childNodes[0];
            if (max < container.offsetWidth) max = container.offsetWidth;
          }

          for (var i = 0; i < hiddenButton.childNodes[0].childNodes.length; i++) {
            container = hiddenButton.childNodes[0].childNodes[i].childNodes[0];
            container.style.minWidth = max + "px";
          }
        }.bind(this, hiddenButton), 80);
      }
    }

    if (this.isSwipeLeft || this.isSwipeRight) {
      this.realTable.style.overflow = "hidden";
    }
  }.bind(this), 80);
};

tableView.prototype.addEvent = function () {};

tableView.prototype.swipeCompleteLeft = function (e, me, index, data, row, parent) {
  parent.exactlyDeleteRow(index);
};

tableView.prototype.swipeCompleteRight = function (e, me, index, data, row, parent) {
  parent.exactlyDeleteRow(index);
};

tableView.prototype.swipeCancel = function () {};

tableView.prototype.setUpSlip = function () {
  var self = this;
  this.bodyTable.addEventListener('slip:reorder', function (e) {
    var index = e.detail.originalIndex;
    var spliceIndex = e.detail.spliceIndex;
    self.changeRowIndex(index, spliceIndex);
  }, false);
  if (this.bodyTable.addEventComplete == true) return;
  this.bodyTable.addEventListener('slip:beforewait', function (e) {
    if (e.target.className.indexOf !== undefined && e.target.className.indexOf('drag-icon-button') > -1) e.preventDefault();
  }, false);
  this.bodyTable.addEventListener('slip:beforeswipe', function (e) {
    var startPoint = e.target;

    while (startPoint != null && startPoint.tagName != "TR") startPoint = startPoint.parentNode;

    startPoint = startPoint.startPositionAverage;
    if (self.isSwipeRight === false && e.detail.directionX === "left" && !(startPoint > 0)) e.preventDefault();
    if (self.isSwipeLeft === false && e.detail.directionX === "right" && !(startPoint > 0)) e.preventDefault(); // else if(!startPoint>0)
    // this.slip.animateToZero();
  }.bind(this), false);
  this.bodyTable.addEventListener('slip:cancelswipe', function (e) {
    self.swipeCancel();
  }, false);
  this.bodyTable.addEventListener('slip:swipe', function (e) {
    // functionClick(event, this, index, row.data, row, result);
    var index = e.detail.originalIndex;
    var me = self.bodyTable.childNodes[index];
    var parent = me.getParentNode(); // var tempIndex = index;

    index = parent.childrenNodes.indexOf(me);
    if (e.detail.direction === "left") self.swipeCompleteLeft(e, me, index, me.data, me, parent);
    if (e.detail.direction === "right") self.swipeCompleteRight(e, me, index, me.data, me, parent);
  }, false);
  this.bodyTable.addEventComplete = true;
};

tableView.prototype.changeRowIndex = function (index, spliceIndex) {
  var me = this.bodyTable.childNodes[index];
  var self = me.getParentNode();
  var elementReal = self.childrenNodes[spliceIndex];
  var tempIndex, tempSpliceIndex;
  var element = me;
  if (elementReal === undefined) elementReal = self.getElementNext(self.childrenNodes[self.childrenNodes.length - 1]);

  if (elementReal != null) {
    this.bodyTable.insertBefore(element, elementReal);
  } else {
    this.bodyTable.appendChild(element);
  }

  if (element.classList.contains("more-child")) {
    element.classList.remove("more-child");
  }

  if (element.getElementChild !== undefined) {
    var elementChild = element.getElementChild();

    if (elementChild.length !== 0) {
      for (var i = 0; i < elementChild.length; i++) {
        if (elementReal !== null) {
          this.bodyTable.insertBefore(elementChild[i], elementReal);
        } else {
          this.bodyTable.appendChild(elementChild[i]);
        }
      }
    }
  }

  var result = self;
  tempIndex = index;
  tempSpliceIndex = spliceIndex;
  index = self.childrenNodes.indexOf(element);

  if (result.tagName === "DIV") {
    result.data = changeIndex(result.data, index, spliceIndex);
  } else {
    result.data.child = changeIndex(result.data.child, index, spliceIndex);
  }

  result.childrenNodes = changeIndex(result.childrenNodes, index, spliceIndex);
  var k = 0;

  for (var i = 0; i < result.clone.length; i++) {
    var checkValue = array_insertBefore(result.clone[i], element.childNodes[k], spliceIndex + 1);
    if (checkValue === false) continue;
    result.clone[i] = checkValue;
    k++;
  }

  if (result.checkSpan !== undefined) result.checkSpan = changeIndex(result.checkSpan, index, spliceIndex);
  var event = new CustomEvent('dragdrop', {
    bubbles: true,
    detail: {
      event: event,
      me: me,
      index: tempIndex,
      spliceIndex: tempSpliceIndex,
      parent: self,
      dataSpliceIndex: spliceIndex,
      dataIndex: index,
      afterIndex: self.childrenNodes.indexOf(element)
    }
  });
  self.dispatchEvent(event);
};

tableView.prototype.saveTheme = function () {
  (0, _FormatFunction.setCookie)(this.isSaveTheme + "token_pizo_table_header" + window.userid, JSON.stringify(this.header), 3);
  var arr = [];

  for (var i = 0; i < this.clone.length; i++) {
    arr.push(this.clone[i][0].id);
  }

  this.arrSortHeader = arr;
  (0, _FormatFunction.setCookie)(this.isSaveTheme + "token_pizo_table_sort" + window.userid, JSON.stringify(arr), 3);
};

tableView.prototype.getCellHeader = function (header, i, cellTemp) {
  var value, style, classList, dragElement, cell, bonus;
  var result = this;
  var dragHorizontal = result.dragHorizontal;
  var dragVertical = result.dragVertical;
  var check = result.check;
  var toUpperCase = result.toUpperCase;
  var toLowerCase = result.toLowerCase;
  var functionClickSort;

  if (header.value === undefined) {
    if (typeof header === "object") value = "";else value = header;
  } else value = header.value;

  if (toUpperCase) value = value.toUpperCase();
  if (toLowerCase) value = value.toLowerCase();
  var functionClick = undefined;

  switch (header.type) {
    case "check":
      check[i] = "check";
      bonus = _({
        tag: "checkboxbutton",
        class: "pizo-checkbox",
        style: {
          display: "flex",
          flexGrow: 2
        },
        on: {
          change: function (event) {
            for (var j = 1; j < result.bodyTable.listCheckBox.length; j++) {
              result.bodyTable.listCheckBox[j].update(this.checked);
            }
          }
        }
      });

      bonus.update = function () {
        for (var j = 1; j < result.bodyTable.listCheckBox.length; j++) {
          if (result.bodyTable.listCheckBox[j].checked === false) {
            result.bodyTable.listCheckBox[0].checked = false;
            return;
          }
        }

        result.bodyTable.listCheckBox[0].checked = true;
      };

      result.bodyTable.listCheckBox = [bonus];
      break;

    case "increase":
      check[i] = "increase";
      break;

    case "dragzone":
      if (dragVertical) check[i] = "dragzone";else {
        check[i] = "hidden";
        return;
      }
      break;

    case "detail":
      check[i] = "detail";
      var icon = "more";
      if (header.icon !== undefined) icon = header.icon;
      bonus = _({
        tag: "i",
        class: "material-icons",
        style: {
          fontSize: "1.4em",
          cursor: "pointer",
          verticalAlign: "bottom"
        },
        props: {
          innerHTML: icon
        },
        on: {
          click: function () {
            document.body.appendChild(result.modalChoice());
          }
        }
      });
      break;
  }

  if (header.sort === true || header.sort === undefined) {
    functionClickSort = function (event, me, index, dataIndex, row, result) {
      var last_sort = document.getElementsByClassName("downgrade");
      last_sort = last_sort[0];
      me = me.parentNode;

      if (last_sort !== me && last_sort !== undefined) {
        last_sort.classList.remove("downgrade");
      }

      var last_sort = document.getElementsByClassName("upgrade");
      last_sort = last_sort[0];

      if (last_sort !== me && last_sort !== undefined) {
        last_sort.classList.remove("upgrade");
      }

      if (!me.classList.contains("downgrade")) {
        sortArray(result.data, index);
        me.classList.add("downgrade");
        if (me.classList.contains("upgrade")) me.classList.remove("upgrade");
      } else {
        sortArray(result.data, index, false);
        me.classList.add("upgrade");
        if (me.classList.contains("downgrade")) me.classList.remove("downgrade");
      }

      var event = new CustomEvent('sort', {
        bubbles: true,
        detail: {
          event: event,
          me: me,
          index: index,
          dataIndex: dataIndex,
          row: row,
          result: result
        }
      });
      result.dispatchEvent(event);
      if (result.paginationElement !== undefined && result.paginationElement.noneValue !== true) result.paginationElement.reActive();else result.updateTable();
    };
  }

  if (header.functionClick !== undefined) functionClick = header.functionClick;
  style = {};
  if (header.style !== undefined) style = header.style;
  classList = [];
  if (header.classList !== undefined) classList = header.classList;
  dragElement = true;
  if (header.dragElement !== undefined && header.dragElement === false) dragElement = false;

  var container = _({
    tag: "div",
    class: "container-header"
  });

  var on = {
    click: function (index, functionClick) {
      return function (event) {
        // event.preventDefault();
        if (functionClick !== undefined) {
          var row = cell.parentNode;
          functionClick(event, this, index, row.data, row, result);
        }
      };
    }(i, functionClick),
    dragstart: dragHorizontal && dragElement ? function () {
      return false;
    } : undefined
  };
  var mousedown = dragHorizontal && dragElement ? function (index) {
    return function (event) {
      // event.preventDefault();
      var finalIndex;

      for (var i = 0; i < result.clone.length; i++) {
        if (result.clone[i][0].id == index) {
          finalIndex = i;
          break;
        }
      }

      this.hold = false;
      var dom = this;
      this.default = event;
      this.timeoutID = setTimeout(function () {
        dom.hold = true;
        moveElement(event, dom, result, finalIndex);
      }, 200);
    };
  }(i) : undefined;

  var mouseup = function () {
    if (this.hold === false) {
      this.hold = true; // this.click();

      clearTimeout(this.timeoutID);
    }
  };

  var mousemove = dragHorizontal && dragElement ? function (index) {
    return function (event) {
      if (this.hold === false) {
        var finalIndex;

        for (var i = 0; i < result.clone.length; i++) {
          if (result.clone[i][0].id == index) {
            finalIndex = i;
            break;
          }
        }

        this.hold = false;
        var deltaX = this.default.clientX - event.clientX,
            deltaY = this.default.clientY - event.clientY;

        if (Math.abs(deltaX) + Math.abs(deltaY) > 10) {
          this.hold = true;
          moveElement(event, this, result, finalIndex);
          clearTimeout(this.timeoutID);
        }
      }
    };
  }(i) : undefined;

  if (_BrowserDetector.default.isMobile) {
    on["touchstart"] = mousedown;
    on["touchend"] = mouseup;
    on["touchmove"] = mousemove;
  } else {
    on["mousedown"] = mousedown;
    on["mouseup"] = mouseup;
    on["mousemove"] = mousemove;
  }

  cell = _({
    tag: "th",
    attr: {
      role: 'columnheader'
    },
    style: style,
    class: classList,
    child: [container],
    props: {
      id: i
    },
    on: on
  });
  cell.data = header;
  if (functionClick !== undefined) cell.style.cursor = "pointer";

  var childUpDown = _({
    tag: "div",
    class: "sort-container",
    on: {
      click: function (index, functionClickSort) {
        return function (event) {
          // event.preventDefault();
          if (functionClickSort !== undefined) {
            var row = cell.parentNode;
            functionClickSort(event, this, index, row.data, row, result);
          }
        };
      }(i, functionClickSort)
    },
    child: [{
      tag: "sort-up",
      class: ["arrow_up"]
    }, {
      tag: "sort-down",
      class: ["arrow_down"]
    }]
  });

  result.sortArray[i] = childUpDown;

  result.exactlySort = function () {
    childUpDown.click();
  };

  if (header.sort === true) {
    cell.classList.add("has-sort");
  }

  if (header.element === undefined) {
    container.addChild(_({
      tag: "span",
      props: {
        innerHTML: value
      }
    }));
  } else {
    container.addChild(_(header.element)); // container.appendChild(data[i][j].element);
  }

  if (bonus !== undefined) {
    container.addChild(bonus);
    bonus = undefined;
  }

  container.addChild(childUpDown);
  cell.container = container;

  if (cellTemp) {
    cellTemp.parentNode.replaceChild(cell, cellTemp);
  }

  return cell;
};

tableView.prototype.modalChoice = function () {
  var self = this;

  var tempDiv = _({
    tag: "div",
    class: "tableview-choice-container-content"
  });

  var functionESC;

  var modal = _({
    tag: "modal",
    class: "tableview-choice-container",
    child: [{
      tag: "div",
      class: "tableview-choice-container-tab",
      child: [{
        tag: "span",
        class: "tableview-choice-container-tab-label",
        props: {
          innerHTML: "Chọn thông tin hiển thị"
        }
      }, {
        tag: "button",
        class: "tableview-choice-container-tab-button",
        on: {
          click: function (event) {
            modal.applyChecked();
            self.updateTableHeader();
            modal.selfRemove();
            modal.removeEventListener("keydown", functionESC);
          }
        },
        props: {
          innerHTML: "Xong"
        }
      }]
    }, tempDiv],
    on: {
      click: function (event) {
        if (event.target.classList.contains("tableview-choice-container") == true) {
          modal.selfRemove();
          modal.removeEventListener("keydown", functionESC);
        }
      }
    }
  });

  functionESC = function (event) {
    if (event.keyCode == 27) {
      modal.selfRemove();
      modal.removeEventListener("keydown", functionESC);
    }
  };

  var arrCheckBox = [];
  self.addEventListener("keydown", functionESC);
  var checked, value;

  for (var i = 0; i < self.header.length; i++) {
    if (self.header[i].disabled == true) continue;
    if (self.header[i].hidden == true) checked = false;else checked = true;
    if (self.header[i].value !== undefined) value = self.header[i].value;else if (typeof self.header[i] === "string") value = self.header[i];else value = "";

    var checkboxTemp = _({
      tag: "checkbox",
      props: {
        checked: checked,
        text: value
      }
    });

    checkboxTemp.data = i;
    tempDiv.addChild(checkboxTemp);
    arrCheckBox.push(checkboxTemp);
  }

  if (this.isSaveTheme) {
    this.saveTheme();
  }

  modal.applyChecked = function () {
    for (var i = 0; i < arrCheckBox.length; i++) {
      if (arrCheckBox[i].data.disabled == true) continue;

      if (arrCheckBox[i].checked == false) {
        if (typeof self.header[arrCheckBox[i].data] == "object") {
          self.header[arrCheckBox[i].data].hidden = true;
        } else {
          self.header[arrCheckBox[i].data] = {
            value: self.header[arrCheckBox[i].data],
            hidden: true
          };
        }
      } else {
        if (typeof self.header[arrCheckBox[i].data] == "object") {
          self.header[arrCheckBox[i].data].hidden = undefined;

          if (self.arrSortHeader) {
            if (self.arrSortHeader.indexOf(arrCheckBox[i].data.toString()) == -1) {
              self.arrSortHeader.push(arrCheckBox[i].data);
            }
          }
        }
      }
    }
  };

  return modal;
};

tableView.prototype.sortTable = function (index, increase) {
  if (increase == -1) {}
};

tableView.prototype.checkLongRow = function (index) {
  var result = this;
  var delta = [];

  for (var i = 0; i < result.clone.length; i++) {
    delta[i] = 0;

    if (result.checkSpan !== undefined) {
      for (var j = 0; j < index; j++) {
        if (result.checkSpan[j] !== undefined) if (result.checkSpan[j][i] !== undefined) delta[i]++;
      }
    }
  }

  return delta;
};

tableView.prototype.checkLongColumn = function (row, column) {
  var result = this;
  var delta = 0;

  if (result.checkSpan !== undefined) {
    for (var j = 0; j < column; j++) {
      if (result.checkSpan[row] !== undefined) if (result.checkSpan[row][j] !== undefined) delta++;
    }
  }

  return delta;
};

tableView.prototype.setArrayFix = function (num, isLeft) {
  var x = setInterval(function () {
    if (this.clone[0][0].offsetWidth > 0) {
      clearInterval(x);
      var i;
      var length;

      if (isLeft) {
        i = 0;
        length = num;
      } else {
        i = this.clone.length - num;
        length = this.clone.length;
      }

      var isAdd = false;
      var arrWidth = [];

      for (; i < length; i++) {
        if (this.clone[i][0].tagName === "TH" && !this.clone[i][0].classList.contains("postionStickyCell")) {
          this.clone[i][0].classList.add("postionStickyCell");
          this.clone[i][0].style.zIndex = 6;
          arrWidth[i] = this.clone[i][0].offsetWidth + "px";
          isAdd = true;
        }
      }

      var ratio;

      if (i !== 0) {
        i = num;
        length = this.clone.length;
      } else {
        i = 0;
        length = num;
      }

      if (isAdd === true) {
        var sum = 0;
        var a = i;

        for (i = 0; i < length; i++) {
          if (this.clone[i][0].style.maxWidth === "") {
            sum += this.clone[i][0].offsetWidth;
          }
        }

        ratio = this.realTable.offsetWidth / sum;

        for (; a < length; a++) {
          if (this.clone[a][0].style.maxWidth === "") {
            arrWidth[a] = this.clone[a][0].offsetWidth * ratio + "px";
          } else {
            arrWidth[a] = this.clone[a][0].offsetWidth + "px";
          }
        }
      } else ratio = 1;

      if (isAdd === true) for (var i = 0; i < this.clone.length; i++) {
        this.clone[i][0].style.minWidth = arrWidth[i];
        this.clone[i][0].style.width = arrWidth[i];
        this.clone[i][0].style.maxWidth = arrWidth[i];

        if (this.clone[i][0].classList.contains("postionStickyCell")) {
          this.clone[i][0].style.left = this.clone[i][0].offsetLeft + "px";
        }
      }

      for (var i = 0; i < this.clone.length; i++) for (var j = 0; j < this.clone[i].length; j++) {
        if (this.clone[i][j].tagName !== "TH" && !this.clone[i][j].classList.contains("postionStickyCell") && this.clone[i][0].classList.contains("postionStickyCell")) {
          this.clone[i][j].classList.add("postionStickyCell");
          this.clone[i][j].style.left = this.clone[i][0].style.left;
        }

        if (this.clone[i][j].parentNode.childrenNodes && this.clone[i][j].parentNode.childrenNodes.length !== 0) this.clone[i][j].parentNode.setArrayFix(num, isLeft);
      }
    }
  }.bind(this), 10);
};

tableView.prototype.setArrayScroll = function (num, isLeft = true) {
  var self = this;
  if (isLeft) this.numArrayFixLeft = num;else this.numArrayFixRight = num;

  _('attachhook').once('error', function () {
    setTimeout(function () {
      self.setArrayFix(num, isLeft);
    }, 10);
  });
};

tableView.prototype.addInputSearchHeader = function () {
  this.isInputHeader = true;
  var header = this.header;
  var check = this.check;
  var clone = this.clone;
  var index;

  for (var i = 0; i < clone.length; i++) {
    index = clone[i][0].id;

    if (check[index] === undefined && header[index].disableInput !== true) {
      var input = _({
        tag: "input",
        class: "searchheader-input"
      });

      this.addInputSearch(input, index);
      clone[i][0].appendChild(_({
        tag: "div",
        class: "searchheader",
        child: [input]
      }));
    }
  }
};

tableView.prototype.addInputSearch = function (input, index) {
  var self = this;
  if (self.hashTable == undefined) self.hashTable = new _HashTable.HashTable(self.data);

  input.onchange = function (event, needUpdate = false) {
    if (this.updateTimeOut !== undefined) {
      clearTimeout(this._updateTimeOut);
      this.updateTimeOut = undefined;
    }

    this.updateTimeOut = setTimeout(function () {
      if (input.value !== input.lastInputSearch || needUpdate == true) {
        self.checkTableView(input.value, index);
        input.lastInputSearch = input.value;
        self.updatePagination();
      }
    }.bind(this), 500);
  };

  input.oninput = input.onchange;
  if (self.inputElement === undefined) self.inputElement = [];
  self.inputElement.push(input);
};

tableView.prototype.addFilter = function (input, index, functionChange) {
  var self = this;
  if (self.hashTableFilter == undefined) self.hashTableFilter = new _HashTableFilter.HashTableFilter(self.data);
  var functionFilter;

  if (functionChange === undefined) {
    functionFilter = function (event, needUpdate = false) {
      self.checkTableViewFilter(input.value, index);
      self.updatePagination();
    };
  } else {
    functionFilter = functionChange;
  }

  input.on("change", functionFilter);
  if (self.inputFilter === undefined) self.inputFilter = [];
  self.inputFilter.push([input, index]);
};

tableView.prototype.addRange = function (min, max, index, functionChange) {
  var self = this;
  var id = ("range_" + Math.random() + Math.random()).replace(/\./g, '');
  if (self.hashTableRange == undefined) self.hashTableRange = new _HashTableRange.HashTableRange(self.data, id, index);else self.hashTableRange.setUpKey(id, index);
  var functionRange;

  if (functionRange === undefined) {
    functionRange = function (event, needUpdate = false) {
      self.checkTableViewRange(min.value, max.value, id);
      self.updatePagination();
    };
  } else {
    functionRange = functionChange;
  }

  min.on("change", functionRange);
  max.on("change", functionRange);
};

tableView.prototype.checkTableView = function (value, index) {
  var self = this;
  self.hashTable.getKey(value, index);
  self.data.sort(function (a, b) {
    if (a.exactly === undefined) {
      if (b.exactly === undefined) return 0;
      return -1;
    }

    if (b.exactly === undefined) return 1;

    if (a.exactly < b.exactly) {
      return -1;
    }

    if (a.exactly > b.exactly) {
      return 1;
    }

    return 0;
  });
};

tableView.prototype.checkTableViewFilter = function (value, index) {
  var self = this;
  self.hashTableFilter.getKey(value, index);
};

tableView.prototype.checkTableViewRange = function (min, max, id) {
  var self = this;
  self.hashTableRange.getKey(min, max, id);
};

tableView.prototype.updateHash = function (row) {
  var object = row.data;
  var value;

  if (this.inputElement !== undefined || this.inputFilter !== undefined) {
    if (this.inputFilter !== undefined) for (var k = 0; k < this.inputFilter.length; k++) {
      if (this.inputFilter[k][0].value == 0) continue;
      if (object[this.inputFilter[k][1]].value !== undefined) value = object[this.inputFilter[k][1]].value;else if (typeof object[this.inputFilter[k][1]] === "string") value = object[this.inputFilter[k][1]];else value = "";

      if (this.inputFilter[k][0].value != object[this.inputFilter[k][1]]) {
        row.classList.add("disPlayNone");
        setTimeout(function () {
          row.classList.remove("parent");
        }, 10);
        return false;
      }
    }

    for (var i = 0; i < object.length; i++) {
      if (object[i].value !== undefined) value = object[i].value;else if (typeof object[i] === "string") value = object[i];else value = "";
      if (this.inputElement !== undefined) for (var k = 0; k < this.inputElement.length; k++) {
        if (this.inputElement[k].value === "") continue;

        for (var j = 0; j < value.length; j++) {
          var checkCharacter = -1;
          var current = this.inputElement[k].value.indexOf[value[j]];

          if (current == -1 || current < checkCharacter) {
            row.classList.add("disPlayNone");
            setTimeout(function () {
              row.classList.remove("parent");
            }, 10);
            return false;
          } else checkCharacter = current;
        }
      }
    }
  }

  return true;
};

tableView.prototype.resetHash = function () {
  var self = this;
  if (self.hashTable !== undefined) self.hashTable = new _HashTable.HashTable(self.data);
  if (self.hashTableFilter !== undefined) self.hashTableFilter = new _HashTableFilter.HashTableFilter(self.data);
};

tableView.prototype.setVisiableFalse = function (arr) {
  for (var i = 0; i < arr.length; i++) {
    arr[i].visiable = false;
    if (arr[i].child !== undefined) this.setVisiableFalse(arr[i].child);
  }
};

tableView.prototype.setVisiableAll = function (arr) {
  for (var i = 0; i < arr.length; i++) {
    arr[i].confirm = true;
    if (arr[i].child !== undefined) this.setVisiableAll(arr[i].child);
  }
};

tableView.prototype.setVisiableAllNoneUpdate = function (arr) {
  for (var i = 0; i < arr.length; i++) {
    arr[i].visiable = true;
  }
};

tableView.prototype.getBodyTable = function (data, index, isFirst = false, nodeBefore) {
  var temp = this.bodyTable;
  var result = this,
      k,
      delta = [],
      row,
      cell;
  var arr = [];
  var i = 0;
  var isCheckChild;
  if (this.startIndex == undefined) this.startIndex = 0;
  var startIndexCell;

  if (index == undefined) {
    index = 0;
    startIndexCell = this.startIndex;
  } else startIndexCell = index;

  if (this.currentIndex !== undefined) {
    i = this.currentIndex;
  } else {
    this.currentIndex = i;
  }

  var deltaLong = -1;
  var isFlag = false;
  result.checkSpan = [];
  if (result.indexRow == undefined || result.indexRow >= this.tempIndexRow) result.indexRow = 0;
  var indexIncrease = {
    a: this.indexRow + startIndexCell
  };

  Loop: for (; i < data.length && this.indexRow <= this.tempIndexRow + deltaLong; i++) {
    isCheckChild = false;

    if (data[i].child !== undefined) {
      data[i].child.updateVisible = data.updateVisible;
      data[i].child.ortherFilter = data.ortherFilter;
    }

    if (data[i].oldIndex === undefined) data[i].oldIndex = i;

    if (data.updateVisible === true) {
      var tempCheck = data[i].confirm;
      data[i].confirm = undefined;
      data[i].exactly = undefined;
      data[i].isComplete = undefined;

      if (tempCheck !== true) {
        data[i].visiable = false;
        if (data[i].child !== undefined) result.setVisiableFalse(data[i].child); // if (data[i].child !== undefined) {
        //     result.getBodyTable(data[i].child);
        // }

        continue;
      } else {
        data[i].visiable = undefined;
        data[i].updateVisible = undefined;
        isCheckChild = true; // if (data[i].child !== undefined)
        //     result.setVisiableAll(data[i].child)
      }
    } else {
      if (data[i].visiable === false) {
        // if (data[i].child !== undefined)
        //     result.getBodyTable(data[i].child);
        continue;
      } else if (data[i].visiable === true) {
        data[i].visiable = undefined; // if (data[i].child !== undefined)
        //     result.setVisiableAllNoneUpdate(data[i].child)
      } else if (data.ortherFilter === true) {
        if (data[i].visiable === undefined) {
          // if (data[i].child !== undefined)
          //     result.getBodyTable(data[i].child);
          continue;
        }
      }
    }

    if (index !== 0) {
      index--;
      isFlag = true;
      continue;
    }

    if (isFlag == true) {
      if (index === 0) {
        if (data[i].getRowMerge && data[i].getRowMerge.length > 1) {
          var indexDataRow = data[i].getRowMerge.indexOf(data[i]);

          if (indexDataRow > 0) {
            i -= indexDataRow;
            deltaLong += indexDataRow;
          }
        }
      }

      isFlag = false;
    }

    row = result.getRow(data[i]);
    if (isCheckChild === true) _('attachhook').once('error', function (rowAfter) {
      if (rowAfter.childrenNodes && rowAfter.childrenNodes.length == 0 && rowAfter.classList.contains("more-child")) {
        rowAfter.classList.remove("more-child");
      }
    }.bind(this, row));

    if (nodeBefore) {
      temp.insertBefore(row, nodeBefore);
    } else temp.addChild(row);

    arr.push(row);
    var tempX = {
      a: this.tempIndexRow - this.indexRow + deltaLong
    };

    for (var j = 0; j < result.realTable.parentNode.clone.length; j++) {
      k = parseFloat(result.realTable.parentNode.clone[j][0].id);
      if (delta[j] === undefined) delta[j] = 0;
      cell = result.getCell(data[i], indexIncrease, k, j, result.checkSpan, row, tempX);

      if (this.tempIndexRow - this.indexRow + deltaLong < tempX.a) {
        deltaLong -= tempX.a;
        row.selfRemove();
      }

      if (cell === 6 || cell === 2) {
        result.clone[j].splice(this.indexRow + 1 - delta[j], 1);
        delta[j] += 1;
        continue;
      }

      if (cell === true) {
        continue;
      }

      cell.clone = result.clone;
      result.clone[j][this.indexRow + 1 - delta[j]] = cell;
      row.addChild(cell);
    }

    row.checkChild();
    this.indexRow++;
    indexIncrease.a++;
  }

  this.currentIndex = i;
  this.startIndex = indexIncrease.a;
  if (data.updateVisible) result.setConfirm(data, i);
  if (isFirst == true) result.setMergeCell(data, result.checkSpan, i - 1);
  if (result.checkMargin !== undefined) result.checkMargin();
  data.ortherFilter = undefined;
  data.updateVisible = undefined;
  result.childrenNodes = result.childrenNodes.concat(arr);
  result.lastRowElement(); // this.indexRow = 0;

  return arr;
};

tableView.prototype.checkVisiableCell = function (x, y) {
  if (typeof this.data[x][y] !== "object") return true;

  if (x > 0) {
    if (this.data[x - 1][y] === this.data[x][y]) return false;
  }

  if (y > 0) {
    if (this.data[x][y - 1] === this.data[x][y]) return false;
  }

  return true;
};

tableView.prototype.setMergeCell = function (arr, checkSpan, i = 0) {
  var data;
  var rowMergeData;

  if (i === -1) {
    return;
  }

  for (i; i < arr.length; i++) {
    rowMergeData = arr[i].getRowMerge;

    if (rowMergeData === undefined) {
      rowMergeData = [arr[i]];
      Object.defineProperty(arr[i], "getRowMerge", {
        get: function (rowMergeData) {
          return function () {
            return rowMergeData;
          };
        }(rowMergeData),
        set: function (rowMergeData) {
          return function (value) {
            rowMergeData = value;
          };
        }(rowMergeData),
        configurable: true
      });
    }

    for (var j = 0; j < arr[i].length; j++) {
      data = arr[i][j];

      if (checkSpan[i] !== undefined) {
        if (checkSpan[i][j] == 2) {
          var rowMerge = arr[i - 1].getRowMerge;

          if (rowMerge.indexOf(arr[i]) === -1) {
            rowMerge.push(arr[i]);
          }

          Object.defineProperty(arr[i], "getRowMerge", {
            get: function (rowMerge) {
              return function () {
                return rowMerge;
              };
            }(rowMerge),
            set: function (rowMerge) {
              return function (value) {
                rowMerge = value;
              };
            }(rowMerge),
            configurable: true
          });
          var define = arr[i - 1][j];
          Object.defineProperty(arr[i], j, {
            get: function (define) {
              return function () {
                return define;
              };
            }(define),
            set: function (define) {
              return function (value) {
                define = value;
              };
            }
          });
        }

        if (checkSpan[i][j] == 6) {
          var define = arr[i][j - 1];
          Object.defineProperty(arr[i], j, {
            get: function (define) {
              return function () {
                return define;
              };
            }(define),
            set: function (define) {
              return function () {
                define = value;
              };
            }(define)
          });
        }
      }

      var isCheckRow = 0;

      if (data == undefined) {
        console.log(i, j, arr);
      }

      if (data.rowspan !== undefined) {
        for (var l = i + 1; l < i + data.rowspan; l++) {
          if (checkSpan[l] === undefined) checkSpan[l] = [];
          checkSpan[l][j] = 2;
        }

        isCheckRow = data.rowspan - 1;
        data.rowspan = undefined;
      }

      if (data.colspan !== undefined) {
        for (var l = j + 1; l < j + data.colspan; l++) {
          for (var x = 0; x <= isCheckRow; x++) {
            if (checkSpan[i + x] === undefined) checkSpan[i + x] = [];
            checkSpan[i + x][l] = 6;
          }
        }

        data.colspan = undefined;
      }
    }

    if (arr[i].child !== undefined) {
      this.setMergeCell(arr[i].child, checkSpan);
    }
  }
};

tableView.prototype.setConfirm = function (arr, i = 0) {
  for (i; i < arr.length; i++) {
    if (arr[i].oldIndex === undefined) arr[i].oldIndex = i;
    if (arr[i].confirm !== undefined) arr[i].visiable = arr[i].confirm;else arr[i].visiable = false;
    arr[i].confirm = undefined;
    arr[i].exactly = undefined;
    arr[i].isComplete = undefined;

    if (arr[i].child !== undefined) {
      this.setConfirm(arr[i].child);
    }
  }
};

tableView.prototype.countRow = function () {
  var countRowVisiable = this.countRowChild(this.data);
  return countRowVisiable;
};

tableView.prototype.countRowChild = function (arr) {
  var countRowVisiable = 0;

  for (var i = 0; i < arr.length; i++) {
    if (arr[i].visiable != false) countRowVisiable++; // if (arr[i].child !== undefined)
    //     countRowVisiable += this.countRowChild(arr[i].child);
  }

  return countRowVisiable;
};

tableView.prototype.pagination = function (number, functionClick) {
  var countPrecent = Math.ceil(this.countRow() / number);

  if (countPrecent <= 1) {
    var temp = _({
      tag: "div",
      style: {
        display: "none"
      }
    });

    temp.noneValue = true;
    return temp;
  }

  var self = this;
  var paginationLeftPos = "20px";
  var paginationWidthPos = "40px";
  var paginationOpacity = 0;
  var checkPaginationClick = 0;
  var arr = [];

  var overlay = _({
    tag: "div",
    class: "pagination-hover-overlay"
  });

  var container = _({
    tag: "div",
    class: "pagination-wrapper"
  });

  var realTemp = _({
    tag: "div",
    class: "pagination",
    child: [{
      tag: "div",
      class: "pagination-container",
      child: [overlay, {
        tag: "div",
        class: "pagination-prev",
        on: {
          click: function (event) {
            var temp = $("a.active", container);
            if (temp !== undefined) var prev = temp.previousSibling;

            while (prev != null && prev.classList.contains("detail")) prev = prev.previousSibling;

            if (prev !== null) {
              prev.click();
              temp.style.color = "";
            }
          }
        },
        props: {},
        child: [{
          tag: "span",
          class: ["icon-pagination", "icon-pagination-prev"],
          child: [{
            tag: "i",
            class: ["icon", "material-icons"],
            props: {
              innerHTML: "keyboard_arrow_left"
            }
          }]
        }]
      }, container, {
        tag: "div",
        class: "pagination-next",
        on: {
          click: function (event) {
            var temp = $("a.active", container);
            if (temp !== undefined) var next = temp.nextSibling;

            while (next != null && next.classList.contains("detail")) next = next.nextSibling;

            if (next !== null) {
              next.click();
              temp.style.color = "";
            }
          }
        },
        child: [{
          tag: "span",
          class: ["icon-pagination", "icon-pagination-next"],
          child: [{
            tag: "i",
            class: ["icon", "material-icons"],
            props: {
              innerHTML: "keyboard_arrow_left"
            }
          }]
        }]
      }]
    }]
  });

  var temp = realTemp;

  for (var i = 0; i < countPrecent; i++) {
    if (i == 1) {
      temp.detailLeft = _({
        tag: "a",
        class: ["pagination-page-number", "detail"],
        props: {
          innerHTML: "..."
        }
      });
      container.appendChild(temp.detailLeft);
    }

    if (i == countPrecent - 1) {
      temp.detailRight = _({
        tag: "a",
        class: ["pagination-page-number", "detail"],
        props: {
          innerHTML: "..."
        }
      });
      container.appendChild(temp.detailRight);
    }

    var choiceSelect = _({
      tag: "a",
      class: "pagination-page-number",
      on: {
        click: function (i) {
          return function (event) {
            var active = $("a.active", container);
            if (active !== undefined) active.classList.remove("active");
            this.classList.add("active");
            temp.updateSize();
            paginationOpacity = 1;
            checkPaginationClick = 1;
            overlay.style.backgroundColor = "#00178a";
            overlay.style.opacity = paginationOpacity;
            var x = this;
            setTimeout(function () {
              paginationLeftPos = x.offsetLeft + "px";
              overlay.style.left = paginationLeftPos;
              paginationWidthPos = x.offsetWidth + "px";
              overlay.style.width = paginationWidthPos;
            }, 10);
            this.style.color = "#fff";
            if (functionClick !== undefined) functionClick(event, i);
            self.indexRow = 0;
            self.updateTable(undefined, undefined, undefined, undefined, i * number);
            if (self.scrollParent !== undefined) self.scrollParent.scrollTop = 0;
            if (self.changePageIndex !== undefined) self.changePageIndex(i);
          };
        }(i),
        mouseover: function (event) {
          paginationOpacity = 1;
          overlay.style.backgroundColor = "#00c1dd";
          overlay.style.left = this.offsetLeft + "px";
          overlay.style.width = this.offsetWidth + "px";
          overlay.style.opacity = paginationOpacity;
          var active = $("a.active", container);
          if (active !== undefined) active.style.color = "#333d45";
          this.style.color = "#fff";
        },
        mouseout: function (event) {
          if (checkPaginationClick) {
            paginationOpacity = 1;
          } else {
            paginationOpacity = 0;
          }

          overlay.style.backgroundColor = "#00178a";
          overlay.style.opacity = paginationOpacity;
          overlay.style.left = paginationLeftPos;
          overlay.style.width = paginationWidthPos;
          this.style.color = "#333d45";
          var active = $("a.active", container);
          if (active !== undefined) active.style.color = "#fff";
        }
      },
      props: {
        innerHTML: i + 1
      }
    });

    choiceSelect.index = i + 1;
    arr.push(choiceSelect);
    container.appendChild(choiceSelect);
  }

  temp.resetChoice = function () {
    setTimeout(function () {
      arr[0].click();
    }, 10);
  };

  temp.resetOnlyView = function () {
    setTimeout(function () {
      if (arr.length == 0) return;
      var temp = $("a.active", container);

      if (temp !== undefined) {
        temp.classList.remove("active");
        temp.style.color = "";
      }

      arr[0].classList.add("active");
      paginationLeftPos = arr[0].offsetLeft + "px";
      paginationWidthPos = arr[0].offsetWidth + "px";
      paginationOpacity = 1;
      checkPaginationClick = 1;
      overlay.style.left = paginationLeftPos;
      overlay.style.width = paginationWidthPos;
      overlay.style.backgroundColor = "#00178a";
      overlay.style.opacity = paginationOpacity;
      arr[0].style.color = "#fff";
    }, 10);
  };

  temp.reActive = function () {
    var temp = $("a.active", container);
    if (temp !== undefined) temp.click();
  };

  temp.resetOnlyView();
  var displayNone = [];

  temp.updateSize = function () {
    setTimeout(function () {
      temp.detailLeft.style.display = "";
      temp.detailRight.style.display = "";

      for (var i = 0; i < displayNone.length; i++) {
        displayNone[i].style.display = "";
      }

      var i = 0;
      var active = $("a.active", container);
      displayNone = [active];
      var lastIndexPrev, lastIndexPrevBefore;
      var lastIndexNext, lastIndexNextBefore;
      var isLeft = false,
          isRight = false;

      if (active !== undefined) {
        var prev = active.previousSibling,
            next = active.nextSibling;

        while (container.offsetWidth <= self.realTable.offsetWidth - 160 && !(isLeft == true && isRight == true)) {
          if (isRight == false && next != null) {
            while (next == temp.detailRight || next == temp.detailLeft) next = next.nextSibling;

            next.style.display = "flex";
            lastIndexNextBefore = lastIndexNext;
            lastIndexNext = next;
            displayNone.push(next);
            next = next.nextSibling;
            i++;
          } else {
            isRight = true;
          }

          if (container.offsetWidth > self.realTable.offsetWidth - 160) break;

          if (isLeft == false && prev != null) {
            while (prev == temp.detailLeft || prev == temp.detailRight) prev = prev.previousSibling;

            prev.style.display = "flex";
            lastIndexPrevBefore = lastIndexPrev;
            lastIndexPrev = prev;
            displayNone.push(prev);
            prev = prev.previousSibling;
            i++;
          } else {
            isLeft = true;
          }
        }

        if (isRight == false && lastIndexNext !== undefined && lastIndexNext.nextSibling !== null) {
          lastIndexNext.style.display = "";
          lastIndexNextBefore.style.display = "";
          temp.detailRight.style.display = "flex";
          displayNone.push(container.lastChild);
          container.lastChild.style.display = "flex";
        }

        if (isLeft == false && lastIndexPrev !== undefined && lastIndexPrev.previousSibling !== null) {
          lastIndexPrev.style.display = "";
          lastIndexPrevBefore.style.display = "";
          temp.detailLeft.style.display = "flex";
          displayNone.push(container.firstChild);
          container.firstChild.style.display = "flex";
        }
      }
    }, 10);
  };

  temp.updateSize();

  this.goto = function (index) {
    var active = $("a.active", container);
    if (active !== undefined) active.style.color = "#333d45";
    arr[index - 1].click();
  };

  this.getPaginationIndex = function () {
    var active = $("a.active", container);
    if (active !== undefined) return active.index;else return 1;
  };

  this.getPaginationLength = function () {
    return countPrecent;
  };

  return temp;
};

tableView.prototype.getRow = function (data) {
  var temp = _({
    tag: "tr"
  });

  var result = this;
  setTimeout(function () {
    temp.classList.add("parent");
  }, 10);
  var rowMerge = data.getRowMerge;

  if (rowMerge === undefined) {
    rowMerge = [data];
  }

  Object.defineProperty(data, "getRowMerge", {
    get() {
      return rowMerge;
    },

    set(value) {
      rowMerge = value;
    },

    configurable: true
  });
  Object.assign(temp, tableView.prototype);
  temp.realTable = result.realTable;
  temp.headerTable = result.headerTable;
  temp.bodyTable = result.bodyTable;
  temp.check = result.check;
  temp.header = result.header;
  temp.dragVertical = result.dragVertical;
  temp.dragHorizontal = result.dragHorizontal;
  temp.data = data;
  if (temp.data.child === undefined) temp.data.child = [];
  temp.childrenNodes = [];
  temp.clone = [];
  temp.parentMargin = result.parentMargin + 1;
  temp.childIndex = result.childIndex;
  temp.moreChild = temp.data.moreChild;
  temp.data.moreChild = undefined;
  temp.tempIndexRow = result.tempIndexRow;

  temp.checkLeft = function () {
    for (var i = 0; i < temp.childNodes.length; i++) temp.childNodes[i].checkLeft();
  };

  if (temp.data.marker !== undefined) {
    temp.id = temp.data.marker.toString();
  }

  temp.checkChild = function (data) {
    temp.checkClone();
    if (data !== undefined) temp.data = data;

    if (temp.data.child.length !== 0) {
      temp.checkIcon();
      temp.getBodyTable(temp.data.child, undefined, undefined, temp.getElementNext(temp));
    }
  };

  temp.checkClone = function () {
    if (temp.clone.length === 0) {
      temp.clone = [];
      var k = 0;

      for (var i = 0; i < temp.childNodes.length; i++) {
        temp.clone[k++] = [temp.childNodes[i]];

        if (temp.childNodes[i].colSpan !== 1) {
          k++;
        }
      }
    }
  };

  temp.checkIcon = function () {
    var indexMore = 0;

    if (temp.childIndex !== undefined) {
      if (temp.childIndex === 0) {
        if (!result.realTable.parentNode.classList.contains("padding-High-table")) result.realTable.parentNode.classList.add("padding-High-table");
      }

      indexMore = temp.childIndex;
    }

    temp.classList.add("more-child");

    var buttonClick = _({
      tag: "div",
      class: "more-icon-container",
      on: {
        click: function (event) {
          temp.setDisPlay();
        }
      },
      child: [{
        tag: "i",
        class: ["material-icons", "more-button"],
        props: {
          innerHTML: "play_arrow"
        }
      }]
    });

    var x = temp.childNodes[indexMore].firstChild;

    while (x.classList !== undefined && x.classList.contains("margin-div-cell")) x = x.nextSibling;

    temp.childNodes[indexMore].insertBefore(buttonClick, x);
    this.buttonClick = buttonClick;

    result.checkMargin = function () {
      for (var i = 0; i < result.clone[indexMore].length; i++) {
        if (!result.clone[indexMore][i].classList.contains("margin-left-has-icon")) result.clone[indexMore][i].classList.add("margin-left-has-icon");
      }
    };

    result.checkMargin();
    setTimeout(function () {
      if (temp.moreChild == false) {
        temp.setDisPlay();
        temp.moreChild = undefined;
      }
    }, 1);
  };

  temp.checkVisibleChild = function () {
    this.buttonClick.selfRemove();
    var parent = this.childNodes[0].getParentNode();

    if (parent.tagName === "DIV") {
      for (var i = 0; i < parent.bodyTable.childNodes.length; i++) {
        if (parent.bodyTable.childNodes[i].childNodes[parent.childIndex].classList.contains("margin-left-has-icon")) parent.bodyTable.childNodes[i].childNodes[parent.childIndex].classList.remove("margin-left-has-icon");
      }
    }
  };

  temp.updateCurrentRow = function (data) {
    var parent = temp.childNodes[0].getParentNode();
    var index = parent.childrenNodes.indexOf(this);
    if (index == -1) return;
    return parent.updateRow(data, index);
  };

  temp.getParentNode = function () {
    var parent = temp.childNodes[0].getParentNode();
    var index = parent.childrenNodes.indexOf(this);
    if (index == -1) return;
    return parent;
  };

  return temp;
};

tableView.prototype.setDisPlay = function () {
  if (!this.classList.contains("more-child") && this.data.child && this.data.child.length !== this.childrenNodes.length) {
    this.data.updateVisible = undefined;

    for (var i = 0; i < this.childrenNodes.length; i++) {
      this.childrenNodes[i].selfRemove();
    }

    this.childrenNodes = [];
    this.currentIndex = 0;
    this.setVisiableAllNoneUpdate(this.data.child);
    this.getBodyTable(this.data.child, undefined, undefined, this.getElementNext(this));
  }

  if (!this.classList.contains("more-child")) {
    this.classList.add("more-child");
    this.setMoreChild(this.childrenNodes);
  } else {
    this.classList.remove("more-child");
    this.setDisPlayNone();
  }
};

tableView.prototype.setMoreChild = function (childrenNodes) {
  for (var i = 0; i < childrenNodes.length; i++) {
    childrenNodes[i].classList.remove("disPlayNone");
    childrenNodes[i].classList.add("parent");

    _('attachhook').once('error', function (rowAfter) {
      if (rowAfter.childrenNodes && rowAfter.childrenNodes.length == 0 && rowAfter.classList.contains("more-child")) {
        rowAfter.classList.remove("more-child");
      }
    }.bind(this, childrenNodes[i]));

    if (childrenNodes[i].classList.contains("more-child")) {
      if (childrenNodes[i].childrenNodes && childrenNodes[i].childrenNodes.length > 0) {
        childrenNodes[i].setMoreChild(childrenNodes[i].childrenNodes);
      } else childrenNodes[i].setDisPlayNone();
    } else {
      childrenNodes[i].setDisPlayNone();
    }
  }
};

tableView.prototype.setDisPlayVisable = function () {
  if (this.classList.contains("more-child")) {
    var childrenNodes = this.childrenNodes;

    for (var i = 0; i < childrenNodes.length; i++) {
      childrenNodes[i].classList.remove("disPlayNone");
      childrenNodes[i].classList.add("parent");
      if (childrenNodes[i].childrenNodes.length !== 0) childrenNodes[i].setDisPlayVisable();
    }
  }
};

tableView.prototype.setDisPlayNone = function () {
  var childrenNodes = this.childrenNodes;

  for (var i = 0; i < childrenNodes.length; i++) {
    childrenNodes[i].classList.remove("parent");
    childrenNodes[i].classList.add("disPlayNone");
    if (childrenNodes[i].childrenNodes.length !== 0) childrenNodes[i].setDisPlayNone();
  }
};

tableView.prototype.getDivMargin = function () {
  return _({
    tag: "div",
    class: "margin-div-cell"
  });
};

tableView.prototype.getTrueCheckBox = function () {
  var indexCheckBox = -1;

  for (var i = 0; i < this.header.length; i++) {
    if (this.header[i].type == "check") {
      indexCheckBox = i;
      break;
    }
  }

  if (indexCheckBox === -1) return [];
  return this.checkChildCheckBox(this.data, indexCheckBox);
};

tableView.prototype.checkChildCheckBox = function (data, indexCheckBox) {
  var arr = [];

  for (var i = 0; i < data.length; i++) {
    if (data[i][indexCheckBox] == true) {
      data[i][indexCheckBox] = false;
      arr.push(data[i]);
    }

    if (data[i][indexCheckBox]["value"] == true) {
      data[i][indexCheckBox]["value"] = false;
      arr.push(data[i]);
    }

    if (data[i].child && data[i].child.length > 0) arr.concat(this.checkChildCheckBox(data[i].child, indexCheckBox));
  }

  return arr;
};

tableView.prototype.getCell = function (dataOrigin, i, j, k, checkSpan = [], row, orther) {
  var dataOld = dataOrigin;
  dataOrigin = dataOrigin[j];
  var data = dataOrigin;
  var result = this,
      value,
      bonus,
      style,
      classList,
      cell;

  if (typeof i === "object") {
    var objectRealIndex = i;
    var realIndex = objectRealIndex.a;
  } else {
    var realIndex = i;
  }

  var localData;

  if (result.tagName === "DIV") {
    localData = result.data;
  } else {
    localData = result.data.child;
  }

  i = localData.indexOf(dataOld);

  if (i === -1) {
    i = realIndex;
  }

  if (checkSpan[i] !== undefined) {
    if (checkSpan[i][j] == 2) {
      var rowMerge = localData[i - 1].getRowMerge;

      if (rowMerge.indexOf(localData[i]) === -1) {
        rowMerge.push(localData[i]);
      }

      Object.defineProperty(localData[i], "getRowMerge", {
        get() {
          return rowMerge;
        },

        set(value) {
          rowMerge = value;
        },

        configurable: true
      });
      var define = localData[i - 1][j];
      Object.defineProperty(dataOld, j, {
        get() {
          return define;
        },

        set(value) {
          define = value;
        }

      });
      if (this.check[j] === "increase") if (typeof objectRealIndex === "object") {
        objectRealIndex.a--;
      }
      return 2;
    }

    if (checkSpan[i][j] == 6) {
      var define = dataOld[j - 1];
      Object.defineProperty(dataOld, j, {
        get() {
          return define;
        },

        set(value) {
          define = value;
        }

      });
      return 6;
    }
  }

  if (data.value === undefined) {
    if (typeof data === "object") value = "";else value = data.toString();
  } else value = data.value;

  switch (this.check[j]) {
    case "hidden":
      return true;

    case "increase":
      if (value === "") value += realIndex + 1;
      break;

    case "dragzone":
      if (realIndex !== -1) {
        if (data.icon !== undefined) {
          icon = data.icon;
          bonus = _({
            tag: "i",
            class: ["material-icons"],
            style: {
              fontSize: "20px",
              cursor: "pointer"
            },
            props: {
              innerHTML: icon
            }
          });
        } else {
          bonus = _({
            tag: "i",
            class: ["material-icons", "drag-icon-button"],
            props: {
              innerHTML: "drag_indicator"
            },
            on: {// mousedown: result.dragVertical ? function (event) {
              //     var self = this;
              //     return function (event, cellIndex, self) {
              //         event.preventDefault();
              //         var finalIndex = cellIndex.getParentNode().childrenNodes.indexOf(cellIndex.parentNode);
              //         self.hold = false;
              //         var dom = self;
              //         self.default = event;
              //         self.timeoutID = setTimeout(function () {
              //             dom.hold = true;
              //             moveElementFix(event, dom, cellIndex.getParentNode(), finalIndex + 1);
              //         }, 200);
              //     }(event, cell, self)
              // } : undefined,
              // dragstart: result.dragVertical ? function () {
              //     return false;
              // } : undefined,
              // mouseup: function () {
              //     if (this.hold === false) {
              //         this.hold = true;
              //         // this.click();
              //         clearTimeout(this.timeoutID);
              //     }
              // },
              // mousemove: result.dragVertical ? function (event) {
              //     var self = this;
              //     return function (event, cellIndex, self) {
              //         if (self.hold === false) {
              //             var finalIndex = cellIndex.getParentNode().childrenNodes.indexOf(cellIndex.parentNode);
              //             self.hold = false;
              //             var deltaX = self.default.clientX - event.clientX,
              //                 deltaY = self.default.clientY - event.clientY;
              //             if ((Math.abs(deltaX) + Math.abs(deltaY)) > 10) {
              //                 self.hold = true;
              //                 moveElementFix(event, self, cellIndex.getParentNode(), finalIndex + 1);
              //                 clearTimeout(self.timeoutID);
              //             }
              //         }
              //     }(event, cell, self)
              // } : undefined,
            }
          });
        }
      }

      break;

    case "check":
      if (realIndex !== -1) {
        bonus = _({
          tag: "checkboxbutton",
          class: "pizo-checkbox",
          on: {
            change: function (event) {
              if (result.bodyTable.listCheckBox !== undefined) {
                if (this.checked === false) result.bodyTable.listCheckBox[0].checked = false;else {
                  if (result.bodyTable.listCheckBox[0].checked === false) for (var j = 1; j < result.bodyTable.listCheckBox.length; j++) {
                    if (result.bodyTable.listCheckBox[j].checked === false) {
                      j--;
                      break;
                    }
                  }

                  if (j === result.bodyTable.listCheckBox.length) {
                    result.bodyTable.listCheckBox[0].checked = true;
                  }
                }
                this.update();
              }
            }
          }
        });

        bonus.update = function (checked) {
          if (checked == undefined) dataOrigin.value = this.checked;else {
            dataOrigin.value = checked;

            if (this.checked != checked) {
              this.checked = checked;
              this.emit("change");
            }
          }
        };

        if (dataOrigin.value === true) bonus.checked = dataOrigin.value;
        if (result.bodyTable.listCheckBox !== undefined) result.bodyTable.listCheckBox.push(bonus);
      }

      break;

    case "detail":
      if (realIndex !== -1) {
        var icon = "more_vert";
        if (data.icon !== undefined) icon = data.icon;
        bonus = _({
          tag: "i",
          class: "material-icons",
          style: {
            fontSize: "20px",
            cursor: "pointer"
          },
          props: {
            innerHTML: icon
          }
        });
      }

      break;
  }

  var functionClick = undefined;
  if (data.functionClick !== undefined) functionClick = data.functionClick;else {
    if (result.header[j].functionClickAll !== undefined) functionClick = result.header[j].functionClickAll;
  }
  var functionChange = undefined;
  if (data.functionChange !== undefined) functionChange = data.functionChange;else {
    if (result.header[j].functionChangeAll !== undefined) functionChange = result.header[j].functionChangeAll;
  }
  style = {};
  if (data.style !== undefined) style = data.style;
  classList = [];
  if (data.classList !== undefined) classList = data.classList;
  var on = {
    click: function (event) {
      return function (event, row, functionClick) {
        // event.preventDefault();
        if (functionClick !== undefined) {
          if (cell.getParentNode().childrenNodes.length !== 0) var finalIndex = cell.getParentNode().childrenNodes.indexOf(cell.parentNode);else var finalIndex = 0;
          functionClick(event, cell, finalIndex, cell.getParentNode(), row.data, row);
        }
      }(event, row, functionClick);
    },
    change: function (event) {
      return function (event, row, functionChange) {
        // event.preventDefault();
        if (functionChange !== undefined) {
          if (cell.getParentNode().childrenNodes.length !== 0) var finalIndex = cell.getParentNode().childrenNodes.indexOf(cell.parentNode);else var finalIndex = 0;
          functionChange(event, cell, finalIndex, cell.getParentNode(), row.data, row);
        }
      }(event, row, functionChange);
    }
  };
  var mousedown = result.dragVertical ? function (event) {
    return function (event, cellIndex, self) {
      var finalIndex = cellIndex.getParentNode().childrenNodes.indexOf(cellIndex.parentNode);
      var element = cellIndex.parentNode;
      element.finalIndex = finalIndex;
    }(event, cell, result);
  } : undefined;
  var mouseup = result.dragVertical ? function (event) {
    return function (event, cellIndex, self) {
      var element = cellIndex.getParentNode();
      delete element.finalIndex;
    }(event, cell, result);
  } : undefined;

  if (_BrowserDetector.default.isMobile) {
    on["touchstart"] = mousedown;
    on["touchend"] = mouseup;
  } else {
    on["mousedown"] = mousedown;
    on["mouseup"] = mouseup;
  }

  cell = _({
    tag: "td",
    style: style,
    class: classList,
    on: on
  });
  if (functionClick !== undefined) cell.style.cursor = "pointer";

  var container = _({
    tag: "div",
    class: "container-view"
  });

  cell.checkLeft = function () {
    return function (cell, result, k) {
      var widthSize = 0;
      var step = 1.71428571429;
      var arr = cell.getElementsByClassName("margin-div-cell");

      for (var i = arr.length - 1; i >= 0; i--) {
        arr[i].selfRemove();
      }

      if (result.data.child !== undefined) if (k === result.childIndex) {
        for (var i = 0; i < result.parentMargin - 1; i++) {
          cell.insertBefore(result.getDivMargin(), cell.firstChild);
          widthSize += step;
        }
      }
      container.style.width = "calc(100% - " + widthSize + "em)";
      if (widthSize !== 0) cell.classList.add("margin-left-has-icon");
    }(cell, row, k);
  };

  row.resetParentChild = function () {
    for (var i = 0; i < row.childrenNodes.length; i++) {
      row.childrenNodes[i].parentMargin = row.parentMargin + 1;
      row.childrenNodes[i].resetParentChild();
    }
  };

  cell.addChild(container);
  cell.checkLeft();

  if (data.element !== undefined) {
    container.appendChild(data.element);
  } else if (data.adapter !== undefined) {
    var tempAdapter = data.adapter();
    container.appendChild(tempAdapter);
    data.element = tempAdapter;
  } else {
    if (this.check[j] !== "dragzone" && this.check[j] !== "check" && this.check[j] !== "deltail") container.addChild(_({
      text: value
    }));
  }

  if (bonus !== undefined) {
    container.addChild(bonus);
    bonus = undefined;
  }

  var isCheckRow = 0;

  if (data.rowspan !== undefined) {
    cell.setAttribute("rowspan", data.rowspan);
    isCheckRow = data.rowspan - 1;
    var isComplete = false;
    if (orther) if (orther.a < data.rowspan - 1) {
      orther.a += data.rowspan;
      isComplete = true;
    }

    if (isComplete === false) {
      for (var l = i + 1; l < i + data.rowspan; l++) {
        if (checkSpan[l] === undefined) checkSpan[l] = [];
        checkSpan[l][j] = 2;
      }

      data.rowspan = undefined;
    }
  } else if (realIndex !== -1) {
    if (typeof localData[i + 1] === "object" && typeof localData[i][j] === "object" && typeof localData[i + 1][j] === "object") {
      var index = 1;

      for (var l = i + 1; l < localData.length; l++) {
        if (localData[i][j] === localData[l][j]) {
          if (checkSpan[l] === undefined) checkSpan[l] = [];
          checkSpan[l][j] = 2;
          index++;
        } else break;
      }

      if (index > 1) {
        isCheckRow = index - 1;
        cell.setAttribute("rowspan", index);
        if (orther) if (orther.a < index - 1) orther.a += index - 1;
      }
    }
  }

  if (data.colspan !== undefined) {
    cell.setAttribute("colspan", data.colspan);

    for (var l = j + 1; l < j + data.colspan; l++) {
      for (var x = 0; x <= isCheckRow; x++) {
        if (checkSpan[i + x] === undefined) checkSpan[i + x] = [];
        checkSpan[i + x][l] = 6;
      }
    }

    data.colspan = undefined;
  } else // if (realIndex !== -1)
    if (typeof dataOld[j] === "object" && typeof dataOld[j + 1] === "object") {
      var index = 1;

      for (var l = j + 1; l < dataOld.length; l++) {
        if (dataOld[j] === dataOld[l]) {
          for (var x = 0; x <= isCheckRow; x++) {
            if (checkSpan[i + x] === undefined) checkSpan[i + x] = [];
            checkSpan[i + x][l] = 6;
          }

          index++;
        } else break;
      }

      if (index > 1) {
        cell.setAttribute("colspan", index);
      }
    }

  cell.getParentNode = function () {
    var parent = cell.clone[0][0];
    parent = parent;
    if (parent.tagName === "TH") return parent.parentNode.parentNode.parentNode.parentNode;
    return parent.parentNode;
  };

  return cell;
};

tableView.prototype.updateTable = function (header, data, dragHorizontal, dragVertical, index = 0, isUpdate = true) {
  this.checkSpan = [];
  var result = this;

  var temp = _({
    tag: "tbody"
  });

  var isFirst = false;

  if (data !== undefined) {
    data.checkVisiableCell = function (x, y) {
      if (typeof this[x][y] !== "object") return true;

      if (x > 0) {
        if (this[x - 1][y] === this[x][y]) return false;
      }

      if (y > 0) {
        if (this[x][y - 1] === this[x][y]) return false;
      }

      return true;
    };

    this.data = data;
    isFirst = true;
    result.indexPageSum = Math.ceil(result.data.length / result.indexRow);
  }

  if (isUpdate == true) result.indexRow = 0;
  temp.listCheckBox = [];
  if (dragHorizontal !== undefined) result.dragHorizontal = dragHorizontal;
  if (dragVertical !== undefined) result.dragVertical = dragVertical;
  if (this.bodyTable.listCheckBox !== undefined && this.bodyTable.listCheckBox.length > 0) temp.listCheckBox[0] = this.bodyTable.listCheckBox[0];

  for (var i = 0; i < result.clone.length; i++) {
    if (this.headerTable.childNodes.length > 1) result.clone[i] = [result.clone[i][0], result.clone[i][1]];else result.clone[i] = [result.clone[i].shift()];
  }

  this.realTable.replaceChild(temp, this.bodyTable);
  this.bodyTable = temp;
  result.childrenNodes = [];
  this.currentIndex = undefined;
  result.getBodyTable(this.data, index, isFirst);

  if (temp.listCheckBox[0] !== undefined) {
    temp.listCheckBox[0].update();
  }

  if (result.dragVertical) {
    result.setUpSlip();
    if (result.isSwipeLeft || result.isSwipeRight) this.setUpSwipe();
    result.slip = new _slip.default(result.bodyTable);
  }

  if (data !== undefined) {
    if (result.paginationElement !== undefined && result.paginationElement.reActive) result.paginationElement.reActive();
    result.realTable.parentNode.resetHash();
    result.updatePagination();
  }

  if (result.numArrayFixLeft) {
    result.setArrayFix(result.numArrayFixLeft, true);
  }

  if (result.numArrayFixRight) {
    result.setArrayFix(result.numArrayFixRight, false);
  }
};

tableView.prototype.getLastElement = function (element) {
  if (element.childrenNodes !== undefined && element.childrenNodes.length !== 0) {
    return this.getLastElement(element.childrenNodes[element.childrenNodes.length - 1]);
  }

  return element;
};

tableView.prototype.insertRow = function (data, checkMust = false) {
  var result = this,
      k,
      cell;
  var delta = [];
  var index = result.childrenNodes.length;
  var row = result.getRow(data);

  for (var i = 0; i < result.clone.length; i++) {
    delta[i] = 0;

    if (result.checkSpan !== undefined) {
      if (result.checkSpan[index] !== undefined) {
        if (result.checkSpan[index][i] === 6) {
          result.checkSpan[index][i] = undefined;
          result.clone[i].splice(index + 1, 0, {});
        }
      }

      for (var j = 0; j < index; j++) {
        if (result.checkSpan[j] !== undefined) if (result.checkSpan[j][i] !== undefined) delta[i]++;
      }
    }
  }

  var checkChild = false;
  if (result.tagName === "DIV") result.bodyTable.addChild(row);else {
    checkChild = true;
    if (!result.classList.contains("more-child")) result.setDisPlay();
    var tempElement = result.getLastElement(result.clone[0][result.clone[0].length - 1].parentNode);
    result.bodyTable.insertBefore(row, tempElement.nextSibling);
  }

  for (var i = 0; i < this.realTable.parentNode.clone.length; i++) {
    k = parseFloat(this.realTable.parentNode.clone[i][0].id);
    cell = result.getCell(data, index, k, i, result.checkSpan, row);

    if (cell === 6) {
      result.clone[k++].splice(index, 1);
      continue;
    }

    if (cell === 2) {
      k++;
      continue;
    }

    if (cell === true) {
      continue;
    }

    cell.clone = result.clone;
    if (result.clone[i] === undefined) result.clone[i] = [];
    result.clone[i][index + 1 - delta[i]] = cell;
    k++;
    row.addChild(cell);
  }

  var x;
  result.childrenNodes[index] = row;

  if (result.tagName !== "DIV") {
    result.data.child.splice(index, 0, data);
    x = data;
  } else {
    result.data.splice(index, 0, data);
    x = data;
  }

  row.data = x;
  var temp;

  if (temp !== undefined) {
    row.childrenNodes = temp.childrenNodes;
    row.clone = temp.clone;
    row.checkSpan = temp.checkSpan;

    if (row.clone !== undefined) {
      var k = 0,
          l = 0;
      var delta = 0;

      for (var i = 0; i < row.clone.length; i++) {
        if (row.clone[i][0] === temp.childNodes[k]) {
          row.clone[i].shift();
          k++;
        }

        if (delta > 0) {
          delta--;
          continue;
        }

        row.clone[i].unshift(row.childNodes[l]);

        if (row.childNodes[l].colSpan != 1) {
          delta += row.childNodes[l].colSpan - 1;
        }

        l++;
      }
    }
  }

  if (checkChild === true || checkMust === true) {
    if (result.checkIcon !== undefined) {
      result.checkIcon();
    }
  }

  if (row.childrenNodes.length !== 0) row.checkIcon();else row.checkClone();
  if (result.checkMargin !== undefined) result.checkMargin(); //    result.checkDataUpdate(row);

  result.realTable.parentNode.resetHash(); // result.realTable.parentNode.updateHash(row);

  this.setUpSwipe();

  if (result.realTable.parentNode.numArrayFixLeft) {
    result.setArrayFix(result.realTable.parentNode.numArrayFixLeft, true);
  }

  if (result.realTable.parentNode.numArrayFixRight) {
    result.setArrayFix(result.realTable.parentNode.numArrayFixRight, false);
  }

  result.indexPageSum++;
  result.indexPage++;
  return row;
};

tableView.prototype.insertLastRow = function (functionLast) {
  this.functionLast = functionLast;
  this.lastRowElement();
};

tableView.prototype.getPaginationIndex = function () {
  if (this.indexPage === undefined) return 1;
  return this.indexPage;
};

tableView.prototype.getPaginationLength = function () {
  if (this.indexPageSum === undefined) return 1;
  return this.indexPageSum;
};

tableView.prototype.lastRowElement = function () {
  if (this.functionLast) {
    if (this.tagName === "DIV") {
      var tempDataLast = [];

      for (var i = 0; i < this.childrenNodes.length; i++) {
        tempDataLast.push(this.childrenNodes[i].data);
      }

      var tempLast = this.functionLast(tempDataLast, this.childrenNodes, this.getPaginationIndex());
      if (tempLast === undefined) return;
      var row = this.getRow(tempLast);
      if (this.lastElement === undefined || this.lastElement && this.lastElement.parentNode && this.lastElement.parentNode.parentNode) this.bodyTable.addChild(row);else {
        this.bodyTable.addChild(this.lastElement);
        this.bodyTable.replaceChild(row, this.lastElement);
      }

      for (var j = 0; j < this.realTable.parentNode.clone.length; j++) {
        var k = parseFloat(this.realTable.parentNode.clone[j][0].id);
        var cell = this.getCell(tempLast, -1, k, j, this.checkSpan, row);

        if (cell === 6 || cell === 2) {
          continue;
        }

        if (cell === true) {
          continue;
        }

        row.addChild(cell);
      }

      this.lastElement = row;
    }
  }
};

tableView.prototype.updateRow = function (data, index, checkMust = false) {
  var result = this,
      k,
      cell;
  var delta = [];
  var row = result.getRow(data);

  for (var i = 0; i < result.clone.length; i++) {
    delta[i] = 0;

    if (result.checkSpan !== undefined) {
      if (result.checkSpan[index] !== undefined) {
        if (result.checkSpan[index][i] === 6) {
          result.checkSpan[index][i] = undefined;
          result.clone[i].splice(index + 1, 0, {});
        }
      }

      for (var j = 0; j < index; j++) {
        if (result.checkSpan[j] !== undefined) if (result.checkSpan[j][i] !== undefined) delta[i]++;
      }
    }
  }

  var checkChild = false;
  var temp;
  temp = result.childrenNodes[index];
  result.bodyTable.replaceChild(row, temp);
  row.classList.value = temp.classList.value;

  if (temp.childrenNodes !== undefined) {
    row.childrenNodes = temp.childrenNodes;
    row.clone = temp.clone;
  }

  for (var i = 0; i < this.realTable.parentNode.clone.length; i++) {
    k = parseFloat(this.realTable.parentNode.clone[i][0].id);
    cell = result.getCell(data, index, k, i, result.checkSpan, row);

    if (cell === 6) {
      result.clone[k++].splice(index, 1);
      continue;
    }

    if (cell === 2) {
      k++;
      continue;
    }

    if (cell === true) {
      continue;
    }

    cell.clone = result.clone;
    if (result.clone[i] === undefined) result.clone[i] = [];
    result.clone[i][index + 1 - delta[i]] = cell;
    k++;
    row.addChild(cell);
  }

  var x;
  result.childrenNodes[index] = row;

  if (result.tagName !== "DIV") {
    x = Object.assign(temp.data, data);
  } else {
    x = Object.assign(temp.data, data);
  }

  row.data = temp.data;

  if (temp !== undefined) {
    row.childrenNodes = temp.childrenNodes;
    row.clone = temp.clone;
    row.checkSpan = temp.checkSpan;

    if (row.clone !== undefined) {
      var k = 0,
          l = 0;
      var delta = 0;

      for (var i = 0; i < row.clone.length; i++) {
        if (row.clone[i][0] === temp.childNodes[k]) {
          row.clone[i].shift();
          k++;
        }

        if (delta > 0) {
          delta--;
          continue;
        }

        row.clone[i].unshift(row.childNodes[l]);

        if (row.childNodes[l].colSpan != 1) {
          delta += row.childNodes[l].colSpan - 1;
        }

        l++;
      }
    }
  }

  if (checkChild === true || checkMust === true) {
    if (result.checkIcon !== undefined) result.checkIcon();
  }

  if (row.childrenNodes.length !== 0) row.checkIcon();else row.checkClone();
  if (result.checkMargin !== undefined) result.checkMargin(); //    result.checkDataUpdate(row);

  setTimeout(function () {
    if (temp.classList.contains("more-child")) {
      row.classList.add("more-child");
    } else {
      row.classList.remove("more-child");
    }
  }, 100);
  result.realTable.parentNode.resetHash(); // result.realTable.parentNode.updateHash(row);

  return row;
};

tableView.prototype.dropRow = function (index) {
  var result = this;
  var element = result.clone[0][index + 1].parentNode;
  return new Promise(function (resolve, reject) {
    if (!element.classList.contains("hideTranslate")) element.classList.add("hideTranslate");
    if (element.childrenNodes.length !== 0) element.addHideAnimationChild();
    result.bodyTable.parentNode.style.pointerEvents = "none";

    var eventEnd = function () {
      result.exactlyDeleteRow(index);
      result.bodyTable.parentNode.style.pointerEvents = "";
      resolve();
    }; // Code for Safari 3.1 to 6.0


    element.addEventListener("webkitTransitionEnd", eventEnd); // Standard syntax

    element.addEventListener("transitionend", eventEnd);
  });
};

tableView.prototype.exactlyDeleteRow = function (index) {
  var parent = this,
      deltaX = [];
  var element = parent.childrenNodes[index];
  parent.dropRowChild(element);
  var deltaY = 0;
  deltaX = parent.checkLongRow(index);

  for (var i = 0; i < element.childNodes.length; i++) {
    if (element.childNodes[i].tagName !== "TD") continue;
    parent.clone[i + deltaY].splice(index + 1 - deltaX[i + deltaY], 1);
    if (parent.checkSpan !== undefined) parent.checkSpan.splice(index, 1);
    if (element.childNodes[i].colSpan !== undefined) deltaY += element.childNodes[i].colSpan - 1;
  }

  if (parent.childrenNodes.length !== 0) {
    parent.childrenNodes.splice(parent.childrenNodes.indexOf(element), 1);
  }

  if (parent.tagName !== "DIV") {
    var indexData = parent.data.child.indexOf(element.data);
    if (indexData !== -1) parent.data.child.splice(indexData, 1);
  } else {
    var indexData = parent.data.indexOf(element.data);
    if (indexData !== -1) parent.data.splice(indexData, 1);
  }

  if (parent.checkVisibleChild !== undefined && parent.childrenNodes.length === 0) parent.checkVisibleChild();
  parent.realTable.parentNode.resetHash();

  if (parent.tagName == "DIV") {
    if (parent.childrenNodes.length == 0) {
      parent.updatePagination();
    }
  }

  parent.indexPageSum--;
  parent.indexPage--;
};

tableView.prototype.insertColumn = function (index, insertBefore = -1) {
  var current = [];
  var cell, cellHeader;
  delete this.header[index].hidden;
  this.check[index] = this.header[index].type;
  cellHeader = this.getCellHeader(this.header[index], index);
  var currentClone;

  if (insertBefore === -1) {
    this.headerTable.childNodes[0].appendChild(cellHeader);
    current.push(cellHeader);
    this.clone.push(current);
  } else {
    if (this.clone.length < insertBefore) {
      console.log("index insert > current index");
      return;
    } else currentClone = this.clone[insertBefore];

    this.headerTable.childNodes[0].insertBefore(cellHeader, this.clone[insertBefore][0]);
    current.push(cellHeader);
    this.clone.splice(insertBefore, 0, current);
  }

  var k = 1;

  for (var i = 0; i < this.childrenNodes.length; i++) {
    cell = this.getCell(this.childrenNodes[i].data, i, index, this.clone[this.clone.length - 1][0].id + 1, this.checkSpan, this.childrenNodes[i]);
    current.push(cell);
    cell.clone = this.clone;
    if (insertBefore === -1) this.childrenNodes[i].appendChild(cell);else {
      if (this.childrenNodes[i] === currentClone[k].parentNode) {
        this.childrenNodes[i].insertBefore(cell, currentClone[k]);
      } else {
        var tempIndexRow = insertBefore - this.checkLongColumn(i, insertBefore);
        if (this.childrenNodes[i].childNodes[tempIndexRow] !== undefined) this.childrenNodes[i].insertBefore(cell, this.childrenNodes[i].childNodes[tempIndexRow]);else this.childrenNodes[i].appendChild(cell);
        k--;
      }
    }

    if (this.childrenNodes[i].childrenNodes.length !== 0) {
      this.childrenNodes[i].insertColumn(index, insertBefore);
    }

    k++;
  }

  if (this.isSaveTheme) {
    this.saveTheme();
  }
};

tableView.prototype.changeParent = function (index, rowParent) {
  var result = this,
      deltaX = [];
  var element = result.clone[0][index + 1].parentNode;
  var parent = element.childNodes[0].getParentNode();
  var deltaY = 0;
  deltaX = parent.checkLongRow(index);
  parent.changeRowChild(element, rowParent);

  for (var i = 0; i < element.childNodes.length; i++) {
    element.childNodes[i].clone = rowParent.clone;
    rowParent.clone[i + deltaY].push(element.childNodes[i]);
    parent.clone[i + deltaY].splice(index + 1 - deltaX[i + deltaY], 1);
    if (parent.checkSpan !== undefined) parent.checkSpan.splice(index, 1);
    if (element.childNodes[i].colSpan !== undefined) deltaY += element.childNodes[i].colSpan - 1;
  }

  if (parent.childrenNodes.length !== 0) {
    var indexData = parent.childrenNodes.indexOf(element);
    var dataTemp;
    if (parent.tagName == "DIV") dataTemp = parent.data[indexData];else dataTemp = parent.data.child[indexData];
    if (rowParent.tagName == "DIV") rowParent.data.push(dataTemp);else rowParent.data.child.push(dataTemp);
    if (parent.data.child !== undefined) parent.data.child.splice(indexData, 1);else parent.data.splice(indexData, 1);
    rowParent.childrenNodes.push(element);
    parent.childrenNodes.splice(indexData, 1);
  }

  if (result.checkVisibleChild !== undefined && result.childrenNodes.length === 0) result.checkVisibleChild();
  result.indexPageSum++;
  result.indexPage++;
  rowParent.indexPageSum--;
  result.indexPage++;
  return rowParent.childrenNodes.length - 1;
};

tableView.prototype.addHideAnimationChild = function () {
  for (var i = 0; i < this.childrenNodes.length; i++) {
    if (!this.childrenNodes[i].classList.contains("hideTranslate")) this.childrenNodes[i].classList.add("hideTranslate");

    if (this.childrenNodes[i].childrenNodes.length !== 0) {
      this.childrenNodes[i].addHideAnimationChild();
    }
  }
};

tableView.prototype.changeRowChild = function (element, parent) {
  var current;

  if (parent.tagName === "DIV") {
    current = null;
    parent.bodyTable.addChild(element);
  } else {
    current = parent.getParentNode();
    element.parentNode.insertBefore(element, this.getElementNext(parent));
  }

  element.parentMargin = parent.parentMargin + 1;
  element.resetParentChild();
  element.checkLeft();
  if (element.childrenNodes.length !== 0) element.changeRowChildElement(element);
};

tableView.prototype.changeRowChildElement = function (current) {
  for (var i = 0; i < this.childrenNodes.length; i++) {
    if (this.tagName === "DIV" || current == null) this.bodyTable.addChild(this.childrenNodes[i]);else {
      (0, _FormatFunction.insertAfter)(this.childrenNodes[i], current);
    }
    this.childrenNodes[i].checkLeft();

    if (this.childrenNodes[i].childrenNodes.length !== 0) {
      this.childrenNodes[i].changeRowChildElement(this.childrenNodes[i]);
    }
  }
};

tableView.prototype.dropRowChild = function (element) {
  if (element !== undefined && element.parentNode !== undefined) element.parentNode.removeChild(element);
  if (element !== undefined && element.childrenNodes.length !== 0) element.dropRowChildElement();
};

tableView.prototype.dropRowChildElement = function () {
  for (var i = 0; i < this.childrenNodes.length; i++) {
    this.childrenNodes[i].selfRemove();

    if (this.childrenNodes[i].childrenNodes.length !== 0) {
      this.childrenNodes[i].dropRowChildElement();
    }
  }
};

tableView.prototype.backGroundFix = function (index) {
  var rect = this.getBoundingClientRect();
  var scrollParent = this.realTable.parentNode;

  while (scrollParent) {
    var overflowStyle = window.getComputedStyle(scrollParent)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'scroll' || scrollParent.tagName === 'HTML') && (scrollParent.clientHeight < scrollParent.scrollHeight || scrollParent.clientWidth < scrollParent.scrollWidth)) break;
    scrollParent = scrollParent.parentElement;
  }

  var scrollLeft = scrollTop = 0;

  if (scrollParent) {
    scrollLeft = scrollParent.scrollLeft;
    scrollTop = scrollParent.scrollTop;
  }

  var rectDistance = traceOutBoundingClientRect(this);

  var temp = _({
    tag: "div",
    class: "background-opacity",
    style: {
      top: rect.y + 'px',
      left: rect.x + scrollLeft + 'px',
      backgroundColor: "#ffffff00",
      realTop: rect.y + scrollTop,
      width: rectDistance.width - 17 + "px"
    },
    child: []
  });

  var arrZone = [];
  var tempElement = this.getBound2Row(undefined, 0, index);
  arrZone.push(tempElement);
  temp.appendChild(tempElement);

  for (var i = 0; i < this.clone[0].length - 1; i++) {
    tempElement = this.getBound2Row(i, i + 1, index);
    arrZone.push(tempElement);
    temp.appendChild(tempElement);
  }

  tempElement = this.getBound2Row(this.clone[0].length - 1, undefined, index);
  tempElement.childNodes[0].style.height = parseFloat(tempElement.childNodes[0].style.height) - 2 + "px";
  arrZone.push(tempElement);
  temp.appendChild(tempElement);

  temp.getZone = function () {
    return arrZone;
  };

  return temp;
};

tableView.prototype.backGround = function (height, callback, index) {
  var rect = this.getBoundingClientRect();
  var scrollParent = this.realTable.parentNode;

  while (scrollParent) {
    var overflowStyle = window.getComputedStyle(scrollParent)['overflow'];
    if ((overflowStyle === 'auto' || overflowStyle === 'scroll' || scrollParent.tagName === 'HTML') && (scrollParent.clientHeight < scrollParent.scrollHeight || scrollParent.clientWidth < scrollParent.scrollWidth)) break;
    scrollParent = scrollParent.parentElement;
  }

  var rectDistance = traceOutBoundingClientRect(this);
  var scrollTop = 0;
  if (scrollParent) scrollTop = scrollParent.scrollTop;

  var temp = _({
    tag: "div",
    class: "background-opacity-1",
    style: {
      top: rect.y + 'px',
      left: rect.x - 17 + 'px',
      backgroundColor: "#ffffff00",
      realTop: rect.y + scrollTop // width:rectDistance.width-17+"px"

    },
    child: [{
      tag: "div",
      class: "delete-zone",
      style: {
        transform: "translateY(-" + height + "px)",
        top: rect.y + 'px',
        left: rectDistance.left + 'px',
        backgroundColor: "#ffffff00",
        height: height + "px",
        width: rectDistance.width + "px"
      },
      child: [{
        tag: "i",
        class: ["delete-zone-icon", "material-icons"],
        style: {
          marginTop: height / 2 - 30 + "px"
        },
        props: {
          innerHTML: "delete_forever"
        }
      }, {
        tag: "span",
        class: ["detele-zone-label"],
        style: {
          marginTop: height / 2 - 15 + "px"
        },
        props: {
          innerHTML: "Delete"
        }
      }],
      on: {
        mouseover: function (event) {
          if (callback !== undefined && temp.isMove == false) callback(event);
        }
      }
    }]
  });

  var arrZone = [];
  var tempElement = this.getBound2Colum(undefined, 0, index);
  arrZone.push(tempElement);
  temp.appendChild(tempElement);

  for (var i = 0; i < this.clone.length - 1; i++) {
    tempElement = this.getBound2Colum(i, i + 1, index);
    arrZone.push(tempElement);
    temp.appendChild(tempElement);
  }

  tempElement = this.getBound2Colum(this.clone.length - 1, undefined, index);
  tempElement.childNodes[2].style.width = parseFloat(tempElement.childNodes[2].style.width) - 8 + "px";
  arrZone.push(tempElement);
  temp.appendChild(tempElement);

  temp.getDeleteZone = function () {
    return temp.childNodes[0];
  };

  temp.getZone = function () {
    return arrZone;
  };

  return temp;
};

tableView.prototype.deleteColumn = function (index) {
  var realIndex = this.clone[index][0].id;
  if (typeof this.header[realIndex] == "object") this.header[realIndex].hidden = true;else this.header[realIndex] = {
    value: this.header[realIndex],
    hidden: true
  };

  for (var i = 0; i < this.clone[index].length; i++) {
    this.clone[index][i].selfRemove();
  }

  this.clone.splice(index, 1);

  for (var i = 0; i < this.childrenNodes.length; i++) {
    if (this.childrenNodes[i].childrenNodes.length !== 0) {
      this.childrenNodes[i].deleteColumn(index);
    }
  }

  if (this.isSaveTheme) {
    this.saveTheme();
  }
};

tableView.prototype.cloneColumn = function (index, isFull = false) {
  var clone = this.clone[index][0].cloneNode(true);
  clone.style.width = this.clone[index][0].offsetWidth - window.getComputedStyle(this.clone[index][0], null).getPropertyValue('padding-left').replace("px", "") - window.getComputedStyle(this.clone[index][0], null).getPropertyValue('padding-right').replace("px", "") - window.getComputedStyle(this.clone[index][0], null).getPropertyValue('border-left-width').replace("px", "") - window.getComputedStyle(this.clone[index][0], null).getPropertyValue('border-right-width').replace("px", "") + 'px';
  clone.style.height = this.clone[index][0].offsetHeight - window.getComputedStyle(this.clone[index][0], null).getPropertyValue('padding-top').replace("px", "") - window.getComputedStyle(this.clone[index][0], null).getPropertyValue('padding-bottom').replace("px", "") - window.getComputedStyle(this.clone[index][0], null).getPropertyValue('border-top-width').replace("px", "") - window.getComputedStyle(this.clone[index][0], null).getPropertyValue('border-bottom-width').replace("px", "") + 'px';

  var headerTable = _({
    tag: "thead"
  });

  headerTable.addChild(_({
    tag: "tr",
    child: [clone]
  }));

  var bodyTable = _({
    tag: "tbody"
  });

  if (isFull) this.cloneCellColumn(bodyTable, this.clone, index);

  var result = _({
    tag: "table",
    style: {
      cursor: "move"
    },
    class: "sortTableClone",
    child: [headerTable, bodyTable]
  });

  return result;
};

tableView.prototype.cloneCellColumn = function (bodyTable, cloneArray, index) {
  var clone, cell;

  for (var i = 1; i < cloneArray[index].length; i++) {
    clone = cloneArray[index][i].cloneNode(true);
    clone.style.width = cloneArray[index][i].offsetWidth - window.getComputedStyle(cloneArray[index][i], null).getPropertyValue('padding-left').replace("px", "") - window.getComputedStyle(cloneArray[index][i], null).getPropertyValue('padding-right').replace("px", "") - window.getComputedStyle(cloneArray[index][i], null).getPropertyValue('border-left-width').replace("px", "") - window.getComputedStyle(cloneArray[index][i], null).getPropertyValue('border-right-width').replace("px", "") + 'px';
    clone.style.height = cloneArray[index][i].offsetHeight - window.getComputedStyle(cloneArray[index][i], null).getPropertyValue('padding-top').replace("px", "") - window.getComputedStyle(cloneArray[index][i], null).getPropertyValue('padding-bottom').replace("px", "") - window.getComputedStyle(cloneArray[index][i], null).getPropertyValue('border-top-width').replace("px", "") - window.getComputedStyle(cloneArray[index][i], null).getPropertyValue('border-bottom-width').replace("px", "") + 'px';
    cell = _({
      tag: "tr",
      child: [clone]
    });
    cell.classList = cloneArray[index][i].parentNode.classList;
    if (cloneArray[index][i].colSpan !== undefined) clone.setAttribute("rowspan", "");
    bodyTable.addChild(cell);

    if (cloneArray[index][i].parentNode.clone !== undefined) {
      var cloneArrayTemp = cloneArray[index][i].parentNode.clone;
      this.cloneCellColumn(bodyTable, cloneArrayTemp, index);
    }
  }
};

tableView.prototype.cloneRow = function (index, isFull = false) {
  var clone;

  var headerTable = _({
    tag: "thead"
  });

  var bodyTable = _({
    tag: "tbody"
  });

  var result = _({
    tag: "table",
    style: {
      opacity: 0.7
    },
    class: "sortTableClone",
    child: [headerTable, bodyTable]
  });

  var row = _({
    tag: "tr"
  });

  if (index === 0) headerTable.addChild(row);else {
    bodyTable.addChild(row);
  }

  for (var i = 0; i < this.clone.length; i++) {
    if (this.clone[i][index] === undefined) continue;
    clone = this.clone[i][index].cloneNode(true);
    clone.style.width = this.clone[i][index].offsetWidth - window.getComputedStyle(this.clone[i][index], null).getPropertyValue('padding-left').replace("px", "") - window.getComputedStyle(this.clone[i][index], null).getPropertyValue('padding-right').replace("px", "") - window.getComputedStyle(this.clone[i][index], null).getPropertyValue('border-left-width').replace("px", "") - window.getComputedStyle(this.clone[i][index], null).getPropertyValue('border-right-width').replace("px", "") + 1 + 'px';
    clone.style.height = this.clone[i][index].offsetHeight - window.getComputedStyle(this.clone[i][index], null).getPropertyValue('padding-top').replace("px", "") - window.getComputedStyle(this.clone[i][index], null).getPropertyValue('padding-bottom').replace("px", "") - window.getComputedStyle(this.clone[i][index], null).getPropertyValue('border-top-width').replace("px", "") - window.getComputedStyle(this.clone[i][index], null).getPropertyValue('border-bottom-width').replace("px", "") + 'px';
    clone.setAttribute("colspan", "");
    row.appendChild(clone);
  }

  return result;
};

tableView.prototype.getBound2Colum = function (colum1, colum2, index) {
  var self = this;
  var left, right;
  var isShow = true;
  if (colum1 !== undefined) left = self.clone[colum1][0].offsetWidth / 2 + parseFloat(window.getComputedStyle(self.clone[colum1][0]).webkitBorderHorizontalSpacing) / 2;else left = 20 + parseFloat(window.getComputedStyle(self).paddingLeft);

  if (colum2 !== undefined) {
    right = self.clone[colum2][0].offsetWidth / 2 + parseFloat(window.getComputedStyle(self.clone[colum2][0]).webkitBorderHorizontalSpacing) / 2;
    if (self.clone[colum2][0].classList.contains("postionStickyCell")) isShow = false;
  } else right = 20 + parseFloat(window.getComputedStyle(self).paddingRight);

  var center = _({
    tag: "div",
    class: "move-hover-zone-center"
  });

  if (!isShow) {
    center.style.display = "none";
  }

  var temp = _({
    tag: "div",
    class: "move-hover-zone",
    style: {
      height: self.offsetHeight + "px"
    },
    on: {
      mouseover: isShow ? function () {
        if (this.parentNode.isMove === false) {
          self.moveColumn(self.clone, colum1, colum2, index);
        }
      } : undefined
    },
    child: [{
      tag: "div",
      class: "move-hover-zone-left",
      style: {
        width: left + 'px'
      }
    }, center, {
      tag: "div",
      class: "move-hover-zone-right",
      style: {
        width: right + 'px'
      }
    }]
  });

  return temp;
};

tableView.prototype.moveColumn = function (arrClone, colum1, colum2, index, i = 0) {
  var parent; // if(index==colum1)
  //     return;
  // if(index==colum2)
  //     return;

  var delta = 0,
      lastDelta;

  for (i; i < arrClone[index].length; i++) {
    parent = arrClone[index][i - delta].parentNode;

    if (colum2 !== undefined) {
      if (lastDelta > 0) {
        lastDelta--;
        continue;
      }

      parent.insertBefore(arrClone[index][i - delta], arrClone[colum2][i]);
    } else {
      parent.appendChild(arrClone[index][i]);
    }

    if (arrClone[index][i].rowSpan !== undefined) {
      delta += arrClone[index][i].rowSpan - 1;
      lastDelta = arrClone[index][i].rowSpan - 1;
    }

    if (arrClone[index][i - delta].parentNode.clone !== undefined) {
      this.moveColumn(arrClone[index][i - delta].parentNode.clone, colum1, colum2, index, 1);
    }
  }

  if (colum1 > index) {
    if (colum2 === undefined) arrClone.push(arrClone[index]);else arrClone.splice(colum2, 0, arrClone[index]);
    arrClone.splice(index, 1);
  }

  if (colum2 < index) {
    var tempElement = arrClone[index];
    arrClone.splice(index, 1);
    if (colum2 === undefined) arrClone.push(tempElement);else arrClone.splice(colum2, 0, tempElement);
  }
};

tableView.prototype.getHeightChild = function () {
  var result = 0;
  var self = this;
  var tempClone = self.childrenNodes;
  if (tempClone !== undefined) for (var i = 0; i < tempClone.length; i++) {
    result += tempClone[i].offsetHeight;
    if (tempClone[i].offsetHeight !== 0) result += parseFloat(window.getComputedStyle(tempClone[i]).webkitBorderVerticalSpacing);

    if (tempClone[i].childrenNodes.length !== 0) {
      result += tempClone[i].getHeightChild();
    }
  }
  return result;
};

tableView.prototype.getElementChild = function () {
  var result = [];
  var self = this;
  var tempClone = self.childrenNodes;
  if (tempClone !== undefined) for (var i = 0; i < tempClone.length; i++) {
    result.push(tempClone[i]);

    if (tempClone[i].childrenNodes.length !== 0) {
      result = result.concat(tempClone[i].getElementChild());
    }
  }
  return result;
};

tableView.prototype.getBound2Row = function (row1, row2) {
  var self = this;
  var top, bottom, elementReal;
  if (self.clone[0][row1] !== undefined) var style1 = window.getComputedStyle(self.clone[0][row1]);

  if (self.clone[0][row2] !== undefined) {
    var style2 = window.getComputedStyle(self.clone[0][row2]);
    elementReal = self.clone[0][row2].parentNode;
  } else {
    if (self.tagName !== "DIV") {
      if (self.clone[0][row1].parentNode.childrenNodes.length !== 0) {
        var x = self.clone[0][row1].parentNode.getElementChild();
        elementReal = x[x.length - 1].nextSibling;
      } else elementReal = self.clone[0][row1].parentNode.nextSibling;
    }
  }

  if (row1 !== undefined) {
    top = self.clone[0][row1].offsetHeight / 2 + parseFloat(style1.webkitBorderVerticalSpacing) / 2;
  } else top = parseFloat(window.getComputedStyle(self).paddingTop);

  if (row2 !== undefined) {
    if (self.clone[0][row2].parentNode.style.display === "none") return _({
      tag: "div"
    });
    bottom = self.clone[0][row2].offsetHeight / 2 + parseFloat(style2.webkitBorderVerticalSpacing) / 2;
    if (self.clone[0][row2].tagName !== "TH" && row1 === undefined) bottom = self.clone[0][row2].offsetHeight / 2;

    if (row1 !== undefined && self.clone[0][row2].parentNode.childrenNodes.length !== 0) {
      bottom += self.clone[0][row2].parentNode.getHeightChild();
    }
  } else {
    bottom = parseFloat(window.getComputedStyle(self).paddingBottom) + self.clone[0][row1].offsetHeight / 2;
  }

  if (row1 === undefined) {
    row1 = row2;
    row2++;
    if (self.clone[0][row1 + 1] !== undefined) elementReal = self.clone[0][row1 + 1].parentNode;
  }

  var temp = _({
    tag: "div",
    class: "move-hover-zone-topbot",
    props: {
      row1: row1,
      row2: row2,
      elementReal: elementReal
    },
    style: {
      width: self.offsetWidth + "px" // backgroundColor:random_bg_color()

    },
    on: {
      mouseover: function () {}
    },
    child: [{
      tag: "div",
      class: "move-hover-zone-top",
      style: {
        height: top - 4 + 'px'
      }
    }, {
      tag: "div",
      class: "move-hover-zone-middle"
    }, {
      tag: "div",
      class: "move-hover-zone-bottom",
      style: {
        height: bottom + 4 + 'px'
      }
    }]
  });

  return temp;
};

function compareIncrease(valueA, valueB) {
  if (typeof valueA === "string") valueA = valueA.toLowerCase();
  if (typeof valueB === "string") valueB = valueB.toLowerCase();
  if (valueA > valueB) return -1;
  if (valueA < valueB) return 1;
  return 0;
}

function sortArray(arr, index, increase = true) {
  var check = [];
  var result = [];
  var indexLength;
  if (arr.length === 0) return [];

  for (var i = 0; i < arr.length; i++) {
    var object = arr[i].getRowMerge;
    if (check[JSON.stringify(JSON.stringify(object))]) continue;
    indexLength = object.length;

    for (var j = 0; j < object.length; j++) {
      if (check[JSON.stringify(object[j])]) {
        indexLength--;
        continue;
      }

      check[JSON.stringify(object[j])] = object[j];
    }

    if (indexLength > 0) {
      check[JSON.stringify(object)] = object;
      result.push(object);
    }
  }

  if (increase) {
    result.sort(function (prev, next) {
      var a = prev[0];
      var b = next[0];
      if (prev.length === 1) if (a.child !== undefined) {
        sortArray(a.child, index, increase);
      }
      if (a[index].valuesort) var valueA = a[index].valuesort;else var valueA = a[index].value;
      if (b[index].valuesort) var valueB = b[index].valuesort;else var valueB = b[index].value;
      if (valueA === undefined) valueA = a[index];
      if (valueB === undefined) valueB = b[index];
      return compareIncrease(valueA, valueB);
    });
    if (result.length !== 0) if (result[result.length - 1].length === 1) {
      if (result[result.length - 1][0].child !== undefined) sortArray(result[result.length - 1][0].child, index, increase);
    }
  } else {
    result.sort(function (prev, next) {
      var a = prev[0];
      var b = next[0];
      if (prev.length === 1) if (a.child !== undefined) sortArray(a.child, index, increase);
      if (a[index].valuesort) var valueA = a[index].valuesort;else var valueA = a[index].value;
      if (b[index].valuesort) var valueB = b[index].valuesort;else var valueB = b[index].value;
      if (valueA === undefined) valueA = a[index];
      if (valueB === undefined) valueB = b[index];
      return compareIncrease(valueB, valueA);
    });
    if (result.length !== 0) if (result[result.length - 1].length === 1) {
      if (result[result.length - 1][0].child !== undefined) sortArray(result[result.length - 1][0].child, index, increase);
    }
  }

  arr.splice(0, arr.length);

  for (var param in result) {
    for (var i = 0; i < result[param].length; i++) {
      result[param][i].oldIndex = i;
      arr.push(result[param][i]);
    }
  }

  return arr;
}

function getDate() {
  var today = new Date();
  var dd = String(today.getDate()).padStart(2, '0');
  var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!

  var yyyy = today.getFullYear();
  today = dd + '/' + mm + '/' + yyyy;
  return today;
}

function random_bg_color() {
  var x = Math.floor(Math.random() * 256);
  var y = Math.floor(Math.random() * 256);
  var z = Math.floor(Math.random() * 256);
  var bgColor = "rgb(" + x + "," + y + "," + z + ")";
  return bgColor;
}

function allowNumbersOnly(e) {
  var code = e.which ? e.which : e.keyCode;

  if ((code > 122 || code < 97) && code != 45) {
    e.preventDefault();
  }
}

function createAlias(string) {
  var value = "";
  string = string.toLowerCase();
  string = removeAccents(string);

  for (var i = 0; i < string.length; i++) {
    if (string[i] == " ") {
      value += "-";
      continue;
    }

    if ((string[i] > "z" || string[i] < "a") && string[i] != "-") {
      continue;
    }

    value += string[i];
  }

  return value.replace(/^\-+|\-+$/gm, '');
  ;
}

function removeAccents(str) {
  return str.normalize('NFD').replace(/[\u0300-\u036f]/g, '').replace(/đ/g, 'd').replace(/Đ/g, 'D');
}

function deleteQuestion(title, content, yes = "Có", no = "không") {
  var contentElement;

  if (typeof content !== "object") {
    contentElement = _({
      tag: "span",
      class: "module-delete-header-content",
      props: {
        innerHTML: content
      }
    });
  } else {
    contentElement = content;
  }

  var temp;
  var promiseComfirm = new Promise(function (resolve, reject) {
    temp = _({
      tag: "modal",
      class: "modal-delete-module",
      child: [{
        tag: "div",
        class: "module-delete-container",
        child: [{
          tag: "div",
          class: "module-delete-header",
          child: [{
            tag: "span",
            class: "module-delete-header-title",
            props: {
              innerHTML: title
            }
          }, {
            tag: "div",
            class: "module-delete-header-close-container",
            on: {
              click: function (event) {
                temp.selfRemove();
                reject();
              }
            },
            child: [{
              tag: "i",
              class: ["module-delete-header-close", "material-icons"],
              props: {
                innerHTML: "close"
              }
            }]
          }]
        }, {
          tag: "div",
          class: "module-delete-content",
          child: [contentElement]
        }, {
          tag: "div",
          class: "module-delete-button",
          child: [{
            tag: "button",
            class: "module-delete-button-yes",
            on: {
              click: function (event) {
                temp.selfRemove();
                setTimeout(function () {
                  resolve();
                }, 60);
              }
            },
            child: [{
              tag: "span",
              class: "module-delete-button-yes-label",
              props: {
                innerHTML: yes
              }
            }]
          }, {
            tag: "button",
            class: "module-delete-button-no",
            on: {
              click: function (event) {
                temp.selfRemove();
                reject();
              }
            },
            child: [{
              tag: "span",
              class: "module-delete-button-no-label",
              props: {
                innerHTML: no
              }
            }]
          }]
        }]
      }]
    });
  });
  temp.promiseComfirm = promiseComfirm;
  return temp;
}

function confirmQuestion(title, content, yes = "OK") {
  var contentElement;

  if (typeof content !== "object") {
    contentElement = _({
      tag: "span",
      class: "module-delete-header-content",
      props: {
        innerHTML: content
      }
    });
  } else {
    contentElement = content;
  }

  var temp;
  var promiseComfirm = new Promise(function (resolve, reject) {
    temp = _({
      tag: "modal",
      class: "modal-delete-module",
      child: [{
        tag: "div",
        class: "module-delete-container",
        child: [{
          tag: "div",
          class: "module-delete-header",
          child: [{
            tag: "span",
            class: "module-delete-header-title",
            props: {
              innerHTML: title
            }
          }, {
            tag: "div",
            class: "module-delete-header-close-container",
            on: {
              click: function (event) {
                temp.selfRemove();
                reject();
              }
            },
            child: [{
              tag: "i",
              class: ["module-delete-header-close", "material-icons"],
              props: {
                innerHTML: "close"
              }
            }]
          }]
        }, {
          tag: "div",
          class: "module-delete-content",
          child: [contentElement]
        }, {
          tag: "div",
          class: "module-delete-button",
          child: [{
            tag: "button",
            class: "module-delete-button-yes",
            on: {
              click: function (event) {
                temp.selfRemove();
                resolve();
              }
            },
            child: [{
              tag: "span",
              class: "module-delete-button-yes-label",
              props: {
                innerHTML: yes
              }
            }]
          }]
        }]
      }]
    });
  });
  temp.promiseComfirm = promiseComfirm;
  return temp;
}
};

moduleFactories["node_modules/pizo/js/component/ModuleDatabase.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/ModuleDatabase.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _FormatFunction = require("./FormatFunction");

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }

var moduleDatabase = new ModuleDatabase();

function ModuleDatabase() {
  this.hostDatabase = "https://lab.daithangminh.vn/home_co/pizo/php/template/";
  this.data = [];
}

ModuleDatabase.prototype.getModule = function (name, listFilePHP, isCreated = false) {
  if (isCreated == true || this.data[name] == undefined) {
    this.data[name] = new DataStructure(this.hostDatabase, name, listFilePHP);
    return this.data[name];
  } else return this.data[name];
};

function DataStructure(hostDatabase, name, listFilePHP = ["load.php", "add.php", "update.php", "delete.php"]) {
  this.phpLoader = hostDatabase + listFilePHP[0];
  this.phpAdder = hostDatabase + listFilePHP[1];
  this.phpUpdater = hostDatabase + listFilePHP[2];
  this.phpDeleter = hostDatabase + listFilePHP[3];
  var nameTemp = name;
  var self = this;
  self.prefix = [];
  Object.defineProperty(this, "name", {
    get() {
      return nameTemp;
    },

    set(value) {
      self.prefix[nameTemp] = [self.Libary, self.countRow, self.data, self.isFirst, self.promiseLoad, self.promisePart, self.sync];
      nameTemp = value;

      if (self.prefix[nameTemp]) {
        self.Libary = self.prefix[nameTemp][0];
        self.countRow = self.prefix[nameTemp][1];
        self.data = self.prefix[nameTemp][2];
        self.isFirst = self.prefix[nameTemp][3];
        self.promiseLoad = self.prefix[nameTemp][4];
        self.promisePart = self.prefix[nameTemp][5];
        self.sync = self.prefix[nameTemp][6];
      } else {
        self.Libary = [];
        self.sync = [];
        self.promisePart = [];
        self.isFirst = true;
        self.countRow = undefined;
        self.data = [];
        self.promiseLoad = undefined;
      }
    }

  });
  this.Libary = [];
  this.sync = [];
  this.promisePart = [];
  this.isFirst = true;
}

DataStructure.prototype.load = function (data = [], isLoaded = false) {
  var self = this;

  if (data.WHERE == undefined) {
    if (isLoaded == false && self.promiseLoad !== undefined) {
      if (self.promiseLoad.status === "pending") return self.promiseLoad;else return Promise.resolve(self.data);
    }
  } else {
    if (isLoaded == false && self.promisePart[JSON.stringify(data.WHERE)] !== undefined) {
      if (self.promisePart[JSON.stringify(data.WHERE)].status === "pending") return self.promisePart[JSON.stringify(data.WHERE)];else return Promise.resolve(self.promisePart[JSON.stringify(data.WHERE)].data);
    }
  }

  var promiseLoad;

  if (this.isFirst === true && data.WHERE !== undefined) {
    data.isFirst = true;
    this.isFirst = false;
  }

  if (data.loaded === undefined) {
    data.loaded = {};
  }

  if (data.loaded[this.name] == undefined) data.loaded[this.name] = [];
  if (data.WHERE !== undefined) if (self.data !== undefined && self.data.length !== 0) {
    for (var i = 0; i < self.data.length; i++) {
      if ((0, _FormatFunction.generalOperator)(self.data[i], data.WHERE)) {
        data.loaded[this.name].push(self.data[i]["id"]);
      }
    }
  } else if (self.data !== undefined && self.data.length !== 0) {
    for (var i = 0; i < self.data.length; i++) {
      data.loaded[this.name].push(self.data[i]["id"]);
    }
  }
  promiseLoad = new Promise(function (resolve, reject) {
    self.queryData(self.phpLoader, data).then(function (valueRecived) {
      var value = valueRecived["data"];
      var update = valueRecived["update"];
      var insert = valueRecived["add"];

      if (insert !== undefined) {
        for (var i = 0; i < value.add.length; i++) {
          for (var param in insert[i]) {
            if (moduleDatabase.data[param] !== undefined) {
              moduleDatabase.data[param].setFormatAdd(insert[i][param]);
            }
          }
        }
      }

      if (update !== undefined) {
        for (var i = 0; i < update.length; i++) {
          for (var param in update[i]) {
            if (moduleDatabase.data[param] !== undefined) {
              moduleDatabase.data[param].setFormatUpdate(update[i][param]);
            }
          }
        }
      }

      self.setFormatLoad(data, value, promiseLoad, valueRecived["count"]); // var loadedData = valueRecived["load"];
      // console.log(loadedData)
      // for(var param in loadedData)
      // {
      //     console.log(moduleDatabase[param])
      //     moduleDatabase.getModule(param).setFormatLoad({WHERE:data.WHERE},loadedData[param])
      // }

      resolve(value);
    }).catch(function (error) {
      promiseLoad.status = "reject";
      reject(error);
      console.error(error);
    });
  });
  promiseLoad.status = "pending";
  if (data.WHERE === undefined) self.promiseLoad = promiseLoad;else self.promisePart[JSON.stringify(data.WHERE)] = promiseLoad;
  return promiseLoad;
};

DataStructure.prototype.setFormatLoad = function (data, value, promiseLoad, count = -1) {
  var self = this;
  if (value === undefined) value = [];
  if (self.data === undefined) self.data = [];

  if (data.WHERE === undefined) {
    self.countRow = value.length;
  } else {
    if (promiseLoad == undefined) {
      self.promisePart[JSON.stringify(data.WHERE)] = Promise.resolve(value);
      self.promisePart[JSON.stringify(data.WHERE)].data = value;
    }

    if (data.isFirst === true) {
      if (count !== -1) self.countRow = parseInt(count);
    }
  }

  var libary = self.Libary["id"];

  if (libary === undefined) {
    self.data = _toConsumableArray(value);
    self.getLibary("id");
  } else {
    if (self.data.length === self.countRow) {
      if (self.promiseLoad === undefined) self.promiseLoad = Promise.resolve(self.data);
    }

    for (var i = 0; i < value.length; i++) {
      if (typeof value[i] == "string") {
        if (self.Libary["id"][value[i]] !== undefined) {
          value[i] = self.Libary["id"][value[i]];
        }
      } else {
        self.setFormatAdd(value[i]);
      }
    }
  }

  if (typeof promiseLoad == "object") {
    promiseLoad.status = "done";
    promiseLoad.data = value;
  }
};

DataStructure.prototype.getLibary = function (param, formatFunction, isArray = false, isLoaded = false) {
  if (formatFunction === undefined) formatFunction = function (data) {
    return data;
  };

  if (param !== undefined) {
    if (Array.isArray(param) === false) {
      param = [param];
    } else param = param;

    for (var j = 0; j < param.length; j++) {
      if (isLoaded === true || this.Libary[param] == undefined) {
        this.setLibary(param, formatFunction, isArray);
        if (this.data) for (var i = 0; i < this.data.length; i++) {
          this.setLibaryRow(this.data[i], param[j]);
        }
      }
    }

    if (param.length == 1) {
      if (this.Libary[param[0]] == undefined) this.Libary[param[0]] = [];
      return this.Libary[param[0]];
    }
  } else {
    var isID = false;

    for (var param in this.Libary) {
      if (param === "id") isID = true;
      this.setLibary(param, formatFunction, isArray);
      if (this.data) for (var i = 0; i < this.data.length; i++) {
        this.setLibaryRow(this.data[i], param, formatFunction, isArray);
      }
    }

    if (isID === false) {
      this.setLibary("id", formatFunction, isArray);
      if (this.data) for (var i = 0; i < this.data.length; i++) {
        this.setLibaryRow(this.data[i], "id", formatFunction, isArray);
      }
    }
  }

  return this.Libary;
};

DataStructure.prototype.sync = function (element, functionSync) {
  this.sync.push(element, functionSync);
};

DataStructure.prototype.setLibary = function (param, formatFunction, isArray) {
  if (this.Libary[param] === undefined) {
    this.Libary[param] = [];
    this.Libary[param].isArray = isArray;
    this.Libary[param].check = [];

    this.Libary[param].formatFunction = function (data, param) {
      var result = formatFunction(data);

      result.getData = function () {
        return data;
      };

      if (this.check[data["id"]] !== undefined) return;
      this.check[data["id"]] = result;

      if (this[data[param]] == undefined || this[data[param]].index == 0) {
        if (this.isArray == true) this[data[param]] = [result];else this[data[param]] = result;
        this[data[param]].index = 1;
      } else {
        if (this[data[param]].index == 1 && this.isArray !== true) {
          this[data[param]] = [this[data[param]]];
        }

        this[data[param]].push(result);
        this[data[param]].index++;
      }
    };

    this.Libary[param].deleteFunction = function (data, param) {
      if (this[data[param]].index == 1 && this.isArray !== true) delete this[data[param]];else for (var i = 0; i < this[data[param]].length; i++) {
        if (this[data[param]][i].getData() === data) {
          this[data[param]].splice(i, 1);
        }
      }

      if (this[data[param]] !== undefined) {
        this[data[param]].index--;
        if (this[data[param]].index == 1 && this.isArray !== true) this[data[param]] = this[data[param]][0];
      }

      if (this.check[data["id"]] !== undefined) this.check[data["id"]] = undefined;
    };
  }
};

DataStructure.prototype.setLibaryRow = function (data, param) {
  data.getList = function (name, value) {
    var text = "";

    for (var i = 0; i < name.length; i++) {
      if (data[name] === undefined) text += name[i];else text += data[name[i]];
    }

    var checkvalue = "";
    var isFirst = "";

    for (var i = 0; i < value.length; i++) {
      if (data[value[i]] === undefined) checkvalue += value[i];else checkvalue += isFirst + data[value[i]];
      isFirst = "_";
    }

    return {
      text: text,
      value: checkvalue
    };
  };

  this.Libary[param].formatFunction(data, param);
};

DataStructure.prototype.getList = function (param, value, skip) {
  var result = [];
  if (skip == undefined) skip = function () {};

  if (Array.isArray(param) != true) {
    param = [param];
  }

  if (Array.isArray(value) != true) {
    value = [value];
  }

  for (var i = 0; i < this.data.length; i++) {
    if (skip(this.data[i])) continue;
    result.push(this.data[i].getList(param, value));
  }

  return result;
};

DataStructure.prototype.add = function (data, needChange = false) {
  var self = this;
  return new Promise(function (resolve, reject) {
    self.queryData(self.phpAdder, data).then(function (value) {
      if (!Array.isArray(value.data)) Object.assign(data, value.data);

      if (needChange === true) {
        data.add = Object.assign({}, value.add);
        data.update = Object.assign({}, value.update);
        data.delete = Object.assign({}, value.delete);
      }

      self.setFormatAdd(data);
      var update = value["update"];
      var insert = value["add"];
      var deleteValue = value["delete"];

      if (insert !== undefined) {
        for (var i = 0; i < value.add.length; i++) {
          for (var param in insert[i]) {
            if (moduleDatabase.data[param] !== undefined) {
              moduleDatabase.data[param].setFormatAdd(insert[i][param]);
            }
          }
        }
      }

      if (update !== undefined) {
        for (var i = 0; i < update.length; i++) {
          for (var param in update[i]) {
            if (moduleDatabase.data[param] !== undefined) {
              moduleDatabase.data[param].setFormatUpdate(update[i][param]);
            }
          }
        }
      }

      if (deleteValue !== undefined) {
        for (var i = 0; i < deleteValue.length; i++) {
          for (var param in deleteValue[i]) {
            if (moduleDatabase.data[param] !== undefined) {
              moduleDatabase.data[param].setFormatDelete(deleteValue[i][param]);
            }
          }
        }
      }

      resolve(data);
    }).catch(function (err) {
      reject(err);
      console.error(err);
    });
  });
};

DataStructure.prototype.setFormatAdd = function (data) {
  var self = this;

  if (Array.isArray(data)) {
    for (var i = 0; i < data.length; i++) {
      self.setFormatAdd(data[i]);
    }

    return;
  }

  if (self.Libary["id"] !== undefined && self.Libary["id"][data.id] !== undefined) return;

  for (var param in self.Libary) {
    if (typeof self.Libary[param] != "function") self.Libary[param].formatFunction(data, param);
  }

  data.getList = function (name, value) {
    var text = "";

    for (var i = 0; i < name.length; i++) {
      if (data[name] === undefined) text += name[i];else text += data[name[i]];
    }

    var checkvalue = "";
    var isFirst = "";

    for (var i = 0; i < value.length; i++) {
      if (data[value[i]] === undefined) checkvalue += value[i];else checkvalue += isFirst + data[value[i]];
      isFirst = "_";
    }

    return {
      text: text,
      value: checkvalue
    };
  };

  if (self.data == undefined) {
    self.data = [];
    self.countRow = 0;
  }

  self.data.push(data);
  self.countRow++;
};

DataStructure.prototype.update = function (data, needChange = false) {
  var self = this;
  return new Promise(function (resolve, reject) {
    self.queryData(self.phpUpdater, data).then(function (value) {
      if (data.id !== undefined) {
        if (needChange === true) {
          data.add = Object.assign({}, value.add);
          data.update = Object.assign({}, value.update);
          data.delete = Object.assign({}, value.delete);
        }

        Object.assign(data, value.data);
        self.setFormatUpdate(value.data);
        var update = value["update"];
        var insert = value["add"];
        var deleteValue = value["delete"];

        if (insert !== undefined) {
          for (var i = 0; i < value.add.length; i++) {
            for (var param in insert[i]) {
              if (moduleDatabase.data[param] !== undefined) {
                moduleDatabase.data[param].setFormatAdd(insert[i][param]);
              }
            }
          }
        }

        if (update !== undefined) {
          for (var i = 0; i < update.length; i++) {
            for (var param in update[i]) {
              if (moduleDatabase.data[param] !== undefined) {
                moduleDatabase.data[param].setFormatUpdate(update[i][param]);
              }
            }
          }
        }

        if (deleteValue !== undefined) {
          for (var i = 0; i < deleteValue.length; i++) {
            for (var param in deleteValue[i]) {
              if (moduleDatabase.data[param] !== undefined) {
                moduleDatabase.data[param].setFormatDelete(deleteValue[i][param]);
              }
            }
          }
        }
      }

      resolve(data);
    }).catch(function (err) {
      reject(err);
      console.error(err);
    });
  });
};

DataStructure.prototype.setFormatUpdate = function (data) {
  var self = this;
  if (data == undefined || data.id == undefined) return;
  var temp = self.Libary["id"][data.id];

  for (var param in data) {
    if (self.Libary[param] !== undefined && typeof self.Libary[param] != "function") {
      if (temp[param] == data[param]) continue;
      self.Libary[param].deleteFunction(temp, param);
      temp[param] = data[param];
      self.Libary[param].formatFunction(temp, param);
    } else temp[param] = data[param];
  }

  for (var param in this.promisePart) {
    if ((0, _FormatFunction.generalOperator)(temp, JSON.parse(param)) === true) {
      if (this.promisePart[param].data.indexOf(temp) === -1) {
        this.promisePart[param].data.push(temp);
      }
    } else {
      var index = this.promisePart[param].data.indexOf(temp);
      if (index !== -1) this.promisePart[param].data.splice(index, 1);
    }
  }
};

DataStructure.prototype.setFormatDelete = function (data) {
  var self = this;

  if (data.id !== undefined) {
    var temp = self.Libary["id"][data.id];

    for (var param in self.Libary) {
      if (typeof self.Libary[param] != "function") self.Libary[param].deleteFunction(temp, param);
    }

    self.data.splice(self.data.indexOf(temp), 1);
    self.countRow--;
  }
};

DataStructure.prototype.delete = function (data) {
  var self = this;
  return new Promise(function (resolve, reject) {
    self.queryData(self.phpDeleter, data).then(function (value) {
      if (value.data) Object.assign(data, value.data);
      self.setFormatDelete(data);
      var update = value["update"];
      var insert = value["add"];
      var deleteValue = value["delete"];

      if (insert !== undefined) {
        for (var i = 0; i < value.add.length; i++) {
          for (var param in insert[i]) {
            if (moduleDatabase.data[param] !== undefined) {
              moduleDatabase.data[param].setFormatAdd(insert[i][param]);
            }
          }
        }
      }

      if (update !== undefined) {
        for (var i = 0; i < update.length; i++) {
          for (var param in update[i]) {
            if (moduleDatabase.data[param] !== undefined) {
              moduleDatabase.data[param].setFormatUpdate(update[i][param]);
            }
          }
        }
      }

      if (deleteValue !== undefined) {
        for (var i = 0; i < deleteValue.length; i++) {
          for (var param in deleteValue[i]) {
            if (moduleDatabase.data[param] !== undefined) {
              moduleDatabase.data[param].setFormatDelete(deleteValue[i][param]);
            }
          }
        }
      }

      resolve();
    }).catch(function (err) {
      reject(err);
      console.error(err);
    });
  });
};

DataStructure.prototype.queryData = function (phpFile, data, name = "") {
  var self = this;
  var result = {};

  if (self.name !== undefined) {
    name = self.name;
  }

  if (this.hostDatabase !== undefined) phpFile = this.hostDatabase + phpFile;

  for (var param in data) {
    if (typeof data[param] == "function") continue;
    result[param] = data[param];
  }

  return new Promise(function (resolve, reject) {
    FormClass.api_call({
      url: phpFile,
      params: [{
        name: "name",
        value: name
      }, {
        name: "userid",
        value: window.userid
      }, {
        name: "data",
        value: EncodingClass.string.fromVariable(result)
      }],
      func: function (success, message) {
        if (success) {
          if (message.substr(0, 2) == "ok") {
            var st = EncodingClass.string.toVariable(message.substr(2));
            resolve(st);
          } else {
            reject(message);
          }
        }
      }
    });
  });
};

ModuleDatabase.prototype.queryData = DataStructure.prototype.queryData;
var _default = moduleDatabase;
exports.default = _default;
};

moduleFactories["node_modules/pizo/js/component/BaseView.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/BaseView.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _EventEmitter = _interopRequireDefault(require("absol/src/HTML5/EventEmitter"));

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _CMDRunner = _interopRequireDefault(require("absol/src/AppPattern/CMDRunner"));


function BaseView() {
  _EventEmitter.default.call(this);

  _Fragment.default.call(this);

  this.cmdRunner = new _CMDRunner.default(this);
  this.loadConfig();
}

Object.defineProperties(BaseView.prototype, Object.getOwnPropertyDescriptors(_EventEmitter.default.prototype));
Object.defineProperties(BaseView.prototype, Object.getOwnPropertyDescriptors(_Fragment.default.prototype));
BaseView.prototype.constructor = BaseView;
BaseView.prototype.CONFIG_STORE_KEY = "AS_BaseView_config";
BaseView.prototype.config = {}; //share width differentInstance

BaseView.prototype.loadConfig = function () {
  var raw = localStorage.getItem(this.CONFIG_STORE_KEY);

  if (raw) {
    try {
      Object.assign(this.config, JSON.parse(raw));
    } catch (error) {
      console.error("Config fail:", error);
    }
  }
};

BaseView.prototype.saveConfig = function () {
  if (this._saveConfigTimeOut > 0) {
    clearTimeout(this._saveConfigTimeOut);
    this._saveConfigTimeOut = -1;
  }

  var self = this;
  setTimeout(function () {
    var raw = JSON.stringify(self.config);
    localStorage.setItem(self.CONFIG_STORE_KEY, raw);
  }, 2000);
};

BaseView.prototype.setData = function (data) {
  throw new Error('Not implement!');
};

BaseView.prototype.getData = function () {
  throw new Error('Not implement!');
};

BaseView.prototype.getComponentTool = function () {
  return undefined;
};

BaseView.prototype.getOutlineTool = function () {
  return undefined;
};

BaseView.prototype.notifyDataChange = function () {
  this.emit('datachange', {
    type: 'datachange',
    target: this
  }, this);
};

BaseView.prototype.execCmd = function () {
  return this.cmdRunner.invoke.apply(this.cmdRunner, arguments);
};

var _default = BaseView;
exports.default = _default;
};

moduleFactories["node_modules/pizo/js/component/EditHelpContainer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/EditHelpContainer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseView = _interopRequireDefault(require("./BaseView"));

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _CMDRunner = _interopRequireDefault(require("absol/src/AppPattern/CMDRunner"));

require("../../css/EditHelpContainer.css");

var _R = _interopRequireDefault(require("../R"));

var _Fcore = _interopRequireDefault(require("../dom/Fcore"));

require("../../css/NewCategory.css");

var _ModuleView = require("./ModuleView");

var _ModuleDatabase = _interopRequireDefault(require("../component/ModuleDatabase"));

var _FormatFunction = require("./FormatFunction");


var _ = _Fcore.default._;
var $ = _Fcore.default.$;

function EditHelpContainer() {
  _BaseView.default.call(this);

  _Fragment.default.call(this);

  this.cmdRunner = new _CMDRunner.default(this);
  this.loadConfig();
  var self = this;
  if (this.$view) return this.$view;

  var input = _({
    tag: "input",
    class: "input-search-list",
    props: {
      type: "text",
      placeholder: "Search"
    }
  });

  var tabContainer = _({
    tag: "div",
    class: "header-display-visible",
    child: [{
      tag: "div",
      class: "js-stools-container-bar",
      child: [{
        tag: "div",
        class: ["absol-tabbar-button", "absol-tabbar-button-active"],
        child: [{
          tag: "div",
          class: "absol-tabbar-button-text",
          props: {
            innerHTML: "Menu"
          }
        }]
      }, {
        tag: "div",
        class: ["btn-wrapper", "input-append"],
        child: [input]
      }]
    }]
  });

  this.$view = _({
    tag: "div",
    class: "b-workZone__layout",
    child: [{
      tag: "div",
      class: ["b-workZone__side", "m-workZone__side__nav"],
      style: {
        height: "calc(100% - 50px)",
        top: "50px"
      },
      child: [{
        tag: "div",
        class: ["b-workZone__content", "m-workZone__content__nav"],
        props: {
          id: "workZone_nav"
        },
        child: [{
          tag: "div",
          class: "absol-tab-frame-small",
          child: [tabContainer]
        }]
      }]
    }]
  });
  Object.assign(this.$view, EditHelpContainer.prototype);
  var editor = this.$view.itemEdit();
  var editorBottom = this.$view.itemEditRelated();

  var listParent = _({
    tag: "selecttreemenu",
    class: ["pizo-new-state-selectbox-container-input", "pizo-new-realty-dectruct-input"],
    style: {
      backGroundColor: ""
    },
    props: {
      enableSearch: true
    }
  });

  listParent.updateItemList = function () {
    listParent.items = self.$view.formatDataRowChoice(self.$view.getDataCurrent());
  };

  var active = _({
    tag: "switch"
  });

  var updateTableFunction;

  var containerEditView = _({
    tag: "div",
    class: "b-article",
    style: {
      display: "none"
    },
    child: [{
      tag: "div",
      class: "pizo-new-category-container-name",
      child: [{
        tag: "div",
        class: "pizo-new-category-container-name-container",
        child: [{
          tag: "span",
          class: "pizo-new-category-container-name-container-label",
          props: {
            innerHTML: "Tên"
          }
        }, {
          tag: "input",
          class: ["pizo-new-category-container-name-container-input", "pizo-new-realty-dectruct-input"],
          on: {
            change: function (event) {
              if (self.$view.alias.value === "" || self.$view.aliasErorr.classList.contains("hasErrorElement")) {
                self.$view.alias.value = (0, _ModuleView.createAlias)(this.value);
                self.$view.alias.dispatchEvent(new Event("input"));
              }
            },
            blur: function () {
              self.$view.saveDataCurrent();
            }
          }
        }]
      }]
    }, {
      tag: "div",
      class: "b-article__headerLayout-edit",
      props: {
        id: "article__header"
      },
      child: [{
        tag: "div",
        class: ["b-article__headerSide", "m-article__headerSide__nav"],
        props: {
          id: "headerSide__nav"
        },
        child: [{
          tag: "ul",
          class: "b-breadCrumbs__items",
          child: [{
            tag: "div",
            class: "pizo-new-catergory-container",
            child: [{
              tag: "div",
              class: "pizo-new-category-container-alias-active",
              child: [{
                tag: "div",
                class: "pizo-new-category-container-alias",
                child: [{
                  tag: "div",
                  class: "pizo-new-category-container-alias-container",
                  child: [{
                    tag: "span",
                    class: "pizo-new-category-container-alias-container-label",
                    props: {
                      innerHTML: "Alias"
                    },
                    child: [{
                      tag: "span",
                      class: "pizo-new-realty-location-detail-row-label-important",
                      props: {
                        innerHTML: "*"
                      }
                    }]
                  }, {
                    tag: "input",
                    class: ["pizo-new-category-container-alias-container-input", "pizo-new-realty-dectruct-input"],
                    on: {
                      input: function (event) {
                        var parent = this.parentNode.parentNode;

                        if (this.value == "") {
                          if (!parent.classList.contains("hasErrorElement")) parent.classList.add("hasErrorElement");
                          if (!parent.classList.contains("invalid-error")) parent.classList.add("invalid-error");
                        } else {
                          if (parent.classList.contains("invalid-error")) parent.classList.remove("invalid-error");
                        }

                        if (listParent.items.check[this.value] !== undefined && self.$view.rowSelected.data.original.alias !== this.value) {
                          if (!parent.classList.contains("hasErrorElement")) parent.classList.add("hasErrorElement");
                          if (!parent.classList.contains("used-error")) parent.classList.add("used-error");
                        } else {
                          if (parent.classList.contains("used-error")) parent.classList.remove("used-error");
                        }

                        if (!parent.classList.contains("used-error") && !parent.classList.contains("invalid-error") && parent.classList.contains("hasErrorElement")) parent.classList.remove("hasErrorElement");
                      },
                      keypress: function (event) {
                        (0, _ModuleView.allowNumbersOnly)(event);
                      },
                      blur: function () {
                        self.$view.saveDataCurrent();
                      }
                    }
                  }]
                }, {
                  tag: "span",
                  class: ["pizo-new-realty-location-detail-row-label-important", "label-used-error"],
                  props: {
                    innerHTML: "Alias không có sẳn để sử dụng"
                  }
                }, {
                  tag: "span",
                  class: ["pizo-new-realty-location-detail-row-label-important", "label-invalid-error"],
                  props: {
                    innerHTML: "Alias không thể để trống"
                  }
                }]
              }, {
                tag: "div",
                class: "pizo-new-state-publish",
                child: [{
                  tag: "div",
                  class: "pizo-new-state-publish-container",
                  child: [{
                    tag: "span",
                    class: "pizo-new-category-container-publish-container-label",
                    props: {
                      innerHTML: "Xuất bản"
                    }
                  }, active]
                }]
              }]
            }, {
              tag: "div",
              class: "pizo-new-state-selectbox",
              child: [{
                tag: "div",
                class: "pizo-new-state-selectbox-container",
                child: [{
                  tag: "span",
                  class: "pizo-new-state-selectbox-container-label",
                  props: {
                    innerHTML: "Danh mục cha"
                  }
                }, listParent]
              }]
            }]
          }]
        }]
      }]
    }, {
      tag: "div",
      class: ["b-article__wrapper", "os-host", "os-theme-dark", "os-host-resize-disabled", "os-host-scrollbar-horizontal-hidden", "os-host-overflow", "os-host-overflow-y", "os-host-transition"],
      child: [editor]
    }, {
      tag: "div",
      class: ["b-article__wrapper", "os-host-bottom", "os-theme-dark", "os-host-resize-disabled", "os-host-scrollbar-horizontal-hidden", "os-host-overflow", "os-host-overflow-y", "os-host-transition"],
      child: [editorBottom]
    }]
  });

  var containerPreview = this.$view.editViewContent();
  this.$view.containerEditView = containerEditView;
  this.$view.containerPreview = containerPreview;
  this.$view.addChild(_({
    tag: "div",
    class: ["b-workZone__side", "m-workZone__side__article"],
    props: {
      id: "workZone_article"
    },
    child: [{
      tag: "div",
      class: "b-workZone__content",
      props: {
        id: "workZone_article__content"
      },
      child: [containerEditView, containerPreview]
    }]
  }));

  _ModuleDatabase.default.getModule("helps").load({
    ORDERING: "parent_id , ordering"
  }).then(function (value) {
    var header = [{
      type: "dragzone",
      style: {
        width: "30px"
      }
    }, {
      value: "Title",
      sort: true,
      functionClickAll: self.$view.functionClickDetail.bind(self.$view),
      style: {
        minWidth: "unset !important"
      }
    }, {
      value: "Publish",
      style: {
        width: "67px"
      }
    }, {
      type: "detail",
      functionClickAll: self.$view.functionClickMore.bind(self.$view),
      icon: "",
      style: {
        width: "30px"
      }
    }];
    self.$view.mTable = new _ModuleView.tableView(header, self.$view.formatDataRow(value), false, true, 1);
    tabContainer.addChild(self.$view.mTable);
    updateTableFunction = self.$view.mTable.updateTable.bind(self.$view.mTable);

    self.$view.mTable.updateTable = function () {
      self.$view.resetChoice();
      updateTableFunction.apply(self.$view.mTable, arguments);
    };

    self.$view.mTable.addInputSearch(input);
  });

  this.$view.tabContainer = tabContainer;
  this.$view.name = $('input.pizo-new-category-container-name-container-input.pizo-new-realty-dectruct-input', this.$view);
  this.$view.alias = $('input.pizo-new-category-container-alias-container-input.pizo-new-realty-dectruct-input', this.$view);
  this.$view.listParent = listParent;
  this.$view.aliasErorr = $('div.pizo-new-category-container-alias', this.$view);
  this.$view.active = active;
  return this.$view;
}

Object.defineProperties(EditHelpContainer.prototype, Object.getOwnPropertyDescriptors(_BaseView.default.prototype));
EditHelpContainer.prototype.constructor = EditHelpContainer;

EditHelpContainer.prototype.enableEditViewContent = function () {
  this.containerPreview.style.display = "none";
  this.containerEditView.style.display = "";
  this.tabContainer.style.pointerEvents = "none";
  this.enableEditting = true;
};

EditHelpContainer.prototype.disableEditViewContent = function () {
  this.saveDataCurrent();
  this.containerPreview.style.display = "";
  this.containerEditView.style.display = "none";
  this.tabContainer.style.pointerEvents = "";
  this.enableEditting = false;
  var row = this.getElementsByClassName("choice-event-category");
  var data;

  if (row.length === 1) {
    row = row[0];
  }

  data = row.data;

  if (data) {
    this.titleLabel.innerHTML = data.original.title;
    var text = data.original.fulltext;

    if (data.original.related) {
      text += "<div style='border: 1px solid;'></div>" + data.original.related;
    }

    text += "<div style='width:100%;height:150px'></div>";
    this.containerView.innerHTML = text;
    var location = "";
    var tempElement = row;

    while (tempElement && tempElement.tagName != "DIV") {
      if (location !== "") {
        location = "<span> > </span>" + location;
      }

      location = "<a href='./' id='x64" + tempElement.data.original.id + "'>" + tempElement.data.original.title + "</a>" + location;
      tempElement = tempElement.getParentNode();
    }

    if (location !== "") this.locationLabel.innerHTML = location;
  }
};

EditHelpContainer.prototype.functionClickMore = function (event, me, index, parent, data, row) {
  var self = this;
  var docTypeMemuProps = {
    items: [{
      text: 'Thêm',
      icon: 'span.material-icons.material-icons-add',
      value: 0
    }, // {
    //     text: 'Sửa',
    //     icon: 'i.material-icons.material-icons-edit',
    //     value: 1,
    // },
    {
      text: 'Xóa',
      icon: 'span.material-icons.material-icons-delete',
      value: 2
    }]
  };
  var token = absol.QuickMenu.show(me, docTypeMemuProps, [3, 4], function (menuItem) {
    switch (menuItem.value) {
      case 0:
        if (row.parentNode == null) {
          for (var i = 0; i < parent.childrenNodes.length; i++) {
            if (row.data == parent.childrenNodes[i].data) {
              row = parent.childrenNodes[i];
              break;
            }
          }
        }

        self.add(row.data.original.id, row);
        break;
      // case 1:
      //     self.edit(data,parent,index);
      //     break;

      case 2:
        if (parent.parentNode == null) {
          parent = row.getParentNode();
        }

        self.delete(row.data.original, parent, index);
        break;
    }
  });

  var functionX = function (token) {
    return function () {
      var x = function (event) {
        absol.QuickMenu.close(token);
        document.body.removeEventListener("click", x);
      };

      document.body.addEventListener("click", x);
    };
  }(token);

  setTimeout(functionX, 10);
};

EditHelpContainer.prototype.functionClickDetail = function (event, me, index, parent, data, row) {
  var arr = this.getElementsByClassName("choice-event-category");
  if (this.alias.parentNode.parentNode.classList.contains("hasErrorElement") && arr.length > 0) return;
  if (this.saveDataCurrent(row) === true) return;
  this.titleLabel.innerHTML = data.original.title;
  var text = data.original.fulltext;

  if (data.original.related) {
    text += "<div style='border: 1px solid;'></div>";
    text += "<h3>Bài liên quan</h3>";
    text += data.original.related;
  }

  text += "<div style='width:100%;height:150px'></div>";
  this.containerView.innerHTML = text;
  var location = "";
  var tempElement = row;

  while (tempElement && tempElement.tagName != "DIV") {
    if (location !== "") {
      location = "<span> > </span>" + location;
    }

    location = "<a href='./' id='x64" + tempElement.data.original.id + "'>" + tempElement.data.original.title + "</a>" + location;
    tempElement = tempElement.getParentNode();
  }

  this.locationLabel.innerHTML = location;
  this.rowSelected = row;
  row.classList.add("choice-event-category");
  this.setDataTitle(data.original);
  this.editor.setData(data.original.fulltext);
  this.editorRelated.setData(data.original.related);
  this.alias.dispatchEvent(new Event("input"));
};

EditHelpContainer.prototype.saveDataCurrent = function (row) {
  var arr = this.getElementsByClassName("choice-event-category");
  var isRemove = true;
  if (arr.length !== 0) arr = arr[0];
  if (arr == row) return true;
  if (row === undefined) isRemove = false;
  var value = {
    title: this.name.value,
    alias: this.alias.value,
    fulltext: this.editor.getData(),
    related: this.editorRelated.getData(),
    active: this.active.checked ? 1 : 0,
    parent_id: this.listParent.value,
    id: this.idCurrent
  };

  if (isRemove) {
    if (arr.classList) arr.classList.remove("choice-event-category");
  }

  if (arr.data) {
    this.editView(value, arr.data, arr);
  }

  this.listParent.updateItemList();
  return false;
};

EditHelpContainer.prototype.resetChoice = function () {
  var arr = this.getElementsByClassName("choice-event-category");

  if (arr.length !== 0) {
    this.saveDataCurrent();
    this.resetDataTitle();
    arr[0].classList.remove("choice-event-category");
  } // var choice = this.getElementsByClassName("choice-event-category");
  // var mTable = this.mTable;
  // if (choice.length == 0) {
  //     if (mTable.childrenNodes.length > 0) {
  //         mTable.childrenNodes[0].indexDetail = 0;
  //         mTable.childrenNodes[0].parentDetail = mTable;
  //         this.rowSelected = mTable.childrenNodes[0];
  //         mTable.childrenNodes[0].classList.add("choice-event-category");
  //         this.setDataTitle(mTable.childrenNodes[0].data.original);
  //         this.editor.setData(mTable.childrenNodes[0].data.original.fulltext);
  //         this.alias.dispatchEvent(new Event("input"));
  //     }
  // }

};

EditHelpContainer.prototype.functionChoice = function (event, me, index, parent, data, row) {
  var self = this;
  var arr = this.getElementsByClassName("choice-list-category");
  if (arr.length !== 0) arr = arr[0];
  var today = new Date();
  if (self.modal.clickTime === undefined) self.modal.clickTime = 0;

  if (arr == row && today - self.modal.clickTime < 300) {
    self.modal.selfRemove();
    self.modal.resolve({
      event: event,
      me: me,
      index: index,
      parent: parent,
      data: data,
      row: row
    });
  }

  self.modal.clickTime = today;

  if (arr.length !== 0) {
    if (arr) arr.classList.remove("choice-list-category");
  }

  row.classList.add("choice-list-category");
};

EditHelpContainer.prototype.syncRow = function () {
  this.saveDataCurrent();
};

EditHelpContainer.prototype.formatDataRowOne = function (data) {
  var checkElement = parseInt(data.active) ? _({
    tag: "div",
    class: "tick-element"
  }) : _({
    tag: "div",
    class: "cross-element"
  });
  var result = [{
    value: ""
  }, {
    value: data.title,
    element: _({
      tag: "div",
      child: [{
        tag: "span",
        class: "title-label",
        props: {
          innerHTML: data.title
        }
      }, {
        tag: "span",
        class: "alias-label",
        props: {
          innerHTML: " (Alias :" + data.alias + ")"
        }
      }]
    })
  }, {
    value: data.active,
    element: checkElement
  }, {
    value: ""
  }];
  result.original = data;
  return result;
};

EditHelpContainer.prototype.formatDataRow = function (data) {
  var temp = [];
  var check = [];
  var result;

  for (var i = 0; i < data.length; i++) {
    result = this.formatDataRowOne(data[i]);

    if (data[i].parent_id != 0) {
      if (check[data[i].parent_id] === undefined) check[data[i].parent_id] = [];
      check[data[i].parent_id].push(result);
    } else {
      temp.push(result);
    }
  }

  for (var i = 0; i < temp.length; i++) {
    temp[i].child = this.checkarrayChild(temp[i].original.id, check);
  }

  return temp;
};

EditHelpContainer.prototype.checkarrayChild = function (id, check) {
  if (check[id] === undefined) return [];

  for (var i = 0; i < check[id].length; i++) {
    check[id][i].child = this.checkarrayChild(check[id][i].original.id, check);
  }

  return check[id];
};

EditHelpContainer.prototype.formatDataRowList = function (data) {
  var temp = [];
  var check = [];
  var k = 0;

  for (var i = 0; i < data.length; i++) {
    var result = [{
      value: data[i].title,
      element: _({
        tag: "div",
        child: [{
          tag: "span",
          class: "title-label",
          props: {
            innerHTML: data[i].title
          }
        }]
      })
    }, {
      value: data[i].created,
      style: {
        minWidth: "150px"
      }
    }, {
      value: data[i].id
    }];
    result.original = data[i];

    if (check[data[i].parent_id] !== undefined) {
      if (check[data[i].parent_id].child === undefined) check[data[i].parent_id].child = [];
      check[data[i].parent_id].child.push(result);
    } else temp[k++] = result;

    check[data[i].id] = result;
  }

  return temp;
};

EditHelpContainer.prototype.checkarrayChildChoice = function (id, check) {
  if (check[id] === undefined) return [];

  for (var i = 0; i < check[id].length; i++) {
    if (id == this.idCurrent) continue;
    check[id][i].items = this.checkarrayChildChoice(check[id][i].value, check);
  }

  return check[id];
};

EditHelpContainer.prototype.formatDataRowChoice = function () {
  var temp = [{
    text: "Danh mục cao nhất",
    value: 0
  }];
  var check = [];
  var result;
  temp.check = [];
  var data = this.getDataCurrent();

  for (var i = 0; i < data.length; i++) {
    temp.check[data[i].alias] = data[i];
    if (data[i].id == this.idCurrent) continue;
    result = {
      text: data[i].title,
      value: parseFloat(data[i].id)
    };

    if (data[i].parent_id != 0) {
      if (check[data[i].parent_id] === undefined) check[data[i].parent_id] = [];
      check[data[i].parent_id].push(result);
    } else {
      temp.push(result);
    }
  }

  for (var i = 0; i < temp.length; i++) {
    temp[i].items = this.checkarrayChildChoice(temp[i].value, check);
  }

  return temp;
};

EditHelpContainer.prototype.getDataCurrent = function () {
  return this.getDataChild(this.mTable.data);
};

EditHelpContainer.prototype.getDataChild = function (arr) {
  var self = this;
  var result = [];

  for (var i = 0; i < arr.length; i++) {
    result.push(arr[i].original);
    if (arr[i].child.length !== 0) result = result.concat(self.getDataChild(arr[i].child));
  }

  return result;
};

EditHelpContainer.prototype.default = function (parent_id = 0, ordering = -1) {
  var result = {
    active: 0,
    fulltext: "",
    ordering: ordering,
    parent_id: parent_id,
    title: "New Category",
    alias: ""
  };
  return result;
};

EditHelpContainer.prototype.add = function (parentid, row = this.mTable) {
  var self = this;
  var value = this.default(parentid, row.childrenNodes.length);
  var promiseParent = self.addDB(value);
  var loading = new _FormatFunction.loadingWheel();
  promiseParent.then(function (result) {
    value = self.formatDataRowOne(result);
    self.addView(value, row);
    loading.disable();
  });
};

EditHelpContainer.prototype.addView = function (value, row) {
  var temp = row.insertRow(value);
  temp.scrollIntoView({
    behavior: "smooth",
    block: "center",
    inline: "center"
  });
  this.listParent.updateItemList();
};

EditHelpContainer.prototype.addDB = function (value) {
  var promiseAdd = _ModuleDatabase.default.getModule("helps").add(value);

  promiseAdd.then(function (result) {
    value.id = result.id;
  });
  return promiseAdd;
};

EditHelpContainer.prototype.edit = function (data, parent, index) {};

EditHelpContainer.prototype.editViewContent = function () {
  var location = _({
    tag: "span",
    class: "b-breadCrumbs__location_content"
  });

  var title = _({
    tag: "li",
    class: "b-breadCrumbs__item",
    props: {
      innerHTML: "Introduction"
    }
  });

  var containerView = _({
    tag: "div",
    class: ["cke_editable", "cke_editable_themed", "cke_contents_ltr", "cke_show_borders"],
    props: {
      contenteditable: true,
      spellcheck: false
    }
  });

  var temp = _({
    tag: "div",
    class: ["b-article", "b-workZone__layout_helpcontainer_view"],
    child: [{
      tag: "div",
      class: "b-article__headerLayout",
      props: {
        id: "article__header"
      },
      child: [{
        tag: "div",
        class: ["b-article__headerSide", "m-article__headerSide__nav"],
        props: {
          id: "headerSide__nav"
        },
        child: [{
          tag: "ul",
          class: "b-breadCrumbs__items",
          child: [title]
        }, {
          tag: "div",
          class: "b-breadCrumbs__location",
          child: [{
            tag: "span",
            class: "b-breadCrumbs__location_title",
            props: {
              innerHTML: "Bạn ở đây "
            }
          }, location]
        }]
      }, {
        tag: "div",
        class: ["b-article__headerSide", "m-article__headerSide__buttons"],
        props: {
          id: "headerSide__buttons"
        },
        child: [{
          tag: "ul",
          class: "b-controlButtons__items",
          child: [{
            tag: "li",
            class: ["b-controlButtons__item", "m-controlButtons__item__print"],
            on: {
              click: function () {
                Dom.printElement(self.$view.containerView.parentNode);
              }
            },
            child: [{
              tag: "i",
              class: "material-icons",
              props: {
                innerHTML: "print"
              }
            }]
          }]
        }]
      }]
    }, {
      tag: "div",
      class: "container-content-information",
      child: [containerView]
    }]
  });

  this.containerView = containerView;
  this.titleLabel = title;
  this.locationLabel = location;
  return temp;
};

EditHelpContainer.prototype.editView = function (value, data, elementParam) {
  var parent = elementParam.getParentNode();
  var isChangeView = false;

  if (data.original.id != undefined) {
    if (data.original.title !== value.title) data.original.isTitle = true;
    if (data.original.alias !== value.alias) data.original.isAlias = true;
    if (data.original.active !== value.active) data.original.isActive = true;

    if (value.fulltext !== undefined) {
      if (data.original.fulltext !== value.fulltext) data.original.isFulltext = true;
    }

    if (value.related !== undefined) {
      if (data.original.related !== value.related) data.original.isRelated = true;
    }

    if (data.original.parent_id !== value.parent_id) data.original.isParent_id = true;
  }

  data.original.title = value.title;
  data.original.alias = value.alias;
  data.original.active = parseInt(value.active);
  if (value.fulltext !== undefined) data.original.fulltext = value.fulltext;
  if (value.related !== undefined) data.original.related = value.related;

  if (data.original.parent_id != value.parent_id) {
    isChangeView = true;
  }

  data.original.parent_id = value.parent_id;
  var checkElement = parseInt(value.active) ? _({
    tag: "div",
    class: "tick-element"
  }) : _({
    tag: "div",
    class: "cross-element"
  });
  data[1] = {
    value: data.original.title,
    element: _({
      tag: "div",
      child: [{
        tag: "span",
        class: "title-label",
        props: {
          innerHTML: data.original.title
        }
      }, {
        tag: "span",
        class: "alias-label",
        props: {
          innerHTML: " (Alias :" + data.original.alias + ")"
        }
      }]
    }),
    style: {
      maxWidth: "150px"
    }
  };
  data[2] = {
    value: value.active,
    element: checkElement,
    style: {
      maxWidth: "21px"
    }
  };

  if (isChangeView === true) {
    var element;
    if (value.parent_id == 0) element = parent.realTable.parentNode;else for (var i = 0; i < parent.bodyTable.childNodes.length; i++) {
      if (parent.bodyTable.childNodes[i].data.original.id == value.parent_id) {
        element = parent.bodyTable.childNodes[i];
        break;
      }
    }
    var index = parent.childrenNodes.indexOf(elementParam);
    parent.changeParent(index, element);
    setTimeout(function () {
      elementParam.scrollIntoView({
        behavior: "smooth",
        block: "center",
        inline: "center"
      });
    }, 100);
  }

  var temp = elementParam.updateCurrentRow(data);
  this.listParent.updateItemList();
  return temp;
};

EditHelpContainer.prototype.editDB = function (mNewCategory, data, parent, index) {
  var self = this;
  mNewCategory.promiseEditDB.then(function (value) {
    value.id = data.original.id;

    _ModuleDatabase.default.getModule("helps").update(value).then(function (result) {
      self.editView(value, data, parent, index);
    });

    mNewCategory.promiseEditDB = undefined;
    setTimeout(function () {
      if (mNewCategory.promiseEditDB !== undefined) self.editDB(mNewCategory, data, parent, index);
    }, 10);
  });
};

EditHelpContainer.prototype.editContentAll = function () {
  var self = this;
  self.syncRow();
  var sync = self.mTable.data;
  var loading = new _FormatFunction.loadingWheel();
  var promiseAll = self.updateChild(sync);
  Promise.all(promiseAll).then(function () {
    loading.disable();
    var arr = this.getElementsByClassName("choice-event-category");
    if (this.alias.parentNode.parentNode.classList.contains("hasErrorElement") && arr.length > 0) arr[0].scrollIntoView({
      behavior: "smooth",
      block: "center",
      inline: "center"
    });
  }.bind(this));
};

EditHelpContainer.prototype.updateChild = function (child) {
  var promiseAll = [];
  var isUpdate;

  for (var i = 0; i < child.length; i++) {
    isUpdate = false;
    var dataUpdate = {};
    dataUpdate.id = child[i].original.id;

    if (child[i].original.isTitle === true) {
      isUpdate = true;
      dataUpdate.title = child[i].original.title;
      child[i].original.isTitle = false;
    }

    if (child[i].original.isAlias === true) {
      isUpdate = true;
      dataUpdate.alias = child[i].original.alias;
      child[i].original.isAlias = false;
    }

    if (child[i].original.isActive === true) {
      isUpdate = true;
      dataUpdate.active = child[i].original.active;
      child[i].original.isActive = false;
    }

    if (child[i].original.isParent_id === true) {
      isUpdate = true;
      dataUpdate.parent_id = child[i].original.parent_id;
      child[i].original.isParent_id = false;
    }

    if (child[i].original.isFulltext === true) {
      isUpdate = true;
      dataUpdate.fulltext = child[i].original.fulltext;
      child[i].original.isFulltext = false;
    }

    if (child[i].original.isRelated === true) {
      isUpdate = true;
      dataUpdate.related = child[i].original.related;
      child[i].original.isRelated = false;
    }

    if (child[i].original.ordering != i) {
      isUpdate = true;
      dataUpdate.ordering = i;
      child[i].original.ordering = i;
    }

    if (isUpdate) {
      promiseAll.push(_ModuleDatabase.default.getModule("helps").update(dataUpdate));
    }

    if (child[i].child.length !== 0) {
      promiseAll = promiseAll.concat(this.updateChild(child[i].child));
    }
  }

  return promiseAll;
};

EditHelpContainer.prototype.delete = function (data, parent, index) {
  var self = this;
  var deleteItem = (0, _ModuleView.deleteQuestion)("Xoá danh mục", "Bạn có chắc muốn xóa :" + data.title);
  this.addChild(deleteItem);
  deleteItem.promiseComfirm.then(function () {
    self.deleteDB(data, parent, index);
  });
};

EditHelpContainer.prototype.deleteView = function (parent, index) {
  var self = this;
  if (this.rowSelected) this.rowSelected.indexDetail--;
  parent.dropRow(index).then(function () {
    self.resetChoice();
    self.listParent.updateItemList();
  });
};

EditHelpContainer.prototype.resetDataTitle = function (data) {
  this.name.value = "";
  this.alias.value = "";
  this.listParent.value = 0;
  this.active.checked = false;
  this.editor.setData("");
  this.editorRelated.setData("");
  this.idCurrent = undefined;
};

EditHelpContainer.prototype.setDataTitle = function (data) {
  this.name.value = data.title;
  this.alias.value = data.alias;
  this.idCurrent = data.id;
  this.listParent.updateItemList();
  this.listParent.value = data.parent_id;
  this.active.checked = parseInt(data.active);
};

EditHelpContainer.prototype.addPromisePush = function (data) {
  var result = [];
  var dataOriginal = data.original;

  if (dataOriginal && dataOriginal.id) {
    result.push(_ModuleDatabase.default.getModule("helps").delete({
      id: dataOriginal.id
    }));
  }

  if (data.child && data.child.length > 0) {
    for (var i = 0; i < data.child.length; i++) {
      result = result.concat(this.addPromisePush(data.child[i]));
    }
  }

  return result;
};

EditHelpContainer.prototype.deleteDB = function (data, parent, index) {
  var self = this;
  var row = parent.childrenNodes[index];
  var promiseAll = this.addPromisePush(row.data);
  if (promiseAll.length > 0) Promise.all(promiseAll).then(function (value) {
    if (parent.childrenNodes[index] && parent.childrenNodes[index].classList.contains("choice-event-category")) {
      self.resetDataTitle();
    }

    self.deleteView(parent, index);
  });else {
    if (parent.childrenNodes[index] && parent.childrenNodes[index].classList.contains("choice-event-category")) {
      self.resetDataTitle();
    }

    self.deleteView(parent, index);
  }
};

EditHelpContainer.prototype.itemEdit = function () {
  var self = this;
  var textId = ("text_" + Math.random() + Math.random()).replace(/\./g, '');

  var temp = _({
    tag: 'div',
    class: "container-bot",
    props: {
      id: textId
    }
  });

  var ckedit = _({
    tag: 'attachhook',
    on: {
      error: function () {
        this.selfRemove();
        self.editor = CKEDITOR.replace(textId);
        CKFinder.setupCKEditor(self.editor, './'); // self.editor.on('doubleclick', function(evt) {
        //     var element = evt.data.element;
        //     if (element.is('a') && !element.getAttribute('_cke_realelement'))
        //         evt.data.dialog = null;
        // }, null, null, 10);

        self.editor.on('blur', function (e) {
          self.saveDataCurrent();
        });
        self.editor.addCommand("comand_link_direction", {
          exec: function (edt) {
            var listLink = self.listLink();
            self.appendChild(listLink);
            listLink.promiseSelectList.then(function (value) {
              self.editor.insertHtml("<a id=x64" + value.data.original.id + " href='./'>" + value.data.original.title + "</a>");
            });
          }
        });
        self.editor.addCommand("comand_note", {
          exec: function (edt) {
            var selected_text = self.editor.getSelection().getSelectedText();
            self.editor.insertHtml(`<div style="
                        display: flex;
                        border: 2px solid #f4eb49;
                        padding: 5px;
                        padding-bottom: 20px;
                        "><i class="material-icons" style="
                        display: flex;
                        flex-shrink: 0;
                        width: 40px;
                        font-size: 30px;
                        color: #f4eb49;
                    ">sticky_note_2</i> <span style="
                        flex-grow: 2;
                        display: flex;
                        padding: 5px;
                    ">` + selected_text + `</span></div>
                    `);
          }
        });
      }
    }
  });

  return temp;
};

EditHelpContainer.prototype.itemEditRelated = function () {
  var self = this;
  var textId = ("text_" + Math.random() + Math.random()).replace(/\./g, '');

  var temp = _({
    tag: 'div',
    class: "container-bot-related",
    props: {
      id: textId
    }
  });

  var ckedit = _({
    tag: 'attachhook',
    on: {
      error: function () {
        this.selfRemove();
        self.editorRelated = CKEDITOR.replace(textId);
        CKFinder.setupCKEditor(self.editorRelated, './'); // self.editor.on('doubleclick', function(evt) {
        //     var element = evt.data.element;
        //     if (element.is('a') && !element.getAttribute('_cke_realelement'))
        //         evt.data.dialog = null;
        // }, null, null, 10);

        self.editorRelated.on('blur', function (e) {
          self.saveDataCurrent();
        });
        self.editorRelated.addCommand("comand_link_direction", {
          exec: function (edt) {
            var listLink = self.listLink();
            self.appendChild(listLink);
            listLink.promiseSelectList.then(function (value) {
              self.editorRelated.insertHtml("<a id=x64" + value.data.original.id + " href='./'>" + value.data.original.title + "</a>");
            });
          }
        });
        self.editorRelated.addCommand("comand_note", {
          exec: function (edt) {
            var selected_text = self.editorRelated.getSelection().getSelectedText();
            self.editorRelated.insertHtml(`<div style="
                        display: flex;
                        border: 2px solid #f4eb49;
                        padding: 5px;
                        padding-bottom: 20px;
                        "><i class="material-icons" style="
                        display: flex;
                        flex-shrink: 0;
                        width: 40px;
                        font-size: 30px;
                        color: #f4eb49;
                    ">sticky_note_2</i> <span style="
                        flex-grow: 2;
                        display: flex;
                        padding: 5px;
                    ">` + selected_text + `</span></div>
                    `);
          }
        });
      }
    }
  });

  return temp;
};

EditHelpContainer.prototype.listLink = function () {
  var self = this;
  var header = [{
    value: "Title",
    sort: true,
    functionClickAll: self.functionChoice.bind(self)
  }, {
    value: "Date",
    sort: true
  }, {
    value: "ID",
    sort: true
  }];
  var mTable = new _ModuleView.tableView(header, self.formatDataRowList(self.getDataCurrent()), true, false, 0);
  mTable.style.width = "calc(100% - 20px)";
  mTable.style.marginLeft = "10px";

  var input = _({
    tag: "input",
    class: "input-search-list",
    props: {
      type: "text",
      placeholder: "Search"
    }
  });

  self.modal = _({
    tag: "modal",
    class: "list-linkChoice",
    on: {
      click: function (event) {
        var element = event.target;

        while (!(element.classList.contains("list-linkChoice") || element.classList.contains("list-linkChoice-container"))) element = element.parentNode;

        if (element.classList.contains("list-linkChoice")) {
          this.selfRemove();
          self.modal.reject();
        }
      }
    },
    child: [{
      tag: "div",
      class: ["list-linkChoice-container", "absol-single-page-scroller"],
      child: [{
        tag: "div",
        class: "js-stools-container-bar",
        child: [{
          tag: "div",
          class: ["btn-wrapper", "input-append"],
          child: [input]
        }]
      }, mTable]
    }]
  });
  mTable.addInputSearch(input);
  self.modal.promiseSelectList = new Promise(function (resolve, reject) {
    self.modal.resolve = resolve;
    self.modal.reject = reject;
  });
  return self.modal;
};

EditHelpContainer.prototype.editPage = function () {
  var textIdHeader = ("text_" + Math.random() + Math.random()).replace(/\./g, '');
  var textIdFooter = ("text_" + Math.random() + Math.random()).replace(/\./g, '');

  var ckeditHeader = _({
    tag: 'attachhook',
    on: {
      error: function () {
        this.selfRemove();
        self.editor = CKEDITOR.replace(textIdHeader); // self.editor.on('doubleclick', function(evt) {
        //     var element = evt.data.element;
        //     if (element.is('a') && !element.getAttribute('_cke_realelement'))
        //         evt.data.dialog = null;
        // }, null, null, 10);

        self.editor.addCommand("comand_link_direction", {
          exec: function (edt) {
            var listLink = self.listLink();
            self.appendChild(listLink);
            listLink.promiseSelectList.then(function (value) {
              self.editor.insertHtml("<a id=x86" + value.data.original.id + " href='./'>" + value.data.original.title + "</a>");
            });
          }
        });
        self.editor.addCommand("comand_note", {
          exec: function (edt) {}
        });
      }
    }
  });

  var ckeditFooter = _({
    tag: 'attachhook',
    on: {
      error: function () {
        this.selfRemove();
        self.editor = CKEDITOR.replace(textIdFooter); // self.editor.on('doubleclick', function(evt) {
        //     var element = evt.data.element;
        //     if (element.is('a') && !element.getAttribute('_cke_realelement'))
        //         evt.data.dialog = null;
        // }, null, null, 10);

        self.editor.addCommand("comand_link_direction", {
          exec: function (edt) {
            var listLink = self.listLink();
            self.appendChild(listLink);
            listLink.promiseSelectList.then(function (value) {
              self.editor.insertHtml("<a id=x86" + value.data.original.id + " href='./'>" + value.data.original.title + "</a>");
            });
          }
        });
        self.editor.addCommand("comand_note", {
          exec: function (edt) {}
        });
      }
    }
  });

  var settingPage = _({
    tag: "div",
    class: "setting-page-container",
    child: [{
      tag: "div",
      class: "setting-page-container-title",
      child: [{
        tag: "span",
        class: "setting-page-container-title-label",
        props: {
          innerHTML: "Title"
        }
      }, {
        tag: "input",
        class: "setting-page-container-title-input"
      }]
    }, {
      tag: "div",
      class: "setting-page-container-header",
      child: [{
        tag: "span",
        class: "setting-page-container-header-label",
        props: {
          innerHTML: "Header"
        }
      }, {
        tag: "div",
        class: "setting-page-container-header-editor",
        child: [{
          tag: "div",
          props: {
            id: textIdHeader
          }
        }]
      }]
    }, {
      tag: "div",
      class: "setting-page-container-footer",
      child: [{
        tag: "span",
        class: "setting-page-container-footer-label",
        props: {
          innerHTML: "Footer"
        }
      }, {
        tag: "div",
        class: "setting-page-container-footer-editor",
        child: [{
          tag: "div",
          props: {
            id: textIdFooter
          }
        }]
      }]
    }]
  });

  this.appendChild(settingPage);
  this.settingPage = settingPage;
};

EditHelpContainer.prototype.saveHeaderFooter = function () {};

EditHelpContainer.prototype.closeEditPage = function () {
  if (this.settingPage) {
    this.settingPage.selfRemove();
    this.settingPage = undefined;
    return true;
  }

  return false;
};

EditHelpContainer.prototype.refresh = function () {
  var data;
  var editor = this.getContext(_R.default.LAYOUT_EDITOR);
  if (editor) data = editor.getData().toString();
  if (data) this.setData(data);
};

EditHelpContainer.prototype.setData = function (data) {
  this.data = data;
  this.data.tracking = "OK";
  this.dataFlushed = false;
  if (this.state == "RUNNING") this.flushDataToView();
};

EditHelpContainer.prototype.flushDataToView = function () {
  if (this.dataFlushed) return;
  this.dataFlushed = true; //TODO: remove older view

  if (!this.data) return;
  this.$content.clearChild();

  if (this.data && this.$view) {
    this.rootComponent = this.build(this.data);
    this.$content.addChild(this.rootComponent.view);
    this.rootComponent.onAttach();
    this.$widthIp.value = this.rootComponent.getStyle('width', 'px');
    this.$heightIp.value = this.rootComponent.getStyle('height', 'px');
  }
};

EditHelpContainer.prototype.start = function () {};

var _default = EditHelpContainer;
exports.default = _default;
};

moduleFactories["node_modules/pizo/js/component/HelpContainer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/HelpContainer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _BaseView = _interopRequireDefault(require("../component/BaseView"));

var _Fragment = _interopRequireDefault(require("absol/src/AppPattern/Fragment"));

var _CMDRunner = _interopRequireDefault(require("absol/src/AppPattern/CMDRunner"));

require("../../css/HelpContainer.css");

var _R = _interopRequireDefault(require("../R"));

var _Fcore = _interopRequireDefault(require("../dom/Fcore"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _ModuleDatabase = _interopRequireDefault(require("../component/ModuleDatabase"));

var _ModuleView = require("./ModuleView");


var _ = _Fcore.default._;
var $ = _Fcore.default.$;

function HelpContainer() {
  _BaseView.default.call(this);

  _Fragment.default.call(this);

  this.cmdRunner = new _CMDRunner.default(this);
  this.loadConfig();
  if (this.$view) return this.$view;
  var self = this;

  var input = _({
    tag: "input",
    class: "input-search-list",
    props: {
      type: "text",
      placeholder: "Tìm kiếm"
    }
  });

  _ModuleDatabase.default.getModule("helps").load({
    ORDERING: "parent_id , ordering"
  }).then(function (value) {
    var header = [{
      value: "Title",
      sort: true,
      functionClickAll: this.$view.functionClickDetail.bind(this.$view),
      style: {
        minWidth: "unset !important"
      }
    }];
    this.$view.mTable = new _ModuleView.tableView(header, this.$view.formatDataRow(value), false, true, 0);
    this.$view.mTable.addInputSearch(input);
    this.$view.mTable.headerTable.style.display = "none";
    mTable.parentNode.replaceChild(this.$view.mTable, mTable);
    self.$view.checkAlias = _ModuleDatabase.default.getModule("helps").getLibary("alias");
    this.$view.firstChildClick();
    var x = setInterval(function () {
      if (window.exttask) {
        if (self.$view.checkAlias[window.exttask]) {
          if (window.exttask) {
            var temp = document.getElementById("x86" + self.$view.checkAlias[window.exttask].id);
            window.addHref = window.exttask;

            if (temp) {
              temp.click();
              temp.scrollIntoView({
                behavior: "smooth",
                block: "center",
                inline: "center"
              });
              clearInterval(x);
            }
          }
        }
      }
    }, 80);
    setTimeout(function () {
      clearInterval(x);
    }, 5000);
  }.bind(this));

  var mTable = _({
    tag: "div"
  });

  var tabContainer = _({
    tag: "div",
    class: "header-display-visible",
    child: [{
      tag: "div",
      class: "js-stools-container-bar",
      child: [{
        tag: "div",
        class: ["absol-tabbar-button", "absol-tabbar-button-active"],
        child: [{
          tag: "div",
          class: "absol-tabbar-button-text",
          props: {
            innerHTML: "Danh mục"
          }
        }]
      }, {
        tag: "div",
        class: ["btn-wrapper", "input-append"],
        child: [input]
      }]
    }, mTable]
  });

  this.$view = _({
    tag: "div",
    class: ["b-workZone__layout", "b-workZone__layout_helpcontainer_view"],
    child: [{
      tag: "div",
      class: ["b-workZone__side", "m-workZone__side__nav"],
      child: [{
        tag: "div",
        class: ["b-workZone__content", "m-workZone__content__nav"],
        props: {
          id: "workZone_nav"
        },
        child: [{
          tag: "div",
          class: "absol-tab-frame-small",
          child: [tabContainer]
        }]
      }]
    }]
  });

  var containerView = _({
    tag: "div",
    class: ["cke_editable", "cke_editable_themed", "cke_contents_ltr", "cke_show_borders"],
    props: {
      contenteditable: true,
      spellcheck: false
    }
  });

  var location = _({
    tag: "span",
    class: "b-breadCrumbs__location_content"
  });

  var title = _({
    tag: "li",
    class: "b-breadCrumbs__item",
    props: {
      innerHTML: "Introduction"
    }
  });

  this.$view.addChild(_({
    tag: "div",
    class: ["b-workZone__side", "m-workZone__side__article"],
    props: {
      id: "workZone_article"
    },
    child: [{
      tag: "div",
      class: "b-workZone__content",
      props: {
        id: "workZone_article__content"
      },
      child: [{
        tag: "div",
        class: "b-article",
        child: [{
          tag: "div",
          class: "b-article__headerLayout",
          props: {
            id: "article__header"
          },
          child: [{
            tag: "div",
            class: ["b-article__headerSide", "m-article__headerSide__nav"],
            props: {
              id: "headerSide__nav"
            },
            child: [{
              tag: "ul",
              class: "b-breadCrumbs__items",
              child: [title]
            }, {
              tag: "div",
              class: "b-breadCrumbs__location",
              child: [{
                tag: "span",
                class: "b-breadCrumbs__location_title",
                props: {
                  innerHTML: "Bạn ở đây "
                }
              }, location]
            }]
          }, {
            tag: "div",
            class: ["b-article__headerSide", "m-article__headerSide__buttons"],
            props: {
              id: "headerSide__buttons"
            },
            child: [{
              tag: "ul",
              class: "b-controlButtons__items",
              child: [{
                tag: "li",
                class: ["b-controlButtons__item", "m-controlButtons__item__print"],
                on: {
                  click: function () {
                    _Dom.default.printElement(self.$view.containerView.parentNode);
                  }
                },
                child: [{
                  tag: "i",
                  class: "material-icons",
                  props: {
                    innerHTML: "print"
                  }
                }]
              }]
            }]
          }]
        }, {
          tag: "div",
          class: "container-content-information",
          child: [containerView]
        }, {
          tag: "div",
          class: "container-content-information-bottom",
          child: [{
            tag: "li",
            class: ["b-controlButtons__item", "m-controlButtons__item__prev"],
            on: {
              click: function () {
                if (self.$view.mTable) {
                  var arr = self.$view.mTable.getElementsByClassName("choice-event-category");

                  if (arr.length > 0) {
                    arr = arr[0];
                    arr = self.$view.mTable.getElementPrevVisiale(arr);
                    if (arr) arr.childNodes[0].click();
                  }
                }
              }
            },
            child: [{
              tag: "i",
              class: "material-icons",
              props: {
                innerHTML: "arrow_back"
              }
            }, {
              tag: "span",
              class: "b-controlButtons__link_text",
              props: {
                innerHTML: " Trang trước"
              }
            }]
          }, {
            tag: "li",
            class: ["b-controlButtons__item", "m-controlButtons__item__next"],
            on: {
              click: function () {
                if (self.$view.mTable) {
                  var arr = self.$view.mTable.getElementsByClassName("choice-event-category");

                  if (arr.length > 0) {
                    arr = arr[0];
                    arr = self.$view.mTable.getElementNextVisiale(arr);
                    if (arr) arr.childNodes[0].click();
                  }
                }
              }
            },
            child: [{
              tag: "span",
              class: "b-controlButtons__link_text",
              props: {
                innerHTML: " Trang tiếp theo"
              }
            }, {
              tag: "i",
              class: "material-icons",
              props: {
                innerHTML: "arrow_forward"
              }
            }]
          }]
        }]
      }]
    }]
  }));
  Object.assign(this.$view, HelpContainer.prototype);
  this.$view.containerView = containerView;
  this.$view.titleLabel = title;
  this.$view.locationLabel = location;
  this.$view.inputLabel = input;
  return this.$view;
}

Object.defineProperties(HelpContainer.prototype, Object.getOwnPropertyDescriptors(_BaseView.default.prototype));
HelpContainer.prototype.constructor = HelpContainer;

HelpContainer.prototype.firstChildClick = function () {
  if (this.mTable.childrenNodes.length > 0) {
    this.mTable.childrenNodes[0].classList.add("choice-event-category");
    this.titleLabel.innerHTML = this.mTable.childrenNodes[0].data.original.title;
    var text = this.mTable.childrenNodes[0].data.original.fulltext;

    if (this.mTable.childrenNodes[0].data.original.related != "") {
      text += "<div style='border: 1px solid;'></div>";
      text += "<h3>Bài liên quan</h3>";
      text += this.mTable.childrenNodes[0].data.original.related;
    }

    text += "<div style='width:100%;height:150px'></div>";
    this.containerView.innerHTML = text;
    var location = "";
    var tempElement = this.mTable.childrenNodes[0];

    while (tempElement && tempElement.tagName != "DIV") {
      if (location !== "") {
        location = "<span> > </span>" + location;
      }

      console.log(tempElement);
      location = "<a href='./' id='x64" + tempElement.data.original.id + "'>" + tempElement.data.original.title + "</a>" + location;
      tempElement = tempElement.getParentNode();
    }

    this.locationLabel.innerHTML = location;
    this.addClickProps();
  }
};

HelpContainer.prototype.functionClickDetail = function (event, me, index, parent, data, row) {
  var arr = this.getElementsByClassName("choice-event-category");
  var isRemove = true;
  if (arr.length !== 0) arr = arr[0];
  if (arr == row) return true;
  if (row === undefined) isRemove = false;

  if (isRemove) {
    if (arr.classList) arr.classList.remove("choice-event-category");
  }

  row.classList.add("choice-event-category");
  var text = window.location.href;

  if (window.addHref !== undefined) {
    text = window.location.href.replace(window.addHref, "");
  }

  window.addHref = data.original.alias;
  history.replaceState({}, "", text + window.addHref);
  this.titleLabel.innerHTML = data.original.title;
  var text = data.original.fulltext;

  if (data.original.related) {
    text += "<div style='border: 1px solid;'></div>";
    text += "<h3>Bài liên quan</h3>";
    text += data.original.related;
  }

  text += "<div style='width:100%;height:150px'></div>";
  this.containerView.innerHTML = text;
  var location = "";
  var tempElement = row;

  while (tempElement && tempElement.tagName != "DIV") {
    if (location !== "") {
      location = "<span> > </span>" + location;
    }

    location = "<a href='./' id='x64" + tempElement.data.original.id + "'>" + tempElement.data.original.title + "</a>" + location;
    tempElement = tempElement.getParentNode();
  }

  this.locationLabel.innerHTML = location;
  this.addClickProps();
};

HelpContainer.prototype.addClickProps = function () {
  var self = this;
  var arr = this.getElementsByTagName("a");

  for (var i = 0; i < arr.length; i++) {
    if (arr[i].id.indexOf("x64") !== -1) {
      arr[i].addEventListener("click", function (index, event) {
        event.preventDefault();
        var element = document.getElementById(arr[index].id.replace("x64", "x86"));

        if (element) {
          element.click();
          element.scrollIntoView({
            behavior: "smooth",
            block: "center",
            inline: "center"
          });
        } else {
          self.inputLabel.value = "";
          self.inputLabel.onchange();
          setTimeout(function () {
            var element = document.getElementById(arr[index].id.replace("x64", "x86"));

            if (element) {
              element.click();
              element.scrollIntoView({
                behavior: "smooth",
                block: "center",
                inline: "center"
              });
            }
          }, 500);
        }
      }.bind(this, i));
    }
  }
};

HelpContainer.prototype.formatDataRowOne = function (data) {
  var result = [{
    value: data.title,
    element: _({
      tag: "div",
      props: {
        id: "x86" + data.id
      },
      child: [{
        tag: "span",
        class: "title-label",
        props: {
          innerHTML: data.title
        }
      }]
    })
  }];
  result.original = data;
  return result;
};

HelpContainer.prototype.formatDataRow = function (data) {
  var temp = [];
  var check = [];
  var result;

  for (var i = 0; i < data.length; i++) {
    if (data[i].active == 0) continue;
    result = this.formatDataRowOne(data[i]);

    if (data[i].parent_id != 0) {
      if (check[data[i].parent_id] === undefined) check[data[i].parent_id] = [];
      check[data[i].parent_id].push(result);
    } else {
      temp.push(result);
    }
  }

  for (var i = 0; i < temp.length; i++) {
    temp[i].child = this.checkarrayChild(temp[i].original.id, check);
  }

  return temp;
};

HelpContainer.prototype.checkarrayChild = function (id, check) {
  if (check[id] === undefined) return [];

  for (var i = 0; i < check[id].length; i++) {
    check[id][i].child = this.checkarrayChild(check[id][i].original.id, check);
  }

  return check[id];
};

HelpContainer.prototype.refresh = function () {
  var data;
  var editor = this.getContext(_R.default.LAYOUT_EDITOR);
  if (editor) data = editor.getData();
  if (data) this.setData(data);
};

HelpContainer.prototype.setData = function (data) {
  this.data = data;
  this.data.tracking = "OK";
  this.dataFlushed = false;
  if (this.state == "RUNNING") this.flushDataToView();
};

HelpContainer.prototype.flushDataToView = function () {
  if (this.dataFlushed) return;
  this.dataFlushed = true; //TODO: remove older view

  if (!this.data) return;
  this.$content.clearChild();

  if (this.data && this.$view) {
    this.rootComponent = this.build(this.data);
    this.$content.addChild(this.rootComponent.view);
    this.rootComponent.onAttach();
    this.$widthIp.value = this.rootComponent.getStyle('width', 'px');
    this.$heightIp.value = this.rootComponent.getStyle('height', 'px');
  }
};

HelpContainer.prototype.start = function () {};

var _default = HelpContainer;
exports.default = _default;
};

moduleFactories["node_modules/pizo/js/component/modal_drag_drop_image.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/modal_drag_drop_image.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fcore = _interopRequireDefault(require("../dom/Fcore"));

require("../../css/form_create_edit.css");

require("../../css/test_question.css");

require("../../css/test.css");


function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }

var _ = _Fcore.default._;
var $ = _Fcore.default.$;
var xmlModalDragImage;

var _default = xmlModalDragImage = {
  imgAll: [],
  imgDelete: [],
  deleteAllTrash: function () {
    var self = this;

    for (var i = 0; i < self.imgAll.length; i++) {
      data_module.img.delete(self.imgAll[i]);
    }

    for (var i = 0; i < self.imgDelete.length; i++) {
      data_module.img.delete(self.imgDelete[i]);
    }
  },
  Image: function (srcImg) {
    var temp = _({
      tag: "img",
      class: "full-size",
      style: {
        position: "absolute",
        left: "50%",
        transform: "translateX(-50%)"
      },
      props: {
        src: srcImg
      },
      on: {
        click: function () {
          var el = this;

          while (!el.classList.contains("image-autoresize-create") && !el !== document.body) el = el.parentNode;

          if (el.classList.contains("hasFocus") || el.classList.contains("image-autoresize-preview")) mViewer.pickImageElement(this, this.src);else if (el !== document.body) el.classList.add("hasFocus");
        }
      }
    });

    window.addEventListener("click", function (event) {
      if (event.target !== temp && temp !== undefined && temp.parentNode !== undefined) {
        var el = temp;

        while (el.parentNode != undefined && !el.classList.contains("image-autoresize-create")) el = el.parentNode;

        if (el !== document) if (el.classList.contains("hasFocus")) el.classList.remove("hasFocus");
      }
    });
    return temp;
  },
  containGetImage: function () {
    var self = this;

    var input = _({
      tag: "input",
      class: "modal-upload-XML-body-drop-area-main-form-input",
      props: {
        type: "file",
        multiple: "",
        accept: "image/*",
        id: "fileElem"
      },
      on: {
        change: function () {
          self.handleFiles(this.files, self);
        }
      }
    });

    self.select = _({
      tag: "div",
      class: ["quantumWizButtonEl", "quantumWizButtonPaperbuttonEl", "quantumWizButtonPaperbuttonFlat", "quantumWizButtonPaperbuttonFlatColored", "quantumWizButtonPaperbutton2El2", "quantumWizDialogPaperdialogDialogButton", "disable"],
      style: {
        backgroundColor: "#2196F3",
        border: "1px solid rgb(169, 169, 169)",
        width: "90px"
      },
      child: [{
        tag: "span",
        class: "quantumWizButtonPaperbuttonContent",
        child: [{
          tag: "span",
          class: "quantumWizButtonPaperbuttonLabel",
          style: {
            color: "white"
          },
          props: {
            innerHTML: "Chọn"
          }
        }]
      }],
      on: {
        click: function () {
          self.functionClickDone();
          if (self.modal !== undefined) self.modal.parentNode.removeChild(self.modal);
        }
      }
    });

    var temp = _({
      tag: "div",
      class: "modal-upload-XML-body-drop",
      child: [{
        tag: "div",
        class: "modal-upload-XML-body-drop-area",
        child: [{
          tag: "div",
          class: "modal-upload-XML-body-drop-area-main",
          child: [{
            tag: "div",
            class: ["modal-upload-XML-body-drop-area-main-form", "displayVisible"],
            props: {
              id: "drop-area"
            },
            child: [{
              tag: "div",
              class: "modal-upload-XML-body-drop-area-main-form-content",
              child: [input, {
                tag: "button",
                class: "modal-upload-XML-body-drop-area-main-form-button",
                props: {
                  innerHTML: "Chọn một hình ảnh để tải lên",
                  for: "fileElem"
                },
                on: {
                  click: function () {
                    input.click();
                  }
                }
              }, {
                tag: "p",
                class: "modal-upload-XML-body-drop-area-main-form-tutorial",
                props: {
                  innerHTML: "Kéo thả hình ảnh vào đây"
                }
              }, {
                tag: "div",
                class: "modal-upload-XML-body-drop-area-main-gallery",
                style: {
                  top: 0
                },
                props: {
                  id: "gallery"
                }
              }, {
                tag: "progress",
                class: "modal-upload-XML-body-drop-area-main-process-bar",
                props: {
                  id: "progress-bar",
                  max: "100",
                  value: "0"
                }
              }]
            }, {
              tag: "div",
              class: "modal-upload-XML-body-drop-save",
              child: [self.select, {
                tag: "div",
                class: ["quantumWizButtonEl", "quantumWizButtonPaperbuttonEl", "quantumWizButtonPaperbuttonFlat", "quantumWizButtonPaperbuttonFlatColored", "quantumWizButtonPaperbutton2El2", "quantumWizDialogPaperdialogDialogButton"],
                style: {
                  marginLeft: "10px",
                  border: "1px solid rgb(169, 169, 169)",
                  width: "90px"
                },
                child: [{
                  tag: "span",
                  class: "quantumWizButtonPaperbuttonContent",
                  child: [{
                    tag: "span",
                    class: "quantumWizButtonPaperbuttonLabel",
                    props: {
                      innerHTML: "Hủy"
                    }
                  }]
                }],
                on: {
                  click: function () {
                    self.functionClickCancel();
                    if (self.modal !== undefined) self.modal.parentNode.removeChild(self.modal);
                  }
                }
              }]
            }]
          }]
        }]
      }]
    });

    self.xnen = temp;
    return temp;
  },
  createModal: function (DOMElement, functionClickDone = function () {}, functionClickCancel = function () {}) {
    var self = this;
    var xnen = self.containGetImage();

    var pointControl = _({
      tag: "div",
      class: ["modal-upload-XML-body-navigation-bar", "selected-modal"],
      child: [{
        tag: "div",
        class: "modal-upload-XML-body-navigation-bar-button",
        props: {
          innerHTML: "Tải lên"
        }
      }],
      on: {
        click: function () {
          if (self.me === this) return;
          if (self.me !== undefined) self.me.classList.remove("selected-modal");
          this.classList.add("selected-modal");
          self.me = this;
          xnen.setPage(0);
        }
      }
    });

    self.me = pointControl;
    self.modal = _({
      tag: "modal",
      child: [{
        tag: "div",
        class: "modal-upload-XML",
        child: [{
          tag: "div",
          class: "modal-upload-XML-header",
          child: [{
            tag: "div",
            class: "modal-upload-XML-header-text",
            props: {
              innerHTML: "Chèn ảnh"
            }
          }, {
            tag: "i",
            class: ["modal-upload-XML-header-icon-close", "material-icons"],
            props: {
              innerHTML: "close"
            },
            on: {
              click: function () {
                self.modal.parentNode.removeChild(self.modal);
              }
            }
          }]
        }, {
          tag: "div",
          class: "modal-upload-XML-body",
          child: [{
            tag: "div",
            class: "modal-upload-XML-body-navigation",
            child: [pointControl]
          }, xnen]
        }]
      }]
    });
    DOMElement.appendChild(self.modal);
    self.functionClickDone = functionClickDone;
    self.functionClickCancel = functionClickCancel;
    self.createEvent();
    return self.modal;
  },
  createEvent: function () {
    var self = this;
    self.dropArea = document.getElementById("drop-area"); // Prevent default drag behaviors

    ["dragenter", "dragover", "dragleave", "drop"].forEach(eventName => {
      self.dropArea.addEventListener(eventName, self.preventDefaults, false);
      document.body.addEventListener(eventName, self.preventDefaults, false);
    }); // Highlight drop area when item is dragged over it

    ["dragenter", "dragover"].forEach(eventName => {
      self.dropArea.addEventListener(eventName, self.highlight, false);
    });
    ["dragleave", "drop"].forEach(eventName => {
      self.dropArea.addEventListener(eventName, self.unhighlight, false);
    }); // Handle dropped files

    self.dropArea.addEventListener("drop", function (e) {
      self.handleDrop(e, self);
    }, false);
    self.uploadProgress = [];
    self.progressBar = document.getElementById("progress-bar");
  },
  preventDefaults: function (e) {
    e.preventDefault();
    e.stopPropagation();
  },
  highlight: function (e) {
    this.classList.add("highlight");
  },
  unhighlight: function (e) {
    this.classList.remove("active");
  },
  handleDrop: function (e, self) {
    var dt = e.dataTransfer;
    var files = dt.files;
    self.handleFiles(files, self);
  },
  initializeProgress: function (numFiles) {
    var self = this;
    self.progressBar.value = 0;
    self.uploadProgress = [];

    for (var i = numFiles; i > 0; i--) {
      self.uploadProgress.push(0);
    }
  },
  updateProgress: function (fileNumber, percent, self) {
    self.uploadProgress[fileNumber] = percent;
    var total = self.uploadProgress.reduce((tot, curr) => tot + curr, 0) / self.uploadProgress.length;
    console.debug("update", fileNumber, percent, total);
    self.progressBar.value = total;
  },
  handleFiles: function (files, self) {
    files = _toConsumableArray(files);
    self.initializeProgress(files.length);

    for (var i = 0; i < files.length; i++) {
      self.uploadFile(files[i], i, self);
      self.previewFile(files[i], self);
    }
  },
  elementCreateByObject: function (el, object, mode = 0) {
    var self = this;
    var marginAlign;
    var url, width, height, align;

    if (object.childNodes === undefined) {
      url = object.url;
      width = object.width + "px";
      height = object.height + "px";
      align = object.align;
    } else {
      url = self.getDataformObject(object, "value");

      for (var i = 0; i < object.childNodes.length; i++) {
        if (object.childNodes[i].tagName === "style") {
          width = xmlComponent.getDataformObject(object.childNodes[i], "width");
          height = xmlComponent.getDataformObject(object.childNodes[i], "height");
          align = xmlComponent.getDataformObject(object.childNodes[i], "align");
          break;
        }
      }
    }

    if (el.getElementsByClassName("max-width-image-resize").length === 0) {
      marginAlign = self.marginAlign();

      if (mode == 0) {
        marginAlign.classList.add("max-width-image-resize-edit");
        marginAlign.style.width = "100%";
      } else if (mode == 1) {
        marginAlign.classList.add("max-width-image-resize-padding");
        marginAlign.classList.add("max-width-image-resize-edit");
      } else if (mode == 2) {
        marginAlign.classList.add("max-width-image-resize-edit");
      } else if (mode == 3) {
        marginAlign.classList.add("margin-align-padding");
        marginAlign.classList.add("max-width-image-resize-edit");
      } else if (mode == 4) {
        marginAlign.classList.add("margin-align");
        marginAlign.classList.add("max-width-image-resize-edit");
      }

      el.appendChild(marginAlign);
    } else if (el.getElementsByClassName("max-width-image-resize").length === 1) marginAlign = el.getElementsByClassName("max-width-image-resize")[0];

    var menuProps = {
      items: [{
        text: "Canh trái",
        icon: "span.mdi.mdi-format-align-left",
        cmd: "align_left"
      }, {
        text: "Canh giữa",
        icon: "span.mdi.mdi-format-align-center",
        cmd: "align_center"
      }, {
        text: "Canh phải",
        icon: "span.mdi.mdi-format-align-right",
        cmd: "align_right"
      }, {
        text: "Xóa",
        icon: "span.mdi.mdi-delete",
        cmd: "delete"
      }]
    };

    var button = _({
      tag: "div",
      class: ["freebirdFormeditorViewMediaEditMenuButton"],
      child: [{
        tag: "i",
        class: ["freebirdFormeditorViewMediaEditMenuButtonContent", "material-icons", "icon-ceneter"],
        props: {
          innerHTML: "more_vert"
        }
      }]
    });

    var imgUrl = self.Image(url);

    var img = _({
      tag: "widthheightresizer",
      class: ["image-autoresize-create"],
      child: [button, imgUrl],
      on: {
        sizechange: function (event) {}
      }
    });

    img.style.width = width;
    img.style.height = height;
    marginAlign.style.textAlign = align;
    absol.QuickMenu.showWhenClick(button, menuProps, [2], function (menuItem) {
      if (menuItem.cmd === "align_left") {
        img.parentNode.style.textAlign = "left";
      } else if (menuItem.cmd === "align_center") {
        img.parentNode.style.textAlign = "center";
      } else if (menuItem.cmd === "align_right") {
        img.parentNode.style.textAlign = "right";
      } else if (menuItem.cmd === "delete") {
        var parent = img.parentNode;
        img.parentNode.removeChild(img);
        if (parent.childNodes.length === 0) parent.parentNode.removeChild(parent);
        self.imgDelete.push(imgUrl.getAttribute("src"));
      }

      var el = img;

      while (!el.classList.contains("true-dame")) el = el.parentNode;

      el.click();
    });

    img.getValue = function () {
      var resultXML = "<content>";
      resultXML += "<type>image</type>";
      resultXML += "<style><width>" + img.style.width + "</width><height>" + img.style.height + "</height><align>" + img.parentNode.style.textAlign + "</align></style>";
      resultXML += "<value>" + imgUrl.getAttribute("src") + "</value>";
      resultXML += "</content>";
      return resultXML;
    };

    marginAlign.appendChild(img);
    return marginAlign;
  },
  elementPreviewByObject: function (el, object, mode = 0) {
    var self = this;
    var marginAlign;

    if (el.getElementsByClassName("max-width-image-resize").length === 0) {
      marginAlign = self.marginAlign();

      if (mode == 0) {
        marginAlign.classList.add("max-width-image-resize-edit");
        marginAlign.style.width = "100%";
      } else if (mode == 1) {
        marginAlign.classList.add("max-width-image-resize-padding");
        marginAlign.classList.add("max-width-image-resize-edit");
      } else if (mode == 2) {} else if (mode == 3) {
        marginAlign.classList.add("margin-align-padding");
      } else if (mode == 4) {
        marginAlign.classList.add("margin-align");
      }

      el.appendChild(marginAlign);
    } else if (el.getElementsByClassName("max-width-image-resize").length === 1) marginAlign = el.getElementsByClassName("max-width-image-resize")[0];

    var imgUrl = xmlComponent.Image(xmlComponent.getDataformObject(object, "value"));

    var img = _({
      tag: "widthheightresizer",
      class: ["image-autoresize-create"],
      child: [imgUrl],
      on: {
        sizechange: function (event) {}
      }
    });

    img.getElementsByClassName("absol-width-height-resizer-anchor-bot-right")[0].style.display = "none";
    img.getElementsByClassName("absol-width-height-resizer-anchor-bot-left")[0].style.display = "none";
    img.getElementsByClassName("absol-width-height-resizer-anchor-top-right")[0].style.display = "none";
    img.getElementsByClassName("absol-width-height-resizer-anchor-top-left")[0].style.display = "none";
    img.classList.add("image-autoresize-preview");

    for (var i = 0; i < object.childNodes.length; i++) {
      if (object.childNodes[i].tagName === "style") {
        img.style.width = xmlComponent.getDataformObject(object.childNodes[i], "width");
        img.style.height = xmlComponent.getDataformObject(object.childNodes[i], "height");
        marginAlign.style.textAlign = xmlComponent.getDataformObject(object.childNodes[i], "align");
        break;
      }
    }

    marginAlign.appendChild(img);

    marginAlign.getValue = function () {
      var resultXML = "<content>";
      resultXML += "<type>image</type>";
      resultXML += "<style><width>" + img.style.width + "</width><height>" + img.style.height + "</height><align>" + img.parentNode.style.textAlign + "</align></style>";
      resultXML += "<value>" + imgUrl.getAttribute("src") + "</value>";
      resultXML += "</content>";
      return resultXML;
    };

    return marginAlign;
  },
  marginAlign: function () {
    var temp = _({
      tag: "div",
      class: "max-width-image-resize"
    });

    temp.getValue = function () {
      var resultXML = "";

      for (var i = 0; i < temp.childNodes.length; i++) {
        resultXML += temp.childNodes[i].getValue();
      }

      return resultXML;
    };

    return temp;
  },
  previewFile: function (file, self) {
    var reader = new FileReader();
    reader.readAsDataURL(file);

    reader.onloadend = function () {
      self.addImage(reader.result);
    };
  },
  addImage: function (src) {
    var self = this;
    self.imgUrl = self.Image(src);

    var img = _({
      tag: "div",
      class: "image-autoresize",
      style: {
        pointerEvents: "none",
        textAlign: "left"
      },
      child: [self.imgUrl],
      on: {
        sizechange: function (event) {}
      }
    });

    var parent = document.getElementById("gallery");
    parent.style.position = "relative";
    var value;
    var srcURL;

    for (var i = 0; i < parent.childNodes.length; i++) {
      srcURL = parent.childNodes[i].getElementsByClassName("full-size")[0].getAttribute("src");
      value = self.imgAll.indexOf(srcURL);

      if (i != -1) {
        self.imgAll.splice(value, 1);
      }
    }

    parent.clearChild();
    parent.appendChild(img);

    self.imgUrl.onload = function () {
      img.style.width = self.imgUrl.naturalWidth * (img.clientHeight / self.imgUrl.naturalHeight) + "px";
    };
  },
  uploadFile: function (file, i, self) {
    self.updateProgress(i, 100, self);
    self.select.classList.remove("disable");
    if (!self.xnen.classList.contains("visible")) self.xnen.classList.add("visible"); // var url = "./php/upload/handle_file_upload.php";
    // var name =
    //   ("img_" + Math.random() + Math.random()).replace(/\./g, "") +
    //   file.name.slice(file.name.lastIndexOf("."));
    // var xhr = new XMLHttpRequest();
    // var formData = new FormData();
    // xhr.open("POST", url, true);
    // xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    // // Update progress (can be used to show progress indicator)
    // xhr.upload.addEventListener("progress", function(e) {
    //   self.updateProgress(i, (e.loaded * 100.0) / e.total || 100, self);
    // });
    // xhr.addEventListener("readystatechange", function(e) {
    //   if (xhr.readyState == 4 && xhr.status == 200) {
    //     self.updateProgress(i, 100, self); // <- Add this
    //     // self.select.classList.remove("disable");
    //     if (!self.modal.classList.contains("visible"))
    //       self.modal.classList.add("visible");
    //     self.imgUrl.src = "./img/delete/" + name;
    //     self.imgAll.push("./img/delete/" + name);
    //     document.getElementById("gallery").style.position = "relative";
    //   } else if (xhr.readyState == 4 && xhr.status != 200) {
    //     // Error. Inform the user
    //   }
    // });
    // formData.append("upload_name", name);
    // formData.append("file", file);
    // xhr.send(formData);
  }
};

exports.default = _default;
};

moduleFactories["node_modules/pizo/js/component/ModuleImage.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/ModuleImage.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.descViewImagePreview = descViewImagePreview;

var _R = _interopRequireDefault(require("../R"));

var _Fcore = _interopRequireDefault(require("../dom/Fcore"));

require("../../css/ModuleImage.css");

var _FormatFunction = require("./FormatFunction");

var _FileSaver = require("absol/src/Network/FileSaver");


var _ = _Fcore.default._;
var $ = _Fcore.default.$;
var img_ele = null,
    x_cursor = 0,
    y_cursor = 0,
    x_img_ele = 0,
    y_img_ele = 0;

function descViewImagePreview(data = [], index = 0, promiseLazyLoad) {
  var temp = _({
    tag: "div",
    class: "image-show",
    child: [{
      tag: "div",
      class: "image-show__title",
      child: [{
        tag: "div",
        class: "fl-l",
        style: {
          margin: "0.2143rem 0.7143rem 0.2143rem 1rem"
        }
      }, {
        tag: "div",
        class: ["fl-r", "image-show__close"],
        props: {
          id: "image-show__close",
          title: "Đóng"
        },
        child: [{
          tag: "i",
          class: ["btn", "dark", "btn--m", "material-icons", "fa-close"],
          style: {
            margin: "0.4286rem 0.7143rem"
          }
        }]
      }]
    }, {
      tag: "div",
      style: {
        display: "flex",
        height: "calc(100vh - 95px)",
        padding: "5px"
      },
      child: [{
        tag: "div",
        class: "timeLineContainerCheck",
        child: [{
          tag: "div",
          class: "image-show__thumb__legend",
          style: {
            height: "2.2857rem",
            width: "8.5714rem",
            position: "absolute",
            zIndex: 10,
            top: "2.8571rem",
            left: "0.3571rem"
          },
          child: [{
            tag: "span",
            props: {
              id: "image-show__thumb__legend_title_content"
            },
            attr: {
              dataTranslateInner: "STR_DATE_TIME"
            }
          }]
        }, {
          tag: "div",
          class: "flx",
          style: {
            height: "100%",
            overflowX: "hidden"
          },
          child: [{
            tag: "div",
            class: ["flx", "flx-al-e", "image-show__list"],
            child: []
          }]
        }, {
          tag: "div",
          class: "timeline-slider",
          style: {
            margin: "0rem 0.8571rem 1.0714rem"
          },
          child: [{
            tag: "div",
            class: "timeline-slider__track",
            child: [{
              tag: "div",
              class: ["timeline-slider__track__progress", "hover-track"]
            }]
          }, {
            tag: "div",
            class: ["timeline-slider__pivot", "timeline-slider__pivot--left"]
          }, {
            tag: "div",
            class: ["timeline-slider__pivot", "timeline-slider__pivot--right"]
          }, {
            tag: "div",
            class: ["timeline-slider__handle"],
            style: {
              width: "12px",
              height: "12px",
              left: "6px"
            },
            child: [{
              tag: "div",
              class: "timeline-slider__tooltip",
              style: {
                top: "-0.2143rem"
              }
            }]
          }]
        }]
      }, {
        tag: "div",
        class: ["image-show__body", "content"],
        props: {
          id: "image-show"
        },
        child: [{
          tag: "div",
          class: ["image-show__btnc", "image-show__btnc__left"],
          child: [{
            tag: "div",
            class: ["flx-fix", "image-show__btn", "clickable"],
            child: [{
              tag: "div",
              class: "image-show__btn__inside",
              child: [{
                tag: "i",
                class: ["material-icons", "fa-chevron-left"],
                attr: {
                  dataTranslateTitle: "STR_NAVIGATE_PHOTO_PREV",
                  title: "Ảnh cũ hơn"
                }
              }]
            }]
          }]
        }, {
          tag: "div",
          class: "image-show__wrapper__img",
          props: {
            id: "mainImage"
          },
          child: [{
            tag: "div",
            class: "image-show__meta-wrapper",
            props: {
              id: "imageTitle"
            },
            child: [{
              tag: "div",
              class: "image-show__caption"
            }]
          }, {
            tag: "img",
            class: ["image-show__img", "z-fh", "fadeInImageShow"],
            attr: {
              draggable: "false" // crossorigin:"Anonymous",

            }
          }]
        }, {
          tag: "div",
          class: ["image-show__btnc", "image-show__btnc__right"],
          child: [{
            tag: "div",
            class: ["flx-fix", "image-show__btn", "clickable"],
            child: [{
              tag: "div",
              class: "image-show__btn__inside",
              child: [{
                tag: "i",
                class: ["material-icons", "fa-chevron-right"],
                attr: {
                  dataTranslateTitle: "STR_NAVIGATE_PHOTO_NEXT",
                  title: "Ảnh mới hơn"
                }
              }]
            }]
          }]
        }, {
          tag: "div",
          class: "image-show__btnc__fullscreen",
          child: [{
            tag: "i",
            class: ["image-show__icon-fullscreen", "material-icons", "fa-fullscreen-icon"]
          }]
        }]
      }]
    }, {
      tag: "div",
      class: "image-show__bottom",
      child: [{
        tag: "div",
        class: "image-show__bottom__sender",
        child: [{
          tag: "div",
          class: ["avatar", "avatar--xs"],
          child: [{
            tag: "div",
            class: "avatar-img",
            style: {}
          }]
        }, {
          tag: "div",
          class: "image-show__bottom__sender__info",
          child: [{
            tag: "div",
            class: ["truncate", "user-name"],
            style: {
              fontSize: "1rem",
              fontWeight: 400
            }
          }, {
            tag: "div",
            class: ["truncate", "date-submit"],
            child: [{
              tag: "span",
              attr: {
                dataTranslateInner: "STR_DATE_TIME"
              },
              props: {
                innerHTML: "10:06  14/02/2020"
              }
            }]
          }]
        }]
      }, {
        tag: "div",
        class: "image-show__bottom__ctrl",
        child: [{
          tag: "i",
          class: ["btn", "material-icons", "fa-chevron-left"],
          attr: {
            dataTranslateTitle: "STR_NAVIGATE_PHOTO_PREV",
            title: "Ảnh cũ hơn"
          }
        }, {
          tag: "i",
          class: ["btn", "material-icons", "fa-chevron-right"],
          attr: {
            dataTranslateTitle: "STR_NAVIGATE_PHOTO_NEXT",
            title: "Ảnh mới hơn"
          }
        }, {
          tag: "a",
          class: ["btn", "dark"],
          attr: {
            download: "",
            title: "Chia sẻ"
          },
          props: {
            id: "image-show-forward"
          },
          child: [{
            tag: "i",
            class: ["material-icons", "fa-share-photoview", "btn"],
            attr: {
              dataTranslateTitle: "STR_FORWARD_MSG",
              title: "Chia sẻ"
            }
          }]
        }, {
          tag: "a",
          class: ["btn", "dark"],
          child: [{
            tag: "i",
            class: ["material-icons", "fa-download", "btn"],
            attr: {
              dataTranslateTitle: "STR_SAVE_PHOTO_AS",
              title: "Lưu về máy"
            }
          }],
          props: {
            id: "image-show-download"
          },
          attr: {
            href: "#",
            target: "_blank",
            rel: "noopener noreferrer",
            download: "",
            title: "Lưu về máy"
          },
          on: {
            click: function (event) {
              event.preventDefault();
              var href = this.href;
              var fileName = this.download || 'noname.bin';

              if (href && href !== '#') {
                (0, _FileSaver.saveAs)(href, fileName);
              }
            }
          }
        }, {
          tag: "i",
          class: ["btn", "material-icons", "fa-rotate-left"],
          props: {
            dataTranslateTitle: "STR_ROTATE_LEFT",
            title: "Xoay trái"
          }
        }, {
          tag: "i",
          class: ["btn", "material-icons", "fa-rotate-right"],
          props: {
            dataTranslateTitle: "STR_ROTATE_RIGHT",
            title: "Xoay phải"
          }
        } // {
        //     tag:"i",
        //     class:["btn", "material-icons", "fa-more-option"],
        //     props:{
        //         dataTranslateTitle:"STR_MORE_OPTION",
        //     }
        // }
        ]
      }]
    }]
  });

  var container = _({
    tag: "modal",
    attr: {
      tabindex: 1
    },
    child: [temp]
  });

  Object.assign(container, descViewImagePreview.prototype);
  var self = container;
  self.closeButton = $('div#image-show__close.fl-r.image-show__close', temp);
  self.containImage = $('div.flx.flx-al-e.image-show__list', temp);
  self.prevButton = $('i.btn.material-icons.fa-chevron-left', temp);
  self.nextButton = $('i.btn.material-icons.fa-chevron-right', temp);
  self.prevButtonTop = $('div.image-show__btnc.image-show__btnc__left div.flx-fix.image-show__btn', temp);
  self.nextButtonTop = $('div.image-show__btnc.image-show__btnc__right div.flx-fix.image-show__btn', temp);
  self.forwardButton = $('a#image-show-forward', temp);
  self.downloadButton = $('a#image-show-download', temp);
  self.rotateLeftButton = $('i.btn.material-icons.fa-rotate-left', temp);
  self.rotateRightButton = $('i.btn.material-icons.fa-rotate-right', temp);
  self.titleTimeLine = $('span#image-show__thumb__legend_title_content', temp);
  self.avatarImage = $('div.avatar-img', temp);
  self.userName = $('div.truncate.user-name', temp);
  self.dateSubmit = $('div.truncate.date-submit', temp);
  self.noteImage = $('div#imageTitle.image-show__meta-wrapper  div.image-show__caption', temp);
  self.mainImage = $('div#mainImage>img.image-show__img.z-fh.fadeInImageShow', temp);
  self.openCloseTimeLine = $('div.image-show__btnc__fullscreen', temp);
  self.containerTimeLine = $('div.timeLineContainerCheck', temp);
  self.containerMainImage = $('div.#image-show.image-show__body.content', temp);
  self.timeLineMarker = $('div.timeline-slider__handle', temp);
  var supportsPassive = false;

  try {
    window.addEventListener("test", null, Object.defineProperty({}, 'passive', {
      get: function () {
        supportsPassive = true;
      }
    }));
  } catch (e) {}

  var wheelOpt = supportsPassive ? {
    passive: false
  } : false;
  var wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';
  self.prevButton.addEventListener("click", function (event) {
    self.SelectImage(self.itemSelect.nextElement().index);
  });
  self.nextButton.addEventListener("click", function (event) {
    self.SelectImage(self.itemSelect.prevElement().index);
  });
  self.prevButtonTop.addEventListener("click", function (event) {
    self.SelectImage(self.itemSelect.nextElement().index);
  });
  self.nextButtonTop.addEventListener("click", function (event) {
    self.SelectImage(self.itemSelect.prevElement().index);
  });
  self.rotateLeftButton.addEventListener("click", function (event) {
    self.setRoation(-90);
  });
  self.rotateRightButton.addEventListener("click", function (event) {
    self.setRoation(90);
  });
  self.closeButton.addEventListener("click", function (event) {
    self.selfRemove();
  });
  self.containImage.addEventListener(wheelEvent, function (event) {
    event.preventDefault();
  }, wheelOpt);
  var deltaYcontainImage = 0;
  var deltaYcontainerMainImage = 0;
  self.containImage.addEventListener("wheel", function (event) {
    if (Math.abs(deltaYcontainImage) < 200) {
      if (deltaYcontainImage * event.deltaY < 0) deltaYcontainImage = event.deltaY;else deltaYcontainImage += event.deltaY;
    } else {
      if (deltaYcontainImage < 0) {
        var next = self.itemSelect.prevElement();
        if (next !== null) self.SelectImage(next.index);
      } else {
        var next = self.itemSelect.nextElement();
        if (next !== null) self.SelectImage(next.index);
      }

      deltaYcontainImage = 0;
    }
  });
  self.containerMainImage.addEventListener("wheel", function (event) {
    if (Math.abs(deltaYcontainerMainImage) < 50) {
      if (deltaYcontainerMainImage * event.deltaY < 0) deltaYcontainerMainImage = 0;else deltaYcontainerMainImage += event.deltaY;
    } else {
      if (deltaYcontainerMainImage < 0) {
        self.setScale(0.125);
      } else {
        self.setScale(-0.125);
      }

      deltaYcontainerMainImage = 0;
    }
  });
  self.openCloseTimeLine.addEventListener("click", function (event) {
    if (self.containerTimeLine.classList.contains("displayNone")) {
      self.containerTimeLine.classList.remove("displayNone");
    } else {
      self.containerTimeLine.classList.add("displayNone");
    }
  });
  self.containImage.indexDay = -1;
  self.containImage.indexElement = -1;
  self.renderItems(data, index);

  if (promiseLazyLoad !== undefined) {
    self.addFunctionLazyLoad(promiseLazyLoad);
  }

  var functionESC = function (event) {
    if (event.keyCode == 27) {
      self.selfRemove();
      self.removeEventListener("keydown", functionESC);
      var arr = document.body.getElementsByClassName("as-modal");

      if (arr.length > 0) {
        arr[arr.length - 1].focus();
      }
    }
  };

  self.addEventListener("keydown", functionESC);
  setTimeout(function () {
    self.focus();
  }, 100);
  return self;
}

descViewImagePreview.prototype.renderItems = function (data, index) {
  var self = this;
  var dataCheck = [];
  data.sort(function (a, b) {
    var dateA = new Date(a.date);
    var dateB = new Date(b.date);
    if (dateA < dateB) return 1;
    if (dateA > dateB) return -1;
    return 0;
  });
  var dayThumnail, day, format, date;
  var today = new Date();

  for (var i = 0; i < data.length; i++) {
    date = new Date(data[i].date);
    if (today.getFullYear() === date.getFullYear()) format = (0, _FormatFunction.formatDate)(date);else format = (0, _FormatFunction.formatDate)(date, undefined, undefined, undefined, undefined, true);

    if (dataCheck[format] === undefined) {
      dataCheck[format] = [data[i]];
      day = _({
        tag: "span",
        attr: {
          dataTranslateInner: "STR_DATE_TIME"
        }
      });
      dayThumnail = _({
        tag: "div",
        class: "image-show__thumb__legend",
        child: [day]
      });

      if (date.getDay() === today.getDay() && date.getMonth() === today.getMonth()) {
        format = "Hôm nay";
      }

      day.addChild(_({
        text: format
      }));

      dayThumnail.getDate = function (formatDate) {
        return function () {
          return formatDate;
        };
      }(format);

      dayThumnail.getValue = function (mDate) {
        return function () {
          return mDate;
        };
      }(date);

      self.containImage.indexDay++;
      dayThumnail.indexDay = self.containImage.indexDay;
      self.containImage.appendChild(dayThumnail);
    } else dataCheck[format] = dataCheck[format].concat([data[i]]);

    if (data[i].id !== undefined) self.containImage.indexElement = data[i].id;else self.containImage.indexElement++;
    var item = self.ItemTimeLine(data[i], self.containImage.indexElement);
    item.dayElement = dayThumnail;
    self.containImage.appendChild(item);
  }

  if (index !== undefined) self.SelectImage(index);
};

descViewImagePreview.prototype.resetImage = function (data) {
  var self = this;

  var newMainImage = _({
    tag: "img",
    class: ["image-show__img", "z-fh", "fadeInImageShow"],
    attr: {
      draggable: "false",
      // crossorigin:"Anonymous",
      src: data.src
    }
  });

  newMainImage.addEventListener('mousedown', start_drag);
  newMainImage.addEventListener('mousemove', while_drag);
  newMainImage.addEventListener('mouseup', stop_drag);
  newMainImage.rotateRadius = 0;
  newMainImage.scaleUnit = 1;
  newMainImage.style.transform = "rotate(" + newMainImage.rotateRadius + "deg) translate(0rem, 0rem) scale(" + newMainImage.scaleUnit + ")";
  newMainImage.addEventListener("click", function () {
    var element = this;
    setTimeout(function () {
      if (element.moved !== true && data.note != "") {
        if (self.noteImage.parentNode.classList.contains("displayNone")) self.noteImage.parentNode.classList.remove("displayNone");else self.noteImage.parentNode.classList.add("displayNone");
      }
    });
  }, 100);
  this.downloadButton.setAttribute("href", data.src);

  if (data.downloadName !== undefined) {
    this.downloadButton.setAttribute("download", data.downloadName);
  } else this.downloadButton.setAttribute("download", "");

  this.mainImage.parentNode.replaceChild(newMainImage, this.mainImage);
  this.mainImage = newMainImage;
  this.noteImage.innerText = data.note;
  if (data.note == "") self.noteImage.parentNode.classList.add("displayNone");
  this.avatarImage.style.backgroundImage = "url(" + data.avatar + ")";
  this.userName.innerText = data.userName;
  this.dateSubmit.innerText = (0, _FormatFunction.formatDate)(data.date, true, true, true, true, true);
};

descViewImagePreview.prototype.setRoation = function (radius) {
  this.mainImage.rotateRadius += radius;
  this.mainImage.style.transform = "rotate(" + this.mainImage.rotateRadius + "deg) translate(0rem, 0rem) scale(" + this.mainImage.scaleUnit + ")";
};

descViewImagePreview.prototype.setScale = function (scale) {
  if (this.mainImage.scaleUnit + scale < 1) {
    this.mainImage.style.position = "";
    this.mainImage.style.top = "";
    this.mainImage.style.left = "";
    return;
  }

  if (this.mainImage.style.position === "") {
    this.mainImage.style.position = "absolute";
  }

  this.mainImage.scaleUnit += scale;
  this.mainImage.style.transform = "rotate(" + this.mainImage.rotateRadius + "deg) translate(0rem, 0rem) scale(" + this.mainImage.scaleUnit + ")";
};

descViewImagePreview.prototype.SelectImage = function (index) {
  if (this.itemSelect !== undefined) this.itemSelect.classList.remove("selected");
  this.itemSelect = $("div#thumb_" + index, this);
  this.itemSelect.classList.add("selected");
  this.resetImage(this.itemSelect.data);

  if (this.itemSelect.nextElement() === null) {
    if (!this.prevButton.classList.contains("unclickable")) this.prevButton.classList.add("unclickable");
    if (this.prevButtonTop.classList.contains("clickable")) this.prevButtonTop.classList.remove("clickable");
  } else {
    if (this.prevButton.classList.contains("unclickable")) this.prevButton.classList.remove("unclickable");
    if (!this.prevButtonTop.classList.contains("clickable")) this.prevButtonTop.classList.add("clickable");
  }

  if (this.itemSelect.prevElement() === null) {
    if (!this.nextButton.classList.contains("unclickable")) this.nextButton.classList.add("unclickable");
    if (this.nextButtonTop.classList.contains("clickable")) this.nextButtonTop.classList.remove("clickable");
  } else {
    if (this.nextButton.classList.contains("unclickable")) this.nextButton.classList.remove("unclickable");
    if (!this.nextButtonTop.classList.contains("clickable")) this.nextButtonTop.classList.add("clickable");
  }

  this.scrollView();
  var self = this;
  setTimeout(function () {
    var arr = self.containImage.getElementsByClassName("image-show__thumb__legend");
    var last, current;

    for (var i = 0; i < arr.length; i++) {
      last = current;
      current = arr[i];

      if (self.titleTimeLine.getBoundingClientRect().y <= current.getBoundingClientRect().y - 16) {
        if (last !== undefined) self.titleTimeLine.innerText = last.getDate();else self.titleTimeLine.innerText = current.getDate();
        break;
      }
    }
  }, 10);
};

descViewImagePreview.prototype.scrollView = function () {
  var self = this;
  this.containImage.scrollTop = this.itemSelect.offsetTop - this.containImage.offsetHeight / 2;
  this.timeLineMarker.style.top = "calc(" + this.itemSelect.dayElement.indexDay / this.containImage.indexDay * 100 + "% - 0rem)";
  if (this.promiseLazyLoad !== undefined) if (this.itemSelect.dayElement.indexDay === this.containImage.indexDay) this.promiseLazyLoad.then(function (result) {
    self.renderItems(result);
    self.scrollView();
    self.promiseLazyLoad = undefined;
  });
};

descViewImagePreview.prototype.addFunctionLazyLoad = function (promiseLazyLoad) {
  this.promiseLazyLoad = promiseLazyLoad;
};

descViewImagePreview.prototype.ItemTimeLine = function (data, i) {
  var self = this;
  var index;
  if (data.index !== undefined) index = data.index;else index = i;

  var temp = _({
    tag: "div",
    class: "image-show__thumb-container",
    props: {
      id: "thumb_" + index
    },
    on: {
      click: function (event) {
        self.SelectImage(index);
      }
    },
    child: [{
      tag: "img",
      class: ["image-show__thumb", "clickable"],
      attr: {// crossorigin:"Anonymous"
      },
      props: {
        src: data.src
      }
    }]
  });

  temp.data = data;
  temp.index = index;
  temp.imageElement = $('div.image-show__thumb-container img.image-show__thumb', temp);

  temp.nextElement = function () {
    var indexElement = temp;

    do {
      indexElement = indexElement.nextSibling;
    } while (indexElement !== null && !indexElement.classList.contains("image-show__thumb-container"));

    return indexElement;
  };

  temp.prevElement = function () {
    var indexElement = temp;

    do {
      indexElement = indexElement.previousSibling;
    } while (indexElement !== null && !indexElement.classList.contains("image-show__thumb-container"));

    return indexElement;
  };

  return temp;
};

function start_drag() {
  img_ele = this;
  x_img_ele = window.event.clientX - img_ele.offsetLeft;
  y_img_ele = window.event.clientY - img_ele.offsetTop;
  this.moved = false;
}

function stop_drag() {
  img_ele = null;
}

function while_drag() {
  if (this.moved === false) {
    this.moved = true;
  }

  x_cursor = window.event.clientX;
  y_cursor = window.event.clientY;

  if (img_ele !== null) {
    img_ele.style.left = x_cursor - x_img_ele + 'px';
    img_ele.style.top = window.event.clientY - y_img_ele + 'px';
  }
}
};

moduleFactories["node_modules/pizo/js/component/modal_drag_drop_manyfiles.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/pizo/js/component/modal_drag_drop_manyfiles.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _Fcore = _interopRequireDefault(require("../dom/Fcore"));

require("../../css/form_create_edit.css");

require("../../css/test_question.css");

require("../../css/test.css");

var _FormatFunction = require("./FormatFunction");

var _ModuleImage = require("./ModuleImage");


function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }

var _ = _Fcore.default._;
var $ = _Fcore.default.$;
var xmlModalDragManyFiles;

var _default = xmlModalDragManyFiles = {
  imgUrl: [],
  files: [],
  avatar: "",
  note: "",
  userName: "",
  enableClick: false,
  iconSrc: "https://lab.daithangminh.vn/vivid_exticons/",
  deleteAllTrash: function () {},
  functionFormat: function (data) {
    return data;
  },
  setProfile: function (profile = {}) {
    if (profile.userName !== undefined) this.userName = profile.userName;
    if (profile.avatar !== undefined) this.avatar = profile.avatar;
    if (profile.note !== undefined) this.note = profile.note;
  },
  setFormatData: function (functionFormat) {
    this.functionFormat = functionFormat;
  },
  enableCheckBox: false,
  enableSelectbox: false,
  Image: function (srcImg) {
    var self = this;
    var temp;

    var img = _({
      tag: "img",
      class: ["full-size"],
      props: {
        src: srcImg
      },
      on: {
        click: function () {
          if (self.enableClick === false) return;
          var manyfiles = self.getFile();
          var arr = [];
          var index;

          for (var i = 0; i < manyfiles.length; i++) {
            if (typeof manyfiles[i] == "object") {
              var dataTemp = self.functionFormat(manyfiles[i]);
              if (manyfiles[i].ref !== undefined) dataTemp.src = manyfiles[i].ref + manyfiles[i].src;
              arr.push(dataTemp);
            } else arr.push({
              avatar: self.avatar,
              userName: self.userName,
              src: manyfiles[i],
              date: new Date().toISOString(),
              note: self.note
            });

            if (manyfiles[i] == temp.value) index = i;
          }

          document.body.appendChild((0, _ModuleImage.descViewImagePreview)(arr, index));
        }
      }
    });

    temp = _({
      tag: "div",
      class: "grid-item",
      child: [img, {
        tag: "i",
        class: "material-icons",
        style: {
          overflow: "hidden",
          position: "absolute",
          right: "7px",
          top: "7px",
          cursor: "pointer",
          height: "fit-content",
          margin: 0,
          width: "fit-content",
          userSelect: "none",
          backgroundColor: "white",
          fontSize: "21px"
        },
        on: {
          click: function (event) {
            this.parentNode.selfRemove();

            if (self.getFile().length == 0) {
              if (!self.select.classList.contains("disable")) self.select.classList.add("disable");
            }
          }
        },
        props: {
          innerHTML: "close"
        }
      }]
    });

    if (self.enableCheckBox == true) {
      var checkboxButton = _({
        tag: "button",
        class: "pizo-container-icon-radiobutton",
        on: {
          click: function (event) {
            if (self.gallery === undefined) {
              self.gallery = $(".gallery_c0ek499ts0", this.mContainGetImage);
            }

            var arr = self.gallery.getElementsByClassName("checked-pizo");
            if (arr.length > 0) arr[0].classList.remove("checked-pizo");
            {
              temp.classList.add("checked-pizo");
            }
          }
        },
        child: [{
          tag: "i",
          class: "material-icons",
          style: {
            overflow: "hidden",
            cursor: "pointer",
            userSelect: "none",
            fontSize: "13px"
          },
          props: {
            innerHTML: "stop_circle"
          }
        }]
      });

      temp.checkboxButton = checkboxButton;
      temp.insertBefore(checkboxButton, temp.firstChild);
    }

    window.addEventListener("click", function (event) {
      if (event.target !== temp && temp !== undefined && temp.parentNode !== undefined) {
        var el = temp;

        while (el.parentNode != undefined && !el.classList.contains("image-autoresize-create")) el = el.parentNode;

        if (el !== document) if (el.classList.contains("hasFocus")) el.classList.remove("hasFocus");
      }
    });
    img.addEventListener("load", function () {
      temp.onload.bind(this)();
    });

    if (self.getFile().length == 0) {
      temp.classList.add("checked-pizo");
    }

    return temp;
  },
  enableGetDetail: function (isDetail = true) {
    this.enableDetail = isDetail;
  },
  containGetImage: function () {
    var self = this;

    var input = _({
      tag: "input",
      class: "modal-upload-XML-body-drop-area-main-form-input",
      attr: {
        multiple: ""
      },
      props: {
        type: "file",
        accept: "*/*",
        id: "fileElem"
      },
      on: {
        change: function () {
          self.handleFiles(this.files, self);
        }
      }
    });

    self.select = _({
      tag: "div",
      class: ["quantumWizButtonEl", "quantumWizButtonPaperbuttonEl", "quantumWizButtonPaperbuttonFlat", "quantumWizButtonPaperbuttonFlatColored", "quantumWizButtonPaperbutton2El2", "quantumWizDialogPaperdialogDialogButton", "disable"],
      style: {
        backgroundColor: "#2196F3",
        border: "1px solid rgb(169, 169, 169)",
        width: "90px"
      },
      child: [{
        tag: "span",
        class: "quantumWizButtonPaperbuttonContent",
        child: [{
          tag: "span",
          class: "quantumWizButtonPaperbuttonLabel",
          style: {
            color: "white"
          },
          props: {
            innerHTML: "Tải lên"
          }
        }]
      }],
      on: {
        click: function () {
          self.functionClickDone();
          if (self.modal !== undefined) self.modal.parentNode.removeChild(self.modal);
        }
      }
    });

    var temp = _({
      tag: "div",
      class: "modal-upload-XML-body-drop",
      child: [{
        tag: "div",
        class: "modal-upload-XML-body-drop-area",
        child: [{
          tag: "div",
          class: "modal-upload-XML-body-drop-area-main",
          child: [{
            tag: "div",
            class: ["modal-upload-XML-body-drop-area-main-form", "displayVisible", "drop-area_c0ek499ts0"],
            child: [{
              tag: "div",
              class: "modal-upload-XML-body-drop-area-main-form-content",
              child: [input, {
                tag: "button",
                class: "modal-upload-XML-body-drop-area-main-form-button",
                props: {
                  innerHTML: "Chọn files để tải lên",
                  for: "fileElem"
                },
                on: {
                  click: function () {
                    input.click();
                  }
                }
              }, {
                tag: "p",
                class: "modal-upload-XML-body-drop-area-main-form-tutorial",
                props: {
                  innerHTML: "Kéo thả files vào đây"
                }
              }, {
                tag: "div",
                class: ["modal-upload-XML-body-drop-area-main-gallery", "grid", "gallery_c0ek499ts0"]
              }, {
                tag: "progress",
                class: ["modal-upload-XML-body-drop-area-main-process-bar", "progress-bar_c0ek499ts0"],
                props: {
                  max: "100",
                  value: "0"
                }
              }]
            }, {
              tag: "div",
              class: "modal-upload-XML-body-drop-save",
              child: [self.select, {
                tag: "div",
                class: ["quantumWizButtonEl", "quantumWizButtonPaperbuttonEl", "quantumWizButtonPaperbuttonFlat", "quantumWizButtonPaperbuttonFlatColored", "quantumWizButtonPaperbutton2El2", "quantumWizDialogPaperdialogDialogButton"],
                style: {
                  marginLeft: "10px",
                  border: "1px solid rgb(169, 169, 169)",
                  width: "90px"
                },
                child: [{
                  tag: "span",
                  class: "quantumWizButtonPaperbuttonContent",
                  child: [{
                    tag: "span",
                    class: "quantumWizButtonPaperbuttonLabel",
                    props: {
                      innerHTML: "Hủy"
                    }
                  }]
                }],
                on: {
                  click: function () {
                    self.functionClickCancel();
                    self.resetFile();
                    if (self.modal !== undefined) self.modal.parentNode.removeChild(self.modal);
                  }
                }
              }]
            }]
          }]
        }]
      }]
    });

    self.xnen = temp;
    self.mContainGetImage = temp;
    return temp;
  },
  createModal: function (DOMElement, functionClickDone = function () {}, functionClickCancel = function () {}) {
    var self = this;
    var xnen = self.containGetImage();

    var pointControl = _({
      tag: "div",
      class: ["modal-upload-XML-body-navigation-bar", "selected-modal"],
      child: [{
        tag: "div",
        class: "modal-upload-XML-body-navigation-bar-button",
        props: {
          innerHTML: "Tải lên"
        }
      }],
      on: {
        click: function () {
          if (self.me === this) return;
          if (self.me !== undefined) self.me.classList.remove("selected-modal");
          this.classList.add("selected-modal");
          self.me = this;
          xnen.setPage(0);
        }
      }
    });

    self.me = pointControl;
    self.modal = _({
      tag: "modal",
      child: [{
        tag: "div",
        class: "modal-upload-XML",
        child: [{
          tag: "div",
          class: "modal-upload-XML-header",
          child: [{
            tag: "div",
            class: "modal-upload-XML-header-text",
            props: {
              innerHTML: "Chèn Files"
            }
          }, {
            tag: "i",
            class: ["modal-upload-XML-header-icon-close", "material-icons"],
            props: {
              innerHTML: "close"
            },
            on: {
              click: function () {
                self.modal.parentNode.removeChild(self.modal);
              }
            }
          }]
        }, {
          tag: "div",
          class: "modal-upload-XML-body",
          child: [{
            tag: "div",
            class: "modal-upload-XML-body-navigation",
            child: [pointControl]
          }, xnen]
        }]
      }]
    });
    DOMElement.appendChild(self.modal);
    self.functionClickDone = functionClickDone;
    self.functionClickCancel = functionClickCancel;
    self.createEvent();
    return self.modal;
  },
  createEvent: function () {
    var self = this;

    if (self.dropArea === undefined) {
      self.dropArea = $('.drop-area_c0ek499ts0', self.mContainGetImage);
    } // self.dropArea = document.getElementById("drop-area");
    // Prevent default drag behaviors


    ["dragenter", "dragover", "dragleave", "drop"].forEach(eventName => {
      self.dropArea.addEventListener(eventName, self.preventDefaults, false);
      document.body.addEventListener(eventName, self.preventDefaults, false);
    }); // Highlight drop area when item is dragged over it

    ["dragenter", "dragover"].forEach(eventName => {
      self.dropArea.addEventListener(eventName, self.highlight, false);
    });
    ["dragleave", "drop"].forEach(eventName => {
      self.dropArea.addEventListener(eventName, self.unhighlight, false);
    }); // Handle dropped files

    self.dropArea.addEventListener("drop", function (e) {
      self.handleDrop(e, self);
    }, false);
    self.uploadProgress = [];
  },
  preventDefaults: function (e) {
    e.preventDefault();
    e.stopPropagation();
  },
  highlight: function (e) {
    this.classList.add("highlight");
  },
  unhighlight: function (e) {
    this.classList.remove("active");
  },
  handleDrop: function (e, self) {
    var dt = e.dataTransfer;
    var files = dt.files;
    self.handleFiles(files, self);
  },
  initializeProgress: function (numFiles) {
    var self = this;
    if (self.progressBar === undefined) self.progressBar = $('.progress-bar_c0ek499ts0', self.mContainGetImage);
    self.progressBar.value = 0;
    self.uploadProgress = [];

    for (var i = numFiles; i > 0; i--) {
      self.uploadProgress.push(0);
    }
  },
  updateProgress: function (fileNumber, percent, self) {
    self.uploadProgress[fileNumber] = percent;
    var total = self.uploadProgress.reduce((tot, curr) => tot + curr, 0) / self.uploadProgress.length;
    console.debug("update", fileNumber, percent, total);
    self.progressBar.value = total;
  },
  handleFiles: function (files) {
    var self = this;
    files = _toConsumableArray(files);
    self.initializeProgress(files.length);

    for (var i = 0; i < files.length; i++) {
      self.uploadFile(files[i], i);
      self.previewFile(files[i]);
    }
  },
  marginAlign: function () {
    var temp = _({
      tag: "div",
      class: "max-width-image-resize"
    });

    temp.getValue = function () {
      var resultXML = "";

      for (var i = 0; i < temp.childNodes.length; i++) {
        resultXML += temp.childNodes[i].getValue();
      }

      return resultXML;
    };

    return temp;
  },
  previewFile: function (file) {
    var self = this;

    if (self.gallery === undefined) {
      self.gallery = $(".gallery_c0ek499ts0", self.mContainGetImage);
    }

    if (file.type.match("image.*")) {
      var reader = new FileReader();
      reader.readAsDataURL(file);

      reader.onloadend = function () {
        if (self.blackWhite === true) {
          (0, _FormatFunction.grayscale)(reader.result, true).then(function (value) {
            var img = self.Image(value);

            if (self.enableDetail == true) {
              img.value = {
                src: value,
                file: file
              };
            } else {
              img.value = value;
            }

            var parent = self.gallery;
            parent.appendChild(img);

            img.onload = function () {};
          });
        } else {
          var value = reader.result;
          var img = self.Image(value);

          if (self.enableDetail == true) {
            img.value = {
              src: value,
              file: file
            };
          } else {
            img.value = value;
          }

          var parent = self.gallery;
          parent.appendChild(img);

          img.onload = function () {};
        }
      };
    } else {
      var img = self.Image(this.iconSrc + file.name.substr(file.name.lastIndexOf('.') + 1) + ".svg");
      img.value = file;
      var parent = self.gallery;
      parent.appendChild(img);

      img.onload = function () {};
    }
  },
  setBackWhite: function () {
    this.blackWhite = true;
  },
  addFile: function (data, ref = "") {
    if (this.gallery === undefined) {
      this.gallery = $(".gallery_c0ek499ts0", this.mContainGetImage);
    }

    var img = this.Image(ref + data.src);

    if (this.enableCheckBox && data.thumnail == 1) {
      img.checkboxButton.click();
    }

    data.ref = ref;
    img.value = data;
    var parent = this.gallery;
    parent.appendChild(img);

    img.onload = function () {};
  },
  resetFile: function () {
    var self = this;

    if (self.gallery === undefined) {
      self.gallery = $(".gallery_c0ek499ts0", self.mContainGetImage);
    }

    self.gallery.clearChild();
  },
  getFile: function () {
    var arr = [];

    if (this.gallery === undefined) {
      this.gallery = $(".gallery_c0ek499ts0", this.mContainGetImage);
    }

    for (var i = 0; i < this.gallery.childNodes.length; i++) {
      arr.push(this.gallery.childNodes[i].value);
    }

    return arr;
  },
  getImportTant: function () {
    if (this.gallery === undefined) {
      this.gallery = $(".gallery_c0ek499ts0", this.mContainGetImage);
    }

    var arr = this.gallery.getElementsByClassName("checked-pizo");
    if (arr.length > 0) return this.getFile().indexOf(arr[0].value);
  },
  uploadFile: function (file, i, self) {
    var self = this;
    self.updateProgress(i, 100, self);
    self.select.classList.remove("disable");
    if (!self.xnen.classList.contains("visible")) self.xnen.classList.add("visible"); // var url = "./php/upload/handle_file_upload.php";
    // var name =
    //   ("img_" + Math.random() + Math.random()).replace(/\./g, "") +
    //   file.name.slice(file.name.lastIndexOf("."));
    // var xhr = new XMLHttpRequest();
    // var formData = new FormData();
    // xhr.open("POST", url, true);
    // xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    // // Update progress (can be used to show progress indicator)
    // xhr.upload.addEventListener("progress", function(e) {
    //   self.updateProgress(i, (e.loaded * 100.0) / e.total || 100, self);
    // });
    // xhr.addEventListener("readystatechange", function(e) {
    //   if (xhr.readyState == 4 && xhr.status == 200) {
    //     self.updateProgress(i, 100, self); // <- Add this
    //     // self.select.classList.remove("disable");
    //     if (!self.modal.classList.contains("visible"))
    //       self.modal.classList.add("visible");
    //     self.imgUrl.src = "./img/delete/" + name;
    //     self.imgAll.push("./img/delete/" + name);
    //     document.getElementById("gallery").style.position = "relative";
    //   } else if (xhr.readyState == 4 && xhr.status != 200) {
    //     // Error. Inform the user
    //   }
    // });
    // formData.append("upload_name", name);
    // formData.append("file", file);
    // xhr.send(formData);
  }
};

exports.default = _default;
};

moduleFactories["node_modules/absol-photoswipeviewer/PhotoSwipeViewer.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-photoswipeviewer/PhotoSwipeViewer.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

var _AComp = _interopRequireDefault(require("absol-acomp/AComp"));

var _photoswipeviewer = _interopRequireDefault(require("./photoswipeviewer.css"));

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _Draggable = _interopRequireDefault(require("absol-acomp/js/Draggable"));


var _ = _AComp.default._;
var $ = _AComp.default.$;

function PhotoSwipeViewer() {
  this.photoList = [];
  this.currentPhotoItem = null;
  this.STATE_END = 9;
  this.STATE_PICKED = 1;
  this.state = 0;
  this.tool = -1;
  this.TOOL_ZOOM_IN = 1;
  this.TOOL_ZOOM_OUT = 2;
  this.TOOL_PAN = 3;
  this.FIXED = "FIXED";
  this.ORIGIN = "ORIGIN";
}

PhotoSwipeViewer.prototype.close = function () {
  if (this.state == this.STATE_END) return;
  this.state = this.STATE_END;
  this.disableTool();

  if (this.$viewingImg) {
    var photoItem = this.currentPhotoItem;
    this.$viewingImg.addClass('transition-all');
    setTimeout(function () {
      this.$viewingImg.addStyle(photoItem.initStyle);
    }.bind(this), 1);
    setTimeout(function () {
      this.$viewingImg.removeClass('transition-all');
      this.$view.removeClass('full').removeClass('prepare-hide');
      this.$viewingImg.selfRemove();
      this.$viewingImg = null;
    }.bind(this), 305);
  }

  this.$view.addClass('prepare-hide');
  this.$view.blur();
};

PhotoSwipeViewer.prototype.disableTool = function () {
  this.tool = -1;
  this.$frame.removeClass('ptswpv-tool-mode-zoom-in').removeClass('ptswpv-tool-mode-zoom-out').removeClass('ptswpv-tool-mode-pan');
};

PhotoSwipeViewer.prototype.activePanTool = function () {
  this.tool = this.TOOL_PAN;
  this.$frame.removeClass('ptswpv-tool-mode-zoom-in').removeClass('ptswpv-tool-mode-zoom-out').addClass('ptswpv-tool-mode-pan');
};

PhotoSwipeViewer.prototype.activeZoomInTool = function () {
  this.tool = this.TOOL_ZOOM_IN;
  this.$frame.removeClass('ptswpv-tool-mode-pan').removeClass('ptswpv-tool-mode-zoom-out').addClass('ptswpv-tool-mode-zoom-in');
};

PhotoSwipeViewer.prototype.activeZoomOutTool = function () {
  this.tool = this.TOOL_ZOOM_OUT;
  this.$frame.removeClass('ptswpv-tool-mode-pan').removeClass('ptswpv-tool-mode-zoom-in').addClass('ptswpv-tool-mode-zoom-out');
};

PhotoSwipeViewer.prototype.zoom = function (hs, event) {
  var imgBound = this.$viewingImg.getBoundingClientRect();
  var frameSize = this.$frame.getBoundingClientRect();
  var ox = 0.5,
      oy = 0.5,
      dx = 0,
      dy = 0;

  if (event) {
    ox = (event.clientX - imgBound.left) / (imgBound.right - imgBound.left);
    oy = (event.clientY - imgBound.top) / (imgBound.bottom - imgBound.top);
    dx = event.clientX - (frameSize.left + frameSize.right) / 2;
    dy = event.clientY - (frameSize.top + frameSize.bottom) / 2;
  }

  var photoItem = this.currentPhotoItem;

  if (hs == this.FIXED) {
    photoItem.scale = Math.min(frameSize.width / photoItem.originSize.width, frameSize.height / photoItem.originSize.height);
  } else if (hs == this.ORIGIN) {
    photoItem.scale = 1;
  } else {
    photoItem.scale *= hs;
  }

  var viewImg = this.$viewingImg;
  var nWidth = photoItem.originSize.width * photoItem.scale;
  var nHeight = photoItem.originSize.height * photoItem.scale;
  var nLeft = frameSize.width / 2 + dx - nWidth * ox;
  var nTop = frameSize.height / 2 + dy - nHeight * oy;
  var maxTop, minTop, maxLeft, minLeft;

  if (nHeight > frameSize.height) {
    maxTop = 0;
    minTop = frameSize.height - nHeight;
  } else {
    minTop = frameSize.height / 2 - nHeight / 2;
    maxTop = minTop;
  }

  if (nWidth > frameSize.width) {
    maxLeft = 0;
    minLeft = frameSize.width - nWidth;
  } else {
    minLeft = frameSize.width / 2 - nWidth / 2;
    maxLeft = minLeft;
  }

  nLeft = Math.min(Math.max(nLeft, minLeft), maxLeft);
  nTop = Math.min(Math.max(nTop, minTop), maxTop);
  if (hs < 1 && nWidth < photoItem.originSize.width && Math.max(nWidth, nHeight) < 10) return;
  viewImg.addClass('transition-all');
  setTimeout(function () {
    this.$viewingImg.addStyle({
      width: nWidth + 'px',
      height: nHeight + 'px',
      left: nLeft + 'px',
      top: nTop + 'px'
    });

    if (photoItem._transitionTimeout) {
      clearTimeout(photoItem._transitionTimeout);
    }

    photoItem._transitionTimeout = setTimeout(function () {
      viewImg.removeClass('transition-all');
      photoItem._transitionTimeout = -1;
    }, 300);
  }.bind(this), 1);
};

PhotoSwipeViewer.prototype.zoomFixedSize = function () {
  // aspect_ratio
  this.zoom(this.FIXED);
};

PhotoSwipeViewer.prototype.zoomOriginSize = function () {
  // aspect_ratio
  this.zoom(this.ORIGIN);
};

PhotoSwipeViewer.prototype.download = function () {
  this.$downloadA.attr({
    href: this.currentPhotoItem.originImg.src,
    download: this.currentPhotoItem.originFileName || 'image',
    target: "_blank"
  }).click();
};

PhotoSwipeViewer.prototype.clickHandler = function (event) {
  event.preventDefault();
  if (this.tool == this.TOOL_ZOOM_IN) this.zoom(1.3, event);
  if (this.tool == this.TOOL_ZOOM_OUT) this.zoom(1 / 1.3, event);
};

PhotoSwipeViewer.prototype.dragHandler = function (event) {
  event.preventDefault();

  if (this.tool == this.TOOL_PAN) {
    var imgBound = this.$viewingImg.getBoundingClientRect();
    var frameSize = this.$frame.getBoundingClientRect();
    var nTop = imgBound.top - frameSize.top + event.movementY;
    var nLeft = imgBound.left - frameSize.left + event.movementX;
    this.$viewingImg.addStyle({
      top: nTop + 'px',
      left: nLeft + 'px'
    });
  }
};

PhotoSwipeViewer.prototype.endragHandler = function (event) {
  event.preventDefault();

  if (this.tool == this.TOOL_PAN) {
    var imgBound = this.$viewingImg.getBoundingClientRect();
    var frameSize = this.$frame.getBoundingClientRect();
    var top = imgBound.top - frameSize.top;
    var left = imgBound.left - frameSize.left;
    var maxTop, minTop, maxLeft, minLeft;

    if (imgBound.height > frameSize.height) {
      maxTop = 0;
      minTop = frameSize.height - imgBound.height;
    } else {
      minTop = frameSize.height / 2 - imgBound.height / 2;
      maxTop = minTop;
    }

    if (imgBound.width > frameSize.width) {
      maxLeft = 0;
      minLeft = frameSize.width - imgBound.width;
    } else {
      minLeft = frameSize.width / 2 - imgBound.width / 2;
      maxLeft = minLeft;
    }

    var nLeft = Math.min(Math.max(left, minLeft), maxLeft);
    var nTop = Math.min(Math.max(top, minTop), maxTop);
    var dx = nLeft - left;
    var dy = nTop - top;

    if (dx != 0 || dy != 0) {
      var img = this.$viewingImg;
      setTimeout(function () {
        img.addClass('transition-all');
        setTimeout(function () {
          img.addStyle({
            left: nLeft + 'px',
            top: nTop + 'px'
          });
          setTimeout(function () {
            img.removeClass('transition-all');
          }, 300);
        }, 1);
      }, 1);
    }
  }
};

PhotoSwipeViewer.prototype.getView = function () {
  if (this.$view) return this.$view;
  this.topbarBtnNames = ['file_download', 'fullscreen', 'fullscreen_exit', 'pan_tool', 'zoom_in', 'zoom_out', 'close'];
  this.$view = _({
    class: 'ptswpv',
    attr: {
      tabindex: '1'
    },
    child: ['a.ptswpv-download', {
      class: 'ptswpv-frame',
      attr: {
        tabindex: '1'
      },
      child: [{
        class: 'ptswpv-viewing-container'
      }, '.ptswpv-renderer', {
        class: 'ptswpv-top-bar',
        child: this.topbarBtnNames.map(function (name) {
          return `<button class="ptswpv-transp-btn ptswpv-btn-${name}"> <i class="material-icons">${name}</i></button>`;
        })
      }]
    }],
    on: {
      keydown: function (event) {
        if (event.key == "Escape") {
          event.preventDefault();
          this.close();
        }
      }.bind(this)
    }
  });
  this.$viewingContainder = $('.ptswpv-viewing-container', this.$view);
  this.$renderer = $('.ptswpv-renderer', this.$view);
  this.$frame = $('.ptswpv-frame', this.$view);
  this.$closeBtn = $('.ptswpv-btn-close', this.$view).on('click', this.close.bind(this));
  this.$panToolBtn = $('.ptswpv-btn-pan_tool', this.$view).on('click', this.activePanTool.bind(this));
  this.$zoomInToolBtn = $('.ptswpv-btn-zoom_in', this.$view).on('click', this.activeZoomInTool.bind(this));
  this.$zoomOutToolBtn = $('.ptswpv-btn-zoom_out', this.$view).on('click', this.activeZoomOutTool.bind(this));
  this.$fixedBtn = $('.ptswpv-btn-fullscreen', this.$view).on('click', this.zoomFixedSize.bind(this));
  this.$originSizeBtn = $('.ptswpv-btn-fullscreen_exit', this.$view).on('click', this.zoomOriginSize.bind(this));
  this.$downloadBtn = $('.ptswpv-btn-file_download', this.$view).on('click', this.download.bind(this));
  (0, _Draggable.default)(this.$viewingContainder).on('drag', this.dragHandler.bind(this)).on('enddrag', this.endragHandler.bind(this)).on('click', this.clickHandler.bind(this));
  ;
  this.$downloadA = $('a.ptswpv-download', this.$view);
  return this.$view;
};

PhotoSwipeViewer.prototype.pickImageElement = function (element, originLink, originFileName) {
  if (typeof element == "string") {
    element = $(element);
  }

  if (!element) return false;
  this.$view.addClass('prepare-show');
  setTimeout(function () {
    this.$view.removeClass('prepare-show');
  }.bind(this), 200);
  this.state = this.STATE_PICKED;
  this.activeZoomInTool();
  var photoItem = {};
  this.photoList.push(photoItem);
  this.currentPhotoItem = photoItem;
  var eBound = element.getBoundingClientRect();
  var initStyle = {
    top: eBound.top + 'px',
    left: eBound.left + 'px',
    width: eBound.right - eBound.left + 'px',
    height: eBound.bottom - eBound.top + 'px'
  };
  photoItem.initStyle = initStyle;
  this.$view.addClass('full');
  var originImg = (originLink ? _('img').attr('src', originLink) : $(element.cloneNode())).attr('style', null).attr('class', null).addTo(this.$renderer);

  var sizeRequest = _Dom.default.waitImageLoaded(originImg).then(function () {
    return originImg.getBoundingClientRect();
  });

  photoItem.originImg = originImg;
  photoItem.originFileName = originFileName || '';
  this.$viewingImg = $(element.cloneNode()).attr('style', null).attr('class', 'ptswpv-viewing-img').addTo(this.$viewingContainder).addStyle(initStyle);
  setTimeout(function () {
    sizeRequest.then(function (originSize) {
      var frameSize = this.$frame.getBoundingClientRect();
      var scale = Math.min(frameSize.width / originSize.width, frameSize.height / originSize.height, 1);
      photoItem.scale = scale;
      photoItem.originSize = originSize;
      var imgViewSize = {
        width: originSize.width * scale,
        height: originSize.height * scale
      };
      var imageViewStyle = {
        width: imgViewSize.width + 'px',
        height: imgViewSize.height + 'px',
        left: (frameSize.width - imgViewSize.width) / 2 + 'px',
        top: (frameSize.height - imgViewSize.height) / 2 + 'px'
      };
      this.$viewingImg.addClass('transition-all').addStyle(imageViewStyle);
      setTimeout(function () {
        originImg.addClass('ptswpv-viewing-img').addStyle(imageViewStyle);
        this.$viewingImg.selfReplace(originImg);
        this.$viewingImg = originImg;
        this.$view.focus();
      }.bind(this), 305);
    }.bind(this));
  }.bind(this), 1);
};

PhotoSwipeViewer.prototype.remove = function () {
  this.$view.selfRemove();
};

PhotoSwipeViewer.newInstance = function () {
  var instance = new PhotoSwipeViewer();
  instance.getView().addTo(document.body);
  return instance;
};

var _default = PhotoSwipeViewer;
exports.default = _default;
};

moduleFactories["adapt/WindowBox.js"] = function(module, exports, require, __dirname, __filename){
/*** module: adapt/WindowBox.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;

require("./windowbox.css");

var _ACore = _interopRequireDefault(require("absol-acomp/ACore"));

var _AElement = _interopRequireDefault(require("absol/src/HTML5/AElement"));


var _ = _ACore.default._;
var $ = _ACore.default.$;
/***
 *
 * @extends AElement
 * @constructor
 */

function WindowBox() {
  this.defineEvent('pressclose');
  this.$title = $('.absol-window-title-text', this);
  absol.OOP.drillProperty(this, this.$title, 'title', 'innerHTML');
  this.$body = $('.absol-window-body', this);
  this.$close = $('button.absol-window-close', this);
  this.$close.on('click', this.eventHandler.closeButtonClick);
}

WindowBox.tag = 'window';

WindowBox.render = function () {
  return _('<div class="absol-window">' + '    <div class="absol-window-title-bar">' + '        <span class="absol-window-title-text"></span>' + '        <div  class="absol-window-tile-button-container">' + '            <button class="absol-window-close">X</button>' + '        </div>' + '    </div>' + '    <div class="absol-window-body"></div>' + '</div>');
};

WindowBox.property = {};

WindowBox.prototype.addChild = function (child) {
  this.$body.addChild(child);
};

WindowBox.prototype.clearChild = function () {
  this.$body.clearChild();
};

WindowBox.eventHandler = {};

WindowBox.eventHandler.closeButtonClick = function (event) {
  this.emit('pressclose', event);
};

_ACore.default.install(WindowBox);

var _default = WindowBox;
exports.default = _default;
};

moduleFactories["node_modules/absol-acomp/js/adapter/FontAwesomeIconsAdapter.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/absol-acomp/js/adapter/FontAwesomeIconsAdapter.js ***/
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MaterialDesignIconsCode = exports.FontAwesomeIconsNameMap = void 0;

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));

var _ACore = _interopRequireDefault(require("../../ACore"));


/***
 * Old name to new name
 */
var FontAwesomeIconsNameMap = {
  'close': 'times'
};
exports.FontAwesomeIconsNameMap = FontAwesomeIconsNameMap;
var MaterialDesignIconsCode = {};
exports.MaterialDesignIconsCode = MaterialDesignIconsCode;

_Dom.default.documentReady.then(function () {
  var _ = _ACore.default._;

  var iElt = _({
    tag: 'i',
    class: ['fa'],
    style: {
      display: 'none'
    }
  }).addTo(document.body);

  var content;
  var cssCodeLines = [];

  for (var oldName in FontAwesomeIconsNameMap) {
    iElt.addClass('fa-' + FontAwesomeIconsNameMap[oldName]);
    content = getComputedStyle(iElt, ':before').content;
    MaterialDesignIconsCode[oldName] = content;
    cssCodeLines.push('.fa-' + oldName + '::before{content:' + content + '}');
    iElt.removeClass('fa-' + FontAwesomeIconsNameMap[oldName]);
  }

  iElt.remove();

  var styleElt = _({
    tag: 'style',
    id: 'as-font-awesome-adapter',
    props: {
      innerHTML: cssCodeLines.join('\n')
    }
  }).addTo(document.head);
});
};

moduleFactories["node_modules/punycode/punycode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/punycode/punycode.js ***/
'use strict';
/** Highest positive signed 32-bit float value */

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }

function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }

function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }

function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }

const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1

/** Bootstring parameters */

const base = 36;
const tMin = 1;
const tMax = 26;
const skew = 38;
const damp = 700;
const initialBias = 72;
const initialN = 128; // 0x80

const delimiter = '-'; // '\x2D'

/** Regular expressions */

const regexPunycode = /^xn--/;
const regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars

const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators

/** Error messages */

const errors = {
  'overflow': 'Overflow: input needs wider integers to process',
  'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
  'invalid-input': 'Invalid input'
};
/** Convenience shortcuts */

const baseMinusTMin = base - tMin;
const floor = Math.floor;
const stringFromCharCode = String.fromCharCode;
/*--------------------------------------------------------------------------*/

/**
 * A generic error utility function.
 * @private
 * @param {String} type The error type.
 * @returns {Error} Throws a `RangeError` with the applicable error message.
 */

function error(type) {
  throw new RangeError(errors[type]);
}
/**
 * A generic `Array#map` utility function.
 * @private
 * @param {Array} array The array to iterate over.
 * @param {Function} callback The function that gets called for every array
 * item.
 * @returns {Array} A new array of values returned by the callback function.
 */


function map(array, fn) {
  const result = [];
  let length = array.length;

  while (length--) {
    result[length] = fn(array[length]);
  }

  return result;
}
/**
 * A simple `Array#map`-like wrapper to work with domain name strings or email
 * addresses.
 * @private
 * @param {String} domain The domain name or email address.
 * @param {Function} callback The function that gets called for every
 * character.
 * @returns {Array} A new string of characters returned by the callback
 * function.
 */


function mapDomain(string, fn) {
  const parts = string.split('@');
  let result = '';

  if (parts.length > 1) {
    // In email addresses, only the domain name should be punycoded. Leave
    // the local part (i.e. everything up to `@`) intact.
    result = parts[0] + '@';
    string = parts[1];
  } // Avoid `split(regex)` for IE8 compatibility. See #17.


  string = string.replace(regexSeparators, '\x2E');
  const labels = string.split('.');
  const encoded = map(labels, fn).join('.');
  return result + encoded;
}
/**
 * Creates an array containing the numeric code points of each Unicode
 * character in the string. While JavaScript uses UCS-2 internally,
 * this function will convert a pair of surrogate halves (each of which
 * UCS-2 exposes as separate characters) into a single code point,
 * matching UTF-16.
 * @see `punycode.ucs2.encode`
 * @see <https://mathiasbynens.be/notes/javascript-encoding>
 * @memberOf punycode.ucs2
 * @name decode
 * @param {String} string The Unicode input string (UCS-2).
 * @returns {Array} The new array of code points.
 */


function ucs2decode(string) {
  const output = [];
  let counter = 0;
  const length = string.length;

  while (counter < length) {
    const value = string.charCodeAt(counter++);

    if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
      // It's a high surrogate, and there is a next character.
      const extra = string.charCodeAt(counter++);

      if ((extra & 0xFC00) == 0xDC00) {
        // Low surrogate.
        output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
      } else {
        // It's an unmatched surrogate; only append this code unit, in case the
        // next code unit is the high surrogate of a surrogate pair.
        output.push(value);
        counter--;
      }
    } else {
      output.push(value);
    }
  }

  return output;
}
/**
 * Creates a string based on an array of numeric code points.
 * @see `punycode.ucs2.decode`
 * @memberOf punycode.ucs2
 * @name encode
 * @param {Array} codePoints The array of numeric code points.
 * @returns {String} The new Unicode string (UCS-2).
 */


const ucs2encode = array => String.fromCodePoint.apply(String, _toConsumableArray(array));
/**
 * Converts a basic code point into a digit/integer.
 * @see `digitToBasic()`
 * @private
 * @param {Number} codePoint The basic numeric code point value.
 * @returns {Number} The numeric value of a basic code point (for use in
 * representing integers) in the range `0` to `base - 1`, or `base` if
 * the code point does not represent a value.
 */


const basicToDigit = function (codePoint) {
  if (codePoint - 0x30 < 0x0A) {
    return codePoint - 0x16;
  }

  if (codePoint - 0x41 < 0x1A) {
    return codePoint - 0x41;
  }

  if (codePoint - 0x61 < 0x1A) {
    return codePoint - 0x61;
  }

  return base;
};
/**
 * Converts a digit/integer into a basic code point.
 * @see `basicToDigit()`
 * @private
 * @param {Number} digit The numeric value of a basic code point.
 * @returns {Number} The basic code point whose value (when used for
 * representing integers) is `digit`, which needs to be in the range
 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
 * used; else, the lowercase form is used. The behavior is undefined
 * if `flag` is non-zero and `digit` has no uppercase form.
 */


const digitToBasic = function (digit, flag) {
  //  0..25 map to ASCII a..z or A..Z
  // 26..35 map to ASCII 0..9
  return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
};
/**
 * Bias adaptation function as per section 3.4 of RFC 3492.
 * https://tools.ietf.org/html/rfc3492#section-3.4
 * @private
 */


const adapt = function (delta, numPoints, firstTime) {
  let k = 0;
  delta = firstTime ? floor(delta / damp) : delta >> 1;
  delta += floor(delta / numPoints);

  for (; delta > baseMinusTMin * tMax >> 1; k += base) {
    delta = floor(delta / baseMinusTMin);
  }

  return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
};
/**
 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
 * symbols.
 * @memberOf punycode
 * @param {String} input The Punycode string of ASCII-only symbols.
 * @returns {String} The resulting string of Unicode symbols.
 */


const decode = function (input) {
  // Don't use UCS-2.
  const output = [];
  const inputLength = input.length;
  let i = 0;
  let n = initialN;
  let bias = initialBias; // Handle the basic code points: let `basic` be the number of input code
  // points before the last delimiter, or `0` if there is none, then copy
  // the first basic code points to the output.

  let basic = input.lastIndexOf(delimiter);

  if (basic < 0) {
    basic = 0;
  }

  for (let j = 0; j < basic; ++j) {
    // if it's not a basic code point
    if (input.charCodeAt(j) >= 0x80) {
      error('not-basic');
    }

    output.push(input.charCodeAt(j));
  } // Main decoding loop: start just after the last delimiter if any basic code
  // points were copied; start at the beginning otherwise.


  for (let index = basic > 0 ? basic + 1 : 0; index < inputLength;) {
    // `index` is the index of the next character to be consumed.
    // Decode a generalized variable-length integer into `delta`,
    // which gets added to `i`. The overflow checking is easier
    // if we increase `i` as we go, then subtract off its starting
    // value at the end to obtain `delta`.
    let oldi = i;

    for (let w = 1, k = base;; k += base) {
      if (index >= inputLength) {
        error('invalid-input');
      }

      const digit = basicToDigit(input.charCodeAt(index++));

      if (digit >= base || digit > floor((maxInt - i) / w)) {
        error('overflow');
      }

      i += digit * w;
      const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;

      if (digit < t) {
        break;
      }

      const baseMinusT = base - t;

      if (w > floor(maxInt / baseMinusT)) {
        error('overflow');
      }

      w *= baseMinusT;
    }

    const out = output.length + 1;
    bias = adapt(i - oldi, out, oldi == 0); // `i` was supposed to wrap around from `out` to `0`,
    // incrementing `n` each time, so we'll fix that now:

    if (floor(i / out) > maxInt - n) {
      error('overflow');
    }

    n += floor(i / out);
    i %= out; // Insert `n` at position `i` of the output.

    output.splice(i++, 0, n);
  }

  return String.fromCodePoint.apply(String, output);
};
/**
 * Converts a string of Unicode symbols (e.g. a domain name label) to a
 * Punycode string of ASCII-only symbols.
 * @memberOf punycode
 * @param {String} input The string of Unicode symbols.
 * @returns {String} The resulting Punycode string of ASCII-only symbols.
 */


const encode = function (input) {
  const output = []; // Convert the input in UCS-2 to an array of Unicode code points.

  input = ucs2decode(input); // Cache the length.

  let inputLength = input.length; // Initialize the state.

  let n = initialN;
  let delta = 0;
  let bias = initialBias; // Handle the basic code points.

  for (const currentValue of input) {
    if (currentValue < 0x80) {
      output.push(stringFromCharCode(currentValue));
    }
  }

  let basicLength = output.length;
  let handledCPCount = basicLength; // `handledCPCount` is the number of code points that have been handled;
  // `basicLength` is the number of basic code points.
  // Finish the basic string with a delimiter unless it's empty.

  if (basicLength) {
    output.push(delimiter);
  } // Main encoding loop:


  while (handledCPCount < inputLength) {
    // All non-basic code points < n have been handled already. Find the next
    // larger one:
    let m = maxInt;

    for (const currentValue of input) {
      if (currentValue >= n && currentValue < m) {
        m = currentValue;
      }
    } // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
    // but guard against overflow.


    const handledCPCountPlusOne = handledCPCount + 1;

    if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
      error('overflow');
    }

    delta += (m - n) * handledCPCountPlusOne;
    n = m;

    for (const currentValue of input) {
      if (currentValue < n && ++delta > maxInt) {
        error('overflow');
      }

      if (currentValue == n) {
        // Represent delta as a generalized variable-length integer.
        let q = delta;

        for (let k = base;; k += base) {
          const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;

          if (q < t) {
            break;
          }

          const qMinusT = q - t;
          const baseMinusT = base - t;
          output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
          q = floor(qMinusT / baseMinusT);
        }

        output.push(stringFromCharCode(digitToBasic(q, 0)));
        bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
        delta = 0;
        ++handledCPCount;
      }
    }

    ++delta;
    ++n;
  }

  return output.join('');
};
/**
 * Converts a Punycode string representing a domain name or an email address
 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
 * it doesn't matter if you call it on a string that has already been
 * converted to Unicode.
 * @memberOf punycode
 * @param {String} input The Punycoded domain name or email address to
 * convert to Unicode.
 * @returns {String} The Unicode representation of the given Punycode
 * string.
 */


const toUnicode = function (input) {
  return mapDomain(input, function (string) {
    return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;
  });
};
/**
 * Converts a Unicode string representing a domain name or an email address to
 * Punycode. Only the non-ASCII parts of the domain name will be converted,
 * i.e. it doesn't matter if you call it with a domain that's already in
 * ASCII.
 * @memberOf punycode
 * @param {String} input The domain name or email address to convert, as a
 * Unicode string.
 * @returns {String} The Punycode representation of the given domain name or
 * email address.
 */


const toASCII = function (input) {
  return mapDomain(input, function (string) {
    return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;
  });
};
/*--------------------------------------------------------------------------*/

/** Define the public API */


const punycode = {
  /**
   * A string representing the current Punycode.js version number.
   * @memberOf punycode
   * @type String
   */
  'version': '2.1.0',

  /**
   * An object of methods to convert from JavaScript's internal character
   * representation (UCS-2) to Unicode code points, and back.
   * @see <https://mathiasbynens.be/notes/javascript-encoding>
   * @memberOf punycode
   * @type Object
   */
  'ucs2': {
    'decode': ucs2decode,
    'encode': ucs2encode
  },
  'decode': decode,
  'encode': encode,
  'toASCII': toASCII,
  'toUnicode': toUnicode
};
module.exports = punycode;
};

moduleFactories["node_modules/url/util.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/url/util.js ***/
'use strict';

module.exports = {
  isString: function (arg) {
    return typeof arg === 'string';
  },
  isObject: function (arg) {
    return typeof arg === 'object' && arg !== null;
  },
  isNull: function (arg) {
    return arg === null;
  },
  isNullOrUndefined: function (arg) {
    return arg == null;
  }
};
};

moduleFactories["node_modules/querystring/decode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/querystring/decode.js ***/
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict'; // If obj.hasOwnProperty has been overridden, then calling
// obj.hasOwnProperty(prop) will break.
// See: https://github.com/joyent/node/issues/1707

function hasOwnProperty(obj, prop) {
  return Object.prototype.hasOwnProperty.call(obj, prop);
}

module.exports = function (qs, sep, eq, options) {
  sep = sep || '&';
  eq = eq || '=';
  var obj = {};

  if (typeof qs !== 'string' || qs.length === 0) {
    return obj;
  }

  var regexp = /\+/g;
  qs = qs.split(sep);
  var maxKeys = 1000;

  if (options && typeof options.maxKeys === 'number') {
    maxKeys = options.maxKeys;
  }

  var len = qs.length; // maxKeys <= 0 means that we should not limit keys count

  if (maxKeys > 0 && len > maxKeys) {
    len = maxKeys;
  }

  for (var i = 0; i < len; ++i) {
    var x = qs[i].replace(regexp, '%20'),
        idx = x.indexOf(eq),
        kstr,
        vstr,
        k,
        v;

    if (idx >= 0) {
      kstr = x.substr(0, idx);
      vstr = x.substr(idx + 1);
    } else {
      kstr = x;
      vstr = '';
    }

    k = decodeURIComponent(kstr);
    v = decodeURIComponent(vstr);

    if (!hasOwnProperty(obj, k)) {
      obj[k] = v;
    } else if (Array.isArray(obj[k])) {
      obj[k].push(v);
    } else {
      obj[k] = [obj[k], v];
    }
  }

  return obj;
};
};

moduleFactories["node_modules/querystring/encode.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/querystring/encode.js ***/
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';

var stringifyPrimitive = function (v) {
  switch (typeof v) {
    case 'string':
      return v;

    case 'boolean':
      return v ? 'true' : 'false';

    case 'number':
      return isFinite(v) ? v : '';

    default:
      return '';
  }
};

module.exports = function (obj, sep, eq, name) {
  sep = sep || '&';
  eq = eq || '=';

  if (obj === null) {
    obj = undefined;
  }

  if (typeof obj === 'object') {
    return Object.keys(obj).map(function (k) {
      var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;

      if (Array.isArray(obj[k])) {
        return obj[k].map(function (v) {
          return ks + encodeURIComponent(stringifyPrimitive(v));
        }).join(sep);
      } else {
        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
      }
    }).join(sep);
  }

  if (!name) return '';
  return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));
};
};

moduleFactories["node_modules/querystring/index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/querystring/index.js ***/
'use strict';

exports.decode = exports.parse = require('./decode');
exports.encode = exports.stringify = require('./encode');
};

moduleFactories["node_modules/url/url.js"] = function(module, exports, require, __dirname, __filename){
/*** module: node_modules/url/url.js ***/
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';

var punycode = require('punycode');

var util = require('./util');

exports.parse = urlParse;
exports.resolve = urlResolve;
exports.resolveObject = urlResolveObject;
exports.format = urlFormat;
exports.Url = Url;

function Url() {
  this.protocol = null;
  this.slashes = null;
  this.auth = null;
  this.host = null;
  this.port = null;
  this.hostname = null;
  this.hash = null;
  this.search = null;
  this.query = null;
  this.pathname = null;
  this.path = null;
  this.href = null;
} // Reference: RFC 3986, RFC 1808, RFC 2396
// define these here so at least they only have to be
// compiled once on the first module load.


var protocolPattern = /^([a-z0-9.+-]+:)/i,
    portPattern = /:[0-9]*$/,
    // Special case for a simple path URL
simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
    // RFC 2396: characters reserved for delimiting URLs.
// We actually just auto-escape these.
delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
    // RFC 2396: characters not allowed for various reasons.
unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
    // Allowed by RFCs, but cause of XSS attacks.  Always escape these.
autoEscape = ['\''].concat(unwise),
    // Characters that are never ever allowed in a hostname.
// Note that any invalid chars are also handled, but these
// are the ones that are *expected* to be seen, so we fast-path
// them.
nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
    hostEndingChars = ['/', '?', '#'],
    hostnameMaxLen = 255,
    hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
    hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
    // protocols that can allow "unsafe" and "unwise" chars.
unsafeProtocol = {
  'javascript': true,
  'javascript:': true
},
    // protocols that never have a hostname.
hostlessProtocol = {
  'javascript': true,
  'javascript:': true
},
    // protocols that always contain a // bit.
slashedProtocol = {
  'http': true,
  'https': true,
  'ftp': true,
  'gopher': true,
  'file': true,
  'http:': true,
  'https:': true,
  'ftp:': true,
  'gopher:': true,
  'file:': true
},
    querystring = require('querystring');

function urlParse(url, parseQueryString, slashesDenoteHost) {
  if (url && util.isObject(url) && url instanceof Url) return url;
  var u = new Url();
  u.parse(url, parseQueryString, slashesDenoteHost);
  return u;
}

Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
  if (!util.isString(url)) {
    throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
  } // Copy chrome, IE, opera backslash-handling behavior.
  // Back slashes before the query string get converted to forward slashes
  // See: https://code.google.com/p/chromium/issues/detail?id=25916


  var queryIndex = url.indexOf('?'),
      splitter = queryIndex !== -1 && queryIndex < url.indexOf('#') ? '?' : '#',
      uSplit = url.split(splitter),
      slashRegex = /\\/g;
  uSplit[0] = uSplit[0].replace(slashRegex, '/');
  url = uSplit.join(splitter);
  var rest = url; // trim before proceeding.
  // This is to support parse stuff like "  http://foo.com  \n"

  rest = rest.trim();

  if (!slashesDenoteHost && url.split('#').length === 1) {
    // Try fast path regexp
    var simplePath = simplePathPattern.exec(rest);

    if (simplePath) {
      this.path = rest;
      this.href = rest;
      this.pathname = simplePath[1];

      if (simplePath[2]) {
        this.search = simplePath[2];

        if (parseQueryString) {
          this.query = querystring.parse(this.search.substr(1));
        } else {
          this.query = this.search.substr(1);
        }
      } else if (parseQueryString) {
        this.search = '';
        this.query = {};
      }

      return this;
    }
  }

  var proto = protocolPattern.exec(rest);

  if (proto) {
    proto = proto[0];
    var lowerProto = proto.toLowerCase();
    this.protocol = lowerProto;
    rest = rest.substr(proto.length);
  } // figure out if it's got a host
  // user@server is *always* interpreted as a hostname, and url
  // resolution will treat //foo/bar as host=foo,path=bar because that's
  // how the browser resolves relative URLs.


  if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
    var slashes = rest.substr(0, 2) === '//';

    if (slashes && !(proto && hostlessProtocol[proto])) {
      rest = rest.substr(2);
      this.slashes = true;
    }
  }

  if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) {
    // there's a hostname.
    // the first instance of /, ?, ;, or # ends the host.
    //
    // If there is an @ in the hostname, then non-host chars *are* allowed
    // to the left of the last @ sign, unless some host-ending character
    // comes *before* the @-sign.
    // URLs are obnoxious.
    //
    // ex:
    // http://a@b@c/ => user:a@b host:c
    // http://a@b?@c => user:a host:c path:/?@c
    // v0.12 TODO(isaacs): This is not quite how Chrome does things.
    // Review our test case against browsers more comprehensively.
    // find the first instance of any hostEndingChars
    var hostEnd = -1;

    for (var i = 0; i < hostEndingChars.length; i++) {
      var hec = rest.indexOf(hostEndingChars[i]);
      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;
    } // at this point, either we have an explicit point where the
    // auth portion cannot go past, or the last @ char is the decider.


    var auth, atSign;

    if (hostEnd === -1) {
      // atSign can be anywhere.
      atSign = rest.lastIndexOf('@');
    } else {
      // atSign must be in auth portion.
      // http://a@b/c@d => host:b auth:a path:/c@d
      atSign = rest.lastIndexOf('@', hostEnd);
    } // Now we have a portion which is definitely the auth.
    // Pull that off.


    if (atSign !== -1) {
      auth = rest.slice(0, atSign);
      rest = rest.slice(atSign + 1);
      this.auth = decodeURIComponent(auth);
    } // the host is the remaining to the left of the first non-host char


    hostEnd = -1;

    for (var i = 0; i < nonHostChars.length; i++) {
      var hec = rest.indexOf(nonHostChars[i]);
      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;
    } // if we still have not hit it, then the entire thing is a host.


    if (hostEnd === -1) hostEnd = rest.length;
    this.host = rest.slice(0, hostEnd);
    rest = rest.slice(hostEnd); // pull out port.

    this.parseHost(); // we've indicated that there is a hostname,
    // so even if it's empty, it has to be present.

    this.hostname = this.hostname || ''; // if hostname begins with [ and ends with ]
    // assume that it's an IPv6 address.

    var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']'; // validate a little.

    if (!ipv6Hostname) {
      var hostparts = this.hostname.split(/\./);

      for (var i = 0, l = hostparts.length; i < l; i++) {
        var part = hostparts[i];
        if (!part) continue;

        if (!part.match(hostnamePartPattern)) {
          var newpart = '';

          for (var j = 0, k = part.length; j < k; j++) {
            if (part.charCodeAt(j) > 127) {
              // we replace non-ASCII char with a temporary placeholder
              // we need this to make sure size of hostname is not
              // broken by replacing non-ASCII by nothing
              newpart += 'x';
            } else {
              newpart += part[j];
            }
          } // we test again with ASCII char only


          if (!newpart.match(hostnamePartPattern)) {
            var validParts = hostparts.slice(0, i);
            var notHost = hostparts.slice(i + 1);
            var bit = part.match(hostnamePartStart);

            if (bit) {
              validParts.push(bit[1]);
              notHost.unshift(bit[2]);
            }

            if (notHost.length) {
              rest = '/' + notHost.join('.') + rest;
            }

            this.hostname = validParts.join('.');
            break;
          }
        }
      }
    }

    if (this.hostname.length > hostnameMaxLen) {
      this.hostname = '';
    } else {
      // hostnames are always lower case.
      this.hostname = this.hostname.toLowerCase();
    }

    if (!ipv6Hostname) {
      // IDNA Support: Returns a punycoded representation of "domain".
      // It only converts parts of the domain name that
      // have non-ASCII characters, i.e. it doesn't matter if
      // you call it with a domain that already is ASCII-only.
      this.hostname = punycode.toASCII(this.hostname);
    }

    var p = this.port ? ':' + this.port : '';
    var h = this.hostname || '';
    this.host = h + p;
    this.href += this.host; // strip [ and ] from the hostname
    // the host field still retains them, though

    if (ipv6Hostname) {
      this.hostname = this.hostname.substr(1, this.hostname.length - 2);

      if (rest[0] !== '/') {
        rest = '/' + rest;
      }
    }
  } // now rest is set to the post-host stuff.
  // chop off any delim chars.


  if (!unsafeProtocol[lowerProto]) {
    // First, make 100% sure that any "autoEscape" chars get
    // escaped, even if encodeURIComponent doesn't think they
    // need to be.
    for (var i = 0, l = autoEscape.length; i < l; i++) {
      var ae = autoEscape[i];
      if (rest.indexOf(ae) === -1) continue;
      var esc = encodeURIComponent(ae);

      if (esc === ae) {
        esc = escape(ae);
      }

      rest = rest.split(ae).join(esc);
    }
  } // chop off from the tail first.


  var hash = rest.indexOf('#');

  if (hash !== -1) {
    // got a fragment string.
    this.hash = rest.substr(hash);
    rest = rest.slice(0, hash);
  }

  var qm = rest.indexOf('?');

  if (qm !== -1) {
    this.search = rest.substr(qm);
    this.query = rest.substr(qm + 1);

    if (parseQueryString) {
      this.query = querystring.parse(this.query);
    }

    rest = rest.slice(0, qm);
  } else if (parseQueryString) {
    // no query string, but parseQueryString still requested
    this.search = '';
    this.query = {};
  }

  if (rest) this.pathname = rest;

  if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {
    this.pathname = '/';
  } //to support http.request


  if (this.pathname || this.search) {
    var p = this.pathname || '';
    var s = this.search || '';
    this.path = p + s;
  } // finally, reconstruct the href based on what has been validated.


  this.href = this.format();
  return this;
}; // format a parsed object into a url string


function urlFormat(obj) {
  // ensure it's an object, and not a string url.
  // If it's an obj, this is a no-op.
  // this way, you can call url_format() on strings
  // to clean up potentially wonky urls.
  if (util.isString(obj)) obj = urlParse(obj);
  if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
  return obj.format();
}

Url.prototype.format = function () {
  var auth = this.auth || '';

  if (auth) {
    auth = encodeURIComponent(auth);
    auth = auth.replace(/%3A/i, ':');
    auth += '@';
  }

  var protocol = this.protocol || '',
      pathname = this.pathname || '',
      hash = this.hash || '',
      host = false,
      query = '';

  if (this.host) {
    host = auth + this.host;
  } else if (this.hostname) {
    host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']');

    if (this.port) {
      host += ':' + this.port;
    }
  }

  if (this.query && util.isObject(this.query) && Object.keys(this.query).length) {
    query = querystring.stringify(this.query);
  }

  var search = this.search || query && '?' + query || '';
  if (protocol && protocol.substr(-1) !== ':') protocol += ':'; // only the slashedProtocols get the //.  Not mailto:, xmpp:, etc.
  // unless they had them to begin with.

  if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {
    host = '//' + (host || '');
    if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
  } else if (!host) {
    host = '';
  }

  if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
  if (search && search.charAt(0) !== '?') search = '?' + search;
  pathname = pathname.replace(/[?#]/g, function (match) {
    return encodeURIComponent(match);
  });
  search = search.replace('#', '%23');
  return protocol + host + pathname + search + hash;
};

function urlResolve(source, relative) {
  return urlParse(source, false, true).resolve(relative);
}

Url.prototype.resolve = function (relative) {
  return this.resolveObject(urlParse(relative, false, true)).format();
};

function urlResolveObject(source, relative) {
  if (!source) return relative;
  return urlParse(source, false, true).resolveObject(relative);
}

Url.prototype.resolveObject = function (relative) {
  if (util.isString(relative)) {
    var rel = new Url();
    rel.parse(relative, false, true);
    relative = rel;
  }

  var result = new Url();
  var tkeys = Object.keys(this);

  for (var tk = 0; tk < tkeys.length; tk++) {
    var tkey = tkeys[tk];
    result[tkey] = this[tkey];
  } // hash is always overridden, no matter what.
  // even href="" will remove it.


  result.hash = relative.hash; // if the relative url is empty, then there's nothing left to do here.

  if (relative.href === '') {
    result.href = result.format();
    return result;
  } // hrefs like //foo/bar always cut to the protocol.


  if (relative.slashes && !relative.protocol) {
    // take everything except the protocol from relative
    var rkeys = Object.keys(relative);

    for (var rk = 0; rk < rkeys.length; rk++) {
      var rkey = rkeys[rk];
      if (rkey !== 'protocol') result[rkey] = relative[rkey];
    } //urlParse appends trailing / to urls like http://www.example.com


    if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {
      result.path = result.pathname = '/';
    }

    result.href = result.format();
    return result;
  }

  if (relative.protocol && relative.protocol !== result.protocol) {
    // if it's a known url protocol, then changing
    // the protocol does weird things
    // first, if it's not file:, then we MUST have a host,
    // and if there was a path
    // to begin with, then we MUST have a path.
    // if it is file:, then the host is dropped,
    // because that's known to be hostless.
    // anything else is assumed to be absolute.
    if (!slashedProtocol[relative.protocol]) {
      var keys = Object.keys(relative);

      for (var v = 0; v < keys.length; v++) {
        var k = keys[v];
        result[k] = relative[k];
      }

      result.href = result.format();
      return result;
    }

    result.protocol = relative.protocol;

    if (!relative.host && !hostlessProtocol[relative.protocol]) {
      var relPath = (relative.pathname || '').split('/');

      while (relPath.length && !(relative.host = relPath.shift()));

      if (!relative.host) relative.host = '';
      if (!relative.hostname) relative.hostname = '';
      if (relPath[0] !== '') relPath.unshift('');
      if (relPath.length < 2) relPath.unshift('');
      result.pathname = relPath.join('/');
    } else {
      result.pathname = relative.pathname;
    }

    result.search = relative.search;
    result.query = relative.query;
    result.host = relative.host || '';
    result.auth = relative.auth;
    result.hostname = relative.hostname || relative.host;
    result.port = relative.port; // to support http.request

    if (result.pathname || result.search) {
      var p = result.pathname || '';
      var s = result.search || '';
      result.path = p + s;
    }

    result.slashes = result.slashes || relative.slashes;
    result.href = result.format();
    return result;
  }

  var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/',
      isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/',
      mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname,
      removeAllDots = mustEndAbs,
      srcPath = result.pathname && result.pathname.split('/') || [],
      relPath = relative.pathname && relative.pathname.split('/') || [],
      psychotic = result.protocol && !slashedProtocol[result.protocol]; // if the url is a non-slashed url, then relative
  // links like ../.. should be able
  // to crawl up to the hostname, as well.  This is strange.
  // result.protocol has already been set by now.
  // Later on, put the first path part into the host field.

  if (psychotic) {
    result.hostname = '';
    result.port = null;

    if (result.host) {
      if (srcPath[0] === '') srcPath[0] = result.host;else srcPath.unshift(result.host);
    }

    result.host = '';

    if (relative.protocol) {
      relative.hostname = null;
      relative.port = null;

      if (relative.host) {
        if (relPath[0] === '') relPath[0] = relative.host;else relPath.unshift(relative.host);
      }

      relative.host = null;
    }

    mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
  }

  if (isRelAbs) {
    // it's absolute.
    result.host = relative.host || relative.host === '' ? relative.host : result.host;
    result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname;
    result.search = relative.search;
    result.query = relative.query;
    srcPath = relPath; // fall through to the dot-handling below.
  } else if (relPath.length) {
    // it's relative
    // throw away the existing file, and take the new path instead.
    if (!srcPath) srcPath = [];
    srcPath.pop();
    srcPath = srcPath.concat(relPath);
    result.search = relative.search;
    result.query = relative.query;
  } else if (!util.isNullOrUndefined(relative.search)) {
    // just pull out the search.
    // like href='?foo'.
    // Put this after the other two cases because it simplifies the booleans
    if (psychotic) {
      result.hostname = result.host = srcPath.shift(); //occationaly the auth can get stuck only in host
      //this especially happens in cases like
      //url.resolveObject('mailto:local1@domain1', 'local2@domain2')

      var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;

      if (authInHost) {
        result.auth = authInHost.shift();
        result.host = result.hostname = authInHost.shift();
      }
    }

    result.search = relative.search;
    result.query = relative.query; //to support http.request

    if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
      result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');
    }

    result.href = result.format();
    return result;
  }

  if (!srcPath.length) {
    // no path at all.  easy.
    // we've already handled the other stuff above.
    result.pathname = null; //to support http.request

    if (result.search) {
      result.path = '/' + result.search;
    } else {
      result.path = null;
    }

    result.href = result.format();
    return result;
  } // if a url ENDs in . or .., then it must get a trailing slash.
  // however, if it ends in anything else non-slashy,
  // then it must NOT get a trailing slash.


  var last = srcPath.slice(-1)[0];
  var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === ''; // strip single dots, resolve double dots to parent dir
  // if the path tries to go above the root, `up` ends up > 0

  var up = 0;

  for (var i = srcPath.length; i >= 0; i--) {
    last = srcPath[i];

    if (last === '.') {
      srcPath.splice(i, 1);
    } else if (last === '..') {
      srcPath.splice(i, 1);
      up++;
    } else if (up) {
      srcPath.splice(i, 1);
      up--;
    }
  } // if the path is allowed to go above the root, restore leading ..s


  if (!mustEndAbs && !removeAllDots) {
    for (; up--; up) {
      srcPath.unshift('..');
    }
  }

  if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
    srcPath.unshift('');
  }

  if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') {
    srcPath.push('');
  }

  var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/'; // put the host back

  if (psychotic) {
    result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : ''; //occationaly the auth can get stuck only in host
    //this especially happens in cases like
    //url.resolveObject('mailto:local1@domain1', 'local2@domain2')

    var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;

    if (authInHost) {
      result.auth = authInHost.shift();
      result.host = result.hostname = authInHost.shift();
    }
  }

  mustEndAbs = mustEndAbs || result.host && srcPath.length;

  if (mustEndAbs && !isAbsolute) {
    srcPath.unshift('');
  }

  if (!srcPath.length) {
    result.pathname = null;
    result.path = null;
  } else {
    result.pathname = srcPath.join('/');
  } //to support request.http


  if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
    result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');
  }

  result.auth = relative.auth || result.auth;
  result.slashes = result.slashes || relative.slashes;
  result.href = result.format();
  return result;
};

Url.prototype.parseHost = function () {
  var host = this.host;
  var port = portPattern.exec(host);

  if (port) {
    port = port[0];

    if (port !== ':') {
      this.port = port.substr(1);
    }

    host = host.substr(0, host.length - port.length);
  }

  if (host) this.hostname = host;
};
};

moduleFactories["index.js"] = function(module, exports, require, __dirname, __filename){
/*** module: index.js ***/
"use strict";

require("./adapt/String");

require("./adapt/Date");

require("./adapt/Promise");

require("./adapt/Math");

require("./adapt/DomClass");

require("./style/old.css");

require("./style/common.css");

require("./style/bootstrap.revert.css");

require("./style/bsc.white.css");

require("absol/src/absol");

require("absol-vietnamese/dev");

require("absol-acomp/dev");

require("absol-mobile/dev");

require("absol-vchart/src/vchart");

require("absol-colorpicker/dev");

require("absol-form/dev");

require("absol-brace/dev");

require("brace/ext/static_highlight");

var _Draggable = _interopRequireDefault(require("absol-acomp/js/Draggable"));

require("absol-card/dev");

require("absol-tutor/dev");

require("absol-sheet/dev");

require("absol-debug/dev");

require("absol-poser/dev");

require("pizo/js/dom/Fcomp");

var pizo = _interopRequireWildcard(require("pizo/js/component/ModuleView"));

var _ModuleDatabase = _interopRequireDefault(require("pizo/js/component/ModuleDatabase"));

var _EditHelpContainer = _interopRequireDefault(require("pizo/js/component/EditHelpContainer"));

var _HelpContainer = _interopRequireDefault(require("pizo/js/component/HelpContainer"));

require("pizo/css/CardDone.css");

var _modal_drag_drop_image = _interopRequireDefault(require("pizo/js/component/modal_drag_drop_image"));

var _modal_drag_drop_manyfiles = _interopRequireDefault(require("pizo/js/component/modal_drag_drop_manyfiles"));

var _ModuleImage = require("pizo/js/component/ModuleImage");

var _absolPhotoswipeviewer = _interopRequireDefault(require("absol-photoswipeviewer"));

var _QuickMenu = _interopRequireDefault(require("absol-acomp/js/QuickMenu"));

var _Tooltip = _interopRequireDefault(require("absol-acomp/js/Tooltip"));

var _WindowBox = _interopRequireDefault(require("./adapt/WindowBox"));

require("absol-acomp/js/adapter/FontAwesomeIconsAdapter");

var stringGen = _interopRequireWildcard(require("absol/src/String/stringGenerate"));

var stringMat = _interopRequireWildcard(require("absol/src/String/stringMatching"));

var stringForm = _interopRequireWildcard(require("absol/src/String/stringFormat"));

var search = _interopRequireWildcard(require("absol-acomp/js/list/search"));

var _url = _interopRequireDefault(require("url"));

var _LanguageSystem = _interopRequireDefault(require("absol/src/HTML5/LanguageSystem"));

var _MultiCheckMenu = _interopRequireDefault(require("absol-acomp/js/MultiCheckMenu"));

var _MultiSelectMenu = _interopRequireDefault(require("absol-acomp/js/MultiSelectMenu"));

var _DynamicCSS = _interopRequireDefault(require("absol/src/HTML5/DynamicCSS"));




//adapt type
//special style
//pizo package
// only setup for Fcore //carddone only
//carddone only
//carddone only
//carddone only
//carddone only
absol.coreDom.install(_WindowBox.default);
absol.url = _url.default;
absol.string = Object.assign({}, absol.string || {});
Object.assign(absol.string, stringGen, stringMat, stringForm);
absol.QuickMenu = _QuickMenu.default;
absol.Tooltip = _Tooltip.default;
absol.search = search; //for old plugin

absol.color = absol.Color;
absol.AComp = AComp;
absol.buildDom = absol._;
absol.buildSvg = absol._$;
absol.documentReady = absol.Dom.documentReady;
window.AComp = absol.AComp;
absol.PhotoSwipeViewer = _absolPhotoswipeviewer.default;
window.PhotoSwipeViewer = absol.PhotoSwipeViewer;
window.IFrameBridge = absol.IFrameBridge;
absol.event = absol.event || {};
absol.event.defineDraggable = _Draggable.default;
absol.Dom.documentReady.then(function () {
  var host = location.host;
  if (host.indexOf('absol.cf') < 0) document.body.classList.add('bsc-white'); //**** BOOTSTRAP REVERT

  var bootstrapLink = absol.$('link', document.head, function (e) {
    if (e.href && e.href.toLowerCase().indexOf('bootstrap') >= 0) return true;
  });
  var styleConfig;
  var defaultFont,
      defaultFontSize = '14px';

  if (bootstrapLink) {
    styleConfig = new _DynamicCSS.default();
    defaultFont = absol.$(document.body).getComputedStyleValue('--font') || '14px "Helvetica Neue",Helvetica,Arial,sans-serif';
    defaultFontSize = defaultFont.match(/[0-9]+px/);
    if (defaultFontSize) defaultFontSize = defaultFontSize[0];else defaultFontSize = '14px';
    styleConfig.setProperty('html', 'font', defaultFont).setProperty('html', 'font-size', defaultFontSize).commit();
  }
});
absol.coreDom.install('selectbox', _MultiCheckMenu.default);
absol.coreDom.install(_MultiSelectMenu.default.tag, _MultiCheckMenu.default);
window.pizo = pizo; //carddone only

window.descViewImagePreview = _ModuleImage.descViewImagePreview; //cardone only

window.pizo.xmlModalDragImage = _modal_drag_drop_image.default; //carddone only

window.pizo.xmlModalDragManyFiles = _modal_drag_drop_manyfiles.default; //carddone only

window.pizo.ModuleDatabaseHelp = _ModuleDatabase.default;
window.pizo.EditHelpContainer = _EditHelpContainer.default;
window.pizo.HelpContainer = _HelpContainer.default; // pizo module
//setup for lab

absol.MessageInput.iconAssetRoot = '/vivid_exticons';
absol.EmojiPicker.assetRoot = '/emoji';
var nodeRequire = require;

absol.require = function (tagName) {
  return this.coreDom.require(tagName) || this.coreSvg.require(tagName) || nodeRequire(tagName);
};

var waitLanguageCounter = 20;
setTimeout(function waitLanguage() {
  if (window.LanguageModule) {
    _LanguageSystem.default.addExtension({
      getText: function () {
        var text = window.LanguageModule.text.apply(window.LanguageModule, arguments);
        if (text && text.startsWith('[key:') && text.charAt(text.length - 1) === ']') return null;
        return text || null;
      }
    });
  } else {
    waitLanguageCounter--;
    if (waitLanguageCounter > 0) setTimeout(waitLanguage, 50 + (20 - waitLanguageCounter) * 20);
  }
}, 50);
};

moduleFactories["absol.js"] = function(module, exports, require, __dirname, __filename){
/*** module: absol.js ***/
"use strict";

require(".");

var _Dom = _interopRequireDefault(require("absol/src/HTML5/Dom"));


if (window.ModuleManagerClass) ModuleManagerClass.register("Absol");
var appList = {
  'bsc': 'as-app-bsc',
  'salary': 'as-app-salary',
  'carddone': 'as-app-card-done',
  'forms': 'as-app-form'
};
location.href.split('/').some(function (c) {
  if (appList[c]) {
    _Dom.default.documentReady.then(function () {
      document.body.classList.add(appList[c]);
    });

    return true;
  }

  return false;
});
absol.Dom.documentReady.then(function () {
  if (window.DOMClass) {
    window.DOMClass.containClass = function (obj, className) {
      return obj && obj.classList && obj.classList.contains(className);
    };
  }
});
};


module_require(null,"absol.js");

})(Function('return this')());

VaKeR 2022